🚀 AI 一键生成 qmt 策略代码

QMT 平台 get_market_data_ex 起始时间设置无效的原因及解决方法

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

问题描述

get_market_data_ex起始时间问题

为什么这段代码回测会回测到 10 月 10 号,我设置的时间都是今天(2025 年 10 月 23 日)

解决方案

在 QMT 平台中,遇到 get_market_data_ex 设置了时间但回测却从更早的时间(如 10 月 10 日)开始运行,通常是因为混淆了**“策略回测运行区间”“函数数据获取区间”**。以下是导致该问题的两个核心原因及解决方法:

原因一:回测区间由策略设置决定,而非获取数据函数决定

get_market_data_ex 的作用仅仅是获取数据,它不能决定你的策略从哪一天开始回测。策略的回测起止时间是由以下两个地方控制的:

  1. 界面设置:策略编辑器右侧的【回测参数】面板中的“开始时间”和“结束时间”。
  2. 代码设置:在 init(ContextInfo) 函数中通过 ContextInfo.startContextInfo.end 设置。

如果你在界面或 init 中设置的回测开始时间是 10 月 10 日,那么策略就会从 10 月 10 日的第一根 K 线开始逐 K 线运行(即触发 handlebar),即使你在 handlebar 里的 get_market_data_ex 写了只获取今天的数据。

解决方法
init 函数中显式指定回测的起止时间,或者在界面右侧修改回测参数。

def init(ContextInfo):
    # 设定回测起止时间为今天
    ContextInfo.start = '2025-10-23 00:00:00'
    ContextInfo.end = '2025-10-23 23:59:59'

原因二:count 参数覆盖了时间参数

如果你是指 get_market_data_ex 返回的数据包含了 10 月 10 日的数据,那可能是因为 count 参数的优先级问题。根据 QMT API 规则,如果 count 参数大于等于 0,系统会优先根据 count 的数量往前取 K 线,此时 start_time 可能会失效。

解决方法
如果你想严格按照 start_timeend_time 来获取数据,必须将 count 设置为 -1(表示不做个数限制)。

def handlebar(ContextInfo):
    # 严格按照时间区间获取数据,必须设置 count=-1
    data = ContextInfo.get_market_data_ex(
        fields=['open', 'high', 'low', 'close'], 
        stock_code=['000300.SH'], 
        period='1d',
        start_time='20251023', 
        end_time='20251023', 
        count=-1,  # 关键:设为 -1 才能让 start_time 严格生效
        dividend_type='none'
    )

总结

  • 要控制策略跑哪几天,请修改 ContextInfo.start 或界面回测参数。
  • 要控制函数取哪几天的数据,请使用 start_time + end_time 并务必配合 count=-1