Positionslimits, Margin, Fat-Finger-Grenzen und ein Kill Switch müssen bei jeder Order antworten, bevor sie das Gateway verlässt. So leben diese Checks im Order-Pfad statt daneben: welcher Zustand im Speicher liegt, was inkrementell neu berechnet wird und was nach einem Neustart passiert. Die Randbedingungen kommen zuerst.
Eine Order trifft am Gateway ein. Bevor sie zum Venue hinausgeht, muss etwas entscheiden, ob das Konto sie senden darf. Diese Entscheidung läuft bei jeder Order, auch bei der überwältigenden Mehrheit, die völlig in Ordnung ist, also zahlt der gesamte normale Verkehr ihre Kosten und nicht nur die Rejects.
Das ist die Randbedingung, die zuerst zu nennen ist. Ein Risk-Check im Order-Pfad ist eine Steuer auf den Order-Eingang. Die technische Frage ist nicht, wie man den Check clever macht, sondern wie man ihn klein genug macht, dass Trader ihn nicht spüren, und ehrlich genug, dass er die Orders trotzdem ablehnt, die er ablehnen muss.
Der Hot Path beantwortet genau eine Frage: Darf diese Order jetzt gesendet werden, angesichts dessen, was wir aktuell über dieses Konto wissen. Checks, die diese Frage beantworten, bleiben drin. Checks, die eine andere Frage beantworten, ziehen aus.
Alles andere läuft neben dem Pfad, auf demselben Zustand, ohne die Order aufzuhalten. Es speist die Limits, die der Hot Path durchsetzt, aber es sitzt nicht zwischen Trader und Venue.
Die Trennlinie ist eine Frage, keine Kategorie. Im Pfad: Darf diese Order hinaus. Neben dem Pfad: Wie sollten die Limits sein. Alles, was die zweite Frage beantwortet und die Order trotzdem aufhält, ist ein Designfehler, so wichtig der Check auch sein mag.
Der Zustand, den ein Pre-Trade-Check braucht - aktuelle Positionen, offene Orders, genutzte und verfügbare Margin, Limit-Konfiguration -, liegt im Speicher des Prozesses, der die Entscheidung trifft. Nicht in einem Cache vor einer Datenbank, nicht hinter einem Netzwerkaufruf. Im Prozess.
Der Grund ist nicht nur Geschwindigkeit, obwohl eine Query um Größenordnungen teurer ist als ein Lookup in einem lokalen Array. Der Grund ist Korrektheit. Eine Datenbank hält die Position so, wie sie geschrieben wurde. Der Risk-Check braucht die Position einschließlich der eben gesendeten Orders, die noch nicht ausgeführt, bestätigt oder persistiert sind. Liest man aus dem Speicher, prüft man gegen eine Vergangenheit, die der eigene Flow bereits überholt hat.
Praktisch prägt das den Prozess so, wie jede latenzarme Komponente geprägt wird:
In der Datenbank wird die Position festgehalten. Sie ist nicht der Ort, an dem die Position bekannt ist.
Eine vollständige Neuberechnung von Exposure und Margin eines Kontos läuft über jede Position und jede offene Order. Diese Kosten wachsen mit der Größe des Buchs, womit der Risk-Check ausgerechnet für die Kunden langsamer würde, die am meisten handeln. Deshalb rechnet der Hot Path nicht neu. Er wendet ein Delta an.
Das Konto führt laufende Aggregate - Netto- und Brutto-Exposure je Instrument und je Gruppe, genutzte Margin, Nominalwert in Flight. Eine eingehende Order erzeugt eine kleine Änderung dieser Aggregate, die geänderten Werte werden gegen die Limits verglichen, und die Order wird angenommen oder abgelehnt. Der Aufwand ist proportional zur Order, nicht zum Portfolio.
Die vollständige Neuberechnung findet weiterhin statt - nach Zeitplan, bei Änderung der Margin-Parameter und als periodische Selbstprüfung gegen das inkrementelle Ergebnis. Sie läuft neben dem Pfad, auf einer Kopie, und ihr Ergebnis wird entweder eingetauscht oder als Diskrepanz gemeldet. Inkrementeller Zustand, der still vom wahren Zustand abdriftet, ist schlimmer als gar kein Check, deshalb ist der Vergleich nicht optional.
Gemessen auf dem Risikopfad, den wir bauen, ist der Pre-Trade-Check selbst in <1 ms abgeschlossen. Diese Zahl umfasst die Entscheidung auf In-Memory-Zustand, nicht den vollen Weg einer Order vom Kunden zum Venue und zurück.
Ein Kill Switch wird genau dann eingesetzt, wenn bereits etwas nicht stimmt. Das schließt aus, ihn auf der Maschinerie aufzubauen, die selbst das Problem sein könnte. Er ist ein eigener Pfad mit eigenen Regeln.
Neue Orders zu stoppen ist die leichte Hälfte. Die schwerere Hälfte ist, was der Switch mit Orders macht, die bereits am Venue ruhen: Quotes zu ziehen und offene Orders zu stornieren muss möglich sein, während der Sendepfad deaktiviert ist. Dieser Cancel-Pfad verdient eigene Tests, denn er wird am schlimmsten Tag geübt und nicht an einem normalen.
Der In-Memory-Zustand ist eine abgeleitete Sicht auf einen dauerhaften Datensatz. Genau das macht einen Neustart überlebbar. Jedes Event, das den Risikozustand ändert - eine angenommene Order, eine freigegebene Reservierung, ein angewandter Fill, ein geändertes Limit, der aktivierte Switch -, wird auf der lokalen Maschine an ein Journal angehängt, bevor es stromabwärts wirkt.
Die Wiederherstellungszeit hängt dann von der Journallänge und der Verfügbarkeit der Drop Copy ab, nicht von der Größe des Buchs, und der Fehlermodus jeder Unbekannten ist derselbe: den Handel für das Konto verweigern.
Die ehrlichen Grenzen sollte man klar benennen, denn sie entscheiden, ob diese Architektur überhaupt passt:
amBrain baut solche Pre-Trade-Risk-Pfade für Broker und Prop-Firmen, mit Hot Paths in Rust. Das Team arbeitet seit 2019 von Jerewan, Armenien aus an Trading-Infrastruktur.
Unser Engineering-Team ist auf FinTech-Lösungen spezialisiert. Lassen Sie uns besprechen, wie wir Ihr Projekt umsetzen.