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

NexusFIX.
Um motor que nunca aloca.

Um motor de protocolo FIX em C++23 construído para venues que não perdoam um heartbeat perdido. Zero alocações no caminho quente, parsing sub-microssegundo, estado de sessão determinístico.
Previsível. Até o último detalhe.

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

Fluxo de mensagens · 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
throughput de mensagens
0
alocações heap no caminho quente
412ns
latência de parsing p99
3.4×
vs baseline QuickFIX

O orçamento de performance.

Cada número que você buscaria num runbook de produção. Medido sob carga, em hardware comum, contra um replay determinístico.

Latência de parsing
<500ns
p99, NewOrderSingle. Buffers fixos, iteração de campos zero-copy.
Throughput
240K+ /s
Por sessão, único núcleo. Escala linear entre sessões.
Alocações caminho quente
0
Arenas estáticas, ring buffers pré-dimensionados, decodificação in-place.
vs QuickFIX
3×
Mais rápido fim a fim na mesma carga. Suíte de benchmark reproduzível.

Por que operadores
escolhem NexusFIX.

Três escolhas arquitetônicas que se acumulam. Cada uma torna a próxima possível.

1 Camada 1 · Determinismo

Cauda apertada. Sem surpresas em p99.

Filas SPSC lock-free, decodificadores de tags sem branching, inlining no caminho quente. A mensagem mais lenta parece a mais rápida. É isso que as venues realmente avaliam.

120nsp50 · 240nsp90 · 360nsp99 · 412nsp99.9 · 580ns
2 Camada 2 · Memória

Zero alocações no caminho quente.

Arenas estáticas, freelists intrusivas, slots de mensagem de tamanho fixo. O alocador nunca roda enquanto ordens fluem. Assim o kernel nunca te preempta para reclamar uma página.

QuickFIX /order-flow
alocações heap / msg~14
NexusFIX /order-flow
alocações heap / msg0 · reuso de arena
3 Camada 3 · Protocolo

FIX 4.2 / 4.4 / 5.0 / FIXT. Um único motor.

Dicionários gerados por versão, selecionáveis em runtime por sessão. Overlays de dialeto personalizados para campos específicos de venue. O formato wire que a venue roda é o formato que você envia.

FIX 4.2completo
FIX 4.4completo
FIX 5.0 SP2completo
FIXT 1.1completo
Personalizadooverlay
Testado em batalha no wire

Configurado para as venues onde você realmente opera.

Perfis de sessão pré-construídos para as principais venues de ações, futuros, FX e cripto. Heartbeats, semântica de reset de sequência e peculiaridades de resend-request capturadas de traços de produção reais.

CMEICENYSENasdaqLSEEurexHKEXSGXEBSRefinitivCoinbase PrimeBinance Inst.

O hot path,
de duas formas.

Um NewOrderSingle decodificado e roteado, lado a lado. Mesma mensagem, mesma máquina, custo muito diferente.

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 que as equipes substituem QuickFIX.

QuickFIX carregou o trabalho pesado da indústria por duas décadas. NexusFIX é o que se busca quando essas escolhas viraram o gargalo.

QuickFIXNexusFIX
Alocações no hot path~14 allocs de heap por mensagem (std::string, Decimal)0 · arenas estáticas, decode in-place
Latência p99 de parsing1,2–1,8 µs dependendo do dialeto< 500 ns · decode de tags sem branching
Throughput / núcleo60–90K msg/s sustentado240K+ msg/s sustentado
Comportamento da cauda sob cargaSem GC, mas o churn do alocador = picos imprevisíveisSem alocador no hot path. cauda plana
Versões de protocolo4.2 / 4.4 / 5.0. Dicionário de dados XML por build4.2 / 4.4 / 5.0 / FIXT + overlay de dialeto em runtime
LinguagemIdiomas C++03 / C++11, despacho virtualC++23, concepts + ranges, sem virtual no hot path
QuickFIX foi construído quando 5.000 msg/seg era uma sessão movimentada. NexusFIX é construído para as venues onde isso é um minuto calmo. e a cauda tem de ficar plana de qualquer forma.

O hot path,
ponta a ponta.

Bytes do fio entram. Ordem roteada sai. Três estágios, todos rodando na mesma thread, todos sem alocar.

1 Estágio 1 · Decode

Bytes para dentro, campos para fora. sem cópia.

O stream delimitado por SOH é iterado in-place. Cada tag se resolve em uma visão tipada sobre o buffer original; os campos numéricos são parseados sem branching, com o overlay de dialeto aplicado no bind da sessão.

span<const char>sem branchingchecksum SIMD
2 Estágio 2 · Validação

Estado de sessão, de forma determinística.

Números de sequência, janelas de heartbeat, semântica gap-fill, peculiaridades de resend-request. Tratado por uma state machine gerada por perfil de venue. Cada transição é registrada em um journal memory-mapped.

seq-numheartbeatresendmmap journal
3 Estágio 3 · Routing

Para o seu handler, zero alocação.

Um slot de ordem em uma arena fixa é adquirido, preenchido por referência, e entregue à sua aplicação via uma fila SPSC lock-free. O slot vive até o estado terminal da ordem, depois retorna para a arena.

fila SPSCslot de arenasem virtual

mais fundo.

Dois fios para puxar a seguir. O escrito de arquitetura, ou o explicador conversacional ao vivo.

Ligue tudo numa tarde.

O NexusFIX é entregue como uma única biblioteca estática e um simulador de sessão CLI. Traga uma config de venue e um handler, e você tem uma sessão FIX determinística rodando localmente. Rejogável a partir de um journal, rastreável até o byte.

Explore outros projetos.

NexusFIX é um dos três motores que construímos. Mesma filosofia: open-source onde possível, performance primeiro, sem lock-in.