before_trading_start(context, data)能否定时在9:25分执行?
/
问题描述
解决方案
不能直接将 before_trading_start 函数的触发时间修改为 9:25。
根据 Ptrade API 文档的规定,before_trading_start 的执行时间是系统固定的:
- 回测环境:在每个回测交易日的 8:30分 执行。
- 交易(实盘/模拟)环境:在开启交易时立即执行,从隔日开始每天 9:10分(默认)执行。
解决方案:使用 run_daily 实现 9:25 定时执行
如果您希望在盘前 9:25 分准时执行某些逻辑(例如获取集合竞价数据、获取最新的可转债列表等),您应该使用 run_daily 定时任务函数。
您可以在 initialize 函数中配置 run_daily,指定触发时间为 9:25。
代码示例:
def initialize(context):
g.security = '600570.SS'
set_universe(g.security)
# 配置定时任务,每天 9:25 执行 my_before_trading_func 函数
run_daily(context, my_before_trading_func, time='9:25')
def my_before_trading_func(context):
# 这里编写您希望在 9:25 执行的盘前逻辑
log.info("现在是 9:25,执行自定义盘前逻辑")
# 例如:获取集合竞价快照
snapshot = get_snapshot(g.security)
log.info("9:25 集合竞价快照: %s" % snapshot)
def before_trading_start(context, data):
# 系统默认的盘前函数,实盘默认 9:10 执行
# 如果没有需要在 9:10 执行的逻辑,此函数可以留空或不定义
pass
def handle_data(context, data):
pass
注意事项
- 行情数据更新:在实盘中,9:10 之前调用实时行情接口(如
get_snapshot)可能会因为交易所行情未更新而获取到错误或空的数据。因此,将依赖实时行情的盘前逻辑通过run_daily延后到 9:25(集合竞价期间)执行是非常推荐的做法。 - 回测时间限制:在股票策略回测中,当回测周期为分钟时,
run_daily的time取值被限制在09:31~11:30与13:00~15:00之间。这意味着在回测环境下,run_daily无法在 9:25 触发。但在交易环境中,run_daily不受此时间限制,可以正常在 9:25 触发。