问题描述
模拟环境下,写了这个:
run_daily(after_market_open, time='15:30',reference_security='000300.XSHG')
本来希望模拟测试下,自动在3点半运行的;但是没有啊
什么地方错了啊?
解决方案
您好!导致您的 run_daily 函数在模拟环境下没有运行的核心原因在于时间字符串的格式错误。
1. 核心错误:全角冒号
在您的代码中:
run_daily(after_market_open, time='15:30',reference_security='000300.XSHG')
time='15:30' 里面的冒号 : 是中文全角冒号。Python 和 JoinQuant API 无法识别这种格式的时间字符串。您必须将其修改为英文半角冒号 :。
正确的代码应为:
run_daily(after_market_open, time='15:30', reference_security='000300.XSHG')
2. 其他可能导致不运行的原因排查
如果修改为半角冒号后仍然不运行,请检查以下几点:
- 模拟盘创建时间与执行时间的先后顺序:
如果您是在今天下午 15:30 之后(或者非常接近 15:30 的时候)创建并启动的模拟交易,那么今天的这个时间点已经过去了,引擎不会“补跑”今天的任务,它会在下一个交易日的 15:30 才会首次执行。 - 函数是否正确定义:
请确保您在代码中正确定义了after_market_open这个函数,并且它接收context作为唯一参数。例如:
(注:通常 15:30 运行的函数习惯命名为def after_market_open(context): log.info("收盘后函数运行,当前时间:" + str(context.current_dt)) # 您的逻辑代码after_market_close或after_trading_end,不过函数名本身不影响运行,只要对应上即可。) - 是否在
initialize中调用:
run_daily必须在initialize(context)初始化函数中进行注册调用,否则引擎无法识别您的定时任务。
3. 完整的正确示例
def initialize(context):
# 设定沪深300作为基准
set_benchmark('000300.XSHG')
# 开启动态复权模式(真实价格)
set_option('use_real_price', True)
# 注册定时运行函数,注意使用英文半角冒号
run_daily(after_market_open, time='15:30', reference_security='000300.XSHG')
def after_market_open(context):
# 这里的代码将在每个交易日的 15:30 执行
log.info("定时任务执行成功,当前时间:%s" % context.current_dt)
总结:写代码时请务必注意中英文符号的切换,尤其是标点符号(引号、括号、冒号、逗号等)必须使用英文半角状态输入法。修改冒号后,您的策略应该就能在模拟盘中按时运行了。