FIX-Protokoll-Engine · v1.8 · Mai 2026

NexusFIX.
Eine Engine, die niemals alloziert.

Eine C++23-FIX-Protokoll-Engine für Handelsplätze, die einen verpassten Heartbeat nicht verzeihen. Null Allokationen auf dem Hot Path, Sub-Mikrosekunden-Parsing, deterministischer Sitzungszustand.
Vorhersehbar. Bis ins Detail.

nexusfix / session / XCME.PROD.42
C++23 · 0 ALLOC · 247K msg/s

Nachrichtenstrom · XCME.PROD.42 · NewOrderSingle ⇄ ExecutionReport

tail -f · live stream
12:04:18.11435=D|49=NEXFIX|56=XCME|34=184221|11=ord-9f2e|55=ESM6|54=1|38=2|40=2|44=5418.25parsed 318 ns
12:04:18.11435=8|49=XCME|56=NEXFIX|34=184222|11=ord-9f2e|17=exec-1|150=0|39=0|55=ESM6|54=1acked 1.2 µs
12:04:18.47135=8|49=XCME|56=NEXFIX|34=184223|11=ord-9f2e|17=exec-2|150=F|39=2|32=2|31=5418.25parsed 296 ns
12:04:19.00035=0 heartbeat|34=184224|49=NEXFIX|56=XCME · 30s intervalsent 84 ns
12:04:19.21435=D|49=NEXFIX|56=XCME|34=184225|11=ord-9f2f|55=NQM6|54=2|38=1|40=2|44=19842.75parsed 304 ns
12:04:19.21535=8|49=XCME|56=NEXFIX|34=184226|11=ord-9f2f|17=exec-3|150=0|39=0acked 1.1 µs
12:04:19.60135=8|49=XCME|56=NEXFIX|34=184227|11=ord-9f2f|17=exec-4|150=F|39=2|32=1|31=19842.50parsed 311 ns
12:04:19.88035=F CancelRequest|34=184228|41=ord-9f2e|11=cxl-7a01|55=ESM6parsed 292 ns
12:04:19.88135=8|49=XCME|56=NEXFIX|34=184229|11=cxl-7a01|17=exec-5|150=4|39=4 · cancelledacked 1.0 µs
247K/s
Nachrichtendurchsatz
0
Heap-Allokationen auf Hot Path
412ns
p99 Parse-Latenz
3.4×
vs. QuickFIX-Baseline

Das Performance- Budget.

Jede Zahl, nach der Sie in einem Produktions-Runbook greifen würden. Unter Last auf Standard-Hardware gegen einen deterministischen Replay gemessen.

Parse-Latenz
<500ns
p99, NewOrderSingle. Feste Puffer, Zero-Copy-Feld-Iteration.
Durchsatz
240K+ /s
Pro Sitzung, ein Kern. Lineare Skalierung über Sitzungen hinweg.
Hot-Path-Allokationen
0
Statische Arenas, vordimensionierte Ringpuffer, In-Place-Decodierung.
vs. QuickFIX
3×
Schneller Ende zu Ende bei gleicher Workload. Reproduzierbare Benchmark-Suite.

Warum Betreiber
NexusFIX wählen.

Drei architektonische Entscheidungen, die sich aufaddieren. Jede macht die nächste erst möglich.

1 Layer 1 · Determinismus

Enger Tail. Keine Überraschungen bei p99.

Lock-freie SPSC-Queues, branchlose Tag-Decoder, Hot-Path-Inlining. Die langsamste Nachricht sieht aus wie die schnellste. Genau das bewerten Handelsplätze tatsächlich.

120nsp50 · 240nsp90 · 360nsp99 · 412nsp99.9 · 580ns
2 Layer 2 · Speicher

Null Allokationen auf dem Hot Path.

Statische Arenas, intrusive Freelisten, Nachrichtenslots fester Größe. Der Allokator läuft nie, während Orders fließen. Damit der Kernel Sie nie unterbricht, um eine Page zurückzufordern.

QuickFIX /order-flow
Heap-Allokationen / Nachricht~14
NexusFIX /order-flow
Heap-Allokationen / Nachricht0 · Arena-Wiederverwendung
3 Layer 3 · Protokoll

FIX 4.2 / 4.4 / 5.0 / FIXT. Eine Engine.

Pro Version generierte Wörterbücher, pro Sitzung zur Laufzeit wählbar. Custom-Dialekt-Overlays für plattformspezifische Felder. Das Wire-Format des Handelsplatzes ist das Format, das Sie senden.

FIX 4.2voll
FIX 4.4voll
FIX 5.0 SP2voll
FIXT 1.1voll
CustomOverlay
Im Wire-Betrieb erprobt

Konfiguriert für die Handelsplätze, an denen Sie wirklich handeln.

Vorgefertigte Sitzungsprofile für die wichtigsten Aktien-, Futures-, FX- und Krypto-Handelsplätze. Heartbeats, Sequence-Reset-Semantik und Resend-Request-Eigenheiten aus realen Produktions-Traces.

CMEICENYSENasdaqLSEEurexHKEXSGXEBSRefinitivCoinbase PrimeBinance Inst.

Der Hot-Path,
auf zwei Arten.

Eine NewOrderSingle dekodiert und geroutet, nebeneinander. Dieselbe Nachricht, dieselbe Maschine, sehr unterschiedliche Kosten.

QuickFIX (C++) application.cpp
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
p99 Parse + Route1.42 µs · 14 allocs
NexusFIX (C++23) order_handler.cpp
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
}
p99 Parse + Route412 ns · 0 allocs

Warum Teams ersetzen, QuickFIX.

QuickFIX hat zwei Jahrzehnte lang die Schwerarbeit für die Branche geleistet. NexusFIX greift man, wenn diese Entscheidungen zum Flaschenhals geworden sind.

QuickFIXNexusFIX
Hot-Path-Allokationen~14 Heap-Allokationen pro Nachricht (std::string, Decimal)0 · statische Arenen, In-Place-Decode
p99 Parse-Latenz1,2–1,8 µs je nach Dialekt< 500 ns · verzweigungsfreies Tag-Decode
Durchsatz / Kern60–90K msg/s nachhaltig240K+ msg/s nachhaltig
Tail-Verhalten unter LastKein GC, aber Allokator-Churn = unvorhersehbare SpikesKein Allokator im Hot-Path. flacher Tail
Protokollversionen4.2 / 4.4 / 5.0. Pro Build ein XML-Datenwörterbuch4.2 / 4.4 / 5.0 / FIXT + Runtime-Dialekt-Overlay
SpracheC++03 / C++11 Idiome, virtueller DispatchC++23, Concepts + Ranges, kein virtual im Hot-Path
QuickFIX wurde gebaut, als 5.000 msg/sec eine geschäftige Sitzung waren. NexusFIX ist für die Venues gebaut, wo das eine ruhige Minute ist. und der Tail muss trotzdem flach bleiben.

Der Hot-Path,
Ende-zu-Ende.

Wire-Bytes rein. Geroutete Order raus. Drei Stufen, alle im selben Thread, alle ohne Allokation.

1 Stufe 1 · Dekodieren

Bytes rein, Felder raus. ohne Kopie.

Der SOH-getrennte Stream wird in-place durchlaufen. Jedes Tag löst zu einer typisierten Sicht auf den Originalpuffer auf; numerische Felder werden verzweigungsfrei geparst, das Dialekt-Overlay wird zum Zeitpunkt des Session-Bindings angewendet.

span<const char>verzweigungsfreiSIMD-Checksumme
2 Stufe 2 · Validieren

Session-Zustand, deterministisch.

Sequenznummern, Heartbeat-Fenster, Gap-Fill-Semantik, Resend-Request-Eigenheiten. Bearbeitet von einer generierten State-Machine pro Venue-Profil. Jeder Übergang wird in einem Memory-Mapped-Journal protokolliert.

seq-numHeartbeatResendmmap journal
3 Stufe 3 · Route

In Ihren Handler, ohne Allokation.

Ein Order-Slot aus einer festen Arena wird beschafft, per Referenz befüllt und über eine lock-free SPSC-Queue an Ihre Anwendung übergeben. Der Slot lebt, bis die Order ihren Endzustand erreicht, dann kehrt er in die Arena zurück.

SPSC-QueueArena-Slotkein virtual

Geh tiefer.

Zwei Fäden, an denen man als nächstes ziehen kann. Der Architektur-Aufsatz, oder der lebendige Konversations-Erklärer.

Verkabeln Sie es in einem Nachmittag.

NexusFIX wird als eine einzige statische Bibliothek und ein CLI-Session-Simulator ausgeliefert. Bringen Sie eine Venue-Konfiguration und einen Handler mit, und Sie haben eine deterministische FIX-Session, die lokal läuft. Aus einem Journal wiedergebbar, byte-genau nachvollziehbar.

Weitere Projekte erkunden.

NexusFIX ist eine von drei Engines, die wir bauen. Dieselbe Philosophie: Open Source, wo möglich, Performance zuerst, kein Lock-in.