PTrade策略引擎中有哪些事件函数,它们的作用和执行顺序是什么?
问题描述
解决方案
PTrade量化引擎以事件触发为基础,通过一系列特定的事件函数来完成每个交易日的策略任务。了解这些函数的作用和执行顺序是编写PTrade策略的基础。
一、 PTrade策略引擎核心事件函数概览
在PTrade中,一个完整的策略生命周期主要由以下几个事件函数构成:
initialize(context):初始化事件(必选)before_trading_start(context, data):盘前事件(可选)handle_data(context, data):盘中事件(必选)tick_data(context, data):Tick级盘中事件(可选,仅交易模块)after_trading_end(context, data):盘后事件(可选)on_order_response(context, order_list):委托主推事件(可选,仅交易模块)on_trade_response(context, trade_list):成交主推事件(可选,仅交易模块)
二、 事件函数详细解析与执行顺序
策略的执行严格按照时间轴推进,具体顺序和作用如下:
1. 策略启动阶段
initialize(context)- 作用:用于初始化策略的全局变量(如设置股票池
set_universe、设置基准set_benchmark、设置定时任务run_daily等)。 - 执行时机:该函数只会在回测和交易启动的时候运行一次。
- 作用:用于初始化策略的全局变量(如设置股票池
2. 每日盘前阶段
before_trading_start(context, data)- 作用:用于处理每天开盘前需要初始化的信息,例如获取前一交易日的收盘数据、更新每日股票池等。
- 执行时机:每天开始交易前被调用一次。在回测中通常为8:30;在实盘交易中,开启交易时立即执行,隔日开始每天9:10分(默认)执行。
3. 每日盘中阶段(核心交易逻辑)
盘中阶段是策略执行买卖操作的主要时间段,根据策略频率的不同,触发不同的函数:
handle_data(context, data)- 作用:处理策略交易的主要模块,根据设定的周期频率获取行情并执行下单逻辑。
- 执行时机:
- 日线级别:每天执行一次(回测为15:00,交易为尾盘固定时间如14:50)。
- 分钟级别:每分钟执行一次(回测9:31-15:00,交易9:30-14:59)。
tick_data(context, data)- 作用:用于处理Tick级别的高频交易逻辑,可获取逐笔委托和逐笔成交数据(需Level2行情)。
- 执行时机:每隔3秒执行一次(9:30-14:59)。
- 主推事件(异步触发)
on_order_response:当委托单状态发生变化时立即触发,适合对速度要求高的策略。on_trade_response:当有成交发生时立即触发。
4. 每日盘后阶段
after_trading_end(context, data)- 作用:用于处理每天收盘后的操作,如计算当日收益、保存持久化数据、打印盘后日志等。
- 执行时机:每天交易结束后调用一次(一般为15:30)。
三、 总结与代码骨架示例
一个标准的PTrade策略骨架如下所示:
def initialize(context):
# 1. 启动时运行一次
g.security = '600570.SS'
set_universe(g.security)
def before_trading_start(context, data):
# 2. 每天盘前运行一次
log.info("盘前准备...")
def handle_data(context, data):
# 3. 盘中按周期循环运行(必选)
order(g.security, 100)
def after_trading_end(context, data):
# 4. 每天盘后运行一次
log.info("盘后结算...")
注意事项:initialize 和 handle_data 是编写PTrade策略的必选项,缺少这两个函数策略将无法运行。其他函数可根据实际业务需求按需定义。