// ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØ
//|                        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