说明:本文包含 AI 创作内容,请自行判断是否适用。文中包含的代码片段,切勿直接使用,需要根据实际情况修改。
概述
策略上线后最怕两件事:一是 QMT 挂了你不知道,二是策略还在”运行”但其实已经不工作(断开连接、行情不更新、下单报错被吞)。等你晚上看盘发现时,可能已经错过一整天。
本文给出一个轻量的「心跳 + 巡检 + 报警」方案,让 QMT 出问题第一时间推送到手机。和 邮件推送、崩溃自动恢复 配合,组成完整的运维闭环。
一、监控什么
| 监控项 | 含义 | 异常表现 |
|---|---|---|
| 心跳 | 策略是否还在跑 | 心跳时间戳长期不更新 |
| 行情新鲜度 | 最新价是否还在变 | 最新bar时间停在很久以前 |
| 账号登录态 | 交易通道是否在线 | get_trade_detail_data 报错或返回空 |
| 持仓异常 | 持仓是否合理 | 持仓为0但应有持仓、负持仓等 |
| 当日委托/成交 | 今天有没有异常废单 | pending 长时间不确认 |
二、心跳:最基础的存活检测
思路:策略定时把”当前时间”写到文件/数据库,外部(或另一个巡检任务)检查这个时间戳是否在更新。超过阈值就报警。
策略端:定时写心跳
1 | # -*- coding: utf-8 -*- |
run_time定时任务用法见 每天代码重置与定时任务。
三、巡检:在策略内部自检
光有心跳不够——策略可能还在跑,但行情断了或账号掉线了。需要在策略内定时做几项检查,发现异常就报警:
1 | def patrol(C): |
四、报警通道
巡检发现异常,要能推到手机。最简单的是复用 邮件推送:
1 | from email_utils import send_qmt_email |
除邮件外,还可选:
- Server酱 / Bark:HTTP 一个 GET 就能推到微信/App,比邮件更快。
- 钉钉 / 企业微信机器人:适合多策略集中告警到一个群。
- 短信:最紧急场景,但通常要付费。
以上几种微信推送通道的具体接入代码,见 策略消息推送到微信的几种方案。
关键告警(账号掉线、重复下单风险)建议用即时性更好的渠道,邮件可作为兜底。
五、外部存活检测:防止策略整体卡死
策略自己的心跳和巡检,在”策略进程还在”时才有效。如果整个策略卡死(死锁、QMT 假死),它就没法再写心跳了。所以需要一个独立于策略的外部检测:
用一个独立的定时任务(系统 crontab 或另一个极简策略)读取心跳文件,检查时间戳:
1 | # watchdog.py —— 可由系统计划任务每分钟跑一次 |
用 crontab 每分钟跑一次:
1 | * * * * * cd /path/to/qmt/python && python watchdog.py |
这样哪怕 QMT 整体假死,外部看门狗也能发现心跳停了,第一时间告警。
六、一份巡检报告:每天收盘推送
除了异常告警,每天收盘后推送一份「日报」也很有用:今日成交、当前持仓、账号市值、心跳状态。让你不用开电脑也能知道策略今天干了啥:
1 | def init(C): |
七、注意事项
- 告警要节流:同一个异常别每 30 秒告警一次,会刷屏。给告警加去重/冷却时间(同一类问题 10 分钟内只报一次)。
- 告警本身别拖垮策略:发邮件/HTTP 是阻塞 IO,放在
run_time任务里,别放在handlebar高频路径;失败要 catch,不能因告警失败抛异常影响主逻辑。 - 非交易时段静默:盘后、夜里的心跳超时多半是正常停盘,判断交易时段后再决定要不要告警,参考 判断交易时段。
- 多策略分别心跳:每个策略写自己的心跳字段,看门狗统一检查,参考 多策略管理。
总结
一个可靠的监控体系 = 策略内心跳 + 内部巡检 + 外部看门狗 + 报警通道 + 日报兜底。
- 心跳保证”还活着”,巡检保证”活着且正常”,看门狗保证”心跳本身没卡死”。
- 异常用即时渠道,日报用邮件,都接到手机上。
- 告警要节流、要容错,别让监控本身成为新的故障源。
把这套和 崩溃自动恢复 一起部署,你的 QMT 实盘才真正算”无人值守也能睡个安稳觉”。
说明:本文包含 AI 创作内容,请自行判断是否适用。文中包含的代码片段,切勿直接使用,需要根据实际情况修改。