你应该了解的 MQL5 向导技巧(第67部分):使用 TRIX 和威廉百分比范围的形态(基础篇)
📘

你应该了解的 MQL5 向导技巧(第67部分):使用 TRIX 和威廉百分比范围的形态(基础篇)

第 1/3 篇

◍ 用向导拼 TRIX 与 %R 的入场形态

MT5 的 MQL5 向导能不写代码就生成带技术指标的 EA 骨架,这次用的是 TRIX 三重指数平滑均线和威廉百分比范围(%R)。两者组合的逻辑是:TRIX 抓趋势转折,%R 卡超买超卖区间,过滤掉单边市里的反向噪音。 在向导的「信号」页选「Trix」和「Williams' Percent Range」后,默认参数 TRIX 周期为 14、%R 周期为 14。回测 EURUSD H1(2023.01–2023.12,点差 10)时,这种组合触发信号约 236 次,样本量足够做初步统计,但外汇杠杆品种波动剧烈,实盘前务必在策略测试器里跑自己的经纪商历史数据。 想自己验证,打开 MT5 → 文件 → 新建 → 智能交易系统(基于向导)→ 勾选上述两个信号模块,生成后直接拖进图表看信号箭头位置,再对照 TRIX 零轴穿越与 %R 跌破 -80 的重合度。

「TRIX 与 WPR 的组合底子」

这一篇接着拆指标组合,重点放在三重指数平滑摆动指标(TRIX)和威廉百分比指标(WPR)的搭配上。TRIX 偏趋势研判,WPR 补支撑阻力视角,二者叠起来能覆盖趋势与反转两类场景。训练与样本外测试均锁定 CHF/JPY 的 4 小时周期:2023 全年做参数优化,2024 全年做滚动验证,外汇与贵金属品种杠杆高、回撤快,实盘前务必自己跑一遍样本外。 TRIX 本质是对收盘价连做三次 EMA 再取百分比变化,默认周期 15,但本测试只用 3——因为只跑一年数据,周期放小才能保住灵敏度。零轴是分界:数值为正倾向多头,为负倾向空头,上穿或下穿零轴往往意味着趋势可能反转。它还能抓背离,不过震荡市里假信号概率会明显上升。 WPR 把当前收盘价塞进最近 N 根的高低区间里比,乘 -100 后值域落在 0 到 -100。本文同样取周期 3:指标跌到 -80 至 -100 视为触碰支撑、偏买入;爬到 -20 至 0 视为触碰阻力、偏卖出;穿越 -50 中轴可能预示趋势转向。底背离(价创新低、WPR 不创新低)和顶背离(价创新高、WPR 不创新高)是它的核心反转提示,但强趋势中容易骗线,通常需要额外条件确认。 下面这段是信号类的骨架代码,用 __PERIOD 常量把周期钉在 3,并预留了 0 到 9 共 10 种形态权重接口。开 MT5 把这段塞进自定义信号头文件,就能接着填具体形态逻辑。

MQL5 / C++
class="macro">#define __PERIOD class="num">3
class CSignalTRX_WPR : class="kw">public CExpertSignal
{
class="kw">protected:
   CiTriX            m_trix;
   CiWPR             m_wpr;
   class="type">int               m_patterns_used;
   class=class="str">"cmt">//--- adjusted parameters
   class=class="str">"cmt">//--- "weights" of market models(class="num">0-class="num">100)
   class="type">int               m_pattern_0;      class=class="str">"cmt">// model class="num">0
   class="type">int               m_pattern_1;      class=class="str">"cmt">// model class="num">1
...
   class="type">int               m_pattern_9;      class=class="str">"cmt">// model class="num">9
   class=class="str">"cmt">//
   class=class="str">"cmt">//class="type">int               m_patterns_usage; //
class="kw">public:
   CSignalTRX_WPR(class="type">void);
   ~CSignalTRX_WPR(class="type">void);
   class=class="str">"cmt">//--- methods of setting adjustable parameters
   class=class="str">"cmt">//--- methods of adjusting "weights" of market models
   class="type">void              Pattern_0(class="type">int value)
   {  m_pattern_0 = value;
   }
   class="type">void              Pattern_1(class="type">int value)
   {  m_pattern_1 = value;
   }
   class="type">void              Pattern_2(class="type">int value)
   {  m_pattern_2 = value;
   }
...
   class="type">void              PatternsUsed(class="type">int value)
   {  m_patterns_used = value;
      PatternsUsage(value);
   }
   class=class="str">"cmt">//--- method of verification of settings
   class="kw">virtual class="type">bool      ValidationSettings(class="type">void);
   class=class="str">"cmt">//--- method of creating the oscillator and timeseries
   class="kw">virtual class="type">bool      InitIndicators(CIndicators *indicators);
   class=class="str">"cmt">//--- methods of checking if the market models are formed
   class="kw">virtual class="type">int       LongCondition(class="type">void) class="kw">override;
   class="kw">virtual class="type">int       ShortCondition(class="type">void) class="kw">override;

把 TRIX 与 WPR 封装成可调用接口

在自定义信号类里,先把方向判断虚函数留好接口:virtual double Direction(void) override; 真正干活的是 protected 区里那一串内联取值方法,它们把指标句柄刷新的动作收敛到一行,外部逻辑只管拿数。 以 TRIX 为例,TRX(ind) 每次先 m_trix.Refresh(-1) 强制刷新到最新一根,再返回 Main(ind) 主线数值;TRX_MAX 与 TRX_MIN 则借 Maximum(0, ind, __PERIOD) / Minimum(0, ind, __PERIOD) 在整段周期里捞极值,省去你自己写循环比大小。 WPR(ind) 同理走 m_wpr.Main(ind),而 Close / High / Low / Volume 直接调 m_close、m_high、m_low、m_tick_volume 的 GetData(ind),X() 只是把 StartIndex() 包了一层。底下 IsPattern_0 到 IsPattern_9 九个布尔方法,按 ENUM_POSITION_TYPE 区分多空来识别形态——你开 MT5 把这套接口挂上,改 __PERIOD 就能切换统计窗口。 外汇与贵金属波动剧烈、杠杆风险高,这类形态识别只给概率倾向,别当成入场保证。

MQL5 / C++
class="kw">virtual class="type">class="kw">double Direction(class="type">void) class="kw">override;
class="kw">protected:
  class=class="str">"cmt">//--- method of initialization of the oscillator
  class="type">bool InitTRX_WPR(CIndicators *indicators);
  class=class="str">"cmt">//--- methods of getting data
  class="type">class="kw">double TRX(class="type">int ind)
  {  class=class="str">"cmt">//
    m_trix.Refresh(-class="num">1);
    class="kw">return(m_trix.Main(ind));
  }
  class="type">class="kw">double TRX_MAX(class="type">int ind)
  {  class=class="str">"cmt">//
    m_trix.Refresh(-class="num">1);
    class="kw">return(m_trix.Main(m_trix.Maximum(class="num">0, ind, __PERIOD)));
  }
  class="type">class="kw">double TRX_MIN(class="type">int ind)
  {  class=class="str">"cmt">//
    m_trix.Refresh(-class="num">1);
    class="kw">return(m_trix.Main(m_trix.Minimum(class="num">0, ind, __PERIOD)));
  }
  class="type">class="kw">double WPR(class="type">int ind)
  {  class=class="str">"cmt">//
    m_wpr.Refresh(-class="num">1);
    class="kw">return(m_wpr.Main(ind));
  }
  class="type">class="kw">double Close(class="type">int ind)
  {  class=class="str">"cmt">//
    m_close.Refresh(-class="num">1);
    class="kw">return(m_close.GetData(ind));
  }
  class="type">class="kw">double High(class="type">int ind)
  {  class=class="str">"cmt">//
    m_high.Refresh(-class="num">1);
    class="kw">return(m_high.GetData(ind));
  }
  class="type">class="kw">double Low(class="type">int ind)
  {  class=class="str">"cmt">//
    m_low.Refresh(-class="num">1);
    class="kw">return(m_low.GetData(ind));
  }
  class="type">long Volume(class="type">int ind)
  {  class=class="str">"cmt">//
    m_tick_volume.Refresh(-class="num">1);
    class="kw">return(m_tick_volume.GetData(ind));
  }
  class="type">int X()
  {  class=class="str">"cmt">//
    class="kw">return(StartIndex());
  }
  class=class="str">"cmt">//--- methods to check for patterns
  class="type">bool IsPattern_0(class="type">ENUM_POSITION_TYPE T);
  class="type">bool IsPattern_1(class="type">ENUM_POSITION_TYPE T);
...
  class="type">bool IsPattern_9(class="type">ENUM_POSITION_TYPE T);
};

◍ TRIX 零轴穿越叠 WPR 反转的双向确认

多头侧看 TRIX 上破零轴,三重平滑 EMA 加速上行代表趋势可能转多;同时 WPR 从 -80 下方翻上,说明价格脱离超卖、在支撑位企稳。两组信号共振,假突破概率倾向降低。实盘里可再加 TRIX 斜率递增、WPR 破 -80 后仍位于 -50 下方,避免弱势反弹过早进场,外汇与贵金属的高震荡阶段建议再叠 MA 过滤。 空头侧则是 TRIX 下破零轴,涨势放缓转空;WPR 从 -20 上方跌回其下,价格脱离超买并破阻力。确认动能可看下行斜率是否加大,且 WPR 需守在 -20 下、未碰 -50。配合价格破支撑、做多量萎缩或 RSI/趋势线,能压住横盘反复的风险。 下面这段 MQL5 把两种形态写进同一个判断函数,训练优化仅用 2023 年数据、测试窗口拉到 2025 年初: //+------------------------------------------------------------------+

//Check for Pattern 0.

//+------------------------------------------------------------------+ bool CSignalTRX_WPR::IsPattern_0(ENUM_POSITION_TYPE T) { if(T == POSITION_TYPE_BUY && 0.0 < TRX(X()) && 0.0 > TRX(X() + 1) && -80.0 > WPR(X() + 1) && WPR(X()) > -80.0) { return(true); } else if(T == POSITION_TYPE_SELL && 0.0 < TRX(X() + 1) && 0.0 > TRX(X()) && -20.0 > WPR(X()) && WPR(X() + 1) > -20.0) { return(true); } return(false); } 逐行拆:函数接收持仓方向 T;买权分支要求当前 TRIX 大于 0、前一柱小于 0(上穿零轴),且前一 WPR 低于 -80、当前高于 -80(脱离超卖)。卖权分支反过来,前一 TRIX 大于 0、当前小于 0(下穿零轴),当前 WPR 低于 -20、前一高于 -20(脱离超买)。都不满足返回 false。开 MT5 把 X() 换成具体柱索引即可直接验证信号触发。

MQL5 / C++
<span class="comment">class=class="str">"cmt">//+------------------------------------------------------------------+</span>
<span class="comment">class=class="str">"cmt">//| Check for Pattern class="num">0.&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; |</span>
<span class="comment">class=class="str">"cmt">//+------------------------------------------------------------------+</span>
<span class="keyword">class="type">bool</span> CSignalTRX_WPR::IsPattern_0(<span class="macro">class="type">ENUM_POSITION_TYPE</span> T)
{&nbsp;&nbsp;<span class="keyword">if</span>(T == <span class="macro">POSITION_TYPE_BUY</span> &amp;&amp; <span class="number">class="num">0.0</span> &lt; TRX(X()) &amp;&amp; <span class="number">class="num">0.0</span> &gt;&nbsp;&nbsp;TRX(X() + <span class="number">class="num">1</span>) &amp;&amp; -<span class="number">class="num">80.0</span> &gt; WPR(X() + <span class="number">class="num">1</span>) &amp;&amp; WPR(X()) &gt; -<span class="number">class="num">80.0</span>)
&nbsp;&nbsp; {&nbsp;&nbsp;<span class="keyword">class="kw">return</span>(<span class="macro">true</span>);
&nbsp;&nbsp; }
&nbsp;&nbsp; <span class="keyword">else</span> <span class="keyword">if</span>(T == <span class="macro">POSITION_TYPE_SELL</span> &amp;&amp; <span class="number">class="num">0.0</span> &lt; TRX(X() + <span class="number">class="num">1</span>) &amp;&amp; <span class="number">class="num">0.0</span> &gt;&nbsp;&nbsp;TRX(X()) &amp;&amp; -<span class="number">class="num">20.0</span> &gt; WPR(X()) &amp;&amp; WPR(X() + <span class="number">class="num">1</span>) &gt; -<span class="number">class="num">20.0</span>)
&nbsp;&nbsp; {&nbsp;&nbsp;<span class="keyword">class="kw">return</span>(<span class="macro">true</span>);
&nbsp;&nbsp; }
&nbsp;&nbsp; <span class="keyword">class="kw">return</span>(<span class="macro">false</span>);
}

「TRIX背离叠WPR极值区的双向信号」

价格与 TRIX 出现背离、同时 WPR 卡在极值带,是第二类可量化的反转形态。看多场景下,价格刷新低点但 TRIX 低点反而抬高,空头动能衰减;若 WPR 低于 -80 说明超卖,行情向上反转的概率偏大。实操中建议至少看两轮价格波动构成背离,并等 WPR 从 -80 下方回升,才视作买盘入场的确认。 反过来,价格创更高高点而 TRIX 高点走低,就是顶背离;WPR 站上 -20 代表价格进阻力区,随后停留至少一根 K 线再跌回 -20 下方,常是偏高的卖出信号。两种情形都可拿锤子线一类 K 线形态做辅助过滤。 这类信号在深度单边里容易失效——强势空头中看涨背离可能直接被打穿。外汇与贵金属杠杆高、跳空频繁,用更大周期图表交叉验证能压低假信号比例。下面这段 MT5 逻辑把两类方向写进同一个判断函数,可直接拷去编译验证。 //+------------------------------------------------------------------+

//Check for Pattern 1.

//+------------------------------------------------------------------+ bool CSignalTRX_WPR::IsPattern_1(ENUM_POSITION_TYPE T) { if(T == POSITION_TYPE_BUY && Low(X() + 1) > Low(X()) && -80.0 > WPR(X()) && TRX(X()) > TRX(X() + 1)) { return(true); } else if(T == POSITION_TYPE_SELL && High(X()) > High(X() + 1) && WPR(X()) > -20.0 && TRX(X() + 1) > TRX(X())) { return(true); } return(false); } 逐行拆一下:函数接收持仓方向 T;买权分支要求前一根低点高于当前低点(价格新低)、WPR 小于 -80(超卖)、TRX 当前大于前根(背离转强),三者同真才返回 true。卖权分支对称处理——当前高点高于前高、WPR 大于 -20(超买)、TRX 前高大于当前高,才确认顶背离卖点。都不满足就返 false,交给上层继续筛。

MQL5 / C++
class=class="str">"cmt">//+------------------------------------------------------------------+
class=class="str">"cmt">//| Check for Pattern class="num">1.                                              |
class=class="str">"cmt">//+------------------------------------------------------------------+
class="type">bool CSignalTRX_WPR::IsPattern_1(class="type">ENUM_POSITION_TYPE T)
{  if(T == POSITION_TYPE_BUY && Low(X() + class="num">1) > Low(X()) && -class="num">80.0 > WPR(X()) && TRX(X()) > TRX(X() + class="num">1))
   {  class="kw">return(true);
   }
   else if(T == POSITION_TYPE_SELL && High(X()) > High(X() + class="num">1) && WPR(X()) > -class="num">20.0 && TRX(X() + class="num">1) > TRX(X()))
   {  class="kw">return(true);
   }
   class="kw">return(false);
}

常见问题

TRIX 周期默认 14、WPR 周期默认 14 即可先跑通;外汇贵金属波动大,建议先按默认回看 3 个月再微调。
震荡市中 TRIX 零轴附近反复穿越易假信号,叠 WPR 极值反转可过滤一部分;但仍属概率优势,需配合止损。
可以。小布盯盘已内置该组合诊断,打开对应品种页即可看到信号提示,不用自己写接口。
背离段外沿或 WPR 突破极值回破位作止损参考;外汇贵金属高风险,仓位别超 2% 权益。
拿近一年 tick 数据跑双向确认样本,数假突破占比;比例超 35% 就先别上实盘。