您应当知道的 MQL5 向导技术(第 53 部分):市场促进指数·综合运用
两根绿柱才确认的趋势延续
形态-6 可视为形态-5 的延伸版本,核心差异在于 MFI 柱线要求从单根绿色变成了连续两根绿色,且这一要求同时覆盖看涨与看跌两种配置。 具体区分上,看涨侧需要收盘价站在移动平均线之上,看跌侧则要求收盘价位于移动平均线之下,方向与均线关系必须同步成立。 下面这段 MQL5 判定函数直接给出了可复用的实现逻辑: //+------------------------------------------------------------------+
| // | Check for Pattern 6. |
|---|
//+------------------------------------------------------------------+ bool CSignalMFI::IsPattern_6(ENUM_POSITION_TYPE T) { if(Color(X()+1) == clrGreen && Color(X()) == clrGreen) { if(T == POSITION_TYPE_BUY && Close(X()+1) > MA(X()+1) && Close(X()) > MA(X())) { return(true); } else if(T == POSITION_TYPE_SELL && Close(X()+1) < MA(X()+1) && Close(X()) < MA(X())) { return(true); } } return(false); } 逐行拆解:函数入口先比对最近两根柱线 Color(X()+1) 与 Color(X()) 是否都为 clrGreen,这是形态-6 的 MFI 过滤门槛。 通过后按持仓方向 T 分支:买权要求两根收盘价都高于各自 MA,卖权要求都低于各自 MA,全部满足才返回 true,否则落空返回 false。 把这段代码塞进 MT5 的 CSignalMFI 类里跑优化,外汇与贵金属品种的高杠杆环境下误判概率不低,实盘前建议先用历史数据验证连续绿柱后的回撤频率。
class=class="str">"cmt">//+------------------------------------------------------------------+ class=class="str">"cmt">//| Check for Pattern class="num">6. | class=class="str">"cmt">//+------------------------------------------------------------------+ class="type">bool CSignalMFI::IsPattern_6(class="type">ENUM_POSITION_TYPE T) { if(Color(X()+class="num">1) == clrGreen && Color(X()) == clrGreen) { if(T == POSITION_TYPE_BUY && Close(X()+class="num">1) > MA(X()+class="num">1) && Close(X()) > MA(X())) { class="kw">return(true); } else if(T == POSITION_TYPE_SELL && Close(X()+class="num">1) < MA(X()+class="num">1) && Close(X()) < MA(X())) { class="kw">return(true); } } class="kw">return(false); }
◍ 用棕色MFI柱抓RSI回归的区间信号
把 MFI 染成棕色的盘整段视作波动率压缩区,等 RSI 从极值区穿回中性线,是形态-7 的核心思路。它本质上是在为后面的突破做前置准备,而不是靠区间本身吃满利润。 具体触发条件很直白:当当前 MFI 柱为棕色时,若前一棒 RSI 还在 30 以下、当前棒收在 30 上方,视为看涨;反过来说前一棒 RSI 在 70 以上、当前棒收在 70 下方,视为看跌。单独跑这一形态时,位图输入填 128(即 2^7)即可隔离测试。 一段值得记下的经验:逐个形态验证比一口气优化全部位图更靠谱。八种形态混在一起回测,彼此对冲会抹掉单形态的真实表现。我们只为信息参考做过全形态阈值扫描,但落地部署建议最多挑两个形态深挖。 下面这段 MT5 代码就是形态-7 的判断函数,逐行看逻辑: // 函数声明:传入持仓方向 T,返回是否命中形态-7 bool CSignalMFI::IsPattern_7(ENUM_POSITION_TYPE T) { // 先判当前棒 MFI 颜色是否为棕色 if(Color(X()) == clrBrown) { // 看涨分支:买方向 + 前棒RSI≤30 + 当前棒RSI≥30 if(T == POSITION_TYPE_BUY && RSI(X()+1) <= 30.0 && RSI(X()) >= 30.0) { return(true); // 条件齐活,返回真 } // 看跌分支:卖方向 + 前棒RSI≥70 + 当前棒RSI≤70 else if(T == POSITION_TYPE_SELL && RSI(X()+1) >= 70.0 && RSI(X()) <= 70.0) { return(true); // 返回真 } } return(false); // 其余情况一律不触发 } 外汇与贵金属杠杆高、滑点跳空频繁,这类区间信号只是概率倾向,实盘前请在 MT5 策略测试器里用历史数据跑一遍 128 位图验证。
class=class="str">"cmt">//+------------------------------------------------------------------+ class=class="str">"cmt">//| Check for Pattern class="num">7. | class=class="str">"cmt">//+------------------------------------------------------------------+ class="type">bool CSignalMFI::IsPattern_7(class="type">ENUM_POSITION_TYPE T) { if(Color(X()) == clrBrown) { if(T == POSITION_TYPE_BUY && RSI(X()+class="num">1) <= class="num">30.0 && RSI(X()) >= class="num">30.0) { class="kw">return(true); } else if(T == POSITION_TYPE_SELL && RSI(X()+class="num">1) >= class="num">70.0 && RSI(X()) <= class="num">70.0) { class="kw">return(true); } } class="kw">return(false); }
「MFI 形态判定的代码落点」
前面几节把市场促进指数(MFI)当辅助过滤器接进了向导信号类,这一节直接看模式 4 的判定函数怎么写。它本质是在测一种背离:价格拐点往有利方向挪,但 MFI 强度反而走弱,概率上更像是趋势衰竭后的反抽。
代码里 IsPattern_4 对多空分开处理:买单要求下一根 Low 高于当前 Low,且 MFI 下一根大于当前;卖单要求下一根 High 低于当前 High,且 MFI 同样下一根更大。注意评论区有读者指出原文算法可能把大小关系写反,实盘前应在 MT5 用 SignalWZ_53.mqh 自测一遍。
附件里 wz_53.mq5 仅 7.41 KB,SignalWZ_53.mqh 为 17.07 KB,直接丢进 MQL5 向导可编译出 EA。外汇与贵金属杠杆高,这类非常规指标组合信号失效可能很快,验证时先用模拟盘跑历史分段。
把上面那段 CSignalMFI::IsPattern_4 抄进你自己的信号类,改两行 MFI 比较符号就能复现讨论区说的「先前大于当前」版本,对比回测差异再决定跟哪条逻辑。
class=class="str">"cmt">//+------------------------------------------------------------------+ class=class="str">"cmt">//| 检查模式 class="num">4。 | class=class="str">"cmt">//+------------------------------------------------------------------+ class="type">bool CSignalMFI::IsPattern_4(class="type">ENUM_POSITION_TYPE T) { if(T == POSITION_TYPE_BUY && Low(X()+class="num">1) > Low(X()) && MFI(X()+class="num">1) > MFI(X())) { class="kw">return(true); } else if(T == POSITION_TYPE_SELL && High(X()+class="num">1) < High(X()) && MFI(X()+class="num">1) > MFI(X())) { class="kw">return(true); } class="kw">return(false); }