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

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

第 2/3 篇

◍ 转换线破基准线配ADX阈值的多空判定

一目均衡表里,转换线(Tenkan-sen)自下向上穿越基准线(Kijun-sen)且收在其上,是短期动量转多的早期信号;反向下穿收下方则转空。光看交叉容易在横盘里吃假突破,所以叠加 ADX 强度过滤:只在 ADX(X()) >= 20.0 时才认信号,把弱势交叉挡掉。 这段 MQL5 判断函数把逻辑写死了,可直接抄进 EA 做初筛: //+------------------------------------------------------------------+

//Check for Pattern 1.

//+------------------------------------------------------------------+ bool CSignalIchimoku_ADXWilder::IsPattern_1(ENUM_POSITION_TYPE T) { if(T == POSITION_TYPE_BUY && Ichimoku_TenkanSen(X() + 1) < Ichimoku_KijunSen(X() + 1) && Ichimoku_TenkanSen(X()) > Ichimoku_KijunSen(X()) && ADX(X()) >= 20.0) { return(true); } else if(T == POSITION_TYPE_SELL && Ichimoku_TenkanSen(X() + 1) > Ichimoku_KijunSen(X() + 1) && Ichimoku_TenkanSen(X()) < Ichimoku_KijunSen(X()) && ADX(X()) >= 20.0) { return(true); } return(false); } 逐行拆:函数接收持仓方向 T;买权条件是「上一根转换线低于基准线、当前根反超」且 ADX 不低于 20;卖权对称;不满足一律返 false。X() 是当前柱索引,+1 即前一根。 单独跑这套形态,前向步进报告明显不佳——大概率止盈过紧且没设止损。多单止损放在基准线下方、空单放上方,是顺着结构的安全带;再把交易方向对齐更高周期趋势,配合成交量异动确认,信号可靠性可能提升。外汇和贵金属杠杆高,横盘里这信号失效概率大,只在趋势启动或分型转折处用才划算。

MQL5 / C++
class=class="str">"cmt">//+------------------------------------------------------------------+
class=class="str">"cmt">//| Check for Pattern class="num">1.                                              |
class=class="str">"cmt">//+------------------------------------------------------------------+
class="type">bool CSignalIchimoku_ADXWilder::IsPattern_1(class="type">ENUM_POSITION_TYPE T)
{  if(T == POSITION_TYPE_BUY && Ichimoku_TenkanSen(X() + class="num">1) < Ichimoku_KijunSen(X() + class="num">1) && Ichimoku_TenkanSen(X()) > Ichimoku_KijunSen(X()) && ADX(X()) >= class="num">20.0)
   {  class="kw">return(true);
   }
   else if(T == POSITION_TYPE_SELL && Ichimoku_TenkanSen(X() + class="num">1) > Ichimoku_KijunSen(X() + class="num">1) && Ichimoku_TenkanSen(X()) < Ichimoku_KijunSen(X()) && ADX(X()) >= class="num">20.0)
   {  class="kw">return(true);
   }
   class="kw">return(false);
}

「云带A/B交叉配ADX 25的进出逻辑」

形态2的触发点很直接:先行上线A向上穿过先行下线B、看涨云带成形,且ADX不低于25,才视为有效多头信号;反向下穿并收在B下方,则是空头云带转换,常作为趋势反转或辅助确认。该组合在一年前向步进样本里表现稳健,但样本量有限,外汇与贵金属杠杆高、回撤凶,实盘前务必自己跑独立回测。 云带偏薄时噪声大,应回避该形态;若切到更高周期确认交叉,信号可靠性倾向提升。多单止损放在云带下沿、空单放云带上沿,是用结构本身兜底风险。 下面这段MQL5把上述规则写成函数,买条件看前一根A<B且当前A>B,卖条件镜像处理,两边都要ADX>=25.0: //+------------------------------------------------------------------+

//Check for Pattern 2.

//+------------------------------------------------------------------+ bool CSignalIchimoku_ADXWilder::IsPattern_2(ENUM_POSITION_TYPE T) { if(T == POSITION_TYPE_BUY && Ichimoku_SenkouSpanA(X() + 1) < Ichimoku_SenkouSpanB(X() + 1) && Ichimoku_SenkouSpanA(X()) > Ichimoku_SenkouSpanB(X()) && ADX(X()) >= 25.0) { return(true); } else if(T == POSITION_TYPE_SELL && Ichimoku_SenkouSpanA(X() + 1) > Ichimoku_SenkouSpanB(X() + 1) && Ichimoku_SenkouSpanA(X()) < Ichimoku_SenkouSpanB(X()) && ADX(X()) >= 25.0) { return(true); } return(false); } 逐行拆一下:Ichimoku_SenkouSpanA(X()+1)取前一根K线的先行A,< SpanB说明上一根还是空头云;当前根> SpanB即刚完成上穿。ADX(X())>=25.0是过滤弱势震荡的硬门槛。卖分支把大小号反过来,逻辑对称。函数只返回布尔,真正的下单与止损距离要由调用层按云带厚度计算。

MQL5 / C++
class=class="str">"cmt">//+------------------------------------------------------------------+
class=class="str">"cmt">//| Check for Pattern class="num">2.                                              |
class=class="str">"cmt">//+------------------------------------------------------------------+
class="type">bool CSignalIchimoku_ADXWilder::IsPattern_2(class="type">ENUM_POSITION_TYPE T)
{  if(T == POSITION_TYPE_BUY && Ichimoku_SenkouSpanA(X() + class="num">1) < Ichimoku_SenkouSpanB(X() + class="num">1) && Ichimoku_SenkouSpanA(X()) > Ichimoku_SenkouSpanB(X()) && ADX(X()) >= class="num">25.0)
   {  class="kw">return(true);
   }
   else if(T == POSITION_TYPE_SELL && Ichimoku_SenkouSpanA(X() + class="num">1) > Ichimoku_SenkouSpanB(X() + class="num">1) && Ichimoku_SenkouSpanA(X()) < Ichimoku_SenkouSpanB(X()) && ADX(X()) >= class="num">25.0)
   {  class="kw">return(true);
   }
   class="kw">return(false);
}

云边碰线后的方向过滤

在一目均衡表里,云带上下沿(先行Span A/B)本身就是动态支撑阻力。价格回踩Span A不破并反向,是区间转趋势常见的拐点征兆,但裸价格容易假突破,所以得用ADX和DI做方向确认。 多头触发要求:最近三根K线呈下探后收回,且收在Span A上方,同时ADX≥25、+DI>-DI;空头反之,价格反抽Span A不过并跌回其下,-DI>+DI且ADX≥25。代码里用X()+2、+1、当前根表达「探—碰—收」的三段结构,Close与Ichimoku_SenkouSpanA的交叉关系就是碰线判定。 这形态和前一篇的过滤型信号相似,前向步进测试同样跑出稳定盈利,但外汇与贵金属波动跳空多,云带边界在A/B错位时厚度会变,实盘误报概率不低。 建议叠加针形线或吞没K线确认云边反应,止损放在Span B略外即可;DI强弱必须和价格回头方向同边,否则过滤失效。 别把正态当圣经 回测稳不代表 live 也稳,MT5 里把ADX周期从14改成7,Span A碰线信号频率会明显上升,自己跑一遍看成交分布再决定用不用。

MQL5 / C++
class=class="str">"cmt">//+------------------------------------------------------------------+
class=class="str">"cmt">//| Check for Pattern class="num">3.                                                        |
class=class="str">"cmt">//+------------------------------------------------------------------+
class="type">bool CSignalIchimoku_ADXWilder::IsPattern_3(class="type">ENUM_POSITION_TYPE T)
{  if(T == POSITION_TYPE_BUY && 
      Close(X() + class="num">2) > Close(X() + class="num">1) && Close(X() + class="num">1) < Close(X()) &&
      Close(X() + class="num">2) > Ichimoku_SenkouSpanA(X() + class="num">2) && Close(X()) > Ichimoku_SenkouSpanA(X()) && 
      Close(X() + class="num">1) <= Ichimoku_SenkouSpanA(X() + class="num">1) && 
      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">2) < Close(X() + class="num">1) && Close(X() + class="num">1) > Close(X()) &&
      Close(X() + class="num">2) < Ichimoku_SenkouSpanA(X() + class="num">2) && Close(X()) < Ichimoku_SenkouSpanA(X()) && 
      Close(X() + class="num">1) >= Ichimoku_SenkouSpanA(X() + class="num">1) && 
      ADX_Plus(X()) < ADX_Minus(X()) && ADX(X()) >= class="num">25.0
      )
   {  class="kw">return(true);
   }
   class="kw">return(false);
}

◍ 滞后线越位A线配ADX的确认逻辑

一目均衡表的滞后线(Chinkou Span)默认比现价晚26根K线,调用内置缓冲区时必须手动把索引加26去读,否则取到的是NaN。多头判定写成:滞后线在先行上线A上方,且ADX不低于25;空头反之,滞后线压在A线下方且ADX≥25。注意空头形态里A线本身处在先行下线B下方,而多头里A线在B上方——这决定了它本质是趋势强度的滞后确认,而不是抢跑信号。 前向步进里这个形态表现很能打,甚至压过了前面两种形态,但实际盘面上更适合拿去验证既有趋势,而不是直接当入场触发。外汇和贵金属波动受杠杆与消息驱动,高风险特征明显,震荡段用它容易反复打脸,只在趋势明确的行情里才值得挂上。 止损可以锚最近波段高低点,也能再叠一层云带位置过滤。下面这段代码就是MT5里直接落地的判断函数,复制进EA就能跑。

MQL5 / C++
class=class="str">"cmt">//+------------------------------------------------------------------+
class=class="str">"cmt">//| Check for Pattern class="num">4.                                                      |
class=class="str">"cmt">//+------------------------------------------------------------------+
class="type">bool CSignalIchimoku_ADXWilder::IsPattern_4(class="type">ENUM_POSITION_TYPE T)
{  if(T == POSITION_TYPE_BUY && 
      Ichimoku_ChinkouSpan(X() + class="num">26) > Ichimoku_SenkouSpanA(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()) &&  
      ADX(X()) >= class="num">25.0
     )
   {  class="kw">return(true);
   }
   class="kw">return(false);
}

「转换线碰线反弹的动量确认与失效点」

把视线从云带挪到转换线(Tenkan-sen)本身:价格回踩转换线获撑弹起,或反抽转换线遇阻回落,配合 ADX 与 DI 方向,能给出一类偏短线的趋势延续信号。多头侧要求 ADX≥25 且 +DI 大于 -DI;空头侧则反过来,-DI 大于 +DI 且 ADX 同样不低于 25。这类信号在趋势中的回调段往往比横盘更有效,因为它本质是在确认动量没有反转。 把上述逻辑落进 MT5 的 CSignalIchimoku_ADXWilder 类,核心就是 IsPattern_5 这个函数。它用最近三根 K 线(X()、X()+1、X()+2)做碰线动作识别:比如多单要求 X()+1 那根收盘跌破或触及转换线、前后两根都收在线上方,再叠 DI 与 ADX 门槛。 //+------------------------------------------------------------------+

//Check for Pattern 5.&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;

//+------------------------------------------------------------------+ bool CSignalIchimoku_ADXWilder::IsPattern_5(ENUM_POSITION_TYPE T) {&nbsp;&nbsp;if(T == POSITION_TYPE_BUY && &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Close(X() + 2) > Close(X() + 1) && Close(X() + 1) < Close(X()) && &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Close(X() + 2) > Ichimoku_TenkanSen(X() + 2) && Close(X()) > Ichimoku_TenkanSen(X()) && &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Close(X() + 1) <= Ichimoku_TenkanSen(X() + 1) && &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ADX_Plus(X()) > ADX_Minus(X()) && ADX(X()) >= 25.0 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;) &nbsp;&nbsp; {&nbsp;&nbsp;return(true); &nbsp;&nbsp; } &nbsp;&nbsp; else if(T == POSITION_TYPE_SELL &&&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Close(X() + 2) < Close(X() + 1) && Close(X() + 1) > Close(X()) && &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Close(X() + 2) < Ichimoku_TenkanSen(X() + 2) && Close(X()) < Ichimoku_TenkanSen(X()) && &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Close(X() + 1) >= Ichimoku_TenkanSen(X() + 1) && &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ADX_Plus(X()) < ADX_Minus(X()) && ADX(X()) >= 25.0 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;) &nbsp;&nbsp; {&nbsp;&nbsp;return(true); &nbsp;&nbsp; } &nbsp;&nbsp; return(false); } 逐行看:函数入口按多/空类型分支;多单先比三根收盘——X()+2 高于 X()+1、X()+1 又低于 X(),构成下探;同时 X()+2 与 X() 收在转换线上、X()+1 收在转换线下方或齐平,完成“碰线反弹”几何;最后 ADX_Plus 大于 ADX_Minus 且 ADX≥25.0 才放行。空单镜像处理,把大于号全反过来即可。 前向步进里,这套组合在所有被测形态中表现最弱,基本完全失效。外汇与贵金属属高风险品种,这种碰线信号单独跑很容易吃假突破。可改的方向很具体:加一根反转 K 线形态做二次确认;给 DI 差值设阈值而非仅看谁大;以及补上止损——多单丢在转换线下方、空单丢在转换线上方,至少把单根反向刺穿的风险隔开。

MQL5 / C++
class=class="str">"cmt">//+------------------------------------------------------------------+
class=class="str">"cmt">//| Check for Pattern class="num">5.                                                                 |
class=class="str">"cmt">//+------------------------------------------------------------------+
class="type">bool CSignalIchimoku_ADXWilder::IsPattern_5(class="type">ENUM_POSITION_TYPE T)
{  if(T == POSITION_TYPE_BUY && 
      Close(X() + class="num">2) > Close(X() + class="num">1) && Close(X() + class="num">1) < Close(X()) &&
      Close(X() + class="num">2) > Ichimoku_TenkanSen(X() + class="num">2) && Close(X()) > Ichimoku_TenkanSen(X()) && 
      Close(X() + class="num">1) <= Ichimoku_TenkanSen(X() + class="num">1) && 
      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">2) < Close(X() + class="num">1) && Close(X() + class="num">1) > Close(X()) &&
      Close(X() + class="num">2) < Ichimoku_TenkanSen(X() + class="num">2) && Close(X()) < Ichimoku_TenkanSen(X()) && 
      Close(X() + class="num">1) >= Ichimoku_TenkanSen(X() + class="num">1) && 
      ADX_Plus(X()) < ADX_Minus(X()) && ADX(X()) >= class="num">25.0
     )
   {  class="kw">return(true);
   }
   class="kw">return(false);
}

常见问题

原文设定 ADX 阈值约 20~25;低于该值多为震荡,信号可靠性倾向下降,建议等 ADX 抬升再动手。
A 上穿 B 且 ADX 站上 25,倾向多头介入;下穿则反手。价格回踩云边不破可加仓,破则减。
可以。小布能按你设的 ADX 阈值和云带交叉规则做品种页预警,省去手动刷图,你只管决策。
概率上偏弱。原文把 ADX 配在 25 上下作过滤,18 说明趋势动能不足,容易被假突破洗掉。
多见于 ADX 走低或云带由厚转薄时。碰线后若三根内不离开云区,动量确认倾向作废,按失效处理。