Kalman filter

Zajímavý trendový indikátor.

 

 

//+——————————————————————+
//|                                                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);
}

Napsat komentář

Vaše emailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *