Limites de position, marge, bornes fat-finger et kill switch doivent répondre sur chaque ordre avant qu'il ne quitte la gateway. Voici comment ces contrôles vivent dans le chemin de l'ordre plutôt qu'à côté : quel état réside en mémoire, ce qui est recalculé de façon incrémentale, et ce qui se passe après un redémarrage. Les contraintes d'abord.
Un ordre arrive à la gateway. Avant de partir vers la place de marché, quelque chose doit décider si le compte a le droit de l'envoyer. Cette décision s'exécute sur chaque ordre, y compris l'immense majorité qui est parfaitement saine : son coût est payé par tout le trafic normal, et pas seulement par les rejets.
C'est la contrainte à nommer en premier. Un contrôle de risque placé dans le chemin de l'ordre est une taxe sur la saisie d'ordres. La question d'ingénierie n'est pas de rendre le contrôle astucieux, mais de le rendre assez petit pour que les traders ne le sentent pas, et assez honnête pour qu'il refuse encore les ordres qu'il doit refuser.
Le hot path répond à exactement une question : cet ordre peut-il être envoyé maintenant, au vu de ce que nous savons actuellement de ce compte. Les contrôles qui répondent à cette question restent dedans. Ceux qui répondent à une autre question sortent.
Tout le reste tourne à côté du chemin, sur le même état, sans retenir l'ordre. Cela alimente les limites que le hot path applique, mais ne se place pas entre le trader et la place de marché.
La ligne de partage est une question, pas une catégorie. Dans le chemin : cet ordre peut-il partir. À côté du chemin : quelles devraient être les limites. Tout ce qui répond à la seconde question et bloque quand même l'ordre est une erreur de conception, si important que soit le contrôle.
L'état dont un contrôle pre-trade a besoin - positions courantes, ordres en cours, marge utilisée et disponible, configuration des limites - vit dans la mémoire du processus qui prend la décision. Pas dans un cache devant une base, pas derrière un appel réseau. Dans le processus.
La raison n'est pas seulement la vitesse, même si une requête est des ordres de grandeur plus coûteuse qu'une lecture dans un tableau local. La raison, c'est la justesse. Une base détient la position telle qu'elle a été écrite. Le contrôle de risque a besoin de la position incluant les ordres envoyés il y a un instant, pas encore exécutés, acquittés ni persistés. Si vous lisez depuis le stockage, vous vérifiez contre un passé déjà dépassé par votre propre flux.
En pratique, cela façonne le processus comme tout composant à faible latence :
La base de données est l'endroit où la position est enregistrée. Ce n'est pas l'endroit où la position est connue.
Un recalcul complet de l'exposition et de la marge d'un compte parcourt chaque position et chaque ordre en cours. Ce coût croît avec la taille du carnet, ce qui rendrait le contrôle de risque plus lent précisément pour les clients qui négocient le plus. Le hot path ne recalcule donc pas. Il applique un delta.
Le compte porte des agrégats courants - exposition nette et brute par instrument et par groupe, marge utilisée, notionnel en vol. Un ordre entrant produit un petit changement de ces agrégats, les valeurs modifiées sont comparées aux limites, et l'ordre est accepté ou rejeté. Le travail est proportionnel à l'ordre, pas au portefeuille.
Le recalcul complet a toujours lieu - selon une planification, quand les paramètres de marge changent, et comme auto-contrôle périodique face au résultat incrémental. Il tourne hors du chemin, sur une copie, et son résultat est soit basculé, soit signalé comme écart. Un état incrémental qui dérive silencieusement de l'état réel est pire que pas de contrôle du tout : la comparaison n'est donc pas optionnelle.
Mesuré sur le chemin de risque que nous construisons, le contrôle pre-trade lui-même s'achève en <1 ms. Ce chiffre couvre la décision sur l'état en mémoire, pas le trajet complet d'un ordre du client à la place de marché et retour.
Un kill switch sert précisément quand quelque chose va déjà mal. Cela exclut de le bâtir sur la machinerie qui peut elle-même être en cause. C'est un chemin séparé, avec ses propres règles.
Arrêter les nouveaux ordres est la moitié facile. La moitié difficile, c'est ce que le switch fait aux ordres déjà en attente sur la place de marché : retirer les cotations et annuler les ordres en cours doit rester possible pendant que le chemin d'envoi est désactivé. Ce chemin d'annulation mérite ses propres tests, car il est exercé le pire jour, pas un jour normal.
L'état en mémoire est une vue dérivée d'un enregistrement durable. C'est ce qui rend un redémarrage survivable. Chaque événement qui change l'état de risque - un ordre accepté, une réservation libérée, une exécution appliquée, une limite modifiée, le switch activé - est ajouté à un journal sur la machine locale avant toute action en aval.
Le temps de reprise dépend alors de la longueur du journal et de la disponibilité de la drop copy, pas de la taille du carnet, et le mode de défaillance de chaque inconnue est le même : refuser de trader le compte.
Les limites honnêtes méritent d'être dites clairement, car elles décident si cette architecture convient tout court :
amBrain construit ce type de chemin de risque pre-trade pour des brokers et des prop firms, avec les hot paths écrits en Rust. L'équipe travaille sur des infrastructures de trading depuis Erevan, en Arménie, depuis 2019.
Notre équipe d'ingénierie est spécialisée dans les solutions FinTech. Discutons de la façon dont nous pouvons donner vie à votre projet.