English Русский 日本語
preview
Vom Neuling zum Experten: Automatisierung der Handelsdisziplin mit einem MQL5 Risk Enforcement EA

Vom Neuling zum Experten: Automatisierung der Handelsdisziplin mit einem MQL5 Risk Enforcement EA

MetaTrader 5Beispiele |
11 0
Clemence Benjamin
Clemence Benjamin

Inhalt

  1. Einführung
  2. Umsetzung
  3. Tests
  4. Schlussfolgerung
  5. Wichtige Lektionen
  6. Anlagen


Einführung

Jeder Händler kennt die Regeln – begrenzen Sie Ihre Verluste, schützen Sie Ihre Gewinne und riskieren Sie nie mehr als einen bestimmten Prozentsatz Ihres Kapitals. Doch in der Hitze des Gefechts – bei Marktschwankungen, einer Reihe von Verlusten oder der Gier nach einer Glückssträhne – sind diese Regeln oft das erste Opfer. Diese Diskrepanz zwischen intellektueller Strategie und praktischer Umsetzung ist kein Fehler der Analyse, sondern eine grundlegende Herausforderung der menschlichen Psychologie. Das ist der Hauptgrund, warum disziplinierte Backtests häufig in undisziplinierten Live-Handel ausarten.

Dieser Artikel bietet eine endgültige MQL5 algorithmische Handelslösung für dieses psychologische Problem. Wir gehen über die Theorie und einfache Hinweise hinaus, um einen automatisierten, objektiven und unnachgiebigen Durchsetzer zu entwickeln: einen Risk Enforcement Expert Advisor (EA) für MetaTrader 5. Im Gegensatz zu signalgenerierenden EAs fungiert dieses Dienstprogramm als grundlegende Schutzschicht. Sie sagt uns nicht, wann wir handeln sollen, sondern sorgt dafür, dass wir streng innerhalb der von uns festgelegten Leitplanken handeln.

Das manuelle Risikomanagement ist anfällig für kritische Fehler:

  1. Emotionale Überlagerungen: „Dieser Verlust wird immer größer, aber er muss sich bald umkehren“ (Sie deaktivieren den Stop-Loss).
  2. Kompensationshandel: „Ich muss diesen Verlust sofort wieder ausgleichen“ (Verdoppelung der Positionsgröße bei der nächsten Intuition).
  3. Aufsicht und Müdigkeit: Sie vergessen, offene Positionen zu berücksichtigen, bevor Sie einen neuen Handel eingehen, und überschreiten Ihr maximales Risiko.
  4. Skalenbrüche: Ein erfolgreicher Tag verwandelt sich in einen übertriebenen Handelsrausch, der Gewinne durch unkontrollierte Provisionen und Slippage zunichte macht.

Unser Lösungsvorschlag

In dieser Diskussion werden wir einen Expertenratgeber entwickeln, der subjektive Regeln in ausführbaren Code umwandelt. Dieser Risk Enforcer fungiert als Überwachungsinstanz im Hintergrund, die in Echtzeit jede Handelsaktion und den Gesamtstatus des Kontos überprüft. Ihre Hauptaufgabe ist die Prävention und der Schutz.

Zentrale Durchsetzungsmechanismen:

  1. Pre-Trade-Validierung: Abfangen und Blockieren jeder neuen Auftragsanforderung, die gegen die von Ihnen festgelegten Regeln verstößt (z. B. übermäßige Losgröße, unzulässige Handelszeiten, Überschreitung der maximal zulässigen gleichzeitigen Handelsgeschäfte).
  2. Aktive Kontobeobachtung: Kontinuierliche Überwachung des Live-Portfolios. Wenn der kumulierte Tagesverlust, der Wochengewinn oder ein anderer definierter Schwellenwert überschritten wird, werden nicht nur neue Geschäfte blockiert, sondern auch bestehende Positionen aktiv geschlossen, um das Risiko sofort zu neutralisieren.
  3. Multi-Zeitrahmen & Multi-Dimensionale Grenzen: Über einfache Stop-Losses pro Handel hinausgehen und ganzheitliche Limits einführen: Täglicher Verlust/Gewinn, wöchentlicher Verlust/Gewinn, maximaler Drawdown vom Höchststand der Aktie, konsekutives Verlustlimit und symbolspezifisches Risiko

Vorteile dieser Diskussion

Am Ende dieser Implementierung werden wir ein leistungsfähiges professionelles Werkzeug aufgebaut und, was noch wichtiger ist, Ihre MQL5-Kenntnisse in wichtigen Bereichen vertieft haben:

  1. Erweiterte Handels- und Kontenschnittstellen: Beherrschen Sie die Klassen PositionInfo, OrderInfo, HistoryOrders und AccountInfo, um die Handelsumgebung programmatisch zu überprüfen.
  2. Ereignisbehandlung in Echtzeit: Implementieren Sie Logik in OnTick(), OnTradeTransaction() und OnChartEvent(), um eine reaktionsschnelle, ereignisgesteuerte Überwachung zu erstellen.
  3. Robuste Zustandsverwaltung: Lernen Sie, globale Variablen und Dateioperationen zu verwenden, um den Risikostatus über Neustarts der MT5-Plattform hinweg beizubehalten und sicherzustellen, dass die Regeln nie vergessen werden.
  4. Professionelle EA-Struktur: Entwerfen wir einen nicht-signalbasierten Hilfs-EA mit einer übersichtlichen Konfigurationsschnittstelle, umfassender Protokollierung und Nutzerfeedback über Charts und Warnmeldungen.
  5. Von der Theorie zur Praxis: Überbrückung der Kluft zwischen dem Verständnis von Risikomanagementkonzepten und ihrer Umsetzung in funktionale, automatisierte Systeme.

Die heutige Entwicklung ist die wichtigste Ebene Ihres Handelssystems. Sie stellt sicher, dass unser strategischer Vorsprung, sei es durch manuelle Ermessensentscheidungen oder durch andere automatisierte Systeme, in einem Rahmen des Überlebens ausgeführt wird. Sie macht Disziplin nicht zu einem Akt des Willens, sondern zu einem Standardzustand unserer Plattform.

Gehen wir nun vom Konzept zum Code über, wo wir dieses System Zeile für Zeile aufbauen und sicherstellen, dass jede Regel, die wir aufstellen, eine Regel ist, die der Markt nicht brechen kann, weil nicht mehr das Gefühl die Kontrolle hat, sondern der Algorithmus am Werk ist.

Der folgende Abschnitt enthält die ausführliche Code-Implementierung, in der wir den Risk Enforcer Modul für Modul aufbauen werden.


Umsetzung

Schritt 1: Schaffung der Grundlagen – Kopfzeilen, Eingaben und Statusverwaltung

Jede professionelle EA beginnt mit einer soliden Grundlage. Wir beginnen mit der Deklaration von Abhängigkeiten, der Erstellung einer nutzerkonfigurierbaren Schnittstelle und der Einrichtung eines persistenten Speichersystems für kritische Variablen.

Wichtige Entwicklungskonzepte:

1. Einbinden der Standardbibliothek (#include): Wir nutzen die integrierten Bibliotheken von MetaTrader 5. Der Header von „Trade“ bietet die CTrade-Klasse für die Ausführung von Aufträgen, während PositionInfo uns die CPositionInfo-Klasse zur Verfügung stellt, um offene Positionen zu überprüfen. Die ChartObjectsTxtControls-Kopfzeile ist entscheidend für die Erstellung unseres interaktiven Bedienfelds direkt im Charts.

2. Nutzer-Eingabeparameter (input): Diese Richtlinien erstellen das Einstellungsfenster des EA. Ein professionelles Werkzeug bietet eine granulare Kontrolle. Hier definieren wir mehrstufige Limits (täglich, wöchentlich, monatlich), Verhaltensschalter (wie InpAutoCloseOnStop) und operative Kontrollen (wie InpMaxPositionSize). Jede wird mit einer sinnvollen Voreinstellung initialisiert.

3. Persistenter globaler Zustand (string GV_...): Der Speicher eines EA wird bei der Neuinitialisierung gelöscht. Um den Status (wie z.B. den aktuellen P/L oder den Blockgrund) über Neustarts des MetaTrader 5 hinweg zu erhalten, verwenden wir globale Variablen. Die eindeutigen Stringnamen (z. B. „RE_DailyPL“) dienen als Schlüssel zum Speichern und Abrufen von Doppelwerten im globalen Cache des Terminals. Dies ist eine grundlegende Technik für zustandsabhängige Expertenberater.

//+------------------------------------------------------------------+
//|                                         RiskEnforcementSystem.mq5|
//|                                 Copyright 2025, Clemence Benjamin|
//+------------------------------------------------------------------+
#property copyright "2025 Clemence Benjamin"
#property description "A system that helps trading discipline by controlling risk based on set measures"
#property version   "1.00"
#property strict

#include <Trade/Trade.mqh>
#include <Trade/PositionInfo.mqh>
#include <ChartObjects/ChartObjectsTxtControls.mqh>

CTrade trade;
CPositionInfo positionInfo;

//----------------- Inputs --------------------------------------------
input double InpDailyProfitLimit   = 100.0;   // Daily Profit Limit ($)
input double InpDailyLossLimit     = -300.0;  // Daily Loss Limit ($)
input double InpWeeklyProfitLimit  = 1000.0;  // Weekly Profit Limit ($)
input double InpWeeklyLossLimit    = -1000.0; // Weekly Loss Limit ($)
input double InpMonthlyProfitLimit = 5000.0;  // Monthly Profit Limit ($)
input double InpMonthlyLossLimit   = -5000.0; // Monthly Loss Limit ($)
input bool   InpCountFloatingPL    = true;    // Include open position P/L in limits
input bool   InpAutoCloseOnStop    = true;    // Close positions when a limit is hit
// ... (Additional inputs for Consecutive Loss, Drawdown, Position Size, etc.)

//----------------- Globals & Names ----------------------------------
string GV_ENGAGED           = "RE_Engaged";        // 1.0 if EA is actively enforcing
string GV_ALLOW             = "RE_AllowTrading";   // 1.0 if trading is currently permitted
string GV_DAILY_PL          = "RE_DailyPL";        // Running total of today's profit/loss
string GV_DAILY_PROF        = "RE_DailyProfitLimit"; // Stores the daily profit limit
string GV_DAILY_LOSS        = "RE_DailyLossLimit";   // Stores the daily loss limit
string GV_BLOCK_REASON      = "RE_BlockReason";    // Code indicating why trading is blocked
string GV_LAST_BLOCK_CHECK  = "RE_LastBlockCheck"; // Timestamp of last block enforcement
// ... (Additional global variable identifiers)

Schritt 2: Die Control Center-Initialisierung (OnInit)

Die Funktion OnInit() ist der Konstruktor des EA. Er wird einmal beim Start ausgeführt und ist für die Vorbereitung des Systems zuständig. Ein professionelles OnInit ist defensiv und stellt sicher, dass kein erforderlicher Zustand fehlt, und ist vollständig mit Protokollen instrumentiert.

Wichtige Entwicklungskonzepte:

1. Zustandsüberprüfung und Initialisierung: Wir verwenden GlobalVariableCheck(), um festzustellen, ob eine Variable (wie GV_ENGAGED) bereits aus einem früheren Lauf existiert. Wenn nicht, wird sie mit GlobalVariableSet() erstellt, wobei die Nutzereingabe (InpAutoEngageOnStart) oder eine sichere Vorgabe verwendet wird. Dadurch wird verhindert, dass der Status des Nutzers bei jedem Neustart des EA zurückgesetzt wird.

2. Einrichtung des Protokollierungssystems: Verantwortliche Systeme müssen ihre Aktionen protokollieren. Wir öffnen (oder erstellen) eine CSV-Protokolldatei und schreiben die Spaltenüberschriften, wenn die Datei neu ist. Mit FileSeek(logHandle, 0, SEEK_END) wird sichergestellt, dass immer neue Daten angehängt werden und die Historie erhalten bleibt.

3. UI-Erstellung und erste Aktualisierung: Wir rufen CreatePanel() auf, um die Schnittstelle zu zeichnen. Dann führen wir die anfängliche Risikoberechnung durch (UpdateAllowFlag()), setzen die Farbe des Panels entsprechend (UpdateUIColors()) und füllen die Infoanzeige auf (UpdateInfoDisplay()). Dadurch wird sichergestellt, dass der Nutzer sofort einen genauen Status sieht.

int OnInit()
{
   trade.SetExpertMagicNumber(123456);
   trade.SetDeviationInPoints(10);

   // Initialize Global Variables if they don't exist
   if(!GlobalVariableCheck(GV_ENGAGED))    GlobalVariableSet(GV_ENGAGED, InpAutoEngageOnStart ? 1.0 : 0.0);
   if(!GlobalVariableCheck(GV_ALLOW))      GlobalVariableSet(GV_ALLOW,1.0);
   if(!GlobalVariableCheck(GV_DAILY_PL))   GlobalVariableSet(GV_DAILY_PL,0.0);
   // ... (Initialize other critical state variables)

   // Set limit values from inputs into global variables
   if(!GlobalVariableCheck(GV_DAILY_PROF)) GlobalVariableSet(GV_DAILY_PROF,InpDailyProfitLimit);
   if(!GlobalVariableCheck(GV_DAILY_LOSS)) GlobalVariableSet(GV_DAILY_LOSS,InpDailyLossLimit);
   // ... (Initialize other limits)

   // Setup Logging
   logHandle = FileOpen(InpLogFileName, FILE_WRITE|FILE_CSV|FILE_ANSI);
   if(logHandle == INVALID_HANDLE) {
      Print("[RiskEnforcer] Could not open log file: ", InpLogFileName);
   } else {
      if(FileTell(logHandle) == 0) { // File is new, write headers
         FileWrite(logHandle,"Timestamp","Event","Symbol","Type","Ticket","Volume","Price","Profit","DailyPL","AccountEquity");
      }
      FileSeek(logHandle, 0, SEEK_END); // Move to the end to append
   }

   // Build UI and Show Initial State
   CreatePanel();
   UpdateAllowFlag();
   UpdateUIColors();
   UpdateInfoDisplay();

   Print("[RiskEnforcer] Initialized. Engaged:", (int)GlobalVariableGet(GV_ENGAGED), " Allowed:", (int)GlobalVariableGet(GV_ALLOW));
   return(INIT_SUCCEEDED);
}

Schritt 3: Kernüberwachung (OnTick)

OnTick() ist die wichtigste Ereignisschleife, die bei jeder Preisänderung aufgerufen wird. Ihre Logik muss effizient und klar sein. Hier koordiniert sie die drei Säulen der Durchsetzung: Bewertung, Maßnahmen und Benachrichtigung.

Wichtige Entwicklungskonzepte:

1. Orchestrierung, nicht schweres Heben: OnTick berechnet P/L nicht selbst; es ruft CalculateDailyPL() auf. Sie entscheidet nicht über den Blockstatus, sondern ruft UpdateAllowFlag() auf. Durch diese Trennung der Bereiche bleibt die Hauptschleife sauber und modular.

2. Aktive Durchsetzungsschleife: Hier liegt der Kern unseres „aktiven Blockierens“. Wenn der Handel nicht erlaubt ist (GV_ALLOW == 0), werden regelmäßig (alle 3 Sekunden) alle offenen Positionen überprüft und zwangsweise geschlossen. Es ruft auch BlockNewTradesImmediately() auf, um alle Positionen abzufangen, die durchgerutscht sind.

3. Ausschreibungen auf staatlicher Ebene: Warnungen werden nur angezeigt, wenn sich der Status ändert (z. B. wenn eine Sperre zum ersten Mal auftritt), nicht bei jedem Tick, um den Nutzer nicht zu überfordern.

void OnTick()
{
   // 1. HOUSEKEEPING: Check if it's a new day/week/month for counter resets
   CheckForAutoReset();

   // 2. EVALUATION: Calculate current risk state
   double dailyPL = CalculateDailyPL(InpCountFloatingPL);
   GlobalVariableSet(GV_DAILY_PL,dailyPL); // Update persistent state
   UpdateAllowFlag(); // Decides if GV_ALLOW is 1 or 0

   // 3. FEEDBACK: Update the user interface
   UpdateUIColors(); // Change panel color (Green/Yellow/Red)
   UpdateInfoDisplay(); // Refresh numbers and status text

   // 4. ACTIVE ENFORCEMENT (The Core)
   if((int)GlobalVariableGet(GV_ALLOW) == 0) { // If trading is BLOCKED
      if(TimeCurrent() - lastTradeCheck >= 3) { // Throttle checks to every 3 sec
         lastTradeCheck = TimeCurrent();
         if(PositionsTotal() > 0) {
            Print("[RiskEnforcer] Trading blocked - closing open positions");
            ForceCloseAllPositionsNow(); // AGGRESSIVE ACTION
         }
      }
      BlockNewTradesImmediately(); // Catch-All Safety Net
   }

   // 5. NOTIFICATION: Manage alerts and warnings
   if(InpEnableAlerts) CheckAndAlertLimits();

   // Show a one-time alert when trading first gets blocked
   if((int)GlobalVariableGet(GV_ALLOW) == 0 && !blockAlertShown) {
      string reason = "Unknown";
      switch((int)GlobalVariableGet(GV_BLOCK_REASON)) { // Translate reason code to text
         case 1: reason = "Daily Profit Limit"; break;
         case 2: reason = "Daily Loss Limit"; break;
         // ... other cases
         case 99: reason = "Emergency Stop"; break;
      }
      Alert("[RiskEnforcer] TRADING BLOCKED: ", reason);
      blockAlertShown = true;
   }
}

Schritt 4: Die Logik der Durchführung – die Entscheidungsfindung (UpdateAllowFlag)

Diese Funktion ist das Gehirn des EA. Es fragt alle aktuellen Messwerte ab, vergleicht sie mit den gespeicherten Grenzwerten und trifft die endgültige Entscheidung: Handel zulassen (1) oder sperren (0). Sie umfasst das gesamte Regelwerk.

Wichtige Entwicklungskonzepte:

1. Ganzheitliche Risikobewertung: Es wertet mehrere unabhängige Bedingungen aus: tägliche P/L, wöchentliche P/L, monatliche P/L, aufeinanderfolgende Verluste und Drawdown. Ein Verstoß gegen eine dieser Bestimmungen führt zu einer Sperre, wodurch ein echtes mehrschichtiges Sicherheitsnetz geschaffen wird.

2. statusbezogenes Blockieren: Wenn eine Sperre auftritt, wird der Code blockReason aufgezeichnet und GV_LAST_BLOCK_CHECK auf den aktuellen Zeitpunkt gesetzt. Dieser Zeitstempel wird von BlockNewTradesImmediately() verwendet, um „neue“ Positionen zu identifizieren, die eröffnet wurden, nachdem die Sperre in Kraft getreten sein sollte.

3. Protokollierung löschen: Es verwendet PrintFormat, um spezifische, umsetzbare Meldungen zu protokollieren, wenn wichtige Grenzen (Tagesgewinn/-verlust, aufeinanderfolgende Verluste) erreicht werden, was für die Nachanalyse von unschätzbarem Wert ist.

void UpdateAllowFlag()
{
   // Fetch current metrics
   double dailyPL = GlobalVariableGet(GV_DAILY_PL);
   double prof = GlobalVariableGet(GV_DAILY_PROF);
   double loss = GlobalVariableGet(GV_DAILY_LOSS);
   double weekPL = CalculateWeeklyPL(InpCountFloatingPL);
   // ... (Fetch other metrics: monthPL, symPL, consecLoss, drawdown)

   int allow = 1; // Start with trading allowed
   int blockReason = 0;

   // Only enforce rules if the EA is in "Engaged" mode
   if((int)GlobalVariableGet(GV_ENGAGED) == 1) {
      // Check Emergency Stop first (highest priority)
      if((int)GlobalVariableGet(GV_EMERGENCY_ACTIVE) == 1) {
         allow = 0; blockReason = 99;
      }
      // Evaluate all risk rules
      else if(dailyPL >= prof)          { allow = 0; blockReason = 1; }
      else if(dailyPL <= loss)          { allow = 0; blockReason = 2; }
      else if(weekPL >= wkProf)         { allow = 0; blockReason = 3; }
      else if(weekPL <= wkLoss)         { allow = 0; blockReason = 4; }
      // ... (Check other limits: monthly, symbol, consecutive losses, drawdown)
      else if(consecLoss >= InpConsecLossLimit) { allow = 0; blockReason = 9; }
      else if(drawdown >= InpMaxDrawdown)       { allow = 0; blockReason = 10; }
   }

   // If state just changed from ALLOW to BLOCK, record the time
   if(allow == 0 && (int)GlobalVariableGet(GV_ALLOW) == 1) {
      GlobalVariableSet(GV_LAST_BLOCK_CHECK, (double)TimeCurrent());
   }

   // Commit the final decision to global state
   GlobalVariableSet(GV_ALLOW, (double)allow);
   GlobalVariableSet(GV_BLOCK_REASON, (double)blockReason);
}

Schritt 5: Aggressive Positionsschließung (ForceCloseAllPositionsNow)

Wenn eine Regel verletzt wird, reicht es nicht aus, sie passiv zu blockieren. Diese Funktion gewährleistet, dass die Exposition neutralisiert wird. Sie demonstriert eine defensive Programmierung auf professionellem Niveau.

Wichtige Entwicklungskonzepte:

1. Zweistufige Abschlussstrategie: Die primäre Methode verwendet trade.PositionClose(). Schlägt dies fehl (z. B. aufgrund der Marktbedingungen), sendet die zweite, aggressivere Methode eine entgegengesetzte Marktorder (trade.Sell() zum Abschluss eines Kaufs, trade.Buy() zum Abschluss eines Verkaufs) mit gleichem Volumen. Dieser „Hedge Close“ ist ein zuverlässiger letzter Ausweg.

2. Defensive Iteration: Die Positionen werden in einer Schleife rückwärts durchlaufen (for(int i = total-1; i >= 0; i--)). Dies ist von entscheidender Bedeutung, da sich PositionsTotal() ändert, wenn Positionen geschlossen werden; eine Rückwärtsiteration verhindert das Überspringen von Positionen.

3. Umfassende Protokollierung: Jede Aktion, ob erfolgreich oder nicht, wird mit Print oder PrintFormat protokolliert. Dieser Prüfpfad ist für ein professionelles Tool unverzichtbar und ermöglicht es dem Nutzer, die Aktionen des EA zu überprüfen.

void ForceCloseAllPositionsNow()
{
   int total = PositionsTotal();
   if(total <= 0) return;
   
   Print("[RiskEnforcer] FORCE CLOSING ALL POSITIONS NOW!");
   
   // STAGE 1: Attempt normal closure for each position
   for(int i = total-1; i >= 0; i--) {
      ulong ticket = PositionGetTicket(i);
      if(ticket > 0) {
         string symbol = PositionGetString(POSITION_SYMBOL);
         if(trade.PositionClose(ticket)) {
            PrintFormat("Closed position #%d for %s", ticket, symbol);
         }
      }
   }
   
   // STAGE 2: If any positions remain, use opposing market orders
   int remaining = PositionsTotal();
   if(remaining > 0) {
      Print("[RiskEnforcer] Normal close failed, using opposite orders...");
      for(int i = remaining-1; i >= 0; i--) {
         ulong ticket = PositionGetTicket(i);
         if(ticket > 0 && PositionSelectByTicket(ticket)) {
            string symbol = PositionGetString(POSITION_SYMBOL);
            double volume = PositionGetDouble(POSITION_VOLUME);
            ENUM_POSITION_TYPE type = (ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);
            
            if(type == POSITION_TYPE_BUY) {
               trade.Sell(volume, symbol, 0, 0, 0, "FORCE CLOSE");
               PrintFormat("Sent SELL to close BUY on %s", symbol);
            } else if(type == POSITION_TYPE_SELL) {
               trade.Buy(volume, symbol, 0, 0, 0, "FORCE CLOSE");
               PrintFormat("Sent BUY to close SELL on %s", symbol);
            }
         }
      }
   }
}

Schritt 6: Die Brücke – Reaktion auf externe Handelsgeschäfte (OnTradeTransaction)

Der EA muss auch auf Abschlüsse reagieren, die außerhalb seiner Kontrolle platziert werden (z. B. manuell oder durch einen anderen EA). Die Ereignisbehandlung von OnTradeTransaction ist der Ereignis-Sensor für dieses Ereignis.

Wichtige Entwicklungskonzepte:

1. Ereignisgesteuerte Logik: Sie wird nur dann aktiv, wenn ein neues Geschäft hinzugefügt wird (trans.type == TRADE_TRANSACTION_DEAL_ADD), ein präziser und effizienter Haken im Lebenszyklus des Handels.

2. Post-Trade-Analyse und Protokollierung: Es protokolliert jedes Handelsgeschäft im CSV-Format und aktualisiert die internen Zähler (aufeinanderfolgende Gewinne/Verluste, maximales Eigenkapital, Gesamthandel). Dadurch bleiben unsere Risikokennzahlen in Echtzeit erhalten, unabhängig von der Herkunft des Handelsgeschäfts.

3. Defensives Auffangnetz: Entscheidend ist, dass es eine letzte Sicherheitsprüfung enthält: Wenn ein neuer Einstiegsdeal (DEAL_ENTRY_IN) erfolgt, während GV_ALLOW 0 ist, wird diese spezifische Position sofort identifiziert und geschlossen. Dies ist die ultimative Durchsetzungsebene.

void OnTradeTransaction(const MqlTradeTransaction &trans, const MqlTradeRequest &request, const MqlTradeResult &result)
{
   if(trans.type == TRADE_TRANSACTION_DEAL_ADD) {
      ulong dealTicket = trans.deal;
      double profit = HistoryDealGetDouble(dealTicket, DEAL_PROFIT);
      ENUM_DEAL_ENTRY entryType = (ENUM_DEAL_ENTRY)HistoryDealGetInteger(dealTicket, DEAL_ENTRY);
      
      LogLastDealToCSV(); // Record the trade
      
      // ULTIMATE SAFETY: If a trade snuck in while blocked, close it!
      if((int)GlobalVariableGet(GV_ALLOW) == 0 && entryType == DEAL_ENTRY_IN) {
         Print("[RiskEnforcer] WARNING: Trade executed while blocked! Closing immediately...");
         // ... (Code to find and close the specific new position)
      }
      
      // Update risk statistics
      if(profit > 0) {
         GlobalVariableSet(GV_CONSEC_WIN, GlobalVariableGet(GV_CONSEC_WIN) + 1.0);
         GlobalVariableSet(GV_CONSEC_LOSS, 0.0);
      } else if(profit < 0) {
         GlobalVariableSet(GV_CONSEC_LOSS, GlobalVariableGet(GV_CONSEC_LOSS) + 1.0);
         GlobalVariableSet(GV_CONSEC_WIN, 0.0);
      }
      // ... (Update other stats)
   }
}

Nun, da wir unseren EA zur Risikobewältigung von Grund auf aufgebaut haben, muss die Theorie auf die Praxis treffen. Bevor ein Einsatz in Erwägung gezogen wird, sind rigorose Tests in einer simulierten Umgebung unerlässlich. Auf diese Weise können Sie die Logik jeder Regel – tägliche Limits, Blockierung von aufeinanderfolgenden Verlusten, Notstopps – validieren und das aktive Eingreifen des EAs ohne finanzielles Risiko beobachten.

Ich empfehle dringend, diesen EA zunächst an einen Chart auf einem DEMO-Konto anzuhängen. Überwachen Sie das Verhalten des Systems anhand verschiedener Szenarien: Lassen Sie gewinnende Handelsgeschäfte an Ihre Gewinnobergrenze heranreichen, simulieren Sie eine Reihe von Verlusten, um die Konsekutivverlust-Regel auszulösen, und testen Sie die Notstopp-Taste manuell. Dieser Prozess schafft Vertrauen in die Zuverlässigkeit des Systems und gibt Ihnen einen entscheidenden Einblick in seine Interaktion mit Ihrem allgemeinen Handelsaufbau. Zu Ihrer Erleichterung ist der vollständige, kompakte Quellcode des EA RiskEnforcementSystem.mq5 am Ende dieses Artikels beigefügt, damit Sie ihn kompilieren, testen und anpassen können.

Im folgenden Abschnitt werden die empirischen Ergebnisse des Tests des Risk Enforcement EA auf einem Live-Demochart vorgestellt, seine Leistung analysiert und die praktischen Auswirkungen auf die tägliche Handelsdisziplin diskutiert.



Tests

Um die Funktionalität des EAs zu überprüfen, haben wir ihn auf einem Live-Chart mit einem Demokonto eingesetzt. Die nachstehende Animation zeigt den Testprozess und das reaktionsschnelle Bedienfeld, das eine dynamische Anpassung der Risikoparameter ermöglicht. Im Hintergrund setzt der EA auf der Grundlage dieser Eingaben erfolgreich Handelsregeln durch. Ich habe auch Protokolldaten gesammelt, die das durch die einzelnen Steuerungszustände (Einschalten, Ausschalten, Not-Aus) ausgelöste Verhalten eindeutig dokumentieren.

RiskEnforcementSystem

Testen des RiskEnforcementSystem auf EURUSD, M5

Hier sind einige Testbeobachtungen auf der Registerkarte Experte, die zeigen, wie sich die Schaltflächen während der Ausführung verhalten haben.

1. Eingeschalteter Zustand (GV_ENGAGED = 1, GV_ALLOW = 1)

Wenn Sie auf die Schaltfläche „Einschalten“ klicken, werden die nachstehenden Informationen gespeichert. Sie demonstriert eine erfolgreiche nutzergesteuerte Zustandsänderung. Die erste ist eine Print()-Anweisung für die Registerkarte Experten, die der Aufzeichnung dient. Die zweite ist ein Alert() – ein Pop-up-Dialog und ein Ton – der eine unmittelbare, eindeutige Rückmeldung gibt, dass der Befehl empfangen und ausgeführt wurde.

2025.12.09 10:23:36.563 RiskEnforcementSystem (EURUSD,M5)       [RiskEnforcer] Engaged: 1
2025.12.09 10:28:18.709 RiskEnforcementSystem (EURUSD,M5)       [RiskEnforcer] Engaged by user.
2025.12.09 10:28:18.709 RiskEnforcementSystem (EURUSD,M5)       Alert: [RiskEnforcer] Enforcement ENGAGED

Aktiv

Aktiv (Engaged)

2. Ausgeschalteter Zustand (GV_ENGAGED = 0, GV_ALLOW = 1)

Nachfolgend finden Sie ein Protokoll für das Klicken auf die Schaltfläche für das Deaktivieren. Dieses Protokoll verdeutlicht die grundlegende Dualität des EA. Es ist nicht nur ein immerwährender Vollstrecker, sondern ein Werkzeug unter Ihrem Kommando. Sie können seine Befugnisse absichtlich aussetzen.

2025.12.09 10:36:22.275 RiskEnforcementSystem (EURUSD,M5)       [RiskEnforcer] Disengaged by user.
2025.12.09 10:36:22.275 RiskEnforcementSystem (EURUSD,M5)       Alert: [RiskEnforcer] Enforcement DISENGAGED - Trading allowed

Ausgeschaltet

Ausgeschalteter Zustand (Disengaged)

3. Not-Aus-Zustand (GV_ENGAGED = 1, GV_ALLOW = 0, GV_EMERGENCY_ACTIVE = 1):

Ich habe auf die Schaltfläche „EMERG STOP“ geklickt.

2025.12.09 10:36:21.105 RiskEnforcementSystem (EURUSD,M5)       Alert: [RiskEnforcer] Alert triggered.
2025.12.09 10:36:21.632 RiskEnforcementSystem (EURUSD,M5)       [RiskEnforcer] TRADING BLOCKED. Reason: Emergency Stop
2025.12.09 10:36:21.730 RiskEnforcementSystem (EURUSD,M5)       Alert: Approaching daily loss limit! Current: -191.30, Limit: -300.00
2025.12.09 10:36:21.731 RiskEnforcementSystem (EURUSD,M5)       Alert: [RiskEnforcer] Alert triggered.
2025.12.09 10:36:21.948 RiskEnforcementSystem (EURUSD,M5)       [RiskEnforcer] TRADING BLOCKED. Reason: Emergency Stop
2025.12.09 10:36:21.958 RiskEnforcementSystem (EURUSD,M5)       [RiskEnforcer] Trading blocked - monitoring for new positions

Das Protokoll bestätigt, dass der Notstopp sofort und entschlossen funktioniert. Sie wartet nicht darauf, dass andere Bedingungen erfüllt sind, sondern setzt einen Top-Level-Block durch, der alle anderen Regeln außer Kraft setzt. Die gleichzeitigen Warnungen bei Annäherung an den Grenzwert sind kein Fehler, sondern der Beweis dafür, dass die verschiedenen Überwachungssysteme des EA (die Notfallbefehlsebene und die analytische Warnschicht) korrekt parallel arbeiten und einen vollständigen Prüfpfad liefern.

Notstopp

Aktivierter Notstopp (Emergency Stop)



Schlussfolgerung

Das Risikomanagement ist die unverzichtbare Grundlage eines erfolgreichen Handels. Dieses Prinzip wird durch die berühmteste Regel von Warren Buffett perfekt verkörpert: „Regel Nr. 1: Verlieren Sie niemals Geld. Regel Nr. 2: Vergiss niemals Regel Nr. 1.“ Diese zeitlose Weisheit unterstreicht, dass der Schutz des Kapitals nicht nur eine Taktik, sondern die absolute Voraussetzung für langfristiges Wachstum ist.

In dieser Diskussion wurde dieses Prinzip in die Praxis umgesetzt, indem von der Theorie zu ausführbarem Code übergegangen wurde. Wir haben den entscheidenden Prozess der Automatisierung der Handelsdisziplin eingeleitet und uns dabei auf die Entwicklung eines Systems konzentriert, das die Regeln des Risikomanagements ohne Emotionen und Ausnahmen durchsetzt. Die Kernidee – ein Guardian Expert Advisor – ist zwar konzeptionell, aber wir haben sie erfolgreich als testbares, funktionales Tool auf einem Live-Demo-Konto zum Leben erweckt und ihre Praxistauglichkeit bewiesen.

Der Hauptvorteil dieser Automatisierung besteht darin, dass sie die beiden häufigsten Ursachen für Misserfolge ausschaltet: emotionale Entscheidungen und den psychologischen Druck der volatilen Marktbedingungen. Indem wir Regeln kodifizieren, verwandeln wir Disziplin von einem bewussten Kampf in einen automatisierten Hintergrundprozess. Ein wichtiges praktisches Ergebnis dieses Projekts ist die demonstrierte Anwendung der MQL5-Sprache zur Lösung realer Handelsprobleme, die zeigt, wie sich Programmierkenntnisse direkt in eine verbesserte Handelsintegrität und Kontosicherheit umsetzen lassen.

Der bereitgestellte EA ist zwar ein solider Ausgangspunkt, dient aber auch einem wichtigen pädagogischen Zweck. Mit weiteren Übungen, Tests und Verfeinerungen kann diese grundlegende Idee zu einer personalisierten und ausgefeilten Lösung weiterentwickelt werden, die auf individuelle Strategien und Risikoprofile zugeschnitten ist. Der Weg vom Anfänger zum Experten ist lang; bleiben Sie dran bis zu unserer nächsten Veröffentlichung.

Kommentare und weitere Informationen finden Sie in der Tabelle der angehängten Dateien unten.



Wichtige Lektionen

Wichtige LektionenBeschreibung:
Automatisieren Sie Disziplin, nicht nur die Strategie.Das wertvollste Handelsinstrument ist die Psychologie. Ein Risk EA automatisiert die Durchsetzung von Regeln und fungiert als unnachgiebiger Wächter, um emotionale Entscheidungen und Versäumnisse auszuschließen, die häufigere Ursachen für Misserfolge sind als eine schlechte Strategie.
Implementieren Sie eine klare Zustandsmaschine.Professionelle Systeme erfordern definierte Betriebsmodi. Die Entwicklung verschiedener Zustände – eingeschaltet, ausgeschaltet, Notstopp – ermöglicht eine klare Steuerung und ein vorhersehbares Verhalten, das durch zentrale Flaggen gesteuert wird, die die Aktionen des Systems vorgeben.
Vorrang für aktive Prävention.Echte Risikokontrolle ist proaktiv. Das System muss so konzipiert sein, dass es Verstöße aktiv verhindert, indem es neue Aufträge blockiert und die Schließung bestehender Positionen erzwingt, und Sie nicht nur passiv warnt, wenn eine Regel verletzt wurde.
Sorgen Sie für Transparenz und Vertrauen.Damit sich die Nutzer auf einen automatischen Wächter verlassen können, muss dieser transparent sein. Detaillierte Protokollierung, eindeutige Warnmeldungen und eine visuelle Echtzeit-Schnittstelle sind unerlässlich, um die Funktionalität zu überprüfen und jede Aktion des Systems zu verstehen.
Erstellen Sie eine interaktive Nutzeroberfläche:Ein funktionelles Bedienfeld auf dem Charts verwandelt komplexen Code in ein nutzbares Werkzeug. Schaltflächen, editierbare Felder und Live-Anzeigen ermöglichen eine dynamische Steuerung und Anpassung der Risikoparameter, ohne dass der Quellcode geändert werden muss.
Nutzen Sie eine ereignisgesteuerte Architektur:Ein robuster EA verwendet sowohl eine Ereignisbehandlung als auch den Haupt-Tick-Zyklus. Sofortige Reaktionen auf Trades und Nutzerklicks werden über Ereignisse abgewickelt, während die kontinuierliche Überwachung und Aktualisierung bei jedem Tick erfolgt, was eine umfassende Abdeckung gewährleistet.
Rigorose Tests in der Simulation:Ausgiebiges Testen des Demokontos ist obligatorisch. Dies ist die einzige sichere Möglichkeit, alle Interaktionen zwischen dem EA, der Handelsplattform und den simulierten Marktbedingungen zu validieren, bevor echtes Kapital eingesetzt wird.
Verwenden Sie Persistent Zustands-Management.Kritische Daten wie die tägliche Gewinn- und Verlustrechnung oder der Status des Engagements müssen erhalten bleiben. Durch die Verwendung globaler Variablen wird sichergestellt, dass die Regeln und der Systemstatus konsistent beibehalten werden, auch nach einem Neustart des Terminals oder Computers.
Setzen Sie eine mehrschichtige Verteidigung ein.Ein professionelles Risikomanagement nutzt unabhängige Kontrollen in verschiedenen Dimensionen (Handelsvolumen, Tagesverlust, aufeinanderfolgende Verluste, Drawdown). Auf diese Weise entsteht ein Sicherheitsnetz, bei dem mehrere Schichten vor einem einzelnen Ausfall schützen.
Ein ausfallsicherer Notstopp muss vorhanden sein.Eine spezielle Notfallfunktion ist ein wichtiges Sicherheitsmerkmal. Sie muss mit höchster Priorität arbeiten, um alle Marktrisiken sofort zu neutralisieren, indem sie Positionen schließt und den Handel blockiert, unabhängig von anderen Systemlogiken.
Code für Lesbarkeit und Wartung strukturierenDas Schreiben von klarem, modularem Code mit logischer Trennung der Funktionen (Berechnungen, Regelprüfungen, UI-Updates) und konsistenten Namenskonventionen ist für die langfristige Wartung, das Debugging und künftige Erweiterungen unerlässlich.
Master Utility EntwicklungFortgeschrittene MQL5-Expertise beinhaltet die Entwicklung von Tools, die das Handelsumfeld verwalten, wie z. B. Risikomanager und Tracker – und nicht nur Signalgeneratoren. Dies vertieft Ihr Verständnis für die vollständige API der Plattform und bietet einen immensen praktischen Nutzen.

Anlagen

Quelle DateinameBeschreibung
RiskEnforcementSystem.mq5Der vollständige, kompilierfertige Quellcode für den in dieser Diskussion entwickelten Risk Enforcement Expert Advisor. Diese MQL5-Datei enthält alle besprochenen Funktionen, einschließlich der Core-State-Engine, der Multi-Timeframe-Gewinn-/Verlustrechner, des interaktiven Chart-Panels und der Logik für das Blockieren und Schließen des aktiven Handels. Verwenden Sie diese Datei, um den automatischen Handelswächter auf Ihrer MetaTrader 5-Plattform zu implementieren.

Zurück zum Inhalt

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

Beigefügte Dateien |
Die View Komponente für Tabellen im MQL5 MVC Paradigma: Grafisches Basiselement Die View Komponente für Tabellen im MQL5 MVC Paradigma: Grafisches Basiselement
Der Artikel behandelt den Prozess der Entwicklung eines grafischen Basiselements für die View-Komponente als Teil der Implementierung von Tabellen im MVC-Paradigma (Model-View-Controller) in MQL5. Dies ist der erste Artikel über die Komponente View und der dritte in einer Reihe von Artikeln über die Erstellung von Tabellen für das MetaTrader 5 Client Terminal.
Tabellen- und Kopfzeilen-Klassen auf der Grundlage eines Tabellenmodells in MQL5: Anwendung des MVC-Konzepts Tabellen- und Kopfzeilen-Klassen auf der Grundlage eines Tabellenmodells in MQL5: Anwendung des MVC-Konzepts
Dies ist der zweite Teil des Artikels, der sich mit der Implementierung des Tabellenmodells in MQL5 unter Verwendung des MVC (Model-View-Controller) Architekturparadigmas beschäftigt. Der Artikel behandelt die Entwicklung von Tabellenklassen und des Tabellenkopfes auf der Grundlage eines zuvor erstellten Tabellenmodells. Die entwickelten Klassen bilden die Grundlage für die weitere Implementierung von View- und Controller-Komponenten, die in den folgenden Artikeln behandelt werden.
Entwicklung eines Expertenberaters für mehrere Währungen (Teil 24): Hinzufügen einer neuen Strategie (II) Entwicklung eines Expertenberaters für mehrere Währungen (Teil 24): Hinzufügen einer neuen Strategie (II)
In diesem Artikel werden wir die neue Strategie mit dem erstellten automatischen Optimierungssystem verbinden. Schauen wir uns an, welche Änderungen am EA für die Erstellung des Optimierungsprojekts sowie an den EAs der zweiten und dritten Stufe vorgenommen werden müssen.
Vom Neuling zum Experten: Handel mit dem RSI unter Berücksichtigung der Struktur des Marktes Vom Neuling zum Experten: Handel mit dem RSI unter Berücksichtigung der Struktur des Marktes
In diesem Artikel werden wir praktische Techniken für den Handel mit dem Relative Strength Index (RSI) Oszillator mit Marktstruktur untersuchen. Wir werden uns auf Kanal-Preisaktionsmuster konzentrieren, wie sie typischerweise gehandelt werden und wie MQL5 zur Verbesserung dieses Prozesses eingesetzt werden kann. Am Ende werden Sie über ein regelbasiertes, automatisiertes Channel-Trading-System verfügen, mit dem Sie Gelegenheiten zur Trendfortsetzung mit größerer Präzision und Beständigkeit nutzen können.