您应当知道的 MQL5 向导技术(第 39 部分):相对强度指数·综合运用
📉

您应当知道的 MQL5 向导技术(第 39 部分):相对强度指数·综合运用

(3/3)· 当布林带敞口扩张却方向模糊,RSI 的 4 类形态如何替你过滤假逆转

案例拆解新手友好 第 3/3 篇
很多交易者在布林带轨道变宽时直接反手开仓,却忽略了波动性飙升前趋势延续的突破风险。把 RSI 当独立超买超卖开关用,也常错过与均线、多周期共振的确认窗口。本篇用向导汇编的实盘信号类,演示怎么把两者拼成一套可回测的逻辑。

◍ RSI 波峰波谷趋势线的突破判定

在价格行为里,RSI 的波峰或波谷连线被突破,往往比裸价趋势线更早发出转向信号。具体说,下降波峰之后 RSI 向上越过该波峰连线,倾向视为看涨;低谷上升后读数反向穿透低谷连线,则倾向视为看跌。外汇与贵金属波动剧烈,这类信号仅作概率参考,实盘须严控仓位。 实际落地时不必死磕最后一个真实极点。只取最近 5 个 RSI 读数,若其中已出现一连串波峰(看涨)或波谷(看跌),再检查趋势线突破即可。这里不画几何连线,而是比较极值点的 RSI 变化速率:若当前读数偏离未与前列值保持同等距离,就判为突破。 用形态参数 10 单独测该逻辑,回测样本显示仅在末 5 次读数中检查,信号频率受限。若改寻 RSI 分形或完整波峰波谷,结果可能更有看头。下面这段代码就是 MT5 里直接可抄的判定函数。 别把末 5 根当全部真相 只扫最近 5 个值会漏掉更早形成的分形结构,想提高命中率可在 StartIndex 之外扩窗口,但计算开销也会上去。

MQL5 / C++
class=class="str">"cmt">//+------------------------------------------------------------------+
class=class="str">"cmt">//| Check for Pattern class="num">4.                                                        |
class=class="str">"cmt">//+------------------------------------------------------------------+
class="type">bool CSignalRSI::IsPattern_4(class="type">ENUM_POSITION_TYPE T)
{  m_rsi.Refresh(-class="num">1);
   if(T == POSITION_TYPE_BUY && 
   Base(StartIndex()) > Base(StartIndex() + class="num">1) && 
   Base(StartIndex() + class="num">1) < Base(StartIndex() + class="num">2) && 
   Base(StartIndex() + class="num">2) > Base(StartIndex() + class="num">3) && 
   Base(StartIndex() + class="num">3) < Base(StartIndex() + class="num">4) && 
   Base(StartIndex() + class="num">4) > Base(StartIndex() + class="num">2) && 
   Base(StartIndex()) >= class="num">2.0*Base(StartIndex() + class="num">2)-Base(StartIndex() + class="num">4)
   )
   {  class="kw">return(true);
   }
   else if(T == POSITION_TYPE_SELL && 
   Base(StartIndex()) < Base(StartIndex() + class="num">1) && 
   Base(StartIndex() + class="num">1) > Base(StartIndex() + class="num">2) && 
   Base(StartIndex() + class="num">2) < Base(StartIndex() + class="num">3) && 
   Base(StartIndex() + class="num">3) > Base(StartIndex() + class="num">4) && 
   Base(StartIndex() + class="num">4) < Base(StartIndex() + class="num">2) && 
   Base(StartIndex()) <= class="num">2.0*Base(StartIndex() + class="num">2)-Base(StartIndex() + class="num">4)
   )
   {  class="kw">return(true);
   }
   class="kw">return(class="kw">false);
}

RSI 极值叠加均线过滤的开仓判定

把 RSI 超买超卖单独用容易吃假突破,加一条均线位置确认能砍掉不少噪音。做多时要求 RSI 基线低于 30 且收盘价站上均线主值;做空则反过来,RSI 高于 70 且收盘价跌破均线。 下面这段 MQL5 把上述逻辑封成了 IsPattern_5。先刷三类缓冲区:RSI、收盘价、均线都 Refresh(-1) 取最新一根。买条件里 Base(StartIndex())<30.0 且 Close>ma.Main;卖条件里 Base>70.0 且 Close<ma.Main,命中即返回 true。 //+------------------------------------------------------------------+

//Check for Pattern 5.

//+------------------------------------------------------------------+ bool CSignalRSI::IsPattern_5(ENUM_POSITION_TYPE T) { m_rsi.Refresh(-1); m_close.Refresh(-1); m_ma.Refresh(-1); if(T == POSITION_TYPE_BUY && Base(StartIndex()) < 30.0 && Close(StartIndex()) > m_ma.Main(StartIndex())) { return(true); } else if(T == POSITION_TYPE_SELL && Base(StartIndex()) > 70.0 && Close(StartIndex()) < m_ma.Main(StartIndex())) { return(true); } return(false); } 只跑这一个形态、输入映射设为 20 的独占回测里,信号次数明显少于裸 RSI 形态 0,说明均线过滤确实剔除了部分临界穿越。外汇与贵金属波动大、滑点不可控,这类信号只代表概率倾向,实盘前请在 MT5 策略测试器用历史数据复算一遍。

MQL5 / C++
class=class="str">"cmt">//+------------------------------------------------------------------+
class=class="str">"cmt">//| Check for Pattern class="num">5.                                              |
class=class="str">"cmt">//+------------------------------------------------------------------+
class="type">bool CSignalRSI::IsPattern_5(class="type">ENUM_POSITION_TYPE T)
{  m_rsi.Refresh(-class="num">1);
   m_close.Refresh(-class="num">1);
   m_ma.Refresh(-class="num">1);
   if(T == POSITION_TYPE_BUY && Base(StartIndex()) < class="num">30.0 && Close(StartIndex()) > m_ma.Main(StartIndex()))
   {  class="kw">return(true);
   }
   else if(T == POSITION_TYPE_SELL && Base(StartIndex()) > class="num">70.0 && Close(StartIndex()) < m_ma.Main(StartIndex()))
   {  class="kw">return(true);
   }
   class="kw">return(class="kw">false);
}

「RSI 两次触边才算数」

和单次穿越 30/70 的玩法不同,双底双顶要求 RSI 先在 30 下方走出两个谷、或在 70 上方走出两个峰,且每次刺穿关键线后都弹回。两次跌破 30 并反弹,倾向视为看涨;两次冲过 70 后收回来,倾向视为看跌。外汇与贵金属波动剧烈,这种形态失效概率不低,开 MT5 前先想清楚周期。 把形态输入参数设为 40 单独跑这套逻辑,函数会在买侧检查最近 5 根 BAR 的 RSI 是否呈「低—更低—更高—更低—更高」的五点结构,卖侧则镜像检查 70 上方。下面这段代码可直接丢进 CSignalRSI 类里验证。 别把正态当圣经:RSI 双底不等于反转确认,只是概率倾斜;实盘里建议叠一层价格行为结构(比如前低未破)再信。

MQL5 / C++
class=class="str">"cmt">//+------------------------------------------------------------------+
class=class="str">"cmt">//| Check for Pattern class="num">6.                                                      |
class=class="str">"cmt">//+------------------------------------------------------------------+
class="type">bool CSignalRSI::IsPattern_6(class="type">ENUM_POSITION_TYPE T)
{  m_rsi.Refresh(-class="num">1);
   if(T == POSITION_TYPE_BUY && Base(StartIndex()) < class="num">30.0 && 
   Base(StartIndex()) > Base(StartIndex() + class="num">1) && 
   Base(StartIndex() + class="num">1) < Base(StartIndex() + class="num">2) && 
   Base(StartIndex() + class="num">2) > Base(StartIndex() + class="num">3) && 
   Base(StartIndex() + class="num">3) < Base(StartIndex() + class="num">4)
   )
   {  class="kw">return(true);
   }
   else if(T == POSITION_TYPE_SELL && Base(StartIndex()) > class="num">70.0 && 
   Base(StartIndex()) < Base(StartIndex() + class="num">1) && 
   Base(StartIndex() + class="num">1) > Base(StartIndex() + class="num">2) && 
   Base(StartIndex() + class="num">2) < Base(StartIndex() + class="num">3) && 
   Base(StartIndex() + class="num">3) > Base(StartIndex() + class="num">4)
   )
   {  class="kw">return(true);
   }
   class="kw">return(class="kw">false);
}

◍ 多周期 RSI 共振的第七类形态

把传统 RSI 超买超卖形态搬到多时间帧上,就是这里的第七类信号逻辑。它沿用了单周期形态 0 的判定框架,只是额外接入一个更高周期的 RSI 句柄,用来压住短周期里常见的价格噪音。自定义信号类靠新增输入参数去构建第二个时间帧的 RSI,回测时第二周期选得比默认测试周期更长。 优化器把输入形态映射成 0 到 255 的整数跑了一遍,针对 USDJPY 找出 189(二进制 10111101)这组组合最贴合 RSI 振荡器。也就是说形态 1 与形态 6(失败摇摆、双顶/底)在该货币对上被排除,但这只是单样本优化、未做交叉验证,结论只具参考性。外汇与贵金属杠杆高,信号共振也不等于方向确定,实盘前务必自测。 下面这段是判定函数的核心:两个周期同时进入超卖(≤30)才看多,同时超买(≥70)才看空。 //+------------------------------------------------------------------+

//Check for Pattern 7.&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 CSignalRSI::IsPattern_7(ENUM_POSITION_TYPE T) {&nbsp;&nbsp;m_rsi.Refresh(-1); &nbsp;&nbsp; m_rsi_alt.Refresh(-1); &nbsp;&nbsp; if(T == POSITION_TYPE_BUY && Base(StartIndex()) <= 30.0 && Alt(StartIndex()) <= 30.0) &nbsp;&nbsp; {&nbsp;&nbsp;return(true); &nbsp;&nbsp; } &nbsp;&nbsp; else if(T == POSITION_TYPE_SELL && Base(StartIndex()) >= 70.0 && Alt(StartIndex()) >= 70.0) &nbsp;&nbsp; {&nbsp;&nbsp;return(true); &nbsp;&nbsp; } &nbsp;&nbsp; return(false); } 逐行看:先刷新主周期与备选周期 RSI 数据;买权条件是主周期与 alt 周期在起始索引位都 ≤30.0,卖权条件则都 ≥70.0;任一不满足就返回 false。开 MT5 把这段塞进你的信号类,换不同 alt 周期试,能直接看到共振触发频率的变化。

MQL5 / C++
class=class="str">"cmt">//+------------------------------------------------------------------+
class=class="str">"cmt">//| Check for Pattern class="num">7.                                                              |
class=class="str">"cmt">//+------------------------------------------------------------------+
class="type">bool CSignalRSI::IsPattern_7(class="type">ENUM_POSITION_TYPE T)
{  m_rsi.Refresh(-class="num">1);
   m_rsi_alt.Refresh(-class="num">1);
   if(T == POSITION_TYPE_BUY && Base(StartIndex()) <= class="num">30.0 && Alt(StartIndex()) <= class="num">30.0)
   {  class="kw">return(true);
   }
   else if(T == POSITION_TYPE_SELL && Base(StartIndex()) >= class="num">70.0 && Alt(StartIndex()) >= class="num">70.0)
   {  class="kw">return(true);
   }
   class="kw">return(class="kw">false);
}

形态掩码还能往哪扩

前面拆的 8 个 RSI 形态只是起点,自定义信号类用输入映射当掩码,组合数上限是 2^8−1 = 255。若把形态数提到 10 个,映射范围直接拉到 0–1023,开仓和平仓完全可由不同形态分别管控。 一个没展开的方向是 RSI 突破策略:价格升破图表关键阻力、同时 RSI 上破 70,按前文逻辑这反而是强烈看涨倾向;跌破支撑且 RSI 破 30 则看跌。它依赖你对具体证券支撑阻力的手工判定,编码留给你自己补。 外汇和贵金属波动剧烈、杠杆风险高,这类形态组合在 USDJPY 上未必复现股票表现,开 MT5 把 SignalWZ_39.mqh 丢进向导跑一遍,比盲信参数更实在。

把信号拼装交给小布盯盘
这些布林带叠加 RSI 的诊断逻辑,小布盯盘的 AIGC 已内置,打开对应品种页即可看到多周期 RSI 与轨道敞口的实时标注,你只需专注决策而非手写类。

常见问题

波动性飙升常伴随方向不明的拉锯,价格可能从盘整区突破并延续先前趋势。需配合成交量代理或 RSI 超买超卖来确认逆转假设,否则突破延续概率偏高。
可以,小布盯盘内置的 AIGC 能按品种页的布林带与 RSI 状态输出信号标注和历史形态分布,省去手动编译智能系统的重复劳动。
建议等待价格收盘确认突破颈线,再结合移动平均线方向过滤,单独形态容易在震荡市中频繁触发。
较高帧的 RSI 倾向用于判定主导趋势偏见,较低帧用于触发入场,两者背离时概率上更宜等待重合确认。