Assista a como baixar robôs de negociação gratuitos
Encontre-nos em Twitter!
Participe de nossa página de fãs
Script interessante?
Coloque um link para ele, e permita que outras pessoas também o avaliem
Você gostou do script?
Avalie seu funcionamento no terminal MetaTrader 5
Visualizações:
36
Avaliação:
(5)
Publicado:
\MQL5\Include\
Freelance MQL5 Precisa de um robô ou indicador baseado nesse código? Solicite-o no Freelance Ir para Freelance

Os preços brutos do mercado cambial e de futuros são não estacionários: modelos padrão de regressão e classificação treinados com base neles enfrentam um grave viés de antecipação e correlações espúrias. A solução ingênua — a diferenciação inteira — elimina a não estacionariedade, mas destrói toda a memória dos preços no processo, descartando justamente a estrutura de autocorrelação de que um modelo preditivo necessita.

A diferenciação fracionária de largura fixa (FFD), introduzida no Capítulo 5 de *Advances in Financial Machine Learning* (López de Prado, 2018), resolve isso por meio da diferenciação em uma ordem não inteira d ∈ (0, 1) que seja apenas suficiente para a estacionariedade, mantendo ao mesmo tempo o máximo de memória. Esta submissão fornece uma implementação em MQL5 pronta para produção desse método.

Indicador FFD: preço bruto (parte superior) vs. série FFD estacionária (parte inferior)

Ilustração em dois painéis da saída do FFD: preço bruto não estacionário (a) e série FFD estacionária (b) com a janela de lookback marcada


Componentes

  • FFDEngine.mqh — Biblioteca apenas de cabeçalho contendo a classe CFFDEngine. Fornece Init(), Compute() (barra única) e ComputeBuffer() (buffer completo do indicador com otimização prev_calculated ). Não há alocação dinâmica de memória após OnInit().
  • FFD.mq5 — Indicador personalizado que envolve o CFFDEngine. Traça a série FFD em uma janela de gráfico separada. Suporta todos os valores de ENUM_APPLIED_PRICE.

Como o algoritmo funciona

O vetor de pesos é definido pela relação de recorrência (AFML, equação 5.4):

w[0] = 1 w[k] = -w[k-1] * (d - k + 1) / k, k = 1, 2, ...

A iteração é interrompida quando |w[k]| < limiar. O vetor é então invertido, de modo que o preço mais antigo na janela de análise receba o menor peso e o preço mais recente receba 1,0. O valor do FFD na barra i é o produto escalar do vetor de pesos invertido com a janela de logaritmo do preço [i−largura, …, i].

Para d = 0,4 e limiar = 1e-5, a largura da janela é de 1 . 457 barras. Para limiar = 1e-3, é de 54 barras. O limiar controla o equilíbrio entre estacionariedade e memória: valores menores preservam mais memória, ao custo de uma exigência de janela de análise mais ampla.

Parâmetros de entrada

Parâmetro Padrão Descrição
InpD 0,4 Ordem da diferenciação fracionária. Intervalo típico: 0,1–0,9. Valores acima de 0,5 produzem diferenciação quase inteira; valores abaixo de 0,1 produzem preços quase brutos. O valor ideal de d é o valor mínimo que passa no teste ADF no nível de significância escolhido — consulte o artigo complementar para conhecer o procedimento de busca em Python.
InpThreshold 1e-5 Limite de peso τ. A iteração é interrompida quando |w[k]| < τ. Valores menores produzem uma janela mais ampla e melhor preservação de memória, mas exigem mais barras históricas antes da primeira saída válida. Intervalo recomendado: 1e-4 a 1e-5.
InpUseLog true Aplica ln(preço) antes do cálculo da diferença. Recomendado para séries de preços brutos (fechamentos, aberturas, máximas, mínimas). Defina como false apenas quando a entrada já for uma série de retornos ou retornos logarítmicos.
InpPrice PRICE_CLOSE Tipo de preço aplicado. Aceita qualquer valor de ENUM_APPLIED_PRICE: PRICE_OPEN, PRICE_HIGH, PRICE_LOW, PRICE_CLOSE, PRICE_MEDIAN, PRICE_TYPICAL, PRICE_WEIGHTED.

Instalação

  1. Copie o arquivo FFDEngine.mqh para a pasta MQL5\Include\ (ou para a subpasta especificada durante o download do CodeBase — veja os locais dos arquivos abaixo).
  2. Copie o FFD.mq5 para MQL5\Indicators\Downloads\ (colocado lá automaticamente durante o download do CodeBase).
  3. Compile ambos os arquivos no MetaEditor. O indicador deve ser compilado sem avisos sob a opção #property strict.
  4. Anexe o FFD a qualquer gráfico. A janela do indicador aparecerá abaixo do gráfico principal após a janela de lookback (largura + 1 barra) ter sido preenchida.

Usando o CFFDEngine em seu próprio EA ou indicador

O FFDEngine.mqh é uma biblioteca apenas de cabeçalho. Inclua-a e chame Init() uma vez em OnInit():

#include <FFDEngine.mqh>

//--- Instância global do mecanismo de diferenciação fracionária de largura fixa
CFFDEngine g_engine;

//+------------------------------------------------------------------+
//| Função de inicialização do Expert                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- Inicializar o mecanismo FFD com d=0,4, limiar=1e-5 e transformação logarítmica ativada
//--- Esta configuração cria uma janela de ponderação de memória estática durante a fase de inicialização do EA
   if(!g_engine.Init(0.4, 1 e-5, true))
     {
      Print("FFD engine init failed");
      return(INIT_FAILED);
     }
   return(INIT_SUCCEEDED);
  }

//+------------------------------------------------------------------+
//| Função de marcação do Expert                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- Consultar o mecanismo para descobrir exatamente quantas barras históricas são necessárias
//--- para calcular um valor válido de FFD com base no limite de corte
   int need = g_engine.GetMinBars();
   double close[];

//--- Obter a profundidade necessária dos dados históricos de preços.
//--- Se o histórico ainda não estiver sincronizado ou for insuficiente, pule a execução para evitar erros.
   if(CopyClose(_Symbol, _Period, 0, need, close) < need)
      return;

//--- Certifique-se de que a indexação da matriz corresponda à ordem cronológica (a barra mais antiga no índice 0)
//--- para alinhar corretamente com as transformações da matriz do vetor de peso FFD invertida
   ArraySetAsSeries(close, false);

//--- Calcular o valor de saída estacionário, com diferenças fracionárias, para a barra atual em exibição
   double ffd_value = g_engine.Compute(close, need);

//--- Use o ffd_value como uma característica do seu modelo.
  }

Validação cruzada com Python

O arquivo complementar FFDValidation.mq5 (disponível no download do artigo) exporta os valores do FFD para um arquivo CSV. O script em Python ffd_cross_validate.py recalcula os mesmos valores usando a biblioteca afml e compara barra por barra. Em 5.000 barras do EURUSD H1 com d = 0,4 e limiar = 1e-5, a diferença absoluta máxima fica abaixo de 1e-12.

Notas sobre desempenho

  • Alocação do vetor de pesos: uma vez em OnInit(). Alocação zero no caminho do tick.
  • Cálculo por barra: produto escalar O(largura). Em hardware moderno, um produto escalar sobre 1.457 elementos é concluído em menos de 50 μs.
  • O ComputeBuffer() usa o argumento prev_calculated para pular as barras já calculadas — apenas a barra atual incompleta é recalculada a cada tick.

Referências e artigo complementar

Traduzido do inglês pela MetaQuotes Ltd.
Publicação original: https://www.mql5.com/en/code/72499

Oscilador TRIX de Tendência de Longo Prazo Oscilador TRIX de Tendência de Longo Prazo

Oscilador de momentum e tendência de longo prazo baseado na filtragem dupla TRIX e LWMA.

Institutional Kinematic Price Physics (Velocity and Acceleration) Institutional Kinematic Price Physics (Velocity and Acceleration)

Um mecanismo físico quantitativo que aplica o cálculo diferencial à evolução dos preços, extraindo a verdadeira velocidade do mercado (1ª derivada) e a aceleração do mercado (2ª derivada) para prever o esgotamento da tendência antes que ele ocorra.

Accumulation/Distribution Accumulation/Distribution

O Indicador Accumulation/Distribution (Acumulação/Distribuição ou A/D) é determinado pelas mudanças de preço e volume.

Accelerator Oscillator (AC) Accelerator Oscillator (AC)

O Indicador Acceleration/Deceleration (Aceleração/Desaceleração ou AC) mede a aceleração e a desaceleração da força motriz atual do mercado.