问题描述
我希望我的代码能在每天下午2点50分自动执行一次,该如何实现?
解决方案
在 QMT 平台中,实现每天特定时间(如 14:50)自动执行代码,最标准且推荐的方法是使用 ContextInfo.run_time 函数。
该函数可以设置一个定时器,按照设定的周期(此处为每天)和起始时间触发指定的回调函数。
以下是具体的实现代码和说明:
实现代码
# -*- coding: gbk -*-
def init(ContextInfo):
# 设置定时任务
# 参数1: "on_time_job" -> 要执行的回调函数名称
# 参数2: "1nDay" -> 运行周期,表示每1天执行一次
# 参数3: "2023-01-01 14:50:00" -> 起始时间。日期可以是过去的时间,关键是时间部分要设为 14:50:00
# 参数4: "SH" -> 驱动行情的市场,一般填 "SH" 或 "SZ"
ContextInfo.run_time("on_time_job", "1nDay", "2023-01-01 14:50:00", "SH")
print("策略初始化完成,已设置每天 14:50 执行任务")
def handlebar(ContextInfo):
# QMT 策略必须包含 handlebar 函数,即使里面什么都不写
pass
def on_time_job(ContextInfo):
"""
这是自定义的函数,会在每天 14:50 被 run_time 自动调用
"""
print("当前时间 14:50,开始执行定时任务...")
# --- 在此处编写你的核心逻辑 ---
# 示例:获取当前账户资金情况
# account_id = '你的资金账号'
# ContextInfo.get_trade_detail_data(account_id, 'stock', 'account')
# 示例:执行下单操作
# passorder(...)
print("定时任务执行完毕")
代码详解
ContextInfo.run_time: 这是 QMT 提供的核心定时函数。- 函数名: 必须传入字符串格式的函数名(如
"on_time_job"),该函数必须在策略中定义,且接收ContextInfo作为参数。 - 周期:
"1nDay"代表每隔 1 天运行一次。 - 起始时间: 格式为
YYYY-MM-DD HH:MM:SS。QMT 会根据这个时间点和周期计算下一次触发时间。只要时间部分写对(14:50:00),日期写一个过去的时间(如2023-01-01)即可,系统会自动推算到今天的 14:50。
- 函数名: 必须传入字符串格式的函数名(如
on_time_job: 这是你自己定义的函数,名字可以随意取(需与run_time第一个参数一致)。所有需要在 14:50 执行的交易逻辑、数据处理或日志输出都写在这个函数里。handlebar: 这是 QMT 的标准回调函数,虽然在这个需求中主要逻辑在定时函数里,但handlebar必须存在,否则策略会报错。
注意事项
- 运行模式: 该代码在实盘/模拟交易模式下有效。
- 软件状态: 请确保在下午 14:50 时,QMT 客户端处于运行状态且策略已启动。