3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在 JoinQuant(聚宽)策略开发中,我们通常在 initialize 函数中使用 run_daily、run_weekly 或 run_monthly 来注册定时运行的函数。然而,在模拟交易或者特定策略逻辑中(例如代码更新、策略状态切换),可能需要动态修改或删除旧的定时任务。聚宽提供了 unschedule_all() 函数来实现这一需求。
每次调用 run_daily、run_weekly 或 run_monthly 时,系统都会创建一个新的定时任务。如果直接重新调用这些函数,会导致多个任务同时存在并重复执行。
为了修改或彻底删除已有的定时任务,必须:
unschedule_all() 清空所有已注册的定时任务。run_daily / run_weekly / run_monthly 注册的定时任务。after_code_changed)在模拟交易中,当策略代码被修改并重新载入时,聚宽会执行 after_code_changed(context) 函数。为了防止旧的定时任务叠加,我们可以在该函数中重置定时任务:
# 导入聚宽函数库
import jqdata
def initialize(context):
# 开启动态复权模式
set_option('use_real_price', True)
# 初始设置:每天 10:00 运行
run_daily(my_daily_func, time='10:00')
def my_daily_func(context):
log.info("执行定时任务,当前时间: %s" % context.current_dt)
def new_daily_func(context):
log.info("执行新的定时任务,当前时间: %s" % context.current_dt)
# 模拟交易更换代码后调用的函数
def after_code_changed(context):
# 1. 取消所有旧的定时任务
unschedule_all()
# 2. 重新设定新的定时运行函数(例如改为每天 14:00 运行)
run_daily(new_daily_func, time='14:00')
log.info("已更新定时任务为每天 14:00 运行")
unschedule_all() 会一次性清除所有注册的定时任务。如果只需要修改部分任务,请在清除后将不需要修改的任务一并重新注册。run_xxx 指定的函数,然后运行 before_trading_start,最后运行 handle_data 和 after_trading_end。func)必须接受 context 作为唯一参数,不能传入 data。