3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在 QMT 平台中,默认的策略驱动机制是行情驱动(即逐 K 线或逐 Tick 运行 handlebar)。但在实际交易中,我们经常需要执行一些时间驱动的高频任务,例如每隔 5 秒监控一次持仓、每 500 毫秒检查一次算法单状态等。这时,我们就需要使用 QMT 提供的定时器函数 ContextInfo.run_time()。
ContextInfo.run_time(funcName, period, startTime, market)
funcName (string): 定时器触发时回调的自定义函数名称(需传入字符串格式)。period (string): 重复调用的时间间隔。格式为 数字 + 单位:
nSecond(如 '5nSecond' 表示每 5 秒运行一次)。nMilliSecond(如 '500nMilliSecond' 表示每 500 毫秒运行一次)。nDay(如 '5nDay' 表示每 5 天运行一次)。startTime (string): 定时器第一次启动的时间,标准格式为 "YYYY-MM-DD HH:MM:SS"。如果想要定时器在策略启动时立刻运行,可以设置一个历史时间。market (string): 市场简称代码(如 'SH'、'SZ' 等)。注意:定时器功能仅在实盘/模拟运行模式下有效,在回测模式下运行没有意义。
以下是一个完整的 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
如果你需要更高频率的监控(例如半秒监控一次),只需将 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("毫秒级任务触发...")
my_high_frequency_task)必须且只能接收一个参数 ContextInfo。