问题描述
symbol1 = ContextInfo.get_main_contract('IF00.IF')# 获取当前主力合约
print(symbol1)
应该要返回IF2409.IF才对,但实际返回了IF2006,为什么?
解决方案
在 QMT 平台中,调用 ContextInfo.get_main_contract() 返回了过期或错误的主力合约(例如返回了 IF2006 而不是当前的 IF2409.IF),通常是由以下两个原因导致的:
原因一:参数格式不正确
根据 QMT API 官方文档,get_main_contract(codemarket) 的参数格式应为品种名.市场代码。对于沪深300股指期货,品种名是 IF,市场代码是 IF(中金所)。
- 错误写法:
'IF00.IF'(带有00连续合约标识,可能导致解析异常) - 正确写法:
'IF.IF'
原因二:本地数据未更新(最常见原因)
QMT 平台与其他云端量化平台不同,它的很多计算(包括主力合约的判定,通常基于持仓量或成交量最大)严重依赖于本地数据。如果你的客户端本地数据没有更新,或者只下载到了 2020 年的数据,系统就会根据旧数据计算,从而返回历史的主力合约(如 IF2006)。
解决方案
第一步:修改代码中的参数
将代码中的 'IF00.IF' 修改为官方文档推荐的 'IF.IF':
def handlebar(ContextInfo):
# 正确的参数格式:品种名.市场代码
symbol1 = ContextInfo.get_main_contract('IF.IF')
print('当前主力合约为:', symbol1)
第二步:补充本地行情数据
- 打开 QMT 客户端,点击顶部菜单栏的**【数据管理】**。
- 选择**【补充数据】**。
- 在弹出的窗口中,选择期货市场(如中金所 IF),勾选日线数据和基础信息/合约列表。
- 将时间范围设置到当前最新日期,点击**【开始补充】**。
- 等待数据下载完成后,重新运行你的策略模型。
补充完最新的数据并修正参数后,get_main_contract 就能正确根据最新的持仓量/成交量动态返回当前的真实主力合约(如 IF2409.IF)了。