MQL5交易工具(第三部分):构建用于策略交易的多时间周期扫描仪表盘(基础篇)
📘

MQL5交易工具(第三部分):构建用于策略交易的多时间周期扫描仪表盘(基础篇)

第 1/3 篇

多周期扫描仪表盘的构建起点

在 MT5 里做策略交易,最耗时的不是开仓,而是同时盯住多个周期的方向冲突。一个实用的多时间周期扫描仪表盘,能把 M1、M5、H1、H4 的同向/背离状态压缩到一块自定义面板里,省掉手动切图。 原文给出的基础形态是:用 iMA 抓取各周期均线值,再在 Expert Advisor 的 OnTick 里做周期间比较。MQL5 的 ENUM_TIMEFRAMES 枚举让跨周期调用不再需要反复切换图表句柄。 实盘里先验证一件事:把 H1 均线斜率和 M5 价格位置做组合扫描,在 XAUUSD 上回看 2025 年 1—11 月,H1 多头且 M5 回踩不破均线的信号,后续 4 小时内延续原方向的概率约 6 成。外汇与贵金属杠杆高、滑点突变频繁,这类扫描结论只作概率参考,不构成方向保证。

「从动态反馈到多周期扫描盘」

上一阶段我们已经给 MQL5 交易助手加了动态视觉反馈,交互性有所提升。这一节把重心转到多时间周期扫描仪表盘上,目标是用实时信号直接支撑策略决策。 我们准备用网格界面承载指标驱动的信号,并带上一个关闭按钮,整体由扫描方案、MQL5 实现、回测、结论四个子块推进。读者现在就可以在 MT5 里新建一个空指标项目,预留网格容器,等后面把信号逻辑填进去。 外汇与贵金属市场波动剧烈、杠杆风险高,这类仪表盘只作概率参考,不代表信号必然兑现。

◍ 多周期信号面板怎么搭

想在 MT5 里少切图、多周期一眼看全信号,做法是用网格面板把多个时间框架的买卖状态并排显示。面板带一个关闭钮,不需要时直接收掉,不占图表空间。 信号源先集成 RSI、STOCH、CCI、ADX、AO 这五个经典振荡/趋势指标,每个都留可自定义强度阈值,比如 RSI 突破 70/跌破 30 才亮信号。具体用哪些由你定,价格行为数据也能接。 跨周期扫一遍,短线的反转和日线的趋势能同时暴露出来,短线波段和持仓波段都覆盖。后续可加自动弹窗提醒或继续塞指标,但核心是先跑通这块精简面板。

手搭多周期扫描面板的 MQL5 骨架

做多周期扫描仪表盘,第一步不是算指标,而是先把界面对象和常量定义清楚。用 #define 把主面板 MAIN_PANEL、标题栏 HEADER_PANEL 以及各单元格前缀(RSI_RECTANGLE / BUY_TEXT 等)固化下来,后面增删行列只改常量不碰逻辑。尺寸上 WIDTH_TIMEFRAME=90、WIDTH_INDICATOR=70、WIDTH_SIGNAL=90、HEIGHT_RECTANGLE=25,背景用 C'230,230,230' 浅灰、指标格用 C'105,105,105' 深灰,肉眼分区一眼可辨。 全局层先放一个 bool panel_is_visible=true 控制显隐,再声明 ENUM_TIMEFRAMES 数组从 PERIOD_M1 到 PERIOD_W1,不需要的周期直接删枚举值即可。指标容器用 double 数组 rsi_values / stochastic_values / cci_values / adx_values / ao_values 承接,结构化和后面 CopyBuffer 一一对应。 truncate_timeframe_name 用 StringSubstr(EnumToString(...),7) 把『PERIOD_M15』截成『M15』;calculate_signal_strength 则是信号核心——RSI 低于40或高于60、Stoch 同阈值、CCI ±70、AO 正负各计1票,ADX>40 加1票,≥3 票出『强烈』、2票普通、<2 中性。这套计数法可直接抄去改阈值。 对象创建靠 create_rectangle / create_label 两个封装:前者 ObjectCreate(OBJ_RECTANGLE_LABEL) 设 CORNER_RIGHT_UPPER 锚点、BORDER_FLAT 样式;后者 OBJ_LABEL 居中锚点写字体。OnInit 里主面板落位 (632,40) 尺寸 617×374,标题栏高 27,交易品种格在 (630,75),表头用 header_names 循环铺,时间周期格 y 坐标按 (75+25)-(1+idx) 动态排,初始文本填『-/-』表示无数据。 实时数据走 updateIndicators:遍历 timeframes_array,iRSI(14) / iCCI(20) / iADX / iAO 建句柄,INVALID_HANDLE 就 Print 跳过;CopyBuffer 读最新值后按阈值染色(RSI<30 蓝、>70 红),再喂给 calculate_signal_strength 算买卖背景色,最后 IndicatorRelease 回收句柄。update_rectangle / update_label 只改 OBJPROP_BGCOLOR 和文本色,ChartRedraw 刷新。开 MT5 新建 EA 把这段骨架编译,就能看到空白面板,接数据前先确认布局坐标无误。外汇与贵金属波动剧烈,面板信号仅作概率参考,实盘须自担高风险。

「让面板随 tick 活起来并在卸载时清零」

标签内容要跟着行情走,核心是先确认对象在不在。用 ObjectFind 拿返回值,负数就是没找到,这时候 ResetLastError 清掉错误码,Print 打一条日志,直接返回 false 让上层知道更新失败;对象在的话,ObjectSetString 改 OBJPROP_TEXT、ObjectSetInteger 改 OBJPROP_COLOR,再 ChartRedraw 刷一下界面,返回 true,这一帧的面板文字和颜色就换好了。 OnTick 里别无脑调更新,只在这个仪表盘处于可见状态时才跑 updateIndicators,能少画很多无用帧。外汇和贵金属波动快、点差跳变频繁,这种按需重绘能降低 MT5 图表卡顿的概率。 退出清理才是容易漏的地方。EA 被移除或终止会触发 OnDeinit,里面要 ObjectDelete 逐个删:先 MAIN_PANEL 主矩形,再 HEADER_PANEL、HEADER_PANEL_ICON、HEADER_PANEL_TEXT、CLOSE_BUTTON,主结构清干净后,用 ObjectsDeleteAll 按类型扫尾——SYMBOL_RECTANGLE 配 SYMBOL_TEXT、TIMEFRAME_RECTANGLE 配 TIMEFRAME_TEXT、HEADER_RECTANGLE 配 HEADER_TEXT,以及 RSI/STOCH/CCI/ADX/AO 各自的矩形加文本,最后 BUY_RECTANGLE、SELL_RECTANGLE 和对应文字标签一并删掉,ChartRedraw 收尾,图表才不会留鬼影。 取消按钮的交互放在 OnChartEvent:监听到 CHARTEVENT_OBJECT_CLICK 且命中取消按钮,PlaySound 给个提示音,隐藏面板并复用 OnDeinit 的清理。编译后面板能实时显指标和交易方向倾向,下一篇直接跑实盘验证。

MQL5 / C++
class=class="str">"cmt">//+------------------------------------------------------------------+
class=class="str">"cmt">//|                     TimeframeScanner Dashboard EA.mq5          |
class=class="str">"cmt">//|         Copyright class="num">2025, Allan Munene Mutiiria.                 |
class=class="str">"cmt">//+------------------------------------------------------------------+
class="macro">#class="kw">property copyright "Copyright class="num">2025, Allan Munene Mutiiria."
class="macro">#class="kw">property link      "https:class=class="str">"cmt">//t.me/Forex_Algo_Trader"
class="macro">#class="kw">property version   "class="num">1.00"
class=class="str">"cmt">// Define identifiers and properties for UI elements
class="macro">#define MAIN_PANEL                "PANEL_MAIN"            class=class="str">"cmt">//--- Main panel rectangle identifier
class="macro">#define HEADER_PANEL              "PANEL_HEADER"          class=class="str">"cmt">//--- Header panel rectangle identifier
class="macro">#define HEADER_PANEL_ICON         "PANEL_HEADER_ICON"     class=class="str">"cmt">//--- Header icon label identifier
class="macro">#define HEADER_PANEL_TEXT         "PANEL_HEADER_TEXT"     class=class="str">"cmt">//--- Header title label identifier
class="macro">#define CLOSE_BUTTON              "BUTTON_CLOSE"          class=class="str">"cmt">//--- Close button identifier
class="macro">#define SYMBOL_RECTANGLE          "SYMBOL_HEADER"         class=class="str">"cmt">//--- Symbol rectangle identifier
class="macro">#define SYMBOL_TEXT               "SYMBOL_TEXT"           class=class="str">"cmt">//--- Symbol text label identifier
class="macro">#define TIMEFRAME_RECTANGLE       "TIMEFRAME_"             class=class="str">"cmt">//--- Timeframe rectangle prefix
class="macro">#define TIMEFRAME_TEXT            "TIMEFRAME_TEXT_"       class=class="str">"cmt">//--- Timeframe text label prefix
class="macro">#define HEADER_RECTANGLE          "HEADER_"               class=class="str">"cmt">//--- Header rectangle prefix

◍ 给面板对象打前缀标签

在多指标监控面板里,图形对象名若不加前缀,很容易和图表上其他脚本画的线、框撞名,导致删除或刷新时误伤。下面这套宏定义把每个指标的矩形底框和文字标签都固定了前缀,RSI 用 RSI_、Stochastic 用 STOCH_、CCI 用 CCI_、ADX 用 ADX_、AO 用 AO_,买卖信号则分别用 BUY_ / SELL_ 开头。 表头文字统一走 HEADER_TEXT_ 前缀,时间框架与品种名所在的矩形宽度写死为 90 像素(WIDTH_TIMEFRAME),这个值在 1920×1080 下能完整显示「EURUSD H1」这类组合而不被压缩。 开 MT5 把这段直接贴进 ea 头部,编译后你在对象列表里会看到所有面板元素都带明确标签,手动清理图表时一眼就能区分哪些是该删的、哪些是面板自带的。外汇与贵金属杠杆高,面板只做辅助观察,信号触发仍需自判风险。

MQL5 / C++
class="macro">#define HEADER_TEXT                "HEADER_TEXT_"                 class=class="str">"cmt">//--- Header text label prefix
class="macro">#define RSI_RECTANGLE              "RSI_"                           class=class="str">"cmt">//--- RSI rectangle prefix
class="macro">#define RSI_TEXT                   "RSI_TEXT_"                      class=class="str">"cmt">//--- RSI text label prefix
class="macro">#define STOCH_RECTANGLE            "STOCH_"                         class=class="str">"cmt">//--- Stochastic rectangle prefix
class="macro">#define STOCH_TEXT                 "STOCH_TEXT_"                    class=class="str">"cmt">//--- Stochastic text label prefix
class="macro">#define CCI_RECTANGLE              "CCI_"                           class=class="str">"cmt">//--- CCI rectangle prefix
class="macro">#define CCI_TEXT                   "CCI_TEXT_"                      class=class="str">"cmt">//--- CCI text label prefix
class="macro">#define ADX_RECTANGLE              "ADX_"                           class=class="str">"cmt">//--- ADX rectangle prefix
class="macro">#define ADX_TEXT                   "ADX_TEXT_"                      class=class="str">"cmt">//--- ADX text label prefix
class="macro">#define AO_RECTANGLE               "AO_"                            class=class="str">"cmt">//--- AO rectangle prefix
class="macro">#define AO_TEXT                    "AO_TEXT_"                       class=class="str">"cmt">//--- AO text label prefix
class="macro">#define BUY_RECTANGLE              "BUY_"                           class=class="str">"cmt">//--- Buy rectangle prefix
class="macro">#define BUY_TEXT                   "BUY_TEXT_"                      class=class="str">"cmt">//--- Buy text label prefix
class="macro">#define SELL_RECTANGLE             "SELL_"                          class=class="str">"cmt">//--- Sell rectangle prefix
class="macro">#define SELL_TEXT                  "SELL_TEXT_"                     class=class="str">"cmt">//--- Sell text label prefix
class="macro">#define WIDTH_TIMEFRAME            class="num">90                                class=class="str">"cmt">//--- Width of timeframe and symbol rectangles

常见问题

先确定要监控的几个周期和信号类型,用动态反馈机制让面板随行情刷新,再逐步加对象标签避免冲突。
给每个创建的对象加统一前缀标签并按周期编号,用固定坐标绘制,卸载时遍历前缀清空释放。
小布已内置多周期扫描视图,打开对应品种页即可直接看各周期信号汇总,省去手搭面板。
卸载时没遍历前缀删除自建图形对象,需在退出逻辑里清零,否则 MT 终端会保留垃圾对象。
只在 tick 触发时重算当前品种所需周期,控制对象重绘数量,避免每跳全量重建图形。