English Русский 中文 Español 日本語 Português
preview
Aufbau eines Remote-Forex-Risikomanagementsystems in Python

Aufbau eines Remote-Forex-Risikomanagementsystems in Python

MetaTrader 5Statistik und Analyse |
31 1
Yevgeniy Koshtenko
Yevgeniy Koshtenko

Einführung

In einer Welt, in der eine falsche Bewegung auf dem Devisenmarkt Ihr Konto schneller zurücksetzen kann, als Sie „Stop Loss“ sagen können, wird die Kunst des Risikomanagements nicht nur zu einer nützlichen Fähigkeit, sondern zu einer echten Lebensader für einen Händler. Erinnern Sie sich an die faszinierende Geschichte eines Händlers, der 2015 durch einen plötzlichen Kursanstieg des Schweizer Frankens seine gesamten Ersparnisse verlor? Oder derjenige, der mit einer offenen Position eingeschlafen und mit einem Margin Call aufgewacht ist?

Heute stelle ich Ihnen ein echtes Schutzschild für Ihr Handelskapital vor – ein ferngesteuertes Python-Risikomanagementsystem, das nicht schläft, sich nicht ablenken lässt und niemals den Emotionen nachgibt. Es ist, als hätten Sie einen persönlichen Bodyguard für Ihr Handelskonto, der rund um die Uhr jede Bewegung überwacht und beim ersten Anzeichen von Gefahr sofort eingreift.

Stellen Sie sich vor: Sie gehen Ihren Geschäften nach, und Ihr zuverlässiger digitaler Assistent überwacht die Drawdowns, überwacht die täglichen und wöchentlichen Verlustlimits und kann sogar alle Positionen automatisch schließen, wenn der Markt gegen Sie läuft. Keine Nervenzusammenbrüche, schlaflosen Nächte oder verpassten Chancen aus Angst, die Kontrolle zu verlieren.

Unser Remote-Risikomanager ist nicht nur ein Werkzeug, sondern Ihre Versicherung gegen das finanzielle Chaos in der unberechenbaren Welt des Devisenhandels. Sind Sie bereit, Ihren Handel von einem riskanten Glücksspiel in einen kontrollierten Prozess zu verwandeln? Dann schnallen Sie sich an – wir begeben uns auf eine Reise durch die Welt des intelligenten Risikomanagements, wo Technologie auf finanzielle Sicherheit trifft.



Warum kann ein Händler heute ohne Risikomanagement nicht mehr überleben?

Im modernen Handel ist Risikomanagement keine Option mehr – es ist zu einer Voraussetzung für das Überleben auf den Finanzmärkten geworden. Finden wir heraus, warum.

Die Ära der extremen Volatilität

In den letzten Jahren waren die Finanzmärkte beispiellosen Schocks ausgesetzt: einer Pandemie, geopolitischen Konflikten, drastischen Veränderungen in der Geldpolitik der Zentralbanken und weltweiten wirtschaftlichen Turbulenzen. Jedes dieser Ereignisse führte zu einer extremen Volatilität, bei der eine falsche Bewegung ein Handelskonto innerhalb weniger Minuten auf Null setzen konnte.

Denken Sie nur an den Januar 2015 zurück, als die Schweizerische Nationalbank die Bindung des Frankens an den Euro abrupt aufhob. Innerhalb weniger Minuten kam es zu einem beispiellosen Anstieg des Wechselkurses um 30 %, der Tausende von Händlern und sogar einige Brokerfirmen in den Ruin trieb. Wer hat diesen Tag überlebt? Diejenigen, die über ein zuverlässiges Risikomanagementsystem verfügten.

Der psychologische Faktor ruiniert die Mehrheit

Es ist seit langem erwiesen, dass der Hauptfeind des Händlers nicht der Markt, sondern seine eigene Psychologie ist. Angst, Gier, Hoffnung, Rache am Markt – diese Emotionen zerstören selbst die ausgefeiltesten Handelsstrategien. Ein automatisiertes Risikomanagementsystem schützt Sie nicht nur vor dem Markt, sondern auch vor sich selbst.

Wenn der Markt gegen Sie arbeitet, kann der psychologische Druck unerträglich sein. Viele Händler sind versucht, eine Verlustposition zu „mitteln“ oder einen Stop-Loss zu entfernen, in der Hoffnung auf eine Trendwende. Solche Entscheidungen, die in einer Zeit des emotionalen Stresses getroffen werden, führen in der Regel zu katastrophalen Folgen.

Technologischer Fortschritt ist ein zweischneidiges Schwert

Moderne Handelsplattformen bieten einen noch nie dagewesenen Zugang zu den Märkten. Mit einem Klick können Sie eine Position eröffnen, die Zehn- oder sogar Hunderttausende von Dollar kontrolliert. Diese Macht erfordert eine entsprechende Verantwortung.

Technische Ausfälle, Internetverbindungsfehler, falsche Klicks, Tippfehler bei der Volumeneingabe – in der Hochgeschwindigkeitswelt des algorithmischen Handels kann schon ein kleiner Fehler zu großen Verlusten führen. Das automatische Risikomanagementsystem wirkt wie ein Sicherheitsnetz, das vor solchen Katastrophen schützt.

Institutionelle Akteure haben einen Vorteil

Banken, Hedgefonds und andere institutionelle Marktteilnehmer investieren Millionen in Risikomanagementsysteme. Sie verwenden ausgeklügelte Algorithmen, Hunderte von Analysten und leistungsstarke Computer, um ihre Risiken zu minimieren und ihre Gewinne zu maximieren.

Ein Kleinhändler, der ohne Risikomanagement-System handelt, ist wie ein Amateur, der gegen eine Profimannschaft antritt. Ihr einziger Schutz sind strenge Disziplin und automatische Risikokontrollsysteme.

Automatisierung als Notwendigkeit

In einer Welt, in der die Märkte rund um die Uhr funktionieren und Entscheidungen in Millisekunden getroffen werden, reicht die menschliche Aufmerksamkeit nicht mehr aus. Sie können nicht ständig alle Ihre Positionen im Auge behalten, vor allem, wenn Sie schlafen oder mit anderen Dingen beschäftigt sind.

Ein automatisiertes Risikomanagementsystem, ähnlich dem in diesem Artikel vorgestellten, wird zu Ihrem wachsamen Wächter, der rund um die Uhr über die Einhaltung Ihrer Handelsregeln wacht, nicht müde wird, sich nicht ablenken lässt und sich nicht von Emotionen leiten lässt.

Im modernen Hochfrequenzhandel ist dies kein Luxus, sondern eine notwendige Voraussetzung für das Überleben.



Die Mathematik des Risikomanagements: Warum konservatives Handeln auf lange Sicht gewinnt

Es gibt eine grundlegende Asymmetrie im Handel, die von Anfängern oft unterschätzt und von emotionalen Händlern ignoriert wird. Diese Asymmetrie ist mathematischer Natur und erklärt, warum ein konservativer Ansatz im Risikomanagement langfristig fast immer besser abschneidet als aggressive Strategien. Aus diesem Grund haben wir ein automatisiertes Risikomanagementsystem in Python entwickelt, das in diesem Artikel vorgestellt wird.

Die unbarmherzige Mathematik von Verlusten und Erholung

Betrachten Sie ein einfaches mathematisches Modell. Nehmen wir an, Sie haben ein Handelskonto von 10.000 Dollar. Hier ist, was in verschiedenen Verlustszenarien passiert:

Verlust (%)
Kontostand
Erforderlicher Gewinn für eine Erholung (%)
10%
$9,000
11.1%
20%
$8,000
25%
30%
$7,000
42.9%
40%
$6,000
66.7%
50%
$5,000
100%
60%
$4,000
150%
75%
$2,500
300%
90%
$1,000
900%
95%
$500
1900%

Wichtigste Beobachtung: Der erforderliche Erholungsprozentsatz steigt mit zunehmenden Verlusten exponentiell an. Dabei handelt es sich nicht um eine lineare, sondern um eine hyperbolische Beziehung, die durch die folgende Formel ausgedrückt wird:

Erforderlicher Erholungsprozentsatz = (100% / (100% Verlustprozentsatz)) – 100%

Diese mathematische Realität ist unbarmherzig und unversöhnlich. Es funktioniert unabhängig von Ihrer Erfahrung, Ihren Marktkenntnissen oder Ihrer Handelsstrategie. Unser Python-Risikomanagementdienst wurde genau unter Berücksichtigung dieses mathematischen Musters entwickelt.

Wie löst unser Python-Risikomanagementsystem dieses Problem?

Der von uns entwickelte Dienst kontrolliert automatisch mehrere wichtige Risikoparameter. Es überwacht den maximalen Drawdown – unser System überwacht sowohl den Drawdown auf den Saldo als auch auf das Eigenkapital und kann Positionen automatisch schließen, wenn ein bestimmter Schwellenwert erreicht wird (z. B. 10 % des Maximums). Das System kontrolliert auch die täglichen und wöchentlichen Verlustlimits – Sie können den maximal zulässigen Verlust für einen Tag oder eine Woche festlegen, sowohl als Prozentsatz als auch in absoluten Zahlen, und das Überschreiten dieser Limits blockiert automatisch den Handel. Darüber hinaus ist eine Margenkontrolle vorgesehen – das System überwacht ständig die Höhe der Marge und warnt, wenn sich gefährliche Werte nähern.

Im Systemcode sind diese Parameter in den folgenden Ausschnitten zu sehen:

# Defining risk limits
daily_loss_limit = self.risk_settings.get('daily_loss_limit', 5 if limit_mode == 'percent' else 100)
weekly_loss_limit = self.risk_settings.get('weekly_loss_limit', 10 if limit_mode == 'percent' else 300)
max_drawdown_limit = self.risk_settings.get('max_drawdown', 10 if limit_mode == 'percent' else 100)

# Checking for exceeding limits
daily_balance_limit_exceeded = abs(daily_balance_loss) > (account_info.balance * daily_balance_limit / 100 if limit_mode == 'percent' else daily_balance_limit)
weekly_balance_limit_exceeded = abs(weekly_balance_loss) > (account_info.balance * weekly_balance_limit / 100 if limit_mode == 'percent' else weekly_balance_limit)

# Control of exceeding the maximum drawdown
if drawdown_mode == 'balance':
    max_drawdown_exceeded = balance_drawdown > max_drawdown_limit
elif drawdown_mode == 'equity':
    max_drawdown_exceeded = equity_drawdown > max_drawdown_limit
else:  # both
    max_drawdown_exceeded = balance_drawdown > max_drawdown_limit or equity_drawdown > max_drawdown_limit

Erwartete Rendite auf Basis der Wahrscheinlichkeit

Angenommen, Sie haben ein Handelssystem mit einer Erfolgsquote von 60 % und einem Gewinn-Verlust-Verhältnis von 1:1. Die mathematische Erwartung eines solchen Systems ist positiv, aber was passiert bei unterschiedlichen Positionsgrößen?

Berechnen Sie den erwarteten Kapitalzuwachs nach 100 Transaktionen bei unterschiedlichen Risikoniveaus pro Transaktion:

Risiko pro Handel (%)
Durchschnittliches Kapitalwachstum (%)
Standardabweichung (%)
Wahrscheinlichkeit eines negativen Ergebnisses
1%
20%
10%
2.3%
2%
44%
21%
1.8%
5%
152%
65%
1%
10%
463%
225%
2%
20%
2125%
1250%
4.5%

Auf den ersten Blick mag es scheinen, dass mehr Risiko = mehr Ertrag bedeutet. Dies ist jedoch eine Illusion, denn die Standardabweichung (Volatilität der Ergebnisse) steigt proportional zur Höhe des Risikos. Bei einem Risiko von mehr als 20 % steigt zudem die Wahrscheinlichkeit des vollständigen Ruins erheblich. Es ist auch wichtig zu bedenken, dass der psychologische Stress großer Drawdowns oft zu einer Störung des Handelssystems führt. Dies ist wahrscheinlich der erste Punkt, über den man nachdenken muss, um zu dem Schluss zu kommen, dass jeder Händler das Konto bei hohem Risiko auf Null reduzieren wird. In neun Jahren auf dem Markt habe ich keine einzige erfolgreiche „Einlagenbeschleunigung“ gesehen.

Automatisierung bewahrt Sie vor emotionalen Fehlern

Einer der Hauptvorteile unseres Python-Risikomanagementsystems ist der Ausschluss des menschlichen Faktors. Der vorgestellte Code enthält die Funktion der automatischen Schließung von Positionen im Falle der Verletzung von Risikoparametern:

def close_all_positions(self):
    positions = mt5.positions_get()
    if positions is None:
        self.error_signal.emit(f"Error in retrieving positions to close: {mt5.last_error()}")
        return
    if not positions:
        self.error_signal.emit(“No open positions to close")
        return

    for position in positions:
        try:
            symbol = position.symbol
            volume = position.volume
            position_id = position.ticket
            position_type = position.type
            tick = mt5.symbol_info_tick(symbol)
            if not tick:
                self.error_signal.emit(f”Failed to retrieve data on symbol {symbol}")
                continue

            close_price = tick.bid if position_type == mt5.ORDER_TYPE_BUY else tick.ask
            close_type = mt5.ORDER_TYPE_SELL if position_type == mt5.ORDER_TYPE_BUY else mt5.ORDER_TYPE_BUY

            close_request = {
                "action": mt5.TRADE_ACTION_DEAL,
                "symbol": symbol,
                "volume": volume,
                "type": close_type,
                "position": position_id,
                "price": close_price,
                "deviation": 100,
                "comment": "Close by Risk Manager",
            }

            result = mt5.order_send(close_request)
            if not result or result.retcode != mt5.TRADE_RETCODE_DONE:
                self.error_signal.emit(f"Position closing error {position_id}: {result.retcode if result else mt5.last_error()}")
        except Exception as e:
            self.error_signal.emit(f”Error at closing position: {str(e)}")

Das System erliegt nicht der Angst, der Gier oder der Hoffnung. Sie hält sich strikt an die festgelegten Regeln, was in Zeiten von Marktturbulenzen von entscheidender Bedeutung ist.

Kontinuierliche Überwachung für einen erholsamen Schlaf

Unsere Python-basierte Lösung arbeitet rund um die Uhr, auch wenn Sie schlafen oder mit anderen Dingen beschäftigt sind. Alle 18 Sekunden überprüft das System alle Risikoparameter und ergreift die notwendigen Maßnahmen zum Schutz Ihres Kapitals:

while self.running:
    try:
        account_info = mt5.account_info()
        # ... risk analysis ...
        
        limits_exceeded = daily_balance_limit_exceeded or weekly_balance_limit_exceeded or daily_equity_limit_exceeded or weekly_equity_limit_exceeded or max_drawdown_exceeded

        with self.block_lock:
            if limits_exceeded and self.risk_settings.get('auto_close_positions', True):
                self.blocked_trading = True
                if positions:
                    self.close_all_positions()
                    self.error_signal.emit(f"All positions closed due to exceeding limits")
    except Exception as e:
        self.error_signal.emit(f"Error in monitoring cycle: {str(e)}")
        
    time.sleep(18)  # Update every 18 s

Nutzung unseres Risikomanagementsystems

Der in diesem Artikel vorgestellte Python-Servicecode bietet einen umfassenden Schutz für Ihr Handelskonto durch die Überwachung der täglichen und wöchentlichen Verluste, die Überwachung des maximalen Drawdowns, die automatische Schließung von Positionen bei Überschreitung von Limits und die visuelle Anzeige aller Risikoparameter über eine nutzerfreundliche GUI.

Es ist intuitiv einfach zu bedienen – Sie laden ein Konto hoch, legen Risikolimits für einen Tag oder eine Woche fest, bestimmen, ob das Risiko nach Saldo/Eigenkapital oder beidem kontrolliert werden soll, und schon können Sie loslegen.

Mit unserem System können Sie sicher sein, dass die Mathematik des Risikomanagements für Sie und nicht gegen Sie arbeitet. Es wird Ihnen helfen, katastrophale Verluste zu vermeiden und Ihr langfristiges Überleben im wettbewerbsintensiven Umfeld der Finanzmärkte zu sichern.



Praktische Umsetzung des Risikomanagementsystems

Die Einführung eines Remote-Risikomanagers in Ihre Handelspraxis erfolgt in wenigen einfachen Schritten. Installieren Sie zunächst Python und die erforderlichen Bibliotheken auf Ihrem Computer oder einem entfernten Server. Zu den wichtigsten Abhängigkeiten gehören PyQt5 für die grafische Nutzeroberfläche, MetaTrader 5 für die Kommunikation mit der Handelsplattform sowie Pandas und Numpy für die Datenanalyse.

Nachdem Sie alle Komponenten installiert haben, können Sie das System starten und die Parameter für Ihr Handelskonto einrichten. Die intuitive Schnittstelle ermöglicht es Ihnen, die Daten für die Verbindung mit MetaTrader 5 schnell einzugeben: Server, Login und Passwort. Das System unterstützt die gleichzeitige Überwachung mehrerer Konten, was besonders praktisch für diejenigen ist, die mehrere Strategien oder Kundengelder verwalten.

Besondere Aufmerksamkeit sollte der Festlegung von Parametern für das Risikomanagement gewidmet werden. Sie können tägliche und wöchentliche Verlustlimits festlegen, sowohl als Prozentsatz des Saldos als auch in absoluten Werten. Viele professionelle Händler verwenden zum Beispiel die Regel „nicht mehr als 2 % pro Tag und 5 % pro Woche verlieren“. Dieser Ansatz stellt sicher, dass selbst eine Reihe von erfolglosen Geschäften nicht zu kritischen Verlusten führen wird.

Das System ermöglicht es Ihnen auch, den maximal zulässigen Drawdown festzulegen. Dies ist ein äußerst wichtiger Parameter, da historische Daten zeigen, dass es mit zunehmender Tiefe exponentiell schwieriger wird, aus einem Drawdown herauszukommen. Indem Sie beispielsweise einen maximalen Drawdown von 10-15 % festlegen, schützen Sie sich vor einem langen und schmerzhaften Prozess der Kapitalerholung.

Die nutzerfreundliche grafische Oberfläche des Systems ermöglicht die Visualisierung von Schlüsselkennzahlen in Echtzeit. Sie können Ihren Kontostatus, offene Positionen, Margenniveaus und potenzielle Risiken anhand informativer Charts und Tabellen überwachen. So können Sie die Situation sofort einschätzen und fundierte Entscheidungen treffen.

Eines der einzigartigen Merkmale unseres Systems ist die Funktion der Wochenberichte. Das System erstellt automatisch detaillierte HTML-Berichte mit Charts und Tabellen, die die Dynamik Ihres Kontos, die Effektivität des Risikomanagements und die wichtigsten Handelspunkte veranschaulichen. Diese Berichte sind ein unschätzbares Instrument zur Analyse und Verbesserung Ihrer Strategie.

Die Architektur des Systems basiert auf dem Prinzip des Multithreading, das eine schnelle Reaktion auf sich ändernde Marktbedingungen gewährleistet. Der Hauptthread überwacht Konto und Risiken, während einzelne Threads für die Aktualisierung der Schnittstelle und die Speicherung von Daten zuständig sind. Dieser Ansatz gewährleistet einen zuverlässigen Betrieb auch bei hoher Marktvolatilität.

Die eingebaute Auto-Save-Funktion stellt sicher, dass auch bei einem Programmausfall oder einem Server-Neustart alle Einstellungen und der Status der Handelssperrung gespeichert werden. Dies verhindert ein ungewolltes Öffnen von Positionen nach einem Neustart des Systems.

Wenn Sie dieses System in Ihre Handelspraxis einführen, erhalten Sie nicht nur ein Programm, sondern einen zuverlässigen digitalen Assistenten, der nicht müde wird, sich nicht von Emotionen leiten lässt und sich strikt an die festgelegten Regeln hält. Dies ist besonders wertvoll in Zeiten von Marktstress, wenn die menschliche Psyche dazu neigt, irrationale Entscheidungen zu treffen.

Nun, lassen Sie uns zur Architekturentwicklung übergehen.

Architektur eines Remote-Risikomanagers

Der von uns entwickelte Remote Risk Manager verfügt über eine mehrstufige Architektur, die Zuverlässigkeit, Skalierbarkeit und Nutzerfreundlichkeit gewährleistet. Schauen wir uns die Hauptkomponenten des Systems an und wie sie miteinander interagieren.

Die wichtigsten Systemkomponenten:

  1. Das AccountMonitor-Überwachungsmodul ist das Herzstück unseres Systems. Es ist als separater Thread implementiert, der eine kontinuierliche Überwachung des Status des Handelskontos über die MetaTrader 5 API ermöglicht.
  2. Die grafische Oberfläche RiskManagerGUI ist eine komfortable Oberfläche für die Interaktion mit dem System, die es Ihnen ermöglicht, Risikomanagement-Parameter zu konfigurieren und den aktuellen Status von Konten zu überwachen.
  3. Die SQLite-Datenbank ist ein Repository für historische Kontostandsdaten, die zur Berechnung von Höchstsalden und Eigenkapitalwerten sowie zur Erstellung von Berichten verwendet werden.
  4. Das Berichtsmodul ist eine Komponente, die für die Erstellung wöchentlicher HTML-Berichte mit Charts und Tabellen zur Analyse der Handelsergebnisse zuständig ist.

Arbeiten mit MetaTrader 5 API

Das zentrale Element unseres Systems ist die Integration mit MetaTrader 5 über die offizielle Python-API. Diese Integration ermöglicht es uns, Daten über den Kontostand, die offenen Positionen und die Handelshistorie zu erhalten und bei Bedarf Handelsoperationen durchzuführen.

# Initialize MetaTrader 5 with explicit path indication
if not mt5.initialize(path=self.terminal_path):
    self.error_signal.emit(f"Error initializing MetaTrader 5 on path {self.terminal_path}: {mt5.last_error()}")
    return

authorized = mt5.login(
    login=int(self.account_info['login']),
    password=self.account_info['password'],
    server=self.account_info['server']
)

Bitte beachten Sie, dass wir bei der Initialisierung explizit den Pfad zum MetaTrader 5 Terminal angeben. Dies ist besonders wichtig, wenn das System auf einem entfernten Server eingesetzt wird, wo der Dateispeicherort vom Standardspeicherort abweichen kann.

Nach erfolgreicher Autorisierung beginnt das System mit der kontinuierlichen Überwachung des Kontos und fordert alle 18 Sekunden Informationen an:

while self.running:
    try:
        account_info = mt5.account_info()
        if not account_info:
            self.error_signal.emit(“Failed to receive account information")
            time.sleep(18)
            continue

        positions = mt5.positions_get()
        # Further data analysis...
    except Exception as e:
        self.error_signal.emit(f"Error in monitoring cycle: {str(e)}")
    
    time.sleep(18)  # Update every 18 s

Multithreading-Architektur

Um die Reaktionsfähigkeit der Nutzeroberfläche auch bei intensiver Datenverarbeitung zu gewährleisten, verwenden wir eine Multithreading-Architektur. Das Überwachungsmodul läuft in einem separaten Thread, der mit dem Haupt-GUI-Thread über das PyQt5-Signal- und Slot-System kommuniziert:

class AccountMonitor(QThread):
    update_signal = pyqtSignal(dict)
    error_signal = pyqtSignal(str)
    
    # ...
    
    def run(self):
        # Monitoring and analysis code
        # ...
        self.update_signal.emit(update_data)

Dieser Ansatz stellt sicher, dass die API-Schnittstelle des Nutzers auch bei Verzögerungen beim Empfang von Daten von MetaTrader 5 reaktionsfähig bleibt.

Algorithmen zur Risikoanalyse

Das Herzstück unseres Systems sind Risikoanalyse-Algorithmen, die den aktuellen Kontostand kontinuierlich bewerten und Entscheidungen auf der Grundlage nutzerdefinierter Parameter treffen.

Einer der wichtigsten Algorithmen ist die Berechnung des Drawdowns vom Saldo (balance) und vom Kapital (equity):

cursor.execute('SELECT MAX(balance) FROM account_history WHERE account_id = ?', (self.account_info['login'],))
result = cursor.fetchone()
max_balance = result[0] if result and result[0] is not None else initial_balance

balance_drawdown = 0
equity_drawdown = 0
drawdown_mode = self.risk_settings.get('drawdown_mode', 'balance')
limit_mode = self.risk_settings.get('limit_mode', 'percent')

if max_balance > 0:
    if drawdown_mode in ['balance', 'both']:
        balance_drawdown = (max_balance - account_info.balance) / max_balance * 100 if limit_mode == 'percent' else max_balance - account_info.balance

Das System speichert Informationen über den maximal erreichten Saldo und die Aktienwerte, sodass Sie den aktuellen Drawdown genau berechnen können. Je nach den Einstellungen des Nutzers kann der Drawdown sowohl in Prozent als auch in absoluten Werten berechnet werden.

Ein weiterer wichtiger Algorithmus ist die Analyse der täglichen und wöchentlichen Verluste:

from_date = dt.datetime.now() - dt.timedelta(days=7)
to_date = dt.datetime.now()
deals = mt5.history_deals_get(from_date, to_date) or []
daily_balance_loss = weekly_balance_loss = daily_equity_loss = weekly_equity_loss = 0

if deals:
    deals_df = pd.DataFrame(list(deals), columns=deals[0]._asdict().keys())
    today = dt.datetime.now().date()
    today_deals = deals_df[pd.to_datetime(deals_df['time']).dt.date == today]
    week_start = (dt.datetime.now() - dt.timedelta(days=dt.datetime.now().weekday())).date()
    week_deals = deals_df[pd.to_datetime(deals_df['time']).dt.date >= week_start]

    daily_balance_loss = today_deals[today_deals['profit'] < 0]['profit'].sum() if not today_deals.empty else 0
    weekly_balance_loss = week_deals[week_deals['profit'] < 0]['profit'].sum() if not week_deals.empty else 0

Das System analysiert die Historie der Handelsgeschäfte für den aktuellen Tag und die aktuelle Woche, berechnet die Gesamtverluste und vergleicht sie mit den festgelegten Limits.

Automatischer Positionsschließmechanismus

Eine der wichtigsten Funktionen unseres Systems ist die automatische Schließung von Positionen, wenn die Risikolimits überschritten werden. Dies ist ein wichtiger Schutzmechanismus, der auch bei Abwesenheit des Händlers ausgelöst wird:

limits_exceeded = daily_balance_limit_exceeded or weekly_balance_limit_exceeded or daily_equity_limit_exceeded or weekly_equity_limit_exceeded or max_drawdown_exceeded

with self.block_lock:
    if limits_exceeded and self.risk_settings.get('auto_close_positions', True):
        self.blocked_trading = True
        if positions:
            self.close_all_positions()
            self.error_signal.emit(f"All positions closed due to exceeding limits: DBL={daily_balance_limit_exceeded}, WBL={weekly_balance_limit_exceeded}, DEL={daily_equity_limit_exceeded}, WEL={weekly_equity_limit_exceeded}, MDD={max_drawdown_exceeded}")

Wird eines der konfigurierten Limits überschritten, kann das System automatisch alle offenen Positionen schließen und den weiteren Handel blockieren. Dies schützt den Händler vor katastrophalen Verlusten im Falle starker Marktbewegungen oder einer Reihe von erfolglosen Geschäften.

Der Prozess des Schließens von Positionen wird unter Berücksichtigung aller Funktionen der MetaTrader 5 API implementiert:

def close_all_positions(self):
    positions = mt5.positions_get()
    if positions is None:
        self.error_signal.emit(f"Error in retrieving positions to close: {mt5.last_error()}")
        return
    if not positions:
        self.error_signal.emit(“No open positions to close")
        return

    for position in positions:
        try:
            symbol = position.symbol
            volume = position.volume
            position_id = position.ticket
            position_type = position.type
            tick = mt5.symbol_info_tick(symbol)
            if not tick:
                self.error_signal.emit(f”Failed to retrieve data on symbol {symbol}")
                continue

            close_price = tick.bid if position_type == mt5.ORDER_TYPE_BUY else tick.ask
            close_type = mt5.ORDER_TYPE_SELL if position_type == mt5.ORDER_TYPE_BUY else mt5.ORDER_TYPE_BUY

            close_request = {
                "action": mt5.TRADE_ACTION_DEAL,
                "symbol": symbol,
                "volume": volume,
                "type": close_type,
                "position": position_id,
                "price": close_price,
                "deviation": 100,
                "comment": "Close by Risk Manager",
            }

            result = mt5.order_send(close_request)
            # Result processing...
        except Exception as e:
            self.error_signal.emit(f”Error at closing position: {str(e)}")

Das System verarbeitet sequentiell jede offene Position, bestimmt die Positionsrichtung (Kauf oder Verkauf), erhält die aktuellen Marktpreise und generiert einen Schließungsauftrag mit den entsprechenden Parametern.

Persistenz von Daten und Einstellungen

Um einen zuverlässigen Betrieb auch im Falle eines Neustarts zu gewährleisten, nutzt das System eine SQLite-Datenbank, in der alle notwendigen Informationen gespeichert werden:

def save_to_db(self, data):
    try:
        conn = sqlite3.connect(self.db_path)
        cursor = conn.cursor()

        cursor.execute('''CREATE TABLE IF NOT EXISTS accounts (
            account_id INTEGER PRIMARY KEY,
            server TEXT,
            login TEXT,
            password TEXT,
            timestamp DATETIME DEFAULT CURRENT_TIMESTAMP
        )''')

        cursor.execute('''CREATE TABLE IF NOT EXISTS account_history (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            account_id INTEGER,
            balance REAL,
            equity REAL,
            balance_drawdown REAL,
            equity_drawdown REAL,
            margin REAL,
            free_margin REAL,
            margin_level REAL,
            daily_balance_loss REAL,
            weekly_balance_loss REAL,
            daily_equity_loss REAL,
            weekly_equity_loss REAL,
            positions_count INTEGER,
            blocked_trading INTEGER,
            timestamp DATETIME DEFAULT CURRENT_TIMESTAMP
        )''')

        # Saving data to database...
    except sqlite3.Error as e:
        self.error_signal.emit(f”Database error: {str(e)}")
    finally:
        conn.close()

Die Datenbank speichert Informationen über verbundene Konten, deren Einstellungen und den Kontostatusverlauf. Damit können Sie nicht nur den Systemzustand nach dem Neustart wiederherstellen, sondern auch Daten für die Berechnung von Drawdowns und die Erstellung von Analyseberichten bereitstellen.

Visualisierung und Berichterstattung

Ein wichtiger Aspekt unseres Systems ist die übersichtliche Visualisierung der Daten und die Erstellung von Berichten. Wir verwenden die Bibliothek pyqtgraph, um Echtzeitdiagramme zu erstellen:

equity_plot = getattr(self, f"equity_plot_{account_id}")
equity_data = getattr(self, f"equity_data_{account_id}")
equity_times = getattr(self, f"equity_times_{account_id}")
equity_data.append(data['equity'])
equity_times.append(dt.datetime.now().timestamp())
if len(equity_data) > 100:
    equity_data.pop(0)
    equity_times.pop(0)
equity_plot.clear()
equity_plot.plot(equity_times, equity_data, pen=pg.mkPen(color=(0, 150, 0), width=2))

Für Wochenberichte generiert das System HTML-Seiten mit Matplotlib-Charts und Datentabellen:

def generate_weekly_report(self, data):
    try:
        conn = sqlite3.connect(self.db_path)
        df = pd.read_sql_query('SELECT timestamp, balance, equity, balance_drawdown, equity_drawdown FROM account_history WHERE account_id = ? AND timestamp >= ?',
                               conn, params=(data['account_id'], dt.datetime.now() - dt.timedelta(days=7)))

        if df.empty:
            self.error_signal.emit(f"Нет данных для отчета по счету {data['account_id']}")
            return

        table_html = df.to_html(index=False, classes='table table-striped', border=0)

        fig, ax = plt.subplots(figsize=(10, 6))
        ax.plot(pd.to_datetime(df['timestamp']), df['balance_drawdown'], label='Balance Drawdown (%)', color='blue')
        ax.plot(pd.to_datetime(df['timestamp']), df['equity_drawdown'], label='Equity Drawdown (%)', color='red')
        ax.set_title(f"Weekly Drawdown Report for Account {data['account_id']}")
        ax.set_xlabel("Date")
        ax.set_ylabel("Drawdown (%)")
        ax.legend()
        ax.grid(True)

        # Generating an HTML report...
    except Exception as e:
        self.error_signal.emit(f"Error generating report: {str(e)}")
    finally:
        conn.close()

Diese Berichte werden zu einem unschätzbaren Instrument für die Analyse der Handelsergebnisse und der Wirksamkeit des Risikomanagements.

Bereitstellung des Systems auf einem entfernten Server

Einer der Hauptvorteile unseres Risikomanagers ist die Möglichkeit, ihn auf einem entfernten Server einzusetzen, was einen kontinuierlichen Betrieb rund um die Uhr gewährleistet, unabhängig vom Zustand Ihres Hauptrechners. Dies ist besonders wichtig für professionelle Händler, die es sich nicht leisten können, dass das Überwachungssystem aufgrund eines Stromausfalls oder von Problemen mit der Internetverbindung abgeschaltet wird (oder wenn es für Sie einfach unbequem ist, den Hauptrechner ständig eingeschaltet zu lassen).

Weitere Entwicklung des Systems

Unser Risikomanagementsystem bietet eine solide Grundlage für das Risikomanagement im Handel, aber es gibt viele Möglichkeiten für seinen weiteren Ausbau:

  1. Die Integration mit mehreren MetaTrader 5/MetaTrader 4 Terminals ist für Händler gedacht, die mit verschiedenen Brokern und Plattformen arbeiten.
  2. Erweiterte Analysen – zusätzliche Leistungskennzahlen wie die Sharpe-Ratio, die maximale Serie von Verlustgeschäften, das Gewinn/Verlust-Verhältnis usw.
  3. Maschinelles Lernen ist die Vorhersage potenzieller Risiken auf der Grundlage historischer Daten und des aktuellen Marktzustands.
  4. Warnmeldungen über Telegram/Discord/Email – sofortige Benachrichtigung über kritische Ereignisse auf Ihrem Telefon oder Computer.
  5. Fortgeschrittene Strategien zur Schließung von Positionen – z. B. die teilweise Schließung von Positionen anstelle der vollständigen Schließung, wenn sich die Risikogrenzen nähern.



Schlussfolgerung

Ein Remote Risk Manager in Python ist ein leistungsfähiges Werkzeug, um Ihr Handelskapital vor übermäßigen Risiken zu schützen. Dank der Automatisierung der Risikokontrolle können Sie sich auf die Suche nach Handelsgelegenheiten konzentrieren und sich darauf verlassen, dass das System Sie vor katastrophalen Verlusten schützt.

Im heutigen wettbewerbsintensiven Umfeld der Finanzmärkte überlebt nicht derjenige, der kurzfristig den größten Gewinn erzielt, sondern derjenige, der in der Lage ist, Risiken effektiv zu managen und sein Kapital langfristig zu erhalten. Unser System hilft Ihnen, ein Teil dieser erfolgreichen Gruppe von Händlern zu werden.

Denken Sie daran: Das Hauptziel des Risikomanagements besteht nicht nur darin, Sie vor größeren Verlusten zu schützen, sondern auch darin, Ihnen psychologischen Komfort zu bieten, der es Ihnen ermöglicht, die von Ihnen gewählte Handelsstrategie auch in Zeiten von Marktstress zu verfolgen. Wie die Praxis zeigt, ist es die psychologische Disziplin, die erfolgreiche Händler oft von Verlierern unterscheidet.

Implementieren Sie das beschriebene System in Ihre Handelspraxis, passen Sie es an Ihre individuellen Bedürfnisse an und beobachten Sie, wie sich Ihre Herangehensweise an den Markt verändert, wenn Sie wissen, dass Ihr Kapital zuverlässig geschützt ist.

Übersetzt aus dem Russischen von MetaQuotes Ltd.
Originalartikel: https://www.mql5.com/ru/articles/17410

Beigefügte Dateien |
Letzte Kommentare | Zur Diskussion im Händlerforum (1)
Zhang Yi
Zhang Yi | 6 Feb. 2026 in 14:42
Es lässt sich nicht öffnen. Was soll das bringen?
Die Übertragung der Trading-Signale in einem universalen Expert Advisor. Die Übertragung der Trading-Signale in einem universalen Expert Advisor.
In diesem Artikel wurden die verschiedenen Möglichkeiten beschrieben, um die Trading-Signale von einem Signalmodul des universalen EAs zum Steuermodul der Positionen und Orders zu übertragen. Es wurden die seriellen und parallelen Interfaces betrachtet.
Vom Neuling zum Experten: Forex Markt Perioden Vom Neuling zum Experten: Forex Markt Perioden
Jede Marktperiode hat einen Anfang und ein Ende und schließt jeweils mit einem Preis, der die Stimmung definiert – ähnlich wie bei Kerzen. Anhand dieser Bezugspunkte können wir die vorherrschende Marktstimmung einschätzen und erkennen, ob Auf- oder Abwärtskräfte die Kontrolle haben. In dieser Diskussion machen wir einen wichtigen Schritt nach vorn, indem wir eine neue Funktion innerhalb des Market Periods Synchronizer entwickeln – eine Funktion, die Forex-Marktsitzungen visualisiert, um fundiertere Handelsentscheidungen zu unterstützen. Dieses Tool kann besonders hilfreich sein, um in Echtzeit festzustellen, welche Seite – Bullen oder Bären – die Sitzung dominiert. Erforschen wir dieses Konzept und entdecken wir die Erkenntnisse, die es bietet.
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.
Der Algorithmus Central Force Optimization (CFO) Der Algorithmus Central Force Optimization (CFO)
Der Artikel stellt den von den Gesetzen der Schwerkraft inspirierten Algorithmus Central Force Optimization (CFO) vor. Es wird untersucht, wie die Prinzipien der physikalischen Schwerkraft Optimierungsprobleme lösen können, bei denen „schwerere“ Lösungen weniger erfolgreiche Gegenstücke anziehen.