Voir comment télécharger gratuitement des robots de trading
Retrouvez-nous sur Telegram !
Rejoignez notre page de fans
Un script intéressant ?
Poster un lien vers celui-ci -
laisser les autres l'évaluer
Vous avez aimé le script ? Essayez-le dans le terminal MetaTrader 5
Indicateurs

Fixed-Width Fractional Differencing (FFD) - indicateur pour MetaTrader 5

Patrick Murimi Njoroge
Patrick Murimi Njoroge
I build robust trading tools for MetaTrader. Browse my free articles to learn, get the premium EAs/indicators on the Market, or hire me for custom coding.
| French English Русский 中文 Español Deutsch 日本語 Português 한국어 Italiano Türkçe
Vues:
126
Note:
(6)
Publié:
FFD.mq5 (3.38 KB) afficher
\MQL5\Include\
FFDEngine.mqh (10.63 KB) afficher
MQL5 Freelance Besoin d'un robot ou d'un indicateur basé sur ce code ? Commandez-le sur Freelance Aller sur Freelance

Les cours bruts du Forex et des contrats à terme sont non stationnaires : les modèles standard de régression et de classification entraînés sur ces données sont confrontés à un biais d’anticipation important et à des corrélations fallacieuses. La solution naïve — la différenciation en nombres entiers — élimine la non-stationnarité mais détruit toute la mémoire des cours au passage, supprimant ainsi la structure d’autocorrélation dont un modèle prédictif a justement besoin.

La différenciation fractionnaire à largeur fixe (FFD), présentée au chapitre 5 de l’ouvrage *Advances in Financial Machine Learning* (López de Prado, 2018), résout ce problème en effectuant une différenciation d’ordre non entier d ∈ (0, 1), juste suffisante pour assurer la stationnarité tout en conservant un maximum de mémoire. Cette contribution fournit une implémentation MQL5 de qualité opérationnelle de cette méthode.

Indicateur FFD : cours brut (en haut) par rapport à la série FFD stationnaire (en bas)

Illustration en deux panneaux du résultat de la FFD : cours brut non stationnaire (a) et série FFD stationnaire (b) avec la fenêtre de rétrospective indiquée


Composants

  • FFDEngine.mqh — Bibliothèque « header-only » contenant la classe CFFDEngine. Fournit les fonctions Init(), Compute() (une seule barre) et ComputeBuffer() (tampon complet de l’indicateur avec optimisation « prev_calculated » ). Aucune allocation dynamique de mémoire après OnInit().
  • FFD.mq5 — Indicateur personnalisé qui encapsule CFFDEngine. Trace la série FFD dans une fenêtre de graphique distincte. Prend en charge toutes les valeurs ENUM_APPLIED_PRICE.

Fonctionnement de l’algorithme

Le vecteur de poids est défini par la récurrence (équation 5.4 de l’AFML) :

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

L'itération s'arrête lorsque |w[k]| < seuil. Le vecteur est ensuite inversé de sorte que le cours le plus ancien de la fenêtre de rétrospective reçoive le poids le plus faible et que le cours le plus récent reçoive 1,0. La valeur FFD à la barre i correspond au produit scalaire du vecteur de poids inversé et de la fenêtre de cours logarithmiques [i−largeur, …, i].

Pour d = 0,4 et seuil = 1e-5, la largeur de la fenêtre est de 1 457 barres. Pour un seuil = 1e-3, elle est de 54 barres. Le seuil contrôle le compromis entre stationnarité et mémoire : des valeurs plus faibles préservent davantage de mémoire au prix d’une fenêtre rétrospective plus large.

Paramètres d’entrée

Paramètre Valeur par défaut Description
InpD 0,4 Ordre de différenciation fractionnaire. Plage typique : 0,1–0,9. Les valeurs supérieures à 0,5 produisent une différenciation quasi-entière ; les valeurs inférieures à 0,1 produisent des prix quasi-bruts. La valeur optimale de d est la valeur minimale qui satisfait au test ADF au niveau de signification choisi — voir l’article associé pour la procédure de recherche en Python.
InpThreshold 1e-5 Seuil de pondération τ. L’itération s’arrête lorsque |w[k]| < τ. Des valeurs plus faibles produisent une fenêtre plus large et une meilleure préservation de la mémoire, mais nécessitent davantage de barres historiques avant d’obtenir le premier résultat valide. Plage recommandée : 1e-4 à 1e-5.
InpUseLog true Applique ln(prix) avant le calcul de la différence. Recommandé pour les séries de prix brutes (cours de clôture, d'ouverture, plus-hauts, plus-bas). Ne définissez cette option sur « false » que si l'entrée est déjà une série de rendements ou de rendements logarithmiques.
InpPrice PRICE_CLOSE Type de cours appliqué. Accepte n'importe quelle valeur de ENUM_APPLIED_PRICE: PRICE_OPEN, PRICE_HIGH, PRICE_LOW, PRICE_CLOSE, PRICE_MEDIAN, PRICE_TYPICAL, PRICE_WEIGHTED.

Installation

  1. Copiez FFDEngine.mqh dans votre dossier MQL5\Include\ (ou dans le sous-dossier spécifié lors du téléchargement depuis CodeBase — voir les emplacements des fichiers ci-dessous).
  2. Copiez FFD.mq5 dans le dossier MQL5\Indicators\Downloads\ (il y est placé automatiquement lors du téléchargement depuis CodeBase).
  3. Compilez les deux fichiers dans MetaEditor. L’indicateur devrait se compiler sans avertissement sous #property strict.
  4. Ajoutez FFD à n'importe quel graphique. La fenêtre de l'indicateur apparaîtra sous le graphique principal une fois que la fenêtre de rétrospective (largeur + 1 barre) aura été remplie.

Utilisation de CFFDEngine dans votre propre EA ou indicateur

FFDEngine.mqh est une bibliothèque « header-only ». Incluez-la et appelez Init() une fois dans OnInit():

#include <FFDEngine.mqh>

//--- Instance globale du moteur de différenciation fractionnaire à largeur fixe
CFFDEngine g_engine;

//+------------------------------------------------------------------+
//| Fonction d'initialisation de l'expert                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- Initialisation du moteur FFD avec d = 0,4, seuil = 1e-5 et transformation logarithmique activée
//--- Cette configuration crée une fenêtre de pondération de mémoire statique pendant la phase d'initialisation de l'EA
   if(!g_engine.Init(0.4, 1 e-5, true))
     {
      Print("FFD engine init failed");
      return(INIT_FAILED);
     }
   return(INIT_SUCCEEDED);
  }

//+------------------------------------------------------------------+
//| Fonction « tick » d'Expert                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- Interroger le moteur pour déterminer exactement le nombre de barres historiques nécessaires
//--- pour calculer une valeur FFD valide en fonction du seuil de coupure
   int need = g_engine.GetMinBars();
   double close[];

//--- Récupérer l'historique des cours sur la période souhaitée.
//--- Si l'historique n'est pas encore synchronisé ou s'il est insuffisant, ignorer l'exécution pour éviter les erreurs.
   if(CopyClose(_Symbol, _Period, 0, need, close) < need)
      return;

//--- S'assurer que l'indexation du tableau correspond à l'ordre chronologique (le graphique le plus ancien à l'index 0)
//--- pour s'aligner correctement avec les transformations de la matrice du vecteur de poids FFD inversée
   ArraySetAsSeries(close, false);

//--- Calculer la valeur de sortie stationnaire, obtenue par différences fractionnaires, pour la barre actuelle
   double ffd_value = g_engine.Compute(close, need);

//--- Utilisez ffd_value comme caractéristique pour votre modèle.
  }

Validation croisée avec Python

Le fichier associé FFDValidation.mq5 (disponible dans le téléchargement de l’article) exporte les valeurs FFD vers un fichier CSV. Le script Python ffd_cross_validate.py recalcule les mêmes valeurs à l’aide de la bibliothèque afml et effectue une comparaison barre par barre. Sur 5 000 barres de l’EURUSD en H1 avec d = 0,4 et un seuil = 1e-5, la différence absolue maximale est inférieure à 1e-12.

Remarques sur les performances

  • Allocation du vecteur de poids : une seule fois dans OnInit(). Aucune allocation sur le chemin des ticks.
  • Calcul par barre : produit scalaire de complexité O(largeur). Sur du matériel moderne, un produit scalaire sur 1 457 éléments s’effectue en moins de 50 μs.
  • La fonction ComputeBuffer() utilise l’argument prev_calculated pour ignorer les barres déjà calculées — seule la barre incomplète actuelle est recalculée à chaque tick.

Références et article associé

Traduit de l’anglais par MetaQuotes Ltd.
Code original : https://www.mql5.com/en/code/72499

Oscillateur TRIX de tendance à long terme Oscillateur TRIX de tendance à long terme

Oscillateur de momentum et de tendance à long terme basé sur un double filtrage TRIX et LWMA.

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

Un moteur physique quantitatif qui applique le calcul différentiel à l'évolution des cours, en extrayant la vitesse réelle du marché (dérivée première) et l'accélération du marché (dérivée deuxième) afin de prédire l'épuisement d'une tendance avant qu'il ne se produise.

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

Cet indicateur identifie les zones de déséquilibre (Fair Value Gap) sur le graphique et signale par une flèche lorsque le cours y revient. Il convient à l'or, au Forex et à tous les instruments liquides sur des périodes allant de M5 à H4.