定时任务对照:run_time / schedule_run / run_daily
这是工程记录。只谈回调怎么挂、回测进不进。不构成投资建议,不代操盘。
手册: run-timeschedule-runqmt-runtime-backtest
对照
QMT run_time | QMT schedule_run | PTrade run_daily | |
|---|---|---|---|
| 回测 | 不跑 | 一般不跑,以客户端为准 | 分钟回测可进;日线回测常在 15:00 |
| 实盘 | 可以 | 可以 | 可以 |
| 间隔 | '5nSecond' / '500nMilliSecond' | timedelta | 每天一个时刻 |
| 取消 | 随策略结束 | 可按任务号 / 组名取消 | 无单独取消,重启策略 |
要回测和实盘同一套逻辑,入口仍放 handlebar / handle_data。定时只当盘中补触发。
QMT:旧定时 + 新定时
python
#coding:gbk
import datetime as dt
def init(C):
C.run_time('on_tick', '5nSecond', '2019-10-14 13:20:00')
C.tid = C.schedule_run(on_minute, '20200101093000', -1, dt.timedelta(minutes=1), 'poll')
def on_tick(C):
print('run_time')
def on_minute(C):
print('schedule_run')
def handlebar(C):
if not C.is_last_bar():
return
print('handlebar 回测也会进')schedule_run 的 time_point 用 'yyyymmddHHMMSS'。已经过了预定时间,会立刻跑一次。同名任务会进同一组,按组名取消会全撤。
PTrade:run_daily / run_interval
python
def initialize(context):
run_daily(context, noon_job, time='10:30')
run_interval(context, poll_job, seconds=10, interval_timer_ranges='09:30-11:30,13:00-15:00')
def noon_job(context):
if not is_trade():
return
log.info('run_daily 到点')
def poll_job(context):
log.info('run_interval')
def handle_data(context, data):
pass交易里 run_daily + run_interval 合计不要超过 5 个,多了会堵、后面的不触发。run_daily 只能在 initialize 里注册。
坑
- 只写在
run_time里,回测日志是空的,属正常。 - PTrade 分钟回测里
time常要落在 09:31~11:30、13:00~15:00;交易里 00:00~23:59 都能设,和回测对不齐。 - QMT 部分周期第一次回调前会先等一个 period。
- 定时回调里同样要日期戳,避免同一秒打两次接口。
完整讨论和附件在 知识星球 Kimi量化研究所。
