Motor de protocolo FIX · v1.8 · mayo de 2026

NexusFIX.
Un motor que nunca asigna.

Un motor de protocolo FIX en C++23 construido para mercados que no perdonan un heartbeat perdido. Cero asignaciones en el camino caliente, parsing sub-microsegundo, estado de sesión determinista.
Predecible. Hasta el último detalle.

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

Flujo de mensajes · 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
rendimiento de mensajes
0
asignaciones heap en camino caliente
412ns
latencia de parsing p99
3.4×
vs baseline QuickFIX

El presupuesto de rendimiento.

Cada cifra que buscarías en un runbook de producción. Medido bajo carga, en hardware estándar, contra una repetición determinista.

Latencia de parsing
<500ns
p99, NewOrderSingle. Buffers fijos, iteración de campos zero-copy.
Rendimiento
240K+ /s
Por sesión, núcleo único. Escala lineal entre sesiones.
Asignaciones camino caliente
0
Arenas estáticas, ring buffers predimensionados, decodificación in-place.
vs QuickFIX
3×
Más rápido extremo a extremo en la misma carga. Suite de benchmarks reproducible.

Por qué los operadores
eligen NexusFIX.

Tres decisiones de arquitectura que se acumulan. Cada una hace posible la siguiente.

1 Capa 1 · Determinismo

Cola apretada. Sin sorpresas en p99.

Colas SPSC lock-free, decodificadores de tags sin ramificación, inlining del camino caliente. El mensaje más lento se parece al más rápido. Eso es lo que los mercados realmente evalúan.

120nsp50 · 240nsp90 · 360nsp99 · 412nsp99.9 · 580ns
2 Capa 2 · Memoria

Cero asignaciones en el camino caliente.

Arenas estáticas, freelists intrusivas, slots de mensajes de tamaño fijo. El asignador nunca se ejecuta mientras fluyen las órdenes. Por eso el kernel nunca te interrumpe para recuperar una página.

QuickFIX /order-flow
asignaciones heap / msg~14
NexusFIX /order-flow
asignaciones heap / msg0 · reutilización de arena
3 Capa 3 · Protocolo

FIX 4.2 / 4.4 / 5.0 / FIXT. Un solo motor.

Diccionarios generados por versión, seleccionables en tiempo de ejecución por sesión. Overlays de dialectos personalizados para campos específicos del mercado. El formato wire que ejecuta el mercado es el formato que envías.

FIX 4.2completo
FIX 4.4completo
FIX 5.0 SP2completo
FIXT 1.1completo
Personalizadooverlay
Probado en el wire

Configurado para los mercados donde realmente operas.

Perfiles de sesión preconstruidos para los principales mercados de acciones, futuros, FX y cripto. Heartbeats, semántica de reset de secuencia y particularidades de resend-request capturadas de trazas de producción reales.

CMEICENYSENasdaqLSEEurexHKEXSGXEBSRefinitivCoinbase PrimeBinance Inst.

La ruta caliente,
de dos formas.

Un NewOrderSingle decodificado y enrutado, lado a lado. Mismo mensaje, misma máquina, coste muy distinto.

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

Por qué los equipos reemplazan QuickFIX.

QuickFIX ha hecho dos décadas de trabajo pesado para la industria. NexusFIX es a lo que se recurre cuando esas decisiones se han convertido en el cuello de botella.

QuickFIXNexusFIX
Asignaciones en la ruta caliente~14 asignaciones de heap por mensaje (std::string, Decimal)0 · arenas estáticas, decode in-place
Latencia p99 de parseo1,2–1,8 µs según el dialecto< 500 ns · decode de tags sin branching
Rendimiento / núcleo60–90K msg/s sostenido240K+ msg/s sostenido
Comportamiento de la cola bajo cargaSin GC, pero el churn del asignador = picos impredeciblesSin asignador en la ruta caliente. cola plana
Versiones de protocolo4.2 / 4.4 / 5.0. Diccionario de datos XML por build4.2 / 4.4 / 5.0 / FIXT + overlay de dialecto en runtime
LenguajeModismos C++03 / C++11, despacho virtualC++23, concepts + ranges, sin virtual en la ruta caliente
QuickFIX se construyó cuando 5.000 msg/seg era una sesión ocupada. NexusFIX está construido para las venues donde eso es un minuto tranquilo. y la cola tiene que mantenerse plana de todos modos.

La ruta caliente,
de extremo a extremo.

Bytes del cable a la entrada. Orden enrutada a la salida. Tres etapas, todas corriendo en el mismo hilo, todas sin asignar.

1 Etapa 1 · Decodificar

Bytes dentro, campos fuera. sin copia.

El stream delimitado por SOH se itera in-place. Cada tag se resuelve en una vista tipada sobre el buffer original; los campos numéricos se parsean sin branching, con el overlay de dialecto aplicado en el bind de sesión.

span<const char>sin branchingchecksum SIMD
2 Etapa 2 · Validar

Estado de sesión, de forma determinista.

Números de secuencia, ventanas de heartbeat, semántica gap-fill, peculiaridades de resend-request. Manejado por una máquina de estados generada por perfil de venue. Cada transición se registra en un journal memory-mapped.

seq-numheartbeatresendmmap journal
3 Etapa 3 · Enrutar

Hacia tu handler, cero asignaciones.

Se adquiere un slot de orden en una arena fija, se rellena por referencia, y se entrega a tu aplicación vía una cola SPSC sin locks. El slot vive hasta el estado terminal de la orden, luego regresa a la arena.

cola SPSCslot de arenasin virtual

Ve más a fondo.

Dos hilos para tirar a continuación. El artículo de arquitectura, o el explicador conversacional en vivo.

Conéctalo en una tarde.

NexusFIX se entrega como una sola biblioteca estática y un simulador de sesión CLI. Trae una config de venue y un handler, y tienes una sesión FIX determinista corriendo en local. Repetible desde un journal, trazable hasta el byte.

Explora otros proyectos.

NexusFIX es uno de los tres motores que construimos. Misma filosofía: open-source donde sea posible, rendimiento primero, sin lock-in.