3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
您遇到的这个问题在 miniQMT(尤其是模拟环境)中比较常见。集合竞价阶段(9:15-9:25)有数据(约3秒一次的快照),但开盘后(9:30之后)突然没有数据回调,通常由以下几个原因导致,确实很大程度上与客户端环境或代码逻辑有关。请按照以下几个方向进行排查:
这是最常见的原因。开盘后(9:30),行情数据量会瞬间爆发(Tick 数据非常密集)。
on_quote_callback_1 函数中有耗时操作(例如:写入文件、数据库操作、复杂的计算、甚至使用了 time.sleep),会导致回调线程被阻塞。底层的 C++ 推送队列一旦堆积满,就会停止触发新的回调。queue.Queue),然后由主线程或其他工作线程去消费队列中的数据。同时,在回调函数内部加上 try...except 捕获并打印所有异常。您使用的是国金的模拟客户端。券商的模拟环境行情服务器通常资源有限,稳定性不如实盘。
subscribe_whole_quote)的推送,或者出现假死。在 Python 脚本中,如果主线程运行结束,后台的回调线程也会随之销毁。
xtdata.run(),或者 while True: time.sleep(1)。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()
try...except,并确保里面没有耗时操作。xtdata.run() 阻塞主线程。subscribe_whole_quote 替换为 subscribe_quote 遍历订阅,或者使用实盘客户端获取行情。