Unisciti alla nostra fan page
- Visualizzazioni:
- 49
- Valutazioni:
- Pubblicato:
-
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.

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
- Copiare FFDEngine.mqh nella cartella MQL5\Include\ (o nella sottocartella specificata durante il download da CodeBase — vedere i percorsi dei file di seguito).
- Copiare FFD.mq5 nella cartella MQL5\Indicators\Downloads\ (dove viene salvato automaticamente al momento del download da CodeBase).
- Compilare entrambi i file in MetaEditor. L’indicatore dovrebbe compilarsi senza avvisi con l’opzione #property strict.
- 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
- López de Prado, M. (2018). Advances in Financial Machine Learning, Capitolo 5 (Differenziazione frazionaria), pp. 76–95. Wiley.
- Teoria completa, implementazione in Python e ricerca dei parametri basata su ADF: Feature Engineering per il ML — Parte 2: Implementazione della differenziazione frazionaria a larghezza fissa in MQL5 di Patrick M. Njoroge.
- Strumenti di validazione correlati: FFDValidation.mq5 e ffd_cross_validate.py — inclusi nel pacchetto scaricabile dell’articolo.
Tradotto dall’inglese da MetaQuotes Ltd.
Codice originale https://www.mql5.com/en/code/72499
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)
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 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
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.