问题描述
订阅方法
xtdata.subscribe_whole_quote(['600000.SH', '000001.SZ'], callback=on_data)
在执行的时候订阅返回值是 1,然后在定义的 on_data 方法中打印订阅的数据,但在执行的时候时候 on_data 方法没有任何输出,求指导。
解决方案
在 QMT 的独立 Python 环境(xtquant)中使用 xtdata.subscribe_whole_quote 或 xtdata.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() 后仍然没有数据输出,请检查以下几点:
- 是否在交易时间:行情推送是基于交易所实时行情的。如果当前是非交易时间(如周末、晚上或中午休市),市场没有新的 Tick 数据产生,回调函数自然不会被触发。你可以尝试在盘中时间运行,或者检查是否有历史快照推送。
- QMT 客户端状态:确保你的 QMT 客户端(或极简版 MiniQMT)已经启动并成功登录,且客户端右下角的“行情”连接状态显示为绿色正常。
- 接口使用区分:
xtdata.subscribe_quote:用于订阅指定股票列表的实时行情(推荐你当前的需求使用此接口)。xtdata.subscribe_whole_quote:用于订阅全市场的行情快照,参数通常传入市场代码(如['SH', 'SZ'])。
- 回调函数参数:确保你的
on_data函数只接收一个参数(即推送的数据字典),如果参数签名不匹配,底层在调用回调时可能会抛出异常被吞掉。