问题描述
有人知道xtdata.get_full_tick(['511880.SH'])读不到数据,是因为时间限制还是什么原因嘛?昨天也是这样,但10点多不知道为什么就又能读取了~:'(
解决方案
QMT 中 get_full_tick 读不到数据的原因分析
在使用 QMT 平台(无论是内置的 ContextInfo.get_full_tick 还是独立版的 xtdata.get_full_tick)时,遇到早上读不到数据,但盘中(如10点多)突然又能读取的情况,通常是由以下几个原因造成的:
1. 未进行行情数据订阅(最常见原因)
get_full_tick 接口的机制是获取本地内存中缓存的最新分笔数据,它本身不会主动向服务器发起网络请求去拉取数据。
- 如果你没有在代码中显式调用订阅接口(
subscribe_quote),或者没有在 QMT 终端界面上打开该品种(511880.SH)的行情图表,本地就不会有实时的数据推送。 - 为什么10点多又能读了? 可能是你在10点多的时候,在 QMT 客户端界面上点击查看了
511880.SH的行情,或者运行了其他触发了订阅的策略,导致本地开始接收该品种的 tick 数据,此时get_full_tick就能读到缓存了。
2. 行情服务器连接延迟或未登录
QMT 的 Python API 依赖于底层的 QMT 客户端。如果早上刚启动客户端,行情服务器可能还在初始化连接中,或者网络存在短暂延迟。确保客户端右下角的“行情”状态显示为已连接。
3. 交易时间段的限制
在 9:15 - 9:25 的集合竞价期间,Tick 数据的推送频率和规则与连续竞价期间不同。如果在 9:30 正式开盘前调用,且没有最新的撮合数据,可能会返回空值或旧数据。
解决方案与标准代码写法
为了确保 get_full_tick 随时都能稳定获取到数据,必须先订阅行情。以下是 QMT 内置策略中的标准写法:
步骤 1:在 init 中订阅行情
使用 ContextInfo.subscribe_quote 订阅你需要的品种的 tick 数据。
#coding:gbk
def init(ContextInfo):
# 设定股票池
stock_list = ['511880.SH']
ContextInfo.set_universe(stock_list)
# 订阅 tick 行情数据,确保本地有实时推送
for stock in stock_list:
ContextInfo.subscribe_quote(stock, period='tick', dividend_type='none')
print(f"已订阅行情: {stock}")
def handlebar(ContextInfo):
# 确保在最后一根 K 线(实时状态)才去获取 tick
if not ContextInfo.is_last_bar():
return
# 获取最新分笔数据
tick_data = ContextInfo.get_full_tick(['511880.SH'])
if tick_data and '511880.SH' in tick_data:
print("最新Tick数据:", tick_data['511880.SH']['lastPrice'])
else:
print("暂未获取到Tick数据,等待推送...")
核心排查清单:
- 检查订阅:确保代码中包含了
subscribe_quote。 - 检查客户端状态:确保 QMT 终端已登录,且行情连接正常。
- 检查返回值:
get_full_tick返回的是一个嵌套字典,结构为{ '511880.SH': { 'lastPrice': 100.0, ... } },请确保解析字典的键值正确。