交易货币篮子时可用的形态。第三部分·进阶篇
(2/3)·当WPR套在篮子指数上疯狂触顶,你才意识到平均法只是近似解
「把 WPR 重映射成对称震荡量」
下面这段函数把经典 WPR(Williams Percent Range)做了一次平移缩放,输出区间从原来的 [-100,0] 变成围绕 0 对称的双倍振幅量,方便和均线类指标叠加比较。 代码先取窗口内最高价 HH 与最低价 LL,再用 -100*(HH-arr[index])/(HH-LL) 算出原始 WPR。注意这里 arr 传入的应是最高价数组,index 为当前偏移,period 为回看长度。 最后一步 (m+50)*2 把中点从 -50 抬到 0,振幅拉满到 ±100,并用 NormalizeDouble 按 _Digits 截断。实盘里把 digit 参数直接喂 _Digits,能避免黄金 3 位报价和外汇 5 位报价下的精度错位。 在 MT5 里新建一个 iCustom 或脚本,把这段直接贴进 GetMA,周期取 14 时,你可以观察到价格在日线波段顶底处,该值常触及 +90 / -90 极值,可作为反转概率的辅助参考,但外汇与贵金属杠杆高,极值区假突破频发,仅作过滤用。
class="type">class="kw">double GetMA(class="kw">const class="type">class="kw">double& arr[], class="type">int index , class="type">int period, class="type">int digit) { class="type">class="kw">double m = class="num">0; HH = arr[ArrayMaximum(arr, index, period)]; LL = arr[ArrayMinimum(arr, index, period)]; m = -class="num">100 * (HH - arr[index]) / (HH - LL); class="kw">return (NormalizeDouble((m + class="num">50) * class="num">2, _Digits)); }
◍ 把篮子指数画成蜡烛条的技术代价
想让货币篮子指数像普通品种那样以日式蜡烛呈现,核心是先拿到开盘与收盘两组序列,而不是只算一条收盘价折线。测试指标原本用当前周期蜡烛收盘价算篮子值,若把同周期开盘价也喂进去,用完全一样的算法就能得到蜡烛实体的开、收两个关键数。 但高低价没法用同样套路。对篮子里的每个货币对取最低价、最高价再做平均或几何平均,得到的数值并不能对应篮子蜡烛真正的低和高——因为各货币对的极值很少在同一根K线内同时出现,这种错位无法提前量化误差。外汇与贵金属市场波动剧烈,用这种近似画法风险自担。 若要较准确的保真高低,只能基于即时报价或至少分钟级数据重算,终端负载会明显加重,通常应丢给独立EA而非指标。本文暂不采用该方案,因此以WPR为内核、依赖OHLC四数组的组合指标不适用此绘制法;其余不依赖高低数组的指标类型仍值得后续展开。
把图形工具搬上货币篮子指数图
货币篮子指数本质就是一张价格图,所以支撑阻力、通道、斐波那契这些常规画线工具直接能往上套。我在美元和欧元两个篮子指数(index.zip 组合指标)上各放了标准图形:欧元图用了斐波那契+上升通道+水平线,美元图用了楔形+水平线,再用矩形和竖线标出关键节点看 EURUSD 反应。 实测里,欧元指数从通道上轨叠加斐波那契位回落,同时美元只是微跌,按这个组合预期 EURUSD 往空头走,确实发生了。另一处欧元再从通道上轨回滚,预期继续空,但美元指数贴着楔形上轨横盘略带多头,结果没走出空段,是窄幅震荡。 到第2点之后欧元通道下破,配合美元在第5点从楔形下轨弹起,主图 EURUSD 出现明确的空向逻辑移动;第7点欧元水平位回撤碰上美元楔形突破,开头欧元回滚猛、价格空进,但楔形突破‘压过’了它,走势翻多。 这组单对单剧情不能当真理,换时间帧和货币对长期盯才有统计意义。但能确认:常见图形结构在篮子指数组合图上能用,且形态服从老规则——信号要互认,且比直接看价格图更钝、更有惯性。 这类形态是次要的。找入场点或设止损时做辅助还行,别拿来当主干。另一个角度:欧元指数不只挂钩 EURUSD,还连着篮里其它欧系对。取 2015.09.18 00:00 这个通道上轨回滚点,把欧元篮所有货币对拉出来看,蓝竖线标记处大多数对走势印证了预判。 若用这个偏弱信号直接入场,EURAUD、EURGBP 和轻微 EURUSD 可能扫损,其余欧系对倾向获利——正好印证篮子一次性全开、以多数盈利覆盖少数亏损的原则。外汇与贵金属为高波动品种,上述均为概率性现象,需自行在 MT5 回测验证。
「用篮子差值指标抓趋势背离」
想确认前面关于欧元篮子形态的结论, 可以自己写个轻量指标: 把一条快均线和一条慢均线做差, 画在独立窗口里, 逻辑跟 MACD 类似, 但数据源不是单一货币对, 而是欧元对 7 个主要对手货币的指数数组。 指标源里快线周期默认 12、慢线 26, 输出缓冲区用直方图呈现两线差值。把欧元指数喂进去后, 在价格图画出下降阻力线的那段, 指标柱体却开始抬升——这种背离倾向提示下跌动能走弱, 趋势逆转的概率在上升。 需要留意, 外汇和贵金属杠杆高、跳空频繁, 这类背离只是预警而非确定性信号。把它用在独立货币对上要谨慎, 但套在整体篮子指数上, 我们更有底气相信形态的有效性。 其他货币对同期走势若同步印证, 那段背离的可信度会进一步提高。打开 MT5 把下面代码存成 testIndexMACD.mq5 拖上欧元指数图, 调一下 InpFastEMA / InpSlowEMA 就能复刻观察。
class=class="str">"cmt">//+------------------------------------------------------------------+ class=class="str">"cmt">//| testIndexMACD.mq5 | class=class="str">"cmt">//| class="num">2016 MetaQuotes Software Corp. | class=class="str">"cmt">//| [MQL5官方文档] | class=class="str">"cmt">//+------------------------------------------------------------------+ class="macro">#class="kw">property copyright "版权所有 class="num">2016, MetaQuotes Software Corp." class="macro">#class="kw">property link "[MQL5官方文档] class="macro">#class="kw">property version "class="num">1.00" class="macro">#class="kw">property indicator_separate_window class="macro">#class="kw">property indicator_buffers class="num">2 class="macro">#class="kw">property indicator_plots class="num">1 class="kw">input class="type">color clr = clrBlue; class="kw">input class="type">int InpFastEMA = class="num">12; class=class="str">"cmt">// 快速 EMA 周期 class="kw">input class="type">int InpSlowEMA = class="num">26; class=class="str">"cmt">// 慢速 EMA 周期 class="type">class="kw">double ind[],ma[]; class=class="str">"cmt">//+------------------------------------------------------------------+ class=class="str">"cmt">//| 自定义指标初始化函数 | class=class="str">"cmt">//+------------------------------------------------------------------+ class=class="str">"cmt">//class="type">int h,h1; class="type">int OnInit() { class=class="str">"cmt">//--- 指标缓存区映射 ArraySetAsSeries(ind,true); SetIndexBuffer(class="num">0,ind); IndicatorSetString(INDICATOR_SHORTNAME,"testIndexMACD"); IndicatorSetInteger(INDICATOR_DIGITS,class="num">2); PlotIndexSetInteger(class="num">0,PLOT_DRAW_TYPE,DRAW_HISTOGRAMclass=class="str">"cmt">/*DRAW_LINE*/); PlotIndexSetInteger(class="num">0,PLOT_LINE_STYLE,STYLE_SOLID); PlotIndexSetInteger(class="num">0,PLOT_LINE_WIDTH,class="num">2); PlotIndexSetInteger(class="num">0,PLOT_LINE_COLOR,clr); PlotIndexSetString(class="num">0,PLOT_LABEL,"_tstMACD_"); ArraySetAsSeries(ma,true); SetIndexBuffer(class="num">1,ma , INDICATOR_CALCULATIONS); class=class="str">"cmt">//--- class="kw">return(INIT_SUCCEEDED); } class="type">class="kw">string pair[]={"EURUSD","EURJPY","EURCHF","EURGBP","EURNZD","EURCAD","EURAUD"}; class="type">bool bDirect[]={true,true,true,true,true,true,true}; class="type">int iCount=class="num">7;