本示例展示如何使用 subscribe_quote 订阅实时行情数据,并在回调函数中通过 get_full_tick 获取最新的 Tick 信息。策略不涉及任何交易委托,仅用于演示实时行情订阅和回调处理机制。适用于模拟信号、仿真交易和真实交易环境。

示例目标

订阅指定品种的实时行情,在行情数据更新时通过回调函数获取最新 Tick 数据(包括最新价、成交量等),并输出到日志面板。

适用环境

环境 是否支持
回测环境 不适用(回测使用历史数据,无实时行情)
模拟信号 支持
仿真交易环境 支持
真实交易环境 支持

使用周期

日线(1d)。subscribe_quote 也支持分钟线、Tick 等周期,具体支持的周期以当前客户端版本为准。

是否可能产生真实委托

否。本策略不包含任何下单函数调用,不会产生真实委托或模拟委托。

完整代码

def init(ContextInfo): """策略初始化""" ContextInfo.set_universe(['600000.SH']) # 订阅实时行情,指定回调函数 ContextInfo.subscribe_quote('600000.SH', '1d', callback=on_data) ContextInfo.tick_count = 0 print('行情订阅已启动: 600000.SH') def on_data(ContextInfo, stock_code, period): """行情数据回调函数,每次行情更新时触发""" try: tick = ContextInfo.get_full_tick(stock_code) if tick is None: print(f'{stock_code} 暂无有效行情数据') return ContextInfo.tick_count += 1 last_price = tick.get('last_price', 0) volume = tick.get('volume', 0) amount = tick.get('amount', 0) print(f'[{ContextInfo.tick_count}] {stock_code} 最新价: {last_price} ' f'成交量: {volume} 成交额: {amount}') except Exception as e: print(f'行情回调异常: {e}') def handlebar(ContextInfo): """主策略逻辑(本示例不在此处理数据)""" pass

代码说明

init 函数

def init(ContextInfo): ContextInfo.set_universe(['600000.SH']) ContextInfo.subscribe_quote('600000.SH', '1d', callback=on_data) ContextInfo.tick_count = 0 print('行情订阅已启动: 600000.SH')
代码 说明
set_universe(['600000.SH']) 设置股票池,确保策略可获取该品种数据
subscribe_quote(...) 订阅 600000.SH 的日线实时行情,指定回调函数为 on_data
tick_count = 0 初始化 Tick 计数器,用于统计回调次数

subscribe_quote 参数说明

ContextInfo.subscribe_quote(stockcode, period, callback=callback_func)
参数 类型 说明
stockcode str 证券代码,如 '600000.SH'
period str 订阅周期,如 '1d'(日线)、'1m'(1分钟)、'tick'
callback function 行情更新时的回调函数,签名为 callback(ContextInfo, stock_code, period)

on_data 回调函数

def on_data(ContextInfo, stock_code, period): tick = ContextInfo.get_full_tick(stock_code) last_price = tick.get('last_price', 0)
  • 回调函数在每次行情数据更新时被自动调用。
  • ContextInfo.get_full_tick(stock_code) 返回一个包含 Tick 字段的字典。
  • 使用 tick.get('last_price', 0) 安全获取最新价,避免字段缺失导致异常。

get_full_tick 返回字段

字段 说明
last_price 最新成交价
volume 总成交量
amount 总成交额
open 开盘价
high 最高价
low 最低价
bid_price 买价列表(Level-1 为五档)
bid_volume 买量列表
ask_price 卖价列表
ask_volume 卖量列表
提示

返回字段可能因行情权限等级(Level-1 / Level-2)和客户端版本不同而有所差异,以当前客户端版本为准。

handlebar 函数

def handlebar(ContextInfo): pass

本示例的行情处理逻辑全部在 on_data 回调中完成,handlebar 保持空实现。在实际策略中,handlebar 可用于处理 K 线级别的逻辑,而 on_data 用于处理 Tick 级别的实时数据。

运行步骤

  1. 打开 QMT 客户端并登录账户。
  2. 进入「量化交易」模块。
  3. 新建 Python 策略,粘贴上方完整代码。
  4. 保存策略文件。
  5. 选择「模拟信号」或「仿真交易」模式运行(不能在回测模式下运行,因为回测无实时行情)。
  6. 在交易时间段内观察输出面板的日志。
注意

本策略必须在交易时间段内运行才能收到实时行情数据。非交易时间段内不会有行情回调。

预期日志

在交易时间段内运行后,输出面板应显示类似以下内容:

行情订阅已启动: 600000.SH [1] 600000.SH 最新价: 10.52 成交量: 1230000 成交额: 12950000.00 [2] 600000.SH 最新价: 10.53 成交量: 1250000 成交额: 13180000.00 [3] 600000.SH 最新价: 10.51 成交量: 1280000 成交额: 13460000.00 ...
提示

具体的价格和成交量数值取决于实时行情数据,以上仅为示例格式。回调频率取决于行情更新频率和订阅周期。

已知限制

  • subscribe_quote 在回测模式下不可用,回测使用历史数据回放,不会触发行情回调。
  • 回调函数中的 get_full_tick 返回的数据取决于当前行情权限。如果仅有 Level-1 权限,买卖盘数据为五档;需要 Level-2 权限才能获取十档行情。
  • 行情回调频率可能较高(特别是 Tick 周期),在回调中应避免执行耗时操作,否则可能导致行情处理延迟。
  • 策略停止后,行情订阅会自动取消。重新运行策略时需要重新订阅。
  • get_full_tick 返回的字段名和结构可能因客户端版本不同而有差异,以当前客户端版本为准。
  • 如果订阅的品种处于停牌状态,回调不会被触发。