问题描述
为什么这段代码回测会回测到 10 月 10 号,我设置的时间都是今天(2025 年 10 月 23 日)
解决方案
在 QMT 平台中,遇到 get_market_data_ex 设置了时间但回测却从更早的时间(如 10 月 10 日)开始运行,通常是因为混淆了**“策略回测运行区间”与“函数数据获取区间”**。以下是导致该问题的两个核心原因及解决方法:
原因一:回测区间由策略设置决定,而非获取数据函数决定
get_market_data_ex 的作用仅仅是获取数据,它不能决定你的策略从哪一天开始回测。策略的回测起止时间是由以下两个地方控制的:
- 界面设置:策略编辑器右侧的【回测参数】面板中的“开始时间”和“结束时间”。
- 代码设置:在
init(ContextInfo)函数中通过ContextInfo.start和ContextInfo.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_time 和 end_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。