3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在 JoinQuant(聚宽)量化交易平台中,before_trading_start 和 before_market_open 经常在策略代码中出现,但它们的本质和调用机制有很大的区别。简单来说:一个是系统内置的特定回调函数,另一个是用户自定义的普通函数。
以下是详细的区别解析:
before_trading_start(context):系统内置回调函数def before_trading_start(context):
# 系统每天 09:00 自动执行
log.info("即将开始交易,当前日期:" + str(context.current_dt))
# 可以在这里更新当天的待买入股票池等
before_market_open(context):用户自定义函数my_morning_func 或 prepare_data)。它并不是聚宽 API 的保留关键字。initialize 函数中使用定时运行 API(如 run_daily, run_weekly, run_monthly)来显式注册它,并指定运行时间。run_monthly 或 run_daily 调度。def initialize(context):
# 必须手动注册,指定每天 09:00 运行该自定义函数
run_daily(before_market_open, time='09:00')
# 或者指定每月第一个交易日 09:00 运行
# run_monthly(before_market_open, monthday=1, time='09:00')
def before_market_open(context):
# 只有被 run_daily 调度时才会执行
log.info("自定义的开盘前准备函数运行了")
| 特性 | before_trading_start |
before_market_open (自定义) |
|---|---|---|
| 函数性质 | 聚宽 API 内置回调函数 | 用户自定义普通函数 |
| 调用方式 | 系统自动调用 | 需配合 run_daily 等定时函数手动注册调用 |
| 执行时间 | 固定在每天 09:00 | 由 run_daily 的 time 参数决定(如 09:00, 09:15 等) |
| 执行频率 | 每天执行一次 | 可通过 run_daily/weekly/monthly 灵活控制频率 |
建议:
如果你只是需要每天开盘前做一些常规准备,直接使用内置的 before_trading_start 是最简单方便的。如果你需要更复杂的定时逻辑(比如每周一开盘前,或者特定时间点),则建议自定义函数(如 before_market_open)并结合 run_xxx 系列函数来使用。