MQL5交易工具(第三部分):构建用于策略交易的多时间周期扫描仪表盘(基础篇)
多周期扫描仪表盘的构建起点
在 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 的清理。编译后面板能实时显指标和交易方向倾向,下一篇直接跑实盘验证。
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 头部,编译后你在对象列表里会看到所有面板元素都带明确标签,手动清理图表时一眼就能区分哪些是该删的、哪些是面板自带的。外汇与贵金属杠杆高,面板只做辅助观察,信号触发仍需自判风险。
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