问题描述
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 中获取任何实时数据前,请务必牢记**“先订阅,后获取”**的原则。