问题描述
ContextInfo.start = '2025-01-22 09:30:00'
ContextInfo.end = '2025-05-08 15:00:45'
A.start_time = datetime.strptime(ContextInfo.start, "%Y-%m-%d %H:%M:%S")
A.end_time = datetime.strptime(ContextInfo.end, "%Y-%m-%d %H:%M:%S")
download_history_data("123056.SZ","tick","20250401093000","")
download_history_data("123089.SZ","tick","20250401093000","")
data_now = ContextInfo.get_market_data_ex(['lastClose','high','low','lastPrice','volume','amount','settle','preClose','suspendFlag'],['123056.SZ','123089.SZ'], period='tick',start_time=A.start_time.strftime("%Y%m%d%H%M%S"),end_time =A.end_time.strftime("%Y%m%d%H%M%S"), dividend_type='none',fill_data=False,subscribe = False)
下载数据后,为什么获取不到五月份的 tick 数据
解决方案
在 QMT 平台中获取不到指定的 tick 数据,通常由以下几个原因导致。针对您提供的代码,请按照以下步骤进行排查和修改:
1. 检查时间是否为“未来时间”
您代码中设置的结束时间是 2025-05-08。如果当前现实时间还未到 2025 年 5 月,交易所自然没有产生这些 tick 数据,您是无法获取到的。请确保您请求的时间段是已经发生的历史时间。
2. 数据下载的异步问题(最常见原因)
在 QMT 中,通过代码调用下载数据的函数(如 download_history_data,通常 QMT 原生 API 中没有直接暴露这个全局函数,可能是您封装的或使用了 XTQuant 的方法)通常是异步的。这意味着发出下载请求后,程序会立刻执行下一行代码,而此时数据可能还没有完全下载并保存到本地硬盘。
紧接着您调用了 ContextInfo.get_market_data_ex(..., subscribe=False),subscribe=False 表示只读取本地已有的数据。因为数据还没下载完,本地没有 5 月份的数据,所以返回为空。
解决方法:
- 手动补充数据:强烈建议在运行策略前,直接在 QMT 客户端的【数据管理】->【补充数据】中,手动勾选对应的品种和
tick周期,将历史数据补充完整。 - 开启订阅模式:如果您是在实盘/模拟盘中运行,可以将
subscribe=True。这样如果本地没有数据,系统会尝试向服务器订阅并获取。
3. 字段 (fields) 匹配问题
您在 get_market_data_ex 中传入了特定的字段列表:['lastClose','high','low','lastPrice','volume','amount','settle','preClose','suspendFlag']。
在 QMT 的 tick 数据结构中,部分字段名称可能与您请求的不完全一致(例如 tick 数据通常包含 lastPrice, volume, amount, askPrice, bidPrice 等,但不一定包含 suspendFlag 或 lastClose)。
解决方法:
建议先将 fields 参数传入空列表 [],这样会返回该周期下所有支持的字段。您可以打印出来查看具体的列名,然后再按需提取。
# 建议的调试代码
data_now = ContextInfo.get_market_data_ex(
fields=[], # 先传空列表,获取所有字段
stock_code=['123056.SZ','123089.SZ'],
period='tick',
start_time=A.start_time.strftime("%Y%m%d%H%M%S"),
end_time=A.end_time.strftime("%Y%m%d%H%M%S"),
dividend_type='none',
subscribe=True # 尝试开启订阅
)
print(data_now)
4. 回测模式下的时间轴限制
如果您是在回测模式下运行这段代码,ContextInfo.get_market_data_ex 获取的数据范围会受到当前 K 线时间(ContextInfo.barpos 对应的时间)的限制。回测时,策略无法“偷看”当前 K 线时间之后的 tick 数据。请确保您的主图周期和回测时间设置正确。
总结建议:
- 确认请求的时间是历史已发生的时间。
- 提前在 QMT 客户端的【数据管理】中下载好
123056.SZ和123089.SZ的 tick 数据。 - 将
fields设为[]测试返回的数据结构。 - 如果是盘中运行,将
subscribe改为True。