3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在 QMT 平台的回测系统中使用 ContextInfo.get_market_data_ex 获取历史分钟(1m)数据时,如果发现拿到的全是当前交易日的最新收盘价,通常是由以下几个原因导致的。请按照以下步骤进行排查和修改:
QMT 平台在回测和运行策略时,依赖本地下载的历史数据。如果本地没有你所请求时间段的 1 分钟数据,接口可能只会返回内存中缓存的最新行情数据。
解决方法:
get_market_data_ex 接口对 start_time 和 end_time 的格式有严格要求。必须是字符串格式,且格式为 'YYYYMMDD' 或 'YYYYMMDDHHMMSS'。
排查方法:
检查你传入的 start_time 和 end_time 变量:
'2023-11-01' 或 datetime 对象。'20231101' 或 '20231101093000'。在逐 K 线回测(handlebar)中,如果你想获取当前 K 线及之前的历史数据,通常不需要指定绝对的 start_time 和 end_time,而是利用 count 参数向前取数据。如果指定了未来的时间或未生效的时间,可能会导致取数异常。
推荐的回测取数写法:
在 handlebar 中,如果你想获取当前时间点往前推的 N 根 1 分钟 K 线,建议将 end_time 留空(默认以当前回测到的 K 线时间为准),并设置 count。
def handlebar(ContextInfo):
stock_code = '000001.SZ'
# 获取当前回测时间点往前推 100 根 1 分钟 K 线
hist_data = ContextInfo.get_market_data_ex(
fields=['open', 'high', 'low', 'close', 'volume'],
stock_code=[stock_code],
period='1m',
count=100, # 向前取 100 根
start_time='', # 留空
end_time='', # 留空,默认以当前回测到的 bar 时间为截止
dividend_type='front', # 建议设置复权方式
subscribe=False # 回测获取历史数据不需要订阅
)
if stock_code in hist_data:
df = hist_data[stock_code]
print(df)
如果你在策略编辑器的“基本信息”中设置的主图周期是“日线(1d)”,但在代码中强行获取 1m 数据,虽然接口支持跨周期获取,但必须确保 1m 数据已经下载。如果主图是日线,end_time 留空时,获取到的 1m 数据截止时间是该日线的收盘时间。
你遇到的现象 90% 是因为没有在“数据管理”中下载对应品种的 1 分钟历史数据。请先去下载数据,然后确保时间字符串格式为 'YYYYMMDD',即可正常获取到历史分钟 K 线。