🚀 AI 一键生成 qmt 策略代码

QMT xtdata.subscribe_whole_quote 订阅后回调函数不触发怎么办?

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

问题描述

xtdata.subscribe_whole_quote订阅后,回调函数没有接收到数据

订阅方法
xtdata.subscribe_whole_quote(['600000.SH', '000001.SZ'], callback=on_data)

在执行的时候订阅返回值是 1,然后在定义的 on_data 方法中打印订阅的数据,但在执行的时候时候 on_data 方法没有任何输出,求指导。

解决方案

在 QMT 的独立 Python 环境(xtquant)中使用 xtdata.subscribe_whole_quotextdata.subscribe_quote 订阅行情时,如果返回值是 1(表示订阅请求发送成功)但回调函数 on_data 没有任何输出,最常见的原因是主线程在发送订阅请求后直接执行完毕退出了

行情订阅是一个异步过程,底层会在后台线程接收数据并触发回调。如果主线程没有保持阻塞运行,Python 脚本会直接结束,后台线程也会随之销毁,从而导致回调函数无法执行。

解决方法:使用 xtdata.run() 阻塞主线程

你需要在代码的最后加上 xtdata.run(),让主线程保持运行状态,持续监听行情推送。

完整修正代码示例:

from xtquant import xtdata

# 1. 定义回调函数
def on_data(data):
    # data 是一个字典,包含了推送的行情快照数据
    print("接收到行情推送:", data)

if __name__ == '__main__':
    # 2. 发起订阅
    # 注意:如果是订阅特定几只股票,建议使用 subscribe_quote
    # subscribe_whole_quote 通常用于订阅整个市场(如 ['SH', 'SZ'])
    seq = xtdata.subscribe_quote(
        stock_code=['600000.SH', '000001.SZ'], 
        period='tick', 
        start_time='', 
        end_time='', 
        count=0, 
        callback=on_data
    )
    
    print(f"订阅请求已发送,返回序号: {seq}")
    
    # 3. 阻塞主线程,保持程序运行以接收回调(关键步骤!)
    print("开始监听行情数据...")
    xtdata.run()

其他排查建议

如果加上 xtdata.run() 后仍然没有数据输出,请检查以下几点:

  1. 是否在交易时间:行情推送是基于交易所实时行情的。如果当前是非交易时间(如周末、晚上或中午休市),市场没有新的 Tick 数据产生,回调函数自然不会被触发。你可以尝试在盘中时间运行,或者检查是否有历史快照推送。
  2. QMT 客户端状态:确保你的 QMT 客户端(或极简版 MiniQMT)已经启动并成功登录,且客户端右下角的“行情”连接状态显示为绿色正常。
  3. 接口使用区分
    • xtdata.subscribe_quote:用于订阅指定股票列表的实时行情(推荐你当前的需求使用此接口)。
    • xtdata.subscribe_whole_quote:用于订阅全市场的行情快照,参数通常传入市场代码(如 ['SH', 'SZ'])。
  4. 回调函数参数:确保你的 on_data 函数只接收一个参数(即推送的数据字典),如果参数签名不匹配,底层在调用回调时可能会抛出异常被吞掉。