问题描述
如题,run_daily(market_open, time='5m'),想这样写,但是报错了,应该怎么写呢?查API只查到定时和‘every_bar’
解决方案
在 JoinQuant 聚宽平台中,run_daily 的 time 参数确实不支持直接传入 '5m' 这种格式。time 参数只接受具体的时间字符串(如 '09:30')或者 'every_bar'。
要实现每 5 分钟执行一次操作,你需要将策略的运行频率设置为“分钟”,然后使用 'every_bar' 让函数每分钟触发一次,并在函数内部通过判断当前时间(context.current_dt)的分钟数是否为 5 的倍数来决定是否执行核心逻辑。
正确的实现方法
以下是具体的代码示例:
# 导入聚宽函数库
import jqdata
def initialize(context):
# 设定基准和真实价格模式
set_benchmark('000300.XSHG')
set_option('use_real_price', True)
# 注册定时运行函数,设置为每分钟触发一次
# 注意:回测界面的运行频率必须选择“分钟”
run_daily(market_open, time='every_bar')
def market_open(context):
# 获取当前时间的分钟数
current_minute = context.current_dt.minute
# 判断分钟数是否为 5 的倍数(即 0, 5, 10, 15...)
if current_minute % 5 == 0:
# 在这里写你每 5 分钟需要执行的操作
log.info("当前时间:%s,执行 5 分钟定时操作", context.current_dt)
# 示例:获取数据或下单
# order('000001.XSHE', 100)
关键点解析:
- 回测频率设置:在回测或模拟交易的设置页面,运行频率必须选择“分钟”。如果选择“天”,
'every_bar'只会在每天开盘时触发一次。 - 时间判断逻辑:
context.current_dt.minute % 5 == 0确保了只有在分钟数为 0, 5, 10, 15 等时刻,才会进入if语句内部执行你的交易逻辑。其余 4 分钟函数虽然被调用,但会直接跳过,不会消耗太多资源。 - 替代方案 (
handle_data):你也可以不使用run_daily,而是直接使用handle_data(context, data)函数,并在里面加上同样的if context.current_dt.minute % 5 == 0:判断,效果是完全一样的。