##FFTSpectr





//+------------------------------------------------------------------+
//|                                            ##FFTSpectr.mq4      |
//|                                          Copyright © 2009, sHell |
//|                                                  diakin@narod.ru |
//+------------------------------------------------------------------+

//Based on
//+------------------------------------------------------------------+
//|                                           i_i_SpecktrAnalis_1.mq4|
//|                                          Copyright © 2006, klot. |
//|                                                     klot@mail.ru |
//+------------------------------------------------------------------+

// Ïðèìåð èñïîëüçîâàíèÿ áûñòðîãî ïðåîáðàçîâàíèÿ ôóðüå (ÁÏÔ)\ Fast Fourier transform (FFT)
//  êà÷åñòâå òåñòîâîé çàäàåòñÿ ôóíêöèÿ èç òðåõ ñèíóñîèä ñ ðàçíûìè ÷àñòîòàìè è àìïëèòóäàìè.
// Äëÿ ïåðåõîäà ê öåíàì ðàçêîììåíòàðüòå  sig=Close[i];



#property copyright "Copyright © 2009, sHell"
#property link      "diakin@narod.ru"
//---
#include <stdlib.mqh>
#define pi 3.14159265358979323846
//---
#import "#_lib_FFT.ex4"
void realfastfouriertransform(double& a[], int tnn, bool inversefft);
#import
//---
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Red

//---- buffers
double SpectrBuffer[];
//---
extern double n=8;// Çàäàåò ðàçìåð ìàññèâà - êîëè÷åñòâî ñâå÷åé íà êîòîðûõ ïðîèçâîäÿòñÿ âû÷èñëåíèÿ. Ïðè n=8 ÷èñëî ñâå÷åé = 2^8=256 ñâå÷åé


// ïàðàìåòðû òåñòîâîé ôóíêöèè
extern double a1=1.0;// Àìïëèòóäà ïåðèîäè÷åñêîé ôóíêöèè
extern double f1=1.0;// ×àñòîòà ïåðèîäè÷åñêîé ôóíêöèè
extern double ff1=0;// Ôàçà ïåðèîäè÷åñêîé ôóíêöèè

extern double a2=4.0;// Àìïëèòóäà ïåðèîäè÷åñêîé ôóíêöèè
extern double f2=4.0;// ×àñòîòà ïåðèîäè÷åñêîé ôóíêöèè
extern double ff2=0;// Ôàçà ïåðèîäè÷åñêîé ôóíêöèè

extern double a3=8.0;// Àìïëèòóäà ïåðèîäè÷åñêîé ôóíêöèè
extern double f3=8.0;// ×àñòîòà ïåðèîäè÷åñêîé ôóíêöèè
extern double ff3=0;// Ôàçà ïåðèîäè÷åñêîé ôóíêöèè



//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
SetIndexStyle(0,DRAW_HISTOGRAM);
SetIndexBuffer(0,SpectrBuffer);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int tnn1=MathPow(2,n);//  ðàçìåð ìàññèâà äîëæåí áûòü ñòåïåíüþ äâîéêè
   double aa[];
   int N=ArrayResize(aa,tnn1);
   SetIndexDrawBegin(0,Bars-N);

   // Ïîñòðîåíèå ñïåêòðà 
   double sig;
   for(int i=0; i<=N-1; i++)
   {

//
   sig=a1*MathCos(f1*i/N*(2.0*pi)+ff1*pi)+a2*MathCos(f2*i/N*(2.0*pi)+ff2*pi)+a3*MathCos(f3*i/N*(2.0*pi)+ff3*pi); // Îáûêíîâåííàÿ ïåðèîäè÷åñêàÿ ôóíêöèÿ - ê ðûíêó íå èìåååò îòíîøåíèÿ
 //sig=Close[i]; // ðûíî÷íûå öåíû
 //sig=iRSI(NULL,0,14,PRICE_CLOSE,i+1); // ????????
   aa[i]=sig;
      
   }
   
   // Ïðÿìîå ïðåîáðàçîâàíèå Ôóðüå - ïîñëå âûïîíåíèÿ ôóíêöèè â ìàññèâå aa[] - ñïåêòðîãðàììà
   realfastfouriertransform(aa, tnn1, false); 
   
   //--- Âûâîä ñïåêòðîãðàììû íà ýêðàí
   for( i=0; i<=(N-1)/2; i++)
   {
   // Ìîäóëü êîìïëåêñíîãî ÷èñëà
      SpectrBuffer[i]=(MathSqrt(aa[i*2]*aa[i*2]+aa[i*2+1]*aa[i*2+1]))/(N/2); 
   }


   //--- îáðàòíîå ïðåîáðàçîâàíèå ôóðüå
   /*
   //realfastfouriertransform(aa, tnn1, true);
   for( i=0; i<=N; i++)
   {
      SpectrBuffer[i]=aa[i];
   }*/

   //----
   return(0);
  }
  
//+------------------------------------------------------------------+


//--------------------------------------------------------------------+

// íå çíàþ çà÷åì ýòà ôóíêöèÿ ;)
void InSigNormalize(double& aa[])
{
   double sum_sqrt;
   int element_count=ArraySize(aa);
   sum_sqrt=0;

   for( int i=0; i<=element_count-1; i++)
   {
      sum_sqrt+=MathPow(aa[i],2);
   }
   sum_sqrt=MathSqrt(sum_sqrt);
   
   if (sum_sqrt!=0)
   {
      for( i=0; i<=element_count-1; i++)
      {
         aa[i]=aa[i]/sum_sqrt;
      }
   }
   return;
}
//---------------------------------------------------------------------+



Sample





Analysis



Market Information Used:



Indicator Curves created:

Implements a curve of type DRAW_HISTOGRAM


Indicators Used:



Custom Indicators Used:
#_lib_FFT

Order Management characteristics:

Other Features: