fama(1)
Download scriptThis script is designed as a specialized technical analysis tool for the MetaTrader platform. Its primary purpose is to provide a smoothed trend line that filters out "market noise"—those small, erratic price fluctuations that can often lead to false signals for traders.
Core Functionality
The logic operates by creating a sophisticated moving average. Unlike standard moving averages that simply take the average price over a set period, this script uses a multi-layered calculation process to determine the "true" direction of the market.
How the Logic Works
1. Noise Detection and Efficiency The tool first analyzes the volatility within a specific range of recent price bars. It calculates a "Noise" factor by measuring the total movement of prices over a set window. From this, it derives an Efficiency Ratio (ER). Essentially, it determines how much of the price movement is significant progress versus insignificant vibration.
2. Adaptive Smoothing (mAMA) The script then uses this efficiency data to build a primary smoothed line. Instead of reacting instantly to every tick, it adjusts its responsiveness based on the market's current behavior. If the price is moving smoothly and efficiently, the line follows more closely; if the price is behaving erratically, the smoothing becomes more pronounced.
3. Advanced Filtering (fAMA) The final layer of logic is a sophisticated filter that creates the "Filtered" version of the average. This step checks two main conditions before deciding whether to move the line:
- Volatility Thresholds: It compares the current movement speed against the standard deviation of the smoothed data. If a price move is too small or weak relative to recent volatility, the script ignores it.
- Price Extremes: It looks at the highest and lowest price points over a short period. The line will only "step" forward if the price breaks significantly past these local peaks or valleys (controlled by a user-defined height parameter).
Summary for the User
In simple terms, this script acts like a high-quality lens for a camera. It blurs out the "shaking" of the market to show you the underlying trend. By combining noise detection with volatility filtering, it aims to provide a smoother, more reliable visual guide that stays steady during consolidation and only moves when a significant, sustained trend change is actually occurring.
//+------------------------------------------------------------------+
//| fAMA.mq4 |
//| Copyright © 2005, Profi_R |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, Profi_R"
#property link "rvm_fam@fromru.com"
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Red
//---- input parameters
extern int Range=10;
extern int FastMA=2;
extern int SlowMA=30;
extern int filter=50;
extern int n=4;
extern int h=10;
//---- buffers
double fAMA[];
double mAMA[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
string short_name; //????????? ?????????? short_name ???? "?????????"
//---- indicators
IndicatorBuffers(2);
SetIndexStyle(0,DRAW_LINE);
SetIndexBuffer(0,fAMA);
SetIndexBuffer(1,mAMA);
//---- name for DataWindow and indicator subwindow label
//?????????? short_name ??????????? ????????? ???????? ?????? ?????????
short_name="fAMA("+Range+","+FastMA+","+SlowMA+","+filter+","+n+","+h+")";
//??? ??????????? ?? ??????? ???????? ?????????? ??????? ????????????
IndicatorShortName(short_name);
SetIndexLabel(0,short_name);//????????? ????? ??? ??????
//----
SetIndexDrawBegin(0,Range); //????????? ????????? ????? ?????????? ??? 0 ??????
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
int counted_bars=IndicatorCounted();
//---- TODO: add your code here
int cb,i;
double k1,k2,Noise,ER,SSC,AMA,sdAMA,dAMA;
if(Bars<=Range) return(0);
else
{
k1=2.0/(SlowMA+1);
k2=2.0/(FastMA+1)-k1;
AMA=Close[Bars-Range];
mAMA[Bars-Range]=Close[Bars-Range+1];
for(cb=Bars-counted_bars-Range-1;cb>=0;cb--)
{
Noise=0;
for(i=cb;i<=cb+Range-1;i++)
{
Noise=Noise+MathAbs(Close[i]-Close[i+1]);
}
if(Noise!=0)
{
ER=MathAbs(Close[cb]-Close[cb+Range])/Noise;
}
else
{
ER=0;
}
SSC=(ER*k2+k1);
AMA=AMA+NormalizeDouble(SSC*SSC*(Close[cb]-AMA),4);
mAMA[cb]=AMA;
if(filter<1)
{
fAMA[cb]=mAMA[cb];
}
else
{
for(i=cb;i<=cb+SlowMA-1;i++)
{
sdAMA=sdAMA+MathAbs(mAMA[i]-mAMA[i+1]);
}
dAMA=mAMA[cb]-mAMA[cb+1];
if(dAMA>=0)
{
if(dAMA<NormalizeDouble(filter*sdAMA/(100*SlowMA),4)&&
High[cb]<=High[Highest(NULL,0,MODE_HIGH,n,cb)]+h*Point)
{
fAMA[cb]=fAMA[cb+1];
}
else
{
fAMA[cb]=mAMA[cb];
}
}
else
{
if(MathAbs(dAMA)<NormalizeDouble(filter*sdAMA/(100*SlowMA),4)&&
Low[Lowest(NULL,0,MODE_LOW,n,cb)]-h*Point<Low[cb])
{
fAMA[cb]=fAMA[cb+1];
}
else
{
fAMA[cb]=mAMA[cb];
}
}
sdAMA=0.0;
}
}
}
//----
return(0);
}
//+------------------------------------------------------------------+
Comments