您应该了解的MQL5向导技巧(第七十三部分):使用一目均衡表形态与ADX-Wilder形态·综合运用
(3/3)· 当云带碰上趋向指数,多数交易者只用到支撑阻力,却漏掉了趋势确认的那一半
基准线破位叠ADX方向过滤
形态6抓的是价格与一目均衡表基准线(Kijun-Sen)的交叉,并借 ADX 系族做趋势强度背书。多头侧要求收盘价自前一根低于基准线、当前根站上基准线,同时 +DI 大于 -DI 且 ADX 主线不低于 25;空头反之。该组合本质是中周期趋势信号,最适合已有明确方向的行情,震荡市容易反复打脸。 回测层面并不好看:前向步进(walk-forward)表现很差,只是比前一个被测形态稍微没那么糟。外汇与贵金属属高杠杆品种,这类信号直接实盘可能倾向连续磨损,须清醒看待。 可落地的修补思路有两条。一是顺更大周期云带方向做过滤,只在周/日线云层同侧才允许触发;二是把止损钉在基准线另一侧——多单丢在 Kijun 下方、空单压在 Kijun 上方,用结构位替资金设槛。 下面这段 MT5 逻辑可直接拷去验证。函数先判多:前根收在基准线下、本根收上,且 +DI 超 -DI、ADX≥25 返回 true;空侧镜像处理。注意 X() 是当前偏移索引,Close 与 Ichimoku_KijunSen 均按此取数。
class=class="str">"cmt">//+------------------------------------------------------------------+ class=class="str">"cmt">//| Check for Pattern class="num">6. | class=class="str">"cmt">//+------------------------------------------------------------------+ class="type">bool CSignalIchimoku_ADXWilder::IsPattern_6(class="type">ENUM_POSITION_TYPE T) { if(T == POSITION_TYPE_BUY && Close(X() + class="num">1) < Ichimoku_KijunSen(X() + class="num">1) && Close(X()) > Ichimoku_KijunSen(X()) && ADX_Plus(X()) > ADX_Minus(X()) && ADX(X()) >= class="num">25.0) { class="kw">return(true); } else if(T == POSITION_TYPE_SELL && Close(X() + class="num">1) > Ichimoku_KijunSen(X() + class="num">1) && Close(X()) < Ichimoku_KijunSen(X()) && ADX_Plus(X()) < ADX_Minus(X()) && ADX(X()) >= class="num">25.0) { class="kw">return(true); } class="kw">return(false); }
◍ 云带B线拐点配ADX的双向触发
形态7盯的是价格在先行下线B(Senkou Span B)附近的动作:多头侧,价格回踩B线不破并反弹,且ADX不低于20并上行,此时A线在B线之上,拐点落在云带内部;空头侧则反过来,B线当阻力,价格碰线回落,ADX≥20且上升时确认更强。这类信号本质是云带支撑/阻力叠加趋势过滤,适合趋势行情里的深度回调,不是横盘乱用的东西。 前向步进测试里,形态7跑赢前两个形态,一年期测试/优化后能交出整年盈利的前向步进结果,但空间还开着——比如接K线形态独立验证方向,止损可以卡紧:多单严格放在B线下方、空单严格放在B线上方。云带偏薄或ADX偏低时,这个形态失效概率高,应当避开。外汇和贵金属杠杆高,实盘前先在MT5用历史数据复跑参数。 下面这段MQL5把上述逻辑写成函数,直接可拷进EA里改。 //+------------------------------------------------------------------+ //| Check for Pattern 7. //+------------------------------------------------------------------+ bool CSignalIchimoku_ADXWilder::IsPattern_7(ENUM_POSITION_TYPE T) { if(T == POSITION_TYPE_BUY && Close(X() + 2) > Close(X() + 1) && Close(X() + 1) < Close(X()) && Close(X() + 2) > Ichimoku_SenkouSpanB(X() + 2) && Close(X()) > Ichimoku_SenkouSpanB(X()) && Close(X() + 1) <= Ichimoku_SenkouSpanB(X() + 1) && Ichimoku_SenkouSpanA(X()) > Ichimoku_SenkouSpanB(X()) && ADX(X()) >= 20.0 ) { return(true); } else if(T == POSITION_TYPE_SELL && Close(X() + 2) < Close(X() + 1) && Close(X() + 1) > Close(X()) && Close(X() + 2) < Ichimoku_SenkouSpanB(X() + 2) && Close(X()) < Ichimoku_SenkouSpanB(X()) && Close(X() + 1) >= Ichimoku_SenkouSpanB(X() + 1) && Ichimoku_SenkouSpanA(X()) < Ichimoku_SenkouSpanB(X()) && ADX(X()) >= 20.0 ) { return(true); } return(false); } 逐行看:函数接收持仓方向T;买侧要求两根前K线呈下探回拉(X+2>X+1且X+1<X),且X+1那根收盘踩到或低于B线、X和X+2都在B线之上,A线高于B线确认云带多头排列,ADX≥20;卖侧镜像处理,A线低于B线。都不满足就返回false,不触发。
<span class="comment">class=class="str">"cmt">//+------------------------------------------------------------------+</span> <span class="comment">class=class="str">"cmt">//| Check for Pattern class="num">7. \</span> <span class="comment">class=class="str">"cmt">//+------------------------------------------------------------------+</span> <span class="keyword">class="type">bool</span> CSignalIchimoku_ADXWilder::IsPattern_7(<span class="macro">class="type">ENUM_POSITION_TYPE</span> T) { <span class="keyword">if</span>(T == <span class="macro">POSITION_TYPE_BUY</span> && Close(X() + <span class="number">class="num">2</span>) > Close(X() + <span class="number">class="num">1</span>) && Close(X() + <span class="number">class="num">1</span>) < Close(X()) && Close(X() + <span class="number">class="num">2</span>) > Ichimoku_SenkouSpanB(X() + <span class="number">class="num">2</span>) && Close(X()) > Ichimoku_SenkouSpanB(X()) && Close(X() + <span class="number">class="num">1</span>) <= Ichimoku_SenkouSpanB(X() + <span class="number">class="num">1</span>) && Ichimoku_SenkouSpanA(X()) > Ichimoku_SenkouSpanB(X()) && ADX(X()) >= <span class="number">class="num">20.0</span> ) { <span class="keyword">class="kw">return</span>(<span class="macro">true</span>); } <span class="keyword">else</span> <span class="keyword">if</span>(T == <span class="macro">POSITION_TYPE_SELL</span> && Close(X() + <span class="number">class="num">2</span>) < Close(X() + <span class="number">class="num">1</span>) && Close(X() + <span class="number">class="num">1</span>) > Close(X()) && Close(X() + <span class="number">class="num">2</span>) < Ichimoku_SenkouSpanB(X() + <span class="number">class="num">2</span>) && Close(X()) < Ichimoku_SenkouSpanB(X()) && Close(X() + <span class="number">class="num">1</span>) >= Ichimoku_SenkouSpanB(X() + <span class="number">class="num">1</span>) && Ichimoku_SenkouSpanA(X()) < Ichimoku_SenkouSpanB(X()) && ADX(X()) >= <span class="number">class="num">20.0</span> ) { <span class="keyword">class="kw">return</span>(<span class="macro">true</span>); } <span class="keyword">class="kw">return</span>(<span class="macro">false</span>); }
「云带站位叠加ADX过滤的趋势跟信号」
把视角拉到日线或4小时这种偏宏观的周期,价格相对云带的位置本身就是一层趋势筛子。多头侧要求现价跑在云带上方,也就是先行上线A高于先行下线B,同时ADX主线不低于25,才算强趋势延续的可能入口;空头反过来,A低于B且ADX≥25。 这套逻辑本质上是个趋势跟踪信号,用ADX做强度确认,避免在震荡带里反复挨耳光。外汇和贵金属杠杆高,云带之上≠不会回踩洗盘,仓位上建议留足缓冲。 实测里编号形态8的前向步进表现明显好于回测,在有限训练样本下属于偏亮眼的一个,但样本周期短,结论只能当概率倾向。优化方向上,入场前可以再卡一道价格变动阈值确认方向,止损放在云带另一侧外面一点更稳妥。 下面这段MQL5是形态8的多空判定核心,注意它不只看A>B,还卡了两根K线的收盘关系: //+------------------------------------------------------------------+
| // | Check for Pattern 8. |
|---|
//+------------------------------------------------------------------+ bool CSignalIchimoku_ADXWilder::IsPattern_8(ENUM_POSITION_TYPE T) { if(T == POSITION_TYPE_BUY && Close(X() + 1) < Close(X()) && Close(X() + 1) > Ichimoku_SenkouSpanA(X() + 1) && Close(X()) > Ichimoku_SenkouSpanA(X()) && Ichimoku_SenkouSpanA(X()) > Ichimoku_SenkouSpanB(X()) && ADX(X()) >= 25.0 ) { return(true); } else if(T == POSITION_TYPE_SELL && Close(X() + 1) > Close(X()) && Close(X() + 1) < Ichimoku_SenkouSpanA(X() + 1) && Close(X()) < Ichimoku_SenkouSpanA(X()) && Ichimoku_SenkouSpanA(X()) > Ichimoku_SenkouSpanB(X()) && ADX(X()) >= 25.0 ) { return(true); } return(false); } 逐行拆一下:函数接收持仓方向T;买权分支里,前一根收盘低于当前收盘(短期回踩),但两根收盘都高于云带上线A,且A>B、ADX≥25,才返true。卖权分支对称,前根收盘高于当前、都低于A、A>B、ADX≥25。最后兜底返false。直接拷进你的信号类里,把X()换成实际偏移就能在MT5跑出来验。
class=class="str">"cmt">//+------------------------------------------------------------------+ class=class="str">"cmt">//| Check for Pattern class="num">8. | class=class="str">"cmt">//+------------------------------------------------------------------+ class="type">bool CSignalIchimoku_ADXWilder::IsPattern_8(class="type">ENUM_POSITION_TYPE T) { if(T == POSITION_TYPE_BUY && Close(X() + class="num">1) < Close(X()) && Close(X() + class="num">1) > Ichimoku_SenkouSpanA(X() + class="num">1) && Close(X()) > Ichimoku_SenkouSpanA(X()) && Ichimoku_SenkouSpanA(X()) > Ichimoku_SenkouSpanB(X()) && ADX(X()) >= class="num">25.0 ) { class="kw">return(true); } else if(T == POSITION_TYPE_SELL && Close(X() + class="num">1) > Close(X()) && Close(X() + class="num">1) < Ichimoku_SenkouSpanA(X() + class="num">1) && Close(X()) < Ichimoku_SenkouSpanA(X()) && Ichimoku_SenkouSpanA(X()) > Ichimoku_SenkouSpanB(X()) && ADX(X()) >= class="num">25.0 ) { class="kw">return(true); } class="kw">return(false); }
滞后线叠云带再卡一道 ADX 阈值
把滞后线(Chinkou Span)重新拉回来用,这次不是单看它和收盘价的相对位置,而是直接把它和先行上线 A(Senkou Span A)以及云带方向绑在一起判趋势。多头侧要求滞后线高于先行上线 A,且云带呈多头排列(A 在 B 上方),同时 ADX 不低于 25 才算强趋势确认;空头反过来,滞后线低于 A、A 在 B 下方、ADX 同样 ≥25。 这本质是个滞后确认信号,用来过滤掉那些云带还没转、ADX 软趴趴的假突破。它只在强势趋势里好使,横盘或震荡一用就容易被来回扫。 回测里形态 9 在前向步进阶段最终翻正盈利,但和形态 8、形态 4 比,净值曲线明显矮一截。可挖的优化点是拿其他一目均衡表形态做二次确认,比如等价格实体也站上云再进场。 止损别拍脑袋,按近期摆动高低点放就行;外汇和贵金属杠杆高,这类滞后信号踩错节奏回撤可能很大,云带方向和单子不对齐就别硬做。
class=class="str">"cmt">//+------------------------------------------------------------------+ class=class="str">"cmt">//| Check for Pattern class="num">9. | class=class="str">"cmt">//+------------------------------------------------------------------+ class="type">bool CSignalIchimoku_ADXWilder::IsPattern_9(class="type">ENUM_POSITION_TYPE T) { if(T == POSITION_TYPE_BUY && Ichimoku_ChinkouSpan(X() + class="num">26) > Ichimoku_SenkouSpanA(X()) && class=class="str">"cmt">//Ichimoku_ChinkouSpan(X() + class="num">26) > Close(X()) && Ichimoku_SenkouSpanA(X()) > Ichimoku_SenkouSpanB(X()) && ADX(X()) >= class="num">25.0 ) { class="kw">return(true); } else if(T == POSITION_TYPE_SELL && Ichimoku_ChinkouSpan(X() + class="num">26) < Ichimoku_SenkouSpanA(X()) && class=class="str">"cmt">//Ichimoku_ChinkouSpan(X() + class="num">26) < Close(X()) && Ichimoku_SenkouSpanA(X()) < Ichimoku_SenkouSpanB(X()) && ADX(X()) >= class="num">25.0 ) { class="kw">return(true); } class="kw">return(false); }
◍ 把这条线请下神坛
这套把一目均衡表配韦尔德ADX的思路,在两年有限样本里只筛出七种前向步进看起来有盈利可能的形态,说到底仍是探索性研究,不是可量产的结论。 测试周期短、样本薄,意味着任何「有潜力」都只是概率倾向,外汇与贵金属杠杆高、回撤凶,直接拿来跑实盘极易被噪声打脸。 随附的 WZ-73.mq5 与 SignalWZ_73.mqh 只是向导组装骨架,新手在MT5里拖进向导生成EA后,先开可视化回测看信号触发点再谈信任。 下一篇要去拆那三个前向拉胯的形态,看监督学习能不能救回来——这条线值得跟,但别供成圣物。