问题描述
/
解决方案
在 ptrade 量化平台中,如果在刚开盘时(如 9:30:46)使用 get_history(include=True) 获取 1m(分钟线)或 1d(日线)数据,确实会出现无法获取到当日最新数据的情况。这主要与 K 线的生成机制以及接口的设计有关。
问题原因分析
-
K 线生成机制(1m数据):
K 线数据是在该周期结束时才生成的。对于1m(1分钟)级别的 K 线,第一根 K 线的时间跨度是 9:30:00 到 9:31:00。在 9:30:46 这个时间点,第一根 1 分钟 K 线尚未走完,因此系统底层还没有生成这根 K 线的数据。即使设置了include=True,也无法取到不存在的 K 线。 -
日线数据更新延迟(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,这是开盘初期获取当日数据的最佳方式。