//+------------------------------------------------------------------+
//| TwoPoleSuperSmootherFilter.mq4 |
//| |
//| Two-Pole Super Smoother Filter |
//| |
//| Algorithm taken from book |
//| "Cybernetics Analysis for Stock and Futures" |
//| by John F. Ehlers |
//| |
//| contact@mqlsoft.com |
//| http://www.mqlsoft.com/ |
//+------------------------------------------------------------------+
#property copyright "Coded by Witold Wozniak"
#property link "www.mqlsoft.com"
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Red
extern int CutoffPeriod=15;
double Filter[];
int buffers=0;
int drawBegin=0;
double tempReal,rad2Deg,deg2Rad;
double coef1,coef2,coef3;
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int init()
{
drawBegin=4;
initBuffer(Filter,"Two-Pole Super Smoother Filter",DRAW_LINE);
IndicatorBuffers(buffers);
IndicatorShortName("Two-Pole Super Smoother Filter ["+CutoffPeriod+"]");
tempReal= MathArctan(1.0);
rad2Deg = 45.0 / tempReal;
deg2Rad = 1.0 / rad2Deg;
double a1 = MathExp(-1.414 * 3.14159 / CutoffPeriod);
double b1 = 2 * a1 * MathCos(deg2Rad * 1.414 * 180 / CutoffPeriod);
coef2 = b1;
coef3 = -a1 * a1;
coef1 = 1.0 - coef2 - coef3;
return (0);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int start()
{
int counted_bars=IndicatorCounted();
if(counted_bars < 0) return(-1);
if(counted_bars>0) counted_bars--;
int limit=Bars-counted_bars;
if(counted_bars==0) limit-=1+2;
for(int s=limit; s>=0; s--)
{
Filter[s]=coef1*P(s)+
coef2*Filter[s+1]+
coef3*Filter[s+2];
if(s>Bars-4)
{
Filter[s]=P(s);
}
}
return (0);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
double P(int index)
{
return (Open[index]);
//return ((High[index] + Low[index]) / 2.0);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void initBuffer(double array[],string label="",int type=DRAW_NONE,int arrow=0,int style=EMPTY,int width=EMPTY,color clr=CLR_NONE)
{
SetIndexBuffer(buffers,array);
SetIndexLabel(buffers,label);
SetIndexEmptyValue(buffers,EMPTY_VALUE);
SetIndexDrawBegin(buffers,drawBegin);
SetIndexShift(buffers,0);
SetIndexStyle(buffers,type,style,width);
SetIndexArrow(buffers,arrow);
buffers++;
}
//+------------------------------------------------------------------+
Comments