期货量化告警太吵怎么控频:天勤 TqNotify 与业务信号分级
前言
国内期货量化策略上线后,程序 7×24 跑在服务器:天勤TqApi主循环里wait_update()推进,每根 5 分钟 K 线收盘可能算出「螺纹钢均线金叉」这类交易信号,有人把信号原文直接推到钉钉群;同时柜台还可能回报断线、拒单、成交。若全部即时推送,群消息一分钟几十条「金叉/死叉」,真正重要的「行情停更半小时」「连续资金不足拒单」反而被淹没。
天勤在tqsdk.lib提供TqNotify:在wait_update循环里用get_notifies()批量取服务器侧通知,适合接连接、柜台类事件。业务交易信号、风控触发则应走自建结构化日志,再按级别限频分流。下面说明怎么拆通道、怎么设冷却时间,让手机只响该响的。
一、TqNotify 做什么
fromtqsdkimportTqApi,TqAuth,TqKq,TqNotify api=TqApi(account=TqKq(),auth=TqAuth("账户","密码"))notify=TqNotify(api)whileTrue:api.wait_update()forninnotify.get_notifies():handle_server_notify(n)# 按 n 的内容分类get_notifies()返回自上次调用以来新增的通知列表,无新通知则[]。适合接柜台、连接类事件,不适合每根 K 线都发。
二、三级分流建议
| 级别 | 内容 | 通道 | 限频 |
|---|---|---|---|
| L0 静默 | 常规信号、心跳 | 仅写文件 | 无上限 |
| L1 日报 | 成交汇总、日终权益 | 邮件/群摘要 | 日 1 次 |
| L2 即时 | 断线、连续拒单、emergency | 钉钉/短信 | 同类型 5 分钟 1 条 |
业务信号(target 变化)记 jsonl,默认不推送。只有emergency或risk_ratio超阈值才升 L2。
三、限频实现示意
importtime _last_alert={}defalert_l2(key,msg,cooldown=300):now=time.time()ifnow-_last_alert.get(key,0)<cooldown:return_last_alert[key]=now send_dingtalk(msg)对TqNotify解析出的同类断线通知也用key="disconnect"限频,避免重连抖动连发。
四、与手写监控的关系
夜盘监控专题里的quote.datetimestale、volume_left僵死等,应汇总成 L2,而不是每个 symbol 单独轰炸。成交可用 L0 记全量,L1 只发日累计。
五、测试环境隔离
mode=sim的 webhook 指向测试群;配置从环境变量读,避免模拟盘告警进生产群(与日志脱敏同一习惯)。
六、业务信号该记什么但不推送
建议在 jsonl 里记:event=signal、bar_datetime、symbol、target、pos、reason,默认不调用钉钉。只有event=emergency或risk_ratio超阈值才升 L2。均线金叉一天可能十几次,推送毫无意义;连续三次last_msg含资金不足则必须推送。
七、夜盘值守摘要模板
L1 日终一条 Markdown 摘要即可:
- 当日
balance起止 - 成交笔数、手续费
- 拒单次数 Top3
last_msg - 断线次数
由定时任务在夜盘结束触发,不打扰白天。
八、TqNotify 与自建监控的组合
TqNotify偏柜台与连接;quote.datetimestale、volume_left僵死等需自建规则。两者都走handle_notify,用不同key限频,避免双通道重复发同一件事。
总结
告警太吵,是因为把研究信号和运维事件混在一个通道里。天勤TqNotify负责收服务器通知,适合断线、柜台类事件;均线信号等应写结构化日志并默认静默。给 L2 即时告警加同类冷却时间,日终再用 L1 摘要成交与权益,手机才不会在夜盘被无效消息占满。
FAQ
1)TqNotify 和 get_trade 区别?
Notify 是服务端通知流;成交以get_trade为准。
2)能否过滤 notify 内容?
在handle_server_notify里按字段丢弃无关项。
3)信号要不要推送?
看团队习惯;默认建议只记日志。
4)Webhook 怎么接?
在alert_l2里用requests.post调钉钉机器人即可,URL 放环境变量,勿写进仓库。
本文基于天勤 TqSdk 公开 API 整理,不构成投资建议。
