您应当知道的 MQL5 向导技术(第 42 部分):ADX 振荡器·综合运用
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 上抓弱势段背离,外汇与贵金属波动剧烈,此类信号仅提高概率,实盘须控仓。
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. |
|---|
//+------------------------------------------------------------------+ bool CSignalADX::IsPattern_5(ENUM_POSITION_TYPE T) { if(T == POSITION_TYPE_BUY && ATRAverage(X()+1) > ATR(X()+1) && ATRAverage(X()) < ATR(X()) && ATR(X()) < High(X())-Low(X()) && Base(X()+1) < 25 && Base(X()) > 25 && Close(X()+1) < Close(X())) { return(true); } else if(T == POSITION_TYPE_SELL && ATRAverage(X()+1) > ATR(X()+1) && ATRAverage(X()) < ATR(X()) && ATR(X()) < High(X())-Low(X()) && Base(X()+1) < 25 && Base(X()) > 25 && Close(X()+1) > Close(X())) { return(true); } 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 小时图最近三个月,哪种窗口假信号最少。
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 管跳空和初始止损止盈,这些都没展开。基础打牢之前,少堆功能、多跑通一个形态,比什么都实在。