🚀 AI 一键生成 ptrade 策略代码

为什么ptrade在9点30分开盘时使用get_history取不到当日最新数据?

ptrade | 发布时间: 2026/5/28
以下内容由 EasyQuant 生成。

问题描述

在9点30分46秒使用get_history(include=True)取1d和1m的数据都没法取到当日最新的数据。

/

解决方案

在 ptrade 量化平台中,如果在刚开盘时(如 9:30:46)使用 get_history(include=True) 获取 1m(分钟线)或 1d(日线)数据,确实会出现无法获取到当日最新数据的情况。这主要与 K 线的生成机制以及接口的设计有关。

问题原因分析

  1. K 线生成机制(1m数据)
    K 线数据是在该周期结束时才生成的。对于 1m(1分钟)级别的 K 线,第一根 K 线的时间跨度是 9:30:00 到 9:31:00。在 9:30:46 这个时间点,第一根 1 分钟 K 线尚未走完,因此系统底层还没有生成这根 K 线的数据。即使设置了 include=True,也无法取到不存在的 K 线。

  2. 日线数据更新延迟(1d数据)
    对于 1d(日线)数据,虽然开盘后会有当天的开盘价和最新价,但在刚开盘的几十秒内,日 K 线的数据结构可能尚未在历史行情服务器中初始化或同步完成。get_history 主要用于获取历史已固化的 K 线数据,对极短期的实时状态支持不如实时快照接口。

解决方案

如果您在开盘初期(9:30~9:31之间)急需获取当天的最新价格、开盘价或成交量等数据,不应使用 get_history,而应使用实时行情快照接口 get_snapshot

方案一:使用 get_snapshot 获取实时行情(推荐)

get_snapshot 接口可以获取到毫秒级的实时盘口快照,包含当天的开盘价、最新价、最高/最低价以及买卖五档等信息。

def initialize(context):
    g.security = '600570.SS'
    set_universe(g.security)

def handle_data(context, data):
    # 假设当前时间是 9:30:46
    snapshot = get_snapshot(g.security)
    if snapshot and g.security in snapshot:
        current_data = snapshot[g.security]
        open_px = current_data.get('open_px')  # 今开盘价
        last_px = current_data.get('last_px')  # 最新成交价
        high_px = current_data.get('high_px')  # 最高价
        low_px = current_data.get('low_px')    # 最低价
        volume = current_data.get('business_amount') # 总成交量
        
        log.info(f"最新价: {last_px}, 开盘价: {open_px}")

方案二:在 9:31 之后再调用 get_history

如果您的策略逻辑必须依赖 K 线数据(例如需要计算均线),请确保在第一根 K 线走完之后再获取。在分钟级别策略中,handle_data 会在每分钟结束时触发(即 9:31 触发第一次),此时调用 get_history(..., frequency='1m', include=True) 就可以正常获取到 9:30-9:31 的这根 K 线了。

方案三:使用 Tick 级别事件

如果您的策略对时间精度要求极高,需要在 9:30:00 到 9:31:00 之间进行高频判断,建议将策略改为 Tick 级别运行,使用 tick_data 函数或 run_interval 定时任务来处理。

总结

  • 获取历史 K 线:使用 get_history,但需注意当前周期未结束时无法获取完整 K 线。
  • 获取实时最新价/开盘价:使用 get_snapshot,这是开盘初期获取当日数据的最佳方式。