DigitalFilterTF





//------------------------------------------------------------------
//  Digital Filter
//  Dmitry Yakovlev 
//  dmitry_yakovlev@rambler.ru
//  WebMoney R865705290089
//------------------------------------------------------------------
//  Original DF.dll 
//  copyright "Copyright (c) 2005, Sergey Iljukhin, Novosibirsk"
//  "mailto:sergey@tibet.ru"
//------------------------------------------------------------------
#property copyright "Dmitry Yakovlev, Russia,Omsk, WM R865705290089"
#property link      "dmitry_yakovlev@rambler.ru"

#property indicator_chart_window
#property indicator_buffers 4
#property indicator_color1 CLR_NONE
#property indicator_color2 Lime
#property indicator_color3 Red
#property indicator_width1 0
#property indicator_width2 2
#property indicator_width3 2

#import  "shell32.dll"           //Connect a dll (provided with Windows)             
  int ShellExecuteA(int hwnd,string Operation,string File,string Parameters,string Directory,int ShowCmd); 
#import "user32.dll"
  int MessageBoxA(int hWnd ,string lpText,string lpCaption,int uType);
#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

/*

  Öèôðîâûå ôèëüòðû äëÿ MetaTrader 4.
 
  Âíèìàíèå! Äëÿ ðàáîòû òðåáóåòñÿ òðè äîïîëíèòåëüíûõ DLL 
  ñîäåðæàùèõ áëîê ìàòåìàòè÷åñêîé îáðàáîòêè - bdsp.dll, lapack.dll, mkl_support.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

*/

extern string  _tf="Òàéìôðåéì (0-òåêóùèé)";
extern int     tf=0;
extern string  _pr="Öåíà 0-cl,1-op,2-hi,3-lo";
extern int     pr=0;
extern string  _par="Preset 0-User,1-FATL,2-SATL,3-RFTL,4-RSTL";
extern int     preset=0;
extern string  _filt="Óêàçûâàåì ïàðàìåòðû ôèëüòðà";
extern int     FType=0;
extern int     P1=14;
extern int     D1=10;
extern int     A1=40;
extern int     P2=0;
extern int     D2=0;
extern int     A2=0;
extern int     Delay=0;
extern double  Ripple=0.08; 
extern int     BarShift=0; // Ñäâèã ãðàôèêà, áàð. Ìèíóñ - íàçàä, ïëþñ - âïåðåä
extern string  _donate1="Äëÿ $ áëàãîäàðíîñòè:";
extern string  _donate2="R865705290089";

//---- indicator buffers
double iBuffer[];
double up[];
double dn[];
double trend[];
//------

int FilterSize=0;
double F[1500];
//---

int init()
{
   CheckDonate();
   if(tf<Period()) tf=Period();

   if(preset==1) // FATL
   {
      FType=0;
      P1=14;
      D1=10;
      A1=40;
      P2=0;
      D2=0;
      A2=0;
      Delay=0;
      Ripple=0.08; 
      BarShift=0; // Ñäâèã ãðàôèêà, áàð. Ìèíóñ - íàçàä, ïëþñ - âïåðåä
   }
   if(preset==2) // SATL
   {
      FType=0;
      P1=52;
      D1=32;
      A1=40;
      P2=0;
      D2=0;
      A2=0;
      Delay=0;
      Ripple=0.08; 
      BarShift=0; // Ñäâèã ãðàôèêà, áàð. Ìèíóñ - íàçàä, ïëþñ - âïåðåä
   }
   // --- Parameters: P1=14, D1=10, A1=40
   // --- P2=52, D2=32, A2=40, Ripple=0.0864, Delay=5
   // --- Order [Auto]=40, Calculate method=2
   if(preset==3) // RFTL
   {
      FType=0;
      P1=14;
      D1=10;
      A1=40;
      P2=0;
      D2=0;
      A2=0;
      Delay=5;
      Ripple=0.08; 
      BarShift=0; // Ñäâèã ãðàôèêà, áàð. Ìèíóñ - íàçàä, ïëþñ - âïåðåä
   }
   // --- Parameters: P1=52, D1=32, A1=40
   // --- P2=52, D2=32, A2=40, Ripple=0.0864, Delay=15
   // --- Order [Auto]=97, Calculate method=2
   if(preset==4) // RSTL
   {
      FType=0;
      P1=52;
      D1=32;
      A1=40;
      P2=0;
      D2=0;
      A2=0;
      Delay=15;
      Ripple=0.08; 
      BarShift=0; // Ñäâèã ãðàôèêà, áàð. Ìèíóñ - íàçàä, ïëþñ - âïåðåä
   }

   IndicatorBuffers(4);
   //---- indicator line
   SetIndexStyle(0,DRAW_NONE);
   SetIndexBuffer(0,iBuffer);

   SetIndexStyle(1,DRAW_LINE,STYLE_SOLID,2);
   SetIndexBuffer(1,up);
   SetIndexLabel(1,"Up");

   SetIndexStyle(2,DRAW_LINE,STYLE_SOLID,2);
   SetIndexBuffer(2,dn);
   SetIndexLabel(2,"Dn");
   
   SetIndexStyle(3,DRAW_NONE);
   SetIndexBuffer(3,trend);
   SetIndexLabel(3,"trend");

   ArraySetAsSeries(iBuffer, true); 
   ArraySetAsSeries(trend, true);

   // Âû÷èñëÿåì öèôðîâîé ôèëüòð
   FilterSize=DigitalFilter(FType, P1, D1, A1, P2, D2, A2, Ripple, Delay, F); 

   return(0);
}

double price(int i=0)
{
   if(pr==0) return(iClose(Symbol(),tf,i));
   else if(pr==1) return(iOpen(Symbol(),tf,i));
   else if(pr==2) return(iHigh(Symbol(),tf,i));
   else if(pr==3) return(iLow(Symbol(),tf,i));
}

//+------------------------------------------------------------------+
//| Digital filter main function                                     |
//+------------------------------------------------------------------+
int start()
{
   int k, nn, nn1, i, j, counted_bars=IndicatorCounted();
   int koef=(tf/Period());
   double res=0, step=0;
   // <--- ðàñ÷èòûâàåì çíà÷åíèÿ èíäèêàòîðà
   if (FilterSize>0)
   {
      if(Bars<=FilterSize) return(0);
      //-------------------------------
      i=(Bars-counted_bars+FilterSize-1)/koef+1;
      //-------------------------------
      while(i>=0)
      {
         res=0;
         for (j=0; j<FilterSize; j++)
            res+=F[j]*price(i+j);
         
         nn=i*koef;
         if(nn!=-1) iBuffer[nn]=res;
         
         nn1=(i+1)*koef;
         if(nn!=-1 && nn1!=-1 && iBuffer[nn1]!=EMPTY_VALUE && iBuffer[nn1]!=0)
         {
            step=(iBuffer[nn1]-iBuffer[nn])/koef;
            for(k=1;k<koef;k++) iBuffer[k+nn]=iBuffer[nn]+step*k;
         }
         i--;
      }
   } else return;
   // ðàñ÷èòûâàåì -->
   //-------------------------------------------------------------------------
   // <-- ðàñêðàøèâàåì 
   for(int x=Bars;x>=0;x--)
   {
      trend[x] = trend[x+1];
      if (iBuffer[x]> iBuffer[x+1]) trend[x] =1;
      if (iBuffer[x]< iBuffer[x+1]) trend[x] =-1;
 
      if (trend[x]>0)
      { up[x] = iBuffer[x]; 
        if (trend[x+1]<0) up[x+1]=iBuffer[x+1];
        dn[x] = EMPTY_VALUE;
      }
      else              
      if (trend[x]<0)
      { 
        dn[x] = iBuffer[x]; 
        if (trend[x+1]>0) dn[x+1]=iBuffer[x+1];
        up[x] = EMPTY_VALUE;
      }              
   }
   // ðàñêðàøèâàåì -->
   //-------------------------------------------------------------------------
   return(0);
}

void CheckDonate()
{
   int fd=0; string pay="0"; datetime dt=0;
   string fn="DigitalFilterTF.txt";
   fd=FileOpen(fn,FILE_READ|FILE_CSV,";");
   if(fd>=1)
   {
      pay=FileReadString(fd); if(pay!="0" && pay!="1") pay="0";
      dt=StrToTime(FileReadString(fd));
   }
   else
   {
      dt=TimeCurrent();
      fd=FileOpen(fn,FILE_WRITE|FILE_CSV,";");
      FileWrite(fd,"0",TimeToStr(dt,TIME_DATE));
   }
   FileClose(fd);
   
   if(pay=="0" && (TimeCurrent()-dt)>10*24*60*60) // 5 äíåé
   {
      if(MessageBoxA(0,"Åñëè Âàì ïîíðàâèëñÿ èíäèêàòîð DigitalFilterTF,\n õîòèòå ïîìî÷ü àâòîðó ìàòåðèàëüíî?","Âîïðîñ",4)==6)
      {
         ShellExecuteA(0,"Open","iexplore.exe","wmk:payto?Purse=R865705290089&Amount=100&Desc=Indicator&BringToFront=Y&ExecEvenKeeperIsOffline=Y","",7);
         pay="1";
      }
      dt=TimeCurrent();
      
      fd=FileOpen(fn,FILE_WRITE|FILE_CSV,";");
      FileWrite(fd,pay,TimeToStr(dt,TIME_DATE));
      FileClose(fd);
   }
   FileClose(fd);
}






Sample





Analysis



Market Information Used:

Series array that contains close prices for each bar
Series array that contains open prices of each bar
Series array that contains the highest prices of each bar
Series array that contains the lowest prices of each bar


Indicator Curves created:

Implements a curve of type DRAW_NONE

Implements a curve of type DRAW_LINE

Indicators Used:



Custom Indicators Used:
shell32
user32
DF

Order Management characteristics:

Other Features:

Uses files from the file system
It reads information from a file
It writes information to file