|
|
The problem
Banks and brokers still wire counterparty connectivity with FIX, but most stacks force a painful trade-off:
- Open source (QuickFIX/J) — cheap, slow, tag soup, operational pain
- Commercial — fast, expensive, often still tag-oriented APIs
- In-house — years of dialect maintenance, fragile session logic
Teams need low latency, stable memory, and clean integration without rebuilding session machinery for every counterparty.
The 4H answer
- Spec language + codegen — define a counterparty dialect once; generate typed Java. Messages stay data on the wire; behaviour lives in your app.
- Session pipeline — FIX bytes become typed session messages through a pub/sub kernel you wire once.
- Embeddable microkernel — a library, not a monolithic server. You own the process layout.
- Proven coverage — Barclays, Deutsche, Citi, GS, Morgan Stanley, Currenex, Commerzbank, Lucid, Traiana, and others.
Performance — measured, not marketed
Honest ESP benchmark: ExampleBankFlow — repeating groups, drifting FX mids, watchlist rotation, realistic clips (1M–10M). Same payloads for _4h, QuickFIX/J 2.3.2, and FIX Antenna Java 2.27.0.
9×9 client×server matrix (median p50, µs)
5,000 warmup · 50,000 measured iterations · 3 runs per cell · cross-engine cells in separate JVMs
| client \ server | _4h | QuickFIX/J | FIX Antenna |
|---|---|---|---|
| _4h | 21.6 | 104.3 | 93.7 |
| QuickFIX/J | 94.2 | 77.0 | 83.0 |
| FIX Antenna | 89.9 | 84.4 | 63.5 |
| Highlight | Result |
|---|---|
| Fastest cell (entire matrix) | _4h client + _4h server — 21.6 µs p50, 38,106 ops/s |
| Best average as client | _4h 73.2 µs (QFJ 84.7, Antenna 79.3) |
| Best average as server | _4h 68.6 µs (QFJ 88.6, Antenna 80.1) |
| Cross-engine interop | All 9 cells pass on TCP (~84–104 µs off-diagonal) |
| _4h diagonal stability | Runs: 25.2 / 21.6 / 18.1 µs → median 21.6 µs |
ExampleBankMatrixRunner → examplebank-matrix.txt):
- Fastest cell — the single lowest p50 among all 9 client×server pairings (here: _4h↔_4h at 21.6 µs).
- Best average as client — arithmetic mean of the three p50 values in that engine’s row (when it acts as client against each server). _4h: (21.6 + 104.3 + 93.7) ÷ 3 = 73.2 µs.
- Best average as server — arithmetic mean of the three p50 values in that engine’s column (when it acts as server against each client). _4h: (21.6 + 94.2 + 89.9) ÷ 3 = 68.6 µs.
Sound bites
./gradlew :engine:examplebankMatrix → full report on your hardware.Honest caveats: Raw parse favours tag-oriented engines (Antenna ~0.6 µs vs _4h ~5 µs). Cross-engine cells are ~84–104 µs for all stacks — cite the homogeneous diagonal for speed claims. We do not claim sub-5 µs or “fastest FIX in the world.”