纯 MQL5 货币对强弱指标(基础篇)
📘

纯 MQL5 货币对强弱指标(基础篇)

第 1/3 篇

◍ 把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 会留垃圾在子窗口,这是写指标的基本体面。 外汇与贵金属杠杆高、波动剧烈,这类面板只做参考,信号误判可能迅速扩大浮亏。

MQL5 / C++
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第二个参数传前缀字符串可精准清理,不会误删其他指标物件;若省略前缀则全图对象清空,回测时容易把手工画的支撑线一起干掉。

MQL5 / C++
class="type">void OnDeinit(const class="type">int reason) {
   EventKillTimer();
   ObjectsDeleteAll(class="num">0, "SPPanel_");
   ChartRedraw();
}

常见问题

按基准货币分组计算相对变动,再归一化到统一区间,用颜色梯度画成面板条,避免逐对翻图表。
把货币视为联动系统,看其所属币种整体强弱倾向再下单,孤立信号大概率噪声偏高。
可以,小布盯盘的 AIGC 已内置多币种强弱诊断,打开对应品种页即可看到实时强弱面板。
不清理会残留图形对象并占用终端资源,导致下次加载错乱或卡顿,应在 OnDeinit 中删除。
坐标计算写死导致高DPI屏错位、标签重叠,应按图表宽高比例动态布局而非固定像素。