您应该了解的MQL5向导技巧(第七十三部分):使用一目均衡表形态与ADX-Wilder形态·进阶篇
◍ 转换线破基准线配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 即前一根。 单独跑这套形态,前向步进报告明显不佳——大概率止盈过紧且没设止损。多单止损放在基准线下方、空单放上方,是顺着结构的安全带;再把交易方向对齐更高周期趋势,配合成交量异动确认,信号可靠性可能提升。外汇和贵金属杠杆高,横盘里这信号失效概率大,只在趋势启动或分型转折处用才划算。
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是过滤弱势震荡的硬门槛。卖分支把大小号反过来,逻辑对称。函数只返回布尔,真正的下单与止损距离要由调用层按云带厚度计算。
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碰线信号频率会明显上升,自己跑一遍看成交分布再决定用不用。
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就能跑。
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. |
|---|
//+------------------------------------------------------------------+ bool CSignalIchimoku_ADXWilder::IsPattern_5(ENUM_POSITION_TYPE T) { if(T == POSITION_TYPE_BUY && Close(X() + 2) > Close(X() + 1) && Close(X() + 1) < Close(X()) && Close(X() + 2) > Ichimoku_TenkanSen(X() + 2) && Close(X()) > Ichimoku_TenkanSen(X()) && Close(X() + 1) <= Ichimoku_TenkanSen(X() + 1) && ADX_Plus(X()) > ADX_Minus(X()) && ADX(X()) >= 25.0 ) { return(true); } else if(T == POSITION_TYPE_SELL && Close(X() + 2) < Close(X() + 1) && Close(X() + 1) > Close(X()) && Close(X() + 2) < Ichimoku_TenkanSen(X() + 2) && Close(X()) < Ichimoku_TenkanSen(X()) && Close(X() + 1) >= Ichimoku_TenkanSen(X() + 1) && ADX_Plus(X()) < ADX_Minus(X()) && ADX(X()) >= 25.0 ) { return(true); } return(false); } 逐行看:函数入口按多/空类型分支;多单先比三根收盘——X()+2 高于 X()+1、X()+1 又低于 X(),构成下探;同时 X()+2 与 X() 收在转换线上、X()+1 收在转换线下方或齐平,完成“碰线反弹”几何;最后 ADX_Plus 大于 ADX_Minus 且 ADX≥25.0 才放行。空单镜像处理,把大于号全反过来即可。 前向步进里,这套组合在所有被测形态中表现最弱,基本完全失效。外汇与贵金属属高风险品种,这种碰线信号单独跑很容易吃假突破。可改的方向很具体:加一根反转 K 线形态做二次确认;给 DI 差值设阈值而非仅看谁大;以及补上止损——多单丢在转换线下方、空单丢在转换线上方,至少把单根反向刺穿的风险隔开。
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); }