QMT Python API
系统函数
策略生命周期函数
用户在策略脚本中定义以下函数,引擎会在相应时机调用。每个回调的第一个参数是 ContextInfo 实例(习惯命名为 C)。init 和 handlebar 是必须定义的,其余为可选。
| 函数 | 调用时机 | 必需 |
|---|---|---|
init(C) | 策略启动时调用一次 | 是 |
after_init(C) | init 之后调用一次 | 否 |
handlebar(C) | 每根 K 线调用一次(回测逐 bar 驱动 / 实盘行情驱动) | 是 |
on_backtest_finished(C) | 回测全部 bar 跑完后调用 | 否 |
stop(C) | 策略停止前调用(实盘退出时) | 否 |
初始化函数 - init
提示
init 是必需的回调函数,必须在策略脚本中定义。
原型
def init(C):释义
初始化函数,策略启动时调用一次。用于初始订阅行情、订阅账号信息等初始化操作。init 函数执行完成前部分接口无法使用。
参数
| 字段名 | 数据类型 | 解释 |
|---|---|---|
C | object | ContextInfo 实例,策略运行环境对象,可以用于存储自定义的全局变量 |
返回值
无
示例
def init(C): C.set_commission(0.0003)初始化后函数 - after_init
原型
def after_init(C):释义
后初始化函数,在 init 执行完成后、handlebar 执行之前调用一次。可以用于放置一次性触发的下单、取数据操作代码。有些 init 里不支持的函数可以在 after_init 里调用。
参数
| 字段名 | 数据类型 | 解释 |
|---|---|---|
C | object | ContextInfo 实例,策略运行环境对象,可以用于存储自定义的全局变量 |
返回值
无
示例
def init(C): print('init') def after_init(C): print('系统会在 init 执行完后和执行 handlebar 之前调用 after_init') def handlebar(C): if C.is_last_bar(): print('handlebar')行情事件函数 - handlebar
提示
handlebar 是必需的回调函数,必须在策略脚本中定义。
原型
def handlebar(C):释义
行情事件函数,每根 K 线运行一次。实时行情获取状态下,先每根历史 K 线运行一次,再在每个 tick 数据到来后驱动运行一次。历史 K 线上,按时间顺序每根 K 线触发一次调用;盘中,每个新到达的 tick 数据驱动运行一次。可以作为行情驱动的函数,实现指标计算、回测、实盘下单的效果。
参数
| 字段名 | 数据类型 | 解释 |
|---|---|---|
C | object | ContextInfo 实例,策略运行环境对象,可以用于存储自定义的全局变量 |
返回值
无
示例
def handlebar(C): data = C.get_market_data_ex(['close'], [C.stock_code], period='1d', count=20) if C.stock_code not in data: return closes = data[C.stock_code]['close'] ma5 = closes.iloc[-5:].mean() ma20 = closes.iloc[-20:].mean() if ma5 > ma20 and C.is_last_bar(): order_shares(C.stock_code, 100, C=C) elif ma5 < ma20 and C.is_last_bar(): order_shares(C.stock_code, -100, C=C)回测完成函数 - on_backtest_finished
原型
def on_backtest_finished(C):释义
回测全部 bar 跑完后调用。仅在回测模式下触发,实盘模式下不会调用。
参数
| 字段名 | 数据类型 | 解释 |
|---|---|---|
C | object | ContextInfo 实例,策略运行环境对象,可以用于存储自定义的全局变量 |
返回值
无
示例
def on_backtest_finished(C): # 回测全部 bar 跑完后调用 print('回测完成')停止处理函数 - stop
原型
def stop(C):释义
策略停止前调用(实盘退出时)。复杂策略模型,如中间有起线程可通过在该函数内实现停止线程操作。注意,当前版本 stop 函数被调用时交易连接已断开,不能在 stop 函数中做报单 / 撤单操作。
参数
| 字段名 | 数据类型 | 解释 |
|---|---|---|
C | object | ContextInfo 实例,策略运行环境对象,可以用于存储自定义的全局变量 |
返回值
无
示例
def stop(C): print('strategy is stop !')Bar 状态方法
以下方法通过 ContextInfo 实例(即 C)调用,用于判断当前 K 线状态。
| 方法 | 返回 | 说明 |
|---|---|---|
C.is_last_bar() | bool | 当前是否为最后一根 K 线 |
C.is_new_bar() | bool | 当前是否为新 K 线的第一个 tick |
C.get_bar_timetag(index) | int | 获取指定 K 线的毫秒时间戳 |
是否为最后一根K线 - ContextInfo.is_last_bar
原型
C.is_last_bar()释义
判定当前是否为最后一根 K 线。返回 True 表示是右侧最新 K 线,False 表示不是最新 K 线。
参数
无
返回值
bool:True 表示是最后一根 K 线,False 表示不是。
示例
def handlebar(C): print(C.is_last_bar())判定是否为新的K线 - ContextInfo.is_new_bar
原型
C.is_new_bar()释义
某根 K 线的第一个 tick 数据到来时,判定该 K 线为新的 K 线,其后的 tick 不会认为是新的 K 线。历史 K 线每根都是新 K 线;盘中每根新 K 线第一个分笔返回 True,其他分笔返回 False。
参数
无
返回值
bool:True 表示是新 K 线的第一个 tick,False 表示不是。
示例
def handlebar(C): print(C.is_new_bar())获取指定K线的时间戳 - ContextInfo.get_bar_timetag
原型
C.get_bar_timetag(index)释义
获取指定索引处 K 线的毫秒时间戳。index 传 C.barpos 可取当前 bar 的时间戳。
参数
| 字段名 | 数据类型 | 解释 |
|---|---|---|
index | int | K 线索引,传 C.barpos 取当前 bar |
返回值
int:指定 K 线的毫秒时间戳。
示例
def handlebar(C): timetag = C.get_bar_timetag(C.barpos) print(timetag)交易回调函数
除了上述生命周期函数外,策略脚本还可以定义以下交易回调函数,用于接收实盘交易主推数据。详见回调函数。
| 回调 | 调用时机 | 必需 |
|---|---|---|
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) | 下单失败 | 否 |