BandsFilter

Author: Copyright (c) 2005, Sergey Iljukhin, Novosibirsk
Price Data Components
Series array that contains close prices for each barSeries array that contains open prices of each barSeries array that contains the highest prices of each barSeries array that contains the lowest prices of each bar
Miscellaneous
Implements a curve of type %1
0 Views
0 Downloads
0 Favorites
BandsFilter
// ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØ
//|                        Digital Low Pass (FATL/SATL, KGLP) Filter          |
//|                      Copyright (c) Sergey Iljukhin, Novosibirsk.          |
//|                       email sergey[at]tibet.ru http://fx.qrz.ru/          |
//|   Óêðàøàòåëüñòâî faa1947:                                                 |
//|      äîáàâëåíû ïîëîñû Áîëëèíäæåðà                                         |
//|      ðàñêðàñêà                                                            |
//|      ñãëàæèâàíèå                                                          |
//|   Âåðñèÿ îò 24.02.2010                                                    |
// ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØ
#property copyright "Copyright (c) 2005, Sergey Iljukhin, Novosibirsk"
#property link      "http://fx.qrz.ru/"
// ---------------- Èìïîðòèðóåìûå áèáëèîòåêè ----------------------------------
#import  "DF.dll"
int      DigitalFilter(int      FType,
                       int      P1,
                       int      D1,
                       int      A1,
                       int      P2,
                       int      D2,
                       int      A2,
                       double   Ripple,
                       int      Delay,
                       double  &arr[]);
#import
//  -------------- Èíäèêàòîð â îñíîâíîì îêíå ----------------------------------
#property indicator_chart_window
// ---------------- Êîë-âî âèäèìûõ áóôåðîâ èíäèêàòîðà -------------------------
#property indicator_buffers               4
// ---------------- Óñòàíîâêà öâåòà èíäèêàòîðà --------------------------------
#property   indicator_color1              Gold
#property   indicator_color2              Red
#property   indicator_color3              LightSeaGreen
#property   indicator_color4              LightSeaGreen
// ---------------- Óñòàíîâêà øèðèíû ëèíèè -----------------------------------
#property   indicator_width1              2
#property   indicator_width2              2
#property   indicator_width3              1
#property   indicator_width4              1
//----------------- Âíåøíèå íàñòðîéêè èíäèêàòîðà ==========--------------------
extern   double   BandsDeviations         =  0.7;     // Âåëè÷èíà ñòàíäàðòíîãî îòêëîíåíèÿ
extern   int      BadsPeriod              =  14;      // Ïåðèîä äëÿ ðàñ÷åòà êàíàëà Áîëëèíäæåðà
int      BandsShift              =  0;       // Ñäâèã îòíîñèòåëüíî ãðàôèêà
                                             // ------------------- Âíåøíèå íàñòðîéêè ôèëüòðà ------------------------------
int      FType=0;
//                                           Òèï ôèëüòðà: 
//                                              0 - ÔÍ× (FATL/SATL/KGLP), 
//                                              1 - ÔÂ× (KGHP), 
//                                              2 - ïîëîñîâîé (RBCI/KGBP), 
//                                              3 - ðåæåêòîðíûé (KGBS)
extern   int      P1          =  40;   // Ïåðèîä îòñå÷êè
extern   int      D1          =  31;   // Ïåðèîä îòñå÷êè ïåðåõîäíîãî ïðîöåññà, áàð
extern   int      A1          =  50;   // Çàòóõàíèå â ïîëîñå çàäåðæêè , äá
int      P2          =  0;    // Ïåðèîä îòñå÷êè, áàð
int      D2          =  0;    // Ïåðèîä îòñå÷êè ïåðåõîäíîãî ïðîöåññà ,áàð
int      A2          =  0;    // Çàòóõàíèå â ïîëîñå çàäåðæêè, äá
double   Ripple=0.0864; // Áèåíèÿ â ïîëîñå ïðîïóñêàíèÿ, äá
extern   int      Delay       =  0;    // Çàäåðæêà â áàðàõ
int      BarShift    =  0;    // Ñäâèã ãðàôèêà, áàð. Ìèíóñ - íàçàä, ïëþñ - âïåðåä
extern   int      Deviation   =  0;    // Ñãëàæèâàåò ãðàôèê - ôëýò â èíäèêàòîðå        
string   _pr         =  "Öåíà 0-cl,1-op,2-hi,3-lo,4-med,5-typ,6-wtd";
extern   int      _price      =  0;

// --------------- Ïðèâÿçêà áóôåðîâ -------------------------------------------
double   FilterBuffer[];
double   long1[];
double   short1[];
double   UpperBuffer[];
double   LowerBuffer[];
double   trend[];
// --------------- Ðàáî÷èå ïåðåìåííûå -----------------------------------------
int      FilterOrder;
double   F[1000];
int      tf;
// ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØ
//| Digital filter indicator initialization function                          |
// ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØ
int init()
  {
// ------------------------ Âû÷èñëÿåì íàáîð êîýôôèöèåíòîâ öèôðîâîãî ôèëüòðà ---
   FilterOrder=DigitalFilter(FType,
                             P1,
                             D1,
                             A1,
                             P2,
                             D2,
                             A2,
                             Ripple,
                             Delay,
                             F);
// --------------- Êîë-âî áóôåðîâ èíäèêàòîðà ----------------------------------   
   IndicatorBuffers(6);
//---------- Óñòàíîâêà ïàðàìåòðîâ ðèñîâàíèÿ -----------------------------------
   SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,2);
   SetIndexStyle(1,DRAW_LINE,STYLE_SOLID,2);

   SetIndexDrawBegin(0,FilterOrder);
   SetIndexDrawBegin(1,FilterOrder);

   SetIndexStyle(2,DRAW_LINE);
   SetIndexDrawBegin(2,FilterOrder);
   SetIndexStyle(3,DRAW_LINE);
   SetIndexDrawBegin(3,FilterOrder+1);

// ----------------- Ïðèâÿçêà íîìåðà èíäèêàòîðà ê èìåíè -----------------------
   SetIndexBuffer          (0,   long1);               // Âèäèìûé áóôåð
   SetIndexBuffer          (1,   short1);              // Âèäèìûé áóôåð

   SetIndexBuffer          (2,   UpperBuffer);        // Âèäèìûé áóôåð
   SetIndexBuffer          (3,   LowerBuffer);        // Âèäèìûé áóôåð

   SetIndexBuffer          (4,   FilterBuffer);       // Ðàñ÷åòíûé áóôåð
   SetIndexBuffer          (5,   trend);              // Ðàñ÷åòíûé áóôåð

   SetIndexEmptyValue      (0,   0.0);
   SetIndexEmptyValue      (1,   0.0);
   SetIndexEmptyValue      (2,   0.0);
   SetIndexEmptyValue      (3,   0.0);

   IndicatorShortName("FilterBands");
//------------------ Ìåòêà äëÿ ëèíèè èíäèêàòîðà ---------------------
   SetIndexLabel(0,"SATL-long");
   SetIndexLabel(1,"SATL_short");
   SetIndexLabel(2,"long");
   SetIndexLabel(3,"short");
//----
   tf=Period();
   return(0);
  }
// ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØ
//| Digital filter main function                                              |
// ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØ
int start()
  {
   static   int      prevTF=0;
   int      i,j,k;
   double   res               =  0;
   double   deviation;
   double   sum,
   oldval,
   newres;
//----
   if(Bars<=FilterOrder) return(0);
//----
   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+FilterOrder+1;   
   
// --- Æäàòü òàéìôðåéì ãðàôèêà - ïðèíöèïèàëüíî óñêîðÿåò ðàáîòó èíäèêàòîðà -----

   i=limit;
   if(iTime(NULL,tf,1)!=prevTF)
     {
      prevTF=iTime(NULL,tf,1);
      while(i>=0)
        {
         res=0;
         for(j=0; j<FilterOrder; j++)
            res+=F[j]  *price(i+j);
         // ---------------- Ñãëàæèâàíèå, íî ëó÷øå Deviation ---------------------------
         //         FilterBuffer[i]    =  (1.5  *  response             + 
         //                                1.0  *  FilterBuffer[i+1]    + 
         //                                0.5  *  FilterBuffer[i+2])   / 3;
         // --------------------- êîíåö ñãëàæèâàíèÿ ------------------------------------         
         FilterBuffer[i]=NormalizeDouble(res,Digits);
         if(MathAbs(FilterBuffer[i]-FilterBuffer[i+1])<
            Deviation   *Point)
            FilterBuffer[i]=FilterBuffer[i+1];
/*
// ------------------- Ðàñêðàñêà ----------------------------------------------
            if(FilterBuffer[i]   <=  FilterBuffer[i+1])
            {
               long[i]             =  0.0;
               short[i]             =  response;
            }
            else
            {
               long[i]             =  response;
               short[i]             =  0.0;
            }
 -------------------- Êîíåö ðàñêðàñêè ---------------------------------------*/
         sum               =  0.0;
         k                 =  i  +  BadsPeriod -  1;
         oldval            =  FilterBuffer[i];
         while(k>=i)
           {
            newres=price(k)-oldval;
            sum+=newres   *newres;
            k--;
           }
         deviation         =  BandsDeviations   *  MathSqrt(sum   /  BadsPeriod);
         UpperBuffer[i]    =  oldval   +  deviation;
         LowerBuffer[i]    =  oldval   -  deviation;
         i--;
        }
      // <-- ðàñêðàøèâàåì 
      for(int x=limit; x>=0; x--)
        {
         trend[x]=trend[x+1];
         if(FilterBuffer[x]>FilterBuffer[x+1])
            trend[x]=1;
         if(FilterBuffer[x]<FilterBuffer[x+1])
            trend[x]=-1;

         if(trend[x]>0)
           {
            long1[x]=FilterBuffer[x];
            if(trend[x+1]<0)
               long1[x+1]                  =  FilterBuffer[x+1];
            short1[x]                      =  0.0;
           }
         else
         if(trend[x]<0)
           {
            short1[x]=FilterBuffer[x];
            if(trend[x+1]>0)
               short1[x+1]              =  FilterBuffer[x+1];
            long1[x]                    =  0.0;
           }
        }
      // ðàñêðàøèâàåì -->
      //-------------------------------------------------------------------------
     }
   return(0);
  }
// ------------- Ôóíêöèÿ ïîëó÷åíèÿ öåíû ïî åå òèïó ----------------------------
double price(int i=0)
  {
   double   rrr;
   if(_price==0)
      return(iClose(Symbol(),tf,i));
   if(_price==1)
      return(iOpen(Symbol(),tf,i));
   if(_price==2)
      return(iHigh(Symbol(),tf,i));
   if(_price==3)
      return(iLow(Symbol(),tf,i));
   if(_price==4)
     {
      rrr=(iLow(Symbol(),tf,i)+
           iHigh(Symbol(),tf,i))/2;
      return(rrr);
     }
   if(_price==5)
     {
      rrr=(iLow(Symbol(),tf,i)+
           iClose(Symbol(),tf,i)+
           iHigh(Symbol(),tf,i))/3;  // Òèïè÷íàÿ
      return(rrr);
     }
   if(_price==6)
     {
      rrr=(iLow(Symbol(),tf,i)+
           iClose(Symbol(),tf,i)+
           iClose(Symbol(),tf,i)+
           iHigh(Symbol(),tf,i))/4; // Âçâåøåííàÿ  
      return(rrr);
     }
   return(iClose(Symbol(),tf,i));
  }

// ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØ

/*

  Öèôðîâûå ôèëüòðû äëÿ MetaTrader 4.
 
  Âíèìàíèå! Äëÿ ðàáîòû òðåáóåòñÿ òðè äîïîëíèòåëüíûõ DLL 
  ñîäåðæàùèõ áëîê ìàòåìàòè÷åñêîé îáðàáîòêè - bdsp.dll, lapack.dll, mkl_sport.dll,
  êîòîðûå äîëæíû áûòü óñòàíîâëåíû â C:\Windows\System32\ 
  èëè ðÿäîì ñ DF.dll â \experts\libraries\
 
  Ïåðåä èñïîëüçîâàíèåì óáåäèòåñü:
  
  1. ÷òî óñòàíîâëåíû ïóíêòû "Allow DLL import" è "Confirm DLL function's call" â íàñòðîéêàõ Options->Expert Advisors
  2. ×òî â äèðåêòîðèè C:\Windows\System32\ èìåþòñÿ Bdsp.dll, lapack.dll, mkl_support.dll - âñïîìîãàòåëüíûå ìàòåìàòè÷åñêèå áèáëèîòåêè. 
 
  Îïèñàíèå âõîäíûõ ïàðàìåòðîâ:
  
  Ftype - Òèï ôèëüòðà: 0 - ÔÍ× (FATL/SATL/KGLP), 1 - ÔÂ× (KGHP), 
          2 - ïîëîñîâîé (RBCI/KGBP), 3 - ðåæåêòîðíûé (KGBS)
  P1 -    Ïåðèîä îòñå÷êè P1, áàð
  D1 -    Ïåðèîä îòñå÷êè ïåðåõîäíîãî ïðîöåññà D1, áàð
  A1 -    Çàòóõàíèå â ïîëîñå çàäåðæêè À1, äÁ
  P2 -    Ïåðèîä îòñå÷êè P2, áàð
  D2 -    Ïåðèîä îòñå÷êè ïåðåõîäíîãî ïðîöåññà D2, áàð
  A2 -    Çàòóõàíèå â ïîëîñå çàäåðæêè À2, äÁ
  Ripple - Áèåíèÿ â ïîëîñå ïðîïóñêàíèÿ, äÁ
  Delay - Çàäåðæêà, áàð

  Äëÿ ÔÍ× è ÔÂ× çíà÷åíèÿ ïàðàìåòðîé P2,D2,A2 èãíîðèðóþòñÿ
  Óñëîâèÿ ðàáîòû:
  ÔÍ×: P1>D1
  ÔÂ×: P1<D1
  Ïîëîñîâîé è ðåæåêòîðíûé: D2>P2>P1>D1

*/
//+------------------------------------------------------------------+

Comments