您应当知道的 MQL5 向导技术(第 44 部分):平均真实范围(ATR)技术指标·进阶篇
📊

您应当知道的 MQL5 向导技术(第 44 部分):平均真实范围(ATR)技术指标·进阶篇

(2/3)· 从 ADX 收尾到 ATR 波带,把波动率指标写进向导智能系统的实战拆解

新手友好 第 2/3 篇
很多交易者把 ATR 只当成一个看波动大小的数值,却从没把它接进自己的自动系统逻辑里。结果就是止损和仓位全靠拍脑袋,遇到贵金属跳空就被洗得很狼狈。外汇和贵金属是高杠杆高风险市场,波动率失控时手动反应永远慢半拍。

「用 ATR 补上外汇缺成交量的短板」

平均真实范围(ATR)振荡器干的事很简单:把最近 N 根 K 线的真实波幅做平滑,输出一个衡量波动剧烈程度的数值。在 MT5 的外汇和贵金属品种上,盘口没有可靠的成交量序列,ATR 就成了替代性的波动刻度尺。 对外汇交易者来说,这一点很关键:你没法靠量能放大缩小判断资金进出,但 ATR 的抬升或压缩能直接反映多空拉扯的幅度变化。贵金属如 XAUUSD 在亚盘尾、美盘初常出现 ATR 从 3~5 美元跳到 8~12 美元的现象,这种读数本身就能提示风控仓位该缩还是该放。 后面要拆的几种 ATR 形态,有一部分并不依赖我们常用的自定义信号基类,单独写在 EA 或脚本里也能跑。开 MT5 把 ATR 周期调成 14,切到 H1 看最近两周读数,先建立自己对「高波动 / 低波动」的直觉阈值。

ATR 连增三根的突破过滤写法

当 ATR 连续高于其前几根的数值,波动性放大倾向成立,价格沿突破方向走出大波动的概率会上升。单看 ATR 不够,还需用收盘价方向确认,否则容易被假突破晃出去。 下面这段逻辑只认一种形态:最近 4 根 K 线的 ATR 严格递增,且收盘价同方向递增(买)或递减(卖)。在 MT5 里把 Used Patterns 输入赋 1,即可单独测这个形态。 //+------------------------------------------------------------------+

//Check for Pattern 0.

//+------------------------------------------------------------------+ bool CSignalATR::IsPattern_0(ENUM_POSITION_TYPE T) { if(ATR(X()) > ATR(X() + 1) && ATR(X() + 1) > ATR(X() + 2) && ATR(X() + 2) > ATR(X() + 3)) { if(T == POSITION_TYPE_BUY && Close(X()) > Close(X() + 1) && Close(X() + 1) > Close(X() + 2) && Close(X() + 2) > Close(X() + 3)) { return(true); } else if(T == POSITION_TYPE_SELL && Close(X()) < Close(X() + 1) && Close(X() + 1) < Close(X() + 2) && Close(X() + 2) < Close(X() + 3)) { return(true); } } return(false); } 逐行拆解:函数入口吃一个仓位方向 T;先判 ATR(X()) 到 ATR(X()+3) 是否严格递减式上升,不满足直接 false。买侧要求收盘价也四根连涨,卖侧要求四根连跌,双向互斥。返回 true 才允许对应方向信号进场。 实盘前建议拿 2022 年 H1 的 EURUSD 先跑一遍——原文在短暂优化后给出过有利结果,但外汇和贵金属属高风险品种,历史形态不保证重复。

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

◍ 用 ATR 阈值卡掉假突破

ATR 量的是波动幅度,不是方向。把一根 K 线的高低差平均化后,它能告诉你当前市场每走一步大概该有多大动静。价格捅破支撑或阻力未必算数,很多只是刺一下就缩回去——这时候拿 ATR 当滤网就管用。 具体玩法:假设 ATR 读数是 20 点,价格要越过关键位至少 1.5 到 2 倍 ATR(即 30~40 点以上),才倾向认定为有效突破,而不是噪音扰动。做短线和快行情,ATR 周期用 7 或 10 比默认的 14 更跟手;波段单用 14 或 20 能削掉杂波,信号更稳。外汇和贵金属杠杆高,假突破扫损是常态,阈值设太紧容易反复挨耳光。 下面这段 MT5 逻辑不走「百分比倍率」老路,而是盯一个绝对 ATR 点数阈值,配合连续三根收盘的单向排列来发信号。 //+------------------------------------------------------------------+

//Check for Pattern 1.&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 CSignalATR::IsPattern_1(ENUM_POSITION_TYPE T) {&nbsp;&nbsp;if(ATR(X()) >= m_threshold_points*m_symbol.Point()) &nbsp;&nbsp; {&nbsp;&nbsp;if(T == POSITION_TYPE_BUY && Close(X()) > Close(X() + 1) && Close(X() + 1) > Close(X() + 2) && Close(X() + 2) > Close(X() + 3)) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;return(true); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else if(T == POSITION_TYPE_SELL && Close(X()) < Close(X() + 1) && Close(X() + 1) < Close(X() + 2) && Close(X() + 2) < Close(X() + 3)) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;return(true); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp; } &nbsp;&nbsp; return(false); } 逐行拆:函数 IsPattern_1 接收持仓方向 T;先判 ATR(X()) 是否 ≥ 优化后的点数阈值乘合约点值,这是波动够大的门槛。买权情形要求当前收线高于前一根、且连续四根收线逐级抬高;卖权则反过来逐级走低。两个条件同时满足才 return true,否则 false。把 m_threshold_points 丢进策略测试器跑一遍,能直观看到不同阈值对触发频率的挤压效果。

MQL5 / C++
class=class="str">"cmt">//+------------------------------------------------------------------+
class=class="str">"cmt">//| Check for Pattern class="num">1.                                                      |
class=class="str">"cmt">//+------------------------------------------------------------------+
class="type">bool CSignalATR::IsPattern_1(class="type">ENUM_POSITION_TYPE T)
{  if(ATR(X()) >= m_threshold_points*m_symbol.Point())
   {  if(T == POSITION_TYPE_BUY && Close(X()) > Close(X() + class="num">1) && Close(X() + class="num">1) > Close(X() + class="num">2) && Close(X() + class="num">2) > Close(X() + class="num">3))
      {  class="kw">return(true);
      }
      else if(T == POSITION_TYPE_SELL && Close(X()) < Close(X() + class="num">1) && Close(X() + class="num">1) < Close(X() + class="num">2) && Close(X() + class="num">2) < Close(X() + class="num">3))
      {  class="kw">return(true);
      }
   }
   class="kw">return(class="kw">false);
}

「用 ATR 抓离场比死点位更靠谱」

ATR 量的是市场波动性,拿它做离场信号,比固定点数止损更能贴合当下行情。固定阈值在波动放大时容易被扫,ATR 动态拉伸后,离场位落在「有意义」的区间,而不是拍脑袋的价位。 ATR 突然窜高,往往对应美联储纪要这类事件,或趋势耗尽。把它当成「波动性警报」:扩张超过某倍阈值,持仓就该考虑减仓或退场,逆转倾向上升。 波段交易者习惯在近期波段高低点加减 ATR 倍数来离场,这样能锚定平均价格运动、卡在关键转折附近出局。横盘时 ATR 压在低位,一旦抬头,可能暗示突破前兆——区间内持仓可把这当离场触发。 低波动离场是大忌,容易困在震荡里白白磨损。EURCHF 的 2022 年 H1 时段上跑过一轮简短优化,阈值取优化值两倍多时,形态-2 逻辑如下代码,读者可拷进 MT5 自定义信号类改阈值验证。 外汇与贵金属属高风险品种,ATR 信号仅降低歧途概率,不保证离场在最优位。

MQL5 / C++
class=class="str">"cmt">//+------------------------------------------------------------------+
class=class="str">"cmt">//| Check for Pattern class="num">2.                                            |
class=class="str">"cmt">//+------------------------------------------------------------------+
class="type">bool CSignalATR::IsPattern_2(class="type">ENUM_POSITION_TYPE T)
{  if(ATR(X()) >= class="num">2.0 * m_threshold_points*m_symbol.Point())
   {  if(T == POSITION_TYPE_SELL && Close(X()) > Close(X() + class="num">1) && Close(X() + class="num">1) > Close(X() + class="num">2) && Close(X() + class="num">2) > Close(X() + class="num">3))
      {  class="kw">return(true);
      }
      else if(T == POSITION_TYPE_BUY && Close(X()) < Close(X() + class="num">1) && Close(X() + class="num">1) < Close(X() + class="num">2) && Close(X() + class="num">2) < Close(X() + class="num">3))
      {  class="kw">return(true);
      }
   }
   class="kw">return(class="kw">false);
}

用 ATR 收缩读盘口安静期

ATR 连续走低常被视作暴风雨前的平静。低波动区间往往出现在价格飙升或动荡之前,盯住 ATR 收缩能帮交易者预判突破可能发生的窗口,等波动率重新放大再顺势切入,与趋势保持一致的概率更高。 收缩对离场同样有用。若 ATR 偏低或随时间下降,多半是动量衰减的信号,趋势跟踪仓位此时了结往往更合理;强劲趋势里收缩扎根,可能意味着趋势失速进入盘整,给趋势追随者提供止盈或防反转的缓冲。 波段交易者可以把收缩当成横盘警告,先平仓回避无意义震荡;收缩结束、波动再起时再找入场。也可直接借收缩识别区间行情,支撑买、阻力卖,直到上下突破。 外汇这类不透明市场里,ATR 收缩常伴交易量下滑,反映参与者犹豫。待量增且 ATR 扩张,新流动性进场,突破倾向更明确。把「收缩+随后量激」作为确认,是突破交易实用的过滤条件。下行趋势后 ATR 渐弱,倾向回调看涨;牛市末端 ATR 走弱,则视为看跌先兆。 下面这段逻辑只跑形态-3、参数取 8,回测输出即基于此。代码逐行看:函数先判 ATR 是否四期连降;若是卖单,再看前面四根收盘是否递涨,满足返回 true;若是买单,看收盘是否递跌,满足也返回 true;否则 false。直接在 MT5 里复刻就能验证信号触发条件。

MQL5 / C++
class=class="str">"cmt">//+------------------------------------------------------------------+
class=class="str">"cmt">//| Check for Pattern class="num">3.                                                        |
class=class="str">"cmt">//+------------------------------------------------------------------+
class="type">bool CSignalATR::IsPattern_3(class="type">ENUM_POSITION_TYPE T)
{  if(ATR(X()) < ATR(X() + class="num">1) && ATR(X() + class="num">1) < ATR(X() + class="num">2) && ATR(X() + class="num">2) < ATR(X() + class="num">3))
   {  if(T == POSITION_TYPE_SELL && Close(X() + class="num">3) > Close(X() + class="num">4) && Close(X() + class="num">4) > Close(X() + class="num">5) && Close(X() + class="num">5) > Close(X() + class="num">6))
      {  class="kw">return(true);
      }
      else if(T == POSITION_TYPE_BUY && Close(X() + class="num">3) < Close(X() + class="num">4) && Close(X() + class="num">4) < Close(X() + class="num">5) && Close(X() + class="num">5) < Close(X() + class="num">6))
      {  class="kw">return(true);
      }
   }
   class="kw">return(class="kw">false);
}

◍ 用 ATR 倍数画出动态波带

ATR 通道取平均真实范围的倍数,在均价上下画出随波动率扩张收缩的轨道。和布林带不同,它的边界直接由波动率驱动,对行情条件更敏感,上轨下轨可当动态支撑阻力看,价格触碰或越过往往释放反转或延续的可能信号。 手工画这些波带得写自定义指标,但自动化时只需把移动均线和 ATR 读数相加,就能在每根新柱定义轨道。下面这段 MQL5 把收盘价偏离均线超过 2 倍 ATR 视为形态触发: //+------------------------------------------------------------------+

//Check for Pattern 4.

//+------------------------------------------------------------------+ bool CSignalATR::IsPattern_4(ENUM_POSITION_TYPE T) { if(T == POSITION_TYPE_BUY && Close(X()) > MA(X()) + 2.0 * ATR(X())) { return(true); } else if(T == POSITION_TYPE_SELL && Close(X()) < MA(X()) - 2.0 * ATR(X())) { return(true); } return(false); } 逐行拆解:函数接收持仓方向 T;买仓条件下,当最新收盘价高于均线加 2 倍 ATR 返回 true,即价格冲破上轨;卖仓条件下,收盘价低于均线减 2 倍 ATR 返回 true,即跌破下轨;其余情况返回 false。倍数 2.0 可直接改成 1.5 或 3.0 调灵敏度。 回测里 EURCHF 的 H1 周期、2022 年数据跑过类似设置,价格持续贴上轨倾向看涨动能强,反复触轨不跟进则可能是势头减弱。外汇与贵金属波动剧烈、杠杆风险高,轨道信号只作概率参考,实盘前务必在 MT5 用策略测试器重跑验证。

MQL5 / C++
class=class="str">"cmt">//+------------------------------------------------------------------+
class=class="str">"cmt">//| Check for Pattern class="num">4.                                               |
class=class="str">"cmt">//+------------------------------------------------------------------+
class="type">bool CSignalATR::IsPattern_4(class="type">ENUM_POSITION_TYPE T)
{  if(T == POSITION_TYPE_BUY && Close(X()) > MA(X()) + class="num">2.0 * ATR(X()))
   {  class="kw">return(true);
   }
   else if(T == POSITION_TYPE_SELL && Close(X()) < MA(X()) - class="num">2.0 * ATR(X()))
   {  class="kw">return(true);
   }
   class="kw">return(class="kw">false);
}
让小布替你跑这套诊断
这些 ATR 形态与波动率过滤逻辑,小布盯盘的 AIGC 已内置,打开对应品种页即可看到实时波带和突破标记,你只需专注是否跟信号。把重复劳动交给小布,你专注决策。

常见问题

常见用法包括波动率突破、退出触发和通道构建;本篇覆盖突破信号、阈值确认、退出与收缩识别等形态。
代码解析手工支撑阻力线成本较高,布林带上下轨提供了可量化的刺穿判定,便于向导智能系统直接调用。
可以,小布盯盘对应品种页内置了 ATR 通道与波动率突破的 AIGC 标记,省去自己写指标的麻烦。
ADX 衡量趋势强度,读数回落说明原趋势动能减弱,配合 DI 方向可能倾向反转,但仅是概率信号。
ATR 随波动缩放,高波动时放宽、低波动时收紧,比死板点数更贴合品种当下节奏,可能减少噪音出场。