从新手到专家:使用 MQL5 制作动画新闻标题(一)·综合运用
📺

从新手到专家:使用 MQL5 制作动画新闻标题(一)·综合运用

(3/3)· 经济日历事件标题已能跑通,本篇补齐测试验证与端到端收束,让你直接拿去用

含代码示例实战向 第 3/3 篇
把工具箱里的新闻和日历硬塞进图表,很多人第一反应是拉宽面板,结果价格行为被挤没了。其实用 CCanvas 画一层透明投影,标题常驻还不挡 K 线。这篇收尾把整套链路跑完。

◍ 用 OnTimer 把财经画布钉在图表上

想在 MT5 图表上常驻一个不随价格滚动的财经事件层,核心不在 OnCalculate,而在 OnTimer 定时器。下面这段逻辑每 tick 触发一次,负责重定位两块画布(事件 EvCanvas 与新闻 NwCanvas)并自适应图表宽度。 rows 变量先按开关统计显示行数:ShowHigh、ShowMed、ShowLow 三个布尔各自命中就加 1,不显示就是 0。若 InpPositionTop 为真,两块画布都贴顶,NwCanvas 的纵向偏移是 InpTopOffset 加上 rows*lineH;否则贴底,NwCanvas 只比 EvCanvas 多挪一个 lineH。 宽度适配这段值得抄:用 ChartGetInteger(0, CHART_WIDTH_IN_PIXELS) 取当前图表像素宽,和上次记录的 canvW 比对,变了才重写 OBJPROP_WIDTH。避免每 tick 无谓调用 ObjectSetInteger,能少耗一点主线程。 ReloadEvents 每天重载一次事件数据,DrawAll 负责重绘。外汇与贵金属受财经事件冲击大、杠杆高风险极高,这类 overlay 只帮你看见日程,不预示波动方向。 退出时要干净。OnDeinit 里先 EventKillTimer 停表,再 Destroy 两个 Canvas 对象并 ObjectDelete 掉图元;三个数组 highArr / medArr / lowArr 用 for 循环逐个 delete,防止指标卸载后留下悬空指针或内存泄漏。

MQL5 / C++
class="type">void OnTimer()
{
   class=class="str">"cmt">// reposition every tick
   class="type">int rows = (ShowHigh?class="num">1:class="num">0)+(ShowMed?class="num">1:class="num">0)+(ShowLow?class="num">1:class="num">0);
   if(InpPositionTop)
   {
      SetCanvas("EvCanvas", true,  InpTopOffset);
      SetCanvas("NwCanvas", true,  InpTopOffset + rows*lineH);
   }
   else
   {
      SetCanvas("EvCanvas", class="kw">false, InpTopOffset);
      SetCanvas("NwCanvas", class="kw">false, InpTopOffset + lineH);
   }
   class=class="str">"cmt">// reload once per day
   ReloadEvents();
   class=class="str">"cmt">// adapt width
   class="type">int wNew = (class="type">int)ChartGetInteger(class="num">0,CHART_WIDTH_IN_PIXELS);
   if(wNew != canvW)
   {
      canvW = wNew;
      ObjectSetInteger(class="num">0,"EvCanvas",OBJPROP_WIDTH,canvW);
      ObjectSetInteger(class="num">0,"NwCanvas",OBJPROP_WIDTH,canvW);
   }
   class=class="str">"cmt">// redraw
   DrawAll();
}

class="type">void OnDeinit(const class="type">int reason)
{
   EventKillTimer();
   eventsCanvas.Destroy(); ObjectDelete(class="num">0,"EvCanvas");
   newsCanvas.Destroy();   ObjectDelete(class="num">0,"NwCanvas");
   for(class="type">int i=class="num">0;i<ArraySize(highArr);i++) class="kw">delete highArr[i];
   for(class="type">int i=class="num">0;i<ArraySize(medArr); i++) class="kw">delete medArr[i];
   for(class="type">int i=class="num">0;i<ArraySize(lowArr); i++) class="kw">delete lowArr[i];
}

「把新闻标题 EA 拖上图表的偏移与通道细节」

在 MT5 终端的 EA 交易栏里,把 “News Headline EA” 拖到任意图表即可完成挂载。默认情况下 EA 画布贴在图表顶部,垂直偏移 50 像素,这个数值不是随便定的——它刚好避开右侧的“市场深度”“交易面板”按钮以及右上角 EA 名称的显示区,避免视觉重叠。 如果你习惯把图表控件放别处,可以直接改这个偏移参数,把新闻画布挪到任意垂直位置,不影响任何行情渲染。EA 内部开了四个独立通道,每个通道都按主速优化,统一跑在 20 FPS 的帧率上,所以多条新闻同时刷新也不会卡顿掉帧。 即将公布的新闻事件会用不同颜色的矩形标出,颜色本身对应重要性分级,扫一眼就能区分高影响和低影响事件。实际部署后,EA 会以流畅动画持续滚动展示待发新闻,验证时只需看顶部画布是否按帧率稳定刷新即可。外汇与贵金属受新闻冲击剧烈,这类事件驱动波动属高风险场景,仅作盘面信息辅助、不构成方向预判。

把日历留在图表上

用 CCanvas 把经济日历直接画进图表,这条路线已经跑通:三通道滚动条加内联重要性框,速度各自可调,重大新闻带实时倒计时。读者可下 NewsTicker.mq5(21.47 KB)在 MT5 里加载,确认高影响事件是否如文所述清晰占位。 外汇与贵金属属高风险品类,重大数据前后几小时波动率常陡升;实盘前建议先在策略测试器观察滚动逻辑,再决定是否避让。 后续若接实时新闻 API,Canvas 这套渲染可平移到持仓面板或流动性热力,改动成本不高。

让小布替你盯事件窗口
这些诊断小布盯盘的 AIGC 已内置,打开对应品种页即可看到日历事件投影与异动提示,你只管判断方向。把重复劳动交给小布,你专注决策。

常见问题

若在 OnChartEvent 或 OnInit 里重建表面并缓存文本坐标,切换周期后重绘即可恢复,示例里用了定时器保活。
可以,小布的品种页已内置经济日历投影与滚动标题,逻辑和本篇 EA 一致,无需自己编译。
属正常概率现象,限频重绘到 200ms 以上可降闪烁;若仍卡顿倾向减少同时绘制的对象数。
需本地存一份过往事件 CSV 并改写取数接口,避免依赖实时 API,否则回溯时拿不到数据。