问题描述
测试环境为国金模拟环境,miniQMT
[2025-06-30 11:28:00,003] [WARNING] [tick数据异常]:513500.SH:时间超时: {'time': 1751253804000, 'timetag': '20250630 11:23:24', 'lastPrice': 2.101, 'open': 2.102, 'high': 2.103, 'low': 2.096, 'lastClose': 2.091, 'amount': 19998399300, 'volume': 952686, 'pvolume': 95268600, 'stockStatus': 3, 'openInt': 13, 'settlementPrice': 0, 'lastSettlementPrice': 2.091, 'askPrice': [2.101, 2.102, 2.103, 2.104, 2.105], 'bidPrice': [2.1, 2.099, 2.098, 2.097, 2.096], 'askVol': [12100, 35931, 16932, 7118, 8922], 'bidVol': [53047, 50287, 44998, 27810, 19376]}
11:28:00 取到的 tick 时间为 11:23:24
解决方案
在 QMT 或 miniQMT 中调用 get_full_tick 获取到严重过期的 tick 数据(例如延迟几分钟),通常是由于未正确订阅实时行情导致的。
为什么会出现数据过期?
get_full_tick 函数的作用是获取本地缓存的最新分笔数据。如果你的策略没有向服务器显式订阅该标的的实时行情,本地缓存的数据就不会更新,从而导致你取到的永远是最后一次缓存的旧数据。
解决方法:显式订阅行情
要获取最新的 tick 数据,必须先使用 subscribe_quote 接口订阅该标的的行情。订阅后,QMT 客户端会持续接收服务器推送的最新数据,此时再调用 get_full_tick 就能获取到最新的切片数据了。
正确的代码示例
#coding:gbk
def init(ContextInfo):
# 目标标的
stock_code = '513500.SH'
# 1. 显式订阅 tick 行情
# 参数:标的代码, 周期, 复权方式, 回调函数(可选)
ContextInfo.sub_id = ContextInfo.subscribe_quote(stock_code, 'tick', 'none', on_quote)
print(f"已订阅行情,订阅号: {ContextInfo.sub_id}")
# 2. (可选) 在回调函数中直接处理推送的最新数据
def on_quote(datas):
# datas 格式为 {code: data}
print("收到实时行情推送:", datas)
def handlebar(ContextInfo):
# 3. 订阅后,也可以在 handlebar 中使用 get_full_tick 获取最新缓存
if ContextInfo.is_last_bar():
tick_data = ContextInfo.get_full_tick(['513500.SH'])
print("当前最新 tick 数据:", tick_data)
其他排查建议
- 模拟环境延迟:你提到使用的是国金模拟环境。券商的模拟环境行情服务器有时确实不如实盘环境稳定,偶尔会出现行情推送卡顿或延迟的情况。如果确认代码已经正确订阅了行情,但依然存在延迟,建议在实盘环境中进行对比测试。
- 检查网络连接:确保运行 miniQMT 的机器网络畅通,没有被防火墙拦截行情端口。
- 主图驱动限制:如果你没有使用
subscribe_quote,而是依赖界面主图驱动,请确保 QMT 客户端当前打开的正是513500.SH的图表,否则非主图品种的数据不会自动更新。
总结:强烈建议在策略 init 中使用 ContextInfo.subscribe_quote 订阅所有需要监控的标的,这是解决 get_full_tick 数据过期的最有效方法。