问题描述
解决方案
在 QMT 量化交易平台中,查询期货合约的合约乘数和最小变动价位,主要使用 ContextInfo.get_instrumentdetail(stockcode) 函数。
该函数会返回一个包含合约详细信息的字典,其中:
- 合约乘数 对应的键是
'VolumeMultiple' - 最小变动价位 对应的键是
'PriceTick'
代码实现
以下是一个完整的策略示例代码,展示如何在 init 初始化函数中查询并打印指定期货合约的这两项信息。
# -*- coding: gbk -*-
def init(ContextInfo):
# 定义需要查询的期货合约代码,格式为 '代码.市场'
# 例如:中金所股指期货 IF2306.IF,或者主力合约 IF00.IF
contract_code = 'IF2306.IF'
# 调用获取合约详细信息的接口
detail_dict = ContextInfo.get_instrumentdetail(contract_code)
# 检查是否成功获取到数据
if detail_dict:
# 获取合约乘数
multiplier = detail_dict.get('VolumeMultiple')
# 获取最小变动价位
price_tick = detail_dict.get('PriceTick')
# 获取合约名称(可选,方便查看)
name = detail_dict.get('InstrumentName')
print(f"合约: {name} ({contract_code})")
print(f"合约乘数: {multiplier}")
print(f"最小变动价位: {price_tick}")
else:
print(f"未找到合约 {contract_code} 的详细信息,请检查代码是否正确。")
def handlebar(ContextInfo):
# 本示例仅在 init 中演示查询,handlebar 可留空
pass
详细说明
- 函数名称:
ContextInfo.get_instrumentdetail(stockcode) - 参数:
stockcode(字符串),即合约代码,必须包含市场后缀。例如:- 中金所:
'IF2306.IF' - 上期所:
'rb2310.SF' - 大商所:
'm2309.DF' - 郑商所:
'SR309.ZF'
- 中金所:
- 返回值:返回一个字典(dict),包含该合约的静态基础数据。
- 关键字段:
VolumeMultiple:合约乘数(例如沪深300股指期货通常为 300)。PriceTick:最小变动价位(例如沪深300股指期货通常为 0.2)。
补充接口
如果你只需要查询合约乘数,也可以使用专用接口 ContextInfo.get_contract_multiplier(contractcode),它直接返回数值。但为了同时获取最小变动价位,推荐使用 get_instrumentdetail。
常见问题 (Q&A)
Q: 为什么查询到的合约乘数是 1?
A: 如果查询的是股票(如 600000.SH),QMT 默认返回的合约乘数通常为 1(表示1股)。如果是期货合约返回 1,请检查合约代码是否正确,或者该品种是否确实为 1。
Q: get_instrumentdetail 还能查询到哪些信息?
A: 该函数还可以查询到合约名称 (InstrumentName)、上市日期 (OpenDate)、到期日 (ExpireDate)、涨跌停价格 (UpStopPrice/DownStopPrice)、保证金比例 (LongMarginRatio/ShortMarginRatio) 等信息。
Q: 如何查询主力合约的乘数?
A: 你可以先使用 ContextInfo.get_main_contract(codemarket) 获取主力合约代码(例如传入 'IF.IF' 获取当前的 IF 主力),然后再将获取到的代码传入 get_instrumentdetail 进行查询。