🚀 AI 一键生成 qmt 策略代码
立即体验

qmt 行情订阅管理:如何使用 subscribe_quote 与 unsubscribe_quote 动态处理实时行情?

qmt | 发布时间: 2026/7/23
以下内容由 EasyQuant 生成。

问题描述

请根据以下 SEO 主题生成完整页面内容:

Title: qmt 行情订阅管理:subscribe_quote 与 unsubscribe_quote 最佳实践

Question: 如何在盘中动态订阅和取消订阅多只股票的实时行情推流?

解决方案

在 QMT 量化平台中,如果需要在盘中实时响应主图以外的多只股票行情更新,或者根据交易信号动态调整订阅池,推荐使用 ContextInfo.subscribe_quote()ContextInfo.unsubscribe_quote() 接口。

一、接口核心功能与用法

1. 订阅行情 ContextInfo.subscribe_quote

语法:
subId = ContextInfo.subscribe_quote(stock_code, period='follow', dividend_type='follow', callback=None)

  • stock_code: 订阅标的代码,格式如 '600000.SH'
  • period: 周期类型,如 'tick', '1m', '1d',默认为 'follow'(跟随主图)。
  • dividend_type: 复权类型,如 'none', 'front', 'back',默认为 'follow'
  • callback: 数据推送回调函数,当订阅标的产生新数据时立即驱动执行。
  • 返回值: 返回整数类型的订阅 ID (subId),用于后续的反订阅操作。

2. 取消订阅 ContextInfo.unsubscribe_quote

语法:
ContextInfo.unsubscribe_quote(subId)

  • 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}")

三、最佳实践注意事项

  1. 事件驱动优势:主图 handlebar 仅由主图标的的行情驱动。通过 subscribe_quote 设置 callback 后,即使主图无 Tick 推送,订阅标的有了新行情也会触发 callback,极大提升实时性。
  2. 句柄管理:建立全局字典(如 ContextInfo.sub_map 或全局变量)记录 stock_codesub_id 的映射关系,避免因丢失 sub_id 导致无法取消订阅。
  3. 获取当前订阅状态:如需查询策略当前所有的订阅信息,可调用 ContextInfo.get_all_subscription() 获取详细字典列表。