Sigma Score Indikator für MetaTrader 5: Ein einfacher statistischer Anomalie-Detektor
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.
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:
-
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. -
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. -
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).

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
- Campbell, J.Y., Lo, A.W. and MacKinlay, A.C. (1997) The Econometrics of Financial Markets. Princeton, NJ: Princeton University Press. Verfügbar unter: https://press.princeton.edu/books/paperback/9780691043012/the-econometrics-of-financial-markets (Abgerufen am 24. Dezember 2025).
- Cont, R. (2001) ‘Empirical properties of asset returns: stylized facts and statistical issues’, Quantitative Finance, 1(2), pp. 223–236. Verfügbar unter: https://www.cfm.com/wp-content/uploads/2022/12/163-1997-herd-behavior-and-aggregate-fluctuations-in-financial-market.pdf (Abgerufen am 24. Dezember 2025).
- Cont, R. (2001) ‘Empirical properties of asset returns: stylized facts and statistical issues’, Quantitative Finance, 1(2), pp. 223–236. Verfügbar unter: https://rama.cont.perso.math.cnrs.fr/pdf/empirical.pdf (Abgerufen am 24. Dezember 2025). (Optional) Verfügbar unter: https://www.tandfonline.com/doi/abs/10.1080/713665670 (Abgerufen am 24. Dezember 2025).
- Fan, J. and Yao, Q. (2017) The Elements of Financial Econometrics. Cambridge: Cambridge University Press. (Excerpt: “Asset Returns”, definition of log returns). Verfügbar unter: https://assets.cambridge.org/97811071/91174/excerpt/9781107191174_excerpt.pdf (Abgerufen am 24. Dezember 2025).
- Hull, J.C. (2002) Options, Futures, and Other Derivatives. 5th edn. Upper Saddle River, NJ: Prentice Hall. (Chapter notes: ‘Estimating Volatility from Historical Data’—volatility estimation via standard deviation of continuously compounded returns). Verfügbar unter: https://mx.nthu.edu.tw/~jtyang/Teaching/Financial_Engineering/Notes/HullOFO5ed/CH12.pdf (Abgerufen am 24. Dezember 2025).
- Mandelbrot, B. (1963) ‘The Variation of Certain Speculative Prices’, The Journal of Business, 36(4), pp. 394–419. Verfügbar unter: https://e-m-h.org/Mand63.pdf (Abgerufen am 24. Dezember 2025).
- National Institute of Standards and Technology (NIST) (2012) ‘ISO 13528 ZSCORE (LET) — standard definition of a z-score’. NIST/SEMATECH e-Handbook / Dataplot Reference Manual. Verfügbar unter: https://www.itl.nist.gov/div898/software/dataplot/refman2/auxillar/zscore.htm (Abgerufen am 24. Dezember 2025).
- Zivot, E. (2014) ‘Return Calculations’ (course notes). University of Washington. (Definition der kontinuierlich verzinslichen (logarithmischen) Renditen). Verfügbar unter: https://faculty.washington.edu/ezivot/econ424/returnCalculations.pdf (Abgerufen am 24. Dezember 2025).
Übersetzt aus dem Englischen von MetaQuotes Ltd.
Originalartikel: https://www.mql5.com/en/articles/20728
Warnung: Alle Rechte sind von MetaQuotes Ltd. vorbehalten. Kopieren oder Vervielfältigen untersagt.
Dieser Artikel wurde von einem Nutzer der Website verfasst und gibt dessen persönliche Meinung wieder. MetaQuotes Ltd übernimmt keine Verantwortung für die Richtigkeit der dargestellten Informationen oder für Folgen, die sich aus der Anwendung der beschriebenen Lösungen, Strategien oder Empfehlungen ergeben.
Die Übertragung der Trading-Signale in einem universalen Expert Advisor.
Larry Williams Marktgeheimnisse (Teil 2): Automatisierung eines Handelssystems der Marktstruktur
Eine alternative Log-datei mit der Verwendung der HTML und CSS
Erstellen von nutzerdefinierten Indikatoren in MQL5 (Teil 3): Erweiterungen auf Multi-Messuhren mit Sektor- und Rundstilen
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.