Цифровые фильтры. FATL

Программирование прибыли: от азов к секретам мастерства. Читайте, спрашивайте, делитесь опытом.
Бонус за сообщение 0.5$
Ответственный Модератор - Haos

Цифровые фильтры. FATL

Сообщение Haos » 25 апр 2018, 09:34

FATL (Fast Adaptive Trend Line) - является трендовым индикатором. Это аналог быстрой скользящей средней − «быстрая» адаптивная трендовая линия. FATL рассчитан с использованием низкочастотного цифрового фильтра.
FATL – это статистическая оценка линии краткосрочного тренда, которая, в отличие от традиционной скользящей средней, не имеет фазового запаздывания относительно текущих цен.
Значение FATL(i) является матожиданием цены Сlose(i), где i − номер торгового периода;
В настоящее время код семейства цифровых фильтров, в которые входит FATL давно раскрыт и мы можем рассмотреть его:

Код: выделить все
//------------------------------------------------------------------
//  FATL
//------------------------------------------------------------------
// --- Parameters DF:
// FATL:   P1=14, D1=10, A1=40, P2=41, D2=31, A2=10, Ripple=0.0864, Delay=0

#property copyright ""
#property link      ""

#property indicator_chart_window
#property indicator_buffers 4
#property indicator_color1 Black
#property indicator_color2 Blue
#property indicator_color3 Red
#property indicator_width1 0
#property indicator_width2 2
#property indicator_width3 2

//------------------------------------------------------------------------------------------------------

// ПАРАМЕТРЫ
extern string  _tf="Таймфрейм (0-текущий)";
extern int     tf=0;
extern string  _pr="Цена 0-cl,1-op,2-hi,3-lo";
extern int     pr=0;

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

double F[]=
{
0.342152940854,+0.3093292710818,+0.2494886026077,+0.1729967470992,+0.0925637619799,+0.02063133334364,-0.0330807757871,
-0.0633224564657,-0.0699201252728,-0.0571825815615,-0.0326138365275,-0.00472222203391,+0.01887417755416,+0.0330626229331,
+0.0359799385551,+0.02892153255004,+0.01547756053013,+0.0002774619935816,-0.01239612720349,-0.01962143471368,
-0.02040646532991,-0.01564282987562,-0.00754279142733,+0.001162950482821,+0.00803410120806,+0.01154650780504,
+0.01135097902722,+0.00815882017765,+0.00337147099221,-0.001454786740187,-0.00509465397315,-0.00705602263847,
-0.00791744078702,-0.00996601702916,+0.00455978659094
};
int FilterSize=0;
//+------------------------------------------------------------------+
//| Digital filter indicator initialization function                 |
//+------------------------------------------------------------------+
int init()
{
   
   FilterSize=ArraySize(F);
   
   if(tf<Period()) tf=Period();
   if(pr>1)pr=0;
//---- indicator line

   IndicatorShortName("FATL-"+tf);
   
   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);
//----
   return(0);
}
//+------------------------------------------------------------------+
double price(int i)
{
   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));
return(0);
}

//+------------------------------------------------------------------+
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)/koef+1;
      //-------------------------------
      while(i>=0)
      {
         res=0;
         for (j=0; j<FilterSize; j++)
            res+=F[j]*price(i+j);
         
         nn=i*koef;
         iBuffer[nn]=res;//NormalizeDouble(res,Digits);
         
         nn1=(i+1)*koef;
         if(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(0);
   // расчитываем -->
   //-------------------------------------------------------------------------
   // <-- раскрашиваем
   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);
}

Данный индикатор строит на графике линию двух цветов, которые символизируют бычью или медвежью тенденции:

FATL-01.png

На приведенном скрине (см. скрин выше) зеленого цвета линия соответствует бычьему тренду, а красного цвета линия соответствует медвежьему тренду.
Аватар пользователя
Haos
Специалист MQL
 
Сообщений: 24699
Зарегистрирован: 29 мар 2014, 16:07
Средств на руках: 193.70 Доллар
Группа: Главные модераторы
Благодарил (а): 3379 раз.
Поблагодарили: 8200 раз.

Цифровые фильтры. FATL

Сообщение Haos » 25 апр 2018, 17:23

Вот также, один из первых кодов индикатора FATL. Здесь просто линия. Это один из самых простых кодов этого индикатора. Версия 2005 г.
Код: выделить все
//+------------------------------------------------------------------+
//|                                                         FATL.mq4 |
//|                       |
//|                          |
//+------------------------------------------------------------------+
#property copyright ""
#property link      ""
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Red

//---- buffers
double FATLBuffer[];
//+------------------------------------------------------------------+
//| FATL weights                                                     |
//+------------------------------------------------------------------+
#define FATLPeriods 39

double g_FATLKoef[FATLPeriods]=
 { 0.4360409450,  0.3658689069,   0.2460452079,   0.1104506886,  -0.0054034585,
  -0.0760367731, -0.0933058722,  -0.0670110374,  -0.0190795053,   0.0259609206,
   0.0502044896,  0.0477818607,   0.0249252327,  -0.0047706151,  -0.0272432537,
  -0.0338917071, -0.0244141482,  -0.0055774838,   0.0128149838,   0.0226522218,
   0.0208778257,  0.0100299086,  -0.0036771622,  -0.0136744850,  -0.0160483392,
  -0.0108597376, -0.0016060704,   0.0069480557,   0.0110573605,   0.0095711419,
   0.0040444064, -0.0023824623,  -0.0067093714,  -0.0072003400,  -0.0047717710,
   0.0005541115,  0.0007860160,   0.0130129076,   0.0040364019 };

int init()
  {
//---- indicators
   IndicatorBuffers(1);
   SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,2);
   SetIndexBuffer(0, FATLBuffer);
   SetIndexDrawBegin(0,39);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//---- TODO: add your code here
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
{
   int    counted_bars=IndicatorCounted();
//---- TODO: add your code here
 
   int    j,pos;
   double sum1;
//---- 
   if(counted_bars<0)  return(-1);
   //if (counted_bars>0) counted_bars--;
   
   
//---- main calculation loop
   for (pos=Bars-counted_bars-1;pos>=0;pos--)
     {
      sum1=0;          // zero summary
      for(j=0;j<FATLPeriods;j++) sum1+=g_FATLKoef[j]*Close[pos+j];//Counted FATL[pos]
      FATLBuffer[pos]=sum1;
     }
   
   return(0);
}

На графике выглядит так:
Вложения
FATL-02.png
Аватар пользователя
Haos
Специалист MQL
 
Сообщений: 24699
Зарегистрирован: 29 мар 2014, 16:07
Средств на руках: 193.70 Доллар
Группа: Главные модераторы
Благодарил (а): 3379 раз.
Поблагодарили: 8200 раз.


Вернуться в MQL – теория и практика

Кто сейчас на форуме?

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 57

Права доступа к форуму

Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

cron