Schau, wie man Roboter kostenlos herunterladen kann
Finden Sie uns auf Twitter!
und werden Sie Mitglied unserer Fangruppe
Interessantes Skript?
Veröffentliche einen Link auf das Skript, damit die anderen ihn auch nutzen können
Hat Ihnen das Skript gefallen?
Bewerten Sie es im Terminal MetaTrader 5
Ansichten:
23
Rating:
(5)
Veröffentlicht:
FFD.mq5 (3.38 KB) ansehen
\MQL5\Include\
FFDEngine.mqh (10.63 KB) ansehen
MQL5 Freelance Benötigen Sie einen Roboter oder Indikator, der auf diesem Code basiert? Bestellen Sie ihn im Freelance-Bereich Zum Freelance

Rohdaten von Devisen- und Terminkursen sind nichtstationär: Standard-Regressions- und Klassifikationsmodelle, die darauf trainiert werden, sind mit erheblichen Vorausschauverzerrungen und Scheinkorrelationen konfrontiert. Die naive Lösung – die ganzzahlige Differenzierung – beseitigt zwar die Nichtstationarität, zerstört dabei jedoch jegliches Kursgedächtnis und verwirft genau jene Autokorrelationsstruktur, die ein Vorhersagemodell benötigt.

Die in Kapitel 5 von „Advances in Financial Machine Learning“ (López de Prado, 2018) vorgestellte fraktionale Differenzierung mit fester Breite (FFD) löst dieses Problem durch Differenzierung mit einer nicht-ganzzahligen Ordnung d ∈ (0, 1), die gerade ausreicht, um Stationarität zu erreichen, und gleichzeitig ein Maximum an „Memory“ bewahrt. Diese Einreichung liefert eine produktionsreife MQL5-Implementierung dieser Methode.

FFD-Indikator: Rohpreis (oben) im Vergleich zur stationären FFD-Reihe (unten)

Zweifeldige Darstellung der FFD-Ausgabe: nichtstationärer Rohkurs (a) und stationäre FFD-Reihe (b) mit markiertem Lookback-Fenster


Komponenten

  • FFDEngine.mqh — reine Header-Bibliothek, die die Klasse CFFDEngine enthält. Bietet Init(), Compute() (einzelner Balken) und ComputeBuffer() (vollständiger Indikatorpuffer mit „prev_calculated“-Optimierung ). Keine dynamische Speicherzuweisung nach OnInit().
  • FFD.mq5 – Benutzerdefinierter Indikator, der CFFDEngine umschließt. Zeichnet die FFD-Reihe in einem separaten Chartfenster. Unterstützt alle ENUM_APPLIED_PRICE-W erte.

So funktioniert der Algorithmus

Der Gewichtsvektor wird durch die Rekursionsformel (AFML Gl. 5.4) definiert:

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

Die Iteration endet, wenn |w[k]| < Schwellenwert ist. Der Vektor wird anschließend umgekehrt, sodass der älteste Kurs im Rückblickfenster das geringste Gewicht erhält und der neueste Kurs den Wert 1,0. Der FFD-Wert am Balken i ist das Skalarprodukt des umgekehrten Gewichtsvektors mit dem Log-Kurs-Fenster [i−Breite, …, i].

Für d = 0,4 und Schwellenwert = 1e-5 beträgt die Fensterbreite 1 457 Balken. Für Schwellenwert = 1e-3 beträgt sie 54 Balken. Der Schwellenwert steuert den Kompromiss zwischen Stationarität und Gedächtnis: Kleinere Werte bewahren mehr Gedächtnis auf Kosten einer größeren erforderlichen Rückblickperiode.

Eingabeparameter

Parameter Standard Beschreibung
InpD 0,4 Ordnung der fraktionalen Differenzierung. Typischer Bereich: 0,1–0,9. Werte über 0,5 führen zu einer annähernd ganzzahligen Differenzierung; Werte unter 0,1 führen zu annähernd Rohpreisen. Der optimale Wert für d ist der Minimalwert, der einen ADF-Test auf dem gewählten Signifikanzniveau besteht – siehe den Begleitartikel zum Suchverfahren in Python.
InpThreshold 1e-5 Gewichtungsschwellenwert τ. Die Iteration wird beendet, wenn |w[k]| < τ ist. Kleinere Werte führen zu einem breiteren Fenster und einer besseren Speicherauslastung, erfordern jedoch mehr historische Balken, bevor die erste gültige Ausgabe vorliegt. Empfohlener Bereich: 1e-4 bis 1e-5.
InpUseLog true Wendet ln(Preis) vor der Differenzbildung an. Empfohlen für Rohpreisdatenreihen (Schlusskurse, Eröffnungskurse, Höchst- und Tiefstkurse). Nur auf „false“ setzen, wenn die Eingabe bereits eine Rendite- oder Log-Rendite-Reihe ist.
InpPrice PRICE_CLOSE Angewandter Kurstyp. Akzeptiert jeden Wert aus ENUM_APPLIED_PRICE: PRICE_OPEN, PRICE_HIGH, PRICE_LOW, PRICE_CLOSE, PRICE_MEDIAN, PRICE_TYPICAL, PRICE_WEIGHTED.

Installation

  1. Kopieren Sie FFDEngine.mqh in Ihren Ordner „MQL5\Include\ “ (oder in den beim CodeBase-Download angegebenen Unterordner – siehe Dateipfade unten).
  2. Kopieren Sie FFD.mq5 in den Ord ner „MQL5\Indicators\Downloads\ “ (wird beim Herunterladen von CodeBase automatisch dort abgelegt).
  3. Kompilieren Sie beide Dateien im MetaEditor. Der Indikator sollte unter #property strict ohne Warnungen kompiliert werden.
  4. Fügen Sie FFD zu einem beliebigen Chart hinzu. Das Indikatorfenster erscheint unterhalb des Hauptcharts, sobald das Lookback-Fenster (Breite + 1 Bar) gefüllt ist.

Verwendung von CFFDEngine in Ihrem eigenen EA oder Indikator

FFDEngine.mqh ist eine reine Header-Bibliothek. Binden Sie sie ein und rufen Sie Init() einmal in OnInit() auf:

#include <FFDEngine.mqh>

//--- Globale Instanz der Engine für die fraktionierte Differenzierung mit fester Breite
CFFDEngine g_engine;

//+------------------------------------------------------------------+
//| Initialisierungsfunktion für den Experten                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- FFD-Engine mit d=0,4, Schwellenwert=1e-5 und aktivierter Log-Transformation initialisieren
//--- Diese Konfiguration erstellt während der EA-Initialisierungsphase ein statisches Speichergewichtsfenster
   if(!g_engine.Init(0.4, 1 e-5, true))
     {
      Print("FFD engine init failed");
      return(INIT_FAILED);
     }
   return(INIT_SUCCEEDED);
  }

//+------------------------------------------------------------------+
//| Expert-Tick-Funktion                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- Die Engine abfragen, um herauszufinden, wie viele historische Balken genau benötigt werden
//--- zur Berechnung eines gültigen FFD-Werts auf der Grundlage des Schwellenwerts
   int need = g_engine.GetMinBars();
   double close[];

//--- Die gewünschte Tiefe der historischen Kursdaten abrufen.
//--- Falls der Verlauf noch nicht synchronisiert oder unvollständig ist, wird die Ausführung übersprungen, um Fehler zu vermeiden.
   if(CopyClose(_Symbol, _Period, 0, need, close) < need)
      return;

//--- Sicherstellen, dass die Indizierung des Arrays der chronologischen Reihenfolge entspricht (ältester Balken am Index 0)
//--- um eine korrekte Ausrichtung mit den umgekehrten FFD-Gewichtsvektor-Matrix-Transformationen zu gewährleisten
   ArraySetAsSeries(close, false);

//--- Berechnung des stationären, fraktional differenzierten Ausgabewerts für den aktuellen Live-Balken
   double ffd_value = g_engine.Compute(close, need);

//--- Verwenden Sie ffd_value als Merkmal für Ihr Modell.
  }

Kreuzvalidierung mit Python

Die Begleitdatei FFDValidation.mq5 (im Download des Artikels verfügbar) exportiert FFD-Werte in eine CSV-Datei. Das Python-Skript ffd_cross_validate.py berechnet dieselben Werte mithilfe der afml-Bibliothek neu und vergleicht sie Bar für Bar. Bei 5.000 Bars des EURUSD-H1-Charts mit d = 0,4 und Schwellenwert = 1e-5 liegt die maximale absolute Differenz unter 1e-12.

Hinweise zur Performance

  • Zuweisung des Gewichtsvektors: einmalig in OnInit(). Keine Zuweisung auf dem Tick-Pfad.
  • Berechnung pro Bar: O(Breite) Skalarprodukt. Auf moderner Hardware dauert ein Skalarprodukt über 1 457 Elemente weniger als 50 μs.
  • ComputeBuffer() verwendet das Argument „prev_calculated“, um bereits berechnete Balken zu überspringen – bei jedem Tick wird nur der aktuelle, unvollständige Balken neu berechnet.

Literaturhinweise und Begleitartikel

Übersetzt aus dem Englischen von MetaQuotes Ltd.
Originalpublikation: https://www.mql5.com/en/code/72499

Langfristiger Trend – TRIX-Oszillator Langfristiger Trend – TRIX-Oszillator

Langfristiger Momentum- und Trendoszillator auf Basis einer doppelten TRIX- und LWMA-Filterung.

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

Eine quantitative Physik-Engine, die Differentialrechnung auf Kursbewegungen anwendet und daraus die tatsächliche Marktgeschwindigkeit (1. Ableitung) sowie die Marktbeschleunigung (2. Ableitung) ermittelt, um das Ende eines Trends vorherzusagen, bevor es eintritt.

Accumulation/Distribution Accumulation/Distribution

Der Accumulation/Distribution Indikator wird aus Änderung von Preis und Volumen bestimmt.

Accelerator Oszillator (AC) Accelerator Oszillator (AC)

Der Acceleration/Deceleration Indikator (AC) misst die Beschleunigung und Verlangsamung des aktuellen Marktimpulses, der Kraft der Kursbewegung.