Discussão do artigo "Funcionalidades do assistente MQL5 que você precisa conhecer (Parte 6): transformada de Fourier"

 

Novo artigo Funcionalidades do assistente MQL5 que você precisa conhecer (Parte 6): transformada de Fourier foi publicado:

A transformada de Fourier é um método de decompor uma onda de pontos de dados em possíveis partes constituintes que foi introduzida por Joseph Fourier. Esse recurso pode ser útil para os traders, e é isso que abordaremos neste artigo.

Na compilação com a classe de sinal RSI embutida e a gestão de dinheiro de margem fixa embutida, obtemos esses resultados para: EURJPY no período: 2022.01.01 a 2023.01.01 no período de tempo: 4 horas. Ao realizar este teste, não definimos metas de lucro nem usamos a configuração de stop loss padrão, portanto, ambas as entradas para esses são zero. Queremos que as saídas sejam determinadas inteiramente pela reversão do sinal ou pelo acionamento do stop loss definido pelo nosso stop de acompanhamento.


r_1

Autor: Stephen Njuki

 

Olá, Stephan,

É um ótimo artigo, embora eu precise estudá-lo mais detalhadamente, pois não uso transformadas de Fourier há 60 anos. Estou surpreso por não ter havido outros comentários. Você pode publicar o código-fonte do expert mq5 para que as três opções possam ser compiladas no expert e testadas.


Obrigado,

CapeCoddah

 

Hi,

Bom artigo. Uma ideia interessante. Um exemplo de código mq5 para testar/experimentar essas opções seria ótimo. Muito obrigado.

 

Olá

Os especialistas usados nos artigos são compilados por meio do assistente MQL5, portanto, o restante do código-fonte já está em seu PC se você tiver o metatrader.

 

Oi Stephan

Deixei minha parte de matemática mais amada (Fourier) por 30 anos. Portanto, é impossível comentar, mas li seu maravilhoso "exercício".

Desculpe-me por não poder ajudá-lo, mas obrigado por compartilhá-lo

 

Stephan

Obrigado pela referência, vou continuar a usá-la e lhe informarei os resultados,

CapeCoddah

 

Olá, Stephen,

artigo muito interessante!

Uma dica para isso: Os parâmetros "Points" e "Epicycles" devem ser excluídos na "Description of the class", pois eles não são usados no código e o compilador reclama após compilar o EA gerado.

Minha pergunta: O EA está funcionando sem problemas, mas não consigo reproduzir seus resultados de forma alguma, talvez eu tenha feito algo errado. Você poderia postar o arquivo *.set ou mesmo o código-fonte do EA que você gerou?

Você fez um teste avançado?

De qualquer forma, é uma boa lição sobre o uso da FFT. Obrigado!

 

Entendo que o autor nem sequer estudou a Transformada Rápida de Fourier :) É isso mesmo, por que se preocupar, FT e FFT são vazias e não dão nada em termos de negociação. Eu costumava fazer essas transformações há 15 anos no Matlab, e depois fiz a transformação inversa para a forma de tempo, e foi um fracasso total. As FFTs são boas em outros campos, por exemplo, no radar.

Mas as wavelets são muito mais interessantes. Se você cortar todas as bandas de alta frequência e fizer a transformação inversa para o domínio do tempo, obterá um excelente filtro passa-baixas sem atrasos. No entanto, isso pode ser feito de forma muito mais fácil - por meio de filtros de duas passagens.....

 

Hi,

ele me dá 12 erros

 
No primeiro script, algumas coisas estavam me incomodando, então fiz algumas alterações.

double CTrailingFT::ProcessFT(int Index) {
    double _ft = 0.0;
    static double _a[6]; // Matriz de tamanho fixo
    al_complex _f[5];    // 5 epiciclos

    // Preencher _a com as diferenças de preço
    for(int p=0; p<6; p++) {
        _a[p] = m_close.GetData(Index+p) - m_close.GetData(Index+p+1);
    }

    // Substituir a FFT Alglib por uma FFT personalizada de 6 pontos
    CustomFFT6(_a, _f); // Função hipotética otimizada

    // Calcular _ft usando a frequência dominante (por exemplo, a maior magnitude)
    double maxMagnitude = 0.0;
    for(int s=0; s<5; s++) {
        double mag = MathSqrt(_f[s].re*_f[s].re + _f[s].im*_f[s].im);
        if(mag > maxMagnitude) {
            maxMagnitude = mag;
            _ft = _f[s].re; // Ou use uma combinação ponderada
        }
    }

    return _ft * 100.0; // Ajustar a escala conforme necessário
}

Substitua Alglib por FFT personalizada:

  • A FFT do Alglib pode ser mais lenta para conjuntos de dados pequenos. Implemente uma FFT leve adaptada ao tamanho de sua janela (6 pontos).


Pré-compute os termos MathExp(-2.0*M_PI*...) para evitar recalculá-los a cada tick.

ArrayResize(_a,6) e matrix.Init(6,5) dentro de ProcessFT() são ineficientes para HFT. Utilizamos buffers de tamanho fixo.

Evite operações de matriz em ProcessFT(). Calcule diretamente o valor necessário para _ft usando frequências dominantes.


Tratamento de erros:

Adicione verificações para evitar a divisão por zero em _f[s].im / _f[s].re.Evite operações de matriz em ProcessFT(). Calcule diretamente o valor necessário para _ft usando frequências dominantes.

Tratamento de erros:

  • Adicione verificações para evitar a divisão por zero em _f[s].im / _f[s].re.


Se alguém quiser o código para implementar o CustomFFT6, basta pedir.
 

Já existem métodos muito mais eficientes que usam uma estrutura elementar (M-shape). Uma mudança em seus parâmetros fornece um quadro completo das mudanças na dinâmica dos preços (essa é a teoria do equilíbrio de impulso).

Quanto à transformada de Fourier, na minha opinião, é um método "arrastado" para os mercados financeiros, já que o movimento de preços dos instrumentos financeiros é um processo não estacionário, e a análise desses processos com a ajuda dos métodos de Fourier é ineficiente.

Quanto à análise de wavelet, ela é de fato mais interessante, pois são usadas várias estruturas semelhantes a ondas. Entretanto, isso é apenas um tipo de seleção subjetiva de padrões em vez de usar uma única estrutura elementar, que é revelada na teoria do equilíbrio de impulso.