Ayuda con Fourier - página 2

 
La amplitud y la fase son UN número complejo, 1 barra es también 1 número en el que la parte imaginaria = 0. Por lo tanto, 8 barras son 8 frecuencias. Preguntemos a klot qué opina de esto.
 
Algo no está enviando el archivo
Lo intentaré de nuevo.
Archivos adjuntos:
 
En fin, así está mejor :)

//+------------------------------------------------------------------+
//|                                            #_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 писал (а):
La amplitud y la fase son UN número complejo, 1 barra es también 1 número en el que la parte imaginaria = 0. Por lo tanto, 8 barras son 8 frecuencias. Preguntemos a klot qué opina al respecto.

Lo hice con números complejos:
//--- Enviar el espectrograma a la pantalla
for( i=0; i<=N-1; i++)
{
// Módulo de un número complejo
SpecktrBuffer[i]=MathSqrt(aa[i*2]*aa[i*2]+aa[i*2+1]*aa[i*2+1]);
}
//---
 
lsv:
La amplitud y la fase son UN número complejo, 1 barra es también 1 número en el que la parte imaginaria = 0. Por lo tanto, 8 barras son 8 frecuencias. Preguntemos a klot qué opina al respecto.
Será mejor que me preguntes a mí :)
Llevo varios años tratando este tema :)
incluso hay un montón de páginas sobre TF en mi sitio web
http://www.may.nnov.ru/mak/DSP/Contents.shtml

O búsquelo en Google.
Aquí está el primer enlace, por ejemplo.
http://alglib.sources.ru/fft/realfft.php

fin de página:

Si comparamos esta imagen con otra similar para la función compleja de la FFT, observamos que las frecuencias f-1 a f-N/2+1 desaparecieron en alguna parte, y sólo quedan partes reales de las frecuencias f0y fN/2, ocupando el lugar anterior de la frecuencia compleja f0. La razón de ello son las propiedades de simetría de la transformada de Fourier: para la función real h(t) se cumple que H(-f) = H *(f).

Así, las frecuencias f-1 a f-N/2+1 ya no llevan ninguna información nueva, ya que se obtienen por conjugación compleja de sus gemelas simétricas, y las frecuencias f0y fN/2 tienen partes imaginarias iguales a cero.

===========================================================
Un número complejo contiene 2 componentes independientes,
Un número complejo con parte imaginaria igual a cero contiene 1 componente independiente.

Si la entrada es una serie de números complejos, obtenemos K frecuencias,
Si la entrada es una serie de números reales, entonces la mitad de las frecuencias permanecen.
 
Mi razonamiento es más sencillo: existe un teorema, pero no recuerdo el nombre de la persona que lo demostró: para convertir una señal analógica en digital, se necesitan el doble de muestras para almacenar una determinada frecuencia que la frecuencia almacenada. En nuestro caso, hay 8 muestras, por lo que pueden almacenar información de frecuencia para no más de 4 períodos.
 
Teorema de Kotelnikov.
 

A juzgar por la discusión, este Fourier es algo interesante, pero lamentablemente no entiendo de qué se trata,
¿Alguien puede explicar en pocas palabras qué es y cómo hacer un EA con él?

 
Ronen:

A juzgar por la discusión, este Fourier es algo interesante, pero lamentablemente no entiendo de qué estamos hablando aquí,
¿puede alguien explicar en pocas palabras lo que es y cómo hacer un EA de ella?


Puedo cometer algunas imprecisiones.... La cuestión es que cualquier función periódica puede representarse como una suma de componentes sinusoidales de diferentes frecuencias, es decir, puede expandirse en series de Fourier. La serie de Fourier es una suma de componentes sinusoidales y cosenoidales de doble frecuencia (armónicos). Mediante algunas manipulaciones matemáticas con transformadas de Fourier las series de datos pueden presentarse como suma de sinusoides de frecuenciauniformemente variable y para cada componente obtenemos la amplitud, hablando simplemente de la respuesta en frecuencia de la señal (amplitud de sinusoides con frecuencia de 1 Hz, 2, 3, etc.). Luego, manipulando cada componente de frecuencia es posible filtrar la señal, etc. etc. Está bien, pero una cosa, la función tiene que ser periódica, aunque no lo sea, estas perobranchas implican que es periódica. Aunque quién sabe... tal vez haya algún beneficio en ello.
 
Integer писал (а):
La cuestión es que cualquier función periódica puede representarse como ...

Bueno, si no es muy difícil - un poco más para el nivel del dummie:

Quizá me equivoque, pero me parece que los TF pequeños se ajustan bastante bien a esta condición. Lo observo ahora, pasando valores de M1 con prevBars!=Bars por variables globales y leyéndolos en M15 y H1 con intervalo de 1 min, veo - si puede afectar fuertemente un punto de entrada dentro de una barra del TF mayor. Tal vez para divertirse, o tal vez - "Dentro de cada barra horaria se encuentran 10p de beneficio :). O 15p de pérdida :(." Si el seno/coseno realmente miente - para el intradía será un verdadero complemento. A mí me parece.