Entwicklung des Price Action Analysis Toolkit (Teil 33): Candle-Range Theory Tool
Inhalt
Einführung
Die Volatilität ist die Hauptsprache des Marktes. Bevor sich ein Oszillator dreht, bevor die meisten Trendfolgefilter reagieren, hat der Preis bereits eine klare Meinung durch die einfache Strecke, die er innerhalb eines einzigen Balkens zurücklegt, ausgedrückt. Eine plötzliche Ausweitung der Handelsspanne deutet oft auf eine aggressive Beteiligung großer Akteure hin; ein längerer Rückgang deutet darauf hin, dass in Erwartung der nächsten Bewegung Liquidität abgezogen wird. Ebenso zeigt ein Balken, der vollständig innerhalb seines Vorgängers bleibt, eine vorübergehende Unentschlossenheit, während ein Balken, der den vorherigen Bereich verschlingt, einen entscheidenden Auftragsfluss widerspiegelt. Diese Verhaltensweisen sind offensichtlich, aber selten in einem robusten, maschinenlesbaren Prozess formalisiert.
In diesem Artikel wird die Candle-Range-Theorie (CRT, Theorie der Kerzen-Spanne) vorgestellt, ein prägnanter Rahmen, der jede abgeschlossene Kerze in eine von vier sich gegenseitig ausschließenden Kategorien einordnet:
- Large-Range (LR) – die wahre Spanne der Kerze übersteigt ein konfigurierbares Vielfaches ihrer letzten Average True Range (ATR).
- Small-Range (SR) – die Spanne der Kerze ist kleiner als ein niedrigeres Vielfaches der ATR, was eine Kompression signalisiert.
- Inside Bar (IB) – die gesamte Kerze bleibt innerhalb der Hoch-Tief-Grenzen ihres unmittelbaren Vorgängers.
- Outside Bar (OB) – die Kerze durchbricht während ihrer Laufzeit sowohl das vorherige Hoch als auch das vorherige Tief und verschlingt den früheren Bereich.
Anstatt einen weiteren undurchsichtigen Indikator einzuführen, konzentriert sich CRT darauf, diese klar definierten Konzepte durch ein schlankes, produktionsbereites Toolset für MetaTrader 5 zu liefern:
- CRangePattern.mqh – eine reine Header-Klasse, die eine Kerze in konstanter Zeit klassifiziert. Es werden nur vier Preis-Arrays (open, high, low, close) benötigt, boolesche Flags für jedes Muster zurückgegeben und es wird kein dynamischen Speicher zugewiesen.
- CRT Indicator.mq5 – ein Overlay, das jede LR-, SR-, IB- und OB-Kerze durch halbtransparente Rechtecke und optionale Pfeile hervorhebt. Farben, Deckkraft, Pfeilglyphen und Größen sind vollständig anpassbar, sodass sich die visuelle Ebene sauber in jede bestehende Chartvorlage integrieren lässt, ohne die Acht-Puffer-Grenze der Plattform zu überschreiten.
- CRT Expert Advisor.mq5 – eine Alert-Engine, die ausschließlich auf geschlossenen Balken arbeitet und damit sicherstellt, dass sich die Signale nicht ständig ändern (repainting). Sie kann filtern, welche Muster Pop-ups, Töne oder Push-Benachrichtigungen erzeugen, und fügt auf Wunsch automatisch den Indikator hinzu, damit visuelle und auditive Informationen während des Live-Handels oder des visuellen Backtests synchronisiert bleiben.
Alle Komponenten kompilieren ohne Warnungen unter MetaTrader 5 Build 4180 oder höher und halten sich an #property strict. Sie kopieren nur das kleine Historienfenster, das für die ATR-Berechnung erforderlich ist, und belasten daher selbst bei Hochfrequenz-Charts die CPU nur in geringem Ausmaß. Da das System die Daten strikt am Ende jeder Kerze verarbeitet, bleiben seine Ergebnisse über alle Zeitrahmen, Symbole und Testmodi hinweg stabil.
Mit dieser Anleitung werden vier Ziele verfolgt:
- Es werden die genauen mathematischen Definitionen von LR, SR, IB und OB angegeben.
- Es wird demonstriert, wie Sie die Klasse CRangePattern in einen Indikator, EA oder ein Skript integrieren können.
- Es wird die Design-Entscheidungen erläutert, die den begleitenden Indikator leicht, flimmerfrei und kompatibel mit komplexen Chart-Layouts machen.
- Es wird gezeigt, wie der Expert Advisor testersichere Alarme liefert und eine umfassende Auswertung von CRT-Signalen sowohl in historischen als auch in Echtzeit-Umgebungen ermöglicht.
Am Ende dieses Artikels werden Sie über ein kompaktes und dennoch erweiterbares System verfügen, das rohe Volatilität in klare, umsetzbare Informationen umwandelt – bereit für diskretionäre Analysen, automatisierten Handel oder weitere Untersuchungen.
Vorteile des Candle-Range Theory Toolkit:
| Vorteil | Beschreibung | Praktische Auswirkungen |
|---|---|---|
| Genaue Definitionen | LR, SR, IB und OB werden mit expliziten ATR-basierten und Preis-Relations-Formeln berechnet. | Beseitigt Zweideutigkeiten; jede Kerze gehört zu einer – und nur zu einer – Kategorie. |
| Logik des Nicht-Wiederholens | Alle Berechnungen werden auf dem gerade geschlossenen Balken ausgeführt; später werden keine Werte mehr geändert. | Die Signale bleiben bei der Aktualisierung der Charts, bei Optimierungen und beim Live-Handel stabil. |
| Minimaler Daten-Fußabdruck | Der Indikator kopiert nur ATR_Period + 3 Bars; der EA kopiert dasselbe. | Reduziert die RAM-Nutzung und beschleunigt die Ausführung im Strategy Tester. |
| Pufferfreie Anzeige | Visuelle Darstellungen werden mit Chartobjekten und nicht mit Indikatorpuffern gezeichnet. | Umgeht das MetaTrader-Limit von acht Puffern; kompatibel mit komplexen Vorlagen. |
| Vollständige Individualisierung | Farben, Deckkraft, Pfeilsymbole, ATR-Periode und große/kleine Multiplikatoren sind Nutzereingaben. | Passt sich nahtlos an jeden persönlichen oder unternehmensinternen Chart-Style-Guide an. |
| Modularer Aufbau | Klasse, Indikator und EA sind unabhängige Dateien, die über wohldefinierte Schnittstellen kommunizieren. | Die Entwickler können die Klasse in andere Projekte einbetten oder den Indikator ohne Umstrukturierung austauschen. |
| Einhaltung des strengen Modus | Alle Quellen kompilieren sauber unter #property strict auf Build 4180+. | Gewährleistet maximale Vorwärtskompatibilität mit zukünftigen MetaTrader-Builds. |
| ATR-Normalisierung | Die Bereichsschwellen werden automatisch an die Volatilität des Instruments angepasst. | Einstellungen werden zuverlässig auf Devisen, CFDs, Kryptowährungen, Indizes und Futures übertragen. |
Überblick über die Strategie
Die Candle-Range Theorie klassifiziert jede abgeschlossene Kerze in eine – und nur in eine – von vier Kategorien. Ein Balken, dessen tatsächliche Spanne weit über die jüngste Volatilität hinausgeht, wird als Kerze mit großer Spanne (LR) bezeichnet, während eine Kerze, die sich auf einen Bruchteil der normalen Spanne zusammenzieht, als Kerze mit kleiner Spanne (SR) gekennzeichnet wird. Wenn die gesamte Hoch-Tief-Spanne des neuen Balkens in den Bereich des vorherigen Balkens passt, wird er als Inside Bar (IB) bezeichnet; umgekehrt wird er als Outside Bar (OB) gekennzeichnet, wenn er sowohl das vorherige Hoch als auch das vorherige Tief überschreitet. In den folgenden Abschnitten werden die statistischen Grundlagen und die genauen Regeln erläutert, mit denen jedes dieser vier Muster erkannt werden kann.
True Range (TR)
Es ist Wilders Maß für die rohe Volatilität. Sie erfasst die gesamte Kursbewegung eines Zeitraums – einschließlich etwaiger Lücken – indem sie das größte der beiden Werte nimmt:
- Aktuelles Hoch minus Aktuelles Tief
- Absoluter Wert des aktuellen Hochs minus des vorherigen Schlusskurses
- Absoluter Wert des aktuellen Tiefs minus des vorherigen Schlusskurses
TR = max( Highₜ – Lowₜ, │Highₜ – Closeₜ₋₁│, │Lowₜ – Closeₜ₋₁│ )
Durch die Verwendung der True Range anstelle der Hoch-Tief-Spanne werden Overnight-Gaps vollständig erfasst, wodurch sichergestellt wird, dass die Volatilitätsmessungen über alle Instrumente und Handelssitzungen hinweg konsistent bleiben.
Average True Range (ATR)
Um die Volatilität in einen Kontext zu bringen, ist eine rohe True Range allein nicht aussagekräftig: 25 Pips auf EURUSD sind viel, aber 25 Pips auf XAUUSD sind vernachlässigbar. Die Candle-Range Theorie trägt diesem Umstand Rechnung, indem sie die True Range jeder Periode auf den Durchschnitt der letzten N Werte normiert, sodass grobe Ausschläge geglättet werden und ein konsistenter Volatilitätsmaßstab entsteht.
// Simple arithmetic ATR double ATR(const int shift,const int period, const double &H[],const double &L[],const double &C[]) { double sum = 0.0; for(int i = shift; i < shift + period; ++i) sum += MathMax(H[i]-L[i], MathMax(MathAbs(H[i]-C[i+1]), MathAbs(C[i+1]-L[i]))); return sum / period; }
In der Praxis wendet CRT ein einfaches arithmetisches Mittel – und nicht die exponentielle Glättung von Wilder – an, weil es schnell und transparent ist und sich hervorragend zur Klassifizierung des Preisverhaltens eignet. Standardmäßig wird ein Fenster von 14 Balken verwendet, das der Standard-ATR-Einstellung entspricht.
Reichweitenmultiplikatoren – objektive Schwellenwerte
Zwei nutzerdefinierte Multiplikatoren wandeln die ATR in kategorische Schwellenwerte um:- largeMult (Standardwert = 1,5)
- smallMult (Standardwert = 0,5)
// ---- User-defined ATR multipliers -------------------------------------- input double largeMult = 1.5; // Bars ≥ 1.5 × ATR are flagged “Large-Range” input double smallMult = 0.5; // Bars ≤ 0.5 × ATR are flagged “Small-Range”Diese Parameter sind die Antwort:
- Wie viel größer als der Durchschnitt muss ein Balken sein, um als ungewöhnlich groß eingestuft zu werden?
- Wie klein muss ein Balken sein, damit wir ihn als verengt betrachten?
Durch die Festlegung dieser Cutoffs in ATR-Einheiten bleibt CRT über Symbole, Zeitrahmen und Volatilitätsregime hinweg übertragbar.
Large-Range (LR)-Balken – Nachweis für eine dringende Teilnahme
Eine Kerze gilt als Large-Range, wenn ihr „True Range“ gleich oder größer ist als das ausgewählte Vielfache (largeMult) der aktuellen ATR.// ---- Large-Range (LR) test --------------------------------------------- bool isLargeRange = (trueRange >= largeMult * atrCurrent);
Eine signifikante Beteiligung, die häufig durch geplante Nachrichten oder Blocktrades ausgelöst wird, führt zu einer Bandbreite dieser Größenordnung. Diese großen Balken kündigen in der Regel entweder den Beginn einer anhaltenden Richtungsbewegung oder die endgültige Kapitulation des vorherigen Trends an. In beiden Fällen handelt es sich um informationsreiche Ereignisse: Das „Was“ (eine ungewöhnlich große Spanne) ist glasklar, auch wenn das „Warum“ (Gewinnveröffentlichungen, Makrodaten, Zwangsliquidationen) es nicht ist.
Small-Range (SR) Stäbe – Volatilitätskompression
Umgekehrt ist eine Kerze Small-Range, wenn ihre „True Range“ nicht größer ist als der gewählte Bruchteil (smallMult) der vorherrschenden ATR. Ein anhaltender Rückgang deutet auf eine geringere Liquidität, eine Absicherung durch Händler oder ein ausgeglichenes Orderbuch hin.
// ---- Small-Range (SR) test --------------------------------------------- bool isSmallRange = (trueRange <= smallMult * atrCurrent);
Märkte bleiben selten unbegrenzt ruhig; die Häufung von SR-Balken markiert oft die Pause vor einer neuen Expansion, was sie für Breakout- und Straddle-Konzepte wertvoll macht.
Inside Bars (IB) – Beherrschung und Unentschlossenheit
Eine Kerze wird als Inside Bar eingestuft, wenn ihr gesamter Bereich innerhalb des Bereichs der vorherigen Kerze liegt, d. h. ihr Höchststand ist niedriger als der vorherige Höchststand und ihr Tiefststand ist höher als der vorherige Tiefststand.
// Inside-Bar test for the candle at 'shift' (e.g., shift = 1 → just-closed bar) bool isInsideBar = (High[shift] < High[shift + 1]) && // current high is lower than previous high (Low[shift] > Low[shift + 1]); // current low is higher than previous low
Solche Balken signalisieren einen regen Auftragsfluss – oft durch eine Stop-Loss-Jagd, erzwungene Liquidation oder aggressive Akkumulation/Verteilung. Da der Markt beide Seiten der vorherigen Kerze durchläuft, komprimieren OBs mehrere Stopp-Layer in einer einzigen Sitzung, was häufig entweder (a) zu einer dauerhaften Umkehr führt, wenn die Absorption dominiert, oder (b) zu einer Beschleunigung des ursprünglichen Trends, wenn die Ausbruchsliquidität schnell aufgebraucht ist.
Gegenseitige Exklusivität und Hierarchie
Die vier Kategorien sind so konzipiert, dass sie sich gegenseitig ausschließen; eine Kerze kann höchstens eine Definition erfüllen:
- Wenn es sich um LR oder SR handelt, haben die Regeln für die Größe der Spanne Vorrang.
- Wenn weder LR noch SR, prüft das System auf IB.
- Nur wenn IB fehlschlägt, wird nach OB gesucht.
Durch diese Hierarchie werden Überschneidungen bei der Interpretation vermieden und die nachgelagerte Logik (Warnungen, visuelle Zuordnung) bleibt eindeutig.
Zeitliche Disziplin – Verarbeitung geschlossener Balken
CRT analysiert nur die letzte abgeschlossene Kerze (Balken 1) und ignoriert den sich noch bildenden Balken (Balken 0). Dies garantiert, dass die Signale nicht nachgezeichnet werden: Was Sie in Echtzeit sehen, entspricht genau dem, was ein historischer Backtest ergeben hätte.
Von Rohdaten zu umsetzbaren Hinweisen
Durch die Einstufung jedes Balkens in einen von vier Zuständen liefert CRT:
- Ein binärer Signalstrom für automatisierte Strategien (Wahr/Falsch-Flag pro Kategorie)
- Eine visuelle Sprache für den diskretionären Handel (farbkodierte Balken und Pfeile)
- Ein Trigger-System für Alarme und zusätzliche Filter (Trend, Session, Volumen)
Code-Aufschlüsselung
Das Toolkit der Candle-Range Theorie ist absichtlich modular aufgebaut. Jede Komponente – die Header-Datei, der Indikator und der Expert Advisor – führt eine einzige, klar definierte Aufgabe aus und kommuniziert mit den anderen über eine minimale Schnittstelle. Dieser Abschnitt geht durch den Quellcode in der gleichen Reihenfolge, in der MetaTrader ihn ausführt, und erklärt den Zweck jedes wichtigen Blocks und die Gründe für die Implementierungsentscheidungen.
CandleRangeTheory.mqh – die Klassifizierungsmaschine
Der Header beginnt mit #property strict, was eine moderne Typüberprüfung erzwingt und alte Compiler-Nachsichtigkeiten beseitigt. Unmittelbar danach wird die Klasse CRangePattern deklariert. Die öffentlichen Datenelemente – atrPeriod, largeMult und smallMult – fungierenals Laufzeitparameter und nicht als fest kodierte Konstanten, wodurch sichergestellt wird, dass jedes Skript, das den Header enthält, das Verhalten anpassen kann, ohne die Klasse selbst neu zu kompilieren. Vier boolesche Flags – isLarge, isSmall, isInside und isOutside – bilden die Ausgabe für die Schnittstelle. Sobald Calculate() zurückkehrt, ist genau eines davon wahr; das aufrufende Programm braucht keine weiteren Berechnungen anzustellen, um zu entscheiden, was bei der analysierten Kerze passiert ist.
#property strict // enforce modern type checking #ifndef __CANDLE_RANGE_THEORY_MQH__ #define __CANDLE_RANGE_THEORY_MQH__ class CRangePattern { public: int atrPeriod; // ATR length double largeMult,smallMult; // LR / SR thresholds bool isLarge,isSmall, isInside,isOutside; // output flags double atr,trueRange,bodyRange;
Der Konstruktor weist praktische Standardwerte zu – eine ATR von vierzehn Perioden, einen großen Multiplikator von 1,5 und einen kleinen Multiplikator von 0,5 – und ruft dann die private Hilfsfunktion Reset() auf, die alle Ergebnisfelder auf einen bekannten Zustand zurücksetzt. Durch die Verwendung einer Hilfsroutine wird doppelter Code vermieden; dieselbe Routine wird sowohl bei der Konstruktion als auch zu Beginn jeder Berechnung aufgerufen.
private: void Reset() { isLarge=isSmall=isInside=isOutside=false; atr=trueRange=bodyRange=0.0; } public: CRangePattern() // default parameters { Reset(); atrPeriod=14; largeMult=1.5; smallMult=0.5; }
Calculate() selbst ist absichtlich kompakt gehalten. Zunächst wird überprüft, ob eine ausreichende Historie vorhanden ist (bars < atrPeriod + sh + 2), da sowohl ATR als auch True Range mindestens einen Balken vor dem Auswertungspunkt referenzieren müssen. True Range und Body Range werden gemäß der Definition von Wilder berechnet, wodurch die Kompatibilität mit jeder Standard-ATR-Messung gewährleistet wird, sei es von diesem Skript oder einem externen Indikator.
bool Calculate(const int sh, const double &H[],const double &L[], const double &O[],const double &C[], const int bars) { Reset(); if(bars < atrPeriod + sh + 2) // enough candles? return false; // true range of target candle trueRange = MathMax(H[sh]-L[sh], MathMax(MathAbs(H[sh]-C[sh+1]), MathAbs(C[sh+1]-L[sh]))); bodyRange = MathAbs(O[sh]-C[sh]);
Die ATR-Schleife iteriert genau atrPeriod mal. Da die frühere Verlaufsprüfung garantiert, dass i + 1 innerhalb der Grenzen liegt, wäre die innere Prüfung && i+1 < Balken überflüssig und wird daher weggelassen. Das Entfernen dieser Schutzfunktion vereinfacht den Codepfad und eliminiert eine Verzweigung, was die Leistung bei hochfrequenten Daten verbessert, ohne die Sicherheit zu beeinträchtigen.
double sum = 0.0; for(int i = sh; i < sh + atrPeriod; ++i) // exactly atrPeriod { double tr = MathMax(H[i]-L[i], MathMax(MathAbs(H[i]-C[i+1]), MathAbs(C[i+1]-L[i]))); sum += tr; } atr = sum / atrPeriod;
Nachdem der Durchschnitt ermittelt wurde, klassifiziert die Funktion die Kerze. Wenn der tatsächliche Bereich das obere Vielfache übersteigt, wird isLarge gesetzt; wenn er unter das untere Vielfache fällt, wird isSmall gesetzt. Eine zweite Vergleichsebene wertet die Beziehung zu den Höchst- und Tiefstwerten der vorherigen Kerze aus und schaltet je nach Bedarf isInside oder isOutside um. Da sich alle vier Flags gegenseitig ausschließen, sind keine weiteren Prüfungen erforderlich, und die Funktion gibt zur Bestätigung des Abschlusses true zurück.
if(trueRange >= largeMult*atr) isLarge = true; else if(trueRange <= smallMult*atr) isSmall = true; if(H[sh] < H[sh+1] && L[sh] > L[sh+1]) isInside = true; else if(H[sh] > H[sh+1] && L[sh] < L[sh+1]) isOutside = true; return true; } #endif
CRT-Indikator.mq5 – visuelle Darstellung
Die Indikatordatei enthält keine Puffer, sondern stützt sich vollständig auf Chartobjekte. Durch die Vermeidung von Puffern umgeht das Skript die MetaTrader-Obergrenze von acht Puffern und lässt den Händlern Raum, das Overlay mit anderen Studien zu kombinieren. Bei der Initialisierung werden die Eingabewerte aus dem Dialogfeld Eingaben direkt in die öffentlichen Felder einer internen CRangePattern-Instanz namens pat geschrieben. Nichts anderes wird global gespeichert, um sicherzustellen, dass eine Parameteränderung in MetaTrader zu einer vollständigen Neuinitialisierung und nicht zu einer teilweisen Übertragung des Status führt.
#property indicator_chart_window #include <CandleRangeTheory.mqh> input int ATR_Period = 14; ... CRangePattern pat; int OnInit() { pat.atrPeriod = ATR_Period; pat.largeMult = LargeXATR; pat.smallMult = SmallXATR; return(INIT_SUCCEEDED); }
OnCalculate() wird immer dann aufgerufen, wenn der MetaTrader entscheidet, dass neue Daten verfügbar sind. Die Funktion prüft zunächst, ob das Chart mindestens atrPeriod + 3 Balken aufweist – zwei zusätzliche, da die ATR-Schleife einen Balken vor dem aktuellen benötigt und Calculate() selbst auf die Kerze bei shift + 1 verweist. Nur ein kleiner Ausschnitt der Geschichte dieser Größe wird in vier lokale Felder (H, L, O, C) kopiert. Jedes Feld wird dann als Serie gekennzeichnet, sodass der Index 0 immer den jüngsten Balken bezeichnet.
int OnCalculate(const int rates_total, const int prev_calculated, const int begin, const double &price[]) { const int need = pat.atrPeriod + 3; if(rates_total < need) return rates_total; double H[],L[],O[],C[]; ArrayResize(H,need); ArraySetAsSeries(H,true); ArrayResize(L,need); ArraySetAsSeries(L,true); ArrayResize(O,need); ArraySetAsSeries(O,true); ArrayResize(C,need); ArraySetAsSeries(C,true); CopyHigh (_Symbol,_Period,0,need,H); CopyLow (_Symbol,_Period,0,need,L); CopyOpen (_Symbol,_Period,0,need,O); CopyClose(_Symbol,_Period,0,need,C);
Nachdem die Daten vorbereitet wurden, wird pat.Calculate(1, ...) aufgerufen. Die Übergabe einer Verschiebung von eins stellt sicher, dass die Analyse auf dem zuletzt geschlossenen Balken durchgeführt wird, niemals auf der sich noch bildenden Kerze. Wenn die Klassifizierung kein aktives Flag ergibt, d. h. die Kerze weder groß noch klein, weder innen noch außen ist, kehrt die Funktion sofort zurück, und das Chart bleibt unberührt. Wenn ein Muster vorhanden ist, wählt der Indikator die Anzeigeeigenschaften aus: die Farbe des Rechtecks, die aus ARGB-Werten abgeleitet wird (und eine Kontrolle der Deckkraft ermöglicht), sowie einen Pfeilcode und eine Farbe, die den Präferenzen des Nutzers entsprechen.
if(!pat.Calculate(1,H,L,O,C,need)) return rates_total; uint rClr = 0; // rectangle colour (ARGB) int aCode = 221; // ● default arrow color aClr = clrYellow; if(pat.isLarge) { bool bull = (C[1] > O[1]); rClr = ColorToARGB(bull?clrLime:clrRed,Opacity); aCode = bull ? 233 /*▲*/ : 234 /*▼*/; aClr = bull ? clrLime : clrRed; } else if(pat.isSmall) { rClr = ColorToARGB(clrYellow,Opacity); } else if(pat.isInside) { rClr = ColorToARGB(clrAqua,Opacity); } else if(pat.isOutside) { rClr = ColorToARGB(clrMagenta,Opacity);} else return rates_total; // nothing to draw
Bei der Erstellung des Rechtecks werden zwei Zeitkoordinaten verwendet, nämlich die Öffnung des Balkens bei Shift 2 und die Öffnung des Balkens bei Shift 1; dies umfasst die gesamte Dauer der Zielkerze. Die Hoch- und Tiefpunkte der Zielkerze definieren die vertikalen Grenzen. OBJPROP_FILL ist auf true gesetzt, sodass das Rechteck als durchsichtiger Block und nicht als hohler Rahmen dargestellt wird. Ein optionaler Pfeil wird dann in einem bescheidenen ATR-skalierten Offset über oder unter der Kerze platziert, um die Sichtbarkeit bei Instrumenten mit sehr unterschiedlichen Tickgrößen zu gewährleisten. Sowohl das Rechteck als auch der Pfeil sind mit dem Zeitstempel der Kerzeneröffnung versehen, wodurch ihre Namen eindeutig sind und das Skript frühere Duplikate löschen kann, bevor es neue Objekte zeichnet.
datetime tClosed = iTime(_Symbol,_Period,1); string tagR = "CRT_RECT_"+(string)tClosed; string tagA = "CRT_ARW_" +(string)tClosed; ObjectDelete(0,tagR); // avoid duplicates ObjectCreate(0,tagR,OBJ_RECTANGLE,0, iTime(_Symbol,_Period,2),H[1], tClosed,L[1]); ObjectSetInteger(0,tagR,OBJPROP_COLOR,rClr); ObjectSetInteger(0,tagR,OBJPROP_FILL,true); ObjectSetInteger(0,tagR,OBJPROP_BACK,true); double y = (aCode==233 ? H[1]+0.2*pat.atr : L[1]-0.2*pat.atr); ObjectCreate(0,tagA,OBJ_ARROW,0,tClosed,y); ObjectSetInteger(0,tagA,OBJPROP_ARROWCODE,aCode); ObjectSetInteger(0,tagA,OBJPROP_COLOR,aClr); return rates_total; }
CandleRangeTheory.mq5 – Erzeugung von Warnmeldungen
Der Expert Advisor hat die gleiche Kopfzeile und damit die gleiche deterministische Klassifizierungslogik. Bei der Initialisierung dupliziert es den Schritt der Parameterübertragung, der im Indikator durchgeführt wird. Er prüft zusätzlich, ob er im nicht-visuellen Modus des Strategietesters läuft; wenn ja, unterdrückt er GUI-Funktionen wie Alert() oder PlaySound() und verhindert so Laufzeitfehler bei der Stapeloptimierung.
#include <CandleRangeTheory.mqh> input bool Push_Alerts = false; ... CRangePattern pat; const bool NonVisualTest = (bool)MQLInfoInteger(MQL_TESTER) && !MQLInfoInteger(MQL_VISUAL_MODE); int OnInit() { pat.atrPeriod = ATR_Period; pat.largeMult = LargeXATR; pat.smallMult = SmallXATR; return INIT_SUCCEEDED; }
Wenn der EA mit einem Live-Chart oder einem visuellen Test verbunden ist, verwendet er iCustom() um den Indikator automatisch zu laden. Erfolg oder Misserfolg werden in das Expertenjournal geschrieben, um Transparenz zu schaffen. Bei der Deinitialisierung werden alle Indikator-Handles manuell freigegeben, um Speicherlecks und Unordnung im Chart zu vermeiden.
int indHndl = INVALID_HANDLE; int OnInit() { ... if(!NonVisualTest) { indHndl = iCustom(_Symbol,_Period,"CRT Indicator", ATR_Period,LargeXATR,SmallXATR); if(indHndl != INVALID_HANDLE) ChartIndicatorAdd(0,0,indHndl); } return INIT_SUCCEEDED; } void OnDeinit(const int reason) { if(indHndl != INVALID_HANDLE) IndicatorRelease(indHndl); }
Die Hauptlogik befindet sich in OnTick(). Der EA zeichnet den Eröffnungszeitpunkt der Kerze bei „Shift“ 1 auf und weigert sich, erneut zu starten, bis sich dieser Wert ändert, sodass unabhängig von der Tickfrequenz genau eine Auswertung pro abgeschlossener Kerze gewährleistet ist. Ein kompakter Verlaufsblock wird kopiert – dieses Mal werden die Arrays explizit in Reihen umgewandelt, um sie an die Anforderungen von CRangePattern anzupassen. Wenn die Klassifizierung zu einem aktiven Muster führt, erstellt der EA eine Klartextmeldung, die das Symbol, den Zeitrahmen und die erkannte Kategorie enthält. Pop-up-, Ton- und Push-Benachrichtigungen werden entsprechend den Nutzereinstellungen ausgegeben, jedoch nur, wenn dies in der aktuellen Ausführungsumgebung zulässig ist.
datetime lastDone = 0; void OnTick() { datetime tClosed = iTime(_Symbol,_Period,1); if(tClosed == lastDone) return; // already processed lastDone = tClosed; const int need = pat.atrPeriod + 3; double H[],L[],O[],C[]; ArrayResize(H,need); ArraySetAsSeries(H,true); ArrayResize(L,need); ArraySetAsSeries(L,true); ArrayResize(O,need); ArraySetAsSeries(O,true); ArrayResize(C,need); ArraySetAsSeries(C,true); CopyHigh (_Symbol,_Period,0,need,H); CopyLow (_Symbol,_Period,0,need,L); CopyOpen (_Symbol,_Period,0,need,O); CopyClose(_Symbol,_Period,0,need,C); if(!pat.Calculate(1,H,L,O,C,need)) return; string sig; if(pat.isLarge) sig="Large-Range bar"; else if(pat.isSmall) sig="Small-Range bar"; else if(pat.isInside) sig="Inside bar"; else if(pat.isOutside) sig="Outside bar"; if(sig=="") return; string msg = _Symbol+" "+EnumToString(_Period)+" "+sig; Print("[CRT-EA] ",msg); if(!NonVisualTest) Alert(msg); if(Push_Alerts) SendNotification(msg); }
Im gesamten EA bieten optionale Debug-Anweisungen eine präzise Rückmeldung zu Aktionen wie dem erfolgreichen Anbringen von Indikatoren oder dem Fehlen einer angemessenen Historie. Da diese Meldungen von dem Flag DebugLog abhängig sind, können Produktionsbereitstellungen unbemerkt ablaufen, während Entwicklungs- oder Forschungssitzungen vollständig instrumentiert werden können.
input bool DebugLog = true; if(DebugLog) PrintFormat("[CRT-EA] Attached on %s %s (tester=%d)", _Symbol,EnumToString(_Period), (int)MQLInfoInteger(MQL_TESTER));
Das Toolkit vermeidet statische oder globale veränderbare Zustände, die über die ausdrücklich für den Betrieb benötigten Objekte hinausgehen. Alle im Chart erstellten dynamischen Objekte werden entweder automatisch von MetaTrader freigegeben, wenn ihr übergeordneter Indikator entfernt wird, oder explizit im Code gelöscht. Keine persistenten Arrays wachsen mit der Zeit; jeder Tick löst einen Kopier- und Klassifizierungsdurchlauf fester Größe aus, dessen Zeitkomplexität unabhängig von der Chartlänge ist. Folglich lässt sich das System von Wochencharts bis auf Sekundenbalken skalieren, ohne dass Änderungen vorgenommen werden müssen und ohne dass eine allmähliche Leistungsverschlechterung droht.
// inside any function needing history const int need = pat.atrPeriod + 3; double H[need], L[need], O[need], C[need]; // stack allocation in C++17 style // (or ArrayResize + quick release when the function exits)
Tests und Ergebnisse
In diesem Abschnitt untersuchen wir die Ergebnisse der Live-Tests, die im Folgenden vorgestellt werden.
Das folgende Gif zeigt einen 5-Minuten Step-Index Chart, der von CRT_EA betrieben wird. Wenn jeder Balken schließt, erscheinen farbige Kästchen, Markierungen und Pfeile, die anzeigen, ob die Volatilität schrumpft, sich ausweitet oder den vorherigen Bereich vollständig verschluckt. Ruhige, schmale „Innen“-Balken häufen sich, dann bricht plötzlich eine breite Kerze aus und signalisiert einen Ausbruch des Momentums. Hinter den Kulissen wird jede Kerze sofort an der aktuellen ATR gemessen und neu klassifiziert, sodass Sie eine ununterbrochene, farbcodierte Momentaufnahme der Marktenergie erhalten, ohne dass Sie jemals vergangene Balken neu streichen müssen. Anhand dieser Echtzeitanzeige lässt sich mühelos erkennen, wann sich der Markt aufschaukelt, wann er ausbricht und wie jeder Balken zum größeren Volatilitätszyklus beiträgt.

| Klasse | Farbe des Rechtecks | Pfeil/Markierung | Bedeutung |
|---|---|---|---|
| Large-Range Bar (LR) | Königsblauer Rand | Limone bei Hausse, Rot bei Baisse | Ungewöhnlich großer Bereich – Bereich ≥ largeMult × ATR |
| Small-Range Bar (SR) | Gelbe Umrandung | Kleiner gelber Punkt | Verengter Bereich – Bereich ≤ smallMult × ATR |
| Inside-Bar (IS) | Aqua-Umrandung | Aqua-Punkt | Hoch < vorheriges Hoch **und** Tief > vorheriges Tief |
| Outside-Bar (OB) | Magenta-Rand | Magenta-Punkt | Hoch > vorheriges Hoch und Tief < vorheriges Tief |
- Stufenindex-Chart
- Crash 1000 Index Chat
- Boom 1000 Index Chart
Schlussfolgerung
Das Toolkit der Candle-Range Theorie bietet eine komplette, modulare Lösung für die Range-Analyse im MetaTrader 5.
- CRangePattern – eine kompakte, in sich geschlossene Klasse, die Large-Range-, Small-Range-, Inside- und Outside-Balken ohne Neufärbung identifiziert.
- CRT_Indicator – überlagert Signale mit farbcodierten Kästchen und Pfeilen zur sofortigen visuellen Interpretation.
- CRT_EA – wandelt die gleichen Signale in Warnungen oder automatische Aufträge um.
Alle Parameter – ATR-Länge, kleine/große Multiplikatoren, Warnregeln – sind vollständig konfigurierbar, sodass sich das System an jedes Symbol, jeden Zeitrahmen und jede Volatilität anpassen kann. Da die Erkennungslogik von den Rendering- und Ausführungsebenen isoliert ist, können Sie sie mit minimalen Codeänderungen erweitern oder in Scanner, Dashboards oder vollständige Handelssysteme einbetten.
Das Toolkit ist für Ausbildungszwecke gedacht und sollte vor einem Live-Einsatz auf einem Demokonto getestet werden. Kombinieren Sie die objektiven Handelssignale mit Ihren eigenen Regeln für die Handelsauswahl und das Risikomanagement, um sicherzustellen, dass die Methodik mit Ihrer Gesamtstrategie übereinstimmt.
Wenn Sie die Candle-Range Theorie auf diese Weise anwenden, können Sie Volatilitätsereignisse schnell, klar und sicher erkennen, visualisieren und darauf reagieren.
Übersetzt aus dem Englischen von MetaQuotes Ltd.
Originalartikel: https://www.mql5.com/en/articles/18911
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.
Datenwissenschaft und ML (Teil 46): Aktienmarktprognosen mit N-BEATS in Python
Automatisieren von Handelsstrategien in MQL5 (Teil 24): London Session Breakout System mit Risikomanagement und Trailing Stops
MQL5-Handelswerkzeuge (Teil 6): Dynamisches holografisches Dashboard mit Impulsanimationen und Steuerelementen
Entwicklung fortschrittlicher ICT-Handelssysteme: Implementierung von Signalen in den Indikator "Order Block"
- 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.