你应该了解的 MQL5 向导技巧(第67部分):使用 TRIX 和威廉百分比范围的形态·进阶篇
TRIX 穿轴叠 WPR 中性区的双向触发
看涨一侧的触发逻辑很直接:TRIX 从下向上越过零轴,说明短周期三重平滑动量翻多;此时 WPR 必须站在 -50 上方、但压在 -20 下方,也就是价格处于中性偏阻力、还没过热。这个区间里回调概率倾向偏低,若 TRIX 交叉当根斜率陡,信号强度更高。 看跌对称:TRIX 由上向下破零轴,WPR 在 -50 下方但未到 -80,代表跌势确立且离支撑尚远,反转可能性较低。两种方向都只在趋势行情里有效,震荡市用这套会频繁打脸。 额外确认可以接价格突破关键 MA,或 ADX 高于阈值再放手。下面这段 MT5 代码就是形态 2 的判定核心,开终端把 CSignalTRX_WPR 类挂上就能跑。 //+------------------------------------------------------------------+
| // | Check for Pattern 2. |
|---|
//+------------------------------------------------------------------+ bool CSignalTRX_WPR::IsPattern_2(ENUM_POSITION_TYPE T) { if(T == POSITION_TYPE_BUY && 0.0 < TRX(X()) && 0.0 > TRX(X() + 1) && WPR(X()) > -50.0) { return(true); } else if(T == POSITION_TYPE_SELL && 0.0 < TRX(X() + 1) && 0.0 > TRX(X()) && -50.0 > WPR(X())) { return(true); } return(false); } 逐行拆一下:函数入口吃一个仓位方向枚举 T。买分支要求当前根 TRIX 值大于 0、前一根小于 0,即向上穿轴,且 WPR 大于 -50,抓中性偏多区。卖分支反过来,前根 TRIX 在 0 上、当前根破下,WPR 小于 -50,对应中性偏空。都不满足就返回 false,不交易。外汇与贵金属杠杆高,信号失效时回撤可能很快,先用模拟盘验斜率阈值再上实盘。
class=class="str">"cmt">//+------------------------------------------------------------------+ class=class="str">"cmt">//| Check for Pattern class="num">2. | class=class="str">"cmt">//+------------------------------------------------------------------+ class="type">bool CSignalTRX_WPR::IsPattern_2(class="type">ENUM_POSITION_TYPE T) { if(T == POSITION_TYPE_BUY && class="num">0.0 < TRX(X()) && class="num">0.0 > TRX(X() + class="num">1) && WPR(X()) > -class="num">50.0) { class="kw">return(true); } else if(T == POSITION_TYPE_SELL && class="num">0.0 < TRX(X() + class="num">1) && class="num">0.0 > TRX(X()) && -class="num">50.0 > WPR(X())) { class="kw">return(true); } class="kw">return(false); }
「零轴企稳叠 WPR 脱极值:多空双向触发逻辑」
TRIX 在零轴或紧邻零轴的位置窄幅盘住,同时 WPR 从 -80 或 -20 这类极值区抽身,是这类形态的核心。看涨侧要求 TRIX 先贴零轴震荡再上破,WPR 由下越过 -80 并收在其上;看跌侧则是 TRIX 盘整后下破零轴,WPR 从上穿过 -20 并收在下方。 直接去历史图里找 TRIX 的「支撑位」往往费眼且主观,硬卡这个条件会把不少机会过滤掉。更务实的做法是用 RSI 或动量类指标交叉验证 WPR 突破 -80/-20 的有效性,再叠一个看涨/看跌吞没或放量动作做二次确认。 该形态在弱支撑区容易失效,强劲趋势市里也常反应滞后。把周期拉高一级(比如 M15 信号用 H1 复核)能明显提升命中概率,但外汇和贵金属自带高杠杆高风险,任何信号都只是概率倾向,不是确定性出场依据。 下面这段 MT5 代码把上述双向判定写成了函数: //+------------------------------------------------------------------+
| // | Check for Pattern 3. |
|---|
//+------------------------------------------------------------------+ bool CSignalTRX_WPR::IsPattern_3(ENUM_POSITION_TYPE T) { if(T == POSITION_TYPE_BUY && TRX(X()) >= 0.0 && TRX(X() + 1) <= 0.0 && TRX(X() + 2) >= 0.0 && WPR(X() + 1) < -80.0 && WPR(X()) > -80.0) { return(true); } else if(T == POSITION_TYPE_SELL && TRX(X() + 2) <= 0.0 && TRX(X() + 1) >= 0.0 && TRX(X()) <= 0.0 && WPR(X()) < -20.0 && WPR(X() + 1) > -20.0) { return(true); } return(false); } 逐行拆一下:函数名 IsPattern_3 接收持仓方向 T。买权分支里,TRX(X())>=0 且前一根 <=0、再前一根 >=0,说明 TRIX 在零轴附近晃了两根后回到上方;WPR 前一根 <-80、当前 >-80,确认脱离超卖。卖权分支对称:TRX 两根内从下往上碰零轴再跌回,WPR 前一根在 -20 上方、当前跌破 -20,确认脱离超买。都不满足就返回 false,等下一根 K 线再判。
class=class="str">"cmt">//+------------------------------------------------------------------+ class=class="str">"cmt">//| Check for Pattern class="num">3. | class=class="str">"cmt">//+------------------------------------------------------------------+ class="type">bool CSignalTRX_WPR::IsPattern_3(class="type">ENUM_POSITION_TYPE T) { if(T == POSITION_TYPE_BUY && TRX(X()) >= class="num">0.0 && TRX(X() + class="num">1) <= class="num">0.0 && TRX(X() + class="num">2) >= class="num">0.0 && WPR(X() + class="num">1) < -class="num">80.0 && WPR(X()) > -class="num">80.0) { class="kw">return(true); } else if(T == POSITION_TYPE_SELL && TRX(X() + class="num">2) <= class="num">0.0 && TRX(X() + class="num">1) >= class="num">0.0 && TRX(X()) <= class="num">0.0 && WPR(X()) < -class="num">20.0 && WPR(X() + class="num">1) > -class="num">20.0) { class="kw">return(true); } class="kw">return(false); }
◍ TRIX 穿位叠 WPR 半区过滤假突破
看涨侧的逻辑和前面一种模式接近:TRIX 向上突破阻力,同时 WPR 落在 -50 到 -20 之间。这个 WPR 区间代表价格处于中性偏多状态,配合 TRIX 穿位,突破延续的概率更高。实盘里可以把 TRIX 斜率转陡、成交量放大当作强度加分项,再叠一根 MA 被价格上破做二次确认。 看跌侧反过来:TRIX 跌破支撑(常见是前低或零轴),WPR 在 -80 到 -50 之间,属于中性偏空但未超卖。此时若 TRIX 斜率继续向下、价格跌破 MA,胜率倾向更好。震荡市两种方向都容易扫损,外汇和贵金属本身杠杆高、跳空频繁,这类信号必须降仓或跳过。 下面这段 MT5 逻辑把上述规则写死了,直接能抄进 EA 里跑。注意 X() 是当前柱,X()+1 是前一柱,TRX_MAX / TRX_MIN 是窗口内极值。 //+------------------------------------------------------------------+
| // | Check for Pattern 4. |
|---|
//+------------------------------------------------------------------+ bool CSignalTRX_WPR::IsPattern_4(ENUM_POSITION_TYPE T) { if(T == POSITION_TYPE_BUY && 0.0 < TRX(X()) && 0.0 > TRX(X() + 1) && TRX(X()) == TRX_MAX(X()) && WPR(X()) > -50.0 && WPR(X()) < -20.0) { return(true); } else if(T == POSITION_TYPE_SELL && 0.0 < TRX(X() + 1) && 0.0 > TRX(X()) && TRX(X()) == TRX_MIN(X()) && WPR(X()) > -80.0 && WPR(X()) < -50.0) { return(true); } return(false); } 逐行拆一下:买条件要求当前 TRIX 大于 0、前一柱 TRIX 小于 0(即刚上穿零轴),且当前 TRIX 是区间内最大值,WPR 卡在 -50~-20;卖条件对称,当前 TRIX 小于 0、前一柱大于 0(下穿零轴),是当前最小值,WPR 在 -80~-50。不满足就返回 false,不触发。
class=class="str">"cmt">//+------------------------------------------------------------------+ class=class="str">"cmt">//| Check for Pattern class="num">4. | class=class="str">"cmt">//+------------------------------------------------------------------+ class="type">bool CSignalTRX_WPR::IsPattern_4(class="type">ENUM_POSITION_TYPE T) { if(T == POSITION_TYPE_BUY && class="num">0.0 < TRX(X()) && class="num">0.0 > TRX(X() + class="num">1) && TRX(X()) == TRX_MAX(X()) && WPR(X()) > -class="num">50.0 && WPR(X()) < -class="num">20.0) { class="kw">return(true); } else if(T == POSITION_TYPE_SELL && class="num">0.0 < TRX(X() + class="num">1) && class="num">0.0 > TRX(X()) && TRX(X()) == TRX_MIN(X()) && WPR(X()) > -class="num">80.0 && WPR(X()) < -class="num">50.0) { class="kw">return(true); } class="kw">return(false); }
TRIX 见顶配 WPR 破 -20 的反转读法
看涨一侧的触发逻辑很直接:TRIX 在远高于零轴的位置走平后向下拐,同时 WPR 已经砸到 -20 下方。这种组合说明价格刚从超买里撤出来,后续倾向出现良性回调或延续原趋势,但前提是 WPR 往 -50 回落后别继续陷进超卖。实操里要顺手核对价格是否还踩在关键支撑或某条重要均线上。 看跌版本反过来:TRIX 在极端低位拐头向上,WPR 脱离 -80 以下的超卖区,意味着短期超卖缓解后跌势可能重启。附加筛选用 TRIX 零轴下方且上行斜率陡,WPR 可以向 -50 靠但不能翻上去,否则容易误判成超买反转。该形态在震荡市里噪音很大,建议叠趋势线过滤。 代码里 Pattern_5 把两套方向写进同一个函数。买入分支要求 TRX(X+1) 是窗口内最大值且较前一根回落,WPR 在 X+1 还在 -20 上方、X 已跌破 -20;卖出分支则抓 TRX(X+1) 为最小值且反弹,WPR 从 X 的 -80 上方跳回 X+1 的 -80 下方。 回测层面,这类信号在趋势品种上胜率尚可,但外汇与贵金属杠杆高、滑点突兀,从超买回落变深度急跌的概率不低,拿斐波那契回撤位卡风险比裸信号稳。
class=class="str">"cmt">//+------------------------------------------------------------------+ class=class="str">"cmt">//| Check for Pattern class="num">5. | class=class="str">"cmt">//+------------------------------------------------------------------+ class="type">bool CSignalTRX_WPR::IsPattern_5(class="type">ENUM_POSITION_TYPE T) { if(T == POSITION_TYPE_BUY && TRX(X() + class="num">2) < TRX(X() + class="num">1) && TRX(X() + class="num">1) > TRX(X()) && TRX(X() + class="num">1) == TRX_MAX(X()) && WPR(X() + class="num">1) > -class="num">20.0 && WPR(X()) < -class="num">20.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) < TRX(X()) && TRX(X() + class="num">1) == TRX_MIN(X()) && WPR(X()) > -class="num">80.0 && WPR(X() + class="num">1) < -class="num">80.0) { class="kw">return(true); } class="kw">return(false); }
「TRIX 零轴站位叠加 WPR 中间带的多空延续判定」
多头延续的触发条件很直接:TRIX 持续漂在零轴上方且斜率向上,同时 WPR 落在 -50 到 -20 的中间区间。WPR 不碰超买超卖边界,说明价格处于趋势中段,短期反转概率偏低,上行空间可能还在。 空头一侧镜像处理:TRIX 稳在零轴下且继续走低,WPR 守在 -50 至 -80 之间,代表跌势未进超卖,下行倾向有望延伸。两个方向都要求 TRIX 斜率不能突然拐平,否则信号质量下降。 低波动环境是这个组合的软肋。成交量萎缩、波幅收窄时,中间区间信号容易反复失效,行情可能长期横盘,外汇与贵金属品种在此类时段风险尤其高。 下面这段 MQL5 实现把第六类形态(多空共用)写成函数,直接在 MT5 里挂上就能回测: //+------------------------------------------------------------------+
| // | Check for Pattern 6. |
|---|
//+------------------------------------------------------------------+ bool CSignalTRX_WPR::IsPattern_6(ENUM_POSITION_TYPE T) { if(T == POSITION_TYPE_BUY && TRX(X() + 2) > TRX(X() + 1) && TRX(X() + 1) > TRX(X()) && TRX(X()) > 0.0 && WPR(X()) > -80.0 && WPR(X()) < -20.0) { return(true); } else if(T == POSITION_TYPE_SELL && TRX(X() + 2) < TRX(X() + 1) && TRX(X() + 1) < TRX(X()) && TRX(X()) < 0.0 && WPR(X()) > -80.0 && WPR(X()) < -20.0) { return(true); } return(false); } 逐行拆解:函数接收持仓方向 T;买权分支要求连续三根 TRIX 递增且最新值大于 0,同时 WPR 在 -80 到 -20 之间(覆盖了原文 -50~-20 的更宽容差);卖权分支反之,TRIX 连续递减且低于 0,WPR 同区间;都不满足则返回 false。注意代码里 WPR 下界写的是 -80 而非 -50,实盘验证时建议按自己品种把 -80 改成 -50 以严格匹配原文多头区间。
class=class="str">"cmt">//+------------------------------------------------------------------+ class=class="str">"cmt">//| Check for Pattern class="num">6. | class=class="str">"cmt">//+------------------------------------------------------------------+ class="type">bool CSignalTRX_WPR::IsPattern_6(class="type">ENUM_POSITION_TYPE T) { if(T == POSITION_TYPE_BUY && TRX(X() + class="num">2) > TRX(X() + class="num">1) && TRX(X() + class="num">1) > TRX(X()) && TRX(X()) > class="num">0.0 && WPR(X()) > -class="num">80.0 && WPR(X()) < -class="num">20.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) < TRX(X()) && TRX(X()) < class="num">0.0 && WPR(X()) > -class="num">80.0 && WPR(X()) < -class="num">20.0) { class="kw">return(true); } class="kw">return(false); }