您应该了解的MQL5向导技巧(第六十五部分):使用FrAMA与强力指数的交易形态·进阶篇
(2/3)· 接上篇德马克与包络线,本次用EURUSD 4H数据深挖FrAMA自适应趋势与成交量动量的共振陷阱
FrAMA斜率叠平滑强力指数的信号逻辑
形态3用FrAMA斜率衡量趋势强度,再叠一层平滑后的强力指数过滤噪音。看涨时要求FrAMA呈陡峭正斜率且平滑强力指数在正值区冲高;看跌则FrAMA负斜率、强力指数为负并持续下行。两者方向一致才视作有效信号,适合成交量稳定的趋势段,外汇与贵金属这类高波动品种需警惕假突破风险。 代码里没去读二次平滑缓冲区,而是比较相邻两期差值的增减:FRM(X())-FRM(X()+1) 大于前一期差值且为正,说明FrAMA加速度向上;FRC同理。这样用差分增幅模拟了平滑强力指数的动量延续。 实战里FrAMA变化率周期设在13~21之间,通常能在灵敏度与降噪间取得平衡。入场挑两指标同为正斜率或同为负斜率的时点;离场看FrAMA走平或强力指数反转,往往意味着趋势衰竭。该组合未经过前向测试,波段持仓可能更稳,但盈亏并无保证。
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看信号触发条件。
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交叉再编译试。
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. |
|---|
//+------------------------------------------------------------------+ bool CSignalFRM_FRC::IsPattern_6(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 && FRC(X() + 2) >= 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 && FRC(X() + 2) <= 0.0) { return(true); } return(false); } 逐行拆解:函数入口接收持仓方向T;买权分支要求当前及前两根收盘价均大于FRM()输出(趋势在FrAMA上),且FRC当前>0、前一根<=0、再前一根>=0,即负区回升翻正;卖权分支对称,收盘价均小于FRM,FRC当前<0、前一根>=0、再前一根<=0,即零轴上方回落翻负;都不满足返回false。把X()换成你的偏移周期,编译后能在回测里数出形态6触发次数。 一年数据训出来的结论严格说撑不起长期有效断言,其他没过前向测试的形态更该警惕这点。
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极值随品种漂移,黄金和欧美对同一个倍数参数的敏感度差很多,参数别直接套用。
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); }