Forex Algorithmic Trading: Eine praktische Geschichte für Ingenieure
Veröffentlicht: 2022-03-11Wie Sie vielleicht wissen, wird der Devisenmarkt (Forex oder FX) für den Handel zwischen Währungspaaren verwendet. Aber Sie wissen vielleicht nicht, dass es der liquideste Markt der Welt ist.
Vor einigen Jahren habe ich, getrieben von meiner Neugier, meine ersten Schritte in die Welt des algorithmischen Devisenhandels unternommen, indem ich ein Demokonto erstellt und Simulationen (mit falschem Geld) auf der Handelsplattform Meta Trader 4 gespielt habe.
Nach einer Woche „Trading“ hatte ich mein Geld fast verdoppelt. Angespornt durch meinen eigenen erfolgreichen algorithmischen Handel forschte ich tiefer und meldete mich schließlich bei einer Reihe von FX-Foren an. Bald verbrachte ich Stunden damit, über algorithmische Handelssysteme (Regelsätze, die bestimmen, ob Sie kaufen oder verkaufen sollten), benutzerdefinierte Indikatoren, Marktstimmungen und mehr zu lesen.
Mein erster Kunde
Ungefähr zu dieser Zeit hörte ich zufällig, dass jemand versuchte, einen Softwareentwickler zu finden, um ein einfaches Handelssystem zu automatisieren. Das war in meiner Studienzeit, als ich etwas über nebenläufiges Programmieren in Java lernte (Threads, Semaphoren und all dieser Kram). Ich dachte, dass dieses automatisierte System nicht viel komplizierter sein könnte als meine fortgeschrittene Kursarbeit in Data Science, also erkundigte ich mich nach dem Job und kam an Bord.
Der Kunde wollte eine algorithmische Handelssoftware, die mit MQL4 erstellt wurde, einer funktionalen Programmiersprache, die von der Meta Trader 4-Plattform zur Durchführung aktienbezogener Aktionen verwendet wird.
Die Rolle der Handelsplattform (in diesem Fall Meta Trader 4) besteht darin, eine Verbindung zu einem Forex-Broker bereitzustellen. Der Broker stellt dann eine Plattform mit Echtzeitinformationen über den Markt bereit und führt Ihre Kauf-/Verkaufsaufträge aus. Für Leser, die mit dem Forex-Handel nicht vertraut sind, finden Sie hier die Informationen, die der Daten-Feed bereitstellt:
Über Meta Trader 4 können Sie auf all diese Daten mit internen Funktionen zugreifen, die in verschiedenen Zeitrahmen zugänglich sind: jede Minute (M1), alle fünf Minuten (M5), M15, M30, jede Stunde (H1), H4, D1, W1, MN .
Die Bewegung des aktuellen Preises wird als Tick bezeichnet. Mit anderen Worten, ein Tick ist eine Änderung des Geld- oder Briefkurses für ein Währungspaar. Während aktiver Märkte kann es zu zahlreichen Ticks pro Sekunde kommen. Während langsamer Märkte kann es Minuten ohne Tick geben. Der Tick ist der Herzschlag eines Devisenmarktroboters.
Wenn Sie über eine solche Plattform eine Bestellung aufgeben, kaufen oder verkaufen Sie ein bestimmtes Volumen einer bestimmten Währung. Sie legen auch Stop-Loss- und Take-Profit-Limits fest. Das Stop-Loss-Limit ist die maximale Anzahl von Pips (Preisschwankungen), die Sie sich leisten können, zu verlieren, bevor Sie einen Trade aufgeben. Das Take-Profit-Limit ist die Anzahl an Pips, die Sie zu Ihren Gunsten ansammeln, bevor Sie eine Auszahlung vornehmen.
Die algorithmischen Handelsspezifikationen des Kunden waren einfach: Sie wollten einen Forex-Roboter, der auf zwei Indikatoren basiert. Als Hintergrundinformationen sind Indikatoren sehr hilfreich, wenn Sie versuchen, einen Marktzustand zu definieren und Handelsentscheidungen zu treffen, da sie auf vergangenen Daten basieren (z. B. höchster Preiswert in den letzten n Tagen). Viele sind in Meta Trader 4 integriert. Die Indikatoren, an denen mein Kunde interessiert war, stammten jedoch aus einem benutzerdefinierten Handelssystem.
Sie wollten jedes Mal handeln, wenn sich zwei dieser benutzerdefinierten Indikatoren kreuzten, und nur in einem bestimmten Winkel.
Hand an
Als ich mir die Hände schmutzig machte, erfuhr ich, dass MQL4-Programme die folgende Struktur haben:
- [Präprozessordirektiven]
- [Externe Parameter]
- [Globale Variablen]
- [Init-Funktion]
- [Deinit-Funktion]
- [Startfunktion]
- [Benutzerdefinierte Funktionen]
Die Startfunktion ist das Herzstück jedes MQL4-Programms, da sie jedes Mal ausgeführt wird, wenn sich der Markt bewegt (dh diese Funktion wird einmal pro Tick ausgeführt). Dies ist unabhängig vom verwendeten Zeitrahmen der Fall. Sie könnten beispielsweise im Zeitrahmen H1 (eine Stunde) arbeiten, die Startfunktion würde jedoch viele tausend Mal pro Zeitrahmen ausgeführt.
Um dies zu umgehen, habe ich die Funktion gezwungen, einmal pro Periodeneinheit auszuführen:
int start() { if(currentTimeStamp == Time[0]) return (0); currentTimeStamp = Time[0]; ...
Abrufen der Werte der Indikatoren:
// Loading the custom indicator extern string indName = "SonicR Solid Dragon-Trend (White)"; double dragon_min; double dragon_max; double dragon; double trend; int start() { … // Updating the variables that hold indicator values actInfoIndicadores(); …. string actInfoIndicadores() { dragon_max=iCustom(NULL, 0, indName, 0, 1); dragon_min=iCustom(NULL, 0, indName, 1, 1); dragon=iCustom(NULL, 0, indName, 4, 1); trend=iCustom(NULL, 0, indName, 5, 1); }
Die Entscheidungslogik, einschließlich der Schnittmenge der Indikatoren und ihrer Winkel:
int start() { … if(ticket==0) { if (dragon_min > trend && (ordAbierta== "OP_SELL" || primeraOP == true) && anguloCorrecto("BUY") == true && DiffPrecioActual("BUY")== true ) { primeraOP = false; abrirOrden("OP_BUY", false); } if (dragon_max < trend && (ordAbierta== "OP_BUY" || primeraOP == true) && anguloCorrecto("SELL") == true && DiffPrecioActual("SELL")== true ) { primeraOP = false; abrirOrden("OP_SELL", false); } } else { if(OrderSelect(ticket,SELECT_BY_TICKET)==true) { datetime ctm=OrderCloseTime(); if (ctm>0) { ticket=0; return(0); } } else Print("OrderSelect failed error code is",GetLastError()); if (ordAbierta == "OP_BUY" && dragon_min <= trend ) cerrarOrden(false); else if (ordAbierta == "OP_SELL" && dragon_max >= trend ) cerrarOrden(false); } }
Versand der Bestellungen:
void abrirOrden(string tipoOrden, bool log) { RefreshRates(); double volumen = AccountBalance() * point; double pip = point * pipAPer; double ticket = 0; while( ticket <= 0) { if (tipoOrden == "OP_BUY") ticket=OrderSend(simbolo, OP_BUY, volumen, Ask, 3, 0/*Bid - (point * 100)*/, Ask + (point * 50), "Orden Buy" , 16384, 0, Green); if (tipoOrden == "OP_SELL") ticket=OrderSend(simbolo, OP_SELL, volumen, Bid, 3, 0/*Ask + (point * 100)*/, Bid - (point * 50), "Orden Sell", 16385, 0, Red); if (ticket<=0) Print("Error abriendo orden de ", tipoOrden , " : ", ErrorDescription( GetLastError() ) ); } ordAbierta = tipoOrden; if (log==true) mostrarOrden(); }
Bei Interesse finden Sie den vollständigen, lauffähigen Code auf GitHub.

Backtesting
Nachdem ich mein algorithmisches Handelssystem aufgebaut hatte, wollte ich wissen: 1) ob es sich angemessen verhält und 2) ob die verwendete Forex-Handelsstrategie gut ist.
Backtesting (manchmal „Backtesting“ geschrieben) ist der Prozess des Testens eines bestimmten (automatisierten oder nicht automatisierten) Systems unter den Ereignissen der Vergangenheit. Mit anderen Worten, Sie testen Ihr System, indem Sie die Vergangenheit als Stellvertreter für die Gegenwart verwenden.
MT4 wird mit einem akzeptablen Tool zum Backtesting einer Forex-Handelsstrategie geliefert (heutzutage gibt es professionellere Tools, die eine größere Funktionalität bieten). Zu Beginn richten Sie Ihre Zeitrahmen ein und führen Ihr Programm unter einer Simulation aus. Das Tool simuliert jeden Tick in dem Wissen, dass es für jede Einheit zu einem bestimmten Preis öffnen, zu einem bestimmten Preis schließen und bestimmte Hochs und Tiefs erreichen sollte.
Nachdem Sie die Aktionen des Programms mit historischen Preisen verglichen haben, haben Sie ein gutes Gefühl dafür, ob es korrekt ausgeführt wird oder nicht.
Beim Backtesting hatte ich das Renditeverhältnis des FX-Roboters für einige zufällige Zeitintervalle überprüft; Unnötig zu erwähnen, dass ich wusste, dass mein Mandant damit nicht reich werden würde – die von ihm gewählten Indikatoren und die Entscheidungslogik waren nicht rentabel . Als Beispiel sind hier die Ergebnisse der Ausführung des Programms über das M15-Fenster für 164 Operationen:
Beachten Sie, dass unser Gleichgewicht (die blaue Linie) unter seinem Startpunkt endet.
Parameteroptimierung und ihre Lügen
Obwohl mich das Backtesting hinsichtlich der Nützlichkeit dieses FX-Roboters misstrauisch gemacht hatte, war ich fasziniert, als ich anfing, mit seinen externen Parametern herumzuspielen und große Unterschiede im Gesamtrenditeverhältnis bemerkte. Diese besondere Wissenschaft ist als Parameteroptimierung bekannt.
Ich habe einige grobe Tests durchgeführt, um zu versuchen, die Bedeutung der externen Parameter für das Return Ratio abzuleiten, und bin auf Folgendes gekommen:
Oder aufgeräumt:
Sie denken vielleicht (so wie ich), dass Sie den Parameter A verwenden sollten. Aber die Entscheidung ist nicht so einfach, wie es scheinen mag. Beachten Sie insbesondere die Unvorhersehbarkeit von Parameter A: Bei kleinen Fehlerwerten ändert sich seine Rückgabe dramatisch. Mit anderen Worten, Parameter A wird zukünftige Ergebnisse sehr wahrscheinlich überschätzen, da jede Unsicherheit, jede Verschiebung überhaupt zu einer schlechteren Leistung führt.
Aber in der Tat ist die Zukunft ungewiss! Und damit ist auch die Rückgabe von Parameter A ungewiss. Die beste Wahl ist tatsächlich, sich auf Unvorhersehbarkeit zu verlassen. Häufig ist ein Parameter mit niedrigerer maximaler Rendite, aber besserer Vorhersagbarkeit (weniger Fluktuation) einem Parameter mit hoher Rendite, aber schlechter Vorhersagbarkeit vorzuziehen.
Das einzige, was Sie sicher sein können, ist, dass Sie die Zukunft des Marktes nicht kennen, und zu glauben, Sie wüssten, wie sich der Markt auf der Grundlage vergangener Daten entwickeln wird, ist ein Fehler. Im Gegenzug müssen Sie diese Unvorhersehbarkeit in Ihren Forex-Prognosen anerkennen.
Dies bedeutet nicht unbedingt, dass wir Parameter B verwenden sollten, da selbst die niedrigeren Renditen von Parameter A besser abschneiden als Parameter B; dies soll Ihnen nur zeigen, dass die Optimierung von Parametern zu Tests führen kann, die wahrscheinliche zukünftige Ergebnisse überbewerten, und ein solches Denken ist nicht offensichtlich.
Allgemeine Überlegungen zum algorithmischen Forex-Handel
Seit dieser ersten Erfahrung mit algorithmischem Forex-Handel habe ich mehrere automatisierte Handelssysteme für Kunden gebaut, und ich kann Ihnen sagen, dass es immer Raum für Erkundungen und weitere Forex-Analysen gibt. Zum Beispiel habe ich kürzlich ein System gebaut, das darauf basiert, sogenannte „Big Fish“-Bewegungen zu finden; das heißt, riesige Pips-Variationen in winzigen, winzigen Zeiteinheiten. Das ist ein Thema, das mich fasziniert.
Der Aufbau Ihres eigenen FX-Simulationssystems ist eine hervorragende Option, um mehr über den Handel auf dem Devisenmarkt zu erfahren, und die Möglichkeiten sind endlos. Sie könnten beispielsweise versuchen, die Wahrscheinlichkeitsverteilung der Preisschwankungen als Funktion der Volatilität in einem Markt (z. B. EUR/USD) zu entschlüsseln und möglicherweise ein Monte-Carlo-Simulationsmodell unter Verwendung der Verteilung pro Volatilitätszustand zu erstellen, wobei ein beliebiger Grad von verwendet wird Genauigkeit, die Sie wollen. Ich überlasse dies als Übung für den eifrigen Leser.
Die Forex-Welt kann manchmal überwältigend sein, aber ich hoffe, dass dieser Artikel Ihnen einige Hinweise gegeben hat, wie Sie mit Ihrer eigenen Forex-Handelsstrategie beginnen können.
Weiterführende Lektüre
Heutzutage gibt es einen riesigen Pool an Tools zum Erstellen, Testen und Verbessern von Handelssystemautomatisierungen: Trading Blox zum Testen, NinjaTrader zum Trading, OCaml zum Programmieren, um nur einige zu nennen.
Ich habe viel über die mysteriöse Welt des Devisenmarktes gelesen. Hier sind ein paar Artikel, die ich Programmierern und begeisterten Lesern empfehle:
- BabyPips: Dies ist der Ausgangspunkt, wenn Sie nichts über den Forex-Handel wissen.
- Der Weg der Schildkröte, von Curtis Faith: Dies ist meiner Meinung nach die Forex-Bibel . Lesen Sie es, sobald Sie etwas Erfahrung im Handel haben und einige Forex-Strategien kennen.
- Technische Analyse für den Trading-Profi – Strategien und Techniken für die turbulenten globalen Finanzmärkte von heute, von Constance M. Brown
- Expert Advisor Programming – Erstellen automatisierter Handelssysteme in MQL für Meta Trader 4, von Andrew R. Young
- Trading Systems – A New Approach to System Development and Portfolio Optimisation, von Urban Jeckle und Emilio Tomasini: Sehr technisch, sehr fokussiert auf FX-Tests.
- A Step-by-Step Implementation of a Multi-Agent Currency Trading System, von Rui Pedro Barbosa und Orlando Belo: Dieses Buch ist sehr professionell und beschreibt, wie Sie ein Handelssystem und eine Testplattform erstellen können.