Coda stretta. Nessuna sorpresa a p99.
Code SPSC lock-free, decoder di tag senza branching, inlining del percorso caldo. Il messaggio più lento sembra il più veloce. È su questo che le venue ti valutano davvero.
Un motore di protocollo FIX in C++23 costruito per venue che non perdonano un heartbeat mancato. Zero allocazioni sul percorso caldo, parsing sub-microsecondo, stato sessione deterministico.
Prevedibile. In ogni dettaglio.
Ogni numero che cercheresti in un runbook di produzione. Misurato sotto carico, su hardware standard, contro un replay deterministico.
Tre scelte architetturali che si compongono. Ognuna è ciò che rende possibile la successiva.
Code SPSC lock-free, decoder di tag senza branching, inlining del percorso caldo. Il messaggio più lento sembra il più veloce. È su questo che le venue ti valutano davvero.
Arena statiche, freelist intrusive, slot messaggi a dimensione fissa. L'allocatore non gira mai mentre gli ordini scorrono. Così il kernel non ti prelaziona mai per recuperare una pagina.
Dizionari generati per versione, selezionabili a runtime per sessione. Overlay di dialetti personalizzati per campi specifici di venue. Il formato wire che la venue esegue è il formato che invii.
Profili di sessione precostruiti per le principali venue azionarie, futures, FX e crypto. Heartbeat, semantica di sequence-reset e particolarità di resend-request acquisite da trace di produzione reali.
Un NewOrderSingle decodificato e instradato, fianco a fianco. Stesso messaggio, stessa macchina, costo molto diverso.
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 ha portato il grosso del lavoro per il settore per due decenni. NexusFIX è ciò a cui si ricorre quando quelle scelte sono diventate il collo di bottiglia.
| QuickFIX | NexusFIX | |
|---|---|---|
| Allocazioni sull'hot path | ~14 allocazioni heap per messaggio (std::string, Decimal) | 0 · arene statiche, decode in-place |
| Latenza p99 di parsing | 1,2–1,8 µs a seconda del dialetto | < 500 ns · decode di tag senza branch |
| Throughput / core | 60–90K msg/s sostenuti | 240K+ msg/s sostenuti |
| Comportamento della coda sotto carico | Senza GC, ma il churn dell'allocatore = picchi imprevedibili | Nessun allocatore sull'hot path. coda piatta |
| Versioni di protocollo | 4.2 / 4.4 / 5.0. Dizionario dati XML per build | 4.2 / 4.4 / 5.0 / FIXT + overlay di dialetto a runtime |
| Linguaggio | Idiomi C++03 / C++11, dispatch virtuale | C++23, concepts + ranges, nessun virtual sull'hot path |
Byte dal filo in ingresso. Ordine instradato in uscita. Tre stadi, tutti nello stesso thread, tutti senza allocare.
Lo stream delimitato da SOH viene iterato in-place. Ogni tag si risolve in una vista tipizzata sul buffer originale; i campi numerici sono parsati senza branch, con l'overlay di dialetto applicato al bind di sessione.
Numeri di sequenza, finestre di heartbeat, semantica gap-fill, stranezze del resend-request. Gestito da una state machine generata per profilo di venue. Ogni transizione è registrata in un journal memory-mapped.
Uno slot di ordine in un'arena fissa viene acquisito, popolato per riferimento, e consegnato alla tua applicazione via una coda SPSC lock-free. Lo slot vive fino allo stato terminale dell'ordine, poi torna all'arena.
Due fili da tirare ora. L'articolo di architettura, o l'esplicatore conversazionale dal vivo.
Come NexusFIX usa arene statiche, code SPSC lock-free, e state machine generate per far sembrare il messaggio più lento veloce come il più veloce. Con i numeri.
Leggi l'approfondimento →Un'interfaccia conversazionale ai documenti del motore, dizionari dei messaggi, profili di venue e suite di benchmark. Addestrata sul codice di produzione, ancorata negli header reali.
Apri il chatbot →NexusFIX viene rilasciato come una singola libreria statica e un simulatore di sessione CLI. Porta una config di venue e un handler, e hai una sessione FIX deterministica che gira in locale. Riproducibile da un journal, tracciabile fino al byte.
NexusFIX è uno dei tre motori che costruiamo. Stessa filosofia: open-source dove possibile, performance prima, no lock-in.
Generazione AI in scala + velocità di backtest C++23 + composizione statistica di grado istituzionale. Il fossato competitivo a 3 strati che rende accessibile il quant trading a 1000+ segnali.
Scopri di più →Motore di backtesting C++23 con 138+ indicatori e strategie pronte per la produzione. Il livello di replay sotto StratCraft, disponibile in standalone per il tuo stack di ricerca.
Scopri di più →