🚀 AI 一键生成 qmt 策略代码
立即体验

QMT 平台如何使用 run_time 定时器?每5秒执行一次自定义函数教程

qmt | 发布时间: 2026/8/10
以下内容由 EasyQuant 生成。

问题描述

qmt 定时器教程:使用 run_time 实现毫秒级与秒级高频任务监控
qmt 的定时器 run_time 怎么使用?我想每隔5秒执行一次我的自定义函数

解决方案

QMT 定时器 run_time 使用教程:实现秒级与毫秒级高频任务监控

在 QMT 平台中,默认的策略驱动机制是行情驱动(即逐 K 线或逐 Tick 运行 handlebar)。但在实际交易中,我们经常需要执行一些时间驱动的高频任务,例如每隔 5 秒监控一次持仓、每 500 毫秒检查一次算法单状态等。这时,我们就需要使用 QMT 提供的定时器函数 ContextInfo.run_time()


1. ContextInfo.run_time() 函数详解

接口定义

ContextInfo.run_time(funcName, period, startTime, market)

参数说明

  1. funcName (string): 定时器触发时回调的自定义函数名称(需传入字符串格式)。
  2. period (string): 重复调用的时间间隔。格式为 数字 + 单位
    • 秒级单位:nSecond(如 '5nSecond' 表示每 5 秒运行一次)。
    • 毫秒级单位:nMilliSecond(如 '500nMilliSecond' 表示每 500 毫秒运行一次)。
    • 天级单位:nDay(如 '5nDay' 表示每 5 天运行一次)。
  3. startTime (string): 定时器第一次启动的时间,标准格式为 "YYYY-MM-DD HH:MM:SS"如果想要定时器在策略启动时立刻运行,可以设置一个历史时间
  4. market (string): 市场简称代码(如 'SH''SZ' 等)。

注意:定时器功能仅在实盘/模拟运行模式下有效,在回测模式下运行没有意义。


2. 每隔 5 秒执行一次自定义函数的完整源码

以下是一个完整的 QMT Python 策略示例。该策略在初始化时注册了一个定时器,自指定时间起,每隔 5 秒就会自动调用一次自定义的 my_high_frequency_task 函数。

#coding:gbk
import time

def init(ContextInfo):
    # 1. 初始化全局变量
    print("策略初始化成功!")
    
    # 2. 设置定时器:每5秒执行一次 my_high_frequency_task 函数
    # 使用历史时间 '2019-10-14 13:20:00' 可以让定时器在策略启动后立刻开始工作
    ContextInfo.run_time("my_high_frequency_task", "5nSecond", "2019-10-14 13:20:00", "SH")

def my_high_frequency_task(ContextInfo):
    """
    这是你的自定义定时回调函数
    """
    # 获取当前系统时间
    current_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())
    print(f"[定时器触发] 当前时间: {current_time} | 正在执行高频监控任务...")
    
    # 在这里编写你的高频监控逻辑,例如:
    # - 检查未成交委托并撤单
    # - 监控特定板块的盘口变化
    # - 实时风控指标计算

def handlebar(ContextInfo):
    # 行情驱动的主逻辑函数,定时器运行期间,handlebar 依然会随行情正常触发
    pass

3. 进阶:如何实现毫秒级高频监控?

如果你需要更高频率的监控(例如半秒监控一次),只需将 period 参数修改为毫秒单位即可。例如,设置每 500 毫秒执行一次:

def init(ContextInfo):
    # 每 500 毫秒(0.5秒)执行一次任务
    ContextInfo.run_time("my_millisecond_task", "500nMilliSecond", "2019-10-14 13:20:00", "SH")

def my_millisecond_task(ContextInfo):
    print("毫秒级任务触发...")

4. 常见问题与注意事项

  1. 定时器不运行? 请确保你的策略运行在实盘模拟盘模式下。回测模式下定时器不会生效。
  2. 回调函数参数:自定义的回调函数(如 my_high_frequency_task)必须且只能接收一个参数 ContextInfo
  3. 避免阻塞:由于 QMT 策略是单线程运行的,请确保你的自定义定时任务执行速度足够快。如果定时任务中包含复杂的网络请求或耗时计算,可能会导致行情接收或下单产生延迟。