Aiuto con Fourier - pagina 2

 
Ampiezza e fase sono UN SOLO numero complesso, 1 barra è anche 1 numero in cui la parte immaginaria = 0. Quindi 8 barre sono 8 frequenze. Chiediamo a Klot cosa ne pensa?
 
Qualcosa non sta inviando il file
Ci proverò di nuovo.
 
Comunque, così va meglio :)

//+------------------------------------------------------------------+
//|                                            #_i_SpecktrAnalis.mq4 |
//|                                          Copyright © 2006, klot. |
//|                                                     klot@mail.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, klot."
#property link      "klot@mail.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 SpecktrBuffer[];
//---
extern double n=8;// Задает размер массива - степень двойки
extern double f=1.0;// Частота периодической функции
extern double ff=0;// Фаза периодической функции
 
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
SetIndexStyle(0,DRAW_HISTOGRAM);
SetIndexBuffer(0,SpecktrBuffer);
//----
   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);
   SetIndexDrawBegin(1,Bars-N);
   //ArrayResize(aa,tnn1+1); //Для косинус-преобразования
   //---
   // Исследование спектра разных функций
   double sig;
   for(int i=0; i<=N-1; i++)
   {
      sig=MathCos(f*i/(2.0*pi)+ff*pi); // Обыкновенная периодическая функция - к рынку не имееет отношения
      //sig=Close[i];
      //sig=iRSI(NULL,0,14,PRICE_CLOSE,i+1);
      aa[i]=sig;
      
   }
   //InSigNormalize(aa); //Нормализация значений 
   // Прямое преобразование Фурье - после выпонения функции в массиве aa[] - спектрограмма
   realfastfouriertransform(aa, tnn1, false); 
   InSigNormalize(aa); //Нормализация значений 
   
   //--- Вывод спектрограммы на экран
   for( i=0; i<=N-1; i++)
   {
      // Модуль комплексного числа
      SpecktrBuffer[i]=MathSqrt(aa[i*2]*aa[i*2]+aa[i*2+1]*aa[i*2+1]); 
   }
   //---
   /*
   //realfastfouriertransform(aa, tnn1, true);
   for( i=0; i<=N; i++)
   {
      SpecktrBuffer[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;
}
//---------------------------------------------------------------------+
 
lsv писал (а):
Ampiezza e fase sono UN SOLO numero complesso, 1 barra è anche 1 numero in cui la parte immaginaria = 0. Quindi 8 barre sono 8 frequenze. Chiediamo a Klot cosa ne pensa.

L'ho fatto con i numeri complessi:
//--- Emettere lo spettrogramma sullo schermo
for( i=0; i<=N-1; i++)
{
// Modulo di un numero complesso
SpecktrBuffer[i]=MathSqrt(aa[i*2]*aa[i*2]+aa[i*2+1]*aa[i*2+1]);
}
//---
 
lsv:
Ampiezza e fase sono UN SOLO numero complesso, 1 barra è anche 1 numero in cui la parte immaginaria = 0. Quindi 8 barre sono 8 frequenze. Chiediamo a Klot cosa ne pensa?
Faresti meglio a chiedermelo :)
Mi sono occupato di questo argomento per diversi anni :)
c'è anche un mucchio di pagine su TF sul mio sito web
http://www.may.nnov.ru/mak/DSP/Contents.shtml

O cercarlo su Google.
Ecco il primo link, per esempio.
http://alglib.sources.ru/fft/realfft.php

fine della pagina:

Se confrontiamo questo quadro con uno simile per la funzione complessa FFT, notiamo che le frequenze da f-1 a f-N/2+1 sono scomparse da qualche parte, e rimangono solo parti reali delle frequenze f0e fN/2, prendendo il posto della frequenza complessa f0. La ragione è la proprietà di simmetria della trasformata di Fourier: per la funzione reale h(t) è vero che H(-f) = H *(f).

Così, le frequenze da f-1 a f-N/2+1 non portano più alcuna nuova informazione, poiché sono ottenute per coniugazione complessa dei loro gemelli simmetrici, e le frequenze f0e fN/2 hanno parti immaginarie uguali a zero.

===========================================================
Un numero complesso contiene 2 componenti indipendenti,
Un numero complesso con una parte immaginaria uguale a zero contiene 1 componente indipendente.

Se l'input è una serie di numeri complessi, otteniamo le frequenze K,
Se l'input è un numero di numeri reali, allora la metà delle frequenze rimane.
 
Il mio ragionamento è più semplice: c'è un teorema, ma non ricordo il nome di chi l'ha dimostrato: per convertire un segnale analogico in digitale, ci vuole il doppio dei campioni per memorizzare una certa frequenza rispetto alla frequenza memorizzata. Nel nostro caso, ci sono 8 campioni, quindi possono memorizzare informazioni di frequenza per non più di 4 periodi.
 
Teorema di Kotelnikov.
 

A giudicare dalla discussione, questo Fourier è qualcosa di interessante, ma purtroppo non capisco di cosa si tratti,
Qualcuno può spiegare in poche parole cos'è e come farne un EA?

 
Ronen:

A giudicare dalla discussione, questo Fourier è qualcosa di interessante, ma purtroppo non capisco di cosa stiamo parlando qui,
qualcuno può spiegare in poche parole cos'è e come farne un EA?


Posso fare alcune imprecisioni.... Il punto è che qualsiasi funzione periodica può essere rappresentata come una somma di componenti sinusoidali di diverse frequenze, cioè può essere espansa in serie di Fourier. La serie di Fourier è la somma delle componenti seno e coseno di frequenza doppia (armoniche). Con alcune manipolazioni matematiche con le trasformate di Fourier le serie di dati possono essere presentate come somma di sinusoidi a frequenzauniformemente variabile e per ogni componente si ottiene l'ampiezza, parlando semplicemente della risposta in frequenza del segnale (ampiezza delle sinusoidi con frequenza di 1 Hz, 2, 3, ecc.) Poi manipolando ogni componente di frequenza è possibile filtrare il segnale, ecc. ecc. Va bene, ma una cosa, la funzione deve essere periodica, anche se non è periodica, questi perobranchi implicano che sia periodica. Anche se chi lo sa... forse c'è qualche beneficio.
 
Integer писал (а):
Il punto è che qualsiasi funzione periodica può essere rappresentata come ...

Beh, se non è troppo difficile - un po' di più per il livello del dummie:

Forse mi sbaglio, ma mi sembra che i piccoli TF si adattino piuttosto bene a questa condizione. Lo osservo ora, passando i valori da M1 con prevBars!=Bars da variabili globali e leggendoli a M15 e H1 con 1 min. di intervallo, vedo - se può influenzare fortemente un punto di entrata dentro una barra del TF maggiore. Forse per divertimento, o forse - "Dentro ogni barra oraria si trovano 10p di profitto :). O 15p di perdita :(." Se il seno/coseno mente davvero - per l'intraday sarà una vera aggiunta. A me sembra.