Fourier_extrapolator_sin





//+------------------------------------------------------------------+
//|                               Fourier_extrapolator_4th_cycle.mq4 |
//|                                    Ïîääóáíûé Îëåã aka neoclassic |
//|                             Àâòîð ôóíêöèé af_FT, af_LR - ANG3100 |
//+------------------------------------------------------------------+
#property copyright "Ïîääóáíûé Îëåã"

#property indicator_chart_window
#property indicator_buffers 8

extern int Tstart=1000;
extern int shift=0;
extern bool delete=true;

int Tmin=60;
int bars=0;
int flagdrow=1;
int Ti;
int TLR;

double aa,bb,w;
double pi=3.1415926535897932384626433832795;
double ak0,ak[],bk[],spectr[],prognoz[];
double profit[];



int deinit()
  {
if (delete==true) 
{
   for (int i=Tstart/3;i>20;i--)
   {  
      for (int k=Tstart*4/3;k>=0;k--)
      {
         ObjectDelete("sinus_"+shift+"_"+i+"_"+k);
      }
   }
}
   return(0);
  }



int start()
  {
int T=Tstart;
if ((T+shift)>Bars) T=Bars-shift;
   
   
if (bars==0)
{

SetIndexStyle(0,DRAW_NONE);
SetIndexBuffer(0, prognoz);
SetIndexStyle(1,DRAW_NONE);
SetIndexBuffer(1, ak);
SetIndexStyle(2,DRAW_NONE);
SetIndexBuffer(2, bk);
SetIndexStyle(3,DRAW_NONE);
SetIndexBuffer(3, spectr);

int count=0;

double h3[],ak3[],bk3[],aabuf[],bbbuf[],ak0buf[]; int Tbuf[]; 

ArrayInitialize(prognoz,EMPTY_VALUE);


ArrayResize(h3,T/3);
ArrayResize(ak3,T/3);
ArrayResize(bk3,T/3);
ArrayResize(aabuf,T/3);
ArrayResize(bbbuf,T/3);
ArrayResize(ak0buf,T/3);
ArrayResize(Tbuf,T/3);

ArrayInitialize(h3,0.0);
ArrayInitialize(ak3,0.0);
ArrayInitialize(bk3,0.0);
ArrayInitialize(aabuf,0.0);
ArrayInitialize(bbbuf,0.0);
ArrayInitialize(ak0buf,0.0);
ArrayInitialize(Tbuf,0.0);


while (T>=Tmin)
{
   ArrayInitialize(ak,EMPTY_VALUE);
   ArrayInitialize(bk,EMPTY_VALUE);
   ArrayInitialize(spectr,0.0);
   SetIndexShift(0,TLR-shift);
   SetIndexShift(4,TLR-shift);

   
   Ti=T+1;
   af_LR(Ti,shift);
   w=2*pi/Ti;
   af_FT(Ti,shift);
      
   for (int i=2;i<6;i++) {spectr[i]=MathPow(ak[i]*ak[i]+bk[i]*bk[i],0.5)/2;}   
   
   if (ArrayMaximum(spectr)==3)
   {
      h3[count]=spectr[3];
      ak3[count]=ak[3];
      bk3[count]=bk[3];
      Tbuf[count]=T;
      aabuf[count]=aa; bbbuf[count]=bb; ak0buf[count]=ak0;
      count++;

   }
   
   if (ArrayMaximum(spectr)!=3 && count!=0)
   {
   
      count=0;
      int amax=ArrayMaximum(h3);
      w=2*pi/(Tbuf[amax]+1);
      
      double delta=Close[shift]-(ak3[amax]*MathCos(3*Tbuf[amax]/3*w)+bk3[amax]*MathSin(3*Tbuf[amax]/3*w)+
                                bbbuf[amax]+aabuf[amax]*(Tbuf[amax]/3-Tbuf[amax]*4/3)+ak0buf[amax]);

      for (i=Tbuf[amax]*4/3;i>=0;i--)
      {
         
         double p1=ak3[amax]*MathCos(3*i*w)+bk3[amax]*MathSin(3*i*w)+
                bbbuf[amax]+aabuf[amax]*(i-Tbuf[amax]*4/3)+ak0buf[amax]+delta;
         
         double p2=ak3[amax]*MathCos(3*(i-1)*w)+bk3[amax]*MathSin(3*(i-1)*w)+
                bbbuf[amax]+aabuf[amax]*(i-1-Tbuf[amax]*4/3)+ak0buf[amax]+delta;
         
         if ((shift+Tbuf[amax])>(Tbuf[amax]*4/3-i))
         {ObjectCreate("sinus_"+shift+"_"+Tbuf[amax]/3+"_"+i,OBJ_TREND,0,Time[shift+i-Tbuf[amax]/3],p1,Time[shift+i-Tbuf[amax]/3-1],p2);}
         else {ObjectCreate("sinus_"+shift+"_"+Tbuf[amax]/3+"_"+i,OBJ_TREND,0,Time[0]-Period()*60*(shift-Tbuf[amax]/3+i),p1,Time[0]-Period()*60*(shift-Tbuf[amax]/3+i-1),p2);}
         ObjectSet("sinus_"+shift+"_"+Tbuf[amax]/3+"_"+i,OBJPROP_RAY,0);
         ObjectSet("sinus_"+shift+"_"+Tbuf[amax]/3+"_"+i,OBJPROP_COLOR,DarkOrange);
         
      }
         ArrayInitialize(h3,0.0);
         ArrayInitialize(ak3,0.0);
         ArrayInitialize(bk3,0.0);
         ArrayInitialize(Tbuf,0.0);

   }
T=T-(T+1000)/1000;
}


bars=Bars;
}
return(0);
}


//*******************************************************************
void af_FT(int T,int i0)
{
   int i,k;
   double sum_cos,sum_sin,dci; 
   
   ak0=0.0; 
   for (i=0; i<T; i++) ak0+=Close[i+i0]-bb-aa*i; 
   ak0=ak0/T; 

   for (k=1; k<=6; k++) 
   { 
      sum_cos=0.0; 
      sum_sin=0.0;  
      for (i=0; i<T; i++) 
      {
         dci=Close[i+i0]-bb-aa*i;
         sum_cos+=dci*MathCos(k*i*w); 
         sum_sin+=dci*MathSin(k*i*w);
      }
      ak[k]=sum_cos*2/T; 
      bk[k]=sum_sin*2/T; 
   }
}

//*******************************************************************
void af_LR(int p,int i) // af_LR(Ti,i0)
{ 
   double sx=0,sy=0,sxy=0,sxx=0;
   
   if (p<2) p=2;
   for (int n=0; n<p; n++) 
   {
      sx+=n; 
      sy+=Close[n+i]; 
      sxy+=n*Close[n+i]; 
      sxx+=n*n; 
   }   
   aa=(sx*sy-p*sxy)/(sx*sx-p*sxx);
   bb=(sy-aa*sx)/p;
}





Sample





Analysis



Market Information Used:

Series array that contains close prices for each bar
Series array that contains open time of each bar


Indicator Curves created:

Implements a curve of type DRAW_NONE


Indicators Used:



Custom Indicators Used:

Order Management characteristics:

Other Features: