3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在 QMT 量化平台中,如果需要在盘中实时响应主图以外的多只股票行情更新,或者根据交易信号动态调整订阅池,推荐使用 ContextInfo.subscribe_quote() 与 ContextInfo.unsubscribe_quote() 接口。
ContextInfo.subscribe_quote语法:
subId = ContextInfo.subscribe_quote(stock_code, period='follow', dividend_type='follow', callback=None)
'600000.SH'。'tick', '1m', '1d',默认为 'follow'(跟随主图)。'none', 'front', 'back',默认为 'follow'。subId),用于后续的反订阅操作。ContextInfo.unsubscribe_quote语法:
ContextInfo.unsubscribe_quote(subId)
以下示例展示了如何在策略初始化或运行过程中动态订阅多只股票的行情,并在不再需要时根据 subId 取消订阅:
#encoding:gbk
import pandas as pd
# 存储订阅的句柄映射:{ stock_code: sub_id }
sub_map = {}
def on_quote(datas):
"""
行情推送回调函数
datas 结构为 { code: pd.DataFrame }
"""
for code, df in datas.items():
latest_close = df['close'].iloc[-1] if 'close' in df.columns else None
print(f"收到推流 - 代码: {code}, 最新价: {latest_close}")
def init(ContextInfo):
# 需要初始订阅的股票池
init_stocks = ['600000.SH', '000001.SZ']
for stock in init_stocks:
sub_id = ContextInfo.subscribe_quote(stock, period='tick', dividend_type='none', callback=on_quote)
sub_map[stock] = sub_id
print(f"已成功订阅: {stock}, 订阅ID: {sub_id}")
def handlebar(ContextInfo):
# 示例:仅在最后一根 Bar 上演示动态退订与重新订阅
if not ContextInfo.is_last_bar():
return
# 假设盘中根据条件取消 600000.SH 的订阅
target_code = '600000.SH'
if target_code in sub_map:
sub_id = sub_map.pop(target_code)
ContextInfo.unsubscribe_quote(sub_id)
print(f"已取消订阅: {target_code}, 对应ID: {sub_id}")
# 动态增加订阅新的标的
new_stock = '000002.SZ'
if new_stock not in sub_map:
sub_id = ContextInfo.subscribe_quote(new_stock, period='tick', dividend_type='none', callback=on_quote)
sub_map[new_stock] = sub_id
print(f"动态新增订阅: {new_stock}, 订阅ID: {sub_id}")
handlebar 仅由主图标的的行情驱动。通过 subscribe_quote 设置 callback 后,即使主图无 Tick 推送,订阅标的有了新行情也会触发 callback,极大提升实时性。ContextInfo.sub_map 或全局变量)记录 stock_code 与 sub_id 的映射关系,避免因丢失 sub_id 导致无法取消订阅。ContextInfo.get_all_subscription() 获取详细字典列表。