Entwicklung des Price Action Analysis Toolkit (Teil 45): Erstellen eines dynamischen Level-Analyse-Panels in MQL5
Inhalt
- Einführung
- Warum statistische Validierung wichtig ist
- Von der Intuition zur Evidenz
- MQL5-Implementierung
- Ergebnisse
- Schlussfolgerung
Einführung
In Teil 40 unseres Preisaktionsanalyse-Toolkits haben wir untersucht, wie Statistiken die verborgene Logik hinter dem Preisverhalten aufdecken können, indem wir herausgefunden haben, wo sich der Mittelwert, der Modus und der Median des Marktes tendenziell ausrichten. Dabei haben wir gelernt, dass die Märkte nicht so chaotisch sind, wie es den Anschein hat. Die Kurse bewegen sich oft in statistisch aussagekräftigen Bereichen, die den Auftragsfluss in aller Ruhe beeinflussen.
Der Zweck dieser früheren Arbeit bestand darin, diese statistischen Preisniveaus zu ermitteln und zu beobachten, wie oft der Preis sie im Laufe der Zeit einhielt oder verwarf. Diese Studie legte den Grundstein für eine tiefer gehende Frage: Wenn bestimmte Preise ein größeres statistisches Gewicht haben, können wir dann messen, wie der Markt historisch auf ein von uns im Voraus festgelegtes Niveau reagiert?
In diesem neuen Artikel gehen wir noch einen Schritt weiter und stellen den Price Level Testing EA vor, einen automatisierten Analyseassistenten, der es jedem Händler ermöglicht, jedes beliebige Preisniveau zu testen und sofort ein objektives Feedback darüber zu erhalten, wie der Preis auf dieses Niveau über Hunderte oder Tausende von vergangenen Bars reagiert hat. Das Ergebnis ist ein Werkzeug, das wie Ihr persönliches „Preis-Aktions-Labor“ funktioniert. Sie identifizieren das Niveau, der EA führt die historischen Tests durch, und zusammen zeigen sie das empirische Muster von Berührungen, Abprallern und Ausbrüchen, die diese Zone in der Vergangenheit definiert haben.
Warum statistische Validierung wichtig ist
Wenn wir nackte Charts analysieren, ziehen die meisten von uns instinktiv Linien. Ein scharfer Wendepunkt, eine Ansammlung von Dochten, vielleicht ein früheres Hoch – unser Auge erkennt ein wiederkehrendes Niveau und unser Gehirn nennt es Unterstützung oder Widerstand. Diese intuitive Fähigkeit ist wertvoll, aber sie ist auch anfällig für zwei Fallen:
- Jüngste Tendenz – wir übergewichten die jüngsten Ereignisse und ignorieren die langfristige Häufigkeit.
- Bestätigte Tendenz – wir erinnern uns an die Zeiten, in denen ein Level „funktioniert“ hat, und vergessen die Zeiten, in denen es nicht funktioniert hat.
Ohne Rückrechnung bleibt ein von Hand gezeichnetes Niveau einfach eine Meinung. Was der Price Level Testing EA bietet, ist ein Beweis. Sie verwandelt visuelle Eindrücke in messbare Daten:
- Wann hat diese Ebene wirklich eine Barriere dargestellt?
- Wie oft ist der Preis einfach durchgelaufen?
- Wurde sie häufiger von oben oder von unten angegangen?
Zwei Kernprobleme, die der EA löst
Problem 1 – Das Rätselraten bei der Schätzung der Stärke eines Niveaus
„Das sieht nach starkem Widerstand aus... oder so, denke ich.“
- Typisches Händlerszenario:
Sie beobachten, dass EURUSD die Zone von 1,2000 innerhalb weniger Wochen zweimal verworfen hat. Es sieht überzeugend aus – lange obere Dochte, starke Ausverkäufe, klare Mustererkennung. Sie markieren 1,2000 als Hauptwiderstand und planen Ihre nächsten Handelsgeschäfte in diesem Bereich. Wochen später beginnt der Preis wieder in Richtung 1,2000 zu driften. Sie zögern: „Wird es dieses Mal halten? War 1,2000 wirklich so stark, oder hatte ich nur Glück, als der Kurs das letzte Mal dort drehte?“
Das Gedächtnis kann keine Antwort geben, denn es umfasst nur eine Handvoll Beispiele. Ohne Statistiken kann man die tatsächliche Häufigkeit von Berührungen oder Ausbrüchen in der Vergangenheit nicht feststellen.
Wie der EA das Problem löst:
Geben Sie 1.2000 in das Dashboard ein und klicken Sie auf „Analyze“. Innerhalb von Sekunden durchsucht der EA den historischen Datensatz und erstellt Berichte:- die Anzahl der Berührungen in der Nähe dieses Niveaus: wenn der Kurs dieses Niveau erreichte, aber wieder zurückging;
- die Anzahl der sauberen Durchbrüche, wenn der Schlusskurs entscheidend durchgebrochen hat;
- und vor allem, ob sich das Niveau im Laufe der Zeit überwiegend als Unterstützung oder Widerstand verhielt.
Jetzt sind Sie nicht mehr auf Ihr visuelles Gedächtnis oder auf Vermutungen angewiesen. Sie haben ein quantifiziertes Profil für 1.2000 – ein objektives Maß für seine statistische Relevanz. Ihre nächste Entscheidung, um dieses Niveau herum zu handeln, basiert auf Daten und nicht auf Vermutungen.
Problem 2 – Fehleinschätzung der Marktverzerrung und der Ausbruchszuverlässigkeit
„Der Kurs hat gerade die Marke durchbrochen – ist dieser Ausbruch echt oder nur ein Rauschen?“
- Generelle Herausforderung:
Der XAUUSD (Gold) wird um 1950,00 gehandelt. Eine scharfe Kerze drückt oberhalb dieses Niveaus; die Aufregung steigt – „Aufwärts-Ausbruch!“ – und die Händler stürzen sich darauf. Zwei Stunden später bricht die Kerze zusammen, der Kurs rutscht wieder unter 1950, und überall werden Stop-Loss-Kurse ausgelöst. War das wirklich ein Momentum oder ein für die Volatilität von Gold typischer falscher Ausbruch?
Wenn Sie das statistische Verhalten des Jahres 1950 im Voraus untersucht hätten, wüssten Sie vielleicht schon die Antwort.
Wie der EA das Problem löst:
Geben Sie 1950,00 ein, drücken Sie auf „Analyze“, und das Tool erstellt sofort eine historische Aufschlüsselung:
- wie viele Aufwärtsausbrüche oberhalb von 1950 die Rallye fortsetzten;
- wie viele falsche Ausbrüche sich schnell umkehrten;
- wie oft 1950 als Magnet (häufige Interaktion) und wie oft als Barriere (scharfe Ablehnung) diente.
Anhand dieser Kennzahlen können Sie klar erkennen, ob 1950 einen Preis anzieht oder abstößt. Dadurch wird die Unsicherheit in eine gemessene Erwartung umgewandelt – die Art von probabilistischen Erkenntnissen, die disziplinierten Händlern und algorithmischen Systemen gleichermaßen zugute kommen.
Beispiel: Manuelle Analyse der Marke von 1,34244 (GBP/USD H1, April 2025 bis Oktober 2025)
Während des unten dargestellten Zeitraums identifizierte der Price Level Testing EA mehrere Interaktionen mit der Marke von 1,34244 auf dem GBP/USD H1-Chart. Der Kurs näherte sich der Marke mehrmals und berührte sie innerhalb der definierten Toleranzspanne, schaffte es jedoch nicht, einen bestätigten Ausbruch über die Schwelle zu erzielen. Auf jeden Versuch folgte eine Umkehr nach unten, was darauf hindeutet, dass die Verkäufer diese Zone konsequent verteidigten.
Dieses Muster des wiederholten Berührung ohne entscheidende Verletzung deutet darauf hin, dass die 1,34244 in diesen Sitzungen eher als kurzfristige Widerstandsmarke denn als Unterstützung fungierte.

Zwischen dem 30. September und dem 9. Oktober 2025 handelte der Markt mehrere Sitzungen lang oberhalb des Bereichs von 1,34244 und nutzte ihn als vorläufige Unterstützungslinie. Der Kurs hat diesen Bereich wiederholt von oben getestet und konnte ihn zunächst halten, was auf kurzfristige Stabilität hindeutet. Im weiteren Verlauf der Sequenz ließ der Kaufdruck jedoch nach, und es kam zu einem entscheidenden Durchbruch unter 1,34244. Die Kerzen begannen unterhalb dieses Niveaus zu schließen, gefolgt von einer klaren Fortsetzung des Abwärtstrends. Dieses Verhalten bestätigte, dass die Unterstützung zusammengebrochen war und sich in eine neue Widerstandszone verwandelte, als der Kurs versuchte, sie später erneut zu testen.
Aus struktureller Sicht markiert ein solcher Übergang einen Wechsel von der Unterstützung zum Widerstand, eines der wichtigsten Signale dafür, dass sich das Momentum zugunsten der Verkäufer verschoben hat. Das Niveau, das einst die Rückgänge eindämmte, wurde zu einer Obergrenze, und die darauf folgenden Bewegungen in Richtung dieses Niveaus zogen eher das Angebot als die Nachfrage an.
Wenn ähnliche Umschwünge zu unterschiedlichen Zeitpunkten auftreten, wie sie in den vergangenen Monaten zu beobachten waren, veranschaulichen sie, wie sich die Marktstimmung um wiederkehrende Kursniveaus herum entwickelt. Die manuelle Untersuchung dieser Verschiebungen unterstreicht, wie wertvoll es ist, Berührungen und Ausbrüche systematisch zu quantifizieren, da objektive Daten bestätigen können, was die visuelle Inspektion nahelegt.

Von der Intuition zur Evidenz
Jeder Händler entwickelt ein Gespür für Kursniveaus, die Marktbewegungen anzuziehen oder abzuwehren scheinen. Erfahrungen verstärken diese Eindrücke, aber der Intuition allein fehlt oft die Bestätigung. Der Price Level Testing EA formalisiert diese Intuition. Es wandelt den Eindruck eines Händlers – „dieses Niveau ist wichtig“ – in einen überprüfbaren, quantitativen Beweis um.
Auf den ersten Blick sieht der EA täuschend einfach aus. Sie geben ein Preisniveau ein, drücken auf „Analyze“, und das Programm prüft die jüngste Historie. Hinter dieser Einfachheit verbirgt sich ein umfassender Analyserahmen, der misst, wie der Preis über Hunderte von Balken mit dem Niveau interagiert hat. Innerhalb von Sekunden liefert er vier konkrete Ergebnisse:
- Anzahl der Aufwärts- und Abwärtsberührungen – wie oft der Kurs das Niveau von jeder Seite aus getestet hat;
- Anzahl der bestätigten Ausbrüche – wie oft hat der Kurs die Marke entscheidend überschritten;
- Wahrscheinlichkeiten, die die Richtungsabhängigkeit dieser Ereignisse beschreiben;
- Ein aggregierter Vorspannungswert, der das Niveau als Unterstützung, Widerstand oder neutral klassifiziert.
Was früher ein akribisches Blättern in Tabellen und ein subjektives Urteil erforderte, wird jetzt automatisch und unvoreingenommen verarbeitet. Die Rolle des Händlers entwickelt sich vom Erkennen von Potenzialen zur Überprüfung der statistischen Signifikanz.
Objektive Ereignisklassifizierung
Der EA verwendet explizite Regeln, um sicherzustellen, dass jede „Berührung“ oder jeder „Ausbruch“ konsistent validiert wird, unabhängig von Zeitrahmen oder Instrument.
1. Identifizierung durch Berührung
Eine Berührung stellt einen kontrollierten Test des Niveaus dar – der Preis nähert sich an, berührt, geht aber nicht wesentlich darüber hinaus. Um zufälliges Preisrauschen herauszufiltern, definiert der EA eine zulässige Toleranz, TouchPips, ausgedrückt in Pips um das gewählte Niveau. Wenn, für jeden Balken:
High ≥ Level − (TouchPips × pip) AND Low ≤ Level + (TouchPips × pip)
zeichnet das Programm diesen Balken als Berührungsereignis auf. Die Richtung wird dann durch den Schlusskurs bestimmt:
- Aufwärts-Berührung – die Kerze schließt oberhalb des Niveaus, was darauf hinweist, dass die Käufer es als Unterstützung verteidigt haben.
- Abwärts-Berührung – die Kerze schließt unterhalb des Niveaus, was auf eine Ablehnung des Widerstands hindeutet.
Anhand dieser Unterscheidung kann der Algorithmus erkennen, welche Seite des Marktes das Niveau in der Vergangenheit häufiger eingehalten hat.
2. Ausbruch-Validierung
Ein Ausbruch wird nur dann bestätigt, wenn der Schlusskurs das Niveau um eine definierte Marge (BreakPips) übersteigt, sodass vorübergehende Ausschläge ausgeschlossen sind.
Aufwärts-Ausbruch: der vorherige Balken schloss unterhalb des Levels und der aktuelle Balken schloss ausreichend oberhalb des Levels (mehr als BreakPips im Wert in Pips).
PrevClose<LevelANDClose>Level+(BreakPips×pip) Abwärts-Ausbruch: der vorherige Balken schloss oberhalb des Levels und der aktuelle Balken schloss ausreichend unterhalb des Levels (mehr als BreakPips Wert in Pips).
PrevClose>LevelANDClose<Level−(BreakPips×pip)
Die Verwendung von Schlusskursen und Schwellenwertverschiebungen gibt wieder, wie professionelle Analysten strukturelle Übergänge und nicht vorübergehende Volatilität beurteilen.
Von Zählungen zu empirischen Wahrscheinlichkeiten
Sobald alle Balken innerhalb von BarsToCheck untersucht wurden, aggregiert der EA die Ergebnisse zu vier Rohwerten:
| Ereignistyp | Aufwärts | Abwärts |
|---|---|---|
| Berührung | bull_touch | bear_touch |
| Ausbrüche | bull_break | bear_break |
Diese Zählungen werden in empirische Wahrscheinlichkeiten umgewandelt, also in direkte Beobachtungen der Häufigkeit innerhalb der ausgewählten historischen Stichprobe.
Empirische Wahrscheinlichkeiten:
- Aufwärts-Berührungs-Wahrscheinlichkeit
![]()
- Abwärts-Berührungs-Wahrscheinlichkeit
![]()
Es handelt sich dabei nicht um Prognosen oder theoretische Werte, sondern um das tatsächliche Verhalten des Marktes in dem gewählten Zeitfenster.
Schließlich wird eine allgemeine Verzerrung abgeleitet:
- Wenn sowohl die Wahrscheinlichkeit eines Aufwärts-Berührung als auch die Wahrscheinlichkeit eines Ausbruchs überwiegen: Das Niveau hat in erster Linie als Unterstützung (aufwärts) gewirkt.
- Wenn fallende Werte bei beiden überwiegen: Das Niveau hat als Widerstand (abwärts) fungiert.
- Wenn keine der beiden Seiten schlüssig ist, wird die Stufe als neutral eingestuft.
Diese Interpretation verbindet die Präzision numerischer Daten mit der Intuition der klassischen Unterstützungs-Widerstands-Analyse.
MQL5-Implementierung
1. Beginn mit Metadaten und Nutzereingaben
Wir beginnen damit, den EA mit einigen Metadaten am Anfang des Skripts vorzustellen. Dazu gehören der Name des EA („Price Level Testing EA“), die Copyright-Informationen und ein Link zum MQL5-Profil des Autors. Diese Zeilen haben keinen Einfluss auf die Funktionalität, helfen aber bei der Identifizierung des EA und seines Ursprungs. Anschließend verwenden wir die Direktive #property, um die Versionsnummer, den Copyright-Verweis und den strengen Kompilierungsmodus festzulegen. Die Aktivierung des Strict-Modus sorgt dafür, dass wir sichereren und robusteren Code schreiben, indem wir eine strenge Typüberprüfung erzwingen.
#property copyright "https://www.mql5.com/en/users/lynnchris" #property version "1.0" #property strict input int BarsToCheck = 500; input double TouchPips = 10; input double BreakPips = 20; input color TextColor = clrYellow;
Als Nächstes definieren wir die Eingabeparameter, mit denen die Nutzer das Verhalten des EA anpassen können. Wir geben an, wie viele historische Balken wir analysieren wollen (BarsToCheck), wie nahe der Preis an ein Niveau herankommen muss, um als „Berührung“ zu gelten (TouchPips), und wie weit er über dieses Niveau hinausgehen muss, um als „Ausbruch“ zu gelten (BreakPips). Wir lassen den Nutzer auch eine Farbe für den Ausgabetext wählen (TextColor). Diese Eingaben geben uns Flexibilität und Kontrolle über die Analyse und ermöglichen es uns, das Verhalten auf verschiedene Symbole, Zeitrahmen oder Handelsstrategien abzustimmen.
2. Definieren von UI-Konstanten und Layout-Struktur
Weiter geht es mit einer Reihe von Konstanten, die wir mit #define-Direktiven einrichten. Diese Konstanten helfen uns bei der Verwaltung und Organisation der Elemente der Nutzeroberfläche (UI), die wir später im Chart anzeigen werden. Indem wir jedem Objekt einen eindeutigen Namen oder ein Präfix geben – z. B. EDIT_NAME für das Texteingabefeld, BTN_NAME für die Schaltfläche „Analyze“ und MARK_PREFIX für die Markierungen – stellen wir sicher, dass wir diese Objekte im gesamten Skript leicht referenzieren und verwalten können. Dies ist besonders nützlich, wenn wir sie dynamisch löschen oder aktualisieren müssen.
#define EDIT_NAME "UI_EDIT_LEVEL" #define BTN_NAME "UI_BTN_ANALYZE" #define BOX_NAME "UI_BOX" #define HDR_NAME "UI_HDR" #define INSTR_NAME "UI_INSTR" #define MARK_PREFIX "AN_" #define LINE_PREFIX "UI_LINE_" #define UI_CORNER CORNER_LEFT_UPPER int ui_base_x = 6; int ui_base_y = 18; int ui_row_spacing = 17; int ui_font_size = 9;
Wir definieren auch layoutbezogene Variablen wie ui_base_x und ui_base_y, um die Position unserer UI-Elemente auf dem Bildschirm festzulegen. Wir können uns das so vorstellen, dass wir damit den Grundstein dafür legen, wohin sich alles entwickeln wird. Der Abstand zwischen den Zeilen (ui_row_spacing) und die Schriftgröße (ui_font_size) helfen uns, die Lesbarkeit und Ausrichtung unserer UI-Komponenten zu kontrollieren. Mit diesen Konstanten und Layout-Einstellungen sind wir bereit, eine konsistente und strukturierte Oberfläche zu erstellen, die sauber und professionell aussieht.
3. Aufbau der Nutzeroberfläche in OnInit()
Nachdem wir nun unsere UI-Struktur definiert haben, gehen wir zur Funktion OnInit() über, die ausgeführt wird, wenn der EA zum ersten Mal zu einem Chart hinzugefügt wird. Hier beginnen wir mit der Erstellung der grafischen Elemente, mit denen der Nutzer interagieren wird. Zunächst erstellen wir mit ObjectCreate() ein editierbares Textfeld und benennen es entsprechend der Konstante EDIT_NAME. Wir gestalten sie mit geeigneten Abmessungen, Schriftgrößen und Farben, damit sie sowohl funktional als auch optisch ansprechend sind. In diesem Eingabefeld gibt der Nutzer das Preisniveau ein, das er analysieren möchte.
SafeDeleteObj(EDIT_NAME); ObjectCreate(0, EDIT_NAME, OBJ_EDIT, 0, 0, 0); ObjectSetInteger(0, EDIT_NAME, OBJPROP_CORNER, UI_CORNER); ObjectSetInteger(0, EDIT_NAME, OBJPROP_XDISTANCE, ui_base_x); ObjectSetInteger(0, EDIT_NAME, OBJPROP_YDISTANCE, ui_base_y); ObjectSetInteger(0, EDIT_NAME, OBJPROP_XSIZE, 100); ObjectSetInteger(0, EDIT_NAME, OBJPROP_BGCOLOR, clrBlack); ObjectSetInteger(0, EDIT_NAME, OBJPROP_COLOR, clrLime); ObjectSetInteger(0, EDIT_NAME, OBJPROP_FONTSIZE, ui_font_size); ObjectSetString(0, EDIT_NAME, OBJPROP_TEXT, "1.2000");
Als Nächstes platzieren wir eine Schaltfläche mit der Aufschrift „Analyze“ direkt neben dem Eingabefeld. Wenn Sie diese Schaltfläche anklicken, wird unsere Analyse ausgelöst. Wir positionieren es sorgfältig mit Hilfe der Layout-Konstanten, die wir zuvor definiert haben, um sicherzustellen, dass es mit dem Eingabefeld übereinstimmt. Dann fügen wir eine Beschriftung hinzu, die als Anweisung fungiert und den Nutzer auffordert, „Press Analyze“, und platzieren das direkt rechts neben der Schaltfläche. Schließlich fügen wir eine Kopfzeile mit dem Titel „Touch & Breakout Stats“ hinzu, um der gesamten Schnittstelle einen Kontext zu geben. Wenn OnInit() beendet ist, haben wir eine einfache, aber interaktive Nutzeroberfläche erstellt, die den Nutzer einlädt, seine Analyse mit nur wenigen Klicks zu beginnen.
4. Aufräumen mit OnDeinit()
Nach dem Einrichten der Schnittstelle bereiten wir auch die Bereinigung vor. Die Funktion OnDeinit() wird ausgeführt, wenn wir den EA aus dem Chart entfernen oder ihn neu laden. In diesem Schritt stellen wir sicher, dass alle Objekte, die der EA erstellt hat, entfernt werden, damit das Chart sauber und frei von Unordnung ist. Wir rufen DeletePrefixObjects() mit den entsprechenden Präfixen auf, um alle Marker und Labels zu entfernen, die während der Analyse dynamisch erstellt wurden.
void OnDeinit(const int reason) { DeletePrefixObjects(MARK_PREFIX); DeletePrefixObjects(LINE_PREFIX); SafeDeleteObj(EDIT_NAME); SafeDeleteObj(BTN_NAME); SafeDeleteObj(BOX_NAME); SafeDeleteObj(HDR_NAME); SafeDeleteObj(INSTR_NAME); }
Anschließend verwenden wir SafeDeleteObj(), um die statischen UI-Elemente – Eingabefeld, Schaltfläche, Kopfzeile, Anweisungsetikett und Hintergrundfeld – einzeln zu entfernen. Dadurch wird sichergestellt, dass keine Objekte auf der Chart zurückbleiben. Durch die ordnungsgemäße Durchführung der Bereinigung machen wir es für die Nutzer sicher und bequem, den EA neu zu laden oder zu entfernen, ohne sich Sorgen machen zu müssen, dass grafische Überreste andere Tools oder Indikatoren beeinträchtigen.
5. Reagieren auf Nutzeraktionen in OnChartEvent()
Nachdem wir unsere Nutzeroberfläche eingerichtet und die Bereinigungsprozeduren vorbereitet haben, legen wir nun fest, wie der EA reagiert, wenn der Nutzer mit dem Chart interagiert. Die Funktion OnChartEvent() wartet auf Ereignisse wie Mausklicks. Konkret wird geprüft, ob die Schaltfläche „Analyze“ angeklickt wurde, indem der Name des angeklickten Objekts mit BTN_NAME verglichen wird.
void OnChartEvent(const int id,const long &l,const double &d,const string &s) { if(id==CHARTEVENT_OBJECT_CLICK && s==BTN_NAME) { string textlevel = ObjectGetString(0, EDIT_NAME, OBJPROP_TEXT); double level = StringToDouble(textlevel); if(level <= 0) { Alert("Enter numeric level"); return; } DeletePrefixObjects(MARK_PREFIX); DeletePrefixObjects(LINE_PREFIX); RunAnalysis(level); } }
Wenn die Schaltfläche angeklickt wird, rufen wir den Textwert aus dem Eingabefeld ab, wandeln ihn mit StringToDouble() in einen numerischen Wert um und überprüfen, ob er größer als Null ist. Wenn der Wert ungültig ist, wird eine Warnung angezeigt, die den Nutzer auffordert, eine gültige numerische Stufe einzugeben. Wenn sie gültig ist, werden alle vorherigen Markierungen und Analyseergebnisse mit DeletePrefixObjects() gelöscht. Schließlich rufen wir RunAnalysis() mit der nutzerdefinierten Ebene auf, um die Kernanalyse zu beginnen. In diesem Schritt werden Nutzereingaben in Aktionen umgesetzt und die Voraussetzungen für eine aussagekräftige Datenvisualisierung geschaffen.
6. Vorbereiten der Analyse in RunAnalysis()
Sobald wir uns in der Funktion RunAnalysis() befinden, beginnen wir mit der Vorbereitung aller Variablen und Schwellenwerte, die wir benötigen. Wir berechnen den Pip-Wert für das aktuelle Symbol auf der Grundlage seiner Ziffern, was uns hilft, genaue Schwellenwerte dafür zu definieren, was als „Touch“ oder „Break“ zählt. Anschließend legen wir fest, wie viele Balken wir sicher analysieren können, wobei wir sicherstellen, dass wir innerhalb der verfügbaren Historie bleiben.
double point = SymbolInfoDouble(_Symbol,SYMBOL_POINT); double pip = (SymbolInfoInteger(_Symbol,SYMBOL_DIGITS) > 3 ? 0.0001 : 0.01); double touch_th = TouchPips * pip; double break_th = BreakPips * pip;
Wir initialisieren auch Zähler, um vier Arten von Ereignissen zu verfolgen: Aufwärts-Berührung (wenn der Preis das Niveau von unten berührt), Abwärts-Berührung (von oben), Aufwärts-Ausbrüche (der Preis bricht nach oben über das Niveau hinaus) und Abwärts-Ausbrüche (der Preis bricht nach unten durch). Diese Zähler akkumulieren Daten, während wir jeden Balken scannen, und geben uns einen Überblick darüber, wie der Preis in der Vergangenheit mit dem angegebenen Niveau interagiert hat.
7. Historische Bars nach Ereignissen durchsuchen
Jetzt tauchen wir in die Kernschleife ein, in der wir jeden historischen Balken scannen, um Berührungen und Ausbrüche zu erkennen. Für jeden Balken werden der Höchst-, Tiefst-, Schluss- und vorherige Schlusskurs sowie die Uhrzeit abgerufen. Anschließend prüfen wir, ob sich die Höchst- und Tiefstpreise mit dem Niveau innerhalb der Berührungsschwelle schneiden. Wenn dies der Fall ist, stufen wir ihn als Berührung ein und bestimmen seine Richtung auf der Grundlage des Schlusskurses.
for(int i=0; i<bars_to_check; i++) { double hi = iHigh(_Symbol,_Period,i); double lo = iLow(_Symbol,_Period,i); double cl = iClose(_Symbol,_Period,i); double prev = iClose(_Symbol,_Period,i+1); datetime t = iTime(_Symbol,_Period,i); if(hi >= level - touch_th && lo <= level + touch_th) { if(cl < level) bull_touch++, DrawMarker(MARK_PREFIX+"T_BU_"+string(i), t, level + 5*point, clrLime, 241); else if(cl > level) bear_touch++, DrawMarker(MARK_PREFIX+"T_BE_"+string(i), t, level - 5*point, clrRed, 242); } if(prev < level && cl > level + break_th) bull_break++, DrawMarker(MARK_PREFIX+"B_BU_"+string(i), t, cl + 10*point, clrLime, 217); if(prev > level && cl < level - break_th) bear_break++, DrawMarker(MARK_PREFIX+"B_BE_"+string(i), t, cl - 10*point, clrRed, 218); }
Wenn der Schlusskurs unter dem Niveau liegt, ist dies ein Aufwärts-Berührung, den wir durch Inkrementieren des Zählers und Aufrufen von DrawMarker() registrieren, um einen grünen Pfeil auf dem Chart zu platzieren. Liegt er über diesem Niveau, ist dies ein Abwärtsimpuls, der mit einem roten Pfeil gekennzeichnet ist. Wir führen ähnliche Überprüfungen für Ausbrüche durch: Wenn der vorherige Schlusskurs unter dem Niveau liegt und der aktuelle Schlusskurs deutlich darüber (basierend auf BreakPips), handelt es sich um einen Aufwärts-Ausbruch. Im umgekehrten Fall handelt es sich um einen Abwärts-Ausbruch. Jeder Ausbruch wird auch visuell auf dem Chart markiert, damit wir die Muster auf einen Blick erkennen können.
8. Berechnung von Statistiken und Bestimmung von Marktverzerrungen
Nachdem wir alle Balken überprüft haben, berechnen wir die Gesamtzahl der Berührungen und Ausbrüche und anschließend den prozentualen Anteil der Hausse- und Baisse-Ereignisse in jeder Kategorie. Diese Statistiken helfen uns zu verstehen, wie sich die Preise im Verhältnis zum Niveau verhalten haben. Wir verwenden die sichere Teilung, um Fehler zu vermeiden, wenn keine Ereignisse gefunden werden.
double tot_touch = (double)(bull_touch + bear_touch); double tot_break = (double)(bull_break + bear_break); double pBT = (tot_touch > 0.0 ? 100.0 * bull_touch / tot_touch : 0.0); double pRT = (tot_touch > 0.0 ? 100.0 * bear_touch / tot_touch : 0.0); double pBB = (tot_break > 0.0 ? 100.0 * bull_break / tot_break : 0.0); double pRB = (tot_break > 0.0 ? 100.0 * bear_break / tot_break : 0.0); string bias = "Neutral"; if(pBT > pRT && pBB > pRB) bias = "Support (Bullish)"; else if(pRT > pBT && pRB > pBB) bias = "Resistance (Bearish)";
Ausgehend von der Dominanz der Auf- oder Abwärts-Aktivitäten bestimmen wir die allgemeine Tendenz. Wenn Berührung und Ausbrüche nach oben dominieren, bezeichnen wir das Niveau als „Support (Bullish)“. Wenn Abwärtsereignisse überwiegen, wird er zum „Resistance (Bearish)“. Wenn es keine klare Dominanz gibt, stufen wir sie als „neutral“ ein. Auf diese Weise können Händler schnell erkennen, ob das Niveau wahrscheinlich als Unter- oder Obergrenze des Marktes fungieren wird.
9. Zusammenstellung des Ergebnispanels
Nachdem wir unsere Statistiken fertiggestellt haben, beginnen wir mit der Erstellung eines zusammenfassenden Panels, um die Ergebnisse in einem Chart anzuzeigen. Wir verwenden ein Array von Strings, wobei jedes Element eine Zeile im Panel darstellt. Dazu gehören Informationen wie der Name des Symbols, der Zeitrahmen, das getestete Niveau, die Anzahl der Berührungen und Ausbrüche, ihre jeweiligen Prozentsätze und die Gesamtausrichtung.
ArrayResize(lines, 7); lines[0] = StringFormat("Symbol: %s TF: %s", _Symbol, EnumToString(_Period)); lines[1] = StringFormat("Level: %.*f Bars Checked: %d", (int)SymbolInfoInteger(_Symbol,SYMBOL_DIGITS), level, bars_to_check); lines[2] = " "; lines[3] = StringFormat("Touches ↑ %3d ↓ %3d P↑ %4.1f%% P↓ %4.1f%%", bull_touch, bear_touch, pBT, pRT); lines[4] = StringFormat("Breaks ↑ %3d ↓ %3d P↑ %4.1f%% P↓ %4.1f%%", bull_break, bear_break, pBB, pRB); lines[5] = " "; lines[6] = StringFormat("Overall Bias: %s", bias);
Wir berechnen die maximale Leitungslänge, damit wir die Platte richtig dimensionieren können. Dadurch wird sichergestellt, dass der Text sauber in den Hintergrundrahmen passt, ohne sich zu überlappen oder abgeschnitten zu werden. Durch den dynamischen Aufbau des Inhalts stellen wir sicher, dass das Panel flexibel bleibt und sich an unterschiedliche Eingaben und Symbole anpasst.
10. Zeichnen der visuellen Ausgabe auf dem Chart
Bevor wir das neue Feld zeichnen, entfernen wir alle vorhandenen Ausgaben, um das Chart sauber zu halten. Anschließend erstellen wir ein rechteckiges Objekt für Kennzeichnungen, das als Hintergrundfeld für unsere Analyseergebnisse dient. Die Größe basiert auf unseren früheren Berechnungen, und wir positionieren sie unter der Eingabeoberfläche.
ObjectCreate(0, BOX_NAME, OBJ_RECTANGLE_LABEL, 0, 0, 0); ObjectSetInteger(0, BOX_NAME, OBJPROP_XDISTANCE, baseX - 6); ObjectSetInteger(0, BOX_NAME, OBJPROP_YDISTANCE, baseY - 8); ObjectSetInteger(0, BOX_NAME, OBJPROP_XSIZE, boxWidth + 12); ObjectSetInteger(0, BOX_NAME, OBJPROP_YSIZE, boxHeight + 12); ObjectSetInteger(0, BOX_NAME, OBJPROP_BGCOLOR, clrDarkSlateGray); for(int i=0; i<7; i++) { string nm = LINE_PREFIX + IntegerToString(i); ObjectCreate(0, nm, OBJ_LABEL, 0, 0, 0); ObjectSetString(0, nm, OBJPROP_TEXT, lines[i]); }
Als Nächstes gehen wir in einer Schleife durch unser Array von Ergebniszeilen und erstellen für jede Zeile eine eigene Beschriftung. Wir gestalten die ersten paar Zeilen in Weiß, damit sie wie Überschriften aussehen, und verwenden die nutzerdefinierte TextColor für den Rest. Jedes Etikett wird sorgfältig positioniert, sodass ein ordentliches, vertikal angeordnetes Panel entsteht. Diese Ausgabe bietet Händlern eine klare Zusammenfassung der Analyse auf dem Chart, was die Nutzerfreundlichkeit und die Entscheidungsfindung verbessert.
11. Protokollierung des Berichts auf dem Terminal
Zusätzlich zur Anzeige der Ergebnisse im Chart wird der gesamte Bericht mit Print() auf dem Terminal ausgegeben. Dies ermöglicht es dem Nutzer, die Analyse in der Registerkarte „Experten“ oder „Journal“ des MetaTrader zu überprüfen. Es bietet auch ein dauerhaftes Protokoll, das für die Nachverfolgung, Fehlersuche oder Analyse mehrerer Ebenen im Laufe der Zeit nützlich sein kann. Indem wir sowohl visuelle als auch textliche Ausgaben bereitstellen, gehen wir auf unterschiedliche Nutzerpräferenzen ein und stellen sicher, dass keine Informationen verloren gehen.
string report = ""; for(int i=0; i<ArraySize(lines); i++) { report += lines[i]; if(i < ArraySize(lines)-1) report += "\n"; } Print(report);
12. Zeichnen von Markierungen mit DrawMarker()
Diese Funktion hilft uns, visuelle Markierungen auf dem Chart zu setzen, wenn wir eine Berührung oder einen Ausbruch erkennen. Er prüft zunächst, ob eine Markierung mit demselben Namen bereits existiert und löscht sie, um Doppelungen zu vermeiden. Dann wird ein neues OBJ_ARROW-Objekt zum angegebenen Zeitpunkt und Preis erstellt und mit der entsprechenden Farbe und dem Pfeilcode versehen.
void DrawMarker(string name, datetime t, double price, color clr, int arrow) { if(ObjectFind(0, name) >= 0) ObjectDelete(0, name); ObjectCreate(0, name, OBJ_ARROW, 0, t, price); ObjectSetInteger(0, name, OBJPROP_COLOR, clr); ObjectSetInteger(0, name, OBJPROP_ARROWCODE, arrow); }
Diese Markierungen dienen als visuelle Anhaltspunkte, die genau zeigen, wo der Preis mit dem Niveau interagiert hat. Sie erleichtern es den Händlern, die statistischen Daten mit der tatsächlichen Preisbewegung und den Kerzen auf dem Chart zu korrelieren, wodurch die Analyse visuell untermauert wird.
13. Sicheres Löschen von Objekten mit SafeDeleteObj()
Diese Hilfsfunktion prüft, ob ein Chartobjekt mit dem angegebenen Namen existiert, und löscht es gegebenenfalls. Es verhindert Fehler beim Versuch, Objekte zu löschen, die möglicherweise nicht vorhanden sind, und hilft uns, unsere Nutzeroberfläche und Markierungen sicher zu verwalten. Wir verwenden diese Funktion wiederholt im gesamten EA, um alte Objekte zu bereinigen, bevor wir neue erstellen.
void SafeDeleteObj(string name) { if(ObjectFind(0, name) >= 0) ObjectDelete(0, name); }
14. Löschen von Objekten nach Präfix mit DeletePrefixObjects()
Schließlich verwenden wir DeletePrefixObjects(), um Gruppen von Objekten zu löschen, die eine gemeinsame Namenskonvention haben. Dies ist besonders nützlich, um dynamisch erzeugte Marker und Beschriftungen aus früheren Analysen zu bereinigen. Indem wir eine Schleife durch alle Chartobjekte ziehen und diejenigen identifizieren, die mit einem bestimmten Präfix beginnen, stellen wir sicher, dass nur die Objekte des EA gelöscht werden – andere Chartelemente bleiben unberührt. So können wir präzise arbeiten und verhindern, dass versehentlich Gegenstände entfernt werden, die nichts mit der Sache zu tun haben.
void DeletePrefixObjects(string prefix) { int total = ObjectsTotal(0); for(int i = total - 1; i >= 0; i--) { string nm = ObjectName(0, i); if(StringFind(nm, prefix) == 0) ObjectDelete(0, nm); } }
Ergebnisse
In diesem Abschnitt konzentrieren wir uns auf das Testen von Preisniveaus und die Analyse der Ergebnisse. Nachfolgend finden Sie die Schritte, die Sie befolgen müssen, wenn Sie ein beliebiges Kursniveau Ihrer Wahl testen möchten, nachdem Sie den EA auf den MetaTrader 5 Chart gezogen haben.
1. Geben Sie den genauen numerischen Preis in das Eingabefeld ein – zum Beispiel:
- 1.2000 für EURUSD
- 1950.25 für Gold
- 80.50 für einen Index
Achten Sie darauf, die gleiche Dezimalgenauigkeit wie in der Tabelle angegeben zu verwenden.
2. Drücken Sie dann auf „Analyze“.
- Der EA scannt die konfigurierte Anzahl vergangener Balken, markiert jede historische Berührung und jeden Durchbruch dieses Niveaus auf dem Chart und zeigt die Ergebnisse als Statistiken pro Zeile auf dem Dashboard an.
3. Was Sie auf dem Armaturenbrett sehen werden:
- Gesamtzahl der Berührungen (Touches)
- Gesamtzahl der Ausbrüche (Breaks)
- Auf- und Abwärtsbewegungen
- Allgemeine Richtungstendenz
Auf dem Chart erscheinen Pfeilmarkierungen, die anzeigen, wo Berührungen und Ausbrüche stattgefunden haben. So erhalten Sie einen klaren, visuellen und statistischen Einblick in das Preisverhalten um das von Ihnen gewählte Niveau.
- Test auf EURUSD H1

Die obige Animation veranschaulicht die volle Funktionalität des Price Level Testing EA in Aktion. In dieser Demonstration wird ein bestimmtes Preisniveau manuell in das Eingabefeld der EA-Nutzeroberfläche im Chart eingegeben. Sobald die Taste „Analyze“ gedrückt wird, beginnt das System sofort mit der Prüfung des Preisniveaus Innerhalb weniger Augenblicke wertet das Programm das ausgewählte Niveau anhand historischer Daten aus und zeigt die Ergebnisse automatisch auf dem Dashboard an. Gleichzeitig wird das Chart dynamisch mit Pfeilen versehen, die jede Berührung (Kursreaktion in der Nähe des Niveaus) und jeden Ausbruch (entscheidende Bewegung über das Niveau) markieren. Diese visuellen Marker ermöglichen es dem Nutzer, jedes statistische Ereignis direkt mit der rohen Preisaktion zu vergleichen.
Wie die Ergebnisse zeigen, wird das analysierte Niveau als neutral eingestuft, was darauf hindeutet, dass der Preis über die getestete Anzahl von Balken eine ausgewogene Mischung aus Auf- und Abwärts-Interaktionen aufweist. In der Praxis bedeutet dies, dass sich das Niveau während des beobachteten Zeitraums nicht durchgängig als Unterstützungs- oder Widerstandszone erwiesen hat. Die Neutralität selbst kann aufschlussreich sein, da sie auf einen Gleichgewichtsbereich hindeutet, in dem sich Kauf- und Verkaufsdruck zuvor gegenseitig ausgeglichen haben.
Schlussfolgerung
Der Price Level Testing EA überbrückt die Lücke zwischen visueller Intuition und quantitativer Verifizierung und verwandelt die Kunst der Level-Erkennung in einen Prozess, der durch empirische Tests gestützt wird.
Wo sich Händler früher ausschließlich auf chartbasierte Eindrücke verlassen haben, bietet dieses Tool nun:
- ein Objektives Maß dafür, wie häufig ein Niveau als Unterstützung oder Widerstand fungiert hat,
- eine Konsistente Validierung von Berührungen und Ausbrüchen durch Pip-basierte Schwellenwerte, die Verzerrungen bei der Interpretation ausschließen
- empirische Wahrscheinlichkeiten, die das Marktverhalten beschreiben, wie es sich tatsächlich entwickelt hat
- und eine transparente visuelle Aufzeichnung, die es den Nutzern ermöglicht, genau zu sehen, wo und wann diese Ereignisse stattgefunden haben.
Durch das Sammeln greifbarer Statistiken – Berührungen von oben versus von unten, Anteil der bestätigten Ausbrüche und Trends – verwandelt der EA historische Kursbewegungen in verwertbare Erkenntnisse. Er ermöglicht es den Händlern, die Struktur zu quantifizieren, statt sie nur zu beobachten. Die wichtigste Erkenntnis ist einfach und doch tiefgreifend:
Historisches Verhalten enthält Informationen
Eine Ebene, die in der Vergangenheit immer wieder für Aufsehen gesorgt hat, hat ihre strukturelle Relevanz für die Marktorganisation bewiesen. Die Kenntnis dieser Zahlen, nicht nur visuell, ermöglicht eine intelligentere Entscheidungsfindung: mehr Vertrauen in die Handelsplanung, effizientere Backtests und die Möglichkeit, objektive Daten in automatisierte oder diskretionäre Rahmen zu integrieren. Über die unmittelbare Nutzung hinaus eröffnet das Instrument neue Forschungswege. Die Ergebnisse können über verschiedene Instrumente und Zeiträume hinweg aggregiert werden, um die Zuverlässigkeit der Ebenen und Änderungen der Marktordnung zu untersuchen oder sogar als Faktenmerkmale in Machine-Learning-Modelle einzugeben.
Letztendlich ist der Price Level Testing EA mehr als nur eine Bequemlichkeit; er stellt eine methodische Veränderung dar. Sie befähigt Händler, über anekdotische Überlegungen hinauszugehen und zu einer datengestützten Interpretation der Marktstruktur überzugehen – wo Hypothesen überprüfbar sind, Ergebnisse reproduzierbar sind und die Intuition durch Beweise unterstützt, nicht ersetzt wird.
Übersetzt aus dem Englischen von MetaQuotes Ltd.
Originalartikel: https://www.mql5.com/en/articles/19842
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.
Schnellhandel meistern: Überwindung der Umsetzungslähmung
Automatisieren von Handelsstrategien in MQL5 (Teil 35): Erstellung eines Blockausbruch-Handelssystems
MQL5-Assistenten-Techniken, die Sie kennen sollten (Teil 82): Verwendung von TRIX- und WPR-Mustern mit DQN-Verstärkungslernen
Entwicklung des Price Action Analysis Toolkit (Teil 43): Wahrscheinlichkeit und Ausbrüche von Kerzen
- 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.