问题描述
解决方案
在 QMT 中,可以通过 ContextInfo.get_option_detail_data(optioncode) 接口来获取期权的详细信息,其中包括标的证券的代码和市场。
以下是具体的实现步骤和代码示例。
核心逻辑
- 调用
ContextInfo.get_option_detail_data(optioncode),传入期权代码(如'10001506.SHO')。 - 该函数返回一个字典(dict)。
- 从字典中提取
OptUndlCode(标的证券代码)和OptUndlMarket(标的证券市场)。 - 将两者拼接成 QMT 标准格式(
代码.市场),以便后续调用行情或交易接口。
代码实现
# -*- coding: gbk -*-
def init(ContextInfo):
# 示例:输入一个期权代码 (例如:50ETF购1月2200)
# 请确保该合约在当前市场环境中存在,或者使用您想查询的实际代码
option_code = '10001506.SHO'
# 获取期权详细信息
detail_data = ContextInfo.get_option_detail_data(option_code)
# 打印原始数据以便查看所有字段(调试用)
# print(detail_data)
if detail_data:
# 提取标的代码 (例如: 510050)
undl_code = detail_data.get('OptUndlCode')
# 提取标的市场 (例如: SH)
undl_market = detail_data.get('OptUndlMarket')
# 拼接成 QMT 标准格式 (例如: 510050.SH)
full_undl_code = f"{undl_code}.{undl_market}"
print(f"期权代码: {option_code}")
print(f"标的证券代码: {undl_code}")
print(f"标的证券市场: {undl_market}")
print(f"QMT标准标的代码: {full_undl_code}")
# 进一步获取标的名称验证
undl_name = ContextInfo.get_stock_name(full_undl_code)
print(f"标的名称: {undl_name}")
else:
print(f"未找到期权 {option_code} 的详细信息,请检查代码是否正确或是否已下载合约列表。")
def handlebar(ContextInfo):
pass
返回字段说明
ContextInfo.get_option_detail_data 返回的字典中,与标的相关的关键字段如下:
| 字段 Key | 说明 | 示例值 |
|---|---|---|
| OptUndlCode | 期权标的证券代码 | '510050' |
| OptUndlMarket | 期权标的证券市场 | 'SH' |
| OptUndlRiskFreeRate | 期权标的无风险利率 | 数值 |
| OptUndlHistoryRate | 期权标的历史波动率 | 数值 |
注意事项
- 数据补充:查询历史期权合约或非主力合约时,请确保在 QMT 客户端的【数据管理】中下载了对应的合约列表和基础数据。
- 代码格式:拼接后的代码(如
510050.SH)可直接用于get_market_data_ex或passorder等函数。
Q&A
Q: 如果传入的期权代码不存在或错误,函数会返回什么?
A: 如果代码无效或本地没有该合约数据,get_option_detail_data 通常会返回空字典 {} 或 None。代码中应增加判断逻辑(如示例中的 if detail_data:)以避免报错。
Q: 这个接口支持期货期权吗?
A: 支持。对于期货期权(如 IO 或 MO 品种),该接口同样会返回标的期货合约的代码和市场。
Q: 如何反过来通过标的查询所有对应的期权合约?
A: 可以使用 ContextInfo.get_option_list(undl_code, dedate, opttype, isavailable) 接口。例如 ContextInfo.get_option_list('510050.SH', '202312', 'CALL') 可以获取标的为 50ETF 的 2023年12月到期的认购期权列表。