🚀 AI 一键生成 qmt 策略代码

QMT 接口 get_market_data 为什么返回错误数据?如何正确获取批量实时分钟K线?

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

问题描述

get_market_data 为什么总拿不到正确的数据,这个缓存是怎么个缓法?

请求的是6月7号上午,返回的是6月6号下午,还没有错误信息,就算我写校验,那如果返回来的永远是错的也没意义啊?
所以应该怎么正确请求“批量实时分钟k线”?文档没找到

解决方案

为什么 get_market_data 会拿到旧数据?

在 QMT 平台中,你遇到的“请求今天上午的数据却返回昨天下午的数据”的问题,根本原因在于 get_market_data 接口的底层机制主要依赖于本地数据缓存。如果你的客户端没有实时接收到最新的行情包,或者本地数据没有及时刷新,该接口就会直接返回本地数据库中最后一条可用的数据(即昨天下午的数据),且不会报错。

官方文档已经明确指出:

ContextInfo.get_market_data 该接口已不建议使用,建议使用 ContextInfo.get_market_data_ex

正确的替代方案:使用 get_market_data_ex

为了解决缓存不同步和批量获取实时数据的问题,QMT 提供了升级版的接口 get_market_data_ex。这个接口增加了一个非常关键的参数:subscribe=True

subscribe=True 时,接口不仅会读取本地数据,还会主动向服务器订阅缺失的数据,从而保证你拿到的是最新的实时 K 线。

如何正确请求“批量实时分钟K线”?

你可以通过 get_market_data_ex 接口,传入股票列表和周期参数(如 '1m')来实现批量获取。以下是标准的 Python 代码示例:

#coding:gbk

def init(ContextInfo):
    # 设置你需要批量获取的股票池
    ContextInfo.set_universe(['000001.SZ', '600000.SH', '000300.SH'])

def handlebar(ContextInfo):
    # 确保只在最新的 K 线上执行,避免历史回测时重复打印
    if not ContextInfo.is_last_bar():
        return

    # 获取股票池
    stock_list = ContextInfo.get_universe()

    # 批量获取实时 1 分钟 K 线数据
    # count=1 表示获取最新的一根 K 线,如果需要多根可以设置为更大的数值
    # subscribe=True 是关键,确保数据实时更新
    data = ContextInfo.get_market_data_ex(
        fields=['open', 'high', 'low', 'close', 'volume'], 
        stock_code=stock_list, 
        period='1m', 
        start_time='', 
        end_time='', 
        count=1, 
        dividend_type='none', 
        fill_data=True, 
        subscribe=True
    )

    # 打印返回的数据
    for code, df in data.items():
        print(f"股票代码: {code}")
        print(df)

参数详解:

  • fields: 需要获取的字段列表,如 ['open', 'high', 'low', 'close']
  • stock_code: 股票代码列表,支持批量传入多个代码。
  • period: 周期,分钟线可以填 '1m', '5m', '15m' 等。
  • count: 获取的数据条数。-1 表示不限制,1 表示只取最新的一根。
  • subscribe: 必须设置为 True。设置为 False 时不做数据订阅,只读取本地已有数据(这就会导致你之前遇到的缓存问题)。

额外注意事项:

  1. 盘前数据补充:虽然 subscribe=True 会订阅实时数据,但如果你需要获取较长周期的历史分钟线(比如 count=1000),请务必在每天开盘前通过 QMT 客户端的【数据管理】手动或自动补充一次分钟线数据,以保证本地基础数据的完整性。
  2. 时间格式:如果你需要指定 start_timeend_time,请使用 'YYYYMMDDHHMMSS' 格式,例如 '20230607093000'