你应该了解的 MQL5 向导技巧(第67部分):使用 TRIX 和威廉百分比范围的形态·综合运用
「TRIX 横盘叠 WPR 区间的双向触发」
TRIX 在零轴附近多根 K 线极窄震荡后向上突破,同时 WPR 高于 -50,倾向预示多头动能重启;反向则是 TRIX 向下破位且 WPR 低于 -50(但未进超卖),可能确认空头趋势成立。这类组合对筛选尺度极敏感,大周期样本里有效信号本就稀少,所以实盘常把 TRIX 周期压到 3,否则长周期钝化会让机会寥寥。 震荡里的假破位是主要坑点,外汇与贵金属杠杆高、毛刺多,碰这种形态先想清楚滑点和点差。WPR 卡在 -50 下方又没到 -80 超卖带,往往更贴近最佳入场窗口,太严反而会错过。 下面这段 MT5 逻辑可直接丢进 CSignalTRX_WPR 类里验证:买条件要求收盘价跳幅不小于前一根 TRIX 的零轴穿越带宽、TRIX 前根跨零轴且当前上破、WPR 不低于 -20;卖条件对称,WPR 不高于 -80。 //+------------------------------------------------------------------+
| // | Check for Pattern 7. |
|---|
//+------------------------------------------------------------------+ bool CSignalTRX_WPR::IsPattern_7(ENUM_POSITION_TYPE T) { if(T == POSITION_TYPE_BUY && fabs(Close(X()) - Close(X() + 1)) >= TRX_MAX(X() + 1) - TRX_MIN(X() + 1) && TRX_MAX(X() + 1) > 0.0 && TRX_MIN(X() + 1) < 0.0 && TRX_MAX(X() + 1) < TRX(X()) && WPR(X()) >= -20.0) { return(true); } else if(T == POSITION_TYPE_SELL && fabs(Close(X()) - Close(X() + 1)) >= TRX_MAX(X() + 1) - TRX_MIN(X() + 1) && TRX_MAX(X() + 1) > 0.0 && TRX_MIN(X() + 1) < 0.0 && TRX_MIN(X() + 1) > TRX(X()) && WPR(X()) <= -80.0) { return(true); } return(false); } 逐行拆:函数入口按多空类型分支;fabs 那行强制当前收盘与前收距离 ≥ 前根 TRIX 的零轴上下界差,过滤无波动假信号;TRX_MAX>0 且 TRX_MIN<0 说明前根 TRIX 横跨零轴盘整;买侧 TRX_MAX < TRX(X()) 即当前 TRIX 已上破前高,WPR>=-20 确认未超买;卖侧对称,TRX_MIN > TRX(X()) 为下破,WPR<=-80 确认未超卖。
<span class="comment">class=class="str">"cmt">//+------------------------------------------------------------------+</span> <span class="comment">class=class="str">"cmt">//| Check for Pattern class="num">7. |</span> <span class="comment">class=class="str">"cmt">//+------------------------------------------------------------------+</span> <span class="keyword">class="type">bool</span> CSignalTRX_WPR::IsPattern_7(<span class="macro">class="type">ENUM_POSITION_TYPE</span> T) { <span class="keyword">if</span>(T == <span class="macro">POSITION_TYPE_BUY</span> && <span class="functions">fabs</span>(Close(X()) - Close(X() + <span class="number">class="num">1</span>)) >= TRX_MAX(X() + <span class="number">class="num">1</span>) - TRX_MIN(X() + <span class="number">class="num">1</span>) && TRX_MAX(X() + <span class="number">class="num">1</span>) > <span class="number">class="num">0.0</span> && TRX_MIN(X() + <span class="number">class="num">1</span>) < <span class="number">class="num">0.0</span> && TRX_MAX(X() + <span class="number">class="num">1</span>) < TRX(X()) && WPR(X()) >= -<span class="number">class="num">20.0</span>) { <span class="keyword">class="kw">return</span>(<span class="macro">true</span>); } <span class="keyword">else</span> <span class="keyword">if</span>(T == <span class="macro">POSITION_TYPE_SELL</span> && <span class="functions">fabs</span>(Close(X()) - Close(X() + <span class="number">class="num">1</span>)) >= TRX_MAX(X() + <span class="number">class="num">1</span>) - TRX_MIN(X() + <span class="number">class="num">1</span>) && TRX_MAX(X() + <span class="number">class="num">1</span>) > <span class="number">class="num">0.0</span> && TRX_MIN(X() + <span class="number">class="num">1</span>) < <span class="number">class="num">0.0</span> && TRX_MIN(X() + <span class="number">class="num">1</span>) > TRX(X()) && WPR(X()) <= -<span class="number">class="num">80.0</span>) { <span class="keyword">class="kw">return</span>(<span class="macro">true</span>); } <span class="keyword">class="kw">return</span>(<span class="macro">false</span>); }
零轴拐头叠 WPR 极值区的双向反转
TRIX 在零轴附近拐头、同时 WPR 戳进极值区,是识别震荡转趋势的一种硬信号。看涨侧:TRIX 由中性翻多、WPR 低于 -80,说明卖压透支、买盘在积攒,反转概率偏高;看跌侧反过来,TRIX 零轴下拐、WPR 高于 -20,超买叠加动能转空,回落概率偏大。外汇与贵金属波动剧烈,这类信号在强趋势里容易连续打脸,只用它抄底摸顶要控仓。 代码里的判定比文字更苛刻:买条件要求 TRX 当前与两根前值的斜率都向上且已站上 0,WPR 只卡了 < -50 而非 -80,属于放宽版;卖条件对称,TRX 双根下行且 < 0、WPR > -50。可见实盘把超买超卖阈值内移到 ±50,是为了少漏信号,但假突破会增多。 回测区间锁在 2023-01-01 至 2025-01-01,其中前一年做训练与参数优化;标的 CHF/JPY、4 小时图。打开 MT5 把这段贴进 CSignalTRX_WPR,把 -50 改成 -80 / -20 对比信号密度,能直接看出阈值宽松度的代价。
class=class="str">"cmt">//+------------------------------------------------------------------+ class=class="str">"cmt">//| Check for Pattern class="num">8. | class=class="str">"cmt">//+------------------------------------------------------------------+ class="type">bool CSignalTRX_WPR::IsPattern_8(class="type">ENUM_POSITION_TYPE T) { if(T == POSITION_TYPE_BUY && TRX(X()) > TRX(X() + class="num">1) && TRX(X() + class="num">1) > class="num">0.0 && TRX(X() + class="num">2) > TRX(X() + class="num">1) && WPR(X()) < -class="num">50.0) { class="kw">return(true); } else if(T == POSITION_TYPE_SELL && TRX(X() + class="num">2) < TRX(X() + class="num">1) && TRX(X() + class="num">1) < class="num">0.0 && TRX(X()) < TRX(X() + class="num">1) && WPR(X()) > -class="num">50.0) { class="kw">return(true); } class="kw">return(false); }
◍ TRIX 双底双顶叠 WPR 极值怎么认
看涨一侧,TRIX 在零轴下方或附近走出两个交替低点,像在支撑位上歇了两脚,往往意味着空头动能衰竭、价格底部可能成形。此时若 WPR 砸到 -80 一带,超卖状态给反转加了层确认,但别把它当底部已锁死——外汇和贵金属的高杠杆环境里,震荡洗盘随时能吞掉这种信号。 看跌版本反过来:TRIX 在零轴或正值区排布出双重顶,多头推力逐步漏风;WPR 高于 -20 标明超买,向下反转的概率偏大。原文实测里,即便把指标周期压到极短,这族形态也因条件太刁钻没跑出任何真实成交,说明实战触发率极低。 零轴附近的双重底很少在相邻 K 线完成,所以靠价格本身同步画双底、或等阻力突破来旁证更稳。剧烈双向毛刺行情中,假突破会把这类形态按在地上摩擦,斜率变化和延后一根入场能筛掉一部分噪音。 下面这段 MT5 逻辑把两种方向写进同一个判断函数,注意 WPR 阈值在代码里用的是 -50 而非正文说的 -80/-20,回测前先想清楚你卡哪条线。 //+------------------------------------------------------------------+
| // | Check for Pattern 9. |
|---|
//+------------------------------------------------------------------+ bool CSignalTRX_WPR::IsPattern_9(ENUM_POSITION_TYPE T) { if(T == POSITION_TYPE_BUY && TRX(X()) >= 0.0 && TRX(X()+1) <= 0.0 && TRX(X()+2) >= 0.0 && TRX(X()+3) <= 0.0 && TRX(X()+4) >= 0.0 && WPR(X()) <= -50.0) { return(true); } else if(T == POSITION_TYPE_SELL && TRX(X()+4) <= 0.0 && TRX(X()+3) >= 0.0 && TRX(X()+2) <= 0.0 && TRX(X()+1) >= 0.0 && TRX(X()) <= 0.0 && WPR(X()) >= -50.0) { return(true); } return(false); } 逐行拆:函数名 IsPattern_9 接收持仓方向 T。买向分支要求最新 TRX 非负、前四根依次穿零轴下上下上(X()+1 到 +4 交替 ≤0 与 ≥0),且 WPR 当前 ≤ -50,满足才返回 true。卖向分支镜像处理,TRX 从 +4 到当前依次下上交替且收在零轴下,WPR ≥ -50。都不符则返回 false,等于把双底/双顶加 WPR 极值固化成可编译的触发器。
<span class="comment">class=class="str">"cmt">//+------------------------------------------------------------------+</span> <span class="comment">class=class="str">"cmt">//| Check for Pattern class="num">9. |</span> <span class="comment">class=class="str">"cmt">//+------------------------------------------------------------------+</span> <span class="keyword">class="type">bool</span> CSignalTRX_WPR::IsPattern_9(<span class="macro">class="type">ENUM_POSITION_TYPE</span> T) { <span class="keyword">if</span>(T == <span class="macro">POSITION_TYPE_BUY</span> && TRX(X()) >= <span class="number">class="num">0.0</span> && TRX(X() + <span class="number">class="num">1</span>) <= <span class="number">class="num">0.0</span> && TRX(X() + <span class="number">class="num">2</span>) >= <span class="number">class="num">0.0</span> && TRX(X() + <span class="number">class="num">3</span>) <= <span class="number">class="num">0.0</span> && TRX(X() + <span class="number">class="num">4</span>) >= <span class="number">class="num">0.0</span> && WPR(X()) <= -<span class="number">class="num">50.0</span>) { <span class="keyword">class="kw">return</span>(<span class="macro">true</span>); } <span class="keyword">else</span> <span class="keyword">if</span>(T == <span class="macro">POSITION_TYPE_SELL</span> && TRX(X() + <span class="number">class="num">4</span>) <= <span class="number">class="num">0.0</span> && TRX(X() + <span class="number">class="num">3</span>) >= <span class="number">class="num">0.0</span> && TRX(X() + <span class="number">class="num">2</span>) <= <span class="number">class="num">0.0</span> && TRX(X() + <span class="number">class="num">1</span>) >= <span class="number">class="num">0.0</span> && TRX(X()) <= <span class="number">class="num">0.0</span> && WPR(X()) >= -<span class="number">class="num">50.0</span>) { <span class="keyword">class="kw">return</span>(<span class="macro">true</span>); } <span class="keyword">class="kw">return</span>(<span class="macro">false</span>); }
「一点提醒」
这次把 TRIX 与 WPR 组合跑了一年短周期,刻意压小指标参数只为凑出足够样本。结果很直白:比起之前测过的其他组合,它灵敏度偏低、信号出得少。 滚动样本外测试里,只有第 1、4、5 种形态扛住了,其余形态大概率过拟合。真要上 MT5 用,得自己二次回测筛形态,外汇和贵金属杠杆高,错判信号回撤会很快。 附件里 wz-67.mq5(7.82 KB)和 SignalWZ_67.mqh(19.78 KB)是向导生成的 EA 与信号类,丢进 MetaEditor 就能编译验证那几个形态。