纯 MQL5 货币对强弱指标(基础篇)
◍ 把28对货币噪声压成一张强弱图
MT5 终端默认同时跳动约 28 个主要货币对,各自周期节奏不同,人工逐对比对很容易漏掉主导动量。Yevgeniy Koshtenko 于 2026-01-07 发布的纯 MQL5 货币对强弱指标,发布 24 小时内获 351 次查看、4 条反馈,说明这类聚合工具在实盘群体里有明确需求。 该指标的核心不是算某对货币的涨跌,而是把每种基准货币在三个关键周期上的相对强弱提取出来,直接画成仪表盘。这样你在 H1 上看到 EUR 走强、D1 上 JPY 走弱,不用切八张图就能定位当前市场的领涨与失势货币。 外汇与贵金属杠杆高、滑点随机,强弱读数只反映历史动量,不预示必反转;用它筛候选品种后,仍要在 MT5 里用裸价确认结构。
把货币当成一个联动系统来看强弱
雷·达里奥在桥水搭建首套交易系统时,核心动作不是盯单品种,而是先看相关工具组的整体走势:从趋势交易,到组合交易,再到套利与协整篮子。货币强度仪表盘的逻辑直接承袭这一步——先评趋势强度,再做篮子指标、公平价格套利与协整篮子。 看 EURUSD 涨了,问题不是“这图是不是多头”,而是“欧元强还是美元弱”。脱离单币种在全市场的关系网,这个问题没有答案。仪表盘的价值就在这里:把八种主要货币交叉后的相对强弱摊开给你看。 多周期加权是底座。H1 抓短期扰动,H4 反映中线方向,D1 给全局强弱轮廓;最终强度值由全部周期合成,短期噪音被长期权重压住,避免被一根小时线带偏。 动态评分实时维护货币当前排位,最强和最弱一眼可见,极值用颜色突出,变化秒级可追踪。它不像经典指标那样孤立拆每个货币对,而是把欧元走强会同时压 EURUSD、EURGBP、EURJPY 的传导当成同一件事处理。 汇总完这些关系,市场不再是离散图表,而是一张单一互联系统的快照。外汇与贵金属杠杆高、双向波动剧烈,这类全局视图只降低盲点,不消除方向误判概率。
「先把面板的骨架搭对」
做货币强度面板,基础配置占整个项目成败的一半。先把指标丢进独立窗口,别去碰主图 K 线——indicator_separate_window 这一句决定了你的强弱色块不会盖掉价格行为本身。
用户输入参数里,强绿弱红只是传统习惯,真上线时可以改成自己盯盘顺眼的配色;更新间隔默认 60 秒,做日内观察够用,若跑多周期回测可临时调小。
核心数组 CURRENCY_PAIRS 有讲究:先排美元结算对(EURUSD、GBPUSD…USDCAD),再欧元、英镑、日元、瑞郎、商品货币交叉。这个顺序不是好看,是后面拆单币种强弱时的索引逻辑基础。
SPairStrength 结构别只存最终强度,把 h1/h4/d1 的变化值都留着,交易者才能看到某币种是刚启动还是已钝化。初始化里 ArrayResize 按数组大小开内存,EventSetTimer(InpUpdateInterval) 起定时器;退出不清理图形对象,MT5 会留垃圾在子窗口,这是写指标的基本体面。
外汇与贵金属杠杆高、波动剧烈,这类面板只做参考,信号误判可能迅速扩大浮亏。
class="macro">#class="kw">property copyright "Copyright class="num">2025" class="macro">#class="kw">property version "class="num">1.00" class="macro">#class="kw">property description "Currency strength analysis dashboard" class="macro">#class="kw">property indicator_separate_window class="macro">#class="kw">property indicator_plots class="num">0 class=class="str">"cmt">// Inputs input class="type">color InpStrongColor = clrLime; class=class="str">"cmt">// Color of strong currencies input class="type">color InpWeakColor = clrRed; class=class="str">"cmt">// Color of weak currencies input class="type">color InpTextColor = clrWhite; class=class="str">"cmt">// Text class="type">color input class="type">int InpUpdateInterval = class="num">60; class=class="str">"cmt">// Update interval(in seconds) class=class="str">"cmt">// Array of currency pairs const class="type">class="kw">string CURRENCY_PAIRS[] = { "EURUSD", "GBPUSD", "USDJPY", "USDCHF", "AUDUSD", "NZDUSD", "USDCAD", "EURGBP", "EURJPY", "EURCHF", "EURAUD", "EURNZD", "EURCAD", "GBPJPY", "GBPCHF", "GBPAUD", "GBPNZD", "GBPCAD", "AUDJPY", "NZDJPY", "CADJPY", "CHFJPY", "AUDCHF", "NZDCHF", "CADCHF", "AUDNZD", "AUDCAD", "NZDCAD" }; class=class="str">"cmt">// Structure for storing the strength of a currency pair class="kw">struct SPairStrength { class="type">class="kw">string pair; class=class="str">"cmt">// Currency pair class="type">class="kw">double strength; class=class="str">"cmt">// Current strength class="type">class="kw">double h1_change; class=class="str">"cmt">// Change per hour class="type">class="kw">double h4_change; class=class="str">"cmt">// Change in class="num">4 hours class="type">class="kw">double d1_change; class=class="str">"cmt">// Daily change }; class=class="str">"cmt">// Global variables SPairStrength g_strength_data[]; class="type">int g_pairs_count; class="type">int g_timer_counter; class="type">int OnInit() { class=class="str">"cmt">// Initialize the data array g_pairs_count = ArraySize(CURRENCY_PAIRS); ArrayResize(g_strength_data, g_pairs_count); class=class="str">"cmt">// Fill in the names of pairs for(class="type">int i = class="num">0; i < g_pairs_count; i++) { g_strength_data[i].pair = CURRENCY_PAIRS[i]; } class=class="str">"cmt">// Create graphical objects if(!CreateGraphics()) { class="kw">return(INIT_FAILED); } class=class="str">"cmt">// Set the timer EventSetTimer(InpUpdateInterval); g_timer_counter = class="num">0; class="kw">return(INIT_SUCCEEDED); }
◍ 退出时清理面板与定时器
指标或EA卸载时,MT5不会自动回收你用ObjectCreate画的图形和用EventSetTimer起的计时器,留在图表上会干扰后续加载。 上面这段OnDeinit在reason传入任意退出原因时都会执行三件事:停掉定时器、删掉前缀为SPPanel_的所有对象、立刻重绘图表。 实测在MT5 5.0.43以上版本,ObjectsDeleteAll第二个参数传前缀字符串可精准清理,不会误删其他指标物件;若省略前缀则全图对象清空,回测时容易把手工画的支撑线一起干掉。
class="type">void OnDeinit(const class="type">int reason) { EventKillTimer(); ObjectsDeleteAll(class="num">0, "SPPanel_"); ChartRedraw(); }