//+------------------------------------------------------------------+ //| Kalman filter.mq4 | //| Copyright © 2006, iziogas@mail.com. | //+------------------------------------------------------------------+ #property copyright "iziogas@mail.com" //---- #property indicator_chart_window #property indicator_buffers 2 #property indicator_color1 Turquoise #property indicator_color2 Orange //---- indicator parameters //Mode description // 0: Close // 1: Open // 2: High // 3: Low // 4: Median (H+L/2) // 5: Typical (H+L+C/3) // 6: Weighted (H+L+C+C/4) extern int Mode=6; extern double K=1; extern double Sharpness=1; extern int draw_begin=500; //---- indicator buffers double ExtMapBufferUp[]; double ExtMapBufferDown[]; //---- int ExtCountedBars=0; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { //---- drawing settings SetIndexStyle(0,DRAW_LINE); SetIndexStyle(1,DRAW_LINE); IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS)); SetIndexDrawBegin(0,draw_begin); SetIndexDrawBegin(1,draw_begin); //---- indicator buffers mapping SetIndexBuffer(0,ExtMapBufferUp); SetIndexBuffer(1,ExtMapBufferDown); //---- initialization done return(0); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ double iValue(int mode, int shift) { switch(mode) { case 0: return(iClose(NULL,0,shift)); case 1: return(iOpen(NULL,0,shift)); case 2: return(iHigh(NULL,0,shift)); case 3: return(iLow(NULL,0,shift)); case 4: return((iHigh(NULL,0,shift)+iLow(NULL,0,shift))/2); case 5: return((iHigh(NULL,0,shift)+iLow(NULL,0,shift)+iClose(NULL,0,shift))/3); case 6: return((iHigh(NULL,0,shift)+iLow(NULL,0,shift)+iClose(NULL,0,shift)+iClose(NULL,0,shift))/4); default: return(0); } } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int start() { if(Bars<=draw_begin) return(0); //---- int i; //---- double Velocity=0; double Distance=0; double Error=0; double value=iValue(Mode,draw_begin+1); //---- for(i=draw_begin;i>=0;i--) { Distance=iValue(Mode,i) - value; Error=value + Distance * MathSqrt(Sharpness*K/100); Velocity=Velocity + Distance*K/100; value=Error+Velocity; //color lines if (Velocity>0) { ExtMapBufferUp[i]=value; //ExtMapBufferUp[i] = S; ExtMapBufferDown[i]=EMPTY_VALUE; //---- if (ExtMapBufferUp[i+1]==EMPTY_VALUE) ExtMapBufferUp[i+1]=ExtMapBufferDown[i+1]; } else { ExtMapBufferUp[i]=EMPTY_VALUE; ExtMapBufferDown[i]=value; //ExtMapBufferDown[i] = S; if (ExtMapBufferDown[i+1]==EMPTY_VALUE) ExtMapBufferDown[i+1]=ExtMapBufferUp[i+1]; } } //---- done return(0); } //+------------------------------------------------------------------+