QMT Python API
回调函数
回调函数概述
QMT 提供多种回调函数,用于监听委托、成交、持仓、资金等事件。回调函数在实盘运行模式下生效,需要先在 init 里调用 ContextInfo.set_account 后才会生效。每个回调的第一个参数是 ContextInfo 实例(习惯命名为 C)。
| 回调函数 | 触发时机 | 用途 |
|---|---|---|
order_callback(C, data) | 委托状态变化时 | 获取委托信息 |
deal_callback(C, data) | 成交回报时 | 获取成交信息 |
position_callback(C, data) | 持仓变化时 | 获取持仓信息 |
account_callback(C, data) | 资金账号变化时 | 获取资金信息 |
orderError_callback(C, data, msg) | 委托失败时 | 获取失败原因 |
提示
- 回调函数仅在实盘运行模式下生效。
- 需要先在
init里调用ContextInfo.set_account后生效。 - 回调函数是用户在策略脚本中定义的,引擎会在相应时机自动调用。
交易主推回调函数
委托状态变化主推 - order_callback
原型
1
def order_callback(C, data):2
# data 为委托对象3
pass释义
当账号委托状态有变化时,这个函数被客户端调用。用于获取委托回报信息。
参数
| 字段名 | 数据类型 | 解释 |
|---|---|---|
| C | object | ContextInfo 特定对象,策略模型全局对象 |
| data | object | 委托对象,包含委托的详细信息 |
返回值
无
示例
1
#coding:gbk2
def print_attr(obj):3
"""提取对象所有 m_ 开头的属性"""4
attr_dict = {}5
for attr in dir(obj):6
try:7
if attr[:2] == 'm_':8
attr_dict[attr] = getattr(obj, attr)9
except:10
pass11
return attr_dict12
13
def init(C):14
C.accound_id = account15
16
def order_callback(C, data):17
print('委托', print_attr(data))成交状态变化主推 - deal_callback
原型
1
def deal_callback(C, data):2
# data 为成交对象3
pass释义
当账号成交状态有变化时,这个函数被客户端调用。用于获取成交回报信息。
参数
| 字段名 | 数据类型 | 解释 |
|---|---|---|
| C | object | ContextInfo 特定对象,策略模型全局对象 |
| data | object | 成交对象,包含成交的详细信息 |
返回值
无
示例
1
#coding:gbk2
def print_attr(obj):3
"""提取对象所有 m_ 开头的属性"""4
attr_dict = {}5
for attr in dir(obj):6
try:7
if attr[:2] == 'm_':8
attr_dict[attr] = getattr(obj, attr)9
except:10
pass11
return attr_dict12
13
def init(C):14
C.accound_id = account15
16
def deal_callback(C, data):17
print('成交', print_attr(data))持仓状态变化主推 - position_callback
原型
1
def position_callback(C, data):2
# data 为持仓对象3
pass释义
当账号持仓状态有变化时,这个函数被客户端调用。用于获取持仓信息。
参数
| 字段名 | 数据类型 | 解释 |
|---|---|---|
| C | object | ContextInfo 特定对象,策略模型全局对象 |
| data | object | 持仓对象,包含持仓的详细信息 |
返回值
无
示例
1
#coding:gbk2
def print_attr(obj):3
"""提取对象所有 m_ 开头的属性"""4
attr_dict = {}5
for attr in dir(obj):6
try:7
if attr[:2] == 'm_':8
attr_dict[attr] = getattr(obj, attr)9
except:10
pass11
return attr_dict12
13
def init(C):14
C.accound_id = account15
16
def position_callback(C, data):17
print('持仓', print_attr(data))资金账号状态变化主推 - account_callback
原型
1
def account_callback(C, data):2
# data 为账号对象3
pass释义
当资金账号状态有变化时,这个函数被客户端调用。用于获取资金信息。
参数
| 字段名 | 数据类型 | 解释 |
|---|---|---|
| C | object | ContextInfo 特定对象,策略模型全局对象 |
| data | object | 账号对象,包含资金账号的详细信息 |
返回值
无
示例
1
#coding:gbk2
def print_attr(obj):3
"""提取对象所有 m_ 开头的属性"""4
attr_dict = {}5
for attr in dir(obj):6
try:7
if attr[:2] == 'm_':8
attr_dict[attr] = getattr(obj, attr)9
except:10
pass11
return attr_dict12
13
def init(C):14
C.accound_id = account15
16
def account_callback(C, data):17
print('资金账号', print_attr(data))账号异常下单主推 - orderError_callback
原型
1
def orderError_callback(C, data, msg):2
# data 为下单参数对象3
# msg 为错误信息4
pass释义
当账号下单异常时,这个函数被客户端调用。用于获取下单失败的原因。
参数
| 字段名 | 数据类型 | 解释 |
|---|---|---|
| C | object | ContextInfo 特定对象,策略模型全局对象 |
| data | object | 下单参数对象,包含下单时的参数信息 |
| msg | string | 错误信息,描述下单失败的原因 |
返回值
无
示例
1
#coding:gbk2
def print_attr(obj):3
"""提取对象所有 m_ 开头的属性"""4
attr_dict = {}5
for attr in dir(obj):6
try:7
if attr[:2] == 'm_':8
attr_dict[attr] = getattr(obj, attr)9
except:10
pass11
return attr_dict12
13
def init(C):14
C.accound_id = account15
16
def orderError_callback(C, data, msg):17
print('失败', print_attr(data))18
print('失败', msg)工具函数
通用属性提取工具 - print_attr
原型
1
def print_attr(obj):2
"""提取对象所有 m_ 开头的属性"""3
attr_dict = {}4
for attr in dir(obj):5
try:6
if attr[:2] == 'm_':7
attr_dict[attr] = getattr(obj, attr)8
except:9
pass10
return attr_dict释义
提取对象所有 m_ 开头的属性,返回为字典。用于在回调函数中打印和查看委托、成交、持仓、资金等对象的所有属性字段。
参数
| 字段名 | 数据类型 | 解释 |
|---|---|---|
| obj | object | 回调函数中传入的数据对象 |
返回值
返回一个字典,键为属性名(m_ 开头),值为对应属性值。
示例
1
def order_callback(C, data):2
print('委托', print_attr(data))3
4
def deal_callback(C, data):5
print('成交', print_attr(data))回调注册完整示例
以下示例展示了如何在一个策略脚本中注册全部回调函数:
1
#coding:gbk2
3
def print_attr(obj):4
"""提取对象所有 m_ 开头的属性"""5
attr_dict = {}6
for attr in dir(obj):7
try:8
if attr[:2] == 'm_':9
attr_dict[attr] = getattr(obj, attr)10
except:11
pass12
return attr_dict13
14
def init(C):15
C.accound_id = account16
17
# ===== 回调函数 =====18
def order_callback(C, data):19
print('委托', print_attr(data))20
21
def deal_callback(C, data):22
print('成交', print_attr(data))23
24
def position_callback(C, data):25
print('持仓', print_attr(data))26
27
def account_callback(C, data):28
print('资金账号', print_attr(data))29
30
def orderError_callback(C, data, msg):31
print('失败', print_attr(data))32
print('失败', msg)K线运行模式
逐 tick 运行 - handlebar
原型
1
def handlebar(C):2
# 逐 K线 tick 运行3
pass释义
与选择的K线无关,逐 K线 tick 运行,有行情变化就触发交易。适合需要实时响应的场景。
参数
| 字段名 | 数据类型 | 解释 |
|---|---|---|
| C | object | ContextInfo 特定对象,策略模型全局对象 |
返回值
无
示例
1
def handlebar(C):2
passorder(23, 1101, account, '300001.SZ', 42, -1, 100, '1', 2, '1', C)K线收盘运行 - on_bar
原型
1
def on_bar(C):2
# 当前K线结束后运行一次3
pass释义
当前K线结束后运行一次。例如周期为1分钟,则每分钟结束运行一次。适合按K线周期决策的场景。
参数
| 字段名 | 数据类型 | 解释 |
|---|---|---|
| C | object | ContextInfo 特定对象,策略模型全局对象 |
返回值
无
示例
1
def on_bar(C):2
passorder(23, 1101, account, '600000.SH', 42, -1, 100, '1', 2, '1', C)常用 K 线判断工具函数
K线判断方法一览
| 方法 | 返回类型 | 说明 |
|---|---|---|
C.get_bar_timetag(C.barpos) | int | 获取当前K线时间戳(毫秒),用于判断当前K线对应的日期 |
C.is_last_bar() | bool | 判断是否为最后一根K线,最后一根K线才下单 |
C.is_new_bar() | bool | 判断是否为新K线的第一个tick,新K线开始时初始化 |
示例
1
def handlebar(C):2
# 获取当前K线时间3
current_time = C.get_bar_timetag(C.barpos)4
from datetime import datetime5
dt = datetime.fromtimestamp(current_time / 1000)6
bar_date = dt.strftime('%Y%m%d')7
8
# 最后一根K线才下单9
if C.is_last_bar():10
pass11
12
# 新K线的第一个tick13
if C.is_new_bar():14
pass策略生命周期回调总览
用户在策略脚本中定义以下函数,引擎按顺序调用。init 和 handlebar 是必须的,其余为可选。
| 回调 | 调用时机 | 必需 |
|---|---|---|
init(C) | 策略启动时,仅调用一次 | 是 |
after_init(C) | init 完成之后调用一次 | 否 |
handlebar(C) | 每根K线触发一次(回测逐 bar 驱动 / 实盘行情驱动) | 是 |
on_backtest_finished(C) | 回测全部 bar 跑完后调用 | 否 |
stop(C) | 策略停止前调用(实盘退出时) | 否 |
account_callback(C, account_info) | 账户状态变动(实盘推送) | 否 |
order_callback(C, order_info) | 订单状态回报 | 否 |
deal_callback(C, deal_info) | 成交回报 | 否 |
position_callback(C, position_info) | 持仓变动 | 否 |
orderError_callback(C, passorder_info, msg) | 下单失败 | 否 |
提示
回调缓存查询可通过以下方法获取缓存的回报数据:
C.get_account_callback_cache(data):获取账户缓存C.get_order_callback_cache(data):获取订单缓存C.get_deal_callback_cache(data):获取成交缓存C.get_position_callback_cache(data):获取持仓缓存