KalmanFilterStDev

Author: Copyright � 2015, Nikolay Kositsin
0 Views
0 Downloads
0 Favorites
KalmanFilterStDev
//+------------------------------------------------------------------+ 
//|                                            KalmanFilterStDev.mq5 | 
//|                    MQL5 code: Copyright © 2015, Nikolay Kositsin |
//|                              Khabarovsk,   farria@mail.redcom.ru | 
//+------------------------------------------------------------------+ 
#property copyright "Copyright © 2015, Nikolay Kositsin"
#property link "farria@mail.redcom.ru" 
//---- íîìåð âåðñèè èíäèêàòîðà
#property version   "1.00"
//---- îòðèñîâêà èíäèêàòîðà â ãëàâíîì îêíå
#property indicator_chart_window 
//---- äëÿ ðàñ÷¸òà è îòðèñîâêè èíäèêàòîðà èñïîëüçîâàíî øåñòü áóôåðîâ
#property indicator_buffers 6
//---- èñïîëüçîâàíî âñåãî ïÿòü ãðàôè÷åñêèõ ïîñòðîåíèé
#property indicator_plots   5
//+----------------------------------------------+
//|  Ïàðàìåòðû îòðèñîâêè èíäèêàòîðà KalmanFilter |
//+----------------------------------------------+
//---- îòðèñîâêà èíäèêàòîðà â âèäå ëèíèè
#property indicator_type1   DRAW_COLOR_LINE
//---- â êà÷åñòâå öâåòà ëèíèè èíäèêàòîðà èñïîëüçîâàíû
#property indicator_color1 clrOrange,clrTurquoise
//---- ëèíèÿ èíäèêàòîðà - íåïðåðûâíàÿ êðèâàÿ
#property indicator_style1  STYLE_SOLID
//---- òîëùèíà ëèíèè èíäèêàòîðà ðàâíà 2
#property indicator_width1  2
//---- îòîáðàæåíèå ìåòêè èíäèêàòîðà
#property indicator_label1  "KalmanFilter"
//+----------------------------------------------+
//|  Ïàðàìåòðû îòðèñîâêè ìåäâåæüåãî èíäèêàòîðà   |
//+----------------------------------------------+
//---- îòðèñîâêà èíäèêàòîðà 2 â âèäå ñèìâîëà
#property indicator_type2   DRAW_ARROW
//---- â êà÷åñòâå öâåòà ìåäâåæüåãî èíäèêàòîðà èñïîëüçîâàí ðîçîâûé öâåò
#property indicator_color2  clrDeepPink
//---- òîëùèíà ëèíèè èíäèêàòîðà 2 ðàâíà 2
#property indicator_width2  2
//---- îòîáðàæåíèå ìåäâåæüåé ìåòêè èíäèêàòîðà
#property indicator_label2  "Dn_Signal 1"
//+----------------------------------------------+
//|  Ïàðàìåòðû îòðèñîâêè áû÷üãî èíäèêàòîðà       |
//+----------------------------------------------+
//---- îòðèñîâêà èíäèêàòîðà 3 â âèäå ñèìâîëà
#property indicator_type3   DRAW_ARROW
//---- â êà÷åñòâå öâåòà áû÷üåãî èíäèêàòîðà èñïîëüçîâàí çåë¸íûé öâåò
#property indicator_color3  clrTeal
//---- òîëùèíà ëèíèè èíäèêàòîðà 3 ðàâíà 2
#property indicator_width3  2
//---- îòîáðàæåíèå áû÷åé ìåòêè èíäèêàòîðà
#property indicator_label3  "Up_Signal 1"
//+----------------------------------------------+
//|  Ïàðàìåòðû îòðèñîâêè ìåäâåæüåãî èíäèêàòîðà   |
//+----------------------------------------------+
//---- îòðèñîâêà èíäèêàòîðà 4 â âèäå ñèìâîëà
#property indicator_type4   DRAW_ARROW
//---- â êà÷åñòâå öâåòà ìåäâåæüåãî èíäèêàòîðà èñïîëüçîâàí ðîçîâûé öâåò
#property indicator_color4  clrDeepPink
//---- òîëùèíà ëèíèè èíäèêàòîðà 4 ðàâíà 5
#property indicator_width4  5
//---- îòîáðàæåíèå ìåäâåæüåé ìåòêè èíäèêàòîðà
#property indicator_label4  "Dn_Signal 2"
//+----------------------------------------------+
//|  Ïàðàìåòðû îòðèñîâêè áû÷üãî èíäèêàòîðà       |
//+----------------------------------------------+
//---- îòðèñîâêà èíäèêàòîðà 5 â âèäå ñèìâîëà
#property indicator_type5   DRAW_ARROW
//---- â êà÷åñòâå öâåòà áû÷üåãî èíäèêàòîðà èñïîëüçîâàí çåë¸íûé öâåò
#property indicator_color5  clrTeal
//---- òîëùèíà ëèíèè èíäèêàòîðà 5 ðàâíà 5
#property indicator_width5  5
//---- îòîáðàæåíèå áû÷åé ìåòêè èíäèêàòîðà
#property indicator_label5  "Up_Signal 2"
//+----------------------------------------------+
//|  ÎÁÚßÂËÅÍÈÅ ÏÅÐÅ×ÈÑËÅÍÈÉ                     |
//+----------------------------------------------+
enum Applied_price_ //Òèï êîíñòàíòû
  {
   PRICE_CLOSE_ = 1,     //Close
   PRICE_OPEN_,          //Open
   PRICE_HIGH_,          //High
   PRICE_LOW_,           //Low
   PRICE_MEDIAN_,        //Median Price (HL/2)
   PRICE_TYPICAL_,       //Typical Price (HLC/3)
   PRICE_WEIGHTED_,      //Weighted Close (HLCC/4)
   PRICE_SIMPL_,         //Simpl Price (OC/2)
   PRICE_QUARTER_,       //Quarted Price (HLOC/4) 
   PRICE_TRENDFOLLOW0_,  //TrendFollow_1 Price 
   PRICE_TRENDFOLLOW1_,  // TrendFollow_2 Price 
   PRICE_DEMARK_         // Demark Price
  };
//+----------------------------------------------+
//|  ÎÁÚßÂËÅÍÈÅ ÏÅÐÅ×ÈÑËÅÍÈÉ                     |
//+----------------------------------------------+  
enum Signal_mode
  {
   Trend, //ïî òðåíäó
   Kalman //ïî Êàëüìàíó
  };
//+----------------------------------------------+
//|  ÂÕÎÄÍÛÅ ÏÀÐÀÌÅÒÐÛ ÈÍÄÈÊÀÒÎÐÀ                |
//+----------------------------------------------+
input double K=1.0; // êîýôôèöèåíò ñãëàæèâàíèÿ                   
input Applied_price_ IPC=PRICE_WEIGHTED_;//öåíîâàÿ êîíñòàíòà
input Signal_mode Signal=Kalman; //ìåòîä èçìåíåíèÿ îêðàñêè ëèíèè
input int Shift=0; // ñäâèã èíäèêàòîðà ïî ãîðèçîíòàëè â áàðàõ
input int PriceShift=0; // cäâèã èíäèêàòîðà ïî âåðòèêàëè â ïóíêòàõ
input double dK1=1.5;  //êîýôôèöèåíò 1 äëÿ êâàäðàòè÷íîãî ôèëüòðà
input double dK2=2.5;  //êîýôôèöèåíò 2 äëÿ êâàäðàòè÷íîãî ôèëüòðà
input uint std_period=9; //ïåðèîä êâàäðàòè÷íîãî ôèëüòðà
//+----------------------------------------------+
//---- îáúÿâëåíèå äèíàìè÷åñêèõ ìàññèâîâ, êîòîðûå áóäóò â 
// äàëüíåéøåì èñïîëüçîâàíû â êà÷åñòâå èíäèêàòîðíûõ áóôåðîâ
double ExtLineBuffer[],ColorExtLineBuffer[];
double BearsBuffer1[],BullsBuffer1[];
double BearsBuffer2[],BullsBuffer2[];
//----
double dPriceShift,Sqrt100,K100,dKalman[];
//---- îáúÿâëåíèå öåëî÷èñëåííûõ ïåðåìåííûõ íà÷àëà îòñ÷åòà äàííûõ
int min_rates_total;
//+------------------------------------------------------------------+    
//| KalmanFilter indicator initialization function                   | 
//+------------------------------------------------------------------+  
void OnInit()
  {
//---- Èíèöèàëèçàöèÿ ïåðåìåííûõ íà÷àëà îòñ÷¸òà äàííûõ
   min_rates_total=2+int(std_period);

//---- Èíèöèàëèçàöèÿ ïåðåìåííûõ   
   Sqrt100=MathSqrt(K/100);
   K100=K/100.0;

//---- Èíèöèàëèçàöèÿ ñäâèãà ïî âåðòèêàëè
   dPriceShift=_Point*PriceShift;

//---- Ðàñïðåäåëåíèå ïàìÿòè ïîä ìàññèâû ïåðåìåííûõ  
   ArrayResize(dKalman,std_period);

//---- ïðåâðàùåíèå äèíàìè÷åñêîãî ìàññèâà â èíäèêàòîðíûé áóôåð
   SetIndexBuffer(0,ExtLineBuffer,INDICATOR_DATA);
//---- îñóùåñòâëåíèå ñäâèãà èíäèêàòîðà ïî ãîðèçîíòàëè íà Shift
   PlotIndexSetInteger(0,PLOT_SHIFT,Shift);
//---- îñóùåñòâëåíèå ñäâèãà íà÷àëà îòñ÷¸òà îòðèñîâêè èíäèêàòîðà
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,min_rates_total);
//---- óñòàíîâêà çíà÷åíèé èíäèêàòîðà, êîòîðûå íå áóäóò âèäèìû íà ãðàôèêå
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,EMPTY_VALUE);

//---- ïðåâðàùåíèå äèíàìè÷åñêîãî ìàññèâà â öâåòîâîé, èíäåêñíûé áóôåð   
   SetIndexBuffer(1,ColorExtLineBuffer,INDICATOR_COLOR_INDEX);

//---- ïðåâðàùåíèå äèíàìè÷åñêîãî ìàññèâà BearsBuffer â èíäèêàòîðíûé áóôåð
   SetIndexBuffer(2,BearsBuffer1,INDICATOR_DATA);
//---- îñóùåñòâëåíèå ñäâèãà èíäèêàòîðà 2 ïî ãîðèçîíòàëè
   PlotIndexSetInteger(1,PLOT_SHIFT,Shift);
//---- îñóùåñòâëåíèå ñäâèãà íà÷àëà îòñ÷¸òà îòðèñîâêè èíäèêàòîðà
   PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,min_rates_total);
//---- âûáîð ñèìâîëà äëÿ îòðèñîâêè
   PlotIndexSetInteger(1,PLOT_ARROW,159);
//---- çàïðåò íà îòðèñîâêó èíäèêàòîðîì ïóñòûõ çíà÷åíèé
   PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,EMPTY_VALUE);

//---- ïðåâðàùåíèå äèíàìè÷åñêîãî ìàññèâà BullsBuffer â èíäèêàòîðíûé áóôåð
   SetIndexBuffer(3,BullsBuffer1,INDICATOR_DATA);
//---- îñóùåñòâëåíèå ñäâèãà èíäèêàòîðà 3 ïî ãîðèçîíòàëè
   PlotIndexSetInteger(2,PLOT_SHIFT,Shift);
//---- îñóùåñòâëåíèå ñäâèãà íà÷àëà îòñ÷¸òà îòðèñîâêè èíäèêàòîðà
   PlotIndexSetInteger(2,PLOT_DRAW_BEGIN,min_rates_total);
//---- âûáîð ñèìâîëà äëÿ îòðèñîâêè
   PlotIndexSetInteger(2,PLOT_ARROW,159);
//---- çàïðåò íà îòðèñîâêó èíäèêàòîðîì ïóñòûõ çíà÷åíèé
   PlotIndexSetDouble(2,PLOT_EMPTY_VALUE,EMPTY_VALUE);

//---- ïðåâðàùåíèå äèíàìè÷åñêîãî ìàññèâà BearsBuffer â èíäèêàòîðíûé áóôåð
   SetIndexBuffer(4,BearsBuffer2,INDICATOR_DATA);
//---- îñóùåñòâëåíèå ñäâèãà èíäèêàòîðà 2 ïî ãîðèçîíòàëè
   PlotIndexSetInteger(3,PLOT_SHIFT,Shift);
//---- îñóùåñòâëåíèå ñäâèãà íà÷àëà îòñ÷¸òà îòðèñîâêè èíäèêàòîðà
   PlotIndexSetInteger(3,PLOT_DRAW_BEGIN,min_rates_total);
//---- âûáîð ñèìâîëà äëÿ îòðèñîâêè
   PlotIndexSetInteger(3,PLOT_ARROW,159);
//---- çàïðåò íà îòðèñîâêó èíäèêàòîðîì ïóñòûõ çíà÷åíèé
   PlotIndexSetDouble(3,PLOT_EMPTY_VALUE,EMPTY_VALUE);

//---- ïðåâðàùåíèå äèíàìè÷åñêîãî ìàññèâà BullsBuffer â èíäèêàòîðíûé áóôåð
   SetIndexBuffer(5,BullsBuffer2,INDICATOR_DATA);
//---- îñóùåñòâëåíèå ñäâèãà èíäèêàòîðà 3 ïî ãîðèçîíòàëè
   PlotIndexSetInteger(4,PLOT_SHIFT,Shift);
//---- îñóùåñòâëåíèå ñäâèãà íà÷àëà îòñ÷¸òà îòðèñîâêè èíäèêàòîðà
   PlotIndexSetInteger(4,PLOT_DRAW_BEGIN,min_rates_total);
//---- âûáîð ñèìâîëà äëÿ îòðèñîâêè
   PlotIndexSetInteger(4,PLOT_ARROW,159);
//---- çàïðåò íà îòðèñîâêó èíäèêàòîðîì ïóñòûõ çíà÷åíèé
   PlotIndexSetDouble(4,PLOT_EMPTY_VALUE,EMPTY_VALUE);
//---- èíèöèàëèçàöèè ïåðåìåííîé äëÿ êîðîòêîãî èìåíè èíäèêàòîðà
   string shortname;
   StringConcatenate(shortname,"KalmanFilterStDev(",DoubleToString(K,2),")");
//--- ñîçäàíèå èìåíè äëÿ îòîáðàæåíèÿ â îòäåëüíîì ïîäîêíå è âî âñïëûâàþùåé ïîäñêàçêå
   IndicatorSetString(INDICATOR_SHORTNAME,shortname);
//--- îïðåäåëåíèå òî÷íîñòè îòîáðàæåíèÿ çíà÷åíèé èíäèêàòîðà
   IndicatorSetInteger(INDICATOR_DIGITS,_Digits+1);
//---- çàâåðøåíèå èíèöèàëèçàöèè
  }
//+------------------------------------------------------------------+  
//| KalmanFilter iteration function                                  | 
//+------------------------------------------------------------------+  
int OnCalculate(
                const int rates_total,    // êîëè÷åñòâî èñòîðèè â áàðàõ íà òåêóùåì òèêå
                const int prev_calculated,// êîëè÷åñòâî èñòîðèè â áàðàõ íà ïðåäûäóùåì òèêå
                const datetime &time[],
                const double &open[],
                const double& high[],     // öåíîâîé ìàññèâ ìàêñèìóìîâ öåíû äëÿ ðàñ÷¸òà èíäèêàòîðà
                const double& low[],      // öåíîâîé ìàññèâ ìèíèìóìîâ öåíû  äëÿ ðàñ÷¸òà èíäèêàòîðà
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[]
                )
  {
//---- ïðîâåðêà êîëè÷åñòâà áàðîâ íà äîñòàòî÷íîñòü äëÿ ðàñ÷¸òà
   if(rates_total<min_rates_total)return(0);

//---- Îáúÿâëåíèå ëîêàëüíûõ ïåðåìåííûõ
   int first,bar;
   double Velocity,Distance,Error;
   static double Velocity_;
   double Kalman,SMAdif,Sum,StDev,dstd,BEARS1,BULLS1,BEARS2,BULLS2,Filter1,Filter2;
//----

   if(prev_calculated>rates_total || prev_calculated<=0) // ïðîâåðêà íà ïåðâûé ñòàðò ðàñ÷¸òà èíäèêàòîðà
     {
      first=1; // ñòàðòîâûé íîìåð äëÿ ðàñ÷¸òà âñåõ áàðîâ
      //---- Èíèöèàëèçàöèÿ êîýôôèöèåíòîâ
      ExtLineBuffer[first-1]=PriceSeries(IPC,first-1,open,low,high,close);
      Velocity_=0.0;
     }
   else first=prev_calculated-1; // ñòàðòîâûé íîìåð äëÿ ðàñ÷¸òà íîâûõ áàðîâ

//---- âîññòàíàâëèâàåì çíà÷åíèÿ ïåðåìåííûõ
   Velocity=Velocity_;

//---- îñíîâíîé öèêë ðàñ÷¸òà èíäèêàòîðà
   for(bar=first; bar<rates_total; bar++)
     {
      //---- çàïîìèíàåì çíà÷åíèÿ ïåðåìåííûõ ïåðåä ïðîãîíàìè íà òåêóùåì áàðå
      if(rates_total!=prev_calculated && bar==rates_total-1)
        {
         Velocity_=Velocity;
        }

      Distance=PriceSeries(IPC,bar,open,low,high,close)-ExtLineBuffer[bar-1];
      Error=ExtLineBuffer[bar-1]+Distance*Sqrt100;
      Velocity+=Distance*K100;
      ExtLineBuffer[bar]=Error+Velocity+dPriceShift;

      if(Signal==Trend)
        {
         if(ExtLineBuffer[bar-1]>ExtLineBuffer[bar]) ColorExtLineBuffer[bar]=0;
         else ColorExtLineBuffer[bar]=1;
        }
      else
        {
         if(Velocity>0) ColorExtLineBuffer[bar]=1;
         else           ColorExtLineBuffer[bar]=0;
        }
     }
//---- ïåðåñ÷¸ò ñòàðòîâîãî íîìåðà first äëÿ öèêëà ïåðåñ÷¸òà áàðîâ
   if(prev_calculated>rates_total || prev_calculated<=0) // ïðîâåðêà íà ïåðâûé ñòàðò ðàñ÷¸òà èíäèêàòîðà
      first=min_rates_total;
//---- îñíîâíîé öèêë ðàñ÷¸òà èíäèêàòîðà ñòàíäàðòíûõ îòêëîíåíèé
   for(bar=first; bar<rates_total && !IsStopped(); bar++)
     {
      //---- çàãðóæàåì ïðèðàùåíèÿ èíäèêàòîðà â ìàññèâ äëÿ ïðîìåæóòî÷íûõ âû÷èñëåíèé
      for(int iii=0; iii<int(std_period); iii++) dKalman[iii]=ExtLineBuffer[bar-iii]-ExtLineBuffer[bar-iii-1];

      //---- íàõîäèì ïðîñòîå ñðåäíåå ïðèðàùåíèé èíäèêàòîðà
      Sum=0.0;
      for(int iii=0; iii<int(std_period); iii++) Sum+=dKalman[iii];
      SMAdif=Sum/std_period;

      //---- íàõîäèì ñóììó êâàäðàòîâ ðàçíîñòåé ïðèðàùåíèé è ñðåäíåãî
      Sum=0.0;
      for(int iii=0; iii<int(std_period); iii++) Sum+=MathPow(dKalman[iii]-SMAdif,2);

      //---- îïðåäåëÿåì èòîãîâîå çíà÷åíèå ñðåäíåêâàäðàòè÷íîãî îòêëîíåíèÿ StDev îò ïðèðàùåíèÿ èíäèêàòîðà
      StDev=MathSqrt(Sum/std_period);

      //---- èíèöèàëèçàöèÿ ïåðåìåííûõ
      dstd=NormalizeDouble(dKalman[0],_Digits+2);
      Filter1=NormalizeDouble(dK1*StDev,_Digits+2);
      Filter2=NormalizeDouble(dK2*StDev,_Digits+2);
      BEARS1=EMPTY_VALUE;
      BULLS1=EMPTY_VALUE;
      BEARS2=EMPTY_VALUE;
      BULLS2=EMPTY_VALUE;
      Kalman=ExtLineBuffer[bar];

      //---- âû÷èñëåíèå èíäèêàòîðíûõ çíà÷åíèé
      if(dstd<-Filter1 && dstd>=-Filter2) BEARS1=Kalman; //åñòü íèñõîäÿùèé òðåíä
      if(dstd<-Filter2) BEARS2=Kalman; //åñòü íèñõîäÿùèé òðåíä
      if(dstd>+Filter1 && dstd<=+Filter2) BULLS1=Kalman; //åñòü âîñõîäÿùèé òðåíä
      if(dstd>+Filter2) BULLS2=Kalman; //åñòü âîñõîäÿùèé òðåíä

      //---- èíèöèàëèçàöèÿ ÿ÷ååê èíäèêàòîðíûõ áóôåðîâ ïîëó÷åííûìè çíà÷åíèÿìè 
      BullsBuffer1[bar]=BULLS1;
      BearsBuffer1[bar]=BEARS1;
      BullsBuffer2[bar]=BULLS2;
      BearsBuffer2[bar]=BEARS2;
     }
//----     
   return(rates_total);
  }
//+------------------------------------------------------------------+   
//| Ïîëó÷åíèå çíà÷åíèÿ öåíîâîé òàéìñåðèè                             |
//+------------------------------------------------------------------+ 
double PriceSeries
(
 uint applied_price,// Öåíîâàÿ êîíñòàíòà
 uint   bar,// Èíäåêñ ñäâèãà îòíîñèòåëüíî òåêóùåãî áàðà íà óêàçàííîå êîëè÷åñòâî ïåðèîäîâ íàçàä èëè âïåð¸ä).
 const double &Open[],
 const double &Low[],
 const double &High[],
 const double &Close[]
 )
//PriceSeries(applied_price, bar, open, low, high, close)
//+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -+
  {
//----
   switch(applied_price)
     {
      //---- Öåíîâûå êîíñòàíòû èç ïåðå÷èñëåíèÿ ENUM_APPLIED_PRICE
      case  PRICE_CLOSE: return(Close[bar]);
      case  PRICE_OPEN: return(Open [bar]);
      case  PRICE_HIGH: return(High [bar]);
      case  PRICE_LOW: return(Low[bar]);
      case  PRICE_MEDIAN: return((High[bar]+Low[bar])/2.0);
      case  PRICE_TYPICAL: return((Close[bar]+High[bar]+Low[bar])/3.0);
      case  PRICE_WEIGHTED: return((2*Close[bar]+High[bar]+Low[bar])/4.0);

      //----                            
      case  8: return((Open[bar] + Close[bar])/2.0);
      case  9: return((Open[bar] + Close[bar] + High[bar] + Low[bar])/4.0);
      //----                                
      case 10:
        {
         if(Close[bar]>Open[bar])return(High[bar]);
         else
           {
            if(Close[bar]<Open[bar])
               return(Low[bar]);
            else return(Close[bar]);
           }
        }
      //----         
      case 11:
        {
         if(Close[bar]>Open[bar])return((High[bar]+Close[bar])/2.0);
         else
           {
            if(Close[bar]<Open[bar])
               return((Low[bar]+Close[bar])/2.0);
            else return(Close[bar]);
           }
         break;
        }
      //----
      default: return(Close[bar]);
     }
//----
//return(0);
  }
//+------------------------------------------------------------------+

Comments

Markdown supported. Formatting help

Markdown Formatting Guide

Element Markdown Syntax
Heading # H1
## H2
### H3
Bold **bold text**
Italic *italicized text*
Link [title](https://www.example.com)
Image ![alt text](image.jpg)
Code `code`
Code Block ```
code block
```
Quote > blockquote
Unordered List - Item 1
- Item 2
Ordered List 1. First item
2. Second item
Horizontal Rule ---