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]}}
问题描述
解决方案
在使用 xtdata.get_full_tick 获取实时 tick 数据时,如果发现获取到的数据不是最新的(例如下午调用却返回上午的数据),这通常是因为没有订阅该股票的实时行情。
get_full_tick 默认从本地缓存中读取最新的 tick 数据。如果没有订阅实时行情,本地缓存的数据就不会更新,从而导致获取到的数据停留在过去的某个时间点。
解决方法
要获取最新的实时 tick 数据,必须先使用 xtdata.subscribe_quote 订阅目标股票的实时行情。
示例代码
from xtquant import xtdata
import time
# 目标股票列表
stock_list = ['000967.SZ', '600084.SH']
# 1. 订阅实时行情
# period='tick' 表示订阅 tick 级别的数据
# count=-1 表示订阅最新的数据
for stock in stock_list:
xtdata.subscribe_quote(stock, period='tick', count=-1)
# 等待一小段时间,确保数据已经推送到本地缓存
time.sleep(1)
# 2. 获取最新的 tick 数据
res = xtdata.get_full_tick(stock_list)
print(res)
注意事项
- 订阅是必须的:在实盘或模拟盘中,任何需要实时更新的数据(如 tick、实时 K 线等),都必须先进行订阅。
- 等待数据推送:订阅后,数据从服务器推送到本地需要极短的时间。在脚本中,可以适当
sleep一下,或者使用回调函数(callback参数)来处理推送过来的数据,以确保拿到的是最新数据。 - 反订阅:如果不再需要某些股票的实时行情,建议使用
xtdata.unsubscribe_quote取消订阅,以节省系统资源和网络带宽。
使用回调函数处理实时数据(推荐)
相比于主动调用 get_full_tick,使用回调函数处理实时推送的数据更加高效和及时:
from xtquant import xtdata
# 定义回调函数
def on_data(datas):
for stock_code, data in datas.items():
print(f"收到 {stock_code} 的最新数据: {data}")
# 订阅并绑定回调函数
for stock in ['000967.SZ', '600084.SH']:
xtdata.subscribe_quote(stock, period='tick', count=-1, callback=on_data)
# 保持程序运行,以便持续接收数据
xtdata.run()