问题描述
解决方案
在 JoinQuant(聚宽)平台中,如果您需要取消策略中所有已经设置的定时任务(即通过 run_daily、run_weekly、run_monthly 设置的任务),可以使用 unschedule_all() 函数。
核心函数
unschedule_all()
该函数没有参数,调用后会清空当前策略中所有已注册的定时运行函数。
常见使用场景
这个函数最常用于 模拟交易 中更新策略代码时。
当您在模拟交易运行过程中修改了代码(例如修改了定时运行的时间),如果不先取消旧的任务,新的定时任务可能会与旧任务叠加,导致函数被重复调用。因此,通常在 after_code_changed(context) 函数中先调用 unschedule_all(),然后再重新定义定时任务。
代码示例
以下代码展示了如何在策略更新后,清除旧任务并重新设置新任务:
# -*- coding: utf-8 -*-
def initialize(context):
# 初始化时设置定时任务
run_daily(market_open, time='09:30')
def market_open(context):
log.info("市场开盘,执行任务")
# 模拟交易中,当您修改代码并保存后,会触发此函数
def after_code_changed(context):
# 1. 取消所有之前设置的定时运行任务(清除旧的 run_daily/weekly/monthly)
unschedule_all()
# 2. 重新设置定时任务
# 例如:我们想把时间从 09:30 改为 10:00,或者只是为了防止任务重复叠加
run_daily(market_open, time='10:00')
log.info("代码已更新,定时任务已重置")
注意事项
- 作用范围:
unschedule_all()仅取消由run_daily、run_weekly、run_monthly注册的定时任务。它不会影响handle_data、before_trading_start或after_trading_end等标准生命周期函数的运行。 - 执行逻辑:调用该函数后,必须重新调用
run_xxx系列函数来注册您需要的任务,否则策略将没有任何定时任务在运行。
Q&A
Q: unschedule_all() 会取消 handle_data 的执行吗?
A: 不会。handle_data 是策略引擎的基础回调函数,unschedule_all() 仅针对通过 run_daily、run_weekly 和 run_monthly 手动添加的定时任务。
Q: 在回测模式下需要使用 unschedule_all() 吗?
A: 通常不需要。在回测模式下,每次点击“运行回测”都是一个新的进程,initialize 会重新执行,不存在旧任务残留的问题。这个函数主要用于模拟交易(实盘模拟)中,当策略进程不重启但代码发生变更时使用。
Q: 如果我只想取消某一个特定的定时任务怎么办?
A: JoinQuant API 目前没有提供直接取消“单个”特定任务的函数。标准的做法是使用 unschedule_all() 取消所有任务,然后只重新注册您需要保留的那些任务。