3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在 QMT 平台中获取 Level2 逐笔委托和逐笔成交数据时,下午 13:00 之后出现数据掉包(丢失)是一个相对常见的现象。这通常与数据洪峰、本地处理瓶颈以及网络环境有关。以下是详细的原因分析及相应的解决方案:
ContextInfo.subscribe_quote 订阅 Level2 数据时,如果您的 callback 回调函数中包含了耗时操作(如复杂的指标计算、频繁的本地文件读写、同步的数据库插入或同步下单),会导致主推线程被阻塞,后续到达的 Tick 数据无法及时处理而被丢弃。确保 subscribe_quote 的回调函数尽可能轻量。绝对不要在回调函数中进行耗时的 I/O 操作或复杂计算。建议将接收到的数据推入内存队列(如 Python 的 queue.Queue),由另一个独立的后台线程专门负责处理数据。
import queue
import threading
# 初始化一个全局队列
data_queue = queue.Queue()
def process_data_thread():
while True:
try:
# 从队列获取数据进行异步处理
datas = data_queue.get(timeout=1)
# 在这里进行复杂的计算或入库操作
# process(datas)
except queue.Empty:
continue
# 启动后台处理线程
t = threading.Thread(target=process_data_thread, daemon=True)
t.start()
def on_quote(datas):
# 回调函数只做一件事:把数据塞进队列,立即返回
data_queue.put(datas)
def init(ContextInfo):
# 订阅 Level2 数据
ContextInfo.subscribe_quote('000300.SH', 'tick', 'none', on_quote)
Level2 数据量庞大,请检查是否订阅了过多不必要的标的。尽量只订阅策略真正需要的股票池,避免全市场订阅。
如果逐笔主推数据偶尔掉包,可以在 handlebar 中结合 ContextInfo.get_market_data_ex 定时拉取最新的快照数据进行状态校对,防止策略因为个别 Tick 丢失而产生严重逻辑错误。
如果排除了本地代码和网络问题,且掉包频率近期突然增加,可能是券商服务端的 Level2 推送网关在高峰期存在压力。建议联系开户券商的 IT 支持人员,反馈该现象,确认是否为服务端限流或网关拥堵所致。