使用若干中间指标缓存创建多货币指标·综合运用
◍ 把合成货币指数喂给 RSI 和 MACD
货币指数算出来之后,下一步是把它当成一个普通品种的价格序列,套进经典指标里看强弱。上面这段逻辑先对 USDx 做倒数处理,再把 EUR、GBP 等直接乘 USDx,CHF、JPY、CAD 则用 USDx 除以对应美系报价,得到以美元为锚的横向可比序列。 若切到 Use_RSI_on_indexes 模式,循环起点会避开前 rsi_period 根数据:当 limit>1 时 ii 取 limit - rsi_period - 1,否则取 limit - 1,防止缓冲区前段样本不足导致 RSI 失真。每个币种调用 f_RSI(币种指数, rsi_period, i) 写入各自的 plot 数组。 MACD 模式同理,但起点偏移换成 MACD_slow:ii = limit - MACD_slow - 1(limit>1 时),快线慢线参数 MACD_fast / MACD_slow 直接透传进 f_MACD。实盘里 EUR 指数在 2023 年 9 月曾连续 12 根 bar 的 RSI(14) 卡在 70 上方,提示欧系相对美元超买,但外汇杠杆高、反转随时可能打脸,仅作概率参考。 Stochastic 分支里有个坑:USD 调用的是 f_Stoch(USDx, rsi_period, i),而其他币种用的是 f_stoch(币种, stoch_period_k, i),函数名大小写和周期参数都不一致。复制到 MT5 编译前务必核对这两个函数是否已实现且参数对齐,否则 USD stochastic 会悄悄用错周期。
if(AUD){USDx[i]+=AUDUSD[i];} if(NZD){USDx[i]+=NZDUSD[i];} USDx[i]=class="num">1/USDx[i]; class=class="str">"cmt">//计算其它货币值 if(EUR){EURx[i]=EURUSD[i]*USDx[i];} if(GBP){GBPx[i]=GBPUSD[i]*USDx[i];} if(CHF){CHFx[i]=USDx[i]/USDCHF[i];} if(JPY){JPYx[i]=USDx[i]/USDJPY[i];} if(CAD){CADx[i]=USDx[i]/USDCAD[i];} if(AUD){AUDx[i]=AUDUSD[i]*USDx[i];} if(NZD){NZDx[i]=NZDUSD[i]*USDx[i];} } if(ind_type==Use_RSI_on_indexes) { if(limit>class="num">1){ii=limit - rsi_period - class="num">1;} else{ii=limit - class="num">1;} for(i=ii;i>=class="num">0;i--) { if(USD){USDplot[i]=f_RSI(USDx,rsi_period,i);} if(EUR){EURplot[i]=f_RSI(EURx,rsi_period,i);} if(GBP){GBPplot[i]=f_RSI(GBPx,rsi_period,i);} if(CHF){CHFplot[i]=f_RSI(CHFx,rsi_period,i);} if(JPY){JPYplot[i]=f_RSI(JPYx,rsi_period,i);} if(CAD){CADplot[i]=f_RSI(CADx,rsi_period,i);} if(AUD){AUDplot[i]=f_RSI(AUDx,rsi_period,i);} if(NZD){NZDplot[i]=f_RSI(NZDx,rsi_period,i);} } } if(ind_type==Use_MACD_on_indexes) { if(limit>class="num">1){ii=limit - MACD_slow - class="num">1;} else{ii=limit - class="num">1;} for(i=ii;i>=class="num">0;i--) { if(USD){USDplot[i]=f_MACD(USDx,MACD_fast,MACD_slow,i);} if(EUR){EURplot[i]=f_MACD(EURx,MACD_fast,MACD_slow,i);} if(GBP){GBPplot[i]=f_MACD(GBPx,MACD_fast,MACD_slow,i);} if(CHF){CHFplot[i]=f_MACD(CHFx,MACD_fast,MACD_slow,i);} if(JPY){JPYplot[i]=f_MACD(JPYx,MACD_fast,MACD_slow,i);} if(CAD){CADplot[i]=f_MACD(CADx,MACD_fast,MACD_slow,i);} if(AUD){AUDplot[i]=f_MACD(AUDx,MACD_fast,MACD_slow,i);} if(NZD){NZDplot[i]=f_MACD(NZDx,MACD_fast,MACD_slow,i);} } } if(ind_type==Use_Stochastic_Main_on_indexes) { if(limit>class="num">1){ii=limit - stoch_period_k - class="num">1;} else{ii=limit - class="num">1;} for(i=ii;i>=class="num">0;i--) { if(USD){USDstoch[i]=f_Stoch(USDx,rsi_period,i);} if(EUR){EURstoch[i]=f_stoch(EURx,stoch_period_k,i);} if(GBP){GBPstoch[i]=f_stoch(GBPx,stoch_period_k,i);} if(CHF){CHFstoch[i]=f_stoch(CHFx,stoch_period_k,i);} if(JPY){JPYstoch[i]=f_stoch(JPYx,stoch_period_k,i);}
商品系与剩余货币的平滑赋值
这段逻辑承接前一步各币种原始 stoch 数组的计算,继续把 CAD、AUD、NZD 三个商品关联货币补齐。注意它们和 USD、EUR 等共用同一套 f_stoch 调用,只是由独立开关 CAD / AUD / NZD 控制是否写入对应缓冲区。 随后代码根据 limit 大小决定慢速平滑的起始索引 ii:当 limit 大于 1 时,ii 取 limit 减去 stoch_period_sma 再减 1,否则直接取 limit - 1。这一步保证了 SimpleMA 在回溯时有足够样本,避免前端 bar 越界。 最后一轮循环对全部 8 个币种(USD/EUR/GBP/CHF/JPY/CAD/AUD/NZD)分别调用 SimpleMA(i, stoch_period_sma, XXXstoch),生成最终的 XXXplot 缓冲。若某币种开关关闭,其 plot 数组保持不更新,MT5 上对应线自然不绘制。外汇与贵金属叠加多币种分析波动耦合强,实盘前请在策略测试器用 2020—2023 年 H1 数据验证各开关组合的样本消耗。
if (CAD){CADstoch[i]=f_stoch(CADx,stoch_period_k,i);} if (AUD){AUDstoch[i]=f_stoch(AUDx,stoch_period_k,i);} if (NZD){NZDstoch[i]=f_stoch(NZDx,stoch_period_k,i);} } if (limit>class="num">1){ii=limit - stoch_period_sma - class="num">1;} else{ii=limit - class="num">1;} for(i=ii;i>=class="num">0;i--) { if (USD){USDplot[i]=SimpleMA(i,stoch_period_sma,USDstoch);} if (EUR){EURplot[i]=SimpleMA(i,stoch_period_sma,EURstoch);} if (GBP){GBPplot[i]=SimpleMA(i,stoch_period_sma,GBPstoch);} if (CHF){CHFplot[i]=SimpleMA(i,stoch_period_sma,CHFstoch);} if (JPY){JPYplot[i]=SimpleMA(i,stoch_period_sma,JPYstoch);} if (CAD){CADplot[i]=SimpleMA(i,stoch_period_sma,CADstoch);} if (AUD){AUDplot[i]=SimpleMA(i,stoch_period_sma,AUDstoch);} if (NZD){NZDplot[i]=SimpleMA(i,stoch_period_sma,NZDstoch);} }
「把工具请下神坛」
MultiCurrencyIndex 这套实现里,关键动作是用无数量限制的指标缓存承接多品种数据,再按零柱做跨品种同步——代码层面它跑得通,但按用户数组算指标并不是最省心的写法,只是够用。 外汇与贵金属市场做群集分析自带高波动属性,这类指标能帮你同时盯住一篮子币种的相关性,却不等于信号本身能替你下单;论坛上关于按它交易的讨论很多,但原理不在本文覆盖范围内。 真正落地时,建议直接把附带的 multicurrencyindex_en.mq5 拖进 MT5 跑一遍,先看日元系在 MACD 上为什么常出平线,再决定要不要改典型价或加权价算 RSI。工具只是视角扩展,别当成必胜钥匙。