English
preview
Sigma Score Indikator für MetaTrader 5: Ein einfacher statistischer Anomalie-Detektor

Sigma Score Indikator für MetaTrader 5: Ein einfacher statistischer Anomalie-Detektor

MetaTrader 5Indikatoren |
33 0
TECHAURORA - FZCO
Dominic Michael Frehner

Einführung

Viele Händler lernen früh, dass sich die Preise nicht gleichmäßig und vorhersehbar bewegen. Die Märkte haben „ruhige“ Phasen und dann plötzliche Ausschläge, Einbrüche und schockartige Bewegungen. Eine praktische Methode, um festzustellen, ob eine Bewegung normal (typisch für den jüngsten Markt) oder ungewöhnlich (selten im Vergleich zum jüngsten Verhalten) ist, besteht darin, die Renditen zu standardisieren und sie in „Sigma-Einheiten“ auszudrücken.

Genau das tut der Indikator Sigma Score. Es wandelt die letzte Rendite in einen z-Score (auch Standard-Score genannt) um und stellt ihn in einem separaten Fenster dar. Einfach ausgedrückt, beantwortet der Sigma Score eine Frage:

„Um wie viele Standardabweichungen ist die Rendite des aktuellen Balkens von der durchschnittlichen Rendite der letzten N Balken entfernt?“

Das macht es für Anfänger nützlich, denn man benötigt keine komplexe Handelstheorie, um es zu lesen. Sie müssen nur wissen, dass ein Wert nahe 0 „normal“ ist, während große positive/negative Werte „ungewöhnlich starke“ Bewegungen signalisieren.


Was ist ein Sigma-Score und was bedeutet er?

In der Statistik misst der z-Score, wie weit ein Wert vom Mittelwert entfernt ist, in Einheiten der Standardabweichung. Die Standarddefinition lautet:

wobei x der aktuelle Wert, μ der Mittelwert und σ die Standardabweichung ist. In der Finanzwelt wird dieser Gedanke oft auch auf die Rendite angewandt.

Dieser Indikator verwendet logarithmische Renditen, definiert als:

Diese Renditedefinition ist in der quantitativen Finanzwirtschaft sehr verbreitet, da Log-Renditen über die Zeit hinweg additiv sind (sie „summieren sich schön“ über mehrere Perioden). Daher, in diesem Indikator:

  • x ist die aktuelle Log-Rendite
  • μ ist die durchschnittliche logarithmische Rendite über die letzten InpLookback-Balken
  • σ ist die Standardabweichung der logarithmischen Renditen über die letzten InpLookback-Balken

Die Standardabweichung der (logarithmischen) Renditen ist ebenfalls eine gängige Methode zur Darstellung der historischen Volatilität.


Warum die Standardschwellenwerte oft ±2,0 sind

Wären die Renditen vollkommen normalverteilt (was auf den realen Märkten nicht der Fall ist, aber dies ist dennoch eine nützliche Faustregel), dann würden etwa 95 % der Beobachtungen innerhalb von ±2 Standardabweichungen vom Mittelwert liegen.

Deswegen verwenden viele Händler:

  • Sigma Score > +2 als „ungewöhnlich starke positive Rendite“.
  • Sigma Score < -2 als „ungewöhnlich starke negative Rendite“.

Ein wichtiger Hinweis für den realen Handel: Die Statistiken der Finanzrenditen haben oft dicke Ränder (extreme Schwankungen treten häufiger auf, als eine perfekte Normalverteilung vermuten ließe). Schwellenwerte sind also am besten als praktische „Stress-/Anomaliezonen“ zu behandeln, nicht als garantierte Wahrscheinlichkeiten.

Anmerkung: In dieser Implementierung umfasst das rollierende Fenster den Rücklauf des aktuellen Balkens (j beginnt bei 0), sodass der z-Score anhand einer Rückblickstichprobe berechnet wird, die die aktuelle Beobachtung enthält.


Erstellung des Indikators

Schritt 1. Erstellen des Indikatorskeletts (Eigenschaften und Darstellung)

Wenn Sie eine neue Indikator-Datei in MetaEditor erstellen, ist der erste wichtige Abschnitt der #property-Block. Hier können Sie MetaTrader 5 mitteilen, wie der Indikator aussehen soll.

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrBlue
#property indicator_width1  2
#property indicator_label1  "Sigma Score"

Was wir hier gemacht haben:

  • indicator_separate_window: Der Indikator wird unterhalb des Hauptcharts gezeichnet.
  • 1 Puffer + 1 Chart: Wir benötigen nur eine Zeile (Sigma Score).
  • DRAW_LINE: MetaTrader 5 zieht eine Linie aus den von uns angegebenen Werten.
  • Farbe/Beschriftung: Die Zeile wird als „Sigma Score“ in Blau angezeigt.

Schritt 2. Eingänge (machen den Indikator konfigurierbar)

Inputs sind die Einstellungen, die ein Nutzer in MetaTrader 5 ändern kann:

input int    InpLookback = 20;
input double InpUpperThreshold = 2.0;
input double InpLowerThreshold = -2.0;

Was dies in der Praxis bedeutet:

  • Rückblick: wie viele Balken definieren die „jüngste Vergangenheit“ für Mittelwert und Volatilität.
  • Obere/untere Schwellenwerte: Orientierungslinien (oft ±2 als Zone für „große Bewegungen“).

Schritt 3. Puffer und Variablen

Indikatoren werden durch Füllen von Arrays (Puffern) gezeichnet. Dieser Indikator hat einen Ausgangspuffer:

double SigmaBuffer[];
Wir benötigen nur einen Indikatorpuffer, da wir nur eine Reihe (Sigma Score) darstellen.

Schritt 4. Initialisierung

OnInit() wird einmal ausgeführt, wenn Sie den Indikator anhängen. Es bereitet alles vor, was MetaTrader 5 zum Zeichnen benötigt.

int OnInit()
{
    // Indicator buffers mapping
    SetIndexBuffer(0, SigmaBuffer, INDICATOR_DATA);
    ArraySetAsSeries(SigmaBuffer, true);
    
    // Set horizontal levels
    IndicatorSetInteger(INDICATOR_LEVELS, 3);
    IndicatorSetDouble(INDICATOR_LEVELVALUE, 0, 0.0);
    IndicatorSetDouble(INDICATOR_LEVELVALUE, 1, InpUpperThreshold);
    IndicatorSetDouble(INDICATOR_LEVELVALUE, 2, InpLowerThreshold);
    
    IndicatorSetInteger(INDICATOR_LEVELCOLOR, 0, clrGray);
    IndicatorSetInteger(INDICATOR_LEVELCOLOR, 1, clrRed);
    IndicatorSetInteger(INDICATOR_LEVELCOLOR, 2, clrGreen);
    
    IndicatorSetInteger(INDICATOR_LEVELSTYLE, 0, STYLE_DOT);
    IndicatorSetInteger(INDICATOR_LEVELSTYLE, 1, STYLE_DASH);
    IndicatorSetInteger(INDICATOR_LEVELSTYLE, 2, STYLE_DASH);
    
    // Set indicator labels
    PlotIndexSetString(0, PLOT_LABEL, "Sigma Score");
    IndicatorSetString(INDICATOR_SHORTNAME, "Sigma Score (" + IntegerToString(InpLookback) + ")");
    IndicatorSetInteger(INDICATOR_DIGITS, 2);
    
    return(INIT_SUCCEEDED);
}

Was wir gerade gebaut haben:

  1. Puffer-Zuordnung (und Serienreihenfolge)
    SetIndexPuffer(0, SigmaPuffer, INDICATOR_DATA). Verbindet unseren SigmaBuffer[] mit dem Plot #0. Fortan wird MetaTrader, wann immer wir Wert wie SigmaBuffer[i] = ... zuweisen, mit diesen die Indikatorlinie zeichnen.
    ArraySetAsSeries(SigmaBuffer, true) sorgt dafür, dass sich die Puffer wie Preisarrays verhalten. Index 0 ist der jüngste Balken, Index 1 ist der vorhergehende Balken, usw. Dadurch bleibt die Indexierung konsistent mit close[0], close[1] usw.

  2. Horizontale Bezugslinien (mit Styling)
    IndicatorSetInteger(INDICATOR_LEVELS, 3) zeigt drei horizontale Bezugslinien an. Wir setzen sie auf 0,0, den oberen und den unteren Schwellenwert. Dadurch werden „normale“ Messwerte um den Nullpunkt von ungewöhnlich großen positiven oder negativen Werten visuell unterschieden.
    Ferner werden diese Ebenen zur besseren Lesbarkeit gestaltet. Die 0-Linie ist grau und gepunktet, während die Schwellenwerte rot/grün und gestrichelt sind, sodass die Extreme sofort auffallen.

  3. Benennung und Formatierung
    Wir legen die Beschriftung des Plots fest („Sigma Score“) und definieren einen Kurznamen, der den Rückblickswert enthält. „Sigma Score (20)“, „Sigma Score (50)“, usw. Dies ist nützlich, wenn Sie mehrere Instanzen des Indikators mit unterschiedlichen Rückblicken hinzufügen.
    Schließlich IndicatorSetInteger(INDICATOR_DIGITS, 2). Formatiert die Ausgabe auf zwei Dezimalstellen für eine saubere Anzeige.

Schritt 5. Die eigentliche Berechnung des Sigma-Scores in OnCalculate()

OnCalculate() ist der Punkt, an dem MetaTrader 5 fragt: „Geben Sie mir die Indikatorwerte für die Balken.“ In unserem Fall bedeutet das, dass für jeden Balken der Sigma Score berechnet und in SigmaBuffer[] geschrieben wird, damit MetaTrader die Linie zeichnen kann. Wir beginnen mit einer Prüfung der Mindestdaten:

if(rates_total < InpLookback + 1) 
{
    return(0);
}

Wir benötigen mindestens InpLookback-Balken, um die rollierende Statistik zu erstellen, und wir brauchen auch einen zusätzlichen Balken, weil der Log Return close[i] und close[i+1] verwendet. Wenn nicht genügend historische Daten vorhanden sind, beenden wir den Vorgang einfach und zeichnen nichts. Als Nächstes weisen wir MetaTrader 5 an, die eingehenden Arrays als Zeitreihen zu behandeln:

ArraySetAsSeries(close, true);
ArraySetAsSeries(time, true);

Aus Gründen der Konsistenz haben wir auch time[] als Zeitreihe festgelegt, obwohl diese Version die Zeit nicht direkt verwendet. Dadurch wird auch die Konsistenz der Indizierung gewährleistet. close[0] ist der jüngste Balken, close[1] der vorhergehende und so weiter. Das ist wichtig, denn unsere Schleifen beruhen auf dem „Blick in die Vergangenheit“ mit i + j und i + 1. Jetzt entscheiden wir, wie viele Balken wir tatsächlich neu berechnen müssen. MetaTrader 5 ruft Indikatoren wiederholt auf, sodass die Neuberechnung des gesamten Charts bei jedem Tick zu langsam wäre. Wir trennen den ersten Durchgang von späteren Aktualisierungen:

int start;
if(prev_calculated == 0)
{
    start = rates_total - InpLookback - 1;
    ArrayInitialize(SigmaBuffer, EMPTY_VALUE);
}
else
{
    start = rates_total - prev_calculated;
}

Beim allerersten Aufruf (prev_calculated == 0) initialisieren wir den Puffer mit EMPTY_VALUE. Dies ist wichtig. EMPTY_VALUE teilt MetaTrader 5 mit, dass das hier nicht gezeichnet werden soll, sodass Sie keine irreführenden Linien in Bereichen erhalten, in denen der Indikator noch nicht berechnet werden kann. Außerdem stellen wir den Beginn so ein, dass wir mit dem ältesten Balken beginnen, bei dem ein vollständiges Rückblicksfenster verfügbar ist. Bei nachfolgenden Aufrufen werden nur die neu gebildeten Balken berechnet. Jetzt kommt die eigentliche Sigma-Score-Berechnung. Wir gehen in einer Schleife durch die Balken, die wir aktualisieren müssen:

for(int i = start; i >= 0; i--)
{
    if(i + InpLookback >= rates_total)
    {
        SigmaBuffer[i] = EMPTY_VALUE;
        continue;
    }

    double sum_returns = 0;
    double sum_squared = 0;
    int valid_count = 0;

    for(int j = 0; j < InpLookback; j++)
    {
        int idx1 = i + j;
        int idx2 = i + j + 1;

        if(idx2 < rates_total && close[idx1] > 0 && close[idx2] > 0)
        {
            double log_return = MathLog(close[idx1] / close[idx2]);
            sum_returns += log_return;
            sum_squared += log_return * log_return;
            valid_count++;
        }
    }

    if(i + 1 < rates_total && close[i] > 0 && close[i + 1] > 0)
    {
        double current_return = MathLog(close[i] / close[i + 1]);

        if(valid_count >= InpLookback)
        {
            double mean = sum_returns / valid_count;
            double variance = (sum_squared / valid_count) - (mean * mean);
            if(variance < 0) variance = 0;

            double stdev = MathSqrt(variance);

            if(stdev > 0.0000001)
                SigmaBuffer[i] = (current_return - mean) / stdev;
            else
                SigmaBuffer[i] = 0;
        }
        else
        {
            SigmaBuffer[i] = EMPTY_VALUE;
        }
    }
    else
    {
        SigmaBuffer[i] = EMPTY_VALUE;
    }
}

Dieser Abschnitt erfüllt die Aufgabe in vollem Umfang und auf robuste Weise:

Zunächst werden die Balken übersprungen, für die kein vollständiges Rückblickfenster erstellt werden kann. Wenn i + InpLookback über den verfügbaren Verlauf hinausgeht, setzen wir SigmaBuffer[i] = EMPTY_VALUE und machen weiter. Dadurch wird verhindert, dass MetaTrader 5 Werte auf der Grundlage unvollständiger Daten ermittelt. Dann berechnen wir die Statistik der Log-Renditen über das Rückblicksfenster. Anstatt die Rückgaben in einem separaten Array zu speichern, berechnen wir sie „inline“ und akkumulieren zwei Summen:

  • sum_returns ist die Summe der Log-Renditen (für den Mittelwert)
  • sum_squaredistdie Summe der quadrierten Log-Renditen (für die Varianz)

Außerdem wird in valid_count gezählt, wie viele gültige Rückgabewerte wir berechnet haben. Da logarithmische Renditen positive Preise voraussetzen, wird mit close > 0 gerechnet. Wenn eine Rückgabe ungültig wäre, wird sie einfach übersprungen. Als Nächstes berechnen wir den log_return des aktuellen Balkens (den Wert, den wir standardisieren wollen). Wenn er gültig ist und wir ein vollständiges Rückblickfenster haben (valid_count >= InpLookback), rechnen wir wir folgt:

  • Mittelwert: sum_returns / valid_count
  • Varianz: (sum_squared / valid_count) - mean²
  • Standardabweichung: sqrt(Varianz)

Schließlich berechnen wir den Sigma-Score (z-score):

Im Code:

SigmaBuffer[i] = (current_return - mean) / stdev;

Wir verwenden auch einen kleinen Sicherheitsschwellenwert ( stdev > 0,0000001), um zu vermeiden, dass durch eine Zahl geteilt wird, die extrem nahe bei Null liegt. Wenn die Volatilität effektiv null ist, geben wir 0 aus, anstatt instabile Spitzen zu produzieren. Am Ende geben wir rates_total zurück, damit MetaTrader 5 weiß, dass wir Werte bis zum aktuellen Balken geliefert haben:

return(rates_total);

Wir haben eine vollständige Rolling-Z-Score-Engine implementiert, die:

  • sicherstellt, dass genügend Balken vorhanden sind (InpLookback + 1),
  • nur das mit prev_calculated berechnet, was benötigt wird,
  • nicht berechenbare Bereiche mit EMPTY_VALUE ausblendet,
  • Log-Renditen, gleitenden Mittelwert, gleitende Standardabweichung berechnet und
  • den endgültigen Sigma-Score sicher in einen einzelnen Plot-Puffer schreibt (keine Artefakte wegen einer Division durch Null).

Sigma-Score-Demonstration


Wie man über die Verwendung des Sigma Score im Handel nachdenkt

Der Sigma Score ist für sich genommen keine vollständige Strategie. Sie ist am besten als Kontext- und Zeitplanungsinstrument geeignet. In dem Moment, in dem Sie einen Extremwert sehen, können Sie entscheiden, ob Sie mit auf eine Rückkehr zum Mittelwert setzen oder einem Momentum folgen wollen.

Wenn Sie die Rückkehr zum Mittelwert handeln, behandeln Sie extreme Sigma-Werte als „Dehnungsübungen“. Wenn der Sigma-Score beispielsweise unter -2 liegt, hat sich der Markt im Vergleich zu den letzten 20 Balken ungewöhnlich stark nach unten bewegt. In einem Markt, der sich in einer gewissen Spanne bewegt, suchen Händler oft nach einem Stabilisierungsmuster (z. B. wenn der Kurs keine neuen Tiefststände mehr erreicht oder wenn sich ein steigendes Kerzenmuster ergibt) und erwarten dann eine gewisse Rückkehr zum jüngsten Mittelwert.

Wenn Sie mit Momentum handeln, behandeln Sie extreme Sigma-Werte als „Schock-Fortsetzungssignale“. Liegt der Sigma Score beispielsweise über +2 und befindet sich der Markt in einem klaren Aufwärtstrend, kann dies eher auf eine starke Impulsbewegung als auf eine sofortige Abschwächung hindeuten. In diesem Fall kann der Sigma Score verwendet werden, um zu vermeiden, dass zu früh auf eine Gegenbewegung gesetzt wird, oder um den Einstieg in Rücksetzer zu timen, statt auf ein nachlassen der Kraft.

In beiden Fällen ist der Sigma Score auch für das Risikomanagement nützlich: Ein extremer Sigma-Wert bedeutet oft, dass sich der Markt schnell bewegt, dass sich die Spreads ausweiten können und dass die Stopps mehr Platz benötigen. Selbst wenn Sie das Signal nicht handeln, kann der Indikator Ihnen helfen, die Positionsgröße und die Erwartungen anzupassen.


Schlussfolgerung

Wir begannen mit einem allgemeinen Handelsproblem. Es ist schwer zu beurteilen, ob eine Kursbewegung wirklich „extrem“ ist oder einfach nur normales Rauschen für das aktuelle Marktregime. Durch den schrittweisen Aufbau des Sigma-Score-Indikators haben Sie nun eine einfache, objektive Möglichkeit, diese Frage in einer Zahl zu messen.

Wir haben einen vollständigen MetaTrader 5-Indikator implementiert, der logarithmische Renditen berechnet, ihren gleitenden Mittelwert und ihre Standardabweichung über einen konfigurierbaren Rückblickzeitraum ermittelt und die letzte Rendite in einen z-Score (Sigma Score) umwandelt. Folglich können Sie Marktbewegungen in „Sigma-Einheiten“ interpretieren: Werte nahe 0 weisen auf normales Verhalten hin, während Werte jenseits Ihrer Schwellenwerte (z. B. ±2) auf ungewöhnlich starke Auf- oder Abwärtsimpulse im Vergleich zu den jüngsten Bedingungen hinweisen.

Vor allem aber lernten wir auch, wie wir diese Ergebnisse in der Praxis anwenden können. Sigma Score kann zur Messung des Stresses im Markt verwendet werden, um sowohl Mean-Reversion- als auch Momentum-Entscheidungen zu unterstützen, und als Risikomanagement-Tool, um zu erkennen, wann die Bedingungen anormal sind und die Positionsgröße oder der Stopp-Abstand angepasst werden sollte. Mit dem vollständigen Code können Sie den Indikator nun problemlos erweitern, indem Sie Warnungen, Trendfilter oder eine Multi-Zeitrahmen-Logik hinzufügen, während die Kernidee gleich bleibt. Quantifizierung, wie ungewöhnlich die jüngste Entwicklung im Vergleich zur jüngsten Geschichte ist.


Referenzen

Übersetzt aus dem Englischen von MetaQuotes Ltd.
Originalartikel: https://www.mql5.com/en/articles/20728

Beigefügte Dateien |
Sigma_Score.mq5 (5.83 KB)
Die Übertragung der Trading-Signale in einem universalen Expert Advisor. Die Übertragung der Trading-Signale in einem universalen Expert Advisor.
In diesem Artikel wurden die verschiedenen Möglichkeiten beschrieben, um die Trading-Signale von einem Signalmodul des universalen EAs zum Steuermodul der Positionen und Orders zu übertragen. Es wurden die seriellen und parallelen Interfaces betrachtet.
Larry Williams Marktgeheimnisse (Teil 2): Automatisierung eines Handelssystems der Marktstruktur Larry Williams Marktgeheimnisse (Teil 2): Automatisierung eines Handelssystems der Marktstruktur
Lernen Sie, wie Sie die Marktstrukturkonzepte von Larry Williams in MQL5 automatisieren können, indem Sie einen vollständigen Expert Advisor erstellen, der Umkehrpunkte liest, Handelssignale erzeugt, das Risiko verwaltet und eine dynamische Trailing-Stop-Strategie anwendet.
Eine alternative Log-datei mit der Verwendung der HTML und CSS Eine alternative Log-datei mit der Verwendung der HTML und CSS
In diesem Artikel werden wir eine sehr einfache, aber leistungsfähige Bibliothek zur Erstellung der HTML-Dateien schreiben, dabei lernen wir auch, wie man eine ihre Darstellung einstellen kann (nach seinem Geschmack) und sehen wir, wie man es leicht in seinem Expert Advisor oder Skript hinzufügen oder verwenden kann.
Erstellen von nutzerdefinierten Indikatoren in MQL5 (Teil 3): Erweiterungen auf Multi-Messuhren mit Sektor- und Rundstilen Erstellen von nutzerdefinierten Indikatoren in MQL5 (Teil 3): Erweiterungen auf Multi-Messuhren mit Sektor- und Rundstilen
In diesem Artikel erweitern wir den Indikator auf Basis von Messuhren in MQL5, um mehrere Oszillatoren zu unterstützen und dem Nutzer die Auswahl durch eine Enumeration für einzelne oder kombinierte Anzeigen zu ermöglichen. Wir führen sektorale und runde Messuhren-Stile über abgeleitete Klassen eines Basis-Messuhren-Systems ein und verbessern die Falldarstellung mit Bögen, Linien und Polygonen für ein verfeinertes visuelles Erscheinungsbild.