问题描述
请问有人知道 get_full_tick 获取的行情数据也是 3 秒一更新么,小于 3 秒去获取没意义。
解决方案
QMT 中 get_full_tick 数据更新频率解析
针对您的问题,直接回答:是的,对于 A 股市场而言,get_full_tick 获取的 Level-1 行情数据通常是 3 秒更新一次。小于 3 秒去主动轮询获取确实没有实际意义。
以下是详细的机制解析和最佳实践建议:
1. 为什么是 3 秒一更新?
这主要受限于交易所底层的行情推送机制。目前沪深交易所提供的基础 Level-1 行情数据(即我们通常看到的五档盘口数据)是快照数据(Snapshot),其推送频率固定为 3 秒一次。
ContextInfo.get_full_tick() 函数的作用是获取本地缓存的最新的分笔数据。既然交易所每 3 秒才推送一次新数据,那么 QMT 本地接收到的最新数据也是每 3 秒才变化一次。因此,如果您以 1 秒或更短的频率去调用 get_full_tick(),您获取到的绝大多数情况下都是上一秒已经获取过的重复数据。
2. 小于 3 秒去获取有意义吗?
没有意义,且不推荐。
- 数据冗余:获取到的数据没有变化,无法为策略提供新的决策依据。
- 性能损耗:频繁调用 API 会无谓地消耗 CPU 资源,如果策略中包含大量股票,高频轮询可能会导致策略运行卡顿,甚至影响下单延迟。
3. QMT 中获取 Tick 数据的正确姿势
在 QMT 平台中,处理 Tick 级别的数据,建议采用**事件驱动(行情驱动)**的方式,而不是主动轮询:
方法一:利用 handlebar 的 Tick 驱动机制
QMT 的策略运行机制是行情驱动的。在实时行情下,当主图品种有新的 Tick 数据到来时,handlebar(ContextInfo) 函数会被自动触发执行一次。
def handlebar(ContextInfo):
# 确保只在最新的一根 K 线上处理实时 tick
if not ContextInfo.is_last_bar():
return
# 当 handlebar 被触发时,说明有新的 tick 到来了,此时获取才有意义
tick_data = ContextInfo.get_full_tick(['600000.SH'])
print(tick_data)
方法二:使用 subscribe_quote 订阅行情(推荐多股场景)
如果您的策略需要监控多只股票的 Tick 数据,主图的 handlebar 驱动可能不够用(因为主图只有一个品种)。此时强烈建议使用 ContextInfo.subscribe_quote() 进行数据订阅。
def on_quote(datas):
# 当订阅的股票有新行情(3秒快照更新)时,此回调函数会被自动调用
print("收到新行情:", datas)
def init(ContextInfo):
# 订阅沪深300的 tick 数据,有更新时自动回调 on_quote
ContextInfo.subscribe_quote('000300.SH', period='tick', dividend_type='none', callback=on_quote)
def handlebar(ContextInfo):
pass
4. 如果我真的需要更高频的数据怎么办?
如果您在做高频交易或微观结构分析,3 秒的快照数据确实不够用。此时您需要:
- 开通 Level-2 行情权限:L2 行情包含逐笔成交(Tick-by-Tick)和逐笔委托数据,推送频率是毫秒级的(只要有真实成交或委托就会推送)。
- 使用 L2 专用接口:在 QMT 中,开通 L2 权限后,可以通过
subscribe_quote订阅l2quoteaux(Level2 行情快照指标)或l2transactioncount(Level2 大单统计)等更高频的数据。
总结:在没有 L2 行情的情况下,请遵循 A 股 3 秒快照的客观规律,使用事件驱动的方式处理 get_full_tick 数据,避免无效的高频轮询。