FIX Protocol Engine · v1.8 · May 2026

NexusFIX.
An engine that never allocates.

A C++23 FIX protocol engine built for venues that don't forgive a missed heartbeat. Zero allocations on the hot path, sub-microsecond parsing, deterministic session state.
Predictable. All the way down.

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

Message stream · 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
message throughput
0
heap allocs on hot path
412ns
p99 parse latency
3.4×
vs QuickFIX baseline

The performance budget.

Every number you'd reach for in a production runbook. Measured under load, on commodity hardware, against a deterministic replay.

Parse latency
<500ns
p99, NewOrderSingle. Fixed buffers, zero-copy field iteration.
Throughput
240K+ /s
Per session, single core. Linear scale across sessions.
Hot-path allocs
0
Static arenas, pre-sized ring buffers, in-place decode.
vs QuickFIX
3×
Faster end-to-end on the same workload. Reproducible benchmark suite.

Why operators
pick NexusFIX.

Three architectural choices that compound. Each one is what makes the next one possible.

1 Layer 1 · Determinism

Tight tail. No surprises at p99.

Lock-free SPSC queues, branchless tag decoders, hot-path inlining. The slowest message looks like the fastest one. That's what venues actually grade you on.

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

Zero allocations on the hot path.

Static arenas, intrusive freelists, fixed-size message slots. The allocator never runs while orders are flowing. So the kernel never preempts you to reclaim a page.

QuickFIX /order-flow
heap allocs / msg~14
NexusFIX /order-flow
heap allocs / msg0 · arena reuse
3 Layer 3 · Protocol

FIX 4.2 / 4.4 / 5.0 / FIXT. One engine.

Generated dictionaries per version, runtime-selectable per session. Custom dialect overlays for venue-specific fields. The wire format the venue runs is the wire format you send.

FIX 4.2full
FIX 4.4full
FIX 5.0 SP2full
FIXT 1.1full
Customoverlay
Battle-tested on the wire

Configured for the venues you actually trade.

Pre-built session profiles for major equities, futures, FX and crypto venues. Heartbeats, sequence-reset semantics and resend-request quirks captured from real production traces.

CMEICENYSENasdaqLSEEurexHKEXSGXEBSRefinitivCoinbase PrimeBinance Inst.

The hot path,
two ways.

A NewOrderSingle decode-and-route, side by side. Same message, same machine, very different cost.

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

Why teams replace QuickFIX.

QuickFIX has done two decades of heavy lifting for the industry. NexusFIX is what you reach for when those choices have become the bottleneck.

QuickFIXNexusFIX
Hot-path allocations~14 heap allocs per message (std::string, Decimal)0 · static arenas, in-place decode
p99 parse latency1.2–1.8 µs depending on dialect< 500 ns · branchless tag decode
Throughput / core60–90K msg/s sustained240K+ msg/s sustained
Tail behaviour under loadGC-free, but allocator churn = unpredictable spikesNo allocator on hot path. flat tail
Protocol versions4.2 / 4.4 / 5.0. Per-build XML data dictionary4.2 / 4.4 / 5.0 / FIXT + runtime dialect overlay
LanguageC++03 / C++11 idioms, virtual dispatchC++23, concepts + ranges, no virtual on hot path
QuickFIX was built when 5,000 msg/sec was a busy session. NexusFIX is built for the venues where that's a quiet minute. and the tail has to stay flat anyway.

The hot path,
end-to-end.

Wire bytes in. Routed order out. Three stages, all running in the same thread, all running without allocating.

1 Stage 1 · Decode

Bytes in, fields out. no copy.

The SOH-delimited stream is iterated in place. Each tag resolves to a typed view over the original buffer; numeric fields are parsed branchlessly, with the dialect overlay applied at session bind time.

span<const char>branchlessSIMD checksum
2 Stage 2 · Validate

Session state, deterministically.

Sequence numbers, heartbeat windows, gap-fill semantics, resend-request quirks. Handled by a generated state machine, one per venue profile. Every transition is logged to a memory-mapped journal.

seq-numheartbeatresendmmap journal
3 Stage 3 · Route

Into your handler, zero alloc.

A fixed-arena order slot is acquired, populated by reference, and handed to your application via a lock-free SPSC queue. The slot lives until the order's terminal state, then returns to the arena.

SPSC queuearena slotno virtual

Go deeper.

Two threads to pull on next. The architecture write-up, or the live conversational explainer.

Wire it up in an afternoon.

NexusFIX ships as a single static library and a CLI session simulator. Bring a venue config and a handler, and you've got a deterministic FIX session running locally. Replayable from a journal, traceable to the byte.

Explore other projects.

NexusFIX is one of three engines we build. Same philosophy: open-source where possible, performance-first, no lock-in.