本示例展示如何使用 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 级别的实时数据。
运行步骤
- 打开 QMT 客户端并登录账户。
- 进入「量化交易」模块。
- 新建 Python 策略,粘贴上方完整代码。
- 保存策略文件。
- 选择「模拟信号」或「仿真交易」模式运行(不能在回测模式下运行,因为回测无实时行情)。
- 在交易时间段内观察输出面板的日志。
注意
本策略必须在交易时间段内运行才能收到实时行情数据。非交易时间段内不会有行情回调。
预期日志
在交易时间段内运行后,输出面板应显示类似以下内容:
行情订阅已启动: 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返回的字段名和结构可能因客户端版本不同而有差异,以当前客户端版本为准。- 如果订阅的品种处于停牌状态,回调不会被触发。