问题描述
解决方案
在 QMT 量化交易平台中,获取某个期货品种当前主力合约代码的专用 API 函数是 ContextInfo.get_main_contract()。
以下是具体的代码实现及参数说明。
核心函数说明
- 函数名:
ContextInfo.get_main_contract(codemarket) - 参数:
codemarket(字符串)。格式为 "品种代码.市场代码"。- 例如:沪深300股指期货为
'IF.IF',螺纹钢为'rb.SF'。
- 例如:沪深300股指期货为
- 返回值:字符串。返回当前的主力合约代码(例如
'IF2212.IF')。
代码实现
以下是一个完整的策略示例,展示如何在策略初始化时获取不同交易所品种的主力合约代码并打印输出。
# -*- coding: gbk -*-
def init(ContextInfo):
"""
初始化函数,在策略启动时调用一次
"""
# 示例1:获取中金所 - 沪深300股指期货的主力合约
# 格式:'品种.IF'
main_contract_if = ContextInfo.get_main_contract('IF.IF')
print("沪深300主力合约: " + str(main_contract_if))
# 示例2:获取上期所 - 螺纹钢的主力合约
# 格式:'品种.SF'
main_contract_rb = ContextInfo.get_main_contract('rb.SF')
print("螺纹钢主力合约: " + str(main_contract_rb))
# 示例3:获取大商所 - 铁矿石的主力合约
# 格式:'品种.DF'
main_contract_i = ContextInfo.get_main_contract('i.DF')
print("铁矿石主力合约: " + str(main_contract_i))
# 示例4:获取郑商所 - 棉花的主力合约
# 格式:'品种.ZF'
main_contract_cf = ContextInfo.get_main_contract('CF.ZF')
print("棉花主力合约: " + str(main_contract_cf))
# 示例5:获取能源中心 - 原油的主力合约
# 格式:'品种.INE'
main_contract_sc = ContextInfo.get_main_contract('sc.INE')
print("原油主力合约: " + str(main_contract_sc))
# 如果需要在后续逻辑中使用主力合约,可以将其存入 ContextInfo
ContextInfo.my_main_contract = main_contract_if
def handlebar(ContextInfo):
"""
行情事件函数,每根K线或Tick触发
"""
# 在这里可以使用 init 中获取到的主力合约进行下单或数据获取
# 例如获取主力合约的最新价
if hasattr(ContextInfo, 'my_main_contract'):
last_price = ContextInfo.get_market_data_ex(
['close'],
[ContextInfo.my_main_contract],
period='tick',
count=1
)
# 注意:get_market_data_ex 返回的是字典
if ContextInfo.my_main_contract in last_price:
print(f"{ContextInfo.my_main_contract} 最新价: {last_price[ContextInfo.my_main_contract].iloc[-1]['close']}")
常见市场后缀说明
在使用 get_main_contract 时,必须正确填写市场后缀,否则无法获取数据:
- 中金所 (CFFEX):
.IF(注意:虽然市场简称是IF,但这里特指中金所后缀,如IF.IF,IC.IF) - 上期所 (SHFE):
.SF(如rb.SF,au.SF) - 大商所 (DCE):
.DF(如m.DF,i.DF) - 郑商所 (CZCE):
.ZF(如SR.ZF,TA.ZF) - 能源中心 (INE):
.INE(如sc.INE)
Q&A
Q: get_main_contract 获取的主力合约是实时更新的吗?
A: 是的。该函数返回的是当前交易日交易所认定的主力合约(通常是持仓量最大的合约)。在回测模式下,它会根据回测的时间点返回当时历史时刻的主力合约,从而实现主力合约的自动换月回测。
Q: 如果传入的品种代码不存在会发生什么?
A: 如果传入的格式错误或品种不存在,函数通常会返回空字符串或 None。在编写实盘策略时,建议对返回值进行非空判断,以防止后续代码报错。
Q: 如何获取次主力合约?
A: QMT 的 API 目前主要提供直接获取主力合约的便捷函数。如果需要获取次主力或特定排名的合约,通常需要使用 ContextInfo.get_instrumentdetail 或 get_market_data 获取该品种所有合约的持仓量(openInt),然后自行排序筛选。