问题描述
解决方案
在 QMT 量化交易平台中,获取期货合约乘数主要有两种方式。最直接的方法是使用 ContextInfo.get_contract_multiplier 函数,或者通过获取合约详细信息接口 ContextInfo.get_instrumentdetail 来提取。
以下是具体的实现方法和代码示例。
方法一:使用 get_contract_multiplier(推荐)
这是最直接获取合约乘数的接口。
- 函数原型:
ContextInfo.get_contract_multiplier(contractcode) - 参数:
contractcode(string),合约代码,格式为code.market,例如'IF2306.IF'。 - 返回值:
number,返回该合约的乘数。
代码示例
# -*- coding: gbk -*-
def init(ContextInfo):
# 示例:获取中金所沪深300股指期货主力合约的乘数
# 注意:实际使用时请确保合约代码有效
contract_code = 'IF2306.IF'
# 调用接口获取乘数
multiplier = ContextInfo.get_contract_multiplier(contract_code)
print(f"合约 {contract_code} 的乘数为: {multiplier}")
def handlebar(ContextInfo):
pass
方法二:使用 get_instrumentdetail(获取详细信息)
如果你不仅需要乘数,还需要合约的其他信息(如上市日期、最小变动价位等),可以使用此接口。
- 函数原型:
ContextInfo.get_instrumentdetail(stockcode) - 参数:
stockcode(string),合约代码。 - 返回值:
dict(字典),包含合约的详细信息。 - 获取乘数:通过字典键值
'VolumeMultiple'获取。
代码示例
# -*- coding: gbk -*-
def init(ContextInfo):
contract_code = 'IF2306.IF'
# 获取合约详细信息字典
detail_dict = ContextInfo.get_instrumentdetail(contract_code)
# 从字典中提取合约乘数 (VolumeMultiple)
# 建议先判断返回值是否为空,防止代码报错
if detail_dict:
multiplier = detail_dict.get('VolumeMultiple')
print(f"通过详情接口获取 {contract_code} 的乘数为: {multiplier}")
# 顺便获取最小变动价位
tick_size = detail_dict.get('PriceTick')
print(f"最小变动价位: {tick_size}")
else:
print(f"未找到合约 {contract_code} 的详细信息")
def handlebar(ContextInfo):
pass
常见问题 Q&A
Q: get_contract_multiplier 返回的数值类型是什么?
A: 返回的是 number 类型(通常是浮点数或整数),可以直接用于数学计算,例如计算合约价值(价格 * 乘数)。
Q: 如果传入的合约代码不存在或错误,函数会返回什么?
A: 如果合约代码无效,get_contract_multiplier 通常会返回 0 或 None(取决于具体版本实现),建议在代码中对返回结果进行有效性判断。
Q: 股票代码可以使用这个函数吗?
A: 可以,但对于股票,合约乘数通常默认为 1(即 1 股)。对于期货以外的品种,VolumeMultiple 默认通常是 1。
Q: 如何获取当前主图品种的乘数?
A: 可以在 handlebar 或 init 中使用 ContextInfo.stockcode 获取当前主图代码,然后传入上述函数。例如:ContextInfo.get_contract_multiplier(ContextInfo.stockcode)。