从新手到专家:使用 MQL5 制作动画新闻标题(五) 事件提醒系统·进阶篇
◍ 事件预警的触发与推送逻辑
这段逻辑把财经事件按影响等级拆成 high / med / low 三个数组,分别遍历。阈值 threshold 由当前时间加 InpAlertMinutesBefore * 60 秒算出,也就是说若参数设 30,则事件时间前 30 分钟之内且未报警过的条目会进入提示分支。 每个分支先拼出形如「In 30m: EURUSD 利率决议」的 msg,调 Alert 弹终端窗,若开了 InpEnablePush 且对应等级推送开关为真,再走 SendNotification 发手机。标记 e.alerted = true 保证同一条事件只响一次,避免每分钟 OnTimer 重扫时刷屏。 OnTimer 里首行就是 CheckAndAlertEvents(),先于重载事件、拉新闻与 AI 洞察、重绘执行。外汇与贵金属事件驱动行情跳空频繁,这类提前预警只能提高准备概率,实际滑点与方向反转仍属高风险,参数间距建议拿历史日历回测后再定。
class="type">class="kw">datetime threshold = now + InpAlertMinutesBefore * class="num">60; class="type">class="kw">string msg; for(class="type">int i=class="num">0;i<ArraySize(highArr);i++) { CEvent *e=highArr[i]; if(!e.alerted && e.time<=threshold && InpAlertHigh) { msg = "In "+IntegerToString(InpAlertMinutesBefore)+"m: "+e.sym+" "+e.name; Alert(msg); if(InpEnablePush && InpPushHigh) SendNotification(msg); e.alerted = true; } } for(class="type">int i=class="num">0;i<ArraySize(medArr);i++) { CEvent *e=medArr[i]; if(!e.alerted && e.time<=threshold && InpAlertMed) { msg = "In "+IntegerToString(InpAlertMinutesBefore)+"m: "+e.sym+" "+e.name; Alert(msg); if(InpEnablePush && InpPushMed) SendNotification(msg); e.alerted = true; } } for(class="type">int i=class="num">0;i<ArraySize(lowArr);i++) { CEvent *e=lowArr[i]; if(!e.alerted && e.time<=threshold && InpAlertLow) { msg = "In "+IntegerToString(InpAlertMinutesBefore)+"m: "+e.sym+" "+e.name; Alert(msg); if(InpEnablePush && InpPushLow) SendNotification(msg); e.alerted = true; } } } class="type">void OnTimer() { CheckAndAlertEvents(); class=class="str">"cmt">// fire alerts and pushes first ReloadEvents(); FetchAlphaVantageNews(); FetchAIInsights(); DrawAll(); class=class="str">"cmt">// … remaining drawing and scrolling … }
预警集成后的延伸空间
把通知系统塞进 EA 之后,News Headline EA 从纯展示工具变成了能主动喊人的交易助手。它不下单,只做一件事:把即将发生的经济事件推到手机上。对实盘交易者来说,没人能全天盯图表等日历刷新,这种被动转主动的预警才是真有用。 推送通知接上后,EA 哪怕托管在远端 VPS,也能跟手机保持通信,移动端及时性直接拉满。外汇和贵金属受数据冲击大,这类预警能降低漏看风险事件的概率,但行情跳空和滑点风险依旧存在,不能当避险用。 原本以为这是最后一次迭代,做到这步反而露出新口子:把新闻事件和交易逻辑直接绑起来、做新闻驱动策略的仪表板,都是能继续挖的方向。每次发版都会冒出新想法,有机会就接着扩。
「把 EA 拆顺手的几条工程经验」
把用户能改的开关、阈值、API 键全堆在代码顶部,是降低维护成本最直接的办法。改策略不用翻逻辑层,扫一眼头部分组就能定位,尤其多人接手或隔周回来调参时不容易漏。 用 OnTimer 跑毫秒级周期任务,能在响应和 CPU 之间找平衡。比如每 500ms 拉一次数据、查预警、刷画布,比死循环 Tick 驱动更稳,MT5 实盘里掉帧和卡顿概率会明显下降。 Canvas 先画到屏幕外位图再 Update,能防闪烁。预警和通知放循环早期调用,因为它们非阻塞,不会卡住后面的重绘和解析——这点在外接 AI 接口时很关键,慢响应也不会冻图表。 事件对象里直接塞一个 alerted 标志,比外部弄个 map 记录哪些警报发过更轻。配合“分钟前”这类时间阈值做限速,既能压住重复提醒,也能控外部 API 调用频率,避免被新闻源或推理服务限流。 WebRequest 拿回的 JSON 用 StringFind 加截取就能抠出标题和见解字段,不用引第三方库。最后记住在 OnDeinit 销毁 Canvas、杀掉定时器、清动态内存,否则跑几天 MT5 就可能内存泄漏变卡,外汇和贵金属行情高波动下这风险更显形。
◍ 随包附带的三个文件
这套新闻标题 EA 的附件里共三个文件,各自职责切得很干净。News Headline EA.mq5 版本 1.07,体积 40.41 KB,把经济日历、Alpha Vantage 新闻拉进图表,再叠 RSI、Stoch、MACD、CCI 做指标分析,还带 AI 评论栏目和事件预警,可开推送通知。 download_model.py 仅 0.28 KB,用 Hugging Face Hub 客户端把量化 GGUF 模型下载到本地缓存,并打印路径,方便你确认模型落点。serve_insights.py 1.77 KB,是 FastAPI 应用,靠 llama-cpp 加载 GGUF,对外暴露 POST /insights 端点返回 AI 见解。 外汇与贵金属属高风险品类,本地跑这套组合前先在 MT5 策略测试器用 1.07 版 EA 回测一周新闻行情,确认事件预警延迟在你的网络环境下可控,再决定要不要接真仓。