This script is designed as a specialized technical analysis tool for the MetaTrader platform. It helps traders visualize price trends by filtering out "market noise"—those small, erratic price fluctuations that can often make it difficult to see the true direction of the market.
Core Logic and Functionality
The tool operates by calculating a smoothed moving average based on the Kaufman Efficiency Ratio. Here is a breakdown of how that logic works in plain terms:
1. Measuring Market Efficiency Instead of simply looking at the price change over a set period, the script first calculates how "efficient" the price movement is. It compares the total net move (the distance from where the price started to where it ended) against the sum of all the tiny movements made in between.
- If the price moves steadily in one direction, the efficiency is high.
- If the price zig-zags wildly but ends up near where it started, the script identifies this as "noise" and gives it a lower efficiency score.
2. Dynamic Smoothing The script uses this efficiency score to adjust how much weight it gives to new price data. When the market is moving efficiently (a clear trend), the indicator reacts more quickly to the current price. When the market is volatile or sideways (noisy), the indicator becomes "heavier" and slower, preventing it from reacting to every minor fluctuation.
3. Visual Outputs The script provides three distinct pieces of visual information on your chart:
- The Trend Line: A continuous line that represents the smoothed price path. This serves as the primary guide for the current market direction.
- Upward Signals: The script identifies specific moments where the trend moves up with enough strength to be significant. These are highlighted as arrows pointing upwards, signifying potential bullish momentum.
- Downward Signals: Conversely, when the trend moves down with sufficient force (exceeding a specific threshold you can set), the script marks these with downward arrows, signifying potential bearish momentum.
Key Benefits for the User
By using this logic, the tool helps you distinguish between a market that is "wandering" and a market that is actually "trending." It aims to provide a cleaner view of price action by automatically dampening the influence of minor price vibrations while highlighting meaningful shifts in direction.
//+------------------------------------------------------------------+
//| Kaufman.mq4 |
//| Copyright © -2005, by konKop & wellx |
//| http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2004, by konKop,wellx"
#property link "http://www.metaquotes.net"
#property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1 Sienna
#property indicator_color2 DeepSkyBlue
#property indicator_color3 Gold
//---- input parameters
extern int periodAMA=9;
extern int nfast=2;
extern int nslow=30;
extern double G=2.0;
extern double dK=2.0;
//---- buffers
double kAMAbuffer[];
double kAMAupsig[];
double kAMAdownsig[];
//+------------------------------------------------------------------+
int k=0, cbars=0, prevbars=0, prevtime=0;
double slowSC,fastSC;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
//---- indicators
SetIndexStyle(0,DRAW_LINE);
SetIndexStyle(1,DRAW_ARROW);
SetIndexArrow(1,159);
SetIndexStyle(2,DRAW_ARROW);
SetIndexArrow(2,159);
//SetIndexDrawBegin(0,nslow+nfast);
SetIndexBuffer(0,kAMAbuffer);
SetIndexBuffer(1,kAMAupsig);
SetIndexBuffer(2,kAMAdownsig);
IndicatorDigits(4);
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
int i,pos=0;
double noise=0.000000001,AMA,AMA0,signal,ER;
double dSC,ERSC,SSC,ddK;
if (prevbars==Bars) return(0);
//---- TODO: add your code here
slowSC=(2.0 /(nslow+1));
fastSC=(2.0 /(nfast+1));
cbars=IndicatorCounted();
if (Bars<=(periodAMA+2)) return(0);
//---- check for possible errors
if (cbars<0) return(-1);
//---- last counted bar will be recounted
if (cbars>0) cbars--;
pos=Bars-periodAMA-2;
AMA0=Close[pos+1];
while (pos>=0)
{
kAMAupsig[pos] =NULL;
kAMAdownsig[pos]=NULL;
if(pos==Bars-periodAMA-2) AMA0=Close[pos+1];
signal=MathAbs(Close[pos]-Close[pos+periodAMA]);
noise=0.000000001;
for(i=0;i<periodAMA;i++)
{
noise=noise+MathAbs(Close[pos+i]-Close[pos+i+1]);
};
ER =signal/noise;
dSC=(fastSC-slowSC);
ERSC=ER*dSC;
SSC=ERSC+slowSC;
AMA=AMA0+(MathPow(SSC,G)*(Close[pos]-AMA0));
kAMAbuffer[pos]=AMA;
ddK=(AMA-AMA0);
if ((MathAbs(ddK) > (dK*Point)) && (ddK > 0)) kAMAupsig[pos] =AMA;
if ((MathAbs(ddK)) > (dK*Point) && (ddK < 0)) kAMAdownsig[pos]=AMA;
AMA0=AMA;
pos--;
};
//----
prevbars=Bars;
return(0);
}
Comments