🚀 AI 一键生成 qmt 策略代码

QMT 平台 get_market_data_ex 突然取不到数据怎么办?

qmt | 发布时间: 2026/5/27
以下内容由 EasyQuant 生成。

问题描述

xtdata.get_market_data_ex突然取不到数据,只能取到9条数据。

今天还用得好好的后面突然取不到数据了,换数据源也不行。同样的代码在实盘客户端可以,在模拟客户端不行。只能取到9条数据。是订阅数满了吗?
手动去补充数据也不行。用get_local_data 也是不行。

解决方案

问题分析

在 QMT 平台中使用 get_market_data_exget_local_data 时,如果遇到“实盘客户端正常,模拟客户端只能取到极少量(如9条)数据”的情况,通常不是代码逻辑的问题,而是底层数据环境与订阅机制导致的。主要原因包括以下几点:

1. 模拟端与实盘端的数据隔离

QMT 的实盘客户端和模拟客户端是两个独立的程序,它们的本地数据目录是完全隔离的。你在实盘客户端下载或补充的历史数据,模拟客户端是无法读取到的。如果模拟客户端没有完整的数据,get_local_data 或未开启订阅的 get_market_data_ex 就只能取到内存中缓存的极少量最新 K 线(例如你提到的9条)。

2. 订阅参数与本地数据限制

根据 QMT API 文档,get_market_data_ex 有一个重要参数 subscribe(默认为 True)。

  • 如果 subscribe=False,函数只会读取本地已有的数据。如果本地没下载,就会返回空或极少量数据。
  • 如果 subscribe=True,系统会尝试向服务器订阅并拉取数据。但如果请求的数据量过大或网络/数据源节点异常,可能会导致拉取失败,退而返回本地缓存的少量数据。

3. 数据补充的周期与品种不匹配

手动补充数据时,如果补充的周期(如日线)与代码中请求的周期(如 period='1m')不一致,或者补充的时间段没有覆盖代码请求的时间段,依然会取不到数据。


解决方案与排查步骤

请按照以下步骤在模拟客户端中进行排查和修复:

第一步:在模拟客户端中重新补充数据

由于数据隔离,必须在模拟客户端中进行数据下载:

  1. 打开模拟客户端,进入【数据管理】 -> 【补充数据】。
  2. 选择你需要的市场品种以及对应的周期(例如,如果代码中用的是 1d,就必须勾选日线;如果是 1m,必须勾选1分钟线)。
  3. 设定好足够长的时间范围(如过去一年),点击下载,等待进度条完全走完。

第二步:检查 API 调用参数

确保在调用 get_market_data_ex 时,参数设置正确,特别是 countsubscribe 参数:

def handlebar(ContextInfo):
    # 确保在最后一根K线执行,避免盘中频繁调用导致卡顿
    if not ContextInfo.is_last_bar():
        return
        
    # 正确调用示例
    data = ContextInfo.get_market_data_ex(
        fields=['open', 'high', 'low', 'close'], 
        stock_code=['000300.SH'], 
        period='1d',
        start_time='', 
        end_time='', 
        count=-1,             # -1 表示根据时间范围取,或者取全部本地数据
        dividend_type='none', 
        fill_data=True,
        subscribe=True        # 确保开启订阅
    )
    print(data)

第三步:检查订阅数量限制

如果你一次性传入了大量的股票代码(例如全市场5000只股票),可能会触发订阅数量限制或导致内存/网络超时。建议:

  • 分批次获取数据。
  • 如果只是获取历史数据进行计算,且不需要盘中实时推送,可以先通过【数据管理】下载好全量数据,然后使用 get_local_data 或将 subscribe 设为 False 来纯读取本地数据。

第四步:清理缓存与重启

如果上述步骤都确认无误但依然无效,可能是模拟客户端的本地数据文件损坏或索引错乱:

  1. 关闭模拟客户端。
  2. 找到模拟客户端安装目录下的 userdata_minidatadir 文件夹(具体视券商版本而定),清理相关品种的缓存数据。
  3. 重启客户端,重新执行【补充数据】操作。