您应当知道的 MQL5 向导技术(第 39 部分):相对强度指数·综合运用
(3/3)· 当布林带敞口扩张却方向模糊,RSI 的 4 类形态如何替你过滤假逆转
◍ RSI 波峰波谷趋势线的突破判定
在价格行为里,RSI 的波峰或波谷连线被突破,往往比裸价趋势线更早发出转向信号。具体说,下降波峰之后 RSI 向上越过该波峰连线,倾向视为看涨;低谷上升后读数反向穿透低谷连线,则倾向视为看跌。外汇与贵金属波动剧烈,这类信号仅作概率参考,实盘须严控仓位。 实际落地时不必死磕最后一个真实极点。只取最近 5 个 RSI 读数,若其中已出现一连串波峰(看涨)或波谷(看跌),再检查趋势线突破即可。这里不画几何连线,而是比较极值点的 RSI 变化速率:若当前读数偏离未与前列值保持同等距离,就判为突破。 用形态参数 10 单独测该逻辑,回测样本显示仅在末 5 次读数中检查,信号频率受限。若改寻 RSI 分形或完整波峰波谷,结果可能更有看头。下面这段代码就是 MT5 里直接可抄的判定函数。 别把末 5 根当全部真相 只扫最近 5 个值会漏掉更早形成的分形结构,想提高命中率可在 StartIndex 之外扩窗口,但计算开销也会上去。
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 策略测试器用历史数据复算一遍。
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 双底不等于反转确认,只是概率倾斜;实盘里建议叠一层价格行为结构(比如前低未破)再信。
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. |
|---|
//+------------------------------------------------------------------+ bool CSignalRSI::IsPattern_7(ENUM_POSITION_TYPE T) { m_rsi.Refresh(-1); m_rsi_alt.Refresh(-1); if(T == POSITION_TYPE_BUY && Base(StartIndex()) <= 30.0 && Alt(StartIndex()) <= 30.0) { return(true); } else if(T == POSITION_TYPE_SELL && Base(StartIndex()) >= 70.0 && Alt(StartIndex()) >= 70.0) { return(true); } return(false); } 逐行看:先刷新主周期与备选周期 RSI 数据;买权条件是主周期与 alt 周期在起始索引位都 ≤30.0,卖权条件则都 ≥70.0;任一不满足就返回 false。开 MT5 把这段塞进你的信号类,换不同 alt 周期试,能直接看到共振触发频率的变化。
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 丢进向导跑一遍,比盲信参数更实在。