//+------------------------------------------------------------------+
//|                HP_oscillator.mq4 =Close-HP                       | 
//|                                        AP-Алексадр Пак, Алма-Ата |
//|                                                   ekr-ap@mail.ru |
//| Hendrick-Prescot indi перевод с VB Excell                        |
//+------------------------------------------------------------------+

//http://forum.mql4.com/ru/18404 - форум
//http://en.wikipedia.org/wiki/Hodrick-Prescott_filter - wiki
//http://www.web-reg.de/hp_addin.html#  - программа VB Excell
//при использовании кода сообщать автору программы VB Excell
#property copyright "AP"
#property link      "ekr-ap@mail.ru"
#property indicator_separate_window
#property indicator_level1 0

#property indicator_buffers 1
#property indicator_color1 RoyalBlue

#define max 1000 //ограничение числа расчетных баров
#define cl 2 //число линий рассчитываемых в функции + на единицу больше

extern double lambda=1600;

double line1[];

int init()
  {
   SetIndexBuffer(0, line1);
   SetIndexStyle(0, DRAW_LINE);
   IndicatorDigits(Digits+3);
   return(0);
  }
//+------------------------------------------------------------------+
int start()
  {
   HP(max,lambda);
   return(0);
  }
void HP(int dataRow, double lambda)
{
    int nobs, nseries;
    int i, k ;
    double a[max,cl] , b[max,cl] , c[max,cl] , HPout[max,cl];
    
    double H1[cl], H2[cl], H3[cl], H4[cl] , H5[cl];
    double HH1[cl], HH2[cl], HH3[cl] , HH4[cl], HH5[cl];
    double Z[cl] , HB[cl] , HC[cl];
    
    
    /*
    
    double H1[max], H2[max], H3[max], H4[max] , H5[max];
    double HH1[max], HH2[max], HH3[max] , HH4[max], HH5[max];
    double Z[max] , HB[max] , HC[max];
    */
    nseries=cl-1;
    
    nobs =max;
    for(i=1; i<=nseries; i++)
     for(k=1; k<=nobs; k++) 
            HPout[k,i] = Close[k-1];
    
    for (k = 1; k<=nseries; k++) 
        {
        a[1, k] = 1 + lambda;
        b[1, k] = -2 * lambda;
        c[1, k] = lambda;
    
        for( i = 2; i<= nobs - 1;i++)
            {
            a[i, k] = 6 * lambda + 1;
            b[i, k] = -4 * lambda;
            c[i, k] = lambda;
            }//Next i
    
        a[2, k] = 5 * lambda + 1;
        a[nobs, k] = 1 + lambda;
        a[nobs - 1, k] = 5 * lambda + 1;
        b[1, k] = -2 * lambda;
        b[nobs - 1, k] = -2 * lambda;
        b[nobs, k] = 0;
        c[nobs - 1, k] = 0;
        c[nobs, k] = 0;
    }//Next k
    
    //'Vorwдrts'
    //'Forward'
    for(k = 1; k<=nseries;k++)
    {
        for(i = 1; i<= nobs; i++)
            {
            Z[k] = a[i, k] - H4[k] * H1[k] - HH5[k] * HH2[k];
            HB[k] = b[i, k];
            HH1[k] = H1[k];
            H1[k] = (HB[k] - H4[k] * H2[k]) / Z[k];
            b[i, k] = H1[k];
            HC[k] = c[i, k];
            HH2[k] = H2[k];
            H2[k] = HC[k] / Z[k];
            c[i, k] = H2[k];
            a[i, k] = (HPout[i, k] - HH3[k] * HH5[k] - H3[k] * H4[k]) / Z[k];
            HH3[k] = H3[k];
            H3[k] = a[i, k];
            H4[k] = HB[k] - H5[k] * HH1[k];
            HH5[k] = H5[k];
            H5[k] = HC[k];
            }//Next i
    
    H2[k] = 0;
    H1[k] = a[nobs, k];
    HPout[nobs, k] = H1[k];
      
    //'Rьckwдrts'
    //'Backward'
    
        for(i = nobs; i>=1; i--)
            {
            HPout[i, k] = a[i, k] - b[i, k] * H1[k] - c[i, k] * H2[k];
    
            H2[k] = H1[k];
            H1[k] = HPout[i, k];
    
        }//Next i
    }//Next k
    for(i=1;i<nobs;i++) {line1[i-1]=Close[i-1]-HPout[i,1];}
   
   }//    End Function

