Arbitrage-Handel im Forex: Ein einfacher synthetischer Market-Maker-Bot für den Einstieg
Einleitung: Vom Einzelhändler zum institutionellen Denken
Ich werde oft gefragt, wie ich dazu kam, TrisWeb_Optimized zu entwickeln. Die Geschichte beginnt im Jahr 2016, als ich mich zum ersten Mal in die Welt des Forex stürzte, mit der Naivität eines Neulings und dem Glauben an den Indikatorhandel. Damals glaubte ich noch an den „heiligen Gral“ des Handels – eine magische Kombination von Indikatoren, die angeblich 1.000 USD in einem Jahr in eine Million verwandeln würde.
Die Revolution in meinem Denken fand 2017 statt, als ich nach einer Reihe von schmerzhaften Verlusten begann zu studieren, wie große Spieler tatsächlich handeln. Damit meine ich nicht diejenigen, die auf YouTube über ihre „Millionengewinne“ sprechen, sondern echte Institutionen – Banken, Hedgefonds und Eigenhandelsfirmen.
Und das habe ich herausgefunden: Sie verwenden keine ausgefallenen Indikatorstrategien. Sie wenden mathematische Prinzipien, Risikomanagement, Arbitrage, Market Making und andere Ansätze an, die auf einem grundlegenden Verständnis der Marktmechanismen basieren. In diesem Moment habe ich meine Entscheidung getroffen: Ich musste handeln wie ein großer Spieler oder gar nicht handeln.
Die nächsten drei Jahre verbrachte ich mit dem Studium institutioneller Handelsmethoden. Ich tauchte in die Welt der Intermarket-Korrelationen, der statistischen Arbitrage und des algorithmischen Handels ein. Ich experimentierte mit Python und MQL und schuf Prototypsysteme, die die Ansätze großer Marktteilnehmer nachahmten, aber für Kleinhändler mit ihren Kapital- und Technologiebeschränkungen angepasst wurden.
Im Januar 2020, am Vorabend einer der turbulentesten Zeiten in der Geschichte der Finanzmärkte, wurde Tris_Optimized geboren – meine Antwort auf die Frage: „Wie kann ein Einzelhändler institutionelle Strategien anwenden?“
Dieser EA versucht nicht, Marktbewegungen vorherzusagen, stützt sich nicht auf Indikatoren der technischen Analyse und erfordert keine „Intuition“. Stattdessen berechnet es auf mathematische Weise potenzielle Ungleichgewichte zwischen drei miteinander verbundenen Währungspaaren und platziert eine Reihe von Aufträgen, um diese Ungleichgewichte aufzufangen, wenn sie entstehen.
In fünf Jahren Dauerbetrieb unter realen Marktbedingungen hat Tris_Optimized seine Tauglichkeit bewiesen. Er hat Pandemien, Inflationsschübe, Zinsänderungen und geopolitische Krisen überstanden – und wirft weiterhin beständige Gewinne ab (in den seltenen Fällen, in denen ich tatsächlich handele, anstatt die ganze Nacht über Code-Ideen und die tatsächlichen Codes zu brüten). Es handelt sich nicht um ein Wundersystem, das exorbitante Renditen verspricht, sondern um ein zuverlässiges Arbeitsinstrument, das auf den Grundprinzipien des institutionellen Handels beruht.
Dieses Fundament institutionellen Denkens ermöglicht es mir heute, erfolgreich auf verschiedenen Märkten zu handeln. Während ich mich in den letzten Jahren auf Strategien des maschinellen Lernens konzentriert habe, bleiben Arbitrage-Ansätze immer ein wichtiger Teil meines Handelsarsenals. Die Kombination von statistischen ML-Methoden mit den von institutionellen Händlern verwendeten fundamentalen Marktmustern verschafft mir einen erheblichen Vorteil. Ich wurde sogar zu einem kleinen, nicht sehr bekannten Hedgefonds eingeladen. Außer mir hat der Fonds nur einen Risikomanager und einen Verwalter, und wir warne nahe dran, eine Infrastruktur für Hedgefonds auf Basis des MetaTrader 5 fertigzustellen.
Vor ein paar Wochen habe ich meinen Cloud-Speicher überprüft und bin dabei auf ein Archiv mit meinen alten Handelsrobotern gestoßen. Dazu gehörte auch Triss_Optimized, eines meiner ersten Projekte, das trotz seiner „Einfachheit“ im Vergleich zu modernen ML-Systemen weiterhin funktioniert und Ergebnisse liefert. Ich habe es auf einem Testkonto laufen lassen und war überrascht – selbst ohne Optimierung für die aktuellen Marktbedingungen zeigte es positive Ergebnisse.
Daraufhin beschloss ich, diesen Code mit der Gemeinschaft zu teilen. Nicht, weil es sich um ein revolutionäres System handelt, das Sie innerhalb eines Monats zum Millionär macht, sondern weil dieser Code ein gutes Beispiel dafür ist, wie Sie als Einzelhändler einen institutionellen Ansatz auf den Handel anwenden können. Es ist eine Art Brücke zwischen zwei Welten, die Ihnen helfen kann, den gleichen Übergang zu schaffen, den ich einst gemacht habe.
In diesem Artikel werde ich die Funktionsweise von TrisWeb_Optimized erläutern, seine Architektur erklären und meine Erfahrungen mit seiner Einrichtung und Optimierung teilen. Sind Sie bereit, in die Welt des professionellen algorithmischen Handels einzutauchen? Dann lasst uns beginnen.
Drei-Währungs-Devisenarbitrage: Das EURUSD-GBPUSD-EURJPY-Dreieck
Beginnen wir mit der Tatsache, dass die Dreiecksarbitrage am Forex eine echte Geisterjagd ist. Stellen Sie sich folgende Situation vor: Sie beobachten gleichzeitig EURUSD, GBPUSD und EURJPY und versuchen, ein flüchtiges Kursungleichgewicht zu erwischen – wenn eine geschlossene Schleife EUR→USD→GBP→EUR Ihnen zumindest ein paar Pips Nettogewinn beschert. Aber die Wahrheit ist, dass reine Arbitragemöglichkeiten so selten sind wie Einhörner in der Moskauer Innenstadt. Die Institute mit ihren Hochfrequenz-Algorithmen und ihrem direkten Zugang zu Liquidität nutzen diese Chancen schneller, als man blinzeln kann.
Deshalb habe ich TrisWeb_Optimized entwickelt – einen EA, der nicht auf ideale Bedingungen wartet, sondern stattdessen ein dreidimensionales Netz von Aufträgen aufbaut, um Gewinne aus natürlichen Marktschwankungen zu erzielen. Dabei handelt es sich nicht um klassische Arbitrage im akademischen Sinne, sondern um eine Guerilla-Strategie eines Einzelhändlers, der die mathematischen Beziehungen zwischen drei Währungspaaren ausnutzt.
Synthetische Währungspaare in MQL5: Eine geheime Tür zur Arbitrage
Was ist ein synthetisches Währungspaar? Es ist ein Phantom, eine mathematische Abstraktion, die wir aus real gehandelten Instrumenten konstruieren. Beispielsweise können wir anhand der EURUSD- und GBPUSD-Kurse einen synthetischen EURGBP berechnen, der theoretisch genau dem realen EURGBP entsprechen sollte. Aber in der realen Welt gibt es immer Diskrepanzen, und sie sind unser tägliches Brot.
TrisWeb_Optimized erstellt keine expliziten Synthetics, sondern spielt mit deren unsichtbaren Strings. Hier ist ein Codeschnipsel, mit dem wir die aktuellen Preise für jedes Symbol ermitteln – der erste Schritt bei der Suche nach Ungleichgewichten:
// Get the current prices for each symbol double priceSymbol1 = GetCurrentPrice(Symbol1); double priceSymbol2 = GetCurrentPrice(Symbol2); double priceSymbol3 = GetCurrentPrice(Symbol3);
Diese drei Fäden sind der Einstieg in einen mehrdimensionalen Raum der Möglichkeiten, in dem sich die kleinsten Abweichungen in echtes Geld verwandeln.
TrisWeb_Optimierte Architektur: Maschine, die die Pandemie überlebt hat
Als ich im Januar 2020 die ersten Stränge von TrisWeb_Optimized schrieb, stand die Welt am Rande einer Pandemie, von Marktturbulenzen und wahnsinniger Volatilität. Niemand hätte vorhersagen können, dass dieser einfache EA in einigen der extremsten Marktbedingungen seit Jahrzehnten seine Feuertaufe bestehen würde. Und wissen Sie was? Es hat überlebt. Es blühte sogar auf.
Das Herz des Systems schlägt in der Funktion OnTick() – sie wird bei jeder Kursänderung ausgelöst und analysiert das gesamte Bild an drei Fronten gleichzeitig:
void OnTick() { // Calculate orders and profits int ordersCount1 = 0, ordersCount2 = 0, ordersCount3 = 0; double profit1 = 0, profit2 = 0, profit3 = 0; // Count pending orders CountPendingOrders(ordersCount1, ordersCount2, ordersCount3); // Calculate open positions and their profit CountOpenPositions(ordersCount1, ordersCount2, ordersCount3, profit1, profit2, profit3); // ... rest of the code }
Es scheint ein normaler Code zu sein. Hinter diesen Fäden verbirgt sich jedoch eine elegante modulare Architektur – jeder Aspekt des Systems ist als separate Funktion isoliert, wie ein separates Organ in einem gut koordinierten Organismus. Keine Verwirrung, keine Unordnung – nur eine klare Aufgabenteilung.
Anpassung der Netzparameter: Ein Tanz mit der Unbeständigkeit
Der Devisenmarkt ist wie ein Ozean – EURUSD fließt langsam und majestätisch wie tiefe Strömungen, während EURJPY in einem plötzlichen Tsunami explodieren kann. Der Versuch, diese Paare mit denselben Parametern zu handeln, ist ein sicherer Weg zur Enttäuschung. Aus diesem Grund ermöglicht TrisWeb_Optimized die Anpassung der Rasterparameter für jedes Werkzeug:
input group "Step Settings" input int Step01_Symbol1 = 40; // Initial step for Symbol1 (in points) input int Step02_Symbol1 = 60; // Step between orders for Symbol1 (in points) input int Step01_Symbol2 = 40; // Initial step for Symbol2 (in points) input int Step02_Symbol2 = 60; // Step between orders for Symbol2 (in points) input int Step01_Symbol3 = 40; // Initial step for Symbol3 (in points) input int Step02_Symbol3 = 60; // Step between orders for Symbol3 (in points)
In den fünf Jahren, in denen ich mit diesem System arbeite, habe ich ein einzigartiges Ritual entwickelt: Für ruhige Paare wie EURUSD verwende ich Standardschritte von 40 und 60 Punkten, während ich sie bei feurigen JPY-Kreuzungen auf 50 und 80 erhöhe. Es ist, als würde man die Empfindlichkeit der Angelrute für verschiedene Fischarten einstellen – mit dem gleichen Ansatz fängt man entweder alles oder nichts.
Optimierung der Losgröße: Adaptives System DNA
Eine feste Losgröße ist der Weg des Anfängers. Ein Profi weiß: Volumen muss mit dem Kontostand atmen. TrisWeb_Optimized kann dies dank der Funktion CalculateOptimalLotSize() tun, die ich als mein kleines Meisterwerk betrachte:
double CalculateOptimalLotSize(string symbol, double baseSize) { if(!AutoLotOptimization) return baseSize; double accountBalance = AccountInfoDouble(ACCOUNT_BALANCE); double lotStep = SymbolInfoDouble(symbol, SYMBOL_VOLUME_STEP); double minLot = SymbolInfoDouble(symbol, SYMBOL_VOLUME_MIN); // ... the rest of the calculation code }Diese Funktion ist ein echtes Schweizer Taschenmesser. Es berücksichtigt den aktuellen Kontostand, den eingestellten Risikoprozentsatz, den Pip-Wert für ein bestimmtes Symbol, die Beschränkungen des Brokers in Bezug auf die Mindestlosgröße und den Schritt, und außerdem – und darauf bin ich besonders stolz – passt es die Berechnungen für exotische Währungen automatisch an:
// Adjustment for pairs with JPY and other exotic currencies string quoteCurrency = StringSubstr(symbol, 3, 3); if(quoteCurrency == "JPY" || quoteCurrency == "XAU" || quoteCurrency == "XAG") pointCost *= 100.0;
Für Uneingeweihte: Der Wert eines Pips bei Paaren mit dem japanischen Yen ist 100 Mal geringer als bei den wichtigsten Paaren. Vergessen Sie diese Einstellung, und Ihr Roboter wird entweder mikroskopisch kleine Volumina handeln oder Sie in einer Sitzung ruinieren.
EA-Betrieb Zeitmanagement: Algorithmus für den zirkadianen Rhythmus
Der Devisenmarkt ist rund um die Uhr in Betrieb, aber das bedeutet nicht, dass Ihr EA dasselbe tun sollte. Es gibt Zeiten, in denen es am besten ist, beiseite zu treten – die Übernachtsitzung mit ihren großen Spreads und unnatürlichen Bewegungen bringt oft mehr Probleme als Chancen. TrisWeb_Optimized hat dank der Funktion IsWorkTime() einen eingebauten „zirkadianen Rhythmus“:
bool IsWorkTime() { MqlDateTime currentTime; TimeToStruct(TimeLocal(), currentTime); datetime currentTimeSeconds = HoursMinutesToSeconds(currentTime.hour, currentTime.min); datetime startTimeSeconds = HoursMinutesToSeconds(StartTimeHour, StartTimeMin); datetime endTimeSeconds = HoursMinutesToSeconds(EndTimeHour, EndTimeMin); return (startTimeSeconds <= currentTimeSeconds && currentTimeSeconds <= endTimeSeconds); }Die Funktion CheckNewDayAndWorkTime() fügt dem EA eine weitere menschliche Eigenschaft hinzu – die Fähigkeit, an jedem neuen Tag „mit einer weißen Weste zu beginnen“:
void CheckNewDayAndWorkTime() { if(IsNewDay && IsNewDayReset && IsWorkTime()) { DeleteAllOrders(); IsNewDay = false; } if(!IsWorkTime()) { IsNewDay = true; } }
Dies ist langfristig besonders wertvoll, da das System keinen Rückstau an veralteten Aufträgen anhäuft, sondern das Netz ständig entsprechend den aktuellen Marktbedingungen aktualisiert.
Algorithmus zum Verlassen von Positionen: Die Kunst, pünktlich zu gehen.
Im Handel wie im Leben ist es nicht nur wichtig, zum richtigen Zeitpunkt einzusteigen, sondern auch zum richtigen Zeitpunkt auszusteigen. TrisWeb_Optimized verwendet ein einfaches, aber effizientes Kriterium – das Erreichen einer bestimmten Höhe des Gesamtgewinns:
// Total number of orders int totalOrders = ordersCount1 + ordersCount2 + ordersCount3; double totalProfit = profit1 + profit2 + profit3; // If there are no orders, create them; if there are, check for profit. if(totalOrders == 0) { if(IsWorkTime()) { PlaceInitialOrders(); } } else if(totalProfit > Profit) { DeleteAllOrders(); }Aber der Teufel steckt wie immer im Detail. Das System berücksichtigt nicht nur den „nackten“ Gewinn, sondern das Gesamtergebnis unter Berücksichtigung von Swaps und Provisionen:
double swap = PositionGetDouble(POSITION_SWAP); double profit = PositionGetDouble(POSITION_PROFIT); double commission = PositionGetDouble(POSITION_COMMISSION); double totalProfitForPosition = profit + swap + commission;
Dies ist entscheidend für die langfristige Performance, insbesondere wenn Sie Positionen über Nacht halten, wenn Swaps berechnet werden. Andernfalls kann es passieren, dass das System profitable Kombinationen ignoriert oder umgekehrt solche für profitabel hält, die aufgrund negativer Swaps eigentlich Verluste bringen.
Feinabstimmung der Auftragsausführung: Der Pakt mit dem Marktteufel
In der Welt des Hochfrequenzhandels kann die Qualität der Ausführung den Unterschied zwischen Gewinn und Verlust ausmachen. TrisWeb_Optimized verwendet MQL5-Strukturen auf niedriger Ebene, um eine maximale Kontrolle über den Auftragserteilungs- und Ausführungsprozess zu gewährleisten:
bool OpenBuyStop(string symbol, double volume, double openPrice) { MqlTradeRequest request = {}; MqlTradeResult result = {}; request.action = TRADE_ACTION_PENDING; request.symbol = symbol; request.volume = volume; request.type = ORDER_TYPE_BUY_STOP; request.price = openPrice; request.deviation = Deviation; request.magic = EXPERT_MAGIC; if(UseCommentsInOrders) request.comment = OrderComment; if(!OrderSend(request, result)) { Print("OrderSend error ", GetLastError(), " retcode: ", result.retcode); return false; } return true; }Besondere Aufmerksamkeit sollte dem Parameter Abweichung gewidmet werden – er bestimmt, wie weit der Auftrag vom gewünschten Preis entfernt ausgeführt werden kann:
input int Deviation = 3; // Acceptable price deviation
Dies ist Ihre Vereinbarung mit dem Marktteufel: „Ich bin bereit, eine Leistung zu akzeptieren, die 3 Punkte schlechter ist als die von mir geforderte, aber nicht mehr“. In Zeiten hoher Volatilität kann dies den Unterschied zwischen einem erfüllten Auftrag und einer verpassten Gelegenheit ausmachen. Bei einem zu kleinen Wert werden Ihre Aufträge aufgrund von Requotes abgelehnt, bei einem zu großen Wert riskieren Sie, zu einem unerwartet schlechten Preis ausgeführt zu werden.
Anzeige und Analyse von Informationen in Echtzeit: die Augen und Ohren des Händlers
Als ich mit der Entwicklung von TrisWeb_Optimized begann, erkannte ich, dass eines der Hauptprobleme vieler EAs darin besteht, dass sie wie eine „Black Box“ funktionieren, die den Händler daran hindert zu verstehen, was vor sich geht. Deshalb habe ich die Ausgabe detaillierter Informationen über die Funktion DisplayInfo() hinzugefügt:
void DisplayInfo(int totalOrders, double totalProfit, double profit1, double profit2, double profit3, int count1, int count2, int count3) { string info = ""; if(AutoLotOptimization) { double lot1 = CalculateOptimalLotSize(Symbol1, Lot_Symbol1); double lot2 = CalculateOptimalLotSize(Symbol2, Lot_Symbol2); double lot3 = CalculateOptimalLotSize(Symbol3, Lot_Symbol3); info += "Auto Lot: " + Symbol1 + "=" + DoubleToString(lot1, 2) + ", " + Symbol2 + "=" + DoubleToString(lot2, 2) + ", " + Symbol3 + "=" + DoubleToString(lot3, 2) + "\n"; } // ... the rest of the information generation code Comment(info); }Sie können zwischen einem einfachen Anzeigemodus (für diejenigen, die Minimalismus bevorzugen) und einer detaillierten Analyse wählen, die eine Aufschlüsselung für jedes Währungspaar enthält:
input bool DisplayDetailedInfo = false; // Show detailed information
Es ist wie der Unterschied zwischen dem einfachen Armaturenbrett eines alten Autos, das nur einen Tachometer und eine Tankanzeige hat, und einem modernen Cockpit mit Dutzenden von Anzeigen und Monitoren – die Wahl hängt von Ihrem Fahrstil ab.
Hier sehen Sie, wie sich eines der alten Sets verhielt:
Skalierung des Systems: Von einem einfachen Bot zu einem Handelsimperium
TrisWeb_Optimized ist nicht nur ein fertiger EA, sondern eine Grundlage für den Aufbau Ihres eigenen Arbitrage-Imperiums. In den fünf Jahren seiner Entwicklung habe ich es immer wieder verändert, neue Funktionen hinzugefügt und bestehende optimiert. Hier sind einige Richtungen, in denen Sie das System entwickeln können:
Die Integration mit Python eröffnet enorme Möglichkeiten für Korrelationsanalysen und die Anwendung von Methoden des maschinellen Lernens. Stellen Sie sich vor, Sie könnten nicht nur die aktuellen Kurse, sondern auch die historischen Interaktionsmuster zwischen drei Währungspaaren analysieren und die wahrscheinlichsten Ungleichgewichte vorhersagen.
Benachrichtigungen über die Telegram-API machen Ihre Strategie noch mobiler – Sie werden immer über wichtige Ereignisse informiert, auch wenn Sie nicht in der Nähe Ihres Handelsterminals sind. Dies ist besonders wertvoll, wenn der EA auf einem entfernten VPS ausgeführt wird.
Die Ausweitung auf weitere Währungspaare macht TrisWeb zu einer vollwertigen Arbitrage-Plattform. Warum sollten Sie sich auf drei Instrumente beschränken, wenn Sie ein Netzwerk aus Dutzenden miteinander verbundener Paare schaffen können, das Hunderte potenzieller Arbitragemöglichkeiten aufzeigt?
All diese Änderungen erfordern nur minimale Eingriffe in den bestehenden Code, wobei die Grundstruktur und die Betriebslogik erhalten bleiben. Es ist wie beim Bau zusätzlicher Räume in einem bestehenden Haus – das Fundament ist bereits gelegt, es muss nur noch die Wohnfläche erweitert werden.
Anstelle einer Schlussfolgerung
Vor fünf Jahren, als die erste Version von TrisWeb_Optimized veröffentlicht wurde, hätte ich mir nicht vorstellen können, welchen Weg es nehmen würde. Es hat Marktstürme, Zeiten extremer Volatilität und relative Ruhe überstanden. Es hat sich von einem einfachen Skript zu einem ausgereiften Handelssystem entwickelt. Aber das Wichtigste ist, dass es nie aufgehört hat, Gewinn zu machen.
Im nächsten Teil des Artikels werden wir uns mit den praktischen Aspekten der Einrichtung von TrisWeb_Optimized befassen, reale Beispiele für den Betrieb des Systems untersuchen und Geheimnisse für die Optimierung von Parametern für verschiedene Marktbedingungen teilen. Bleiben Sie dran – die interessantesten Dinge kommen erst noch!
Übersetzt aus dem Russischen von MetaQuotes Ltd.
Originalartikel: https://www.mql5.com/ru/articles/17424
Warnung: Alle Rechte sind von MetaQuotes Ltd. vorbehalten. Kopieren oder Vervielfältigen untersagt.
Dieser Artikel wurde von einem Nutzer der Website verfasst und gibt dessen persönliche Meinung wieder. MetaQuotes Ltd übernimmt keine Verantwortung für die Richtigkeit der dargestellten Informationen oder für Folgen, die sich aus der Anwendung der beschriebenen Lösungen, Strategien oder Empfehlungen ergeben.
Die Übertragung der Trading-Signale in einem universalen Expert Advisor.
Neuroboids Optimierungsalgorithmus (NOA)
Eine alternative Log-datei mit der Verwendung der HTML und CSS
Vom Neuling zum Experten: Zeitlich gefilterter Handel
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Expert Advisors, die in Artikeln veröffentlicht oder in CodeBase gepostet werden, sind nicht profitabel.
Profitabel oder nicht profitabel ist das Ergebnis einer Kombination aus Trader+technischen Mitteln (Expert Advisors eingeschlossen).
In den Artikeln und in der Codebase gab es viele vernünftige, aber je weiter man geht, desto mehr falsche, die weder dem Trader noch den Entwicklern in irgendeiner Weise helfen. arbitrage von Währungssynthetik ist eine davon.
profitabel ist oder nicht, ist das Ergebnis einer Kombination aus Händlern und technischen Mitteln (einschließlich Beratern).
In den Artikeln und in der Codobase gab es eine Menge vernünftiger Ratschläge, aber je weiter man geht, desto mehr falsche Ratschläge gibt es, die weder dem Händler noch den Entwicklern in irgendeiner Weise helfen. Arbitrage von Währungssynthetik ist einer davon.
... Ich habe es in den EA einprogrammiert...
Hallo. Sehr interessant, was haben Sie in Ihren EA einprogrammiert? Ich würde gerne die Details wissen.
Mit freundlichen Grüßen, Vladimir.
Ich muss sagen, dass dieser Typ so gut wie nichts weiß.
Der Wert ist immer 0, und von hier aus ist es klar, dass er hier ist, um sein Honorar zu betrügen. 😂😂😂😂
Das Schlüsselwort ist "früher"! ) Aber jetzt nicht mehr.