问题描述
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. 数据下载是异步的(最常见原因)
如果您使用的 download_history_data 是基于 xtdata 模块的下载函数,该函数默认是异步执行的。这意味着代码触发下载请求后,会立刻执行下一行代码 ContextInfo.get_market_data_ex,而此时数据根本还没有下载到本地硬盘。
解决方法:
在策略中不建议直接混用下载和读取。正确的做法是:
- 手动补充:在 QMT 终端右下角的“数据管理” -> “补充数据”中,手动勾选对应的品种和
tick周期,补充所需时间段的数据。 - 同步等待:如果必须用代码下载,请确保使用回调函数或循环检查数据是否下载完毕后再进行读取。
2. 券商服务器的 Tick 数据保留期限
Tick 数据的数据量非常庞大,绝大多数券商的 QMT 服务器不会保留长期的历史 Tick 数据。通常情况下,服务器只保留最近 1 个月到 3 个月的 Tick 数据。如果您尝试下载距离当前时间较远的五月份数据,服务器上可能根本没有这些数据,因此下载操作实际上没有获取到任何内容。
解决方法:
- 在 QMT 终端的“数据管理”中尝试手动补充该时间段的 Tick 数据,观察是否有进度条和数据量提示。如果提示“无数据”或瞬间完成且数据量为0,说明服务器端已不提供该时段的 Tick 数据。
- 对于长期的历史回测,建议使用
1m(一分钟)数据代替tick数据。
3. subscribe=False 参数的限制
在您的代码中,ContextInfo.get_market_data_ex 的参数设置了 subscribe=False。这表示该函数仅从本地硬盘读取数据,不会向服务器发起实时请求。如果前面的下载步骤失败或未完成,本地没有数据,该函数就会返回空。
4. 时间参数格式问题
虽然您使用了 strftime("%Y%m%d%H%M%S") 进行了格式化,但请确保传入 get_market_data_ex 的 start_time 和 end_time 严格符合 QMT 的要求(通常为 YYYYMMDD 或 YYYYMMDDHHMMSS 字符串)。
总结建议流程
- 验证数据源:先不要用代码,直接去 QMT 客户端的【数据管理】里,手动补充
123056.SZ和123089.SZ在 2025年4月到5月的 Tick 数据,看能否补充成功。 - 修改读取代码:确认本地有数据后,再运行
ContextInfo.get_market_data_ex进行读取。 - 实盘/模拟获取最新 Tick:如果是为了获取当天的最新 Tick,不需要调用
download_history_data,直接将subscribe=True,或者使用ContextInfo.get_full_tick()获取最新快照。