您应该了解的MQL5向导技巧(第七十三部分):使用一目均衡表形态与ADX-Wilder形态·综合运用
🌥️

您应该了解的MQL5向导技巧(第七十三部分):使用一目均衡表形态与ADX-Wilder形态·综合运用

(3/3)· 当云带碰上趋向指数,多数交易者只用到支撑阻力,却漏掉了趋势确认的那一半

实战向 第 3/3 篇
把一目均衡表当成纯支撑阻力画线工具,是EA信号噪声偏高的主要原因之一。叠加ADX-Wilder做趋势确认,能把假突破过滤掉一大半。本篇把两指标组合成10种可索引形态,直接喂给向导生成的EA。

基准线破位叠ADX方向过滤

形态6抓的是价格与一目均衡表基准线(Kijun-Sen)的交叉,并借 ADX 系族做趋势强度背书。多头侧要求收盘价自前一根低于基准线、当前根站上基准线,同时 +DI 大于 -DI 且 ADX 主线不低于 25;空头反之。该组合本质是中周期趋势信号,最适合已有明确方向的行情,震荡市容易反复打脸。 回测层面并不好看:前向步进(walk-forward)表现很差,只是比前一个被测形态稍微没那么糟。外汇与贵金属属高杠杆品种,这类信号直接实盘可能倾向连续磨损,须清醒看待。 可落地的修补思路有两条。一是顺更大周期云带方向做过滤,只在周/日线云层同侧才允许触发;二是把止损钉在基准线另一侧——多单丢在 Kijun 下方、空单压在 Kijun 上方,用结构位替资金设槛。 下面这段 MT5 逻辑可直接拷去验证。函数先判多:前根收在基准线下、本根收上,且 +DI 超 -DI、ADX≥25 返回 true;空侧镜像处理。注意 X() 是当前偏移索引,Close 与 Ichimoku_KijunSen 均按此取数。

MQL5 / C++
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,不触发。

MQL5 / C++
<span class="comment">class=class="str">"cmt">//+------------------------------------------------------------------+</span>
<span class="comment">class=class="str">"cmt">//| Check for Pattern class="num">7.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \</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)
{&nbsp;&nbsp;<span class="keyword">if</span>(T == <span class="macro">POSITION_TYPE_BUY</span> &amp;&amp; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Close(X() + <span class="number">class="num">2</span>) &gt; Close(X() + <span class="number">class="num">1</span>) &amp;&amp; Close(X() + <span class="number">class="num">1</span>) &lt; Close(X()) &amp;&amp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Close(X() + <span class="number">class="num">2</span>) &gt; Ichimoku_SenkouSpanB(X() + <span class="number">class="num">2</span>) &amp;&amp; Close(X()) &gt; Ichimoku_SenkouSpanB(X()) &amp;&amp; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Close(X() + <span class="number">class="num">1</span>) &lt;= Ichimoku_SenkouSpanB(X() + <span class="number">class="num">1</span>) &amp;&amp; Ichimoku_SenkouSpanA(X()) &gt; Ichimoku_SenkouSpanB(X()) &amp;&amp; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ADX(X()) &gt;= <span class="number">class="num">20.0</span>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)
&nbsp;&nbsp; {&nbsp;&nbsp;<span class="keyword">class="kw">return</span>(<span class="macro">true</span>);
&nbsp;&nbsp; }
&nbsp;&nbsp; <span class="keyword">else</span> <span class="keyword">if</span>(T == <span class="macro">POSITION_TYPE_SELL</span> &amp;&amp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Close(X() + <span class="number">class="num">2</span>) &lt; Close(X() + <span class="number">class="num">1</span>) &amp;&amp; Close(X() + <span class="number">class="num">1</span>) &gt; Close(X()) &amp;&amp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Close(X() + <span class="number">class="num">2</span>) &lt; Ichimoku_SenkouSpanB(X() + <span class="number">class="num">2</span>) &amp;&amp; Close(X()) &lt; Ichimoku_SenkouSpanB(X()) &amp;&amp; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Close(X() + <span class="number">class="num">1</span>) &gt;= Ichimoku_SenkouSpanB(X() + <span class="number">class="num">1</span>) &amp;&amp; Ichimoku_SenkouSpanA(X()) &lt; Ichimoku_SenkouSpanB(X()) &amp;&amp; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ADX(X()) &gt;= <span class="number">class="num">20.0</span>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)
&nbsp;&nbsp; {&nbsp;&nbsp;<span class="keyword">class="kw">return</span>(<span class="macro">true</span>);
&nbsp;&nbsp; }
&nbsp;&nbsp; <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跑出来验。

MQL5 / C++
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 比,净值曲线明显矮一截。可挖的优化点是拿其他一目均衡表形态做二次确认,比如等价格实体也站上云再进场。 止损别拍脑袋,按近期摆动高低点放就行;外汇和贵金属杠杆高,这类滞后信号踩错节奏回撤可能很大,云带方向和单子不对齐就别硬做。

MQL5 / C++
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后,先开可视化回测看信号触发点再谈信任。 下一篇要去拆那三个前向拉胯的形态,看监督学习能不能救回来——这条线值得跟,但别供成圣物。

让小布替你跑这套形态回测
这10种形态的参数映射与年度窗口回测设置,小布盯盘的AIGC已内置模板,打开对应外汇或贵金属品种页即可一键套用,你只管看哪几个索引在样本里没互相抵消。

常见问题

厚度可作参考,但容易滞后;配合ADX-Wilder的DI差和ADX值,对趋势强度的判断会更同步,也更适合短窗口EA。
代表多种形态组合启用,例如6是索引1加索引2。但多形态同开在一年测试窗内常互相抵消信号,实盘前建议拆开单测。
贵金属跳空频繁,B线遇阻形态假信号概率偏高,需ADX高于阈值且DI开口放大才倾向有效,仍属高风险品类。
可以,品种页的AIGC模块支持输入0到1023的PatternsUsed值,自动列出启用的形态索引并标注年度回测胜率分布。
滞后线本质是对已发生位置的回溯确认,单独用滞后大,需先有云带和基准线结构打底,再叠ADX才不容易误判。