🚀 AI 一键生成 qmt 策略代码

为什么 QMT xtdata.get_full_tick 获取的行情数据不是最新的?

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

问题描述

xtdata.get_full_tick(['000967.SZ', '600084.SH']) 获取到的数据是上午的。

res = xtdata.get_full_tick(['000967.SZ', '600084.SH'])
print(res)

{'600084.SH': {'timetag': '20250220 11:13:15', 'lastPrice': 5.74, 'open': 5.21, 'high': 5.74, 'low': 5.17, 'lastClose': 5.22, 'amount': 39785900, 'volume': 71106, 'pvolume': 7110614, 'stockStatus': 3, 'openInt': 13, 'settlementPrice': 0, 'lastSettlementPrice': 5.22, 'askPrice': [0, 0, 0, 0, 0], 'bidPrice': [5.74, 5.73, 5.72, 0, 0], 'askVol': [0, 0, 0, 0, 0], 'bidVol': [167673, 139, 7, 0, 0]}, '000967.SZ': {'timetag': '20250220 11:13:36', 'lastPrice': 6.02, 'open': 5.73, 'high': 6.06, 'low': 5.56, 'lastClose': 5.68, 'amount': 900129000, 'volume': 1543949, 'pvolume': 154394870, 'stockStatus': 3, 'openInt': 13, 'settlementPrice': 0, 'lastSettlementPrice': 5.68, 'askPrice': [6.02, 6.03, 6.04, 0, 0], 'bidPrice': [6, 5.99, 5.98, 0, 0], 'askVol': [121, 925, 1721, 0, 0], 'bidVol': [434, 97, 2146, 0, 0]}}

解决方案

问题分析

在 QMT (xtquant) 中,调用 xtdata.get_full_tick() 获取到的是上午的旧数据,根本原因是没有提前订阅这些股票的实时行情

xtdata.get_full_tick() 的工作机制是直接从本地内存中读取最新的 tick 缓存。如果你没有向服务器发送订阅请求,本地内存中的数据就不会更新,因此你取到的只能是之前某次操作遗留下来的旧数据(例如上午断开连接前的数据,或者终端最后一次自动推送的数据)。

解决方法

要获取最新的实时 tick 数据,必须先使用 xtdata.subscribe_quote() 订阅目标股票的行情,然后再调用 get_full_tick()

完整代码示例

from xtquant import xtdata
import time

stock_list = ['000967.SZ', '600084.SH']

# 1. 订阅实时行情 (period='tick' 表示订阅分笔数据)
for stock in stock_list:
    # count=-1 表示只订阅最新行情,不获取历史
    xtdata.subscribe_quote(stock, period='tick', count=-1)

print("行情订阅成功,等待数据推送...")
# 等待一小段时间,让底层 C++ 接收到服务器推送的数据并更新到本地内存
time.sleep(1) 

# 2. 再次获取全推 tick 数据
res = xtdata.get_full_tick(stock_list)
print("最新 Tick 数据:")
print(res)

进阶建议:使用回调函数实时接收

如果你是在做盘中实时交易策略,主动轮询 get_full_tick 效率较低且容易漏掉数据。推荐在订阅时传入 callback 函数,当有新的 tick 到来时,系统会自动触发回调:

from xtquant import xtdata

# 定义回调函数
def on_data(datas):
    for stock_code, data in datas.items():
        print(f"[{stock_code}] 最新价: {data[0]['lastPrice']}, 时间: {data[0]['timetag']}")

stock_list = ['000967.SZ', '600084.SH']

# 订阅并绑定回调函数
for stock in stock_list:
    xtdata.subscribe_quote(stock, period='tick', count=-1, callback=on_data)

# 保持主线程运行
xtdata.run()

总结:在 QMT 中获取任何实时数据前,请务必牢记**“先订阅,后获取”**的原则。