🚀 AI 一键生成 qmt 策略代码

QMT/miniQMT 中使用 subscribe_whole_quote 开盘后无数据回调怎么办?

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

问题描述

xtdata.subscribe_whole_quote方法进行订阅时的一些问题

我使用的是国金的 miniqmt 模拟客户端,然后在 python 中使用 req=xtdata.subscribe_whole_quote(self.stock_list,callback=self.on_quote_callback_1)进行订阅时,stock_list 中有 11 支股票,返回的订阅号是 1,说明成功了,并且也返回了一组数据,再后来就没有任何数据返回了,回调方法也没有被回调,在开盘前,应该是在集中竞价阶段是可以获取数据的,大概在 3 秒左右一次的数据回调,在开盘后反而没有数据了,这个是什么问题?和客户端有关吗?

解决方案

您遇到的这个问题在 miniQMT(尤其是模拟环境)中比较常见。集合竞价阶段(9:15-9:25)有数据(约3秒一次的快照),但开盘后(9:30之后)突然没有数据回调,通常由以下几个原因导致,确实很大程度上与客户端环境或代码逻辑有关。请按照以下几个方向进行排查:

1. 回调函数(Callback)发生阻塞或报错

这是最常见的原因。开盘后(9:30),行情数据量会瞬间爆发(Tick 数据非常密集)。

  • 阻塞问题:如果您的 on_quote_callback_1 函数中有耗时操作(例如:写入文件、数据库操作、复杂的计算、甚至使用了 time.sleep),会导致回调线程被阻塞。底层的 C++ 推送队列一旦堆积满,就会停止触发新的回调。
  • 报错问题:如果回调函数内部在处理开盘后的高频数据时发生了未捕获的异常(Exception),回调线程可能会崩溃,导致后续不再有数据进来。
  • 解决方案:在回调函数中尽量只做最简单的操作(如将数据放入 queue.Queue),然后由主线程或其他工作线程去消费队列中的数据。同时,在回调函数内部加上 try...except 捕获并打印所有异常。

2. 模拟客户端的行情服务器不稳定

您使用的是国金的模拟客户端。券商的模拟环境行情服务器通常资源有限,稳定性不如实盘。

  • 现象:开盘瞬间并发量极大,模拟环境的行情服务器可能会主动切断全推接口(subscribe_whole_quote)的推送,或者出现假死。
  • 排查方法:观察 miniQMT 客户端右下角的“行情连接”状态,看看开盘后是否变成了红色断开状态。如果是,说明是客户端行情源断开了。
  • 解决方案:尝试重启客户端。如果模拟盘持续如此,建议使用实盘账号登录(实盘账号也可以只获取行情不下单),实盘的行情服务器通常非常稳定。

3. 主线程是否存活?

在 Python 脚本中,如果主线程运行结束,后台的回调线程也会随之销毁。

  • 解决方案:确保在订阅行情后,您的代码末尾有阻塞主线程的语句。例如使用 xtdata.run(),或者 while True: time.sleep(1)

4. 尝试改用单票订阅接口

subscribe_whole_quote 是全推接口,虽然您只传了 11 只股票,但底层机制可能与单票订阅不同。如果全推接口在模拟盘受限,可以尝试改用 subscribe_quote 循环订阅:

from xtquant import xtdata

def on_quote_callback(data):
    try:
        print("收到行情回调:", data)
        # 注意:这里不要做耗时操作!
    except Exception as e:
        print("回调报错:", e)

stock_list = ['000001.SZ', '600000.SH'] # 您的11只股票

# 逐个订阅
for stock in stock_list:
    seq = xtdata.subscribe_quote(stock, period='tick', count=-1, callback=on_quote_callback)
    print(f"订阅 {stock} 返回序号: {seq}")

# 阻塞主线程,保持程序运行
xtdata.run()

总结建议

  1. 第一步:给回调函数加上 try...except,并确保里面没有耗时操作。
  2. 第二步:检查代码末尾是否有 xtdata.run() 阻塞主线程。
  3. 第三步:如果代码没问题,大概率是国金模拟盘开盘瞬间行情服务器压力过大导致断流。建议将 subscribe_whole_quote 替换为 subscribe_quote 遍历订阅,或者使用实盘客户端获取行情。