您应该了解的MQL5向导技巧(第六十五部分):使用FrAMA与强力指数的交易形态·进阶篇
📊

您应该了解的MQL5向导技巧(第六十五部分):使用FrAMA与强力指数的交易形态·进阶篇

(2/3)· 接上篇德马克与包络线,本次用EURUSD 4H数据深挖FrAMA自适应趋势与成交量动量的共振陷阱

偏理论进阶 第 2/3 篇
把FrAMA当普通均线用的人,常忽略它按分形几何自调平滑周期的特性,导致在震荡市里被噪音反复洗掉。强力指数若只看零轴穿越而不结合趋势方向,很容易把缩量反弹误判为反转。本篇用组合形态把这两层过滤叠起来,减少裸信号的自欺。

FrAMA斜率叠平滑强力指数的信号逻辑

形态3用FrAMA斜率衡量趋势强度,再叠一层平滑后的强力指数过滤噪音。看涨时要求FrAMA呈陡峭正斜率且平滑强力指数在正值区冲高;看跌则FrAMA负斜率、强力指数为负并持续下行。两者方向一致才视作有效信号,适合成交量稳定的趋势段,外汇与贵金属这类高波动品种需警惕假突破风险。 代码里没去读二次平滑缓冲区,而是比较相邻两期差值的增减:FRM(X())-FRM(X()+1) 大于前一期差值且为正,说明FrAMA加速度向上;FRC同理。这样用差分增幅模拟了平滑强力指数的动量延续。 实战里FrAMA变化率周期设在13~21之间,通常能在灵敏度与降噪间取得平衡。入场挑两指标同为正斜率或同为负斜率的时点;离场看FrAMA走平或强力指数反转,往往意味着趋势衰竭。该组合未经过前向测试,波段持仓可能更稳,但盈亏并无保证。

MQL5 / C++
class=class="str">"cmt">//+------------------------------------------------------------------+
class=class="str">"cmt">//| Check for Pattern class="num">3.                                                        |
class=class="str">"cmt">//+------------------------------------------------------------------+
class="type">bool CSignalFRM_FRC::IsPattern_3(class="type">ENUM_POSITION_TYPE T)
{  if(T == POSITION_TYPE_BUY && FRM(X()) - FRM(X() + class="num">1) > FRM(X() + class="num">1) - FRM(X() + class="num">2) && FRM(X() + class="num">1) - FRM(X() + class="num">2) > class="num">0.0 && FRC(X()) - FRC(X() + class="num">1) > FRC(X() + class="num">1) - FRC(X() + class="num">2) && FRC(X() + class="num">1) - FRC(X() + class="num">2) > class="num">0.0)
   {  class="kw">return(true);
   }
   else if(T == POSITION_TYPE_BUY && FRM(X()) - FRM(X() + class="num">1) < FRM(X() + class="num">1) - FRM(X() + class="num">2) && FRM(X() + class="num">1) - FRM(X() + class="num">2) < class="num">0.0 && FRC(X()) - FRC(X() + class="num">1) < FRC(X() + class="num">1) - FRC(X() + class="num">2) && FRC(X() + class="num">1) - FRC(X() + class="num">2) < class="num">0.0)
   {  class="kw">return(true);
   }
   class="kw">return(false);
}

「FrAMA突破叠加强力指数两倍尖刺」

用FrAMA自适应均线识别突破,再用强力指数(FRC)的放量尖刺做二次确认,是抓高波动行情里新趋势启动的一种思路。看涨侧要求收盘价从上一根在FrAMA下方翻到当前在上方,且单根涨跌幅度不小于前一根波幅,同时FRC当前值大于等于前值的2倍且前值为正;看跌则镜像处理。FrAMA的自适应特性让它在节奏突变时仍能跟住突破,而FRC充当假突破过滤器。 原文在14周期参数下对该形态做了前向测试,结果未通过——这和同周期下大多数FrAMA+FRC组合形态的表现一致,说明直接拿来跑实盘外汇或贵金属大概率要挨打,这类品种本身杠杆高、流动性分层,风险不小。 关键价位若叠加三角形或旗形,可补一层确认;止损放在FrAMA另一侧能限制回撤。低流动性时段别硬接突破,成交量趋势得持续盯。下面这段逻辑可直接拷进MT5看信号触发条件。

MQL5 / C++
class=class="str">"cmt">//+------------------------------------------------------------------+
class=class="str">"cmt">//| Check for Pattern class="num">4.                                                              |
class=class="str">"cmt">//+------------------------------------------------------------------+
class="type">bool CSignalFRM_FRC::IsPattern_4(class="type">ENUM_POSITION_TYPE T)
{  if(T == POSITION_TYPE_BUY && Close(X()) > FRM(X()) && Close(X() + class="num">1) < FRM(X() + class="num">1) && Close(X()) - Close(X() + class="num">1) >= High(X() + class="num">1) - Low(X() + class="num">1) && FRC(X()) >= class="num">2.0 * FRC(X() + class="num">1) && FRC(X() + class="num">1) > class="num">0.0)
   {  class="kw">return(true);
   }
   else if(T == POSITION_TYPE_SELL && Close(X()) < FRM(X()) && Close(X() + class="num">1) > FRM(X() + class="num">1) && Close(X()) - Close(X() + class="num">1) <= High(X() + class="num">1) - Low(X() + class="num">1) && FRC(X()) <= class="num">2.0 * FRC(X() + class="num">1) && FRC(X() + class="num">1) < class="num">0.0)
   {  class="kw">return(true);
   }
   class="kw">return(false);
}

◍ FrAMA动态位叠强力指数反转的入场逻辑

把分形自适应移动平均(FrAMA)当成会随市况变形的支撑阻力线,再用强力指数(FRC)穿过零轴来确认动量转向,这是形态5的核心。看涨时价格从上方回碰FrAMA后弹起,且FRC由负翻正;看跌则相反,价格反弹触FrAMA被压回,FRC由正翻负。FrAMA的自适应特性让这套组合在震荡与趋势里都可能出现信号,但外汇与贵金属杠杆高,假突破概率不低,真要上手建议先跑历史验证。 下面这段MQL5把判断写死了:买入要求最近三根K线里,现价这根收在FrAMA上、前一根收在下、再前一根收在上,且FRC现根大于0、前根小于0;卖出对称处理。注意它只认零轴穿越,没用文中所提的5/13周期EMA替代方案,灵敏度偏钝。 //+------------------------------------------------------------------+

//Check for Pattern 5.

//+------------------------------------------------------------------+ bool CSignalFRM_FRC::IsPattern_5(ENUM_POSITION_TYPE T) { if(T == POSITION_TYPE_BUY && Close(X()) >= FRM(X()) && Close(X() + 1) <= FRM(X() + 1) && Close(X() + 2) >= FRM(X() + 2) && FRC(X()) > 0.0 && FRC(X() + 1) < 0.0) { return(true); } else if(T == POSITION_TYPE_SELL && Close(X()) <= FRM(X()) && Close(X() + 1) >= FRM(X() + 1) && Close(X() + 2) <= FRM(X() + 2) && FRC(X()) < 0.0 && FRC(X() + 1) > 0.0) { return(true); } return(false); } 逐行拆解:函数入口传持仓方向T;买权分支中,Close(X())指当前根收盘价,FRM(X())即同根FrAMA,三根收盘价与FrAMA的上下关系构成‘碰线反弹’形状,FRC(X())>0.0且前根<0.0确认动量翻多;卖权分支把所有不等号反向,形状与动量均镜像;都不满足则返回false。 回测上有个刺眼的事实:只用2023年数据训练、2024年数据测试时,该形态没过前向检验。低成交量时段FRC容易滞后,MT5里把品种日程调成活跃盘再跑,可能少踩些坑;想更灵敏就把FRC零轴判断换成它自身的EMA交叉再编译试。

MQL5 / C++
class=class="str">"cmt">//+------------------------------------------------------------------+
class=class="str">"cmt">//| Check for Pattern class="num">5.                                              |
class=class="str">"cmt">//+------------------------------------------------------------------+
class="type">bool CSignalFRM_FRC::IsPattern_5(class="type">ENUM_POSITION_TYPE T)
{  if(T == POSITION_TYPE_BUY && Close(X()) >= FRM(X()) && Close(X() + class="num">1) <= FRM(X() + class="num">1) && Close(X() + class="num">2) >= FRM(X() + class="num">2) && FRC(X()) > class="num">0.0 && FRC(X() + class="num">1) < class="num">0.0)
   {  class="kw">return(true);
   }
   else if(T == POSITION_TYPE_SELL && Close(X()) <= FRM(X()) && Close(X() + class="num">1) >= FRM(X() + class="num">1) && Close(X() + class="num">2) <= FRM(X() + class="num">2) && FRC(X()) < class="num">0.0 && FRC(X() + class="num">1) > class="num">0.0)
   {  class="kw">return(true);
   }
   class="kw">return(false);
}

FrAMA定方向,强力指数抓回调后的动能回归

形态6的核心逻辑是用FrAMA确认趋势还在跑,再用强力指数(FRC)在零轴附近的回落与回升来抓顺势回调的再入场点。看涨时价格连续三根都在FrAMA上方,FRC先翻负再回正;看跌则反过来,价格压在FrAMA下,FRC短暂上穿零轴后重新跌回下方。这种组合在强势趋势里风险回报比可能更优,但震荡市极易出假信号,直接弃用。 实盘里别急着在FRC刚碰零轴就动手,等它在零轴附近企稳拐头再决策,趋势的延续性往往比想象中长。把回调位和斐波那契回撤区叠一层相互印证,止损放在近期波段高低点或盯住FrAMA本身,外汇和贵金属波动大、杠杆高,这种顺势单也得控仓。 这套规则是少数熬过一年期前向测试的策略之一,且仅用前一年数据训练。下面对应的MQL5判断函数值得直接拷进MT5看信号触发节奏: //+------------------------------------------------------------------+

//Check for Pattern 6.&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 CSignalFRM_FRC::IsPattern_6(ENUM_POSITION_TYPE T) {&nbsp;&nbsp;if(T == POSITION_TYPE_BUY && Close(X()) > FRM(X()) && Close(X() + 1) > FRM(X() + 1) && Close(X() + 2) > FRM(X() + 2) && FRC(X()) > 0.0 && FRC(X() + 1) <= 0.0 && FRC(X() + 2) >= 0.0) &nbsp;&nbsp; { &nbsp;&nbsp; return(true); &nbsp;&nbsp; } &nbsp;&nbsp; else if(T == POSITION_TYPE_SELL && Close(X()) < FRM(X()) && Close(X() + 1) < FRM(X() + 1) && Close(X() + 2) < FRM(X() + 2) && FRC(X()) < 0.0 && FRC(X() + 1) >= 0.0 && FRC(X() + 2) <= 0.0) &nbsp;&nbsp; { &nbsp;&nbsp; return(true); &nbsp;&nbsp; } &nbsp;&nbsp; return(false); } 逐行拆解:函数入口接收持仓方向T;买权分支要求当前及前两根收盘价均大于FRM()输出(趋势在FrAMA上),且FRC当前>0、前一根<=0、再前一根>=0,即负区回升翻正;卖权分支对称,收盘价均小于FRM,FRC当前<0、前一根>=0、再前一根<=0,即零轴上方回落翻负;都不满足返回false。把X()换成你的偏移周期,编译后能在回测里数出形态6触发次数。 一年数据训出来的结论严格说撑不起长期有效断言,其他没过前向测试的形态更该警惕这点。

MQL5 / C++
class=class="str">"cmt">//+------------------------------------------------------------------+
class=class="str">"cmt">//| Check for Pattern class="num">6.                                                              |
class=class="str">"cmt">//+------------------------------------------------------------------+
class="type">bool CSignalFRM_FRC::IsPattern_6(class="type">ENUM_POSITION_TYPE T)
{  if(T == POSITION_TYPE_BUY && Close(X()) > FRM(X()) && Close(X() + class="num">1) > FRM(X() + class="num">1) && Close(X() + class="num">2) > FRM(X() + class="num">2) && FRC(X()) > class="num">0.0 && FRC(X() + class="num">1) <= class="num">0.0 && FRC(X() + class="num">2) >= class="num">0.0)
   {
   class="kw">return(true);
   }
   else if(T == POSITION_TYPE_SELL && Close(X()) < FRM(X()) && Close(X() + class="num">1) < FRM(X() + class="num">1) && Close(X() + class="num">2) < FRM(X() + class="num">2) && FRC(X()) < class="num">0.0 && FRC(X() + class="num">1) >= class="num">0.0 && FRC(X() + class="num">2) <= class="num">0.0)
   {
   class="kw">return(true);
   }
   class="kw">return(false);
}

「FrAMA压平叠强力指数扩张的爆发捕捉」

盘整末端最怕假突破,这套组合用FrAMA压平锁定低波动,再用强力指数(FRC)从零轴附近的正/负向大幅扩张来确认突破有成交量撑腰。看涨时FrAMA走平、FRC从零轴下方翻正且单根差值不小于前值的2倍绝对值;看跌反之。外汇与贵金属杠杆高,这类形态失效时回撤可能很快,实盘前务必在MT5里跑一遍。 和RSI那种固定超买超卖线不同,FRC没有跨品种通用的极值,写代码时只能按相对零轴的幅度去定义阈值。原文把FrAMA 5根差值与收盘价1根差值做比较来判断“走平”,再把FRC相邻两根的跨度卡在2倍阈值以上,算是给盘整后爆发一个可量化的入口。 下面这段判断函数可以直接拷进你的信号类里改。注意它只做形态识别,未含前向测试结果,信号触发后止损放在盘整区间内部更合理。 别把正态当圣经 FRC极值随品种漂移,黄金和欧美对同一个倍数参数的敏感度差很多,参数别直接套用。

MQL5 / C++
class=class="str">"cmt">//+------------------------------------------------------------------+
class=class="str">"cmt">//| Check for Pattern class="num">7.                                              |
class=class="str">"cmt">//+------------------------------------------------------------------+
class="type">bool CSignalFRM_FRC::IsPattern_7(class="type">ENUM_POSITION_TYPE T)
{  if(T == POSITION_TYPE_BUY && fabs(FRM(X()) -  FRM(X() + class="num">5)) <= fabs(Close(X()) - Close(X() + class="num">1))  && FRC(X()) > class="num">0.0 && FRC(X() + class="num">1) < class="num">0.0 && FRC(X()) - FRC(X() + class="num">1) >= class="num">2.0 * fabs(FRC(X() + class="num">1)))
   {  class="kw">return(true);
   }
   else if(T == POSITION_TYPE_SELL && fabs(FRM(X()) -  FRM(X() + class="num">5)) >= fabs(Close(X()) - Close(X() + class="num">1))  && FRC(X()) < class="num">0.0 && FRC(X() + class="num">1) > class="num">0.0 && FRC(X()) - FRC(X() + class="num">1) <= -class="num">2.0 * fabs(FRC(X() + class="num">1)))
   {  class="kw">return(true);
   }
   class="kw">return(false);
}
把形态回测交给小布
这些诊断小布盯盘的 AIGC 已内置,打开对应品种页即可看到FrAMA与强力指数的背离提示,你只需在复盘时核对参数区间。

常见问题

FrAMA依据分形维度自适应调整平滑周期,在波动剧烈的黄金4H上通常比固定EMA更少假突破,但外汇高杠杆环境仍属高风险,信号仅作概率参考。
MT5中常用Tick成交量或券商提供的近似量,动量验证倾向失真,需搭配FrAMA趋势方向交叉过滤才更稳。
可以,小布盯盘的AIGC模块已预置该类组合诊断,切换至EURUSD 4H页面即显示背离与放量突破标记,省去手动写MQL5向导。
2024年样本中外汇趋势连续性弱于训练年,单纯背离缺乏交叉确认,概率上容易在窄幅区间反复止损,故需后续小节加平滑或放量条件。
对强力指数做MA平滑后再判FrAMA斜率符号,可剔除单根异常K线的动量毛刺,使趋势减弱的判定更偏稳健而非尖峰触发。