问题描述
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判断方法是最合适的。