美元和欧元指数图表 MetaTrader 5 服务示例(基础篇)
◍ 在 MT5 里把美元欧元指数跑起来
MT5 自带的服务示例里有一份美元和欧元指数图表工程,作者 Artyom Trishkin 于 2025 年 5 月 23 日发布,截至统计显示被查看 784 次、评论 41 条,说明这类基础指数工具在实盘前哨里仍有稳定需求。 该示例的核心不是画两条线,而是把「货币指数计算函数文件」与「测试服务程序」拆开:前者负责按加权篮子的逻辑算指数值,后者负责在终端服务环境下定时刷新并推图。要做价格行为分析,先得有干净的指数基底,否则拿裸叉盘反推美元强弱会漏掉篮子权重偏差。 打开 MT5 的导航器→服务示例,加载这份工程后,重点看 Functions.mqh 里权重表写死的部分;外汇与贵金属杠杆高、报价断层多,指数若用错权重窗口,信号会倾向失真。先本地编译跑通,再谈调参。
美元指数与欧元指数的篮子构造
美元指数(USDX)1973 年 3 月推出,基准值锁在 100 点。读数为 90 即美元相对 1973 年贬值 10%,读 110 则升值 10%。它本质是美元对六大主要贸易伙伴货币的加权几何平均,权重按各国对美经济影响力分配,不是简单算术平均。 具体权重分布:欧元 57.6%、日元 13.6%、英镑 11.9%、加元 9.1%、瑞典克朗 4.2%、瑞郎 3.6%。1999 年欧元取代多国本币后,计算公式做过一次调整,但基准比率 50.14348112 仍使 1973 年代入结果恰好为 100.0。 欧元指数(EURX)2006 年 1 月 13 日上架 NYBOT,品种码 ECX/EURX/E。它跟踪欧元对五币种(美元、英镑、日元、瑞郎、瑞典克朗)的平均变化,贸易权重来自欧元区外贸实额:美国 31.55%、英国 30.56%、日本 18.91%、瑞士 11.13%、瑞典 7.85%。 下面两段公式可直接丢进 MT5 自定义指标里验证。USDX 用外币对美元的倒数次幂表达美元强弱;EURX 则全部为正向 EUR 交叉盘幂次,常数项 34.38805726 对应其 100 基准锚定。外汇与贵金属受此驱动波动剧烈,杠杆交易属高风险,权重仅是概率倾向而非方向保证。
USDX = class="num">50.14348112 * EURUSD^(-class="num">0.576) * USDJPY^(class="num">0.136) * GBPUSD^(-class="num">0.119) * USDCAD^(class="num">0.091) * USDSEK^(class="num">0.042) * USDCHF^(class="num">0.036) EURX = class="num">34.38805726 * EURUSD^(class="num">0.3155) * EURGBP^(class="num">0.3056) * EURJPY^(class="num">0.1891) * EURCHF^(class="num">0.1113) * EURSEK^(class="num">0.0785)
「用服务程序撑起合成图表」
要做的其实是一个能自己跑的后台服务:它按既定方程算出合成品种价格,并维护一张和常规品种几乎无差别的图表,指标、脚本、EA 都能直接往上挂。 核心是一个 Service 程序,不依赖任何已开图表,独立接收篮子内各品种的分时报价并刷新自定义品种历史。启动时先查市场报价里有没有目标合成品种,没有就建出来;随后补分钟与分时历史、开图表,之后每来一个新分时报价就重算价格写进历史。 终端重启后,若该服务此前设为随终端启动,它会自动拉起——也就是说只要配过一次,后面基本不用手动管。 本篇落地两个自定义品种:美元指数与欧元指数,各跑一个服务。两者共用一个包含文件,里面封装了建品种、补历史、刷报价的全部函数;服务本体只声明篮子规模、基准比率和权重表。想换货币集做自己的指数,改列表和权重调一个函数即可,MT5 里实测可行。
◍ 把货币指数算进自定义品种的工程落点
在 MT5 的 \MQL5\Services\ 下新建 Indexes\ 目录,放一个 CurrencyIndex.mqh 包含文件,所有指数计算函数都收在这里。先定义篮子结构:每个元素存交易品种名与权重,初始化后循环取用,任意品种配任意权重都能进篮子,这是后续灵活拼指数的基础。 历史和分时数据用 MqlRates、MqlTick 数组承载,每个结构带一个数据索引。关键点在于:算某根柱的指数时,篮子内每个品种都得有该分钟柱数据;若某品种此分钟无报价形成柱隙,索引要回退到前一根有数据的柱。因为篮子品种数量运行前未知,不能在程序里写死索引数组长度,所以用结构体内嵌索引来动态处理。 服务启动顺序很固定:先 CustomSymbolInitialize() 查重并建自定义品种,没开图表就补开;再 PrepareRates() 合成一个月 M1 历史。PrepareRates 先把各品种数据对齐到同一开始时间,缺数据的品种指向前一根近邻柱,随后逐柱算合成序列写进自定义品种历史。单根柱的四个价格由 CalculateRate() 调 GetRateValue() 按篮子公式得出,最后 CheckRate() 拦截正/负无穷、NaN 和 ≤0 的非法值,返回 false 即作废该柱。 外汇与贵金属属高风险品种,自定义指数仅作参考,实盘使用前建议在策略测试器跑一遍验证数据完整性。
class=class="str">"cmt">//+------------------------------------------------------------------+ class=class="str">"cmt">//| CurrencyIndex.mqh | class=class="str">"cmt">//| Copyright class="num">2000-class="num">2024, MetaQuotes Ltd. | class=class="str">"cmt">//| [MQL5官方文档] | class=class="str">"cmt">//+------------------------------------------------------------------+ class="macro">#class="kw">property copyright "Copyright class="num">2000-class="num">2024, MetaQuotes Ltd." class="macro">#class="kw">property link "[MQL5官方文档] class="macro">#define SECONDS_IN_DAY(class="num">24*class="num">60*class="num">60) class=class="str">"cmt">// number of seconds in a day