问题描述
请版主帮忙看看,在使用 get_full_tick 取期权数据不成功。
在取 510050.SH 时一切正常,在 10007891.SHO 时,却不成功。
(1)电脑系统版本=:Win10
(2)软件版本 1.0.1.10889
(3)完整报错截图
【2024-10-08 08:50:02.295】 [quote]start simulation mode
【2024-10-08 08:50:02.295】 510050.SH: {'510050.SH': {'time': 1728316800000, 'timetag': '20241008 00:00:00', 'lastPrice': 2.9090000000000003, 'open': 2.9090000000000003, 'high': 2.9090000000000003, 'low': 2.9090000000000003, 'lastClose': 2.909, 'amount': 0.0, 'volume': 0, 'pvolume': 0, 'stockStatus': 0, 'openInt': 0, 'settlementPrice': 0.0, 'lastSettlementPrice': 0.0, 'askPrice': [0.0, 0.0, 0.0, 0.0, 0.0], 'bidPrice': [0.0, 0.0, 0.0, 0.0, 0.0], 'askVol': [0, 0, 0, 0, 0], 'bidVol': [0, 0, 0, 0, 0]}}
10007891.SHO: {}
(4)最简代码
def handlebar(ContextInfo):
data = ContextInfo.get_full_tick(['510050.SH'])
print('510050.SH:',data)
data = ContextInfo.get_full_tick(['10007891.SHO'])
print("10007891.SHO:",data)
解决方案
在 QMT 平台中使用 get_full_tick 获取非主图合约(特别是期权合约)的数据时,如果返回空字典 {},通常是因为没有订阅该合约的实时行情或本地缺乏该合约的基础数据。此外,您测试的时间是早上 08:50,此时集合竞价尚未产生有效的 tick 数据,也可能导致获取不到最新行情。
以下是解决该问题的几种方法:
方法一:使用 get_market_data_ex 替代(强烈推荐)
get_market_data_ex 是 QMT 官方推荐的获取行情数据的接口。它内置了数据订阅功能(subscribe=True),在获取数据的同时会自动向服务器订阅该合约的行情,非常适合获取期权等非主图合约的 tick 数据。
修改后的代码示例:
#coding:gbk
def init(ContextInfo):
pass
def handlebar(ContextInfo):
# 使用 get_market_data_ex 获取 tick 数据,subscribe=True 会自动订阅
data_etf = ContextInfo.get_market_data_ex(
[], ['510050.SH'], period='tick', count=1, subscribe=True
)
print('510050.SH:', data_etf)
data_opt = ContextInfo.get_market_data_ex(
[], ['10007891.SHO'], period='tick', count=1, subscribe=True
)
print('10007891.SHO:', data_opt)
方法二:使用 subscribe_quote 显式订阅行情
如果您坚持使用 get_full_tick,需要先在 init 函数中通过 subscribe_quote 显式订阅该期权合约的 tick 行情,否则底层 C++ 接口不会主动推送该合约的数据。
修改后的代码示例:
#coding:gbk
def init(ContextInfo):
# 显式订阅期权合约的 tick 行情
ContextInfo.subscribe_quote('10007891.SHO', period='tick', dividend_type='none')
ContextInfo.subscribe_quote('510050.SH', period='tick', dividend_type='none')
def handlebar(ContextInfo):
# 订阅后,get_full_tick 才能正常获取到推送的数据
data_etf = ContextInfo.get_full_tick(['510050.SH'])
print('510050.SH:', data_etf)
data_opt = ContextInfo.get_full_tick(['10007891.SHO'])
print("10007891.SHO:", data_opt)
方法三:检查本地数据补充
期权合约数量庞大,QMT 客户端默认可能不会下载所有期权的基础信息。请确保您已经补充了期权数据:
- 打开 QMT 客户端,点击顶部菜单栏的 “数据管理”。
- 选择 “补充数据”。
- 勾选 “期权” 市场(如上交所期权 SHO),并补充近期的 Tick 数据和日线数据。
总结建议
在实盘或模拟盘中,为了保证数据获取的稳定性和代码的简洁性,建议全面转向使用 ContextInfo.get_market_data_ex 接口来获取各类行情数据。