Rolling Percentile Indicator
- Indikatoren
- Version: 1.0
1. Was der Indikator leistet
Der Indikator „Rolling Percentiles“ zeichnet drei Linien in das Kursdiagramm ein. Jede Linie entspricht einem Perzentil der letzten N Kurse (dem gleitenden Fenster):
- Obere Linie (grün): das obere Perzentil, standardmäßig das 75.
- Median (weiß, dick): das 50. Perzentil, immer fest eingestellt.
- Untere Linie (rot): das untere Perzentil, standardmäßig das 25. Perzentil.
Es handelt sich um einen nichtparametrischen Indikator. Während Bollinger-Bänder davon ausgehen, dass die Kursentwicklung in etwa glockenförmig verläuft, und diese anhand von Mittelwert und Standardabweichung messen, ordnet dieser Indikator lediglich die jüngsten Kurse nach ihrer Höhe und ermittelt, wo die gewählten Perzentile liegen. Er geht von keiner Verteilungsannahme aus, und ein einzelner extremer Balken kann die Linien nicht in dem Maße beeinflussen, wie dies bei der Standardabweichung der Fall ist.
2. Wie er berechnet wird
Für jeden Balken i führt der Indikator Folgendes durch:
- Erfasst den ausgewählten Kurs aus den letzten InpPeriod-Balken, endend mit dem Balken i (einschließlich).
- Er sortiert diese Kurse vom niedrigsten zum höchsten.
- Für jedes Perzentil p berechnet er die Position pos = (p / 100) × (N − 1).
- Liegt pos zwischen zwei sortierten Werten, erfolgt eine lineare Interpolation zwischen diesen. Andernfalls wird der Wert bei pos direkt übernommen.
Dies ist dieselbe „lineare“ Methode, die auch von pandas rolling().quantile() und dem Standard-Perzentil von NumPy verwendet wird. Ich habe den Algorithmus in Python nachgebildet und ihn mit pandas anhand einer Serie mit 500 Balken verglichen: Der größte Unterschied betrug etwa 2×10⁻¹³, was dem Fließkomma-Rauschen entspricht. Die ersten „InpPeriod − 1“ Bars haben keine Werte, genau wie bei pandas mit der Anforderung eines vollständigen Fensters.
Zur Veranschaulichung: Bei einem Standardfenster von 50 liegt das 25. Perzentil an der sortierten Position 12,25 und das 75. an der Position 36,75, sodass es sich bei beiden um interpolierte Werte und nicht um tatsächliche Kurse handelt.
3. Eingaben
| Eingabe | Standard | Bedeutung | Gültiger Bereich |
|---|---|---|---|
| InpPeriod | 50 | Größe des gleitenden Fensters in Bars. | Ganzzahl von mindestens 2 (siehe Abschnitt 8) |
| InpP75 | 75,0 | Oberes Perzentil. Trotz der Bezeichnung kann dieser Wert auf 90, 95, 99 usw. gesetzt werden. | Über InpP25, höchstens 100 |
| InpP25 | 25,0 | Unteres Perzentil. | Mindestens 0, unterhalb von InpP75 |
| InpPriceType | PRICE_CLOSE | Reihenfolge der Kursreihen: Eröffnungs-, Höchst-, Tiefst-, Schluss-, Median-, typischer oder gewichteter Kurs. | Beliebiger Wert aus ENUM_APPLIED_PRICE |
Das Median-Perzentil ist fest auf 50 festgelegt und kann nicht geändert werden.
Wichtig: Version 1.00 überprüft diese Eingaben nicht. Werte außerhalb der oben genannten Bereiche können dazu führen, dass der Indikator mit einem „Array-out-of-range“-Fehler abstürzt. Siehe Abschnitt 8.
4. Auswahl Ihrer Einstellungen
Perzentilpaar
| Paar | Band enthält | Typische Verwendung |
|---|---|---|
| 25 / 75 | Die mittleren 50 % der Preise (Interquartilsabstand) | Wertbereich und Gleichgewicht. Der Kurs liegt etwa die Hälfte der Zeit außerhalb dieses Bereichs, daher handelt es sich um ein Kontextinstrument und nicht um einen Auslöser. |
| 10 / 90 | Mittlere 80 % | Ausgewogen: häufig genug, um nützlich zu sein, selektiv genug, um aussagekräftig zu sein. |
| 5 / 95 | Mittlere 90 % | Stretch-Zonen für Fade- oder Sweep-Setups. |
| 1 / 99 | Mittlere 98 % | Nahezu Extremwerte. Bei N = 50 entsprechen diese Werten fast dem Höchst- und Tiefstwert des Zeitraums, sodass sich der Kanal wie ein Donchian-Kanal verhält. |
Fensterlänge
| Fenster | Charakter |
|---|---|
| 20–30 | Schnell, reagiert auf die aktuelle Periode, ungenauer. |
| 50 (Standard) | Intraday-Swing-Kontext. |
| 100–200 | Struktureller Bereich oder Handelsbereich, langsamer und gleichmäßiger. |
Das Perzentil eines Zeitfensters benötigt genügend Beobachtungswerte, um aussagekräftig zu sein: Bei weniger als etwa 20 Balken fallen das 5. und das 95. Perzentil mit den Extremwerten zusammen und liefern keinen Mehrwert.
Angewandter Kurs
- Schlusskurs: die Standardeinstellung und die sauberste Option für Regeln auf Schlusskursbasis.
- Typisch oder Median: glatter, weniger empfindlich gegenüber Dochten.
- Hoch und Tief zusammen: Fügen Sie zwei Kopien hinzu, eine am Hoch (für die obere Linie) und eine am Tief (für die untere Linie), um einen Bereichskanal zu bilden, der die Schatten berücksichtigt. Dies ist eine gängige Konfiguration, wenn Sie Referenzwerte für Liquiditäts-Sweeps wünschen.
5. Installation und Anbindung
- Speichern Sie „RollingPercentiles.mq5“ im Ordner „MQL5\Indicators“ Ihres Terminals.
- Öffnen Sie die Datei im MetaEditor und kompilieren Sie sie (F7). Es dürfen keine Fehler gemeldet werden.
- Fügen Sie ihn über den Navigator zu einem Chart hinzu. Er zeichnet im Hauptchartfenster, nicht in einem Unterfenster.
Hinweis zur Farbe: Der Median ist standardmäßig weiß. Auf einer hellen Chartvorlage ist er unsichtbar, ändern Sie die Farbe daher auf der Registerkarte „Farben“ des Indikators.
6. Die drei Linien interpretieren
Median (Gleichgewicht). Der Mittelwert der jüngsten Kursentwicklung. Liegt der Kurs über einem steigenden Median, haben die Käufer die Oberhand; liegt er unter einem fallenden Median, haben die Verkäufer die Oberhand. Der Median ist robust, sodass eine einzelne Kursspitze ihn kaum beeinflusst.
Bandbreite (Volatilitätsregime). Der Abstand zwischen der oberen und unteren Linie ist ein Maß für die Volatilität. Ein sich verengendes Band bedeutet Kompression; ein sich erweiterndes Band bedeutet Expansion. Da Perzentile die Extremwerte außer Acht lassen, reagiert die Breite eher auf anhaltende Volatilität als auf einen einzelnen Ausreißer.
Position innerhalb des Fensters (Aufschlag und Abschlag). Liegt der Kurs über dem Median, wird er in der oberen Hälfte des jüngsten Fensters gehandelt (Aufschlag); darunter in der unteren Hälfte (Abschlag). Dies lässt sich nahtlos in ein Gleichgewichtsmodell einordnen.
Pufferindizes für die Verwendung mit EA oder iCustom: Puffer 0 ist das obere Perzentil, Puffer 1 ist der Median und Puffer 2 ist das untere Perzentil. Beachten Sie, dass die obere Linie den Index 0 und die untere Linie den Index 2 darstellt.
Eine Eigenschaft, die Sie verstehen müssen
Das Fenster umfasst den aktuellen Balken, und die Bänder sind Perzentile des Kurses selbst. Aufgrund der Konstruktion verweilt der Kurs etwa 25 % der Zeit oberhalb des 75. Perzentils und 25 % unterhalb des 25. Perzentils. Ein Schlusskurs oberhalb der oberen Linie ist daher häufig und stellt für sich genommen kein Ausbruchsignal dar. Verwenden Sie ein hohes Perzentil (95 oder 99) oder kombinieren Sie die Linien mit der Marktstruktur.
7. Beispiele für Handelskonzepte
Hierbei handelt es sich um Prozessvorlagen, nicht um Signale. Jede davon erfordert eine Bestätigung durch die Marktstruktur und den Handelskontext sowie eine eindeutige Entkräftung.
A. Range Fade am Extrem (Range-Regime)
- Kontext: Bandbreite flach oder schrumpfend, Median weitgehend flach, kein Strukturbruch auf dem höheren Zeitrahmen.
- Setup: Der Kurs schwankt über die 5. oder 95. Perzentillinie hinaus, nimmt deutliche Liquidität auf (gleiche Hochs oder Tiefs) und schließt wieder innerhalb des Bandes.
- Einstieg: beim Schlusskurs innerhalb des Bandes.
- Stop: jenseits des Ausreiß-Extrems plus 0,5 × ATR(14).
- Ziel 1: der Median (etwa die Hälfte der Position schließen). Ziel 2: die gegenüberliegende 25.- oder 75.-Perzentil-Linie.
- Risiko: fester prozentualer Anteil, 0,25–0,50 % des Kapitals pro Trade. Den Trade überspringen, wenn das Ziel unter 1,5R liegt.
B. Trendfortsetzung ab dem Median (Trendphase)
- Kontext: Der Median neigt sich deutlich, die Bandbreite erweitert sich, die Struktur auf höheren Zeitrahmen bildet HH/HL (oder LH/LL).
- Setup: Rückzug zum Median im Discount (Long) oder im Premium (Short), mit einer CHoCH- oder einer Order-Block-Reaktion auf dem niedrigeren Zeitrahmen.
- Einstieg: beim Schlusskurs der Bestätigungskerze.
- Stop: jenseits des Rückgangs-Swings oder jenseits des strukturellen Tiefs bzw. Hochs, mit ATR-Puffer.
- Ziel: die 90. oder 95. Perzentillinie, anschließend Trailing hinter der Struktur.
- Risiko: 0,25–0,75 % pro Trade, mit festen täglichen und wöchentlichen Verlustlimits. Kein Averaging Down.
Zu vermeiden: Handel bei jeder Berührung der 25/75-Linien. Die Linien zeigen an, wo sich der Kurs in seiner jüngsten Verteilung befindet, nicht warum er umkehren wird.
8. Vergleich mit dem ähnlichsten Indikator
Das nächstgelegene integrierte Äquivalent in MT5 sind die Bollinger-Bänder. Sie weisen dieselbe Struktur auf: drei Linien, ein Zeitfenster, ein zugrunde gelegter Kurs, eine Mittellinie sowie eine obere und eine untere Hüllkurve. Der Donchian-Kanal ist der Grenzfall dieses Indikators (die Perzentile 0 und 100 entsprechen dem Minimum bzw. Maximum des Zeitfensters). Dies habe ich im pandas-Test numerisch bestätigt: Die Linie des 100. Perzentils entspricht dem gleitenden Maximum.
| Aspekt | Rollierende Perzentile | Bollinger-Bänder |
|---|---|---|
| Mittellinie | Median (50. Perzentil) | Gleitender Durchschnitt (standardmäßig SMA) |
| Hüllkurve | Ausgewählte Perzentile der tatsächlichen Kurse | Mittelwert ± k × Standardabweichung |
| Verteilungsannahme | Keine | Ungefähr normalverteilt |
| Empfindlichkeit gegenüber Ausreißern | Gering | Hoch: Ein Ausreißer vergrößert die Abweichung für das gesamte Fenster |
| Bedeutung der Bandbreite | Streuung der mittleren X % der Preise | Ein Vielfaches der Streuung |
| Fat Tails (Devisen, Gold) | Verhalten sich natürlich | Bänder unterschätzen oder überschätzen tatsächliche Extreme |
| Abdeckung | Durch das Design festgelegt (ein 5/95-Paar deckt immer 90 % des Fensters ab) | Variiert je nach Form der Verteilung |
| Fenstergewichtung | Gleiche Gewichtung, daher ähnelt die Verzögerung einem SMA | Gleichgewichtete Gewichtung (SMA-Modus) |
| Parameter | Fenster, zwei Perzentile, Kurs | Fenster, Abweichungsmultiplikator, Verschiebung, Kurs |
| Rechenaufwand | Sortierung pro Balken (aufwändiger) | Laufende Summen (sehr gering) |
| Verschiebungs- und Stiloptionen | Keine in v1.00 | Ja |
Ausreißertest (synthetisch). Bei einem simulierten 500-Bar-Zufallsweg mit einem Fenster von 50 habe ich innerhalb eines Fensters einen einzelnen 40-Punkte-Spike hinzugefügt. Eine Standard-Bollinger-Bandbreite von 2σ stieg von 4,69 auf 23,08 (etwa 4,9-mal breiter), während die Bandbreite des 25/75-Perzentils von 1,77 auf 1,79 anstieg. Für Nachrichten-Spikes und Stop-Run-Dochtformationen ergibt sich daraus folgender praktischer Vorteil: Die Perzentilbänder geben weiterhin an, wo der Großteil des Handels stattfand.
Wo Bollinger-Bänder nach wie vor besser sind: sehr schnelle Berechnung, integrierte Verschiebungs- und Stiloptionen sowie eine weit verbreitete Konvention (20, 2), die andere Händler erkennen. Wo „Rolling Percentiles“ besser sind: schiefe oder spitzenreiche Instrumente, Liquiditäts-Sweep-Arbeit und stabile Referenzbereiche.
9. Überprüfung der Ergebnisse und bekannten Einschränkungen in Version 1.00
Der Kernalgorithmus ist korrekt. Die Schwächen liegen ausschließlich in der Robustheit und der Ausgereiftheit.
| # | Befund | Schweregrad | Empfohlene Behebung |
|---|---|---|---|
| 1 | Keine Eingabevalidierung. Ein „InpPeriod“-Wert von 0 oder weniger führt zu einem negativen Startindex und einem Array-Out-of-Range-Fehler am Ende. Perzentile über 100 (oder unter 0) liegen außerhalb des Fensters. Ich habe dies im pandas-äquivalenten Test reproduziert: 101 löst einen Indexfehler aus. | Hoch | In `OnInit` validieren und `INIT_PARAMETERS_INCORRECT` mit einer ausgegebenen Begründung zurückgeben. Eine Periode von mindestens 2 vorschreiben, wobei 0 ≤ lower < upper ≤ 100 gilt. |
| 2 | Invertierte Perzentile werden stillschweigend akzeptiert (unterer Eingabewert über dem oberen Eingabewert), sodass die Farben und Beschriftungen falsch sind. | Mittel | Gleiche Validierung oder automatischer Austausch. |
| 3 | Zuweisung pro Balken und vollständige Sortierung. Für jeden Balken wird ein neues Array erstellt und neu gefüllt, wobei der angewandte Preis für jedes Element neu berechnet wird. Der Rechenaufwand beträgt ungefähr Balken × Fenster × log(Fenster) und macht sich bei großen Fenstern und langen Zeitreihen bemerkbar. | Mittel | Berechnung des Kurses einmal pro Bar in ein Array. Wiederverwendung eines Fensterpuffers. Bei hoher Auslastung sollte ein inkrementell sortiertes Fenster (Einfügen/Entfernen per binärer Suche) geführt werden, wodurch jede Bar im Fenster in etwa linear verläuft. |
| 4 | Statische Beschriftungen im Diagramm. Im Datenfenster werden immer „75.“ und „25.“ angezeigt, auch wenn Sie 90 und 10 einstellen. | Niedrig | Legen Sie die Beschriftungen in „OnInit“ mit `PlotIndexSetString(..., PLOT_LABEL, ...)` fest. |
| 5 | Kein PLOT_DRAW_BEGIN und keine explizite Füllung mit dem Leerwert für die Warmlaufbalken. Es funktioniert zwar, da das Terminal die Puffer auf den Leerwert initialisiert, aber es ist besser, dies explizit anzugeben. | Niedrig | Setzen Sie PLOT_DRAW_BEGIN auf InpPeriod − 1 und PLOT_EMPTY_VALUE auf EMPTY_VALUE. |
| 6 | Der weiße Median ist auf hellen Vorlagen nicht sichtbar. | Niedrig | Wählen Sie eine neutrale Farbe wie Gold oder Dodger-Blau. |
| 7 | Kein Kurzname. | Niedrig | IndicatorSetString(INDICATOR_SHORTNAME, ...) zur Anzeige des Zeitraums und der Perzentile. |
| 8 | Verhalten bei Live-Balken (beabsichtigt). Der neueste Balken wird in einem eigenen Fenster angezeigt, sodass sich die Linien am letzten Balken mit jedem Tick verschieben. Geschlossene Balken ändern sich nicht. | Info | Verwenden Sie die Bar-Close-Werte (Shift 1) in beliebigen EAs oder Regeln. |
Was korrekt ist und beibehalten werden sollte: die Handhabung der Reihenfolge (Arrays werden konsequent von alt nach neu verwendet), die inkrementelle Neuberechnung ab „prev_calculated − 1“, der saubere Rückgabewert von „OnCalculate“ und die Interpolationsberechnungen.
10. Fehlerbehebung
Der Indikator verschwindet unmittelbar nach dem Anfügen, begleitet von der Meldung „Array außerhalb des Bereichs“ im Experten- oder Journal-Protokoll. Überprüfen Sie die Eingaben anhand der Tabelle in Abschnitt 3. Hierbei handelt es sich um das Problem mit ungültigen Eingaben.
Es werden keine Linien gezeichnet. Entweder enthält das Diagramm weniger Balken als „InpPeriod“, oder die historischen Daten werden noch geladen. Scrollen Sie zurück oder warten Sie, bis der Download der historischen Daten abgeschlossen ist.
Ich kann den Median nicht sehen. Er ist weiß auf einem weißen Chart. Ändern Sie seine Farbe auf der Registerkarte „Farben“.
Der letzte Wert ändert sich ständig. Erwartet: Der Live-Balken befindet sich noch innerhalb seines eigenen Zeitfensters. Geschlossene Balken ändern sich nie.
Das Terminal läuft bei einem großen Fenster langsam. Verringern Sie den „InpPeriod“-Wert, reduzieren Sie die Anzahl der im Chart geladenen Balken oder fragen Sie nach der optimierten inkrementellen Version.
11. Kurzübersicht
| Punkt | Wert |
|---|---|
| Fenster | Diagramm (Hauptfenster) |
| Diagramme und Puffer | 3 und 3 |
| Puffer 0 | Oberes Perzentil (grüne Linie) |
| Puffer 1 | Median (dicke weiße Linie) |
| Puffer 2 | Unteres Perzentil (rote Linie) |
| Methode | Sortiertes Fenster, lineare Interpolation (pandas-kompatibel) |
| Erster gültiger Balken | InpPeriod − 1 |
| Neuzeichnungen | Nur der letzte Balken, bis zu seinem Schlusskurs |
| Sichere Anfangseinstellungen | 50 Balken, 10 / 90, Schlusskurs |
