Participe de nossa página de fãs
Coloque um link para ele, e permita que outras pessoas também o avaliem
Avalie seu funcionamento no terminal MetaTrader 5
- Visualizações:
- 36
- Avaliação:
- Publicado:
-
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.

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
- 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).
- Copie o FFD.mq5 para MQL5\Indicators\Downloads\ (colocado lá automaticamente durante o download do CodeBase).
- Compile ambos os arquivos no MetaEditor. O indicador deve ser compilado sem avisos sob a opção #property strict.
- 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
- López de Prado, M. (2018). Advances in Financial Machine Learning, Capítulo 5 (Diferenciação Fracionária), pp. 76–95. Wiley.
- Teoria completa, implementação em Python e busca de parâmetros baseada em ADF: Engenharia de Características para ML — Parte 2: Implementação de Diferenciação Fracionária de Largura Fixa em MQL5, por Patrick M. Njoroge.
- Ferramentas de validação complementares: FFDValidation.mq5 e ffd_cross_validate.py — incluídas no pacote de download do artigo.
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 de momentum e tendência de longo prazo baseado na filtragem dupla TRIX e LWMA.
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
O Indicador Accumulation/Distribution (Acumulação/Distribuição ou A/D) é determinado pelas mudanças de preço e volume.
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.