Tail serrée. Pas de surprise à p99.
Files SPSC lock-free, décodeurs de tags sans branchement, inlining du chemin chaud. Le message le plus lent ressemble au plus rapide. C'est sur cela que les places vous évaluent vraiment.
Un moteur de protocole FIX en C++23 conçu pour les places qui ne pardonnent pas un heartbeat manqué. Zéro allocation sur le chemin chaud, parsing sub-microseconde, état de session déterministe.
Prévisible. Jusqu'au moindre détail.
Chaque chiffre que vous chercheriez dans un runbook de production. Mesuré sous charge, sur du matériel courant, sur un replay déterministe.
Trois choix d'architecture qui se cumulent. Chacun rend le suivant possible.
Files SPSC lock-free, décodeurs de tags sans branchement, inlining du chemin chaud. Le message le plus lent ressemble au plus rapide. C'est sur cela que les places vous évaluent vraiment.
Arenas statiques, freelists intrusives, slots de messages à taille fixe. L'allocateur ne tourne jamais pendant que les ordres circulent. Donc le noyau ne vous préempte jamais pour récupérer une page.
Dictionnaires générés par version, sélectionnables à l'exécution par session. Overlays de dialectes personnalisés pour les champs spécifiques aux places. Le format wire qu'utilise la place est celui que vous envoyez.
Profils de session pré-construits pour les principales places actions, futures, FX et crypto. Heartbeats, sémantique de reset de séquence et particularités de resend-request capturées depuis des traces de production réelles.
Un NewOrderSingle décodé et routé, côte à côte. Même message, même machine, coût très différent.
void Application::onMessage(const FIX44::NewOrderSingle& msg, const SessionID& sid) { FIX::ClOrdID clOrdId; msg.get(clOrdId); // allocates FIX::Symbol symbol; msg.get(symbol); // allocates FIX::Side side; msg.get(side); FIX::OrderQty qty; msg.get(qty); // allocates Decimal FIX::Price price; msg.get(price); // allocates Decimal std::string key = symbol.getString(); // allocates std::string router_->route(key, clOrdId.getString(), qty, price); } // ~14 heap allocs / msg
void OrderHandler::on_message(MessageView m, SessionRef sid) noexcept { auto [cl_ord_id, symbol, side, qty, price] = m.decode<D::ClOrdID, D::Symbol, D::Side, D::OrderQty, D::Price>(); // in-place, span<const char> // fixed-arena order slot, no heap, no copies auto& slot = arena_.acquire(cl_ord_id); slot.init(symbol, side, qty, price, sid); router_.route(slot); // 0 heap allocs / msg }
QuickFIX a porté le gros du travail de l'industrie pendant deux décennies. NexusFIX est ce vers quoi on se tourne quand ces choix sont devenus le goulot d'étranglement.
| QuickFIX | NexusFIX | |
|---|---|---|
| Allocations sur le hot path | ~14 allocs heap par message (std::string, Decimal) | 0 · arènes statiques, decode in-place |
| Latence p99 de parsing | 1,2–1,8 µs selon le dialecte | < 500 ns · decode de tags sans branchement |
| Débit / cœur | 60–90K msg/s soutenu | 240K+ msg/s soutenu |
| Comportement de la queue sous charge | Sans GC, mais le churn de l'allocateur = pics imprévisibles | Aucun allocateur sur le hot path. queue plate |
| Versions de protocole | 4.2 / 4.4 / 5.0. Dictionnaire de données XML par build | 4.2 / 4.4 / 5.0 / FIXT + overlay de dialecte au runtime |
| Langage | Idiomes C++03 / C++11, dispatch virtuel | C++23, concepts + ranges, pas de virtual sur le hot path |
Octets sur le câble en entrée. Ordre routé en sortie. Trois étages, tous dans le même thread, tous sans allocation.
Le flux séparé par SOH est itéré sur place. Chaque tag se résout en une vue typée sur le buffer original ; les champs numériques sont parsés sans branchement, l'overlay de dialecte est appliqué au moment du bind de session.
Numéros de séquence, fenêtres heartbeat, sémantique gap-fill, particularités resend-request. Géré par une machine à états générée par profil de venue. Chaque transition est journalisée dans un journal memory-mapped.
Un slot d'ordre dans une arène fixe est acquis, peuplé par référence, et remis à votre application via une queue SPSC sans verrou. Le slot vit jusqu'à l'état terminal de l'ordre, puis retourne à l'arène.
Deux fils à tirer ensuite. La présentation d'architecture, ou l'explicateur conversationnel en direct.
Comment NexusFIX utilise des arènes statiques, des queues SPSC sans verrou et des machines à états générées pour faire en sorte que le message le plus lent ressemble au plus rapide. Avec des chiffres.
Lire le deep-dive →Une interface conversationnelle vers la doc du moteur, les dictionnaires de messages, les profils de venues et la suite de benchmarks. Entraînée sur la base de code de production, ancrée dans les vrais headers.
Ouvrir le chatbot →NexusFIX se distribue sous forme d'une bibliothèque statique unique et d'un simulateur de session CLI. Apportez une config de venue et un handler, et vous avez une session FIX déterministe qui tourne en local. Rejouable depuis un journal, traçable à l'octet près.
NexusFIX est l'un des trois moteurs que nous construisons. Même philosophie : open-source quand c'est possible, performance d'abord, pas de lock-in.
Génération IA à l'échelle + vitesse de backtest C++23 + composition statistique de niveau institutionnel. Le fossé concurrentiel à 3 couches qui rend accessible le trading quant à 1000+ signaux.
En savoir plus →Moteur de backtesting C++23 avec 138+ indicateurs et des stratégies prêtes pour la production. La couche de replay sous StratCraft, disponible en standalone pour votre propre stack de recherche.
En savoir plus →