English Русский 日本語
preview
Entwicklung eines Toolkits zur Price-Action-Analyse (Teil 61): Durchbrüche struktureller schräg verlaufender Trendlinien mit 3-Swing-Bestätigung

Entwicklung eines Toolkits zur Price-Action-Analyse (Teil 61): Durchbrüche struktureller schräg verlaufender Trendlinien mit 3-Swing-Bestätigung

MetaTrader 5Beispiele |
122 0
Christian Benjamin
Christian Benjamin

Inhalt


Einführung

Im vorangegangenen Artikel wurde ein strukturierter Ansatz zum Zeichnen schräger Trendlinien vorgestellt, der eine praktische Möglichkeit bietet, die Marktrichtung zu interpretieren und zu verstehen, wie sich der Kurs innerhalb einer sich entwickelnden Struktur verhält. Die Verankerung von Trendlinien an validierten Swing-Punkten verankert die Analyse direkt in der Marktstruktur, verbessert die Konsistenz und verhindert gleichzeitig eine willkürliche Platzierung der Linien.

Auf dieser Grundlage führt der vorliegende Artikel das Konzept weiter aus und stellt ein verbessertes Analysewerkzeug vor, das schräge Trendlinien in ein auf Ausbrüchen basierendes Signal-Framework erweitert. Trendlinienausbrüche gehören nach wie vor zu den wichtigsten und am häufigsten genutzten Strategien im Price-Action-Trading, da sie Momente aufzeigen, in denen sich der aufgestaute Druck in einer trendgerichteten Bewegung entlädt. Bei diesem Ansatz führt das System die Strukturanalyse für den Trader durch, identifiziert systematisch gültige Trendlinien und signalisiert nur aussagekräftige Durchbrüche – wodurch der Handel mit Trendlinien-Durchbrüchen klarer, disziplinierter und deutlich leichter umsetzbar wird.

Dieses Tool wurde mit der Programmiersprache MQL5 entwickelt. In den folgenden Abschnitten wird zunächst die Logik der Strategie erläutert und anschließend gezeigt, wie diese Struktur in eine MQL5-Implementierung umgesetzt wird. Anschließend werden die Testergebnisse und die dabei beobachteten Resultate betrachtet, bevor mit abschließenden Bemerkungen der Bericht endet.



Überblick über die Strategie

Trendlinienausbrüche gehören nach wie vor zu den ersten Konzepten, die im Price-Action-Trading vorgestellt werden, und bilden ein grundlegendes Instrument zum Verständnis der Marktrichtungstendenz, der Marktstruktur und der Momentum-Entwicklung. Im Laufe der Zeit entfernen sich viele Trader von diesen Grundsätzen, oft auf der Suche nach immer komplexeren Strategien, die Präzision versprechen, aber unnötiges Rauschen verursachen. Diese Umstellung führt häufig zu einer übermäßigen Analyse und einer uneinheitlichen Umsetzung. Anstatt die Sache noch komplizierter zu machen, rückt dieser Ansatz Trendlinienausbrüche wieder in den Mittelpunkt, wobei klare strukturelle Regeln und eine disziplinierte Umsetzung im Vordergrund stehen. Der Fokus liegt dabei auf der objektiven Kursentwicklung und nicht darauf, was als Nächstes erwartet wird.

Trendlinien als dynamische Unterstützungs- und Widerstandsniveaus

Trendlinien bilden Unterstützungs- und Widerstandsniveaus strukturell ab. Die meisten Trader sind mit horizontalen Unterstützungs- und Widerstandsniveaus vertraut, die in Kursbereichen eingezeichnet werden, in denen der Markt in der Vergangenheit wiederholt reagiert hat. Diese Niveaus sind besonders effektiv in Seitwärts- oder Konsolidierungsphasen, in denen der Kurs zwischen relativ festen Grenzen schwankt.

Abbildung 1: Horizontale Unterstützungs- und Widerstandsniveaus in einer Konsolidierungsphase

Abbildung 1 zeigt horizontale Unterstützungs- und Widerstandsniveaus in einem sich konsolidierenden Markt. Die eingekreisten Bereiche verdeutlichen wiederholte Kursreaktionen auf denselben Niveaus und bestätigen damit die technische Bedeutung dieser Zonen. In diesem Umfeld bleiben Unterstützung und Widerstand relativ stabil, da der Kurs eher seitwärts schwankt, anstatt sich in eine bestimmte Richtung zu bewegen. Die Konsolidierung ist jedoch nur ein vorübergehender Zustand. Wenn sich der Kurs zu einem Trend entwickelt, bildet er in einem Aufwärtstrend höhere Hochs und höhere Tiefs bzw. in einem Abwärtstrend niedrigere Hochs und niedrigere Tiefs. Unter diesen Umständen sind Unterstützung und Widerstand nicht mehr feststehend; sie passen sich dem Richtungsdruck an und entwickeln sich mit dem Kurs weiter.

Schräg verlaufende Trendlinien geben dieses dynamische Verhalten wieder, indem sie wichtige Swing-Punkte innerhalb des Trends miteinander verbinden. In einem Aufwärtstrend verbindet eine schräg verlaufende Unterstützungslinie steigende Swing-Tiefs und markiert damit Bereiche, in denen regelmäßig Kaufdruck auf den Markt ausgeübt wird. In einem Abwärtstrend verbindet eine schräg verlaufende Widerstandslinie fallende Swing-Hochs und kennzeichnet so Bereiche, in denen wiederholt Verkaufsdruck auftritt. Diese Trendlinien dienen nicht nur dazu, Kursniveaus zu markieren, sondern vermitteln auch den Winkel, die Stärke und die Beständigkeit des Trends und bieten so einen klareren Überblick darüber, wie sich der Kurs im Laufe der Zeit entwickelt, anstatt nur auf einzelne horizontale Zonen zu reagieren.

Veranschaulichung eines Ausbruchs aus einer schrägen Trendlinie

Abbildung 2: Bullischer Ausbruch über eine schräge Trendlinie

Abbildung 2 zeigt einen bullischen Ausbruch über eine schräge Trendlinie, der sich aus validierten Swing-Punkten ableitet. Die eingekreisten Bereiche markieren die Swings, anhand derer eine abfallende, schräge Trendlinie gezogen wurde, die innerhalb des vorherrschenden Abwärtstrends als dynamischer Widerstand fungiert. Da der Kurs weiterhin mit der Linie interagiert, bestätigen wiederholte Reaktionen deren Relevanz. Der Ausbruch wird erst bestätigt, wenn der Kurs die schräge Trendlinie klar nach oben kreuzt bzw. durchbricht, was darauf hindeutet, dass der Verkaufsdruck nachgelassen hat und sich die Richtung der Kursentwicklung ändert.

Dieses Beispiel verdeutlicht, wie die Swing-Validierung, die Erstellung von Trendlinien und die Bestätigung von Ausbrüchen zusammenwirken, um innerhalb der Strategie ein klares, regelbasiertes Signal zu erzeugen. 

Die Bedeutung von Trendlinienausbrüchen

Schräg verlaufende Trendlinien stellen sich entwickelnde Unterstützungs- und Widerstandsniveaus in einem Trendmarkt dar. Wenn der Kurs eine fest etablierte Trendlinie deutlich durchbricht, ist dies ein Zeichen dafür, dass der Richtungsdruck, der den Trend aufrechterhält, nachgelassen hat. Solche Durchbrüche gehen oft einer bedeutenden Veränderung des Marktverhaltens voraus, sei es durch eine Trendwende, eine tiefere Korrektur oder eine Beschleunigung in die entgegengesetzte Richtung.

In der Praxis liegt die Schwäche des Handels mit Trendlinienausbrüchen nicht im Konzept selbst, sondern darin, wie diese Ausbrüche erkannt werden. Viele fehlgeschlagene Setups gehen auf Trendlinien zurück, denen eine strukturelle Begründung fehlt, oder darauf, dass kurzzeitiges Eindringen des Kurses über die Linie als gültige Ausbrüche interpretiert werden. Diese verfrühten Signale verursachen Rauschen, führen zu einer schlechten Zeitsteuerung und beeinträchtigen die Konsistenz. Um dem entgegenzuwirken, sieht die Strategie strenge Regeln für die Erstellung und Bestätigung vor. Trendlinien müssen sich aus einer klaren Swing-Struktur ableiten lassen, und Ausbrüche werden nur dann erkannt, wenn der Kurs die Linie entscheidend von einer Seite zur anderen durchbricht, anstatt sie nur kurz zu berühren oder zu durchstoßen.

Um die Zuverlässigkeit weiter zu erhöhen, werden die Trendlinien anhand von drei Swing-Punkten validiert. Zwar reichen zwei Punkte aus, um eine Gerade geometrisch zu definieren, doch bieten sie keinen Beweis dafür, dass der Kurs diese Gerade einhält. Der dritte Swing liefert diese Bestätigung und zeigt eine wiederholte Interaktion mit derselben schrägen Ebene. Diese Anforderung filtert zufällige Übereinstimmungen heraus und stellt sicher, dass die Ausbruchsanalyse nur für Trendlinien durchgeführt wird, die eine echte strukturelle Relevanz aufweisen.

Abbildung 3: Bestätigung der Trendlinie anhand von drei Swings

Das Diagramm veranschaulicht, wie ein dritter Swing die Relevanz der Trendlinie bestätigt, indem er die wiederholte Interaktion der Kurse entlang derselben schrägen Struktur aufzeigt.

Strategielogik und Signalerzeugung

In diesem Tool werden Trendlinien ausschließlich anhand validierter Swing-Punkte erstellt, wodurch sichergestellt wird, dass jede Linie das tatsächliche Marktverhalten widerspiegelt. Eine zusätzliche Bestätigung wird dadurch erreicht, dass mehrere Swing-Interaktionen mit derselben Trendlinie verlangt werden, wodurch deren Relevanz untermauert wird, bevor sie zur Signalerzeugung herangezogen wird.

Sobald eine gültige schräge Trendlinie festgelegt wurde:

  • Kaufsignal: Der Kurs durchbricht eine bestätigte, schräg verlaufende Widerstandslinie deutlich nach oben
  • Verkaufssignal: Der Kurs durchbricht eine bestätigte, schräg verlaufende Unterstützungslinie deutlich nach unten

Ausbrüche werden anhand einer Logik zur Bestätigung eines Kurskreuzens und nicht anhand einfacher Berührungen bestätigt, was dazu beiträgt, Störsignale herauszufiltern und Fehlsignale zu reduzieren. Da die Erkennung von Swings, die Erstellung von Trendlinien und die Validierung von Ausbrüchen systematisch erfolgen, bleibt die Analyse konsistent und frei von willkürlicher Linienführung, während sie gleichzeitig vollständig mit den Prinzipien der reinen Price Action im Einklang steht.

Im folgenden Abschnitt wird gezeigt, wie diese Struktur in MQL5 umgesetzt wird, wobei die analytischen Regeln in Code übersetzt werden, der die Erkennung von Swings, die Validierung von Trendlinien und die Bestätigung von Ausbrüchen in einem einheitlichen Arbeitsablauf verwaltet.



MQL5-Implementierung

In diesem Abschnitt wird erläutert, wie die Strategielogik in eine MQL5-Implementierung umgesetzt wird. Der Code ist in modulare Komponenten gegliedert, die die Swing-Erkennung, die Überprüfung der Trendlinie und die Bestätigung von Ausbrüchen übernehmen, wodurch die Logik übersichtlich und erweiterbar bleibt. Befolgen Sie die folgenden Implementierungsschritte, um zu sehen, wie alles zusammenpasst.

Konfiguration der Eingabeparameter

Der EA beginnt mit der Definition einer umfassenden Reihe von Eingabeparametern, mit denen Sie sein Verhalten an Ihre Handelspräferenzen anpassen können. Dazu gehören Optionen zur Swing-Erkennung, wie beispielsweise die Anzahl der zu berücksichtigenden Bars (SwingLookback) und die minimale Swing-Größe (MinSwingSize), die auf Basis des ATR oder eines festen Werts festgelegt werden können. Sie können wählen, ob Sie die ATR-Filterung (UseATRFiltering) für die dynamische Swing-Größenbestimmung verwenden möchten, und festlegen, ob Swing-Punkte und Beschriftungen im Chart angezeigt werden sollen (ShowSwingPoints, ShowSwingLabels). Mit den Trendlinien-Einstellungen können Sie festlegen, ob Widerstands- und Unterstützungslinien gezeichnet werden sollen (DrawResistanceLine, DrawSupportLine), ob diese Linien bis zum rechten Rand des Charts verlängert werden sollen (ExtendToRightEdge) und wie viele Berührungspunkte mindestens erforderlich sind, damit eine Linie als signifikant gilt (MinTouchPointsRequired).

input int    SwingLookback = 5;
input double MinSwingSize = 0.0003;
input bool   UseATRFiltering = true;
input bool   ShowSwingPoints = true;
input bool   ShowSwingLabels = false;

input bool   DrawResistanceLine = true;
input bool   DrawSupportLine = true;
input bool   ExtendToRightEdge = true;
input int    MinTouchPointsRequired = 3;

input double ThirdSwingToleranceATR = 0.15;
input bool   RequireThirdSwingAfterAnchor2 = true;

input bool   EnableBreakoutSignals = true;
input bool   BreakoutUseClose = true;
input int    BreakoutBufferPoints = 5;
input bool   AlertOnBreakout = false;
input bool   PermanentArrows = true;

input color  BullArrowColor = clrLimeGreen;
input color  BearArrowColor = clrRed;

Zur Validierung der Trendlinien mit einem dritten Swing-Punkt gehören zu den Parametern die ATR-basierte Toleranz (ThirdSwingToleranceATR) sowie die Angabe, ob der dritte Swing nach dem zweiten erfolgen muss (RequireThirdSwingAfterAnchor2), um die Zuverlässigkeit zu erhöhen. Zu den Optionen für die Breakout-Erkennung gehören das Aktivieren oder Deaktivieren von Signalen (EnableBreakoutSignals), die Wahl, ob die Erkennung auf Schlusskursen oder Kerzen-Schwänzen basieren soll (BreakoutUseClose), die Festlegung eines Puffers in Punkten jenseits der Trendlinie zur Bestätigung (BreakoutBufferPoints), das Ein- und Ausschalten von Warnmeldungen (AlertOnBreakout) sowie die Entscheidung, ob permanente visuelle Pfeile im Chart angezeigt werden sollen (PermanentArrows). Darüber hinaus können Sie das Erscheinungsbild des Charts mithilfe von Optionen zur visuellen Anpassung wie Farben, Linienbreite, Stil und Pfeilgröße ganz nach Ihren Wünschen gestalten.

Globale Variablen und Datenstrukturen

Um diese Logik zu unterstützen, verwaltet die Implementierung eine kleine Menge globaler Variablen und Datenstrukturen. Ein Indikator-Handle für ATR (atrHandle) wird initialisiert, ebenso wie eine Variable (currentATR) zur Speicherung des aktuellen ATR-Werts. Es werden Arrays angelegt, um Swing-Punkte (significantHighs, significantLows) und Breakout-Informationen (breakoutsArray) zu speichern.

int    atrHandle = INVALID_HANDLE;
double currentATR = 0.0001;

struct SwingPoint
{
   datetime          time;
   double            price;
   int               barIndex;
   double            size;
   bool              isHigh;
   int               order;
};

struct BreakoutInfo
{
   datetime          time;
   double            price;
   bool              isBullish;
   string            lineType;  // "RES" or "SUP"
   int               touchCount;
};

Es werden zwei Strukturen definiert: SwingPoint, das Angaben wie Zeit, Kurs, Bar-Index, Größe, und ob es sich um ein Hoch oder Tief handelt, sowie die Reihenfolge enthält, und BreakoutInfo, das für jeden bestätigten Ausbruch den Zeitstempel, den Kurs, die Richtung des Ausbruchs, den Linientyp und die Anzahl der Berührungen erfasst.

SwingPoint significantHighs[10], significantLows[10];
BreakoutInfo breakoutsArray[];
int breakoutsCount = 0;

Diese Strukturen tragen dazu bei, Daten logisch zu ordnen, wodurch sich Swing-Punkte leichter verarbeiten, Trendlinien besser überprüfen und Ausbruchsereignisse systematisch erfassen lassen.

Hilfsfunktionen

Hilfsfunktionen bieten wichtige unterstützende Operationen für die Kernanalyse. DeleteObjectsByPrefix durchsucht das Chart und entfernt alle Objekte mit einem bestimmten Präfix. So können veraltete Trendlinien und Punkte vor dem Zeichnen neuer Elemente bereinigt werden. BreakoutBufferPrice und ThirdSwingTolerancePrice berechnen Pufferzonen auf Basis der Punktedistanz und des ATR-Werts, die zur Bestätigung von Ausbrüchen und zur Ermittlung der Nähe von Swing-Punkten zu Trendlinien verwendet werden.

void DeleteObjectsByPrefix(const string prefix)
{
   int total = ObjectsTotal(0, -1, -1);
   for(int i = total - 1; i >= 0; i--)
   {
      string name = ObjectName(0, i, -1, -1);
      if(StringLen(name) >= StringLen(prefix) && StringSubstr(name, 0, StringLen(prefix)) == prefix)
         ObjectDelete(0, name);
   }
}

LinePriceAtTime berechnet den interpolierten Preis einer Trendlinie zu einem bestimmten Zeitpunkt, was für die Visualisierung und Validierung geneigter Linien von grundlegender Bedeutung ist.

double LinePriceAtTime(const SwingPoint &a, const SwingPoint &b, datetime t)
{
   double dt = (double)(b.time - a.time);
   if(dt == 0.0)
      return a.price;
   double slope = (b.price - a.price) / dt;
   return a.price + slope * (double)(t - a.time);
}

Die Funktion ThirdSwingConfirms prüft, ob ein dritter Swing-Punkt (Hoch oder Tief) innerhalb der Toleranzzone der Trendlinie liegt, und bestätigt so deren Gültigkeit. DrawPermanentArrow erstellt an Ausbruchspunkten eine visuelle Pfeilmarkierung, die anzeigt, ob ein bullischer oder ein bärischer Ausbruch stattgefunden hat, und speichert dieses Ereignis im breakoutsArray. RedrawPermanentArrows durchläuft die gespeicherten Ausbruchdaten, um die Pfeile neu zu zeichnen, und gewährleistet so die visuelle Beständigkeit. Die Funktionen OnInit, OnDeinit und OnTick übernehmen die Initialisierung, die Bereinigung und die Aktualisierung, beispielsweise die Aktualisierung von ATR-Werten, das Löschen alter Objekte und die Koordination von Analyseroutinen für jede neue Kerze.

bool ThirdSwingConfirms(const SwingPoint &a, const SwingPoint &b, const SwingPoint &c)
{
   double lp = LinePriceAtTime(a, b, c.time);
   return (MathAbs(c.price - lp) <= ThirdSwingTolerancePrice());
}

Swing-Punkte finden

Die Funktion FindSignificantSwings durchsucht systematisch die letzten Bars, um potenzielle Swing-Hochs und -Tiefs zu identifizieren. Sie durchläuft die Bars, beginnend mit dem SwingLookback-Offset, um Probleme an den Rändern zu vermeiden. Für jede Bar wird geprüft, ob das Hoch größer ist als das benachbarter Bars, um Swing-Hochs zu identifizieren, und analog dazu, ob das Tief kleiner ist als das der benachbarten Bars, um Swing-Tiefs zu identifizieren. Es berechnet die Swing-Breite (die Differenz zwischen Hoch und Tief) und vergleicht sie mit dem Schwellenwert für die Mindestbreite, der entweder auf der ATR basiert oder fest vorgegeben ist. Wenn ein Swing-Punkt die Kriterien erfüllt, werden seine Details – darunter Zeitpunkt, Kurs, Bar-Index, Größe und Typ – im entsprechenden Array gespeichert. Dieser Vorgang stellt sicher, dass bei der Zeichnung der Trendlinie nur signifikante Swings berücksichtigt werden, während geringfügige Swings herausgefiltert werden.

void FindSignificantSwings(const MqlRates &rates[], int totalBars,
                           SwingPoint &highs[], int &highCount,
                           SwingPoint &lows[], int &lowCount)
{
   highCount = 0;
   lowCount  = 0;

   double minSize = UseATRFiltering ? (currentATR * 0.8) : MinSwingSize;

   for(int i = SwingLookback; i < totalBars - SwingLookback; i++)
   {
      // Swing high detection
      bool isSwingHigh = true;
      double currentHigh = rates[i].high;
      for(int j = 1; j <= SwingLookback; j++)
      {
         if(rates[i-j].high >= currentHigh || rates[i+j].high >= currentHigh)
         {
            isSwingHigh = false;
            break;
         }
      }
      if(isSwingHigh)
      {
         // Save swing high info
         ...
      }

      // Swing low detection
      bool isSwingLow = true;
      double currentLow = rates[i].low;
      for(int j = 1; j <= SwingLookback; j++)
      {
         if(rates[i-j].low <= currentLow || rates[i+j].low <= currentLow)
         {
            isSwingLow = false;
            break;
         }
      }
      if(isSwingLow)
      {
         // Save swing low info
         ...
      }
   }
}

Swing-Auftrag zuweisen

Sobald Swing-Punkte erkannt wurden, sortiert die Funktion AssignSwingOrder diese anhand ihrer Zeitstempel chronologisch vom ältesten zum neuesten. Diese Reihenfolge ist entscheidend, da Trendlinien nacheinander zwischen bestimmten Swing-Punkten gezogen werden. Nach der Sortierung erhält jeder Swing-Punkt eine Laufnummer, beginnend mit 1 für den ältesten. Diese numerische Reihenfolge trägt dazu bei, bei der Auswahl von Punkten für die Erstellung und Validierung von Trendlinien Konsistenz zu gewährleisten, insbesondere bei der Analyse mehrerer Swings im Zeitverlauf.

void AssignSwingOrder(SwingPoint &swings[], int count)
{
   if(count <= 0)
      return;
   // Sorting by time ascending
   for(int i = 0; i < count-1; i++)
   {
      for(int j = i+1; j < count; j++)
      {
         if(swings[i].time > swings[j].time)
         {
            SwingPoint tmp = swings[i];
            swings[i] = swings[j];
            swings[j] = tmp;
         }
      }
   }
   for(int i = 0; i < count; i++)
      swings[i].order = i + 1;
}

Swing-Punkte einzeichnen

Die Funktion DrawSwingPoints stellt die identifizierten Swing-Hochs und -Tiefs im Chart dar. Für jedes Hoch oder Tief erstellt das Programm ein Pfeilobjekt – OBJ_ARROW_THUMB_DOWN für Hochs und OBJ_ARROW_THUMB_UP für Tiefs – und platziert es an der entsprechenden Zeit- und Kursmarke. Visuelle Eigenschaften wie Farbe, Breite und Ankerpunkt werden festgelegt, um die Übersichtlichkeit zu verbessern. Wenn diese Option aktiviert ist, werden Kennzeichnungen wie H1 und L1 in der Nähe der Swing-Punkte hinzugefügt, wobei sie um den ATR-Wert leicht versetzt sind, um eine Überlappung mit den Kerzen zu vermeiden. Diese visuellen Markierungen helfen Tradern dabei, signifikante Swings leicht zu erkennen und die Struktur der Price Action zu verstehen.

void DrawSwingPoints(const SwingPoint &highs[], int highCount,
                     const SwingPoint &lows[], int lowCount)
{
   for(int i = 0; i < highCount; i++)
   {
      string pointName = TL_PREFIX + "H_" + IntegerToString(highs[i].order);
      if(ObjectFind(0, pointName) < 0)
         ObjectCreate(0, pointName, OBJ_ARROW_THUMB_DOWN, 0, highs[i].time, highs[i].price);
      else
         ObjectMove(0, pointName, 0, highs[i].time, highs[i].price);
      ObjectSetInteger(0, pointName, OBJPROP_COLOR,  SwingHighColor);
      ObjectSetInteger(0, pointName, OBJPROP_WIDTH,  2);
      ObjectSetInteger(0, pointName, OBJPROP_ANCHOR, AnchorPoint);
      ObjectSetInteger(0, pointName, OBJPROP_BACK,   false);
      // Labels if enabled
      if(ShowSwingLabels)
      {
         ...
      }
   }
   // Similar for lows
}

Die besten Widerstands- und Unterstützungslinien finden

Die Funktionen FindBestResistanceLine3 und FindBestSupportLine3 analysieren die zuvor ermittelten Swing-Punkte, um die aussagekräftigsten Widerstands- und Unterstützungstrendlinien auszuwählen. Sie untersuchen systematisch Paare von Swing-Punkten und prüfen dabei auf absteigende Widerstandsmuster (ein älteres Hoch liegt über einem neueren Hoch) oder aufsteigende Unterstützungsmuster (ein älteres Tief liegt unter einem neueren Tief). Für jedes Paar wird die Steigung der potenziellen Trendlinie berechnet und die Anzahl der Kerzen gezählt, die die Linie innerhalb eines Abweichungsschwellenwerts schneiden. Die Funktionen überprüfen zudem mithilfe der Funktion ThirdSwingConfirms, ob ein dritter Swing-Punkt vorliegt, der die Gültigkeit der Trendlinie bestätigt. Jede potenzielle Linie wird anhand der Anzahl der Berührungen, der Abweichung, der Aktualität (wie aktuell die Linie ist) und der Frage, ob sie durch einen dritten Swing bestätigt wird, bewertet. Die Linien mit den höchsten Werten werden als die aussagekräftigsten ausgewählt und stellen im aktuellen Chart-Kontext die stärksten Widerstands- bzw. Unterstützungsniveaus dar.

void FindBestResistanceLine3(const SwingPoint &highs[], int highCount,
                             const MqlRates &rates[], int totalBars,
                             SwingPoint &bestAnchor1, SwingPoint &bestAnchor2, SwingPoint &bestAnchor3,
                             int &bestTouchCount, double &bestScore)
{
   ...
   for(int a = 0; a < highCount-1; a++)
   {
      for(int b = a+1; b < highCount; b++)
      {
         if(!(pts[a].price > pts[b].price))
            continue;
         ...
         // Count touches and confirm third swing
         ...
         // Calculate score and update best line
      }
   }
}

Trendlinien zeichnen

Die Funktion DrawTrendline3 erstellt oder aktualisiert Trendlinienobjekte, die die ausgewählten Swing-Punkte miteinander verbinden. Es weist der Trendlinie je nachdem, ob es sich um einen Widerstand oder eine Unterstützung handelt, einen eindeutigen Namen zu und passt ihre Darstellungseigenschaften – Farbe, Breite, Stil und Verlängerung – entsprechend den Benutzereinstellungen an. Die Trendlinie wird zwischen den ersten beiden Ankerpunkten gezogen, und in der Nähe des dritten Swing-Punkts wird eine Beschriftung platziert, die die Anzahl der zur Validierung verwendeten Swing-Punkte angibt; diese ist zur besseren Sichtbarkeit leicht vertikal versetzt. Diese visuelle Darstellung hilft Tradern dabei, die schräg verlaufenden Unterstützungs- und Widerstandsniveaus zu erkennen, die sich über mehrere Swings hinweg bestätigt haben, und liefert damit den Kontext für potenzielle Ausbrüche.

void DrawTrendline3(const SwingPoint &anchor1, const SwingPoint &anchor2, const SwingPoint &anchor3,
                    bool isResistance, int touchCount)
{
   string lineName  = TL_PREFIX + (isResistance ? "RESISTANCE" : "SUPPORT");
   string labelName = TL_PREFIX + (isResistance ? "RES_LABEL"  : "SUP_LABEL");

   if(ObjectFind(0, lineName) < 0)
   {
      ObjectCreate(0, lineName, OBJ_TREND, 0,
                   anchor1.time, anchor1.price,
                   anchor2.time, anchor2.price);
   }
   else
   {
      ObjectMove(0, lineName, 0, anchor1.time, anchor1.price);
      ObjectMove(0, lineName, 1, anchor2.time, anchor2.price);
   }

   ObjectSetInteger(0, lineName, OBJPROP_COLOR,     lineColor);
   ObjectSetInteger(0, lineName, OBJPROP_WIDTH,     LineWidth);
   ObjectSetInteger(0, lineName, OBJPROP_STYLE,     LineStyle);
   ObjectSetInteger(0, lineName, OBJPROP_RAY_RIGHT, ExtendToRightEdge);
   ObjectSetInteger(0, lineName, OBJPROP_BACK,      false);

   // Label near 3rd swing
   ...
}

Breakout-Prüfung (Kreuzlogik für schräge Linien)

Die Funktion CheckBreakouts überwacht die jüngsten Kerzen, um zu erkennen, wann der Kurs die Widerstands- oder Unterstützungstrendlinien nach oben bzw. unten durchbricht, was auf einen möglichen Ausbruch hindeutet. Das System berechnet den erwarteten Trendlinienkurs anhand der letzten beiden geschlossenen Kerzen und vergleicht diesen mit den tatsächlichen Schluss- oder Dochtkursen, wobei eine Pufferzone berücksichtigt wird, um Fehlsignale zu vermeiden. Wenn der Kurs die Widerstandslinie nach oben durchbricht (bullischer Ausbruch) oder die Unterstützungslinie nach unten durchbricht (bärischer Ausbruch) und in diesem Kerzenchart zuvor noch kein Ausbruch verzeichnet wurde, erfasst die Funktion das Ereignis, zeichnet einen dauerhaften Pfeil ein und sendet optional eine Warnmeldung. Das System stellt sicher, dass pro Seite und pro Bar nur ein Ausbruch erkannt wird, indem es Zeitstempel verfolgt und so verhindert, dass für dasselbe Ereignis mehrere Signale auftreten.

void CheckBreakouts(const MqlRates &rates[],
                    bool haveRes, const SwingPoint &resA, const SwingPoint &resB, int resTouches,
                    bool haveSup, const SwingPoint &supA, const SwingPoint &supB, int supTouches)
{
   ...
   if(haveRes)
   {
      double line1 = LinePriceAtTime(resA, resB, t1);
      double line2 = LinePriceAtTime(resA, resB, t2);
      double p1 = BreakoutUseClose ? rates[1].close : rates[1].high;
      double p2 = BreakoutUseClose ? rates[2].close : rates[2].high;
      bool crossedUp = (p2 <= line2 + buf) && (p1 > line1 + buf);
      if(crossedUp && t1 != g_lastBuyBarTime)
      {
         g_lastBuyBarTime = t1;
         // Draw arrow and alert
      }
   }
   // Similar for support line
}

Verarbeitung von Chart-Ereignissen und Hauptschleife

Die Funktion OnChartEvent dient als Platzhalter für eine manuelle Steuerung oder die Auslösung über Tastenkombinationen; falls erforderlich, bleibt sie in dieser Implementierung jedoch leer. Die primäre Ausführung erfolgt in der Funktion OnTick, die bei jedem Kurs-Tick ausgeführt wird. Zunächst wird durch den Vergleich der Zeitstempel der Bars geprüft, ob sich eine neue Kerze gebildet hat. Ist dies der Fall, wird der ATR-Wert aktualisiert, werden frühere Trendlinienobjekte gelöscht und die Hauptanalyseabfolge über DrawMostSignificantTrendlines gestartet. Dieser Ablauf umfasst das Ermitteln von Swing-Punkten, das Auswählen der besten Widerstands- und Unterstützungslinien, das Zeichnen von Trendlinien sowie das Überprüfen auf Ausbrüche. Bei bestätigten Ausbrüchen werden die permanenten Pfeile neu gezeichnet, um sicherzustellen, dass das Chart die aktuelle technische Situation widerspiegelt. Dieser kontinuierliche Prozess ermöglicht es dem EA, sich dynamisch an veränderte Marktbedingungen anzupassen und zeitnahe Signale zu liefern.

void OnTick()
{
   static datetime lastBarTime = 0;
   datetime currentBarTime = iTime(_Symbol, _Period, 0);
   if(currentBarTime == lastBarTime && lastBarTime != 0)
      return;
   lastBarTime = currentBarTime;

   if(UseATRFiltering && atrHandle != INVALID_HANDLE)
   {
      double atrBuffer[1];
      if(CopyBuffer(atrHandle, 0, 0, 1, atrBuffer) > 0)
         currentATR = atrBuffer[0];
   }

   DeleteObjectsByPrefix(TL_PREFIX);
   DrawMostSignificantTrendlines();

   RedrawPermanentArrows();
}

Nach der Implementierung wird der Code kompiliert und validiert, um vor dem Testen sicherzustellen, dass der Build fehlerfrei ist. Alle Compiler-Meldungen werden als strukturelles Feedback gewertet und dienen als Leitfaden für Korrekturen an der Syntax, den Deklarationen oder der Funktionsverwendung, bis die Implementierung fehlerfrei kompiliert werden kann und zur Ausführung in der MetaTrader 5-Umgebung bereit ist.



Tests und Ergebnisse

Nachdem das Tool erfolgreich kompiliert wurde, folgt als nächster Schritt das Testen. Dies lässt sich an einem Live-Chart durchführen; es wird jedoch dringend empfohlen, zunächst mit einem Demokonto statt mit einem Echtgeldkonto zu beginnen. Durch das Testen in einer Demo-Umgebung lässt sich die Strategie unter realen Marktbedingungen ohne unnötiges Risiko beobachten.

Neben dem Testen anhand von Live-Charts lässt sich das Tool auch mit dem MetaTrader 5-Strategietester bewerten. Diese Form der historischen Überprüfung, die gemeinhin als Backtesting bezeichnet wird, ermöglicht es, zu beurteilen, wie sich die Strategie unter den Marktbedingungen der Vergangenheit verhalten hätte. Das Backtesting hilft zudem dabei, Stärken, Schwächen und Bereiche zu identifizieren, in denen möglicherweise Parameteranpassungen erforderlich sind, zumal verschiedene Wertpapiere oft ein unterschiedliches Kursverhalten aufweisen.

Eine weitere Verfeinerung lässt sich durch Optimierung in MetaTrader 5 erreichen, wo die Eingabeparameter systematisch getestet werden, um die Leistung zu verbessern. Dieser Vorgang kann sehr rechenintensiv sein und lässt sich in der Regel am besten mit einem leistungsstarken Computer durchführen.

In diesem Abschnitt stelle ich die während der Testphase beobachteten Ergebnisse vor und gehe dabei insbesondere darauf ein, wie sich das Tool unter verschiedenen Bedingungen bewährt hat und welche Erkenntnisse aus den Ergebnissen gewonnen wurden.

Erstes Ergebnis

Abbildung 4: Backtest-Beispiel für EURUSD (H1)

Abbildung 4 zeigt ein Backtest-Beispiel, das im MetaTrader 5-Strategietester im visuellen Modus erfasst wurde. In diesem Szenario ermittelt das Tool eine schräg verlaufende Widerstandstrendlinie (rot dargestellt) und zeichnet diese, indem es drei validierte Swing-Punkte miteinander verbindet. Mit dem Anstieg des Kurses kommt es zu einem deutlichen Durchbruch über die Trendlinie. Der Ausbruch wird vom Tool bestätigt und mit einem grünen Aufwärtspfeil markiert, was einen bullischen Ausbruch signalisiert. Signale werden erst nach einem deutlichen Kursdurchbruch generiert und nicht als Reaktion auf geringfügige Berührungen oder vorübergehende Kursabweichungen. Dieses Beispiel veranschaulicht, wie sich das Tool bei historischen Tests verhält: Trendlinien werden aus validierten Swing-Strukturen abgeleitet, und Ausbruchsignale werden nur dann generiert, wenn aussagekräftige Ausbruchsbedingungen erfüllt sind, was zu klaren und disziplinierten Signalen führt, die der Logik der Price Action entsprechen.

Zweites Ergebnis

Das folgende Chart zeigt einen zweiten Test, der für Gold (XAUUSD) im H1-Zeitrahmen durchgeführt und im Rahmen historischer Tests mit dem MetaTrader 5-Strategietester im visuellen Modus erfasst wurde. Dieses Beispiel veranschaulicht, wie das Tool in einem volatileren Marktumfeld funktioniert, in dem die Kursbewegungen größer sind und sich die Bedingungen schneller ändern. In diesem Test ermittelt das Tool automatisch sowohl schräg verlaufende Widerstands- als auch schräg verlaufende Unterstützungstrendlinien auf der Grundlage validierter Swing-Punkte.

Die rote, abfallende Trendlinie stellt einen Widerstand dar, der sich aus drei bestätigten Swing-Hochs ergibt, während die blaue, ansteigende Trendlinie eine Unterstützung darstellt, die sich aus mehreren Swing-Tiefs ergibt. Im Verlauf der Kursentwicklung bleibt die Widerstands-Trendlinie intakt, bis es zu einer entscheidenden Interaktion kommt. Anstatt auf kurzzeitige Verstöße oder durch Volatilität bedingte Ausschläge zu reagieren, wartet das Tool auf ein eindeutiges Überschreiten des Kurses im Verhältnis zur schrägen Trendlinie, bevor es eine Ausbruchbedingung bewertet. Diese Zurückhaltung ist besonders wichtig bei Anlageklassen wie Gold, bei denen es aufgrund der erhöhten Volatilität häufig zu falschen Ausbrüchen kommt.

Abbildung 5: Backtest-Beispiel für XAUUSD (H1)

Eine wichtige Erkenntnis aus diesem Test ist, wie sich das Tool ohne manuelles Eingreifen an das Preisverhalten von Gold anpasst. Die Erkennung von Swings, die Erstellung von Trendlinien und die Validierung bleiben trotz der größeren Kursspannen und der stärkeren Kursbewegungen unverändert. Dies bestätigt, dass die Strategie nicht auf bestimmte Wertpapiere ausgerichtet ist, sondern auf einem konsistenten Kursverhalten basiert. Insgesamt bestätigt dieser Test die Robustheit des Tools unter verschiedenen Marktbedingungen. Die gleichen strukturellen Regeln, die für Devisenpaare gelten, treffen auch auf Rohstoffe wie Gold zu, sodass Trendlinienausbrüche bei historischen Tests objektiv und konsistent identifiziert werden können. Wie bei allen Price-Action-Tools hängt die Performance von den Marktbedingungen, der Wahl des Zeitrahmens und der disziplinierten Interpretation der Signale ab.



Schlussfolgerung

In diesem Artikel wurde ein strukturorientierter Ansatz für Ausbrüche aus schrägen Trendlinien skizziert und aufgezeigt, wie sich zentrale Prinzipien der Price Action in ein diszipliniertes MQL5-Analysewerkzeug umsetzen lassen. Durch die Durchsetzung klarer struktureller Regeln beseitigt das Tool einen Großteil der Unklarheiten, die die Analyse von Trendlinienausbrüchen häufig beeinträchtigen.

Die Testbeispiele bestätigen, dass sich diese strukturorientierte Logik über verschiedene Instrumente und Marktbedingungen hinweg konsistent verhält. Anstatt die Regeln an den Markt anzupassen, orientiert sich die Analyse weiterhin an der Swing-Struktur und dem Kursverhalten, sodass sich Ausbruchsignale auf natürliche Weise aus dem Chart ergeben.

In diesem Rahmen lassen sich Durchbrüche von Trendlinien leichter erkennen, bewerten und in einen disziplinierten Arbeitsablauf zur Kursanalyse integrieren – ohne sich auf subjektive Interpretationen oder willkürliche Linienplatzierungen verlassen zu müssen.

Dieses Tool ist ausschließlich für Analysezwecke und zur Bestätigung von Signalen vorgesehen, nicht für den automatisierten Handel. Es wird dringend empfohlen, das System anhand von historischen Backtests und Live-Demokonten gründlich zu testen, bevor Sie es mit echtem Kapital einsetzen. In Verbindung mit einem bestehenden Handelsansatz kann das Tool als zusätzliche Bestätigungsebene dienen und dazu beitragen, eine disziplinierte Entscheidungsfindung zu stärken, anstatt sie zu ersetzen.

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

Beigefügte Dateien |
Einführung in MQL5 (Teil 39): Leitfaden für Anfänger zur Dateiverwaltung in MQL5 (I) Einführung in MQL5 (Teil 39): Leitfaden für Anfänger zur Dateiverwaltung in MQL5 (I)
Dieser Artikel bietet anhand eines praktischen, projektbasierten Arbeitsablaufs eine Einführung in die Dateiverwaltung in MQL5. Sie verwenden „FileSelectDialog“, um eine CSV-Datei auszuwählen oder zu erstellen, öffnen diese mit „FileOpen“ und schreiben strukturierte Kopfzeilen mit Kontoinformationen wie Kontoname, Kontostand, Kontologin, Datumsbereich und Zeitpunkt der letzten Aktualisierung. Das Ergebnis ist eine klare Grundlage für ein wiederverwendbares Handelsjournal und sichere Dateivorgänge in MetaTrader 5.
Larry Williams’ Marktgeheimnisse (Teil 11): Erkennen von „Smash-Day“-Umkehrungen mit einem Indikator Larry Williams’ Marktgeheimnisse (Teil 11): Erkennen von „Smash-Day“-Umkehrungen mit einem Indikator
Wir setzen die „Smash-Day“-Umkehrregeln von Larry Williams in einen praktischen MQL5-Indikator um, der bestätigte Setups mit Pfeilen markiert. Schritt für Schritt werden in diesem Text die Pufferverknüpfung, Diagrammeigenschaften, die Auswertung historischer Daten sowie Echtzeit-Aktualisierungen innerhalb von OnCalculate erläutert. Dank anpassbarer Lookback-Parameter und einer übersichtlichen Chart-Darstellung können Sie gültige Trendumkehrungen schnell erkennen, während die endgültigen Handelsentscheidungen weiterhin nach eigenem Ermessen und kontextbezogen getroffen werden.
Liquidity-Raids optimieren: Den Unterschied zwischen Liquidity-Raids und Marktstrukturverschiebungen verstehen Liquidity-Raids optimieren: Den Unterschied zwischen Liquidity-Raids und Marktstrukturverschiebungen verstehen
In diesem Artikel geht es um einen spezialisierten, trendfolgenden EA, der deutlich machen soll, wie man Handels-Setups nach Liquidity-Raids nutzen kann. In diesem Artikel wird ein EA ausführlich vorgestellt, der speziell für Trader entwickelt wurde, die daran interessiert sind, Liquiditätsabschöpfungen als Einstiegskriterien für ihre Trades und Handelsentscheidungen zu optimieren und zu nutzen. Außerdem wird untersucht, wie man korrekt zwischen Liquidity-Raids und Marktstrukturwechseln unterscheidet und wie man diese jeweils validiert und nutzt, wenn sie auftreten, um so Verluste zu minimieren, die dadurch entstehen, dass Trader beides miteinander verwechseln.
Entwicklung eines Toolkits zur Price-Action-Analyse (Teil 60):  Objektive Swing-basierte Trendlinien für die Strukturanalyse Entwicklung eines Toolkits zur Price-Action-Analyse (Teil 60): Objektive Swing-basierte Trendlinien für die Strukturanalyse
Wir stellen einen regelbasierten Ansatz für Trendlinien vor, der Indikator-Pivots vermeidet und geordnete Swings nutzt, die direkt aus unverarbeiteten Kursdaten abgeleitet werden. Der Artikel behandelt die Swing-Erkennung, die Bewertung der Swing-Größe mittels ATR oder fester Schwellenwerte sowie die Validierung von Aufwärts- und Abwärtsstrukturen und setzt diese Regeln anschließend in MQL5 mit einer Darstellung ohne Repainting und selektiver Anzeige um. Sie erhalten eine klare, reproduzierbare Methode zur Ermittlung struktureller Unterstützungs- und Widerstandsniveaus, die über verschiedene Marktbedingungen hinweg tragfähig bleibt.