Guarda come scaricare robot di trading gratuitamente
Ci trovi su Twitter!
Unisciti alla nostra fan page
Script interessante?
Pubblica il link!
lasciare che altri lo valutino
Ti è piaciuto lo script? Provalo nel Terminale MetaTrader 5
Visualizzazioni:
49
Valutazioni:
(6)
Pubblicato:
FFD.mq5 (3.38 KB) visualizza
\MQL5\Include\
Freelance MQL5 Hai bisogno di un robot o indicatore basato su questo codice? Ordinalo su Freelance Vai a Freelance

I prezzi grezzi del forex e dei futures sono non stazionari: i modelli standard di regressione e classificazione addestrati su di essi presentano gravi distorsioni di anticipazione e correlazioni spurie. La soluzione ingenua — la differenziazione intera — elimina la non stazionarietà ma, nel farlo, distrugge tutta la memoria dei prezzi, scartando proprio quella struttura di autocorrelazione di cui un modello predittivo ha bisogno.

La differenziazione frazionaria a larghezza fissa (FFD), introdotta nel Capitolo 5 di *Advances in Financial Machine Learning* (López de Prado, 2018), risolve questo problema effettuando la differenziazione con un ordine non intero d ∈ (0, 1) appena sufficiente per garantire la stazionarietà, pur conservando la massima memoria. Questo contributo fornisce un’implementazione MQL5 di livello produttivo di tale metodo.

Indicatore FFD: prezzo grezzo (in alto) rispetto alla serie FFD stazionaria (in basso)

Illustrazione a due pannelli dell’output FFD: prezzo grezzo non stazionario (a) e serie FFD stazionaria (b) con la finestra di lookback contrassegnata


Componenti

  • FFDEngine.mqh — Libreria “solo header” contenente la classe CFFDEngine. Fornisce Init(), Compute() (singola barra) e ComputeBuffer() (buffer completo dell’indicatore con ottimizzazione prev_calculated ). Nessuna allocazione dinamica di memoria dopo OnInit().
  • FFD.mq5 — Indicatore personalizzato che avvolge CFFDEngine. Disegna la serie FFD in una finestra del grafico separata. Supporta tutti i valori ENUM_APPLIED_PRICE.

Come funziona l’algoritmo

Il vettore dei pesi è definito dalla ricorrenza (AFML eq. 5.4):

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

L’iterazione si interrompe quando |w[k]| < soglia. Il vettore viene quindi invertito in modo che il prezzo più vecchio nella finestra di lookback riceva il peso minore e quello più recente riceva 1,0. Il valore FFD alla barra i è il prodotto scalare del vettore di pesi invertito con la finestra del logaritmo del prezzo [i−larghezza, …, i].

Per d = 0,4 e soglia = 1e-5, l’ampiezza della finestra è di 1 457 barre. Per soglia = 1e-3 è di 54 barre. La soglia controlla il compromesso tra stazionarietà e memoria: valori più piccoli preservano una maggiore memoria a costo di un requisito di lookback più ampio.

Parametri di input

Parametro Valore predefinito Descrizione
InpD 0,4 Ordine di differenziazione frazionaria. Intervallo tipico: 0,1–0,9. Valori superiori a 0,5 producono una differenziazione quasi intera; valori inferiori a 0,1 producono prezzi quasi grezzi. Il valore ottimale di d è il valore minimo che supera un test ADF al livello di significatività scelto — si veda l’articolo di approfondimento per la procedura di ricerca in Python.
InpThreshold 1e-5 Soglia di ponderazione τ. L’iterazione si interrompe quando |w[k]| < τ. Valori più piccoli producono una finestra più ampia e una migliore conservazione della memoria, ma richiedono un numero maggiore di barre storiche prima del primo risultato valido. Intervallo consigliato: da 1e-4 a 1e-5.
InpUseLog true Applica ln(prezzo) prima della differenziazione. Consigliato per serie di prezzi grezzi (chiusure, aperture, massimi, minimi). Impostare su false solo quando l’input è già una serie di rendimenti o di rendimenti logaritmici.
InpPrice PRICE_CLOSE Tipo di prezzo applicato. Accetta qualsiasi valore ENUM_APPLIED_PRICE: PRICE_OPEN, PRICE_HIGH, PRICE_LOW, PRICE_CLOSE, PRICE_MEDIAN, PRICE_TYPICAL, PRICE_WEIGHTED.

Installazione

  1. Copiare FFDEngine.mqh nella cartella MQL5\Include\ (o nella sottocartella specificata durante il download da CodeBase — vedere i percorsi dei file di seguito).
  2. Copiare FFD.mq5 nella cartella MQL5\Indicators\Downloads\ (dove viene salvato automaticamente al momento del download da CodeBase).
  3. Compilare entrambi i file in MetaEditor. L’indicatore dovrebbe compilarsi senza avvisi con l’opzione #property strict.
  4. Aggiungere FFD a qualsiasi grafico. La finestra dell’indicatore apparirà sotto il grafico principale dopo che la finestra di lookback (larghezza + 1 barra) sarà stata riempita.

Utilizzo di CFFDEngine nel proprio EA o indicatore

FFDEngine.mqh è una libreria di sole intestazioni. Includerla e chiamare Init() una volta in OnInit():

#include <FFDEngine.mqh>

//--- Istanza globale del motore di differenziazione frazionaria a larghezza fissa
CFFDEngine g_engine;

//+------------------------------------------------------------------+
//| Funzione di inizializzazione di Expert                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- Inizializza il motore FFD con d=0,4, soglia=1e-5 e trasformazione logaritmica abilitata
//--- Questa configurazione crea una finestra di peso della memoria statica durante la fase di inizializzazione dell'EA
   if(!g_engine.Init(0.4, 1 e-5, true))
     {
      Print("FFD engine init failed");
      return(INIT_FAILED);
     }
   return(INIT_SUCCEEDED);
  }

//+------------------------------------------------------------------+
//| Funzione di tick avanzata                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- Interrogare il motore per scoprire esattamente quante barre storiche sono necessarie
//--- per calcolare un valore FFD valido in base alla soglia di separazione
   int need = g_engine.GetMinBars();
   double close[];

//--- Recupera la profondità richiesta dei dati storici sui prezzi.
//--- Se la cronologia non è ancora sincronizzata o è incompleta, saltare l'esecuzione per evitare errori.
   if(CopyClose(_Symbol, _Period, 0, need, close) < need)
      return;

//--- Assicurarsi che l'indicizzazione dell'array corrisponda all'ordine cronologico (la barra più vecchia all'indice 0)
//--- per allinearsi correttamente alle trasformazioni della matrice del vettore di peso FFD invertita
   ArraySetAsSeries(close, false);

//--- Calcola il valore di output stazionario, ottenuto tramite differenziazione frazionaria, per la barra corrente
   double ffd_value = g_engine.Compute(close, need);

//--- Usa ffd_value come caratteristica per il tuo modello.
  }

Convalida incrociata con Python

Il file di accompagnamento FFDValidation.mq5 (disponibile nel download dell’articolo) esporta i valori FFD in un file CSV. Lo script Python ffd_cross_validate.py ricalcola gli stessi valori utilizzando la libreria afml ed effettua un confronto barra per barra. Su 5 000 barre dell’EURUSD H1 con d = 0,4 e soglia = 1e-5, la differenza assoluta massima è inferiore a 1e-12.

Note sulle prestazioni

  • Allocazione del vettore di pesi: una sola volta in OnInit(). Nessuna allocazione lungo il percorso dei tick.
  • Calcolo per barra: prodotto scalare O(width). Su hardware moderno, un prodotto scalare su 1 457 elementi viene completato in meno di 50 μs.
  • ComputeBuffer() utilizza l’argomento prev_calculated per saltare le barre già calcolate — solo la barra corrente incompleta viene ricalcolata ad ogni tick.

Riferimenti e articolo correlato

Tradotto dall’inglese da MetaQuotes Ltd.
Codice originale https://www.mql5.com/en/code/72499

MACD TradingView Style for MT5 MACD TradingView Style for MT5

MACD indicator replicating TradingView's visual style for MT5. 4-color histogram, SMA-seeded Signal line — values match TradingView bar-for-bar.

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

Un motore fisico quantitativo che applica il calcolo differenziale all'andamento dei prezzi, estraendo la vera velocità di mercato (derivata prima) e l'accelerazione di mercato (derivata seconda) per prevedere l'esaurimento del trend prima che si verifichi.

Session Boxes Session Boxes

Session Boxes is a custom indicator for MetaTrader 5 that draws color-coded rectangular boxes on the chart representing the high-low range of the Asia, London, and New York trading sessions. The indicator uses H1 data internally and supports configurable session hours in GMT along with a broker server offset parameter

Gold FVG Finder Gold FVG Finder

L'indicatore individua le zone di squilibrio (Fair Value Gap) sul grafico e segnala con una freccia quando il prezzo vi ritorna. È adatto per l'oro, il Forex e qualsiasi strumento liquido su timeframe da M5 a H4.