Ajuda com Fourier - página 2

 
Amplitude e fase são UM número complexo, 1 barra é também 1 número no qual a parte imaginária = 0. Portanto, 8 barras são 8 freqüências. Vamos perguntar ao klot o que ele pensa sobre isso?
 
Alguma coisa não está enviando o arquivo
Vou tentar novamente.
Arquivos anexados:
 
De qualquer forma, é melhor :)

//+------------------------------------------------------------------+
//|                                            #_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 писал (а):
Amplitude e fase são UM número complexo, 1 barra é também 1 número no qual a parte imaginária = 0. Portanto, 8 barras são 8 freqüências. Vamos perguntar ao klot o que ele pensa sobre isso.

Eu o fiz com números complexos:
//--- Saída do espectrograma para a tela
for( i=0; i<=N-1; i++)
{
// Módulo de um número complexo
SpecktrBuffer[i]=MathSqrt(aa[i*2]*aa[i*2]+aa[i*2+1]*aa[i*2+1]);
}
//---
 
lsv:
Amplitude e fase são UM número complexo, 1 barra é também 1 número no qual a parte imaginária = 0. Portanto, 8 barras são 8 freqüências. Vamos perguntar ao klot o que ele pensa sobre isso?
É melhor você me perguntar :)
Tenho lidado com este assunto há vários anos :)
há até mesmo um monte de páginas sobre a TF em meu site
http://www.may.nnov.ru/mak/DSP/Contents.shtml

Ou procurar no Google.
Aqui está o primeiro link, por exemplo.
http://alglib.sources.ru/fft/realfft.php

final da página:

Se compararmos este quadro com um semelhante para a função complexa FFT, notamos que as freqüências f-1 a f-N/2+1 desapareceram em algum lugar, e apenas partes reais permanecem das freqüências f0e fN/2, ocupando o primeiro lugar da freqüência complexa f0. A razão para isto são as propriedades de simetria da transformada de Fourier: para a função real h(t) é verdade que H(-f) = H *(f).

Assim, as freqüências f-1 a f-N/2+1 não trazem mais nenhuma informação nova, pois são obtidas por conjugação complexa de seus gêmeos simétricos, e as freqüências f0e fN/2 têm partes imaginárias iguais a zero.

===========================================================
Um número complexo contém 2 componentes independentes,
Um número complexo com uma parte imaginária igual a zero contém 1 componente independente.

Se a entrada for uma série de números complexos, obtemos as freqüências K,
Se a entrada for um número de números reais, então a metade das freqüências permanece.
 
Meu raciocínio é mais simples: existe um teorema, mas não consigo lembrar o sobrenome da pessoa que o provou: para converter um sinal analógico para digital, é preciso o dobro da freqüência armazenada para armazenar uma determinada freqüência. Em nosso caso, existem 8 amostras, de modo que podem armazenar informações de freqüência por não mais de 4 períodos.
 
O teorema de Kotelnikov.
 

A julgar pela discussão, este Fourier é algo interessante, mas infelizmente eu não entendo do que se trata,
Alguém pode explicar em poucas palavras o que é e como fazer uma EA a partir disso?

 
Ronen:

A julgar pela discussão, este Fourier é algo interessante, mas infelizmente eu não entendo do que estamos falando aqui,
alguém pode explicar em poucas palavras o que é e como fazer um EA a partir dele?


Eu posso fazer algumas imprecisões.... A questão é que qualquer função periódica pode ser representada como uma soma de componentes sinusoidais de diferentes freqüências, ou seja, pode ser expandida para a série Fourier. A série Fourier é uma soma de componentes senoidal e co-seno de duplicação de freqüência (harmônicas). Por algumas manipulações matemáticas com Fourier transforma séries de dados podem ser apresentadas como soma de sinusóides de freqüênciauniformemente variável e para cada componente obtemos amplitude, simplesmente falando em resposta de freqüência do sinal (amplitude de sinusóides com freqüência de 1 Hz, 2, 3, etc.). Então, através da manipulação de cada componente de freqüência é possível filtrar o sinal, etc., etc. Tudo bem, mas uma coisa, a função tem que ser periódica, mesmo que não seja periódica, estas perobrânquias implicam que é periódica. Embora quem sabe... talvez haja algum benefício nisso.
 
Integer писал (а):
A questão é que qualquer função periódica pode ser representada como ...

Bem, se não for muito difícil - um pouco mais para o nível de um manequim:

Talvez eu esteja errado, mas me parece que os pequenos TFs se ajustam bastante bem a esta condição. Observo-o agora, passando valores de M1 com prevBars!=Bars por variáveis globais e lendo-as em M15 e H1 com intervalo de 1 minuto, vejo - se pode afetar fortemente um ponto de entrada dentro de uma barra da maior TF. Talvez por diversão, ou talvez - "Dentro de cada bar de hora em hora, senta-se 10p de lucro :). Ou 15p perda :(." Se o seno/coseno realmente mente - para intraday será um verdadeiro complemento. Parece-me.
Razão: