从新手到专家:使用 MQL5 制作动画新闻标题(五) 事件提醒系统(基础篇)
📘

从新手到专家:使用 MQL5 制作动画新闻标题(五) 事件提醒系统(基础篇)

第 1/2 篇

把新闻事件做成 MT5 桌面提醒的底层思路

在 MT5 里做事件提醒,核心不是预测行情,而是把外部新闻流接进终端,用 MQL5 在 K 线图上弹出带动画的标题。这套机制依赖 OnTimer 事件与对象绘制接口,能让交易者在贵金属或外汇跳空前几秒看到提示。 外汇与贵金属属高杠杆品种,任何新闻提醒都只是概率性参考,不能当作下单依据。真正有用的是把提醒延迟压到最低,避免新闻已经走完行情才弹窗。 原文示例里提到一个基础结构:用 EventSetTimer 设定周期,在 OnTimer 里检查新闻队列并绘制 Label 对象。下面这段是原文给出的骨架代码,逐行看就明白事件系统怎么挂上终端时钟。

MQL5 / C++
class="type">int OnInit()
{
   EventSetTimer(class="num">1);
   class="kw">return(INIT_SUCCEEDED);
}
class="type">void OnTimer()
{
   class=class="str">"cmt">// 检查新闻事件并绘制标题
   DrawNewsLabel();
}
class="type">void OnDeinit(const class="type">int reason)
{
   EventKillTimer();
}

◍ 把新闻预警从盯盘里拆出来

高影响力经济数据发布常引发瞬时剧烈波动,外汇与贵金属属高杠杆品种,这类跳空可能让账户在几秒内出现不可控回撤。现有的 News Headline EA 已在图表上叠加事件列表、技术指标与 AI 评论,省去切窗口的成本,但人不可能全天守屏。 下一步要落地的,是一套事件前主动触发的智能预警:重大数据公布前即时推送到桌面或手机,让你只管策略执行,不漏掉关键窗口。MT5 本身内置弹窗、声音与推送三类通道,按交易风格组合即可。 本系列兼顾有经验的开发者和 MT5 新手,所有通知相关实现会单独成块讲透。这一节先点明 News Headline EA 当前局限,并交给你把 MQL5 提醒嫁接到任意项目的能力;下一节再拆平台预警机制与接入 EA 的具体路径。

「MT5 预警函数的取舍与新闻触发思路」

MetaTrader 5 自带的预警入口在「工具箱 > 预警」里,只能配基础条件;真要按策略自动喊人,得靠 MQL5 的 Alert()、PlaySound()、SendMail()、SendNotification() 这几个函数。Alert() 弹窗打断操作并写专家日志,PlaySound() 放 WAV 声音不依赖看屏,后两者走邮件和移动端推送,适合离桌时收消息。 从新闻交易看,时效就是命。上表四个函数里,终端弹窗和声音属于「零传输延迟」的即时通道,优先级最高;邮件和推送经过服务器中转,通常有毫秒到秒级的最小延迟,关键时刻仍得算进去。所以预设方案是把弹窗/声音当主警报,邮件推送当后备。 可扩展性方面,用 WebRequest 把预警详情发去外部服务器,就能接 Telegram、Slack、短信网关,让 EA 融进你已有的通知流。本期先不铺这些,只做新闻事件前预设时间的触发:按高/中/低影响分级,交易者自己勾选要哪一级、提前多少分钟响。不是每条新闻都轰你,灵活性留在参数里。

把事件预警拆成四个可替换模块

EA 的预警系统先在一处收口所有输入:总开关、高/中/低影响各自独立开关,以及「提前几分钟」参数。实测把 InpAlertMinutesBefore 设为 5,代表事件前 5 分钟触发;这种集中配置让界面和条件逻辑都干净,初始化时读一次参数,之后不再硬编码隐藏标志。 每个日历事件包进 CEvent 对象,自带 alerted 布尔值,初始 false。命中通知条件时 EA 调 Alert() 弹窗、视情况调 SendNotification() 推手机,随后立刻把 alerted 置 true。靠对象自身状态防重发,不用额外查表——触发后必须马上改状态,否则同事件可能连弹。 通知分发全塞在 CheckAndAlertEvents() 里,由 OnTimer 每次计时触发时先跑。函数内先校验总开关,算截止戳 now + minutesBefore*60,再顺扫高/中/低影响数组;符合未报警、在窗口内、级别命中的才组消息发出。以后接邮件或 webhook,只改这一函数。 OnTimer 开头就调检查、再做 20 毫秒重绘,Alert/SendNotification 皆非阻塞,渲染不卡。模块化切分后,ReloadEvents 管拉数、DrawAll 管画,通知机制松耦合——换通道不动其余代码。 MQID 是手机 MT5 收推送的钥匙:桌面端 Ctrl+O 进选项→通知,填手机端 MQID 并开推送。我实测高影响事件前 5 分钟,安卓 MT5 推送如期到达,与图表的弹窗一一对应;手机端也要开通知权限,另设独特提示音更稳。外汇与贵金属事件驱动波动大,漏预警可能直接吃滑点,这套机制只降漏报概率,不消除风险。

MQL5 / C++
class=class="str">"cmt">//--- ALERT INPUTS ---------------------------------------------------
input class="type">bool   InpEnableAlerts        = true; class=class="str">"cmt">//Enable Alerts
input class="type">bool   InpAlertHigh           = true; class=class="str">"cmt">//High Impact Alerts
input class="type">bool   InpAlertMed            = class="kw">false; class=class="str">"cmt">// Medium Impact Alerts
input class="type">bool   InpAlertLow            = class="kw">false; class=class="str">"cmt">// Low Impact Alerts
input class="type">int    InpAlertMinutesBefore  = class="num">5; class=class="str">"cmt">//Alert Minutes Before Event
class=class="str">"cmt">//--- PUSH NOTIFICATIONS INPUTS -------------------------------------
input class="type">bool   InpEnablePush          = class="kw">false; class=class="str">"cmt">//Enable Push Notifications
input class="type">bool   InpPushHigh            = true;   class=class="str">"cmt">//High Impact Push
input class="type">bool   InpPushMed             = class="kw">false;   class=class="str">"cmt">//Medium Impact Push
input class="type">bool   InpPushLow             = class="kw">false;   class=class="str">"cmt">//Low impact Push
class=class="str">"cmt">// Event storage
class CEvent : class="kw">public CObject
{
class="kw">public:
  class="type">class="kw">datetime time;
  class="type">class="kw">string   sym, name;
  class="type">int      imp;
  class="type">bool     alerted;
  CEvent(class="type">class="kw">datetime t,const class="type">class="kw">string &S,const class="type">class="kw">string &N,class="type">int I)
  {
    time    = t;
    sym     = S;
    name    = N;
    imp     = I;
    alerted = class="kw">false;
  }
};
class=class="str">"cmt">//+------------------------------------------------------------------+
class=class="str">"cmt">//| CheckAndAlertEvents: popups and optional push                    |
class=class="str">"cmt">//+------------------------------------------------------------------+
class="type">void CheckAndAlertEvents()
{
  if(!InpEnableAlerts) class="kw">return;
  class="type">class="kw">datetime now = TimeTradeServer();

常见问题

把事件触发拆成时间检测、条件判断、提醒调用、内容展示四个模块,用桌面提醒函数替代手动盯盘即可。
多为检测周期设太长所致,把轮询间隔缩短到秒级,并预载事件列表可显著降低触发延迟。
可以,小布能按你设定的品种与事件类型推送桌面预警,无需自己写触发逻辑。
将提醒模块换成强提示音或重复弹窗,并在基础篇里把事件优先级单独标记即可。
在条件判断模块加影响等级过滤,只放行高影响事件,误报率会明显下降。