Skip to content

定时任务对照:run_time / schedule_run / run_daily

这是工程记录。只谈回调怎么挂、回测进不进。不构成投资建议,不代操盘。

手册: run-timeschedule-runqmt-runtime-backtest

对照

QMT run_timeQMT schedule_runPTrade 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_runtime_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 里注册。

  1. 只写在 run_time 里,回测日志是空的,属正常。
  2. PTrade 分钟回测里 time 常要落在 09:31~11:30、13:00~15:00;交易里 00:00~23:59 都能设,和回测对不齐。
  3. QMT 部分周期第一次回调前会先等一个 period。
  4. 定时回调里同样要日期戳,避免同一秒打两次接口。

相关:API 查询 · 热门问题 · 关注 / 知识星球

完整讨论和附件在 知识星球 Kimi量化研究所