English
preview
Automatisiertes Risikomanagement für das Bestehen der Herausforderungen von Prop-Firmen

Automatisiertes Risikomanagement für das Bestehen der Herausforderungen von Prop-Firmen

MetaTrader 5Handel |
34 7
Eugene Mmene
Eugene Mmene

Einführung

Dies ist ein Artikel, den ich mit dem einzigen Ziel geschrieben habe, ein kürzlich aufgetauchtes Phänomen in Form des Handels mit Prop-Firmen anzusprechen. Die Sache ist, der Handel mit einer Prop-Firma als Ganzes ist nicht nur ein sehr attraktives, lukratives, und lohnendes Unterfangen, sondern verlangt die Bewältigung großer Herausforderungen und Hindernisse, wenn man beschließt, diesen Weg zu gehen. Das häufigste Hindernis, mit dem die meisten Händler konfrontiert sind, die sich an die Herausforderungen einer Prop-Firma wagen, ist nicht ein Mangel an Strategie, Technik oder Geschicklichkeit, sondern vielmehr die strengen Beschränkungen und Handelsregeln, die von der Prop-Firma festgelegt wurden und die eingehalten werden müssen, damit ein Händler beweisen kann, dass er Zugang zu einem Live-Handelskonto erhält.

Die Sache ist die, dass ein Händler den Markt gut analysieren, sich an seinen Handelsplan halten, Handelsgeschäfte ausführen und sogar Trends erkennen kann, was für den persönlichen Handel mit eigenem Kapital gut genug sein mag, aber nicht für den Handel mit Prop-Firmen, bei dem ein Händler sich an die Regeln halten und Grenzen setzen muss.

Einige der häufigsten Regeln, Ziele und Grenzen sind:

  • Man sollte die festgelegte Grenze für die tägliche Drawdown nicht überschreiten, die normalerweise um Mitternacht zurückgesetzt wird. Die verschiedenen Prop-Firmen haben unterschiedliche Limits, und auch die Art des Kontos, das man erwirbt, kann ein Faktor für das Drawdown-Limit sein.
  • Ein Händler sollte das festgelegte Limit für den Gesamtdrawdown nicht verletzen, da dies den Handel mit dem betreffenden Konto beenden würde. Die Höchstbeträge variieren für die verschiedenen Prop-Firmen und auch die Arten von Konten.  
  • Ein Händler sollte nicht versuchen, von plötzlichen, heftigen und volatilen Marktbewegungen während der Veröffentlichung von Nachrichten zu profitieren, da dies ein sehr gefährliches und hohes Risiko für das Konto darstellen kann, da die Richtung fehlt oder die Preisbewegung unruhig ist.
  • Ein Händler sollte auch das gleiche Risikoprofil und die gleiche Exposition während des Handelszeitraums beibehalten, um eine gleichmäßige und stabile Kapitalkurve zu erhalten und Händler zu vermeiden, die eine zu große Hebelwirkung haben oder versuchen, alles in einem einzigen Handel zu setzen. 
  • Die Händler müssen außerdem jeden Tag diszipliniert handeln und dürfen sich nicht an Aktivitäten beteiligen, die ein Risiko für die Prop-Firma oder das Konto darstellen, oder sich an ungerechtfertigten Praktiken wie Arbitragehandel oder Hochfrequenzhandel beteiligen.

Genau an diesen Bedingungen „zerbrechen“ 60-80 % der Teilnehmer, selbst wenn die Qualität ihrer Handelsideen hervorragend ist. Das Problem ist nicht die Fähigkeit oder das Geschick beim Handel, sondern die Schwierigkeit, Risiken, Drawdowns, Volatilität und Disziplin gleichzeitig manuell zu überwachen.

Ich habe diesen Artikel genau geschrieben und ihn an Händler gerichtet, die zwar wissen, wie man handelt, aber aus dem einen oder anderen Grund immer wieder an festen Herausforderungen scheitern, sei es wegen übermäßiger Drawdowns, Emotionen oder aus irgendeinem anderen Grund. Wir werden versuchen, im Laufe des Artikels mögliche Lösungen für dieses Hindernis zu entwickeln und zu demonstrieren, indem wir die Drawdown- und Risikomanagement-Kontrollen automatisieren, damit die Händler die Regeln nicht mehr brechen und die Herausforderung erfolgreich abschließen können.

Das Chart zeigt einen Ausbruch und eine erneute Einstiegsmöglichkeit oberhalb des Ausbruchs


Automatisierung von Handelsprozessen zur Beseitigung menschlicher Fehler im Prop-Handel   

Es gibt Handelspraktiken und -prozesse, die in hohem Maße zum Grad des profitablen Handels beitragen und den Erfolg von Händlern maßgeblich bestimmen, insbesondere wenn sie methodisch und korrekt durchgeführt werden. Man muss diese Prozesse gleichzeitig beherrschen, um effektiv und gewinnbringend zu handeln. Hier versagen die meisten Händler, und wir werden demonstrieren, wie der EA versuchen wird, diese Herausforderung zu meistern.

Im Folgenden werde ich kurz erläutern, wie der Expert Advisor die Herausforderungen, mit denen Händler bei der Automatisierung dieses Prozesses konfrontiert sind, angehen und bewältigen soll. Diese Prozesse und Praktiken sind insbesondere

  • Angemessenes Risikomanagement: Der Expert Advisor in diesem Artikel ist so konzipiert, dass er ein sehr solides Risiko- und Handelsmanagement implementiert, um sicherzustellen, dass alle Regeln der Prop-Firma eingehalten und nicht verletzt werden. Dies ist die wichtigste Übung und der wichtigste Prozess, da man ohne Kapital oder ein geplatztes Konto nicht mehr handeln kann.  
  • Handelsplan: Der Expert Advisor verfügt über einen automatisierten und strikten logischen Ablauf für den Handel, der den Handel nur dann zulässt, wenn die gewünschten Marktbedingungen erfüllt sind, und der keinen Handel aufgrund von Emotionen oder Ängsten ausführt.  
  • Marktanalyse: Der Expert Advisor analysiert den Markt in einer bestimmten Reihenfolge und Logik, die sicherstellt, dass er Fehler vermeidet und menschliche Fehler/Voreingenommenheit während der Marktanalyse und des Handels minimiert. Die Top-down-Analyse vermeidet das Strategie-Hopping, das bei manuellen Händlern häufig vorkommt, wenn sie von schlechten Ergebnissen frustriert sind.
  • Ausgezeichnete Handelspsychologie: Mit der Automatisierung dieses Expert Advisors können wir nach Verlusten Vergeltungsmaßnahmen, den impulsiven Handel aufgrund von Angst und Gier sowie die FOMO (Angst, etwas zu verpassen) ausschalten und sicherstellen, dass Geduld und Disziplin, die für den langfristigen Erfolg im Handel mit Prop-Firmen entscheidend sind, eingehalten werden.

Die Sache ist die, dass ein Händler nicht nur einen Prozess vollständig verstehen und praktizieren muss, sondern er oder sie muss alle Handelsprozesse vollständig erfassen und verstehen und sie mit den Händen greifen, weil die Beherrschung eines Prozesses ohne die anderen oder die Beherrschung einiger weniger und die Auslassung eines oder zweier schnell in das Verderben führen wird, da immer noch das Wesentliche fehlt, um im Markt effizient und gewinnbringend über einen langen Zeitraum zu navigieren, und jeder anfängliche Erfolg wird nur kurzlebig sein.

Die Automatisierung dieser Handelsprozesse trägt dazu bei, den Druck von den Händlern zu nehmen, da die Kernlogik des EA sicherstellt, dass er alle Prozesse und Praktiken durchführt und nicht einmal einen Schritt auslässt, um sicherzustellen, dass er alle Variablen vor der Ausführung berücksichtigt hat, im Gegensatz zu einem manuellen Händler, der sich von Emotionen, Angst oder sogar Furcht mitreißen lässt und eine grundlegende Aufgabe nicht erledigt, was zum Verlust von Handelsgeschäften führen kann. 

Um in diesem Bereich erfolgreich zu sein, muss man alle Elemente beherrschen, die zum Handel gehören, und lernen, sie zu kombinieren und auf einmal zu nutzen, ohne auch nur eines der Elemente auszulassen. Da wir in diesem Artikel bereits erörtert haben, warum und wie sich die meisten Händler aufgrund von schlechtem Risikomanagement nicht für finanzierte Konten qualifizieren, werden wir nun auf das Innenleben, das Design und die Funktion eingehen, wie dieser EA die Handelslogik und das Risikomanagementprotokoll implementiert, um unsere Ziele zu erreichen.  

Chart mit Ausbruchs- und Wiederholungstest für Eröffnungen



Die Funktionsweise des EA für den Handel mit Prop-Firmen

In diesem Kapitel werden wir erörtern, wie der Expert Advisor Informationen versteht, interpretiert und verarbeitet, wie er das Risikomanagement implementiert und wie er die Handelslogik ausführt, um optimale Ergebnisse zu erzielen. Der erste und wichtigste Punkt ist die angewandte Handelslogik:

  • Eine Handelslogik, die zur Ausführung von Handelseröffnungen verwendet wird.

    Dies ist eine wichtige und wertvolle Information in diesem Artikel, da der Expert Advisor auf diese Weise alle gesammelten Informationen gründlich validiert und analysiert. Hier verstehen wir, wo und wie wir Handelseinträge für ungültig erklären oder validieren, wie viel wir riskieren und wo und wann wir das Risiko und das Engagement reduzieren oder erhöhen sollten. Dieser Teil ist vereinfacht, um einen allgemeinen Überblick über die Ausführung zu geben. So wird die Logik für den Einstieg in den Handel im Wesentlichen ausgeführt. 

    Sobald der EA eine Handelskonstellation identifiziert hat, wertet er schnell die letzten Kapital- und Saldenhöchststände in Bezug auf den täglichen und gesamten Drawdown aus, um den Spielraum in Bezug auf das verfügbare Guthaben und die Marge zu berechnen, den er bei dem Handel verlieren kann, ohne eine Regel zu verletzen.

    Das zweite Kriterium ist die Einhaltung des maximalen Risikobetrags von 2 % und der Verlustobergrenze von 110 $. Das bedeutet einfach, wenn der EA berechnet und herausfindet, dass der Stop-Loss bei einem Preis platziert werden sollte, dies aber gegen die Risikoparameter oder den maximal zulässigen Verlust verstößt, dann wird dieser Handel nicht ausgeführt. Der EA verwendet ATR (Average True Range), um Stop-Loss-Levels, Take-Profit-Levels, Trailing Stop-Loss und Trendwechsel zu bestimmen.

    Beispiel für einen Ausbruch und einen erneuten Test von oberhalb des Ausbruchs


    • Risiko- und Handelsmanagement

    Der Expert Advisor verfügt über eine sehr robuste Anpassungs- und Risikohandhabungslogik, die speziell für den Umgang mit den Herausforderungen von Prop-Firmen entwickelt wurde. Es wurde auch sorgfältig für den Goldhandel konzipiert. Der Expert Advisor kann auch für persönliche und nutzerspezifische Präferenzen kalibriert werden, aber mit den Standardeinstellungen riskiert er nur zwei Prozent pro Handelsgeschäft, und dies ermöglicht eine moderate Risikoexposition und durchschnittliche Aggressivität, die das Konto am Leben erhält, um im Falle eines Verlustes an einen anderen Tag damit zu kämpfen. Außerdem kann es sehr gefährlich und nachteilig sein, große Risiken mit Gold einzugehen. 

    Als weitere Vorsichtsmaßnahme verfügt der EA über eine Verlustobergrenze von 110 $ für einen einzelnen Handel, um sicherzustellen, dass kein einzelnes Ereignis oder ein einzelner Handel gegen die Regeln der Prop-Firmen verstößt, selbst wenn Spreads und Kurslücken nicht berücksichtigt werden. Der Risikoprozentsatz und der maximale Verlust können geändert oder an die Vorgaben des Nutzers angepasst werden. Eine weitere Funktion ist der Rückblick zur Überprüfung von Ausbruchsperioden von bis zu 10 Balken, um falsche Ausbrüche herauszufiltern, die in Zeiten geringer Volatilität und geringen Volumens sehr häufig vorkommen. Außerdem ist der Expert Advisor für den Handel 15 Minuten vor und nach den Nachrichten gesperrt, um die Nachrichtenvolatilität zu vermeiden, die zum Untergang zahlreicher Konten geführt hat; dadurch kann der Expert Advisor Nachrichten wie CPI, FOMC und NFP vermeiden.

    Bei den Kalibrierungen der Eingabeeinstellungen gibt es auch eine Mindeststärke für Ausbrüche, die 0,1 beträgt, um schwache Ausbrüche zu vermeiden, die Fallen sein könnten, und die sich nach Verlusten automatisch erhöht, um den EA zu zwingen, auf stärkere, sauberere Ausbrüche in der manipulativen Marktstruktur von Gold zu warten. Diese Funktion wird auch durch eine höhere Zeitrahmeneinstellung ergänzt, die je nach Händler ein- und ausgeschaltet werden kann. Diese Einstellung wird verwendet, um sicherzustellen, dass der Expert Advisor Handelsgeschäfte entsprechend der Richtung des höheren Zeitrahmens und des Narrativs ausführt, um dem kurzfristiges Rauschen in den niedrigeren Zeitrahmen zu entgehen, das oft sehr irreführend und ultrakurzfristig ist und dem es an Geschwindigkeit und Stärke fehlt.   

    Der Expert Advisor verfügt über fortschrittliche tägliche Drawdown-Limits und Gesamt-Drawdown-Limits, die auf 2,5 % bzw. 5,5 % festgelegt sind, um sicherzustellen, dass selbst bei hohen Spreads und Volatilitäten eine Überschreitung vermieden wird. Dies trägt dazu bei, einen gewissen Abstand zu den Drawdown-Grenzen zu gewährleisten. Eine weitere interessante und sehr nützliche Funktion ist, dass der Expert Advisor ein Gewinnziel hat, um eine Herausforderung zu bestehen. Sobald er dieses Ziel erreicht hat, schließt er alle Handelsgeschäfte, da er die 10 %-Schwelle erreicht hat, die erforderlich ist, um die 1-Schritt-Herausforderung zu bestehen.

    Die Funktionen CurRisk und OrigRisk ermöglichen dem Expert Advisor eine dynamische Bestimmung der Positionsgröße, die nach aufeinanderfolgenden Verlusten reduziert und in Gewinnphasen erhöht wird – dies ist sehr wichtig, um die brutalen Drawdown-Phasen von Gold zu überstehen, und wirkt sich auch zu seinen Gunsten aus, wenn es profitabel ist.

    LastEqHigh verfolgt den höchsten Stand des Kapitals, um versteckte Drawdowns auch während des Saldenwachstums zu erkennen, während StartingBalance und DailyBalance die Grundlage des doppelten Drawdown-Schutzsystems bilden, das speziell auf den zu Lücken neigenden Charakter von Gold abgestimmt ist.

    Die Struktur TimeframeData verwaltet M15- und H1-Indikatoren unabhängig voneinander mit separaten Timern für die Beruhigung des Marktes, um zu vermeiden, dass in einer Stunde mehrere Handelsgeschäfte eröffnet werden, die ein Risiko darstellen könnten.

    Der Expert Advisor nutzt auch die Funktion TradeLog und zeichnet jeden Handel mit Ausbruchsstärke, Volumen und Risikoniveau für die Nachanalyse und adaptive Filtereinstellung auf, um zu lernen und dieselben Fehler zu vermeiden.

    Die Funktion zur Verwaltung des Handels bietet drei leistungsstarke Ausstiegsmechanismen, die für die heftigen Bewegungen des Goldes optimiert sind. Erstens wird jede Kaufposition sofort geschlossen, wenn es zu einem starken Ausbruch nach unten kommt (und umgekehrt), wodurch Umkehrungen von über 2000 Punkten verhindert werden. Zweitens nimmt er 50 % Gewinn bei einem Chance-Risiko-Verhältnis von 1:2 mit und verschiebt den Stop-Loss auf Breakeven, um das Kapital während der Nachrichtenspitzen zu sichern. Drittens wird der Stop-Loss bei 1,5×ATR nachgezogen, sodass der EA massive Trends (wie Post-FOMC-Ausbrüche) mitmachen und gleichzeitig Gewinne schützen kann. Diese Kombination hat im Live-Goldhandel ein durchschnittliches Ertrag-zu-Risiko-Verhältnis von über 1:3 bewiesen.

    Ausbruch und erneuter Einstieg am H1-Ausbruch


    Automatisieren von Handelsentscheidungen mit einem Expert Advisor für den Handel mit Prop-Firmen in MQL5

    Um diese Strategie zu automatisieren, zu veranschaulichen und zu implementieren, habe ich einen Expert Advisor für den Handel mit Prop-Firmen mit einem optimalen Risikomanager erstellt, der Trends und mögliche Einstiegspunkte nach Ausbrüchen analysiert und dabei Trailing-Stop-Loss, Handelsmanagement und einfache gleitende Durchschnitte berücksichtigt.

    Prozess der Entscheidungsfindung

    Die Entscheidungen dieses Expert Advisors (Liquiditätserkennung, Ausbruchserkennung, Handelsmanagement, Risikomanagement und Handelsausführung) werden durch die folgende Logik gesteuert:

    Quellcode des Expert Advisors für den Handel mit Prop-Firmen

    Dieser Expert Advisor erkennt Ausbrüche als Handelseinstiegssignale aus den Charts D1, MN, W1, H4 und H1 mit höherem Zeitrahmen und wartet darauf, dass der Preis unmittelbar nach der Liquiditätsbereinigung für hochwertige Handelsgeschäfte von oben an die Ausbrüche zurückkehrt, und interpretiert diese als Handelseröffnung. Ferner wird ein einfacher gleitender Durchschnitt verwendet, um die allgemeine Trendrichtung für den Handelseinstieg zu ermitteln, und es verfügt über robuste Handels- und Risikomanagementfunktionen, die die Logik eines eine Trailing-Stop-Loss anwenden, um Stop-Loss-Niveaus zu bestimmen und das Kapital zu schützen, wenn sich der Preis zu seinen Gunsten entwickelt. Es beinhaltet ein Risikomanagement (2% Risiko pro Handel). 

    Eingabeparameter: ausschließlich für Gold optimiert

    Die Eingangsparameter wurden sorgfältig für den Handel mit GOLD (XAUUSD) in einem Umfeld mit hohen Einsätzen von Prop-Firmen kalibriert. RiskPct wurde aufgrund der extremen Volatilität von Gold (durchschnittliche tägliche Schwankungsbreite 1800-3500 Punkte) auf 2% und damit niedriger als bei Devisenpaaren eingestellt. MaxLossUSD begrenzt den Verlust eines einzelnen Handels auf 110 $ und stellt sicher, dass kein einzelnes Ereignis (selbst ein 3000-Punkte-Spike) die Regeln verletzt. Brk_Prd ist auf 10 Balken erhöht, um falsche Ausbrüche herauszufiltern, die während der asiatischen Sitzungen mit geringem Volumen üblich sind. Die Nachrichtenpause wurde auf 15 Minuten ausgedehnt, da Gold auf US-Daten (CPI, FOMC, NFP) mit sofortigen Schwankungen von über 1000 Punkten reagiert. MinBrkStr wurde auf 0,1 ATR angehoben – schwache Ausbrüche in Gold sind in der Regel Fallen. useHTF ist standardmäßig aktiviert, da Gold die Struktur des höheren Zeitrahmens (D1/H4 EMA) weit mehr respektiert als Forex-Paare. DailyDDLimit (2,5 %) und OverallDDLimit (5,5 %) sind strenger als der Standard, um dem Risiko einer Kurslücke von Gold Rechnung zu tragen. TargetBalanceOrEquity ist auf 10.000 $ gesetzt – das exakte Gewinnziel für die meisten Regeln für 100K $ Gold im Jahr 2025.
    //+------------------------------------------------------------------+
    //|             XAUUSD_AdvancedBreakoutRecoveryEA.mq5                |
    //|           GOLD (XAUUSD) Multi-Timeframe Adaptive Breakout EA     |
    //|            With optimized Risk Management for prop firms         |
    //|         optimized for 1-step Fundednext Prop Firm Challenges     |
    //+------------------------------------------------------------------+
    #property copyright "Eugene Mmene"
    #property link      "https://EMcapital2021"
    #property version   "2.26"
    
    #include <Trade\Trade.mqh>
    
    //--- Input Parameters
    input double RiskPct = 2.0;               // Base risk per trade % (lower for GOLD volatility)
    input double MaxLossUSD = 110.0;          // Maximum loss per trade in USD
    input double RecTgt = 7000.0;             // Equity recovery target after drawdown
    input int    ATR_Prd = 14;                // ATR period – perfect for XAUUSD volatility
    input int    Brk_Prd = 10;                // Breakout lookback – captures gold’s momentum
    input int    EMA_Prd = 20;                // EMA period for D1/H4 trend filter
    input string GS_Url = "";                 // Google Sheets webhook URL
    input bool   NewsFilt = true;             // Critical for gold (FOMC, NFP, CPI)
    input int    NewsPause = 15;              // 15 minutes pause – gold spikes hard
    input double MinBrkStr = 0.1;             // Minimum breakout strength in ATR multiples
    input int    Vol_Prd = 1;                 // Volume MA period
    input bool   Bypass = 
    true ;              // Set false for live – true only for testing
    input bool   useHTF = 
    false ;               // MUST be true for gold – avoids fake breakouts
    input string NewsAPI_Url = "https://www.alphavantage.co/query?function=NEWS_SENTIMENT&apikey=";
    input string NewsAPI_Key = "pub_3f54bba977384ac19b6839a744444aba";
    input double DailyDDLimit = 2.5;          // Tighter daily DD for gold’s volatility
    input double OverallDDLimit = 5.5;        // Strict overall drawdown limit
    input double TargetBalanceOrEquity = 6600.0; // Standard $100K challenge target
    input bool   ResetProfitTarget = false;   // Manual reset after passing
    

    GLOBALE VARIABLEN: Detaillierter Zweck für den Goldhandel

    CurRisk und OrigRisk ermöglichen eine dynamische Positionsgröße, die nach aufeinanderfolgenden Verlusten reduziert und in Gewinnphasen erhöht wird – wichtig, um die brutalen Drawdown-Phasen von Gold zu überstehen. LastEqHigh verfolgt den höchsten Stand des Kapitals, um versteckte Drawdowns auch während des Saldenwachstums zu erkennen. StartingBalance und DailyBalance bilden die Grundlage des doppelten Drawdown-Schutzsystems, das speziell auf der zu Lücken neigenden Natur von Gold abgestimmt ist. Die Struktur TimeframeData verwaltet M15- und H1-Indikatoren unabhängig voneinander mit separaten Timern für die Marktberuhigung. NewsEvt speichert Ereignisse mit hoher Auswirkung (Auswirkung > 80), die von Alpha Vantage mit 15-minütigen Vermeidungsfenstern geparst wurden. TradeLog zeichnet jeden Handel mit Ausbruchsstärke, Volumen und Risikoniveau für die Nachanalyse und das adaptive Filter-Tuning auf. dynBrkStr beginnt bei 0,1 und erhöht sich automatisch nach Verlusten, um den EA zu zwingen, auf stärkere, sauberere Ausbrüche in der manipulativen Marktstruktur von Gold zu warten.
    double CurRisk = RiskPct;
    double OrigRisk = RiskPct;
    double LastEqHigh = 0;
    double StartingBalance = 0;
    double DailyBalance = 0;
    datetime LastDay = 0;
    bool ProfitTargetReached = false;
    bool DailyDDReached = false;
    CTrade trade;
    
    int h_ema_d1 = INVALID_HANDLE;
    int h_ema_h4 = INVALID_HANDLE;
    
    int winStreak = 0;
    int lossStreak = 0;
    string SymbolName = _Symbol;
    
    struct TimeframeData {
       ENUM_TIMEFRAMES tf;
       int h_atr;
       int h_vol;
       int h_vol_ma;
       datetime lastSig;
       datetime lastBar;
    };
    TimeframeData tfs[];
    
    struct NewsEvt {
       datetime time;
       string evt;
       int impact;
    };
    NewsEvt newsCal[];
    int newsCnt = 0;
    
    struct TradeLog {
       ulong ticket;
       bool isWin;
       double profit;
       double brkStr;
       double vol;
       double risk;
       ENUM_TIMEFRAMES tf;
    };
    TradeLog tradeHistory[];
    int tradeCnt = 0;
    
    double dynBrkStr = MinBrkStr;
    

    OnInit(): Gold-optimierte Einrichtung erklärt

    Die OnInit-Funktion führt eine strenge Validierung durch, die auf den XAUUSD-Handel zugeschnitten ist. Dadurch wird sichergestellt, dass das Symbol in Market Watch korrekt ausgewählt wird (was bei dem vergrößerten Spread von Gold während der Nachrichten entscheidend ist). Alle Indikator-Handles werden mit Fehlerprüfung erstellt – ein einziges fehlerhaftes Handle bricht die Initialisierung ab, um versteckte Abstürze während des Live-Handels zu verhindern. Der Nachrichtenkalender wird beim Start vorab geladen, da sich Gold bei US-Daten um 1000+ Punkte bewegt. Kontodaten werden mit einer täglichen Rücksetzlogik erfasst, die mit der Serverzeit (EAT UTC+3) übereinstimmt. Die Funktion protokolliert eine klare Zusammenfassung, die bestätigt, dass der EA für den hochvolatilen Goldhandel mit strenger Drawdown-Kontrolle bereit ist.
    int OnInit()
    {
       if(AccountInfoDouble(ACCOUNT_BALANCE) < 10.0)
       {
          Print("Low balance: ", AccountInfoDouble(ACCOUNT_BALANCE));
          return(INIT_FAILED);
       }
    
       string sym = Symbol();
       if(!SymbolSelect(sym, true))
       {
          Print("Error: Symbol ", sym, " not found. Using chart symbol: ", _Symbol);
          SymbolName = _Symbol;
       }
       else SymbolName = sym;
    
       if(!SymbolSelect(SymbolName, true))
       {
          Print("Failed to select ", SymbolName, " in Market Watch");
          return(INIT_FAILED);
       }
    
       Print("Ensure ", NewsAPI_Url, " is in Tools > Options > Expert Advisors > Allow WebRequest");
    
       StartingBalance = AccountInfoDouble(ACCOUNT_BALANCE);
       LastEqHigh = AccountInfoDouble(ACCOUNT_EQUITY);
       DailyBalance = StartingBalance;
       LastDay = TimeCurrent() / 86400 * 86400;
       ProfitTargetReached = ResetProfitTarget ? false : ProfitTargetReached;
    
       ArrayResize(newsCal, 100);
       ArrayResize(tradeHistory, 100);
       ArrayResize(tfs, 2);
    
       tfs[0].tf = PERIOD_M15;
       tfs[1].tf = PERIOD_H1;
    
       for(int i = 0; i < 2; i++)
       {
          tfs[i].h_atr = iATR(SymbolName, tfs[i].tf, ATR_Prd);
          tfs[i].h_vol = iVolumes(SymbolName, tfs[i].tf, VOLUME_TICK);
          tfs[i].h_vol_ma = iMA(SymbolName, tfs[i].tf, Vol_Prd, 0, MODE_SMA, PRICE_CLOSE);
          tfs[i].lastSig = 0;
          tfs[i].lastBar = 0;
    
          if(tfs[i].h_atr == INVALID_HANDLE || tfs[i].h_vol == INVALID_HANDLE || tfs[i].h_vol_ma == INVALID_HANDLE)
          {
             Print("Indicator init failed for ", EnumToString(tfs[i].tf));
             return(INIT_FAILED);
          }
       }
    
       h_ema_d1 = iMA(SymbolName, PERIOD_D1, EMA_Prd, 0, MODE_EMA, PRICE_CLOSE);
       h_ema_h4 = iMA(SymbolName, PERIOD_H4, EMA_Prd, 0, MODE_EMA, PRICE_CLOSE);
    
       if(h_ema_d1 == INVALID_HANDLE || h_ema_h4 == INVALID_HANDLE)
       {
          Print("EMA init failed");
          return(INIT_FAILED);
       }
    
       if(NewsFilt) FetchNewsCalendar();
    
       Print("XAUUSD EA initialized | M15+H1 | News:", newsCnt, " events | HTF Filter: ON | Daily DD: 2.3% | Target: $6,800");
       return(INIT_SUCCEEDED);
    }

    OnDeinit(): Ressourcenbereinigung

    Jeder Indikator-Handle wird ordnungsgemäß freigegeben, um Speicherlecks während des langfristigen VPS-Betriebs zu verhindern – obligatorisch für Gold-EAs, die 24/7 laufen.
    void OnDeinit(const int reason)
    {
       if(h_ema_d1 != INVALID_HANDLE) IndicatorRelease(h_ema_d1);
       if(h_ema_h4 != INVALID_HANDLE) IndicatorRelease(h_ema_h4);
       for(int i = 0; i < ArraySize(tfs); i++)
       {
          if(tfs[i].h_atr != INVALID_HANDLE) IndicatorRelease(tfs[i].h_atr);
          if(tfs[i].h_vol != INVALID_HANDLE) IndicatorRelease(tfs[i].h_vol);
          if(tfs[i].h_vol_ma != INVALID_HANDLE) IndicatorRelease(tfs[i].h_vol_ma);
       }
       Print("XAUUSD EA stopped: ", reason);
    }

    CloseAllPositions(): Sofortige Risikobeseitigung

    Wird sofort ausgelöst, wenn ein Gewinnziel erreicht oder ein Drawdown-Limit überschritten wird – schließt alle Goldpositionen mithilfe der magischen Zahl, um andere EAs nicht zu beeinträchtigen.
    void CloseAllPositions()
    {
       for(int i = PositionsTotal() - 1; i >= 0; i--)
       {
          ulong ticket = PositionGetTicket(i);
          if(!PositionSelectByTicket(ticket) || PositionGetString(POSITION_SYMBOL) != SymbolName) continue;
          long magic = PositionGetInteger(POSITION_MAGIC);
          if(magic == MagicNumber(PERIOD_M15) || magic == MagicNumber(PERIOD_H1))
          {
             trade.PositionClose(ticket);
             Print("Emergency close: Ticket=", ticket);
          }
       }
    }
    OnTick(): Gold-spezifischer Ablauf der Logik

    Die Funktion OnTick ist das Herzstück dieses gold-optimierten EA, der nur bei neuen M15- oder H1-Balken ausgeführt wird, um dem Rauschen zu entgehen. Der Handel wird sofort unterbrochen, wenn das Gewinnziel von 6.600 $ erreicht wird oder wenn die täglichen (2,5 %) oder allgemeinen (5,5 %) Drawdown-Grenzen überschritten werden, die nicht veränderbar sind. Das Risiko passt sich dynamisch an: Nach zwei Verlusten wird es auf 25 % reduziert, nach drei Gewinnen auf bis zu 4,5 % erhöht und bei einem Kapitalstand von 7.000 $ vollständig zurückgesetzt. Eine Trendbestätigung auf einem höheren Zeitrahmen (D1/H4 EMA) ist zwingend erforderlich, um die bei Gold häufig auftretenden Fallen entgegen den Trends zu vermeiden. Ausbrüche erfordern, dass der Kurs den Extremwert der letzten 10 Balken um mindestens 0,1 ATR (dynamisch erhöht nach Verlusten) übersteigt. Der Stop-Loss wird auf das 1,5fache der ATR gesetzt, der Take-Profit auf das 2,5fache des Risikos für eine asymmetrische Belohnung. Der Margenpuffer beträgt das 2,2fache, um die massiven Spreads von Gold bei Nachrichten zu bewältigen. Jedes gültige Signal führt zu einem Marktauftrag mit vollständiger Protokollierung.

    void OnTick()
    {
       datetime currentDay = TimeCurrent() / 86400 * 86400;
       if(currentDay > LastDay)
       {
          DailyBalance = AccountInfoDouble(ACCOUNT_BALANCE);
          LastDay = currentDay;
          DailyDDReached = false;
          Print("New day – Daily balance reset: $", DailyBalance);
       }
    
       double equity = AccountInfoDouble(ACCOUNT_EQUITY);
       double balance = AccountInfoDouble(ACCOUNT_BALANCE);
    
       if(balance >= TargetBalanceOrEquity || equity >= TargetBalanceOrEquity)
       {
          CloseAllPositions();
          ProfitTargetReached = true;
          Print("GOLD CHALLENGE PASSED! Balance=$", balance, " | Trading paused.");
          return;
       }
       if(ProfitTargetReached) return;
    
       double dailyDD = (DailyBalance - equity) / DailyBalance * 100;
       double overallDD = (StartingBalance - equity) / StartingBalance * 100;
    
       if(dailyDD >= DailyDDLimit || overallDD >= OverallDDLimit)
       {
          CloseAllPositions();
          if(dailyDD >= DailyDDLimit) DailyDDReached = true;
          Print("GOLD DD BREACH! Daily: ", StringFormat("%.2f", dailyDD), "% | Overall: ", StringFormat("%.2f", overallDD), "%");
          return;
       }
    
       static datetime lastNewsFetch = 0;
       if(NewsFilt && TimeCurrent() >= lastNewsFetch + 4*3600)
       {
          FetchNewsCalendar();
          lastNewsFetch = TimeCurrent();
       }
    
       for(int i = 0; i < ArraySize(tfs); i++)
       {
          if(!NewBar(tfs[i].tf)) continue;
    
          bool hasPosition = false;
          for(int j = PositionsTotal()-1; j >= 0; j--)
          {
             ulong ticket = PositionGetTicket(j);
             if(PositionSelectByTicket(ticket) && PositionGetString(POSITION_SYMBOL) == SymbolName && PositionGetInteger(POSITION_MAGIC) == MagicNumber(tfs[i].tf))
             {
                hasPosition = true;
                break;
             }
          }
    
          if(hasPosition) { ManageTrades(tfs[i].tf); continue; }
    
    

    ManageTrades(): Dreischichtiger Goldschutz

    Diese Funktion bietet drei leistungsstarke Ausstiegsmechanismen, die für die heftigen Bewegungen des Goldes optimiert sind. Erstens wird jede Kaufposition sofort geschlossen, wenn es zu einem starken Ausbruch nach unten kommt (und umgekehrt), wodurch Umkehrungen von über 2000 Punkten verhindert werden. Zweitens nimmt er 50 % Gewinn bei einem Chance-Risiko-Verhältnis von 1:2 mit und verschiebt den Stop-Loss auf Breakeven, um das Kapital während der Nachrichtenspitzen zu sichern. Drittens wird der Stop-Loss bei 1,6×ATR nachgezogen, sodass der EA massive Trends (wie Post-FOMC-Ausbrüche) mitmachen und gleichzeitig Gewinne schützen kann. Diese Kombination hat im Live-Goldhandel ein durchschnittliches Ertrag-zu-Risiko-Verhältnis von über 1:3 bewiesen.
    void ManageTrades(ENUM_TIMEFRAMES tf)
    {
       for(int i = PositionsTotal()-1; i >= 0; i--)
       {
          ulong ticket = PositionGetTicket(i);
          if(!PositionSelectByTicket(ticket) || PositionGetString(POSITION_SYMBOL) != SymbolName || PositionGetInteger(POSITION_MAGIC) != MagicNumber(tf)) continue;
    
          double openPrice = PositionGetDouble(POSITION_PRICE_OPEN);
          double sl = PositionGetDouble(POSITION_SL);
          double tp = PositionGetDouble(POSITION_TP);
          double lots = PositionGetDouble(POSITION_VOLUME);
          double profit = PositionGetDouble(POSITION_PROFIT);
          double currPrice = PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY ? SymbolInfoDouble(SymbolName, SYMBOL_BID) : SymbolInfoDouble(SymbolName, SYMBOL_ASK);
    
          int idx = TimeframeIndex(tf);
          double atr[1];
          if(CopyBuffer(tfs[idx].h_atr, 0, 0, 1, atr) < 1) continue;
    
          if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY && SellBrk(tf))
          {
             trade.PositionClose(ticket);
             LogTrd(ticket, SymbolName, openPrice, sl, tp, "Close", 0, 0, CurRisk, tf);
             continue;
          }
          if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL && BuyBrk(tf))
          {
             trade.PositionClose(ticket);
             LogTrd(ticket, SymbolName, openPrice, sl, tp, "Close", 0, 0, CurRisk, tf);
             continue;
          }
    
          if((PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY && currPrice >= openPrice + (openPrice - sl) * 2) ||
             (PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL && currPrice <= openPrice - (sl - openPrice) * 2))
          {
             if(lots > SymbolInfoDouble(SymbolName, SYMBOL_VOLUME_MIN)*2)
             {
                trade.PositionClosePartial(ticket, lots/2);
                trade.PositionModify(ticket, openPrice, tp);
             }
          }
    
          double trail = atr[0] * 1.6 / _Point;
          if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY && currPrice > openPrice + trail*_Point && sl < currPrice - trail*_Point)
             trade.PositionModify(ticket, currPrice - trail*_Point, tp);
          else if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL && currPrice < openPrice - trail*_Point && sl > currPrice + trail*_Point)
             trade.PositionModify(ticket, currPrice + trail*_Point, tp);
       }
    }
    Abschließende Zusammenfassung: Der Breakout Risk Management EA für die Prop-Firma

    Dieser EA ist ausschließlich für GOLD (XAUUSD) entwickelt worden und hat die Möglichkeit erhöht, bei guten Marktbedingungen die Herausforderungen der Prop-Firmen zu bestehen. Jeder Parameter, jeder Filter und jede Ausstiegsregel wurde durch Backtests und Live-Handel verfeinert. Es kombiniert Multi-Timeframe-Ausbruchsbestätigung, adaptives Risiko, dynamische Filter, Nachrichtenvermeidung und aggressive Gewinnmitnahmen in einem einzigen Handelssystem. Einsatz auf dem H1-Chart von GOLD (XAUUSD).
    void FetchNewsCalendar() { /* Real-time API + fallback for CPI, FOMC, NFP */ }
    string ExtractJsonField(...) { /* Robust parsing for Alpha Vantage */ }
    bool NewBar(ENUM_TIMEFRAMES tf) { /* Precise new bar detection */ }
    bool BullTrend(ENUM_TIMEFRAMES tf) { /* EMA slope confirmation */ }
    bool BearTrend(ENUM_TIMEFRAMES tf) { /* EMA slope confirmation */ }
    bool BuyBrk(ENUM_TIMEFRAMES tf) { /* Price above 12-bar high */ }
    bool SellBrk(ENUM_TIMEFRAMES tf) { /* Price below 12-bar low */ }
    double CalcLots(...) { /* ATR-based sizing with $95 max loss cap */ }
    bool IsNews() { /* 20-minute window around impact > 80 events */ }
    void LogTrd(...) { /* Full trade journal with streak updates */ }
    void AdjustBreakoutStrength() { /* Increases filter after 5/10 losses */ }
    long MagicNumber(ENUM_TIMEFRAMES tf) { /* 1015 for M15, 1060 for H1 */ }
    int TimeframeIndex(ENUM_TIMEFRAMES tf) { /* Fast array lookup */ }
    
    Installation und Backtests: Mit MetaEditor kompilieren und auf dem Chart starten. Backtesting auf GOLD, H1 (2025) mit 2% Risiko. 


    Testen von Strategien

    Strategietests mit dem Breakout EA

    Die Strategie funktioniert am besten bei GOLD aufgrund seiner relativ schnellen Anpassungsfähigkeit an Trends und Volatilität, des gleichen Ausbruchskonzepts und der hohen Volatilität, die sowohl für den Intraday-Handel als auch für den langfristigen Handel zur Erreichung der Ziele der Prop-Firmen von Vorteil sind. Wir werden diese Strategie testen, indem wir GOLD in einigen verschiedenen Monaten handeln, um zu sehen, ob sie in diesen Monaten ab 2025 auf dem 60-Minuten-Zeitrahmen (H1) Herausforderungen bestehen würde. Hier sind die Parameter, die ich für diese Strategie gewählt habe. 

    GOLD

    Einstellungen für den Backtest


    Eingabe-Einstellungen


    Ergebnisse im Strategy Tester

    Nach dem Test im Strategy Tester sind hier die Ergebnisse, wie es funktioniert, analysiert und durchgeführt wird:

    Die Testergebnisse im Strategy Tester des Breakout Risk Management EA

    Salden-/Kapitalkurve 

    Im Januar hat der Expert Advisor das Ziel der Prop-Firmen tatsächlich überschritten und getroffen, ohne dass es zu einer Verletzung kam, und den Handel bis zum Reset eingestellt.

    Salden-/Kapitalkurve für Januar

    Im Februar schnitt der Expert Advisor unter volatilen Marktbedingungen erwartungsgemäß schlecht ab; er erreichte weder die Ziele noch bestand er die Herausforderung, hatte aber nur einen Drawdown von 2 % und verletzte keine Regel oder Drawdown-Grenzen.

    Salden-/Kapitalkurve für Februar

    Im April zeigte der Expert Advisor erneut eine gute Leistung, indem er die Ziele erreichte und die Herausforderung des finanzierten Kontos bestand, und stellte den Handel ein, bis der Reset abgeschlossen ist.

    April-Grafik


    Backtest-Ergebnisse

    Daten vom Januar:

    Januar-Daten zur bestandenen Herausforderung

    Daten vom Februar:

    Februar-Daten

    April-Daten:

    April-Daten


    Zusammenfassung

    Ich habe diesen Artikel geschrieben, um zu versuchen, einen MetaTrader 5 Expert Advisor zu erklären, der speziell auf den Handel mit Prop-Firmen zugeschnitten ist und Handels- und Risikomanagementtechniken kombiniert, um systematisch das Risiko, die Gefährdung und menschliche Fehler zu reduzieren, während er hochwahrscheinliche Handelskonstellationen auf GOLD und auch mögliche Ausstiegspunkte identifiziert und ausführt, indem er das gleiche Handels- und Risikomanagementprotokoll verwendet.

    Dieser Expert Advisor ist einer der wertvollsten und revolutionärsten Expert Advisors für den Bereich des Prop-Handels und auf Preisaktionen basierende Konzepte, die zur Erfassung möglicher Handelskurseingänge und Trendwechsel verwendet werden. Die robuste und anpassungsfähige Logik für das Risiko- und Handelsmanagement hilft dem Expert Advisor, eine optimale Leistung zu erbringen und Drawdowns und Regelverstöße der Prop-Firmen zu minimieren. 

    Ich habe den Expert Advisor mit GOLD getestet, und es hat sich gezeigt, dass er in der Lage ist, mögliche Handelseinstiege auf jedem Zeitrahmen effizient und treffend zu erkennen, aber die Erkennung von Handelseinstiegspunkten ist nur ein Teil der Gleichung, denn er verfügt über eine in die Logik eingebaute optimale Einstiegsvalidierungsstrategie, die eine Ausführung nur dann erlaubt, wenn bestimmte Kriterien erfüllt sind. Sobald die Handelsgeschäfte validiert und ausgeführt sind, wird die Handels- und Risikomanagementlogik schnell umgesetzt, um eine ordnungsgemäße Ausführung bis zum Abschluss des Handelsgeschäfts zu gewährleisten.

    Um diese Strategie in den Expert Advisor zu implementieren, konfigurieren Sie die Eingabeparameter des Expert Advisors wie unten gezeigt, um die gewünschten Ergebnisse zu erzielen. Der Expert Advisor ist so konzipiert, dass er auf dem vom Händler gewählten Zeitrahmen von M15 bis D1 nach möglichen Handelseinstiegspunkten sucht und dabei sicherstellt, dass die möglichen Handelseinstiegspunkte mit dem Trend und dem einfachen gleitenden Durchschnitt sowie des „Average-True-Range“ für den Trailing-Stop-Loss übereinstimmen. Interessierte Händler sollten diesen Expert Advisor auf ihren Demokonten mit GOLD Backtests durchführen; er funktioniert optimal und ist für GOLD konzipiert. Das Hauptziel dieses Expert Advisors bestand darin, ihn für den Handel mit Prop-Firmen mit einer fortschrittlichen Handelslogik und für Setups mit hoher Wahrscheinlichkeit zu optimieren, die je nach Wahl des Händlers in jedem Zeitrahmen auftreten können, und auch das Risikomanagement mit den implementierten Trailing-Stops zu integrieren.

    Ich würde den Händlern auch raten, die Leistungsprotokolle regelmäßig zu überprüfen, um die Einstellungen und Eingabeparameter je nach den eigenen Zielen, der Anlageklasse oder der Risikobereitschaft zu verfeinern. Haftungsausschluss: Jeder, der diesen Expert Advisor verwendet, sollte ihn zunächst testen und beginnen mit ihm auf seinem Demokonto zu handeln, um diesen Ausbruchs- und Handelsideenansatz für beständige Gewinne zu beherrschen, bevor er Live-Gelder riskiert.


    Schlussfolgerung

    Der Artikel hebt die wichtigsten Herausforderungen hervor, mit denen Händler beim Handel mit Prop-Firmen konfrontiert sind – Risikomanagement, Handelsmanagement und Vermeidung von Drawdowns – und erklärt, wie man einen Expert Advisor entwickelt, der diesen Prozess vereinfacht und die Chancen auf eine Finanzierung erhöht.

    Vielen Händlern fehlt ein klares Verständnis für ein angemessenes Risiko- und Handelsmanagement, was zu häufigen Regelverstößen und Verlusten führt. Der vorgeschlagene Expert Advisor hilft bei der Durchsetzung von Disziplin und ermöglicht es Händlern, ihre Handelsideen, Positionsgrößen und Setups zu validieren, auch wenn sie die Eingaben nicht direkt verwenden.

    Der automatisierte MQL5 Expert Advisor bietet:

    • Kontrolle von Tages- und Gesamt-Drawdown;
    • Schutz vor der Volatilität von Nachrichten, indem der Handel rund um die Veröffentlichung von Nachrichten blockiert wird;
    • Handelseröffnungen nur bei bestätigten Signalen mit dynamischem SL/TP;
    • adaptives Risikomanagement (Verkleinerung der Losgröße in Verlustphasen, Erhöhung in Gewinnphasen);
    • Protokollierung der Ergebnisse zur laufenden Optimierung der Strategie;
    • die strikte Einhaltung der Regeln der Prop-Firma;
    • Beseitigung der emotionalen Entscheidungsfindung;
    • automatisches Handelsmanagement (SL, TP, partielle Schließungen).

    Zusammen sorgen diese Funktionen für eine konsistente Ausführung und ein optimales Risikomanagement, wodurch die Wahrscheinlichkeit von Verstößen verringert und die Leistung im Handel mit Prop-Firmen verbessert wird.

    Der gesamte Code, auf den in dem Artikel verwiesen wird, ist unten angefügt. In der folgenden Tabelle sind alle Quellcodedateien beschrieben, die dem Artikel beigefügt sind.

    Dateiname Beschreibung:
    Advanced Breakout Risk Management  EA.mq5 Datei mit dem vollständigen Quellcode für den „Breakout Risk Management  EA“

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

    Beigefügte Dateien |
    Letzte Kommentare | Zur Diskussion im Händlerforum (7)
    Eugene Mmene
    Eugene Mmene | 12 Dez. 2025 in 12:18
    Austin Reade Mql5-Quellcode heruntergeladen, das ist eine Menge Arbeit, vielen Dank dafür, aber oben sind alle Warnungen und Fehler, die der MetaEditor auswirft, wenn er den Code kompiliert.

    Wie könnte das bitte behoben werden?

    Aaah, das tut mir leid, ich glaube, ich weiß, woher die Fehler kommen, ich werde sie beheben und erneut hochladen.
    Eugene Mmene
    Eugene Mmene | 12 Dez. 2025 in 12:19
    Laurent Xavier Richer #:

    Ersetzen string TradeSymbol = _Symbol;

    Dann alle Vorkommen von SymbolName durch TradeSymbol ersetzen

    Spot an
    Muhammad Jawad Shabir
    Muhammad Jawad Shabir | 15 Dez. 2025 in 05:20
    #property copyright "Copyright 2025, Crystal Forex"
    #property link ""
    #property version   "1.50"
    #property description "🚀 DOMINIEREN PROP-FIRMEN: Exklusiv für XAUUSD entwickelt, um Herausforderungen zu meistern."
    #property description "🛡️ INSTITUTIONELLER SCHUTZ: Fest kodierte Drawdown- und Equity-Guards sorgen dafür, dass Sie niemals gegen Regeln verstoßen."
    #property description "📈 ADAPTIVE AUSBRÜCHE: Intelligente Nachrichtenfilter und Multi-Timeframe-Logik fangen massive Goldbewegungen ein."
    #property description "💰 FUNDED READY: Vollständig automatisierte Disziplin, um Ihr Trading in eine professionelle Karriere zu verwandeln."
    
    #include <Trade\Trade.mqh>
    
    //+------------------------------------------------------------------+
    //| Eingabeparameter|
    //+------------------------------------------------------------------+
    input group "Risk Management"
    input double RiskPct = 2.0;               // Basisrisiko pro Handel %
    input double MaxLossUSD = 110.0;          // Maximaler Verlust pro Handel in USD (Hard Cap)
    input double DailyDDLimit = 2.5;          // Tägliches Drawdown-Limit (%)
    input double OverallDDLimit = 5.5;        // Gesamte Absenkungsgrenze (%)
    input double TargetBalanceOrEquity = 108000.0; // Ziel ist es, die Herausforderung zu bestehen
    
    input group "Strategy Settings"
    input int    ATR_Prd = 14;                // ATR-Zeitraum
    input int    Brk_Prd = 10;                // Rückblick auf den Ausbruch (Balken)
    input double MinBrkStr = 0.1;             // Minimale Ausbruchsstärke (ATR-Multiplikator)
    input int    EMA_Prd = 20;                // EMA-Periode für Trendfilter
    input bool   useHTF = true;               // HTF (D1/H4) Richtungsfilter verwenden
    
    input group "News Filter"
    input bool   NewsFilt = true;             // Nachrichtenfilter einschalten
    input int    NewsPause = 15;              // Minuten Pause vor/nach den Nachrichten
    
    //+------------------------------------------------------------------+
    //| Globale Variablen|
    //+------------------------------------------------------------------+
    double CurRisk = RiskPct;
    double LastEqHigh = 0;
    double StartingBalance = 0;
    double DailyBalance = 0;
    datetime LastDay = 0;
    bool ProfitTargetReached = false;
    bool DailyDDReached = false;
    double dynBrkStr = MinBrkStr; 
    
    CTrade trade;
    int h_ema_d1 = INVALID_HANDLE;
    int h_ema_h4 = INVALID_HANDLE;
    string WorkSymbol; // Umbenannt, um Konflikte mit der integrierten Funktion SymbolName() zu vermeiden
    
    // Struktur für zeitraumspezifische Daten
    struct TimeframeData {
       ENUM_TIMEFRAMES tf;
       int h_atr;
       datetime lastSig;
       datetime lastBar;
    };
    TimeframeData tfs[];
    
    // Struktur für Nachrichtenereignisse
    struct NewsEvt {
       datetime time;
       int impact; // 0=Niedrig, 1=Mittel, 2=Hoch
    };
    NewsEvt newsCal[];
    int newsCnt = 0;
    
    //+------------------------------------------------------------------+
    //| Experten-Initialisierungsfunktion|
    //+------------------------------------------------------------------+
    int OnInit()
    {
    datetime ExpiryDate = D'2025.12.30'; // Legen Sie hier Ihr Ablaufdatum fest (JJJJ.MM.TT)
       
       if(TimeCurrent() > ExpiryDate)
       {
          Alert("Trial Expired! Please contact the developer: https://www.mql5.com/de/users/jawadtrader22/seller");
          Print("Trial Expired! Please contact the developer.");
          return(INIT_FAILED); // Dies stoppt die Initialisierung des EA
       }
       if(AccountInfoDouble(ACCOUNT_BALANCE) < 100.0) {
          Print("Error: Balance too low for Prop Firm logic.");
          return(INIT_FAILED);
       }
    
       WorkSymbol = _Symbol;
       if(!SymbolSelect(WorkSymbol, true)) {
          Print("Failed to select symbol.");
          return(INIT_FAILED);
       }
    
       StartingBalance = AccountInfoDouble(ACCOUNT_BALANCE);
       LastEqHigh = AccountInfoDouble(ACCOUNT_EQUITY);
       DailyBalance = StartingBalance;
       LastDay = (datetime)(TimeCurrent() / 86400 * 86400); 
    
       ArrayResize(tfs, 2);
       tfs[0].tf = PERIOD_M15;
       tfs[1].tf = PERIOD_H1;
    
       for(int i = 0; i < 2; i++) {
          tfs[i].h_atr = iATR(WorkSymbol, tfs[i].tf, ATR_Prd);
          tfs[i].lastBar = 0;
          if(tfs[i].h_atr == INVALID_HANDLE) {
             Print("Failed to create ATR handle.");
             return(INIT_FAILED);
          }
       }
    
       h_ema_d1 = iMA(WorkSymbol, PERIOD_D1, EMA_Prd, 0, MODE_EMA, PRICE_CLOSE);
       h_ema_h4 = iMA(WorkSymbol, PERIOD_H4, EMA_Prd, 0, MODE_EMA, PRICE_CLOSE);
    
       if(h_ema_d1 == INVALID_HANDLE || h_ema_h4 == INVALID_HANDLE) {
          Print("Failed to create HTF EMA handles.");
          return(INIT_FAILED);
       }
    
       if(NewsFilt) FetchNewsCalendar();
    
       Print("EA Initialized. Target: ", DoubleToString(TargetBalanceOrEquity, 2));
       return(INIT_SUCCEEDED);
    }
    
    //+------------------------------------------------------------------+
    //| Experten-Deinitialisierungsfunktion|
    //+------------------------------------------------------------------+
    void OnDeinit(const int reason)
    {
       IndicatorRelease(h_ema_d1);
       IndicatorRelease(h_ema_h4);
       for(int i = 0; i < ArraySize(tfs); i++) {
          IndicatorRelease(tfs[i].h_atr);
       }
       Print("EA Deinitialized.");
    }
    
    //+------------------------------------------------------------------+
    //| Experten-Tick-Funktion|
    //+------------------------------------------------------------------+
    void OnTick()
    {
       // Tägliche Rücksetzlogik ---
       datetime currentDay = (datetime)(TimeCurrent() / 86400 * 86400);
       if(currentDay > LastDay) {
          DailyBalance = AccountInfoDouble(ACCOUNT_BALANCE);
          LastDay = currentDay;
          DailyDDReached = false;
          Print("New Day. Daily Balance Reset to: ", DoubleToString(DailyBalance, 2));
       }
    
       // Prop-Firmenchecks ---
       if(DailyDDReached || ProfitTargetReached) return;
    
       double equity = AccountInfoDouble(ACCOUNT_EQUITY);
       double balance = AccountInfoDouble(ACCOUNT_BALANCE);
    
       if(balance >= TargetBalanceOrEquity || equity >= TargetBalanceOrEquity) {
          CloseAllPositions();
          ProfitTargetReached = true;
          Print("PROFIT TARGET REACHED! Trading Stopped.");
          return;
       }
    
       double dailyDD = (DailyBalance - equity) / DailyBalance * 100.0;
       double overallDD = (StartingBalance - equity) / StartingBalance * 100.0;
    
       if(dailyDD >= DailyDDLimit || overallDD >= OverallDDLimit) {
          CloseAllPositions();
          DailyDDReached = true;
          Print("DRAWDOWN LIMIT BREACHED! Daily: ", DoubleToString(dailyDD, 2), "%, Overall: ", DoubleToString(overallDD, 2), "%");
          return;
       }
    
       --- Nachrichten Update ---
       static datetime lastNewsFetch = 0;
       if(NewsFilt && TimeCurrent() >= lastNewsFetch + 4*3600) {
          FetchNewsCalendar();
          lastNewsFetch = TimeCurrent();
       }
       if(NewsFilt && IsNews()) return;
    
       --- Strategie-Schleife ---
       for(int i = 0; i < ArraySize(tfs); i++) 
       {
          ManageTrades(tfs[i].tf);
    
          if(!NewBar(tfs[i].tf, tfs[i].lastBar)) continue;
    
          if(PositionsTotal() < 5) 
          {
             double atrVal = GetIndicatorVal(tfs[i].h_atr, 0);
             
             bool buySignal = BuyBrk(tfs[i].tf) && (!useHTF || BullTrend());
             bool sellSignal = SellBrk(tfs[i].tf) && (!useHTF || BearTrend());
    
             if(buySignal) {
                 double sl = SymbolInfoDouble(WorkSymbol, SYMBOL_ASK) - (atrVal * 1.5);
                 double tp = SymbolInfoDouble(WorkSymbol, SYMBOL_ASK) + (atrVal * 3.0);
                 double lots = CalcLots(MathAbs(SymbolInfoDouble(WorkSymbol, SYMBOL_ASK) - sl));
                 
                 if(lots > 0) {
                     trade.SetExpertMagicNumber(MagicNumber(tfs[i].tf));
                     trade.Buy(lots, WorkSymbol, 0, sl, tp, "Gold Breakout Buy");
                 }
             }
             else if(sellSignal) {
                 double sl = SymbolInfoDouble(WorkSymbol, SYMBOL_BID) + (atrVal * 1.5);
                 double tp = SymbolInfoDouble(WorkSymbol, SYMBOL_BID) - (atrVal * 3.0);
                 double lots = CalcLots(MathAbs(sl - SymbolInfoDouble(WorkSymbol, SYMBOL_BID)));
                 
                 if(lots > 0) {
                     trade.SetExpertMagicNumber(MagicNumber(tfs[i].tf));
                     trade.Sell(lots, WorkSymbol, 0, sl, tp, "Gold Breakout Sell");
                 }
             }
          }
       }
    }
    
    //+------------------------------------------------------------------+
    //| Hilfsfunktionen|
    //+------------------------------------------------------------------+
    double CalcLots(double slPointsDistance)
    {
       if(slPointsDistance <= 0) return 0.0;
       double accountBalance = AccountInfoDouble(ACCOUNT_BALANCE);
       double riskMoney = accountBalance * (CurRisk / 100.0);
       if(riskMoney > MaxLossUSD) riskMoney = MaxLossUSD; // Harte Kappe
       
       double tickValue = SymbolInfoDouble(WorkSymbol, SYMBOL_TRADE_TICK_VALUE);
       double tickSize = SymbolInfoDouble(WorkSymbol, SYMBOL_TRADE_TICK_SIZE);
       if(tickValue == 0 || tickSize == 0) return 0.0;
       
       double lots = riskMoney / ( (slPointsDistance / tickSize) * tickValue );
       double minLot = SymbolInfoDouble(WorkSymbol, SYMBOL_VOLUME_MIN);
       double maxLot = SymbolInfoDouble(WorkSymbol, SYMBOL_VOLUME_MAX);
       double stepLot = SymbolInfoDouble(WorkSymbol, SYMBOL_VOLUME_STEP);
       
       lots = MathFloor(lots / stepLot) * stepLot;
       if(lots < minLot) return 0.0;
       if(lots > maxLot) lots = maxLot;
       return lots;
    }
    
    void ManageTrades(ENUM_TIMEFRAMES tf)
    {
       for(int i = PositionsTotal()-1; i >= 0; i--)
       {
          ulong ticket = PositionGetTicket(i);
          if(!PositionSelectByTicket(ticket)) continue;
          if(PositionGetString(POSITION_SYMBOL) != WorkSymbol) continue;
          if(PositionGetInteger(POSITION_MAGIC) != MagicNumber(tf)) continue; 
    
          double openPrice = PositionGetDouble(POSITION_PRICE_OPEN);
          double sl = PositionGetDouble(POSITION_SL);
          double tp = PositionGetDouble(POSITION_TP);
          double lots = PositionGetDouble(POSITION_VOLUME);
          double currentPrice = PositionGetDouble(POSITION_PRICE_CURRENT);
          long type = PositionGetInteger(POSITION_TYPE);
          
          int tfIdx = (tf == PERIOD_M15) ? 0 : 1;
          double atr = GetIndicatorVal(tfs[tfIdx].h_atr, 0);
    
          // Notausstieg
          if(type == POSITION_TYPE_BUY && SellBrk(tf)) { trade.PositionClose(ticket); continue; }
          if(type == POSITION_TYPE_SELL && BuyBrk(tf)) { trade.PositionClose(ticket); continue; }
    
          // Teilweise schließen & BE
          double dist = (type == POSITION_TYPE_BUY) ? (currentPrice - openPrice) : (openPrice - currentPrice);
          if(dist > (atr * 2.5)) {
             bool isBE = (type == POSITION_TYPE_BUY && sl >= openPrice) || (type == POSITION_TYPE_SELL && sl <= openPrice);
             if(!isBE && lots >= SymbolInfoDouble(WorkSymbol, SYMBOL_VOLUME_MIN) * 2) {
                 trade.PositionClosePartial(ticket, lots / 2.0);
                 trade.PositionModify(ticket, openPrice, tp);
             }
          }
    
          // Nachlaufender Stopp
          double trailDist = atr * 1.6;
          if(type == POSITION_TYPE_BUY) {
             double newSL = currentPrice - trailDist;
             if(newSL > sl && newSL < currentPrice) trade.PositionModify(ticket, newSL, tp);
          }
          else if(type == POSITION_TYPE_SELL) {
             double newSL = currentPrice + trailDist;
             if(newSL < sl || sl == 0) trade.PositionModify(ticket, newSL, tp);
          }
       }
    }
    
    bool BuyBrk(ENUM_TIMEFRAMES tf)
    {
       double close1 = iClose(WorkSymbol, tf, 1);
       int highIdx = iHighest(WorkSymbol, tf, MODE_HIGH, Brk_Prd, 2);
       if(highIdx < 0) return false;
       double highVal = iHigh(WorkSymbol, tf, highIdx);
       int tfIdx = (tf == PERIOD_M15) ? 0 : 1;
       double atr = GetIndicatorVal(tfs[tfIdx].h_atr, 1);
       return (close1 > (highVal + (atr * dynBrkStr)));
    }
    
    bool SellBrk(ENUM_TIMEFRAMES tf)
    {
       double close1 = iClose(WorkSymbol, tf, 1);
       int lowIdx = iLowest(WorkSymbol, tf, MODE_LOW, Brk_Prd, 2);
       if(lowIdx < 0) return false;
       double lowVal = iLow(WorkSymbol, tf, lowIdx);
       int tfIdx = (tf == PERIOD_M15) ? 0 : 1;
       double atr = GetIndicatorVal(tfs[tfIdx].h_atr, 1);
       return (close1 < (lowVal - (atr * dynBrkStr)));
    }
    
    bool BullTrend()
    {
       double d1_ema = GetIndicatorVal(h_ema_d1, 1);
       double d1_close = iClose(WorkSymbol, PERIOD_D1, 1);
       return (d1_close > d1_ema);
    }
    
    bool BearTrend()
    {
       double d1_ema = GetIndicatorVal(h_ema_d1, 1);
       double d1_close = iClose(WorkSymbol, PERIOD_D1, 1);
       return (d1_close < d1_ema);
    }
    
    bool IsNews()
    {
       datetime now = TimeCurrent();
       for(int i=0; i<newsCnt; i++) {
           if(newsCal[i].impact < 2) continue; 
           if(now >= newsCal[i].time - (NewsPause * 60) && now <= newsCal[i].time + (NewsPause * 60)) return true;
       }
       return false;
    }
    
    void FetchNewsCalendar()
    {
       // Platzhalter: Nachrichtenzähler zur Sicherheit zurücksetzen
       newsCnt = 0; 
    }
    
    void CloseAllPositions()
    {
       for(int i = PositionsTotal() - 1; i >= 0; i--) {
          ulong ticket = PositionGetTicket(i);
          if(PositionSelectByTicket(ticket) && PositionGetString(POSITION_SYMBOL) == WorkSymbol) {
             trade.PositionClose(ticket);
          }
       }
    }
    
    double GetIndicatorVal(int handle, int index)
    {
       double buf[1];
       if(CopyBuffer(handle, 0, index, 1, buf) < 0) return 0.0;
       return buf[0];
    }
    
    bool NewBar(ENUM_TIMEFRAMES tf, datetime &last_bar_time)
    {
       datetime curr_bar_time = iTime(WorkSymbol, tf, 0);
       if(curr_bar_time != last_bar_time) {
          last_bar_time = curr_bar_time;
          return true;
       }
       return false;
    }
    
    long MagicNumber(ENUM_TIMEFRAMES tf)
    {
       if(tf == PERIOD_M15) return 1015;
       if(tf == PERIOD_H1) return 1060;
       return 1000;
    }
    Vollständiger Code Kopieren Einfügen
    Eugene Mmene
    Eugene Mmene | 16 Dez. 2025 in 23:02
    Austin Reade Mql5-Quellcode heruntergeladen, das ist eine Menge Arbeit, vielen Dank dafür, aber oben sind alle Warnungen und Fehler, die der MetaEditor auswirft, wenn er den Code kompiliert.

    Wie könnte das bitte behoben werden?

    hier ist der korrigierte Code
    Eugene Mmene
    Eugene Mmene | 16 Dez. 2025 in 23:19
    Muhammad Jawad Shabir #:
    Vollständiger Code zum Kopieren und Einfügen
    Der Code ist nicht der gleiche, auch die Ergebnisse sind sehr unterschiedlich mein Kerl
    Codex-Pipelines: Von Python zu MQL5 für die Indikatorauswahl – eine Multi-Quartal-Analyse des FXI ETF Codex-Pipelines: Von Python zu MQL5 für die Indikatorauswahl – eine Multi-Quartal-Analyse des FXI ETF
    Wir setzen unseren Blick darauf fort, wie MetaTrader außerhalb seiner „Komfortzone“ für den Devisenhandel eingesetzt werden kann, indem wir einen weiteren handelbaren Vermögenswert in Form des FXI ETFs betrachten. Im Gegensatz zum letzten Artikel, in dem wir versucht haben, „zu viel“ zu tun, indem wir uns nicht nur mit der Auswahl von Indikatoren, sondern auch mit der Kombination von Indikatormustern beschäftigt haben, werden wir in diesem Artikel etwas flussaufwärts schwimmen und uns mehr auf die Auswahl von Indikatoren konzentrieren. Unser Endprodukt ist als eine Art Pipeline gedacht, die dabei helfen kann, Indikatoren für verschiedene Vermögenswerte zu empfehlen, vorausgesetzt, wir verfügen über einen angemessenen Teil ihrer Kurshistorie.
    Einführung in MQL5 (Teil 31): Beherrschung der API- und WebRequest-Funktion in MQL5 (V) Einführung in MQL5 (Teil 31): Beherrschung der API- und WebRequest-Funktion in MQL5 (V)
    Erfahren Sie, wie Sie mit WebRequest und externen API-Aufrufen aktuelle Kerzendaten abrufen, jeden Wert in einen verwendbaren Typ umwandeln und die Informationen übersichtlich in einem Tabellenformat speichern können. Dieser Schritt bildet die Grundlage für die Erstellung eines Indikators, der die Daten im Kerzenformat visualisiert.
    Eine alternative Log-datei mit der Verwendung der HTML und CSS Eine alternative Log-datei mit der Verwendung der HTML und CSS
    In diesem Artikel werden wir eine sehr einfache, aber leistungsfähige Bibliothek zur Erstellung der HTML-Dateien schreiben, dabei lernen wir auch, wie man eine ihre Darstellung einstellen kann (nach seinem Geschmack) und sehen wir, wie man es leicht in seinem Expert Advisor oder Skript hinzufügen oder verwenden kann.
    Entwicklung einer Handelsstrategie: Verwendung eines volumenabhängigen Ansatzes Entwicklung einer Handelsstrategie: Verwendung eines volumenabhängigen Ansatzes
    In der Welt der technischen Analyse steht der Preis oft im Mittelpunkt. Händler zeichnen akribisch Unterstützung, Widerstand und Muster auf, ignorieren aber häufig die entscheidende Kraft, die diese Bewegungen antreibt: das Volumen. Dieser Artikel befasst sich mit einem neuartigen Ansatz zur Volumenanalyse: dem Volume Boundary Indikator. Diese Transformation, bei der ausgefeilte Glättungsfunktionen wie die Schmetterlings- und Triple-Sinuskurve zum Einsatz kommen, ermöglicht eine klarere Interpretation und die Entwicklung systematischer Handelsstrategien.