🚀 AI 一键生成 qmt 策略代码

QMT调用 get_full_tick 获取的行情数据严重过期怎么办?

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

问题描述

get_full_tick数据严重过期

测试环境为国金模拟环境,miniQMT

[2025-06-30 11:28:00,003] [WARNING] [tick数据异常]:513500.SH:时间超时: {'time': 1751253804000, 'timetag': '20250630 11:23:24', 'lastPrice': 2.101, 'open': 2.102, 'high': 2.103, 'low': 2.096, 'lastClose': 2.091, 'amount': 19998399300, 'volume': 952686, 'pvolume': 95268600, 'stockStatus': 3, 'openInt': 13, 'settlementPrice': 0, 'lastSettlementPrice': 2.091, 'askPrice': [2.101, 2.102, 2.103, 2.104, 2.105], 'bidPrice': [2.1, 2.099, 2.098, 2.097, 2.096], 'askVol': [12100, 35931, 16932, 7118, 8922], 'bidVol': [53047, 50287, 44998, 27810, 19376]}

11:28:00 取到的 tick 时间为 11:23:24

解决方案

在 QMT 或 miniQMT 中调用 get_full_tick 获取到严重过期的 tick 数据(例如延迟几分钟),通常是由于未正确订阅实时行情导致的。

为什么会出现数据过期?

get_full_tick 函数的作用是获取本地缓存的最新分笔数据。如果你的策略没有向服务器显式订阅该标的的实时行情,本地缓存的数据就不会更新,从而导致你取到的永远是最后一次缓存的旧数据。

解决方法:显式订阅行情

要获取最新的 tick 数据,必须先使用 subscribe_quote 接口订阅该标的的行情。订阅后,QMT 客户端会持续接收服务器推送的最新数据,此时再调用 get_full_tick 就能获取到最新的切片数据了。

正确的代码示例

#coding:gbk

def init(ContextInfo):
    # 目标标的
    stock_code = '513500.SH'
    
    # 1. 显式订阅 tick 行情
    # 参数:标的代码, 周期, 复权方式, 回调函数(可选)
    ContextInfo.sub_id = ContextInfo.subscribe_quote(stock_code, 'tick', 'none', on_quote)
    print(f"已订阅行情,订阅号: {ContextInfo.sub_id}")

# 2. (可选) 在回调函数中直接处理推送的最新数据
def on_quote(datas):
    # datas 格式为 {code: data}
    print("收到实时行情推送:", datas)

def handlebar(ContextInfo):
    # 3. 订阅后,也可以在 handlebar 中使用 get_full_tick 获取最新缓存
    if ContextInfo.is_last_bar():
        tick_data = ContextInfo.get_full_tick(['513500.SH'])
        print("当前最新 tick 数据:", tick_data)

其他排查建议

  1. 模拟环境延迟:你提到使用的是国金模拟环境。券商的模拟环境行情服务器有时确实不如实盘环境稳定,偶尔会出现行情推送卡顿或延迟的情况。如果确认代码已经正确订阅了行情,但依然存在延迟,建议在实盘环境中进行对比测试。
  2. 检查网络连接:确保运行 miniQMT 的机器网络畅通,没有被防火墙拦截行情端口。
  3. 主图驱动限制:如果你没有使用 subscribe_quote,而是依赖界面主图驱动,请确保 QMT 客户端当前打开的正是 513500.SH 的图表,否则非主图品种的数据不会自动更新。

总结:强烈建议在策略 init 中使用 ContextInfo.subscribe_quote 订阅所有需要监控的标的,这是解决 get_full_tick 数据过期的最有效方法。