🚀 AI 一键生成 joinquant 策略代码
立即体验
👉 AI 生成代码 👈

JoinQuant 平台 run_daily 函数多次调用冲突与日内时间判断详解

joinquant | 发布时间: 2026/6/24
以下内容由 EasyQuant 生成。

问题描述

请教两个rundaily的问题

1、如果我初始化同时有两个:rundaily every_bar和另外一个rundaily指定在14:30执行,这两个会不会有冲突,或者彼此无关没有冲突分别运行??例如我rundaily every_bar埋下限价单低吸一个股票,一直等不到合适价位,那么我会在14:30撤单以后市价买入,我会担心有冲突。

2、当我rundaily every_bar的时候,我希望在下午14:30以后再执行,需要添加什么判断语句?一下子想不出来;每10日或20日定时调仓的表达式我可以用整除一个周期来表述,但是日内定时启动,没想好。

多谢!

解决方案

你好!关于你在 JoinQuant (聚宽) 平台使用 run_daily 函数遇到的两个问题,解答如下:

1. 多个 run_daily 是否会有冲突?

不会有冲突,它们会彼此独立、分别运行。

在 JoinQuant 的策略引擎中,你可以通过 run_daily 注册多个定时任务。引擎会根据你设定的时间点,在对应的时间触发相应的函数。

  • run_daily(func1, time='every_bar'):在分钟回测/模拟下,会在每个交易分钟的第一秒触发 func1
  • run_daily(func2, time='14:30'):会在每天的 14:30:00 触发 func2

执行顺序:
当时间到达 14:30 时,这两个任务都会被触发。在同一个时间点,总是先运行 run_xxx 指定的函数,且按照你在 initialize 中注册它们的顺序依次执行。因此,你完全可以在 every_bar 中挂限价单,然后在 14:30 的函数中检查订单状态,如果未成交则撤单并下市价单。这是一种非常经典且合理的量化交易逻辑。

示例代码:

def initialize(context):
    # 每分钟运行
    run_daily(limit_buy_logic, time='every_bar')
    # 每天 14:30 运行
    run_daily(market_buy_logic, time='14:30')

2. 在 every_bar 中如何判断时间在 14:30 之后?

如果你只用了一个 run_daily(func, time='every_bar'),但希望其中的某段逻辑只在 14:30 之后(包含 14:30)执行,你可以利用 context.current_dt 来获取当前的逻辑时间,并提取小时(hour)和分钟(minute)进行判断。

判断语句如下:

def handle_every_bar(context):
    # 获取当前时间的小时和分钟
    current_hour = context.current_dt.hour
    current_minute = context.current_dt.minute
    
    # 判断是否在 14:30 及之后
    # 条件1:小时大于 14 (即 15:00 之后,虽然A股15:00收盘,但逻辑严谨)
    # 条件2:小时等于 14 且 分钟大于等于 30
    if current_hour > 14 or (current_hour == 14 and current_minute >= 30):
        # 在 14:30 之后执行的逻辑
        log.info("当前时间是 %s,已到达或超过 14:30,开始执行特定逻辑", context.current_dt)
        # 你的交易代码...
    else:
        # 14:30 之前的逻辑 (可选)
        pass

总结建议:

  • 如果你只是想在 14:30 准时执行一次操作(比如撤单重下),建议使用问题1中的方法,直接注册一个 run_daily(func, time='14:30'),这样代码结构更清晰,运行效率也更高(不需要每分钟都去判断一次时间)。
  • 如果你是希望在 14:30 到 15:00 的每一分钟都持续执行某种逻辑,那么使用问题2中的 context.current_dt 判断方法是最合适的。