您应当知道的 MQL5 向导技术(第 42 部分):ADX 振荡器·综合运用
📘

您应当知道的 MQL5 向导技术(第 42 部分):ADX 振荡器·综合运用

第 3/3 篇

ADX 与价格的反常背离逻辑

常见误区是把 ADX 主缓冲下降直接当成趋势反转信号,其实它和价格方向的背离有另一套读法。价格下跌同时 ADX 主缓冲也跌,才是看涨背离;价格走多头而 ADX 同样下行,才是看跌背离。这种古怪关系源于人们总拿 ADX 下降去对抗图表上的强劲趋势,反而漏掉了弱势段的真实信号。 下面这段 MQL5 把模式 4 写死了:多头条件是连续三根收盘价抬升、Base 值也连续抬升且当前 Base 不超过 25;空头则反过来,收盘价与 Base 同步下滑且 Base 仍 ≤25。Base 即 ADX 主线,25 是弱势阈值,低于它意味着趋势动能不足。 //+------------------------------------------------------------------+

//Check for Pattern 4.

//+------------------------------------------------------------------+ bool CSignalADX::IsPattern_4(ENUM_POSITION_TYPE T) { if(T == POSITION_TYPE_BUY && Close(X()+2) > Close(X()+1) && Close(X()+1) > Close(X()) && Base(X()+2) > Base(X()+1) && Base(X()+1) > Base(X()) && Base(X()) <= 25) { return(true); } else if(T == POSITION_TYPE_SELL && Close(X()+2) < Close(X()+1) && Close(X()+1) < Close(X()) && Base(X()+2) > Base(X()+1) && Base(X()+1) > Base(X()) && Base(X()) <= 25) { return(true); } return(false); } 逐行拆解:函数入口接收持仓方向 T;买权分支要求近 3 根 K 线收盘依次走高,且 Base 同步走高、末端 Base≤25,满足才返回 true;卖权分支镜像处理收盘与 Base 双降;都不符返回 false。把这段代码塞进 MT5 信号类,就能在 EURUSD 的 H1 上抓弱势段背离,外汇与贵金属波动剧烈,此类信号仅提高概率,实盘须控仓。

MQL5 / C++
class=class="str">"cmt">//+------------------------------------------------------------------+
class=class="str">"cmt">//| Check for Pattern class="num">4.                                              |
class=class="str">"cmt">//+------------------------------------------------------------------+
class="type">bool CSignalADX::IsPattern_4(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()) && Base(X()+class="num">2) > Base(X()+class="num">1) && Base(X()+class="num">1) > Base(X()) && Base(X()) <= class="num">25)
   {  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()) && Base(X()+class="num">2) > Base(X()+class="num">1) && Base(X()+class="num">1) > Base(X()) && Base(X()) <= class="num">25)
   {  class="kw">return(true);
   }
   class="kw">return(false);
}

「用 ADX 穿越 25 抓盘整后的真突破」

盘整末端找突破,手工看图不难,用代码框定「长时间窄幅」却很麻烦。这节的做法是借 ATR 做代理:取一段较长历史的 ATR 均值,和最近一根 K 线的真实波幅比,如果历史均值低迷、且最近一根实体扩张,就倾向视为突破前兆,再叠加 ADX 上穿 25 做确认。 日线周期下这种形态几乎不开仓——回测跑下来信号少到没法统计,所以破例切到小时图优化,才看到较多可下单的突破。外汇与贵金属杠杆高,小时图假突破概率不低,ADX 背书只能提高过滤效率,不等于方向必对。 下面这段 MQL5 是形态-5 的判定函数,买信号要求前一根 ADX 低于 25、当前高于 25,且 ATR 均值下降、当前 ATR 小于最近高低差、收盘价上移;卖信号对称。 //+------------------------------------------------------------------+

//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 CSignalADX::IsPattern_5(ENUM_POSITION_TYPE T) {&nbsp;&nbsp;if(T == POSITION_TYPE_BUY &amp;&amp; ATRAverage(X()+1) &gt; ATR(X()+1) &amp;&amp; ATRAverage(X()) &lt; ATR(X()) &amp;&amp; ATR(X()) &lt; High(X())-Low(X()) &amp;&amp; Base(X()+1) &lt; 25 &amp;&amp; Base(X()) &gt; 25 &amp;&amp; Close(X()+1) &lt; Close(X())) &nbsp;&nbsp; {&nbsp;&nbsp;return(true); &nbsp;&nbsp; } &nbsp;&nbsp; else if(T == POSITION_TYPE_SELL &amp;&amp; ATRAverage(X()+1) &gt; ATR(X()+1) &amp;&amp; ATRAverage(X()) &lt; ATR(X()) &amp;&amp; ATR(X()) &lt; High(X())-Low(X()) &amp;&amp; Base(X()+1) &lt; 25 &amp;&amp; Base(X()) &gt; 25 &amp;&amp; Close(X()+1) &gt; Close(X())) &nbsp;&nbsp; {&nbsp;&nbsp;return(true); &nbsp;&nbsp; } &nbsp;&nbsp; return(false); } 逐行拆一下:ATRAverage(X()+1) > ATR(X()+1) 表示上一根 ATR 高于均值,ATRAverage(X()) < ATR(X()) 表示当前 ATR 掉到均值下,说明波动收缩后转静;ATR(X()) < High(X())-Low(X()) 是用最近柱线范围压住 ATR,逼出「扩张」意味。Base 是 ADX 主线,跨 25 是关键背书。Close 比较决定突破方向。 别把 ATR 代理当精密尺 原文也承认这是不精确变通。真要在 MT5 上用,建议把 ATRAverage 的周期和「较长历史」窗口自己调一遍,看 EURUSD 小时图最近三个月,哪种窗口假信号最少。

MQL5 / C++
class=class="str">"cmt">//+------------------------------------------------------------------+
class=class="str">"cmt">//| Check for Pattern class="num">5.                                                              |
class=class="str">"cmt">//+------------------------------------------------------------------+
class="type">bool CSignalADX::IsPattern_5(class="type">ENUM_POSITION_TYPE T)
{  if(T == POSITION_TYPE_BUY && ATRAverage(X()+class="num">1) > ATR(X()+class="num">1) && ATRAverage(X()) < ATR(X()) && ATR(X()) < High(X())-Low(X()) && Base(X()+class="num">1) < class="num">25 && Base(X()) > class="num">25 && Close(X()+class="num">1) < Close(X()))
   {  class="kw">return(true);
   }
   else if(T == POSITION_TYPE_SELL && ATRAverage(X()+class="num">1) > ATR(X()+class="num">1) && ATRAverage(X()) < ATR(X()) && ATR(X()) < High(X())-Low(X()) && Base(X()+class="num">1) < class="num">25 && Base(X()) > class="num">25 && Close(X()+class="num">1) > Close(X()))
   {  class="kw">return(true);
   }
   class="kw">return(false);
}

◍ 画得少,看得清

ADX 这套形态用法先告一段落,剩下三种形态会并进下一个指标的研究里。回看这一轮,我们全是在向导汇编的智能系统信号类里跑 ADX,因为现成的 SignalWZ_40.mqh(26.64 KB)和 wz_40.mq5(8.39 KB)已经把形态判定和信号接入写好,省掉从零编码的功夫。 初步验证阶段直接改这两个文件里的参数比自己写 EA 快得多,外汇和贵金属波动大、杠杆高,先用现成类测思路再谈实盘。 挂单、自定义订单流、并发开仓数、用 ATR 管跳空和初始止损止盈,这些都没展开。基础打牢之前,少堆功能、多跑通一个形态,比什么都实在。

常见问题

先看ADX是否仍在25以上且方向未转,若只是短暂刺穿25后收回,倾向按原趋势延续处理,不急着反手。
等ADX从低于25明确上穿25且后续两根K线不回落,再确认突破有效,概率上能过滤掉多数毛刺。
可以,小布能按品种页内置的ADX逻辑自动标注25穿越与背离区,你只需打开对应页面看高亮,不用自己画线。
只留ADX主线与25阈值线即可,去掉多余副图,视觉干净后背离和穿越反而一眼能抓。
贵金属波动大易钝化,建议切到4小时及以上周期用ADX,并配合实体破位确认,高风险品种轻仓试。