Der „Gold Fractal Breakout EA“ ist ein Expert Advisor für MetaTrader 5, der nach bestätigten Swing-Hochs und -Tiefs sucht und anschließend versucht, Buy-Stop- und Sell-Stop-Orders in der Nähe dieser Niveaus zu platzieren. Zur Strukturerkennung nutzt er konfigurierbare benachbarte Kerzen anstelle des integrierten iFractals-Indikators. Orders und Positionen werden anhand des aktuellen Symbols und der konfigurierten Magic Number identifiziert.
Die Strategie kombiniert Preisstruktur, ausstehende Einstiegsorders und ein prozentbasiertes Ausstiegsmanagement. Sie zeichnet keine Einstiegspfeile, Fraktalmarkierungen oder Handelsfelder auf dem Chart. Die folgende Abbildung erläutert das Konzept der Orderplatzierung; sie ist fiktiv und stellt weder historische Trades noch einen Terminal-Screenshot oder gemessene Performance dar.

Der Produktname deutet auf Gold hin, daher ist ein brokerspecifisches Goldsymbol wie XAUUSD der vorgesehene Ausgangspunkt für die Bewertung. Die Quelle handelt jedoch das Symbol des Charts, an den sie angehängt ist, und enthält keine Beschränkung auf Gold. Es liegen keine Backtest- oder Forward-Test-Ergebnisse vor, die ein optimales Symbol, einen optimalen Zeitrahmen oder einen profitablen Parametersatz belegen.
Der Struktur-Zeitrahmen ist durch die interne Konstante „InpFractalTF“ auf H1 festgelegt. Dies ist kein bearbeitbarer Eingabewert. Selbst wenn der Zeitraum des Charts oder des Strategietesters D1 beträgt, liest CopyRates H1-Bars aus. Scans werden beim ersten verfügbaren Tick nach dem konfigurierten Intervall ausgeführt, das standardmäßig 15 Minuten beträgt; das Positionsmanagement läuft bei jedem Tick. H1 beschreibt daher die Standard-Signaldaten und nicht einen verifizierten besten Handelszeitrahmen.
„IsSwingHigh“ erfordert, dass das potenzielle Hoch streng höher ist als alle ausgewählten älteren und neueren benachbarten Hochs; „IsSwingLow“ erfordert das entsprechende streng niedrigere Tief. Bei den Standardeinstellungen werden auf jeder Seite fünf Balken überprüft. „FindSwing“ beginnt jenseits der fünf neuesten geschlossenen Balken, wobei der aktuelle Balken aus dem Bestätigungsfenster ausgeschlossen wird, und gibt das jüngste qualifizierte Niveau zurück. Wenn der erforderliche Verlauf nicht verfügbar ist, wird kein Niveau zurückgegeben.
Für ein Kauf-Setup muss der Ask-Kurs um mehr als den konfigurierten Mindestabstand unter dem Swing-Hoch liegen. Für ein Verkaufs-Setup muss der Bid-Kurs um mehr als diesen Abstand über dem Swing-Tief liegen. Der EA wendet dann seinen Einstiegs-Offset an, prüft, ob innerhalb der Duplikatsdistanz eine ausstehende Order in derselben Richtung vorliegt, und verifiziert, dass der ausstehende Einstieg außerhalb der vom Broker festgelegten Mindest-Stop-Distanz zum aktuellen Kurs liegt.
Kauf-Einstieg = Swing-Hoch + Swing-Hoch × Kauf-Offset / 100. Verkaufs-Einstieg = Swing-Tief − Swing-Tief × Verkaufs-Offset / 100. Beide Standard-Offsets betragen −0,10 %, sodass der Kauf-Einstieg unter dem Hoch und der Verkaufs-Einstieg über dem Tief liegt. Diese Standardwerte antizipieren die Swing-Grenze, anstatt einen vollständigen Durchbruch darüber hinaus zu erfordern. Die Order wird dennoch nur dann übermittelt, wenn ihr Kurs für eine Stop-Order im Verhältnis zum aktuellen Markt gültig ist.
Die folgenden Auszüge stammen aus der MQ5-Datei, die derzeit über diesen CodeBase-Eintrag heruntergeladen werden kann. Sie erläutern ausgewählte Teile der Implementierung und sind keine eigenständigen Programme.
const ENUM_TIMEFRAMES InpFractalTF = PERIOD_H1; // H1-Zeitrahmen festgelegt, unabhängig vom Chart- oder Testerzeitraum double FindSwing(bool high) { //--- Preisbalken für die Swing-Suche laden MqlRates r[]; ArraySetAsSeries(r,true); int need=InpMaxSearchBars+InpFractalLeft+InpFractalRight+5; if(CopyRates(_Symbol,InpFractalTF,0,need,r)<need) return 0; //--- Unbestätigte Kandidaten überspringen und von den neuesten zu den ältesten suchen int first=InpFractalRight+1; int last=MathMin(InpMaxSearchBars,ArraySize(r)-InpFractalLeft-1); for(int i=first;i<=last;i++) if(high ? IsSwingHigh(r,i) : IsSwingLow(r,i)) return high?r[i].high:r[i].low; return 0; }
Das Serien-Array verwendet den Index 0 für den aktuellen Balken. Beginnend bei „InpFractalRight + 1“ werden alle neueren Bestätigungsbalken geschlossen. Bei der standardmäßigen Zählung von fünf auf der rechten Seite ist der erste Kandidat der Index 6 und seine neueren Vergleichsbalken sind die Indizes 5 bis 1. „CopyRates“ fordert explizit H1-Daten an, unabhängig vom Zeitraum des angehängten Charts.
bool IsSwingHigh(const MqlRates &r[],int i) { //--- Den Kandidaten mit älteren Balken vergleichen for(int k=1;k<=InpFractalLeft;k++) if(r[i].high<=r[i+k].high) return false; //--- Den Kandidaten mit neueren Balken vergleichen for(int k=1;k<=InpFractalRight;k++) if(r[i].high<=r[i-k].high) return false; return true; }
Ein Kandidat wird verworfen, wenn ein beliebiges ausgewähltes benachbartes Hoch gleich oder höher ist als er. IsSwingLow wendet den entsprechenden umgekehrten Vergleich auf Tiefs an. Diese Funktionen identifizieren eine bestätigte Kursstruktur; sie rufen den integrierten iFractals-Indikator nicht auf.
double entry=buy?swing+Pct(swing,InpBuyEntryOffsetPct):swing-Pct(swing,InpSellEntryOffsetPct); entry=N(entry); if(SimilarPending(type,entry)) return; //--- Anfänglichen Stop-Loss und Take-Profit berechnen double sl=buy?entry-Pct(entry,InpStopLossPct):entry+Pct(entry,InpStopLossPct); double tp=buy?entry+Pct(entry,InpTakeProfitPct):entry-Pct(entry,InpTakeProfitPct); sl=N(sl); tp=N(tp);
Dieser Auszug stammt aus „PlaceBreakout“; „buy“, „swing“ und „type“ werden zuvor in dieser Funktion festgelegt. „Pct“ berechnet einen Prozentsatz seines ersten Arguments, und „N“ richtet die Kurse am Tick-Raster des Symbols aus. Vor der Normalisierung ergibt ein Swing-Hoch von 3000 mit einem Kauf-Offset von -0,10 % einen Einstiegspunkt von 2997; ein Swing-Tief von 3000 mit einem Verkaufs-Offset von -0,10 % ergibt einen Einstiegspunkt von 3003. Nachfolgende Überprüfungen hinsichtlich Broker-Abstand, Volumen, Handelssitzung und Margin können die Übermittlung weiterhin verhindern.
Im Modus „Fixed-Lot“ wird `InpFixedLots` auf das aktuelle Minimum, Maximum und den Volumenschritt des Symbols normiert. Im Modus „Risikoprozentsatz“ wird das Ordervolumen anhand des aktuellen Kontoguthabens, des konfigurierten Risikoprozentsatzes, der Distanz vom Einstieg zum Stop sowie der bei der Initialisierung zwischengespeicherten Tick-Größe und des Tick-Werts des Symbols geschätzt. Beide Modi begrenzen das Volumen auf das Symbol-Minimum und -Maximum und runden unter Verwendung der aus der Schrittweite abgeleiteten Dezimalgenauigkeit auf die Volumenschrittweite ab. Werte unterhalb des Minimums werden auf das Minimum angehoben, was das Risiko über die angeforderte Größe oder Risikoschätzung hinaus erhöhen kann. Ungültige Abstände oder zwischengespeicherte Tick-Eigenschaften führen zu einem Fallback auf normalisierte feste Lots. Vor der Übermittlung werden symbolweite Positionen in derselben Richtung und ausstehende Orders auf das SYMBOL_VOLUME_LIMIT angerechnet, einschließlich Trades mit anderen Magic Numbers; unzureichende verbleibende Kapazität verhindert eine neue Order.
Anfängliche Stop-Loss- und Take-Profit-Werte werden als Prozentsätze des ausstehenden Einstiegskurses berechnet. Bei jedem Tick wird die günstige Kursbewegung ausgehend vom Eröffnungskurs der Position gemessen, wobei für Kaufaufträge der Geldkurs und für Verkaufsaufträge der Briefkurs herangezogen wird. Beim Erreichen des Break-even-Auslösers wird der Stop in Richtung einer geringen, kursbasierten Gewinnsicherung verschoben. Trailing-Aktualisierungen gelten nur, solange die günstige Kursbewegung zwischen dem Trailing-Auslöser und dem maximalen Trailing-Prozentsatz liegt.
Bei Erreichen der Verlustbegrenzungsschwelle verschiebt der EA den Take-Profit auf einen im Verhältnis zum Eröffnungskurs geringeren Verlust. Dies zielt darauf ab, einen Ausstieg zu erreichen, falls sich der Kurs anschließend in Richtung dieses Ziels erholt; die Position wird dadurch nicht sofort geschlossen und eine Erholung wird nicht garantiert. Beispielsweise liegt das standardmäßige Salvage-Ziel für Kaufpositionen 0,15 % unter dem Einstiegskurs, nachdem eine ungünstige Kursbewegung von mindestens 1,00 % stattgefunden hat. Das aktualisierte Ziel wird nicht automatisch auf den ursprünglichen Take-Profit-Wert zurückgesetzt, wenn die Verlustbedingung endet.
Alle 25 konfigurierbaren Eingaben sind unten mit ihren werkseitigen Standardwerten aufgeführt. Mit Ausnahme von „InpRiskPercent“ beschreiben die prozentualen Einstellungen Kursabstände oder Kursbewegungen, nicht die Kontorenditen. „InpDuplicatePoints“ verwendet Symbolpunkte anstelle einer universellen Pip-Größe. Der Trailing-Abstand basiert auf dem aktuellen Kurs; die anderen hier beschriebenen Ausstiegsprozentsätze basieren auf dem Einstiegs- oder Eröffnungskurs.
| Parameter | Standardwert | Bedeutung und Interpretation |
|---|---|---|
| InpMagic | 900009 | Bezeichner, der zusammen mit dem Chart-Symbol verwendet wird, um die Orders und Positionen dieses EAs auszuwählen. |
| InpComment | „GoldX9-Strategie 9“ | Text, der übermittelten Orders beigefügt wird; die Filterung nach Eigentümern erfolgt anhand des Symbols und der Magic Number. |
| InpLotMode | LOT_FIXED | LOT_FIXED verwendet ein festes Volumen; LOT_RISK_PERCENT verwendet eine auf das Eigenkapital abgestimmte Risikobestimmung. |
| InpFixedLots | 0,01 | Gewünschtes Volumen im Festmodus, normiert auf Min/Max/Schritt des Symbols; dient auch als normierter Fallback bei ungültigen Eigenschaften zur Risikobestimmung. |
| InpRiskPercent | 0,50 | Geschätztes Eigenkapitalrisiko pro Order; kein garantiertes Limit für realisierte Verluste. |
| InpMaxPending | 3 | Pending-Orders mit demselben Symbol und derselben Magic-Number, für jede Richtung separat gezählt. |
| InpMaxPositions | 10 | Sekundärer Schwellenwert für die Anzahl der Positionen; bereits bestehende Positionen in einem Symbol blockieren neue Eingänge und lösen die Stornierung bereits vorhandener ausstehender Aufträge aus. |
| InpPendingExpiryHours | 15 | Aus diesem Wert berechneter Zeitstempel; bei Übermittlungen wird weiterhin GTC verwendet, daher ist ein zeitgesteuertes Ablaufen nicht implementiert. |
| InpDuplicatePoints | 100 | Ein ausstehender Eintrag desselben Typs in dieser Entfernung oder innerhalb dieser Entfernung verhindert die Einreichung. |
| InpRescanMinutes | 15 | Mindestzeit zwischen dem Scannen von Einträgen; für das Scannen ist ein eingehender Tick erforderlich. |
| InpFractalLeft | 5 | Anzahl älterer benachbarter Balken im strengen Swing-Vergleich. |
| InpFractalRight | 5 | Anzahl der neueren, geschlossenen benachbarten Kerzen, die zur Bestätigung eines Swings erforderlich sind. |
| InpMaxSearchBars | 200 | Maximal untersuchter Index der Kandidatenreihen; zusätzliche Balken werden zu Vergleichszwecken geladen. |
| InpMinFractalClearancePct | 0,02 | Ask-Abstand unterhalb eines Hochs oder Bid-Abstand oberhalb eines Tiefs, ausgedrückt als Prozentsatz der Kursschwankung. |
| InpBuyEntryOffsetPct | -0,10 | Wird zum Schwankungshoch addiert; ein negativer Standardwert legt den Einstieg unterhalb des Hochs fest. |
| InpSellEntryOffsetPct | -0,10 | Wird vom Swing-Tief abgezogen; ein negativer Standardwert legt den Einstiegspunkt oberhalb des Tiefs fest. |
| InpStopLossPct | 2,00 | Anfänglicher Stop-Abstand vom ausstehenden Einstiegskurs. |
| InpTakeProfitPct | 1,00 | Anfänglicher Zielabstand vom ausstehenden Einstiegskurs. |
| InpTrailTriggerPct | 0,20 | Mindestbewegung in die gewünschte Richtung vom Eröffnungskurs für Trailing-Aktualisierungen. |
| InpTrailDistancePct | 0,20 | Stop-Abstand, berechnet als Prozentsatz des aktuellen Geld- oder Briefkurses. |
| InpMaxTrailPct | 1,00 | Obergrenze für günstige Kursbewegungen bei Trail-Aktualisierungen; keine Gewinnbegrenzung. |
| InpSalvageTriggerPct | 1,00 | Ungünstige Kursbewegung gegenüber dem Eröffnungskurs, die das Rettungsziel auslöst. |
| InpSalvageExitPct | 0,15 | Zielabstand auf der Verlustseite vom Eröffnungskurs; es erfolgt keine sofortige Schließung. |
| InpBreakEvenTriggerPct | 0,10 | Günstige Kursbewegung gegenüber dem Eröffnungskurs, die die Gewinnsicherung auslöst. |
| InpBreakEvenLockPct | 0,025 | Gewinnsicherung in Prozent des Eröffnungskurses, vor Abzug der Kosten. |
Das einzige Include ist <Trade/Trade.mqh>, die Handelsschnittstelle der MetaTrader 5-Standardbibliothek. Dessen CTrade-Objekt „trade“ übermittelt Pending-Orders, weist die Magic-Number des Experts zu, fordert Positionsänderungen an und liefert Beschreibungen der Handelsergebnisse. Es wird nicht zur Swing-Erkennung oder zur Berechnung der Lotgröße verwendet. Es wird auf keinen benutzerdefinierten Indikator, keine externe DLL, keinen Webdienst und kein zusätzliches benutzerdefiniertes Include verwiesen.
„OnInit“ speichert die Punktgröße, die Stellenanzahl, die Tick-Größe und den Tick-Wert des Symbols im Cache und überprüft vier Eingaben mit positivem Zählwert. „OnTick“ storniert verbleibende ausstehende Orders, wenn eine Symbolposition besteht, überprüft die ausstehende Margin, verwaltet Positionen und drosselt den Scan nach Einstiegsmöglichkeiten nur dann, wenn keine Symbolposition besteht. „OnTradeTransaction“ löst nach einem Handel ebenfalls die Stornierung ausstehender Orders aus. „Pct“ und „N“ verarbeiten prozentuale Abstände und die Dezimalnormalisierung; „OurOrder“ und „OurPosition“ filtern die Eigentumsverhältnisse; „CountPositions“ und „CountPending“ setzen Zeitlimits für den Scan durch; „FindSwing“ und die Swing-Helfer identifizieren die Struktur; „SimilarPending“, „LotsForRisk“, „PlaceBreakout“ und „ManagePositions“ implementieren Duplikatsprüfungen, Größenbestimmung, Übermittlung und Ausstiege.
Die internen globalen Variablen sind „trade“ (die Handelsschnittstelle), „g_last_scan“ (der Zeitpunkt des letzten Scans), „g_point“ (Punktgröße des Symbols), „g_digits“ (Dezimalstellen des Kurses), „g_tick_size“ (Tick-Größeninkrement) und „g_tick_value“ (gemeldeter Tick-Wert). „InpFractalTF“ ist eine interne Konstante, die fest auf „PERIOD_H1“ gesetzt ist. Diese internen Variablen und die Zeitrahmenkonstante sind keine Benutzereingaben. Der EA nutzt integrierte Terminal-APIs für Kurse, Historie, Kontoguthaben, Orders und Positionen.
InpPendingExpiryHours wird zur Berechnung eines Ablaufzeitstempels verwendet, doch die Orderaufrufe nutzen explizit ORDER_TIME_GTC. Der vorliegende Code implementiert daher nicht den angekündigten stundenbasierten Ablaufmodus. Eine margengesteuerte Bereinigung kann die ausstehenden Orders dieses EAs löschen, wenn deren geschätzte Aktivierungsmarge das gepufferte freie Margenbudget überschreitet. Dies ist kein stundenbasierter Ablauf. Eigene ausstehende Orders werden storniert, wenn eine offene Position auf dem Symbol erkannt wird. Ein neuer Kursschwankung allein führt nicht zur Stornierung bestehender Orders.
Jede offene Position auf dem aktuellen Symbol blockiert nun die Übermittlung neuer ausstehender Orders, unabhängig von der Magic Number. Bei einem Handelsereignis und den darauf folgenden Ticks versucht der EA, seine verbleibenden ausstehenden Orders für dieses Symbol zu stornieren. Orders, die anderen EAs gehören, werden nicht storniert. Die Löschung kann durch eine „Freeze Zone“ oder eine geschlossene Sitzung verzögert werden; die clientseitige Stornierung ist keine atomare serverseitige OCO-Garantie. „InpMaxPositions“ dient weiterhin als sekundäre Zählprüfung, autorisiert jedoch keine zusätzlichen Eingaben, solange eine Position besteht. Der Risikoprozentsatz bezieht sich auf die jeweilige vorgeschlagene Order und nicht auf ein aggregiertes Portfoliolimit. Mindestvolumenanforderungen des Brokers, der Fallback auf festes Volumen, Ausführungskurse und Handelskosten können dazu führen, dass das tatsächliche Risiko von der Schätzung abweicht. Die Quelle enthält keinen Spread- oder aggregierten Stop-Loss-Risikofilter. Sie überprüft die Handelssitzungen des Brokers vor der Auftragserteilung und Positionsänderung, schätzt die eigenständige Aktivierungsmarge für alle ausstehenden Aufträge des Kontos und belässt 20 % der aktuellen freien Marge als Puffer. Wenn das angeforderte normalisierte Volumen nicht in das verbleibende Margenbudget passt, wird die gesamte Order übersprungen und der Grund protokolliert. Das Volumen wird nicht reduziert, um es an das Margenbudget anzupassen. Gegenläufige Orders erhalten keine vermutete Margenentlastung durch Verrechnung.
Die Kurse werden auf das zwischengespeicherte Tick-Size-Raster des Symbols gerundet und anschließend auf die Symbolstellenzahl normiert. Sowohl feste als auch risikobasierte Volumina werden auf die Volumenspezifikationen des Symbols normiert. Anträge auf Positionsschließung prüfen die bestehenden SL/TP-Sperrzonen sowie die vorgeschlagenen Stop-/Sperrdistanzen und melden abgelehnte Serverergebnisse. Änderungsversuche werden auf einmal alle fünf Sekunden pro Verwaltungsdurchlauf begrenzt. Der EA überprüft ausstehende Anfragen zudem vor der Übermittlung mithilfe von OrderCheck. Bei der Übermittlung werden sowohl der CTrade-Rückgabewert als auch der Server-Ergebniscode überprüft. Bei Fehlern werden das angeforderte normalisierte Volumen sowie das Minimum, Maximum, der Schritt und die Richtungsgrenze des Symbols protokolliert. Auch bei der Initialisierung werden diese Spezifikationen protokolliert.
Bei der Initialisierung überprüft der Quellcode die Anzahl der fraktalen Nachbarn, ausstehende und Positionslimits, ein positives, endliches Festvolumen sowie einen positiven, endlichen Risikoprozentsatz, wenn die Risikoberechnung ausgewählt ist. Mehrere andere Bereiche bleiben ungeprüft. Unabhängige gegensätzliche Positionen lassen sich am einfachsten auf einem Hedging-Konto interpretieren; auf einem Netting-Konto wirken sich Orders auf dasselbe Symbol auf eine gemeinsame Position aus. Die aktualisierte Quelle wurde ohne Fehler und ohne Warnungen kompiliert. Der Nutzer meldete 50 Trades bei EURUSD H1-Netting und 40 Trades bei XAUUSD D1-Netting vor Einführung dieser neuesten Schutzmechanismen; der XAUUSD-Lauf meldete zudem Sitzungs-, Margin- und „Frozen-Modification“-Fehler. Die aktualisierten Schutzmaßnahmen wurden unter diesen Bedingungen noch nicht erneut getestet. Sitzungspläne garantieren keine Verfügbarkeit bei außergewöhnlichen Schließungen, und eine Kurslücke, eine plötzliche Eigenkapitaländerung oder eine eingefrorene ausstehende Order können weiterhin eine rechtzeitige Margin-Bereinigung verhindern. Es werden keine Leistungsergebnisse beansprucht.
Übersetzt aus dem Englischen von MetaQuotes Ltd.
Originalpublikation: https://www.mql5.com/en/code/78308
Prop Firm Equity Guard - Daily Loss Limit and Max Drawdown Protection
Schließt alle Positionen und blockiert neue Trades, sobald das tägliche Verlustlimit, der maximale Verlust oder das Gewinnziel erreicht ist. Entwickelt für die Herausforderungen von Prop-Firmen. Funktioniert sowohl beim manuellen Handel als auch mit jedem anderen EA.
Session High Low - Asian, London and New York Range Boxes
Zeigt die Handelsspannen der asiatischen, Londoner und New Yorker Handelssitzungen als farbige Kästchen mit ihren Höchst- und Tiefstständen sowie gepunktete Verlängerungslinien für den Breakout-Handel an. Gleiche Spannen in jedem Zeitrahmen bis hin zur H1-Chart.
London Breakout EA: einfach und transparent/Der London Breakout-Expert Advisor: einfach und transparent
Kostenloser Breakout-EA: Asiatische Handelsspanne, Londoner Breakout, ein Trade pro Tag, Stop-Loss immer gesetzt, Lot entsprechend des Risikoprozentsatzes. Kein Grid, kein Martingale. / Kostenloser EA: Durchbruch der asiatischen Handelsspanne während der Londoner Handelssitzung, ein Trade pro Tag, Stop-Loss immer gesetzt, Lot basierend auf dem Risikoprozentsatz. Kein Grid und kein Martingale.
Accelerator Oszillator (AC)
Der Acceleration/Deceleration Indikator (AC) misst die Beschleunigung und Verlangsamung des aktuellen Marktimpulses, der Kraft der Kursbewegung.