问题描述
/
解决方案
在 ptrade 量化平台中,如果在 9:30:46 调用 get_history(include=True) 没有获取到当日最新的数据,通常是由 K线生成机制 和 接口定位 决定的。以下是详细的原因分析及解决方案。
一、 问题原因分析
1. K线生成周期尚未结束
get_history 接口主要用于获取历史 K线数据(如 1分钟线、日线等)。在 9:30:46 这个时间点,市场刚刚开盘,第一根 1 分钟 K 线(通常标记为 9:31)尚未走完(需要到 9:30:59 结束)。因为这根 K 线还没有闭合落库,所以即使设置了 include=True,系统也可能无法返回这根未完成的 K 线数据。
2. 接口设计定位
get_history 是一个基于历史 K 线数据库的查询接口,存在微小的数据落库延迟。它不适合用于获取毫秒级或秒级的实时最新价格。如果在 K 线未闭合的中间状态去取数据,往往只能取到上一根已经闭合的 K 线(即昨天的收盘数据或集合竞价数据)。
二、 解决方案与替代方案
如果您需要在盘中(如 9:30:46)获取最新的实时价格或行情,强烈建议不要使用 get_history,而应改用以下更实时的接口:
方案一:使用 get_snapshot 获取实时行情快照(最推荐)
get_snapshot 接口直接从柜台/行情源获取最新的实时快照数据,包含最新价、买卖五档、成交量等,没有 K 线落库的延迟。
def handle_data(context, data):
# 获取 600570 的实时快照
snapshot = get_snapshot('600570.SS')
if snapshot and '600570.SS' in snapshot:
# 获取最新成交价
last_price = snapshot['600570.SS'].get('last_px')
log.info(f"当前最新价为: {last_price}")
方案二:使用 tick_data 事件处理 Tick 级别行情
如果您的策略对时间精度要求极高(如 3 秒一次的 tick 级别),应该在 tick_data 函数中处理逻辑,而不是在 handle_data 中调用 get_history。
def tick_data(context, data):
security = '600570.SS'
if security in data:
# 获取 tick 数据中的最新价
current_price = data[security]['tick']['last_px']
log.info(f"Tick最新价: {current_price}")
方案三:调整 get_history 的调用时机
如果您确实需要使用 K 线数据(例如计算均线),请确保在 K 线闭合后再调用。例如,在分钟级别的 handle_data 中,框架会在每分钟 K 线结束后(如 9:31:00 之后)触发,此时调用 get_history(include=True) 就能准确获取到 9:31 这根刚走完的 K 线。
总结
- 查历史/算指标:用
get_history,但要接受 K 线闭合和落库的机制。 - 查当前最新价:用
get_snapshot,实时性最高。 - 高频交易:使用
tick_data配合order_tick。