🚀 AI 一键生成 qmt 策略代码

QMT 平台 get_full_tick 获取的行情数据是 3 秒一更新吗?

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

问题描述

请问有人知道get_full_tick获取的行情数据也是3秒一更新么,小于3秒去获取没意义。

请问有人知道 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 秒的快照数据确实不够用。此时您需要:

  1. 开通 Level-2 行情权限:L2 行情包含逐笔成交(Tick-by-Tick)和逐笔委托数据,推送频率是毫秒级的(只要有真实成交或委托就会推送)。
  2. 使用 L2 专用接口:在 QMT 中,开通 L2 权限后,可以通过 subscribe_quote 订阅 l2quoteaux(Level2 行情快照指标)或 l2transactioncount(Level2 大单统计)等更高频的数据。

总结:在没有 L2 行情的情况下,请遵循 A 股 3 秒快照的客观规律,使用事件驱动的方式处理 get_full_tick 数据,避免无效的高频轮询。