🚀 AI 一键生成 qmt 策略代码

QMT 平台 get_market_data_ex 获取当日分钟数据全是同一个值怎么办?

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

问题描述

get_market_data_ex获得当日分钟级别数据问题

调取数据命令 data=C.get_market_data_ex(['close'],[stock],period='1m',count=30,dividend_type='front', fill_data=True, subscribe=True)

但是 20250606 日获得的 000665.sz 股票分钟数据是不正确的,全部数据均为 4.12,直到购买这只股票后数据才正确,请问这个是什么问题,应该如何避免数据错误,难道分钟数据也要提前下载吗?

解决方案

问题原因分析

在 QMT 平台中,使用 get_market_data_ex 获取数据时,本质上是优先从本地客户端的数据库中读取数据。您遇到的“分钟数据全部为同一个值(如 4.12)”的情况,根本原因在于本地缺失该股票当天的历史分钟 K 线数据

虽然您在函数中设置了 subscribe=True,但这仅仅意味着订阅该股票未来的最新行情推送,它并不会瞬间自动把当天早些时候缺失的分钟 K 线历史数据补齐。当本地没有真实的分钟 K 线时,QMT 可能会用昨收价或某个缓存的切片价格来填充,导致您看到连续相同的数值。

至于“购买这只股票后数据才正确”,是因为您的交易行为(或者在交易面板点击了该股票)触发了客户端对该标的行情的深度激活,客户端在后台自动拉取了该股票的最新切片和部分 K 线数据,从而使得后续的数据读取恢复正常。

解决方法:分钟数据需要提前下载吗?

是的,必须提前下载或补充数据。 为了避免这种数据错误,您需要确保本地拥有完整的分钟级别数据。以下是具体的避免和解决步骤:

1. 客户端手动/自动补充数据(最重要)

在运行策略之前,您必须在 QMT 客户端中补充所需的分钟数据:

  • 操作路径:点击 QMT 客户端右下角的 “数据管理” -> “补充数据”
  • 设置:选择您需要的市场、品种,周期务必勾选“1分钟线”,设定好时间范围,点击下载。
  • 建议:如果您每天都要跑策略,建议在 QMT 的系统设置中开启**“自动补充数据”**功能,或者在每天盘前手动补充一次所需股票池的 1 分钟数据。

2. 在代码中正确初始化股票池

如果您只对特定的股票池感兴趣,可以在 init 函数中使用 set_universe 设定股票池,这样 QMT 在策略启动时会更好地准备这些股票的运行环境。

def init(ContextInfo):
    # 设定策略关注的股票池
    ContextInfo.set_universe(['000665.SZ'])

3. 使用 subscribe_quote 提前订阅行情

如果您在盘中动态获取某些不在初始股票池中的股票数据,建议在获取数据前,先使用 subscribe_quote 订阅该股票的行情,确保底层数据通道被激活。

def handlebar(ContextInfo):
    stock = '000665.SZ'
    
    # 确保当前是最新的一根 Bar
    if not ContextInfo.is_last_bar():
        return
        
    # 获取数据前,确保本地数据已通过客户端下载
    data = ContextInfo.get_market_data_ex(
        ['close'], 
        [stock], 
        period='1m', 
        count=30, 
        dividend_type='front', 
        fill_data=True, 
        subscribe=True
    )
    
    print(data)

总结

QMT 的 get_market_data_ex 强依赖于本地数据。“代码里的 subscribe=True” 无法替代 “客户端的数据下载”。请务必养成盘前在“数据管理”中补充 1 分钟线数据的习惯,这样就能彻底避免获取到全是同一个错误数值的问题。