您应当知道的 MQL5 向导技术(第 42 部分):ADX 振荡器·进阶篇
📘

您应当知道的 MQL5 向导技术(第 42 部分):ADX 振荡器·进阶篇

第 2/3 篇

「ADX 里的三条缓冲与方向强度」

ADX 振荡器用三个缓冲区衡量趋势强度,其中 DI+ 与 DI- 可独立看待:它们分别给价格上涨和下跌的方向强度打出一个数值。DI+ 高于 DI-,说明买家影响力可能大于卖家;反过来则卖压倾向占优。 在日线周期下,DI+ 来自今日高点大于昨日高点的记录,DI- 则来自今日低点低于昨日低点。两者公式都是平滑走势除以 ATR 再乘 100:DI+ =(平滑正向走势 / 平均真实范围)× 100,DI- =(平滑负向走势 / 平均真实范围)× 100。 ATR 是归一化关键。波动环境中高低点大幅变动频繁,除以真实范围后,只有相对波动而言足够大的方向移动才在缓冲区拿到对应权重。TR 取三个值的最大者:当前高减当前低、当前高减前收、前收减当前低。交叉与组合其它信号可据此观察,外汇与贵金属属高风险品种,信号仅代表概率倾向。

DI 线交叉怎么读趋势方向

DI+ 上穿 DI- 通常释放买入压力占优的信号,可能预示上行趋势起步;反过来 DI- 上穿 DI+ 则偏向卖出压力更强,下行趋势开启的概率更高。这套交叉逻辑不直接判断强度,只解决方向问题。 ADX 主缓冲区量的是趋势强度而不是方向,数值在 0 到 100 之间游走。读数高于 25 一般代表趋势有劲,低于 25 多半是疲软或者无趋势震荡。它不告诉你涨跌,只回答“趋势强不强”。 把 ADX 和 DI 线组合起来看才有用:ADX 上行且 DI+ 在 DI- 上方,是偏强看涨;ADX 上行且 DI- 在 DI+ 上方,是偏强看跌。单看 ADX 会漏掉方向,单看 DI 交叉会漏掉强度。 在 EUR/CHF 的 2022 年日线样本里,对开仓平仓阈值和止盈做优化后,该形态跑出过一组较理想的参数设置。下面这段 MQL5 是 pattern-0 的判定实现,直接在 MT5 里挂上就能验证信号触发逻辑。 //+------------------------------------------------------------------+

//Check for Pattern 0.

//+------------------------------------------------------------------+ bool CSignalADX::IsPattern_0(ENUM_POSITION_TYPE T) { if(T == POSITION_TYPE_BUY && BasePlus(X() + 1) < BaseMinus(X() + 1) && BasePlus(X()) > BaseMinus(X())) { return(true); } else if(T == POSITION_TYPE_SELL && BasePlus(X() + 1) > BaseMinus(X() + 1) && BasePlus(X()) < BaseMinus(X())) { return(true); } return(false); } 逐行拆解:函数入口接收持仓类型 T;买入分支要求前一根 DI+ 小于 DI-、当前根 DI+ 大于 DI-,即完成上穿;卖出分支反之,前根 DI+ 大于 DI-、当前根 DI+ 小于 DI-,即完成下穿;都不满足返回 false。外汇和贵金属杠杆高,信号失效时回撤可能很快,参数请先用历史数据自检。

MQL5 / C++
class=class="str">"cmt">//+------------------------------------------------------------------+
class=class="str">"cmt">//| Check for Pattern class="num">0.                                              |
class=class="str">"cmt">//+------------------------------------------------------------------+
class="type">bool CSignalADX::IsPattern_0(class="type">ENUM_POSITION_TYPE T)
{  if(T == POSITION_TYPE_BUY && BasePlus(X() + class="num">1) < BaseMinus(X() + class="num">1) && BasePlus(X()) > BaseMinus(X()))
   {  class="kw">return(true);
   }
   else if(T == POSITION_TYPE_SELL && BasePlus(X() + class="num">1) > BaseMinus(X() + class="num">1) && BasePlus(X()) < BaseMinus(X()))
   {  class="kw">return(true);
   }
   class="kw">return(false);
}

◍ 用 ADX 主缓冲区卡住趋势门限

ADX 的第三个缓冲区才是主线:它把 DI+ 与 DI- 的差值归一化成 0–100 的方向指数 DX,再对最近 14 个 DX 做平滑指数平均,得出我们平时盯的那条线。公式上 DX =DI+ − DI-/ (DI+ + DI-) × 100,周期 n 默认取 14,也可随指标入参调整。

光看 DI 交叉容易在震荡里吃假信号,所以得用 ADX > 25 当过滤器——低于这条线,趋势强度大概率不够,进场容易被来回扫。 下面这段 MQL5 把「ADX 高于 25 且 DI 方向确认」直接写成形态 1 的入场判定,挂在 EURCHF 日线、2022 年、配合形态 0 环境做优化时跑过: //+------------------------------------------------------------------+

//Check for Pattern 1.

//+------------------------------------------------------------------+ bool CSignalADX::IsPattern_1(ENUM_POSITION_TYPE T) { if(T == POSITION_TYPE_BUY && Base(X()) > 25.0 && BasePlus(X()) > BaseMinus(X())) { return(true); } else if(T == POSITION_TYPE_SELL && Base(X()) > 25.0 && BasePlus(X()) < BaseMinus(X())) { return(true); } return(false); } 逐行拆一下:函数接收持仓方向 T;买权条件是 ADX 主值 Base(X()) 过 25 且正方向 BasePlus 压过负方向 BaseMinus,卖权反之;任一不满足就返回 false。Base / BasePlus / BaseMinus 分别对应 ADX、DI+、DI- 三个缓冲区读取。 外汇与贵金属属高风险品种,ADX 过滤只降低震荡损耗的概率,不保证胜率;开 MT5 把这段代码塞进信号类,拿 EURCHF 日线回看 2022 便能复现门槛逻辑。

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

「ADX 滑落 25 下方的反向读图」

当 ADX 主线从上方跌破 25,通常意味着推动行情的动能正在退潮。若此时 DI- 压在 DI+ 之上,空方力量虽仍占优但趋势引擎已熄火,这种组合更倾向被解读为看跌势头衰减、价格可能迎来转折向上;反过来 ADX 破 25 且 DI+ 高于 DI-,则是早阶段的多头乏力信号,后市转弱的概率偏大。 这套逻辑直接写成 MT5 信号类的判定函数,买权与卖权各走一条分支,核心只看三根线在相邻两根 K 线上的位置关系。外汇与贵金属杠杆高,ADX 弱化只是动能提示,实盘须配合止损,不可单独作为进场依据。 下面这段 MQL5 是形态 2 的完整判定: //+------------------------------------------------------------------+

//Check for Pattern 2.&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_2(ENUM_POSITION_TYPE T) {&nbsp;&nbsp;if(T == POSITION_TYPE_BUY && Base(X()+1) > 25.0 && Base(X()) < 25.0 && BasePlus(X()) < BaseMinus(X())) &nbsp;&nbsp; {&nbsp;&nbsp;return(true); &nbsp;&nbsp; } &nbsp;&nbsp; else if(T == POSITION_TYPE_SELL && Base(X()+1) > 25.0 && Base(X()) < 25.0 && BasePlus(X()) > BaseMinus(X())) &nbsp;&nbsp; {&nbsp;&nbsp;return(true); &nbsp;&nbsp; } &nbsp;&nbsp; return(false); } 逐行看:函数接收持仓方向 T;买分支要求前一根 ADX 大于 25、当前根小于 25,且 DI+ 低于 DI-,即弱势中反抽买点;卖分支对称,ADX 同样下破 25 但 DI+ 高于 DI-,捕捉多头动能散场;都不满足则返回 false,信号不触发。开 MT5 把阈值 25.0 改成 20.0 或 30.0,能直观比对不同灵敏度下的信号密度。

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

用 ADX 自身均线做交叉过滤

形态-3 里挂的辅助均线不是价格均线,而是从 ADX 主缓冲区再算出来的一条移动平均。它相当于 ADX 的并行缓冲,当 ADX 主线像价格上穿均线那样穿过这条 ADX 均线时,信号强度往往更可信。 ADX 本身不带方向,只靠这类交叉提示当下动能是强是弱,多空都适用。把主线与自身均线的位置关系,叠上 +DI/-DI 谁在上的条件,就能区分是想做多还是想做空。 下面这段逻辑可直接塞进 MT5 自定义信号类里验证:前一根 ADX 低于自身均线、当前根上穿,且对应方向 DI 占优,才返回形态成立。外汇与贵金属杠杆高,这类交叉只是概率倾向,实盘前请用策略测试器跑优化样本外数据。

MQL5 / C++
class=class="str">"cmt">//+------------------------------------------------------------------+
class=class="str">"cmt">//| Check for Pattern class="num">3.                                              |
class=class="str">"cmt">//+------------------------------------------------------------------+
class="type">bool CSignalADX::IsPattern_3(class="type">ENUM_POSITION_TYPE T)
{  if(T == POSITION_TYPE_BUY && Base(X()+class="num">1) < BaseAverage(X()+class="num">1) && Base(X()) > BaseAverage(X()) && BasePlus(X()) > BaseMinus(X()))
   {  class="kw">return(true);
   }
   else if(T == POSITION_TYPE_SELL && Base(X()+class="num">1) < BaseAverage(X()+class="num">1) && Base(X()) > BaseAverage(X()) && BasePlus(X()) < BaseMinus(X()))
   {  class="kw">return(true);
   }
   class="kw">return(false);
}

常见问题

三条缓冲分别是 ADX 主线、+DI 和 -DI;+DI 在 -DI 上方倾向多头强度,下方倾向空头,ADX 值高代表趋势强、低代表震荡。
看 +DI 上穿 -DI 倾向转多、下穿转空;但单独用假信号多,最好配合 ADX 门限过滤。
小布可在对应品种页自动标出 ADX 卡 25 门限和 DI 交叉,省去你手动盯三条线的重复劳动。
不一定,25 下倾向震荡,反向读图只适合区间策略,外汇贵金属高风险,破位概率仍存。
取 ADX 主线叠加一条周期 14 的均线,主线穿均线上倾向趋势启动,下穿倾向衰减,可据此筛信号。