Kaufman_Bands_v1
Download scriptThis technical tool is designed to analyze market trends by smoothing out price fluctuations and identifying significant directional movements. It combines advanced mathematical modeling with volatility tracking to help traders distinguish between minor "market noise" and meaningful price action.
Core Functionality
The script operates by processing historical price data to create a smoothed trend line. Unlike standard moving averages that can be lagged or easily swayed by sudden spikes, this tool calculates the "Efficiency Ratio" of the market. This means it measures how much progress the price is actually making relative to the total volatility it has experienced.
By evaluating this ratio, the indicator determines if the current movement is a steady trend or merely erratic noise, allowing for a cleaner visual representation of where the market is heading.
Key Components
The logic provides three distinct layers of information:
- Trend Smoothing: The primary visual output is a smoothed price line that reacts dynamically to the market's momentum. It adjusts its sensitivity based on whether the market is moving efficiently or struggling in a sideways range.
- Volatility Envelopes: The tool generates "Upper" and "Lower" bands (similar to Bollinger Bands) centered around the smoothed trend line. These bands measure the standard deviation of price movements, highlighting the boundaries of normal market behavior.
- Momentum Signals: The script identifies specific points where the trend moves with sufficient strength to be considered significant. When the price deviates from its previous position by a predefined threshold, the tool places visual markers (arrows) to signal potential upward or downward momentum shifts.
How it Benefits the User
For a trader, this script simplifies a complex environment by:
- Filtering Noise: It helps ignore minor price wiggles that don't represent a real change in direction.
- Defining Boundaries: The visual bands provide a clear sense of "overextended" price action, helping to identify when the market might be reaching an extreme point.
- Identifying Entry Points: By highlighting specific momentum shifts with arrows, the tool provides clear cues for where the trend is gaining enough strength to potentially influence the next move.
/*-----------------------------+
| |
| Shared by www.Aptrafx.com |
| |
+------------------------------*/
//+------------------------------------------------------------------+
//| Kaufman.mq4 |
//| Copyright © -2005, by konKop & wellx |
//| http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2003-2004, by konKop, for MT GOODMAN,af,Mstera ,wellx "
#property link "http://www.metaquotes.net"
#property indicator_chart_window
#property indicator_buffers 5
#property indicator_color1 Sienna
#property indicator_color2 DeepSkyBlue
#property indicator_color3 Gold
#property indicator_color4 White
#property indicator_color5 White
//---- input parameters
extern int periodAMA=9;
extern int nfast=2;
extern int nslow=30;
extern double G=2.0;
extern double dK=2.0;
extern int BollingerPeriod=20;
extern double K_Bollinger=2.0;
//---- buffers
double kAMAbuffer[];
double kAMAupsig[];
double kAMAdownsig[];
double UpBand[];
double DownBand[];
//+------------------------------------------------------------------+
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);
SetIndexStyle(3,DRAW_LINE);
SetIndexStyle(4,DRAW_LINE);
//SetIndexDrawBegin(0,nslow+nfast);
SetIndexBuffer(0,kAMAbuffer);
SetIndexBuffer(1,kAMAupsig);
SetIndexBuffer(2,kAMAdownsig);
SetIndexBuffer(3,UpBand);
SetIndexBuffer(4,DownBand);
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;
int counter_Boll;
double deviation;
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;
deviation=0;
for (counter_Boll=0;counter_Boll<BollingerPeriod;counter_Boll++) deviation=deviation+MathPow(Close[pos+counter_Boll]-kAMAbuffer[pos+counter_Boll],2);
deviation=MathSqrt(deviation/BollingerPeriod);
UpBand[pos]=AMA+deviation*K_Bollinger;
DownBand[pos]=AMA-deviation*K_Bollinger;
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