问题描述
为什么最近xtdata.get_full_tick经常返回空数据,是行情源的问题吗,求解
解决方案
在 QMT(迅投)量化平台中,调用 get_full_tick(或 ContextInfo.get_full_tick)经常返回空数据,不一定全是行情源的问题。通常情况下,这与数据订阅状态、代码格式、调用时机或本地客户端状态有关。
以下是导致该接口返回空数据的常见原因及排查解决方法:
1. 未提前订阅实时行情(最常见原因)
get_full_tick 是用于获取内存中最新的 tick 快照数据。如果你没有提前对该股票进行行情订阅,内存中可能没有该股票的最新数据,从而返回空字典 {}。
解决方法:在获取 tick 数据前,确保已经调用了订阅接口。
# QMT 内置模式示例
def init(ContextInfo):
# 订阅行情数据
ContextInfo.subscribe_quote('000001.SZ', period='tick', dividend_type='none')
def handlebar(ContextInfo):
# 获取全量 tick 数据
tick_data = ContextInfo.get_full_tick(['000001.SZ'])
print(tick_data)
如果是独立运行模式(xtdata),请确保调用了 xtdata.subscribe_quote。
2. 股票代码格式不规范
QMT 对股票代码的格式要求非常严格,必须包含市场后缀,且大写。例如,平安银行必须是 000001.SZ,贵州茅台必须是 600519.SH。
排查方法:检查传入的 stock_code 列表,确保格式为 ['代码.市场']。如果漏掉后缀或写成小写,接口将无法识别,直接返回空。
3. 在非交易时间段调用
如果你在盘前(如 9:00 之前)、盘后或周末调用该接口,且 QMT 客户端刚刚重启,内存中尚未接收到当天的任何 tick 推送,此时调用也会返回空数据。
排查方法:确认测试时间是否在交易时段内(9:15 - 15:00)。如果需要在盘后测试,建议使用获取历史数据的接口(如 get_market_data_ex 或 get_local_data)。
4. QMT 客户端行情断开或未登录
无论是内置模式还是独立模式,底层都依赖 QMT 客户端的行情接收模块。如果 QMT 客户端的行情服务器断开连接,或者账号未正常登录,数据推送就会停止。
排查方法:
- 检查 QMT 客户端右下角的网络连接状态,确保“行情”显示为绿色已连接。
- 尝试在 QMT 客户端的 K 线图上查看该股票,看是否有实时行情跳动。
5. 传入的参数类型错误
get_full_tick 的参数 stock_code 应该是一个列表(List),即使只查询一只股票,也建议传入列表形式。
正确写法:ContextInfo.get_full_tick(['600000.SH'])
错误写法:ContextInfo.get_full_tick('600000.SH') (部分版本可能会兼容,但标准用法是列表)。
总结建议
如果你最近频繁遇到这个问题,建议按照以下步骤排查:
- 检查 QMT 客户端行情连接是否正常。
- 确认代码中是否正确执行了
subscribe_quote订阅操作。 - 打印传入的股票代码,核对
.SH/.SZ后缀是否正确。 - 确保在交易时段内进行实时 tick 的获取测试。