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.
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.
Cada cifra que buscarías en un runbook de producción. Medido bajo carga, en hardware estándar, contra una repetición determinista.
Tres decisiones de arquitectura que se acumulan. Cada una hace posible la siguiente.
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.
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.
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.
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.
Un NewOrderSingle decodificado y enrutado, lado a lado. Mismo mensaje, misma máquina, coste muy distinto.
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 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.
| QuickFIX | NexusFIX | |
|---|---|---|
| Asignaciones en la ruta caliente | ~14 asignaciones de heap por mensaje (std::string, Decimal) | 0 · arenas estáticas, decode in-place |
| Latencia p99 de parseo | 1,2–1,8 µs según el dialecto | < 500 ns · decode de tags sin branching |
| Rendimiento / núcleo | 60–90K msg/s sostenido | 240K+ msg/s sostenido |
| Comportamiento de la cola bajo carga | Sin GC, pero el churn del asignador = picos impredecibles | Sin asignador en la ruta caliente. cola plana |
| Versiones de protocolo | 4.2 / 4.4 / 5.0. Diccionario de datos XML por build | 4.2 / 4.4 / 5.0 / FIXT + overlay de dialecto en runtime |
| Lenguaje | Modismos C++03 / C++11, despacho virtual | C++23, concepts + ranges, sin virtual en la ruta caliente |
Bytes del cable a la entrada. Orden enrutada a la salida. Tres etapas, todas corriendo en el mismo hilo, todas sin asignar.
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.
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.
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.
Dos hilos para tirar a continuación. El artículo de arquitectura, o el explicador conversacional en vivo.
Cómo NexusFIX usa arenas estáticas, colas SPSC sin locks, y máquinas de estados generadas para hacer que el mensaje más lento parezca igual de rápido que el más rápido. Con números.
Leer el análisis profundo →Una interfaz conversacional a los documentos del motor, diccionarios de mensajes, perfiles de venue y la suite de benchmarks. Entrenada sobre el código de producción, anclada en las cabeceras reales.
Abrir el chatbot →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.
NexusFIX es uno de los tres motores que construimos. Misma filosofía: open-source donde sea posible, rendimiento primero, sin lock-in.
Generación de IA a escala + velocidad de backtest C++23 + composición estadística de nivel institucional. El foso competitivo de 3 capas que hace accesible el trading cuant de 1000+ señales.
Saber más →Motor de backtesting C++23 con 138+ indicadores y estrategias listas para producción. La capa de replay debajo de StratCraft, disponible en standalone para tu propio stack de investigación.
Saber más →