3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在 QMT 量化交易平台中,获取期货品种当前主力合约代码主要使用 ContextInfo.get_main_contract() 接口。
该接口可以根据传入的“品种代码.市场后缀”格式,自动返回当前的主力合约代码(例如传入 'IF.IF' 返回 'IF2206.IF')。
以下是具体的实现代码和详细说明。
# -*- coding: gbk -*-
def init(ContextInfo):
print("策略初始化,开始获取主力合约...")
# 1. 获取中金所 - 沪深300股指期货(IF)的主力合约
# 格式:'品种.市场',中金所后缀为 .IF
if_main = ContextInfo.get_main_contract('IF.IF')
print(f"沪深300(IF) 主力合约: {if_main}")
# 2. 获取上期所 - 螺纹钢(rb)的主力合约
# 上期所后缀为 .SF
rb_main = ContextInfo.get_main_contract('rb.SF')
print(f"螺纹钢(rb) 主力合约: {rb_main}")
# 3. 获取大商所 - 铁矿石(i)的主力合约
# 大商所后缀为 .DF
i_main = ContextInfo.get_main_contract('i.DF')
print(f"铁矿石(i) 主力合约: {i_main}")
# 4. 获取郑商所 - 白糖(SR)的主力合约
# 郑商所后缀为 .ZF
sr_main = ContextInfo.get_main_contract('SR.ZF')
print(f"白糖(SR) 主力合约: {sr_main}")
# 5. 获取能源中心 - 原油(sc)的主力合约
# 能源中心后缀为 .INE
sc_main = ContextInfo.get_main_contract('sc.INE')
print(f"原油(sc) 主力合约: {sc_main}")
def handlebar(ContextInfo):
# 在盘中运行时,也可以在 handlebar 中实时获取
# 注意:主力合约通常不会频繁变动,建议在 init 或定时任务中获取,避免每个 tick 都调用
pass
ContextInfo.get_main_contract(codemarket)
codemarket (string): 格式为 "品种代码.市场代码"。'rb2310.SF')。.IF (例如 IF.IF, IC.IF).SF (例如 rb.SF, au.SF).DF (例如 m.DF, i.DF).ZF (例如 SR.ZF, TA.ZF).INE (例如 sc.INE)rb,股指期货用大写 IF),但在 QMT 内部通常不区分大小写,建议以实际测试为准。ContextInfo.subscribe_quote() 或 ContextInfo.get_market_data_ex() 对返回的具体合约代码进行操作。Q: get_main_contract 在回测模式下有效吗?
A: 有效。在回测模式下,该函数会根据回测当前运行到的时间点(ContextInfo.barpos 对应的时间),返回历史上那个时间点的主力合约代码,非常适合编写基于主力合约的连续回测策略。
Q: 如果传入了不存在的品种代码会发生什么?
A: 函数通常会返回空字符串或抛出异常(取决于具体版本),建议在代码中增加判断,例如 if main_contract: 来确保获取到了有效的代码。
Q: 如何获取次主力合约?
A: QMT 的标准 API get_main_contract 仅直接支持获取主力合约。如果需要获取次主力,通常需要获取该品种所有活跃合约的持仓量(Open Interest),通过比较持仓量大小自行逻辑判断(持仓量第二大的即为次主力)。