EuNEx / docs /process-diagram.md
RayMelius's picture
Rename modules to Optiq naming and add Developers Guide
44cddac
# EuNEx Process Diagram
## End-to-End Order Flow (Optiq-style)
```
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ EXTERNAL CLIENTS β”‚
β”‚ FIX 5.0 SP2 / SBE Binary Protocol β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚
β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ OEGActor (Core 0) ← Optiq: OEG/OEActorβ”‚
β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚ β”‚ β€’ Accepts NewOrder / Cancel / Modify requests β”‚ β”‚
β”‚ β”‚ β€’ Validates session, routes by SymbolIndex β†’ correct MECoreActor β”‚ β”‚
β”‚ β”‚ β€’ Sends ExecutionReports back to client (ack, fill, reject) β”‚ β”‚
β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚ NewOrderEvent / CancelOrderEvent / ModifyOrderEvent
β”‚ (Simplx Event::Pipe β€” lock-free cross-core delivery)
β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ MECoreActor (Core 1) β€” one per symbol ← Optiq: LogicalCoreActor + Bookβ”‚
β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚ β”‚ RECOVERY CAUSE β”‚ β”‚
β”‚ β”‚ RecoveryProxy.cause(persistenceId, order, callback) β”‚ β”‚
β”‚ β”‚ β€’ Persists incoming event to FragmentStore (β†’ Kafka in production) β”‚ β”‚
β”‚ β”‚ β€’ Assigns chainId + sequence for IACA tracking β”‚ β”‚
β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β”‚ β–Ό β”‚
β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚ β”‚ MATCHING ENGINE β”‚ β”‚
β”‚ β”‚ Book.newOrder() / cancelOrder() / modifyOrder() β”‚ β”‚
β”‚ β”‚ β€’ Price-time priority matching (std::map<Price, std::deque<Order>>) β”‚ β”‚
β”‚ β”‚ β€’ FOK: reject if insufficient liquidity β”‚ β”‚
β”‚ β”‚ β€’ IOC: fill what's available, cancel remainder β”‚ β”‚
β”‚ β”‚ β€’ Market: match at any price, never rests on book β”‚ β”‚
β”‚ β”‚ β€’ Multi-level sweep across price levels β”‚ β”‚
β”‚ β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β”‚ β”‚ β”‚ β”‚
β”‚ β–Ό β–Ό β”‚
β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚ β”‚ IACA CAUSE β”‚ β”‚ RECOVERY EFFECT (Master only) β”‚ β”‚
β”‚ β”‚ IacaFragment: β”‚ β”‚ RecoveryProxy.effect(callback) β”‚ β”‚
β”‚ β”‚ β€’ BOOK root frag β”‚ β”‚ β€’ Sends ExecReport β†’ OEG β”‚ β”‚
β”‚ β”‚ β€’ ACK child frag β”‚ β”‚ β€’ Sends TradeEvent β†’ MarketData β”‚ β”‚
β”‚ β”‚ β€’ TRADE child fragβ”‚ β”‚ β€’ Sends BookUpdate β†’ MarketData β”‚ β”‚
β”‚ β”‚ (nextCount check) β”‚ β”‚ β€’ Mirror skips all effects β”‚ β”‚
β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β”‚ β”‚ β”‚ β”‚ β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚ β”‚ β”‚
β–Ό β”‚ β”‚
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚
β”‚ IacaAggregator β”‚ β”‚ β”‚
β”‚ ← Optiq: IacaActor β”‚ β”‚ β”‚
β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚
β”‚ β”‚ Collects fragments β”‚ β”‚ β”‚ β”‚
β”‚ β”‚ per chainId β”‚ β”‚ β”‚ β”‚
β”‚ β”‚ Detects completion β”‚ β”‚ β”‚ β”‚
β”‚ β”‚ (sum nextCount == β”‚ β”‚ β”‚ β”‚
β”‚ β”‚ total fragments -1) β”‚ β”‚ β”‚ β”‚
β”‚ β”‚ Fires handler β†’ β”‚ β”‚ β”‚ β”‚
β”‚ β”‚ IA SBE message β”‚ β”‚ β”‚ β”‚
β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚
β”‚ IA message β”‚ β”‚
β–Ό β”‚ β”‚
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Future: IDS / PTB / β”‚ β”‚ MDGActor (Core 2) β”‚
β”‚ SATURN / Clearing β”‚ β”‚ ← Optiq: MDLimitLogicalCoreHandler β”‚
β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚ β”‚ IDS: Intraday Data β”‚ β”‚ β”‚ β”‚ β€’ Maintains BBO snapshot per sym β”‚ β”‚
β”‚ β”‚ PTB: Post-Trade Bus β”‚ β”‚ β”‚ β”‚ β€’ Stores recent trades β”‚ β”‚
β”‚ β”‚ SATURN: ARM reportingβ”‚ β”‚ β”‚ β”‚ β€’ Publishes BookUpdateEvent β”‚ β”‚
β”‚ β”‚ Clearing: LCH/CC&G β”‚ β”‚ β”‚ β”‚ (bestBid, bestAsk, depths) β”‚ β”‚
β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”‚ β†’ Future: multicast SBE feed β”‚ β”‚
β”‚ (not yet implemented) β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
```
## Master / Mirror High Availability
```
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ MASTER NODE β”‚ β”‚ MIRROR NODE β”‚
β”‚ β”‚ β”‚ β”‚
β”‚ RecoveryProxy(isMaster=true) β”‚ β”‚ RecoveryProxy(isMaster=false) β”‚
β”‚ β”‚ β”‚ β”‚
β”‚ cause() β†’ persist + run callback βœ“ β”‚ β”‚ cause() β†’ persist + callback βœ“β”‚
β”‚ effect() β†’ execute side-effects βœ“ │────▢│ effect() β†’ SKIP (no-op) βœ— β”‚
β”‚ recoveryEffect() β†’ SKIP βœ— β”‚ β”‚ recoveryEffect() β†’ execute βœ“ β”‚
β”‚ β”‚ β”‚ β”‚
β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚ β”‚ FragmentStore (shared memory) │────┼─────┼─▢│ Same FragmentStore β”‚ β”‚
β”‚ β”‚ β†’ Kafka topic in production β”‚ β”‚ β”‚ β”‚ (Kafka consumer replay) β”‚ β”‚
β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
On failover: Mirror becomes Master,
replays FragmentStore, resumes effects
```
## IACA Fragment Chain Example (Buy order that matches)
```
Chain #42: BUY 60 @ 50.00 (matches resting SELL 100 @ 50.00)
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Fragment 1 (ROOT) β”‚
β”‚ origin: BOOK:1:seq β”‚
β”‚ previousOrigin: null β”‚
β”‚ causeId: NEW_ORDER_BUY β”‚
β”‚ nextCount: 2 │──────┐
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β”‚ β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ 2 children expected
β–Ό β–Ό β”‚ 2 children found β†’ COMPLETE
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚ Fragment 2 β”‚ β”‚ Fragment 3 β”‚ β”‚
β”‚ ACK_DATA β”‚ β”‚ TRADE_DATA β”‚ β”‚
β”‚ prev: ROOT β”‚ β”‚ prev: ROOT β”‚ β”‚
β”‚ nextCount: 0β”‚ β”‚ nextCount: 0β”‚ β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β”‚
sum(nextCount) = 2 + 0 + 0 = 2 β”€β”€β”€β”€β”€β”˜
total fragments = 3
complete when: sum == total - 1 βœ“ (2 == 3-1)
β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Handler fires: β”‚
β”‚ NewOrderHandler β†’ β”‚
β”‚ Generate IA SBE message β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
```
## Component Mapping: StockEx β†’ EuNEx β†’ Optiq Production
```
StockEx (Python/Kafka) EuNEx (C++/Simplx shim) Optiq (Production)
═══════════════════════ ═══════════════════════ ══════════════════
fix_oeg_server.py ───▢ OEGActor ───▢ OEActor (FIX/SBE)
Kafka 'orders' topic ───▢ Event::Pipe ───▢ Simplx cross-core
session mgmt ───▢ submitNewOrder() ───▢ FIX 5.0 SP2 acceptor
matcher.py ───▢ MECoreActor ───▢ LogicalCoreActor
match_order() ───▢ Book::newOrder() ───▢ RecoveryCauseβ†’IACAβ†’Book
handle_cancel() ───▢ Book::cancelOrder() ───▢ CancelOrderData
handle_amend() ───▢ Book::modifyOrder() ───▢ ModifyOrderData
Kafka 'trades' topic ───▢ TradeEvent via Pipe ───▢ IACA fragment chain
dashboard.py (SSE) ───▢ MDGActor ───▢ MDLimitLogicalCoreHandler
/orderbook/<sym> ───▢ BookUpdateEvent ───▢ PublishLimitUpdateRequest
/trades ───▢ TradeEvent list ───▢ IAβ†’SBE multicast
database.py (SQLite) ───▢ RecoveryProxy (memory) ───▢ RecoveryProxy β†’ Kafka
save_trade() ───▢ FragmentStore::append() ───▢ PersistenceAgent produce
(none) ───▢ IacaAggregator ───▢ IacaAggregatorActor
───▢ FragmentChain ───▢ CoherentFragmentChain
───▢ FragmentHandler ───▢ FastNewOrderHandler
(none) ───▢ (future) ───▢ SATURN/ARM
(none) ───▢ (future) ───▢ IDS (Intraday Data)
(none) ───▢ (future) ───▢ PTB (Post-Trade Bus)
(none) ───▢ (future) ───▢ Clearing (LCH/CC&G)
```
## Data Flow Summary
```
1. Client ──FIX/SBE──▢ OEGActor ──Event::Pipe──▢ MECoreActor
β–² β”‚
β”‚ β”œβ”€ RecoveryProxy.cause() β†’ FragmentStore
β”‚ β”œβ”€ Book.match()
β”‚ β”œβ”€ IACA fragments β†’ IacaAggregator
β”‚ β”‚
ExecReport β—€β”€β”˜ β”œβ”€ effect() [Master only]:
β”‚ β”œβ”€ ExecReport β†’ OEG β†’ Client
β”‚ β”œβ”€ TradeEvent β†’ MDGActor
β”‚ └─ BookUpdate β†’ MDGActor
β”‚
└─ IacaAggregator
└─ complete chain β†’ IA message
└─ (future) IDS/PTB/SATURN
```
---
## Future Expansion: Full Optiq Production Topology
The diagram below shows the complete Optiq production trade path (from `Trades paths.drawio`
and the Optiq Overview/SATURN presentations) with EuNEx components mapped where they exist
and `[FUTURE]` markers where implementation is needed.
```
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ TRADING MEMBERS (Clients) β”‚
β”‚ FIX 5.0 SP2 / SBE / TCS OTC / SATURN Web / EMS / DAS β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚ β”‚ β”‚ β”‚
β–Ό β–Ό β–Ό β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ OEG.n.BOTH β”‚ β”‚ TCS.IN/OUT β”‚ β”‚ SATURN Web/API β”‚ β”‚ EMS / DAS β”‚
β”‚ (OEG β”‚ β”‚ [FUTURE] β”‚ β”‚ [FUTURE] β”‚ β”‚ [FUTURE] β”‚
β”‚ Actor) βœ“ β”‚ β”‚ Trade β”‚ β”‚ External trade β”‚ β”‚ Execution β”‚
β”‚ β”‚ β”‚ Capture β”‚ β”‚ declarations β”‚ β”‚ Mgmt System β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ Service β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚ β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β”‚ ord β”‚ Trade Decl β”‚
β–Ό β–Ό β”‚
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ ME / Trading Chain β”‚
β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚ β”‚ Book / LogCore#n (MECoreActor) βœ“ β”‚ β”‚
β”‚ β”‚ β”‚ β”‚
β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚
β”‚ β”‚ β”‚ Recovery Cause β”‚ β”‚ Matching Engine β”‚ β”‚ IACA Inside β”‚ β”‚ β”‚
β”‚ β”‚ β”‚ (RecoveryProxy β”‚ β”‚ (Book) βœ“ β”‚ β”‚ (IacaAggregator β”‚ β”‚ β”‚
β”‚ β”‚ β”‚ β†’ Kafka) βœ“ β”‚ β”‚ β”‚ β”‚ partial) βœ“ β”‚ β”‚ β”‚
β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚
β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚
β”‚ β”‚ β–Ό β–Ό β–Ό β”‚ β”‚
β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚
β”‚ β”‚ β”‚ Kafka Bus (KFK) [FUTURE β€” currently in-memory] β”‚ β”‚ β”‚
β”‚ β”‚ β””β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚
β”‚ β””β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚
β–Ό β–Ό β–Ό β–Ό β–Ό β–Ό β–Ό β–Ό
```
### Downstream Consumers from Kafka Bus
```
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ Kafka Topics ──────────────────────────────────────────────────────┐
β”‚ recovery+audit trail β”‚ MktUpdt,FullTradeInfo β”‚ Trade Fill β”‚ IACA fragments β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚
β–Ό β–Ό β”‚ β”‚ β”‚ β”‚ β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ PE DB β”‚ β”‚ MDG β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ IACA FINISH β”‚
β”‚ [FUTURE] β”‚ β”‚(MarketData β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ [FUTURE] β”‚
β”‚ Persistence β”‚ β”‚ Actor) βœ“ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ Completes chains β”‚
β”‚ Engine DB β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β†’ IA SBE messagesβ”‚
β”‚ (order state β”‚ β”‚ Multicast β”‚ β”‚ β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚ snapshots) β”‚ β”‚ SBE feed β”‚ β”‚ β”‚ β”‚ β”‚ β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ [FUTURE] β”‚ β”‚ β”‚ β”‚ β”‚ β–Ό
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β–Ό β”‚ β”‚ β”‚ β”‚ IACA COPY β”‚
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ β”‚ [FUTURE] β”‚
β”‚ IDS β”‚ β”‚ β”‚ β”‚ β”‚ Copy to members β”‚
β”‚ [FUTURE] β”‚ β”‚ β”‚ β”‚ β”‚ (DropCopy/DCG) β”‚
β”‚ Intraday Data β”‚ β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚ Service β”‚ β”‚ β”‚ β”‚
β”‚ (files to β”‚ β”‚ β”‚ β”‚
β”‚ regulators) β”‚ β”‚ β”‚ β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”‚
β–Ό β”‚ β”‚
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚
β”‚ PTB β”‚ β”‚ β”‚
β”‚ [FUTURE] β”‚ β”‚ β”‚
β”‚ Post-Trade Box β”‚ β”‚ β”‚
β”‚ (admin, β”‚ β”‚ β”‚
β”‚ resilience) β”‚ β”‚ β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚
β”‚ β”‚ β”‚
β–Ό β–Ό β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ CLEARING [FUTURE] β”‚
β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚ β”‚ EuroCCP β”‚ β”‚ LCH Ltd β”‚ β”‚ SIX Xclear β”‚ β”‚
β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β”‚ Enxt Clearing ← PTB2EC β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
```
---
## Future Expansion: Trading Phases & Order Types
Based on the Euronext Trading Manual (Notice 4-01, Dec 2025).
### Trading Day Phases (not yet implemented in EuNEx)
```
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ CONTINUOUS TRADING DAY LIFECYCLE β”‚
β”‚ β”‚
β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚ β”‚ Pre-opening β”‚ β”‚ Opening β”‚ β”‚ Main β”‚ β”‚Pre-close β”‚ β”‚Closing β”‚ β”‚
β”‚ β”‚ Call Phase │──▢│Uncrossing│──▢│ Trading │──▢│Call Phase│──▢│Uncross β”‚ β”‚
β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ Session β”‚ β”‚ β”‚ β”‚ β”‚ β”‚
β”‚ β”‚ Orders β”‚ β”‚ Book β”‚ β”‚ Continuous β”‚ β”‚ Orders β”‚ β”‚ Max β”‚ β”‚
β”‚ β”‚ accumulate, β”‚ β”‚ frozen, β”‚ β”‚ matching, β”‚ β”‚ accum., β”‚ β”‚ exec. β”‚ β”‚
β”‚ β”‚ IOP calc'd β”‚ β”‚ IOP β†’ β”‚ β”‚ price-time β”‚ β”‚ no β”‚ β”‚ price β”‚ β”‚
β”‚ β”‚ continuouslyβ”‚ β”‚ opening β”‚ β”‚ priority β”‚ β”‚ trades β”‚ β”‚ algo β”‚ β”‚
β”‚ β”‚ β”‚ β”‚ price β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚
β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”¬β”€β”€β”€β”€β”˜ β”‚
β”‚ β”‚ β”‚
β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚
β”‚ β”‚ AVD Orders β”‚ β”‚ Trading-at-Last β”‚β—€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β”‚ β”‚ [FUTURE] β”‚ β”‚ [FUTURE] β”‚ β”‚
β”‚ β”‚ Auction Volume β”‚ β”‚ Trade only at TAL β”‚ β”‚
β”‚ β”‚ Discovery β€” β”‚ β”‚ price (= last trade β”‚ β”‚
β”‚ β”‚ after each β”‚ β”‚ or closing price) β”‚ β”‚
β”‚ β”‚ uncrossing β”‚ β”‚ β”‚ β”‚
β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
```
### Order Types Roadmap
```
Currently Implemented (EuNEx) To Be Added
═══════════════════════════ ═════════════════════════════════════════
βœ“ Limit orders β–‘ Market-to-Limit orders
βœ“ Market orders (IOC) (converted to limit at best opposite)
βœ“ IOC (Immediate or Cancel) β–‘ Stop-Market orders
βœ“ FOK (Fill or Kill) (triggered when price crosses stop)
βœ“ Day validity β–‘ Stop-Limit orders
βœ“ Cancel order (stop trigger + limit price)
βœ“ Modify order β–‘ Primary Pegged orders
(pegged to BBO, auto-reprice)
β–‘ Mid-Point orders
(pegged to mid of BBO spread)
β–‘ Iceberg orders
(displayed qty + hidden reserve)
β–‘ AVD orders (Auction Volume Discovery)
(fill imbalance after uncrossing)
β–‘ GTD / GTC validity
(Good Till Date / Good Till Cancel)
β–‘ VFU / VFCU validity
(Valid For Uncrossing / Closing Uncr.)
```
### Uncrossing Algorithm (Opening / Closing)
```
[FUTURE] Uncrossing price determination algorithm:
Step 1: Maximum Execution Principle
Find price P that maximizes executable volume
Step 2: Minimum Surplus
If tie β†’ pick P with smallest order imbalance
Step 3: Reference Price
If still tie β†’ pick P closest to previous reference price
Step 4: Market Pressure
If still tie β†’ pick higher P if buy surplus, lower if sell surplus
Currently EuNEx uses continuous matching only.
Uncrossing requires:
β€’ TradingPhaseManager actor
β€’ Theoretical Opening Price (IOP) calculation
β€’ Book freeze during uncrossing
β€’ AVD order processing after uncrossing
```
### Price Collars & Reservations
```
[FUTURE] Price protection mechanisms:
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ DYNAMIC COLLARS β”‚
β”‚ Based on last traded price Β± threshold % β”‚
β”‚ Breach β†’ order rejected or book reserved β”‚
β”‚ β”‚
β”‚ STATIC COLLARS β”‚
β”‚ Based on reference price Β± wider threshold % β”‚
β”‚ Breach during continuous β†’ reservation + uncrossing β”‚
β”‚ β”‚
β”‚ RESERVATION β”‚
β”‚ Book frozen, enters call phase β”‚
β”‚ Duration: configurable per trading group β”‚
β”‚ After reservation β†’ uncrossing to resume trading β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
```
---
## Future Expansion: Segments & Partitions
From the Optiq Architecture presentation.
```
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ OPTIQ SEGMENTS β”‚
β”‚ β”‚
β”‚ Cash Derivatives β”‚
β”‚ β”Œβ”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β” β”‚
β”‚ β”‚ EQU β”‚ β”‚ ETF β”‚ β”‚ FXI β”‚ β”‚ WAR β”‚ β”‚ EQD β”‚ β”‚ IDD β”‚ β”‚ CMO β”‚ β”‚
β”‚ β”‚Equitβ”‚ β”‚Trackβ”‚ β”‚Bondsβ”‚ β”‚Warr β”‚ β”‚Eq. β”‚ β”‚Indexβ”‚ β”‚Commoβ”‚ β”‚
β”‚ β”‚ies β”‚ β”‚ers β”‚ β”‚Debt β”‚ β”‚ants β”‚ β”‚Derivβ”‚ β”‚Derivβ”‚ β”‚dity β”‚ β”‚
β”‚ β””β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”˜ β”‚
β”‚ β”‚
β”‚ β”Œβ”€β”€β”€β”€β”€β” β”‚
β”‚ β”‚ BLK β”‚ Block β€” large trades off main book β”‚
β”‚ β””β”€β”€β”€β”€β”€β”˜ β”‚
β”‚ β”‚
β”‚ Each segment has: β”‚
β”‚ β€’ Own OEG instances (OEG.n.BOTH) β”‚
β”‚ β€’ Own ME partitions β”‚
β”‚ β€’ Own MDG multicast channels β”‚
β”‚ β”‚
β”‚ EuNEx currently: single segment, single partition β”‚
β”‚ [FUTURE] Multi-segment support via SegmentManager actor β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ PARTITIONS (Horizontal Scalability) β”‚
β”‚ β”‚
β”‚ 1 Partition = 1 Machine = 1 TRNODE β”‚
β”‚ β”‚
β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚ β”‚ Partition 1β”‚ β”‚ Partition 2β”‚ β”‚ Partition 3β”‚ β”‚ Partition 4β”‚ β”‚
β”‚ β”‚ Group 11 β”‚ β”‚ Group 16 β”‚ β”‚ Group 35 β”‚ β”‚ Group 37 β”‚ β”‚
β”‚ β”‚ Group 12 β”‚ β”‚ Group 17 β”‚ β”‚ Group 44 β”‚ β”‚ ... β”‚ β”‚
β”‚ β”‚ Group 13 β”‚ β”‚ ... β”‚ β”‚ ... β”‚ β”‚ β”‚ β”‚
β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β”‚ β”‚
β”‚ Cross-partition orders β†’ routed via OEG to correct partition β”‚
β”‚ β”‚
β”‚ Trading Group = set of instruments with shared: β”‚
β”‚ β€’ Trading schedule (phases, times) β”‚
β”‚ β€’ Matching rules β”‚
β”‚ β€’ Collar parameters β”‚
β”‚ β€’ Market segment or liquidity level β”‚
β”‚ β”‚
β”‚ Each Instrument: β”‚
β”‚ β€’ Identified by SymbolIndex β”‚
β”‚ β€’ May have multiple order books β”‚
β”‚ β€’ Inherits trading group attributes β”‚
β”‚ β€’ Can override: APF (Authorized Price Fluctuation) β”‚
β”‚ β”‚
β”‚ EuNEx currently: MECoreActor per symbol, single "partition" β”‚
β”‚ [FUTURE] PartitionManager distributes symbols across nodes β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
```
---
## Future Expansion: SATURN (Regulatory Reporting)
From the SATURN Overview v1.0.4 presentation.
```
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ SATURN SYSTEM [FUTURE] β”‚
β”‚ β”‚
β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚ β”‚ ARM β€” Approved Reporting Mechanism (MiFID II RTS 22) β”‚ β”‚
β”‚ β”‚ β”‚ β”‚
β”‚ β”‚ Trading Engine ──order msg──▢ Check Library ──▢ Reporting Tool ──▢ NCAs β”‚ β”‚
β”‚ β”‚ (ME) (incl. (MiFID II (RTS 22 (AMF, β”‚ β”‚
β”‚ β”‚ MiFID II controls, formatting) FSMA, β”‚ β”‚
β”‚ β”‚ data) acceptance/ CBI, β”‚ β”‚
β”‚ β”‚ rejection) AFM, β”‚ β”‚
β”‚ β”‚ Consob) β”‚ β”‚
β”‚ β”‚ External Trades ──▢ Saturn GUI / API / File Upload ──▢ same pipeline β”‚ β”‚
β”‚ β”‚ β”‚ β”‚
β”‚ β”‚ MiFID Firms: report to regulator of member's country β”‚ β”‚
β”‚ β”‚ Non-MiFID Firms: report to regulator of instrument's MIC β”‚ β”‚
β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β”‚ β”‚
β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚ β”‚ OBOE β€” Off-Book On-Exchange (Dublin + Oslo) β”‚ β”‚
β”‚ β”‚ β”‚ β”‚
β”‚ β”‚ Trade Declaration ──▢ Check Module ──▢ MDG (publication) ──▢ Members β”‚ β”‚
β”‚ β”‚ (via Saturn Web / REST API) (deferred publication rules) β”‚ β”‚
β”‚ β”‚ β”‚ β”‚
β”‚ β”‚ Scope: instruments listed on Euronext Dublin & Oslo, β”‚ β”‚
β”‚ β”‚ tradable on Euronext Central Order Book β”‚ β”‚
β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β”‚ β”‚
β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚ β”‚ SLC Manager β€” Short Long Code (MiFID II anonymization) β”‚ β”‚
β”‚ β”‚ β”‚ β”‚
β”‚ β”‚ Before: Order has Member LEI β†’ everyone sees originator β”‚ β”‚
β”‚ β”‚ After: Order has Short Code 123 β†’ only SATURN maps to LEI β”‚ β”‚
β”‚ β”‚ β”‚ β”‚
β”‚ β”‚ Entities hidden: Client ID (LEI), human client (National ID), β”‚ β”‚
β”‚ β”‚ AGGR/PNAL flags, Execution Decision maker, β”‚ β”‚
β”‚ β”‚ Investment Decision maker β”‚ β”‚
β”‚ β”‚ β”‚ β”‚
β”‚ β”‚ Transmitted to NCAs via RTS 22/24 regulatory reports β”‚ β”‚
β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β”‚ β”‚
β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚ β”‚ Commodities Reporting (MiFID II RTS 21) β”‚ β”‚
β”‚ β”‚ β”‚ β”‚
β”‚ β”‚ Daily: positions per client β†’ ESMA/NCAs β”‚ β”‚
β”‚ β”‚ Weekly: Commitment of Traders (CoT) β†’ Euronext website β”‚ β”‚
β”‚ β”‚ β”‚ β”‚
β”‚ β”‚ Sources: Participants & EMS β†’ Saturn β†’ Check Library β”‚ β”‚
β”‚ β”‚ Reference: Matrix (IDS) + European Instruments Referential β”‚ β”‚
β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β”‚ β”‚
β”‚ Architecture: Kafka Engine + GUI + API + DB β”‚
β”‚ Communicates with: ESMA, NCAs (AMF, CBI, FCA, AFM, Consob, CNMV, CSSF, FSMA, β”‚
β”‚ CMVM), Euronext Clearing, Borsa Italiana β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
```
---
## Future Expansion: Post-Trade Path
From `Trades paths.drawio` β€” complete downstream flow after trade execution.
```
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ COMPLETE POST-TRADE PATH [FUTURE] β”‚
β”‚ β”‚
β”‚ Book/LogCore (trade generated) β”‚
β”‚ β”‚ β”‚
β”‚ β”œβ”€β”€β–Ά Kafka (recovery + audit trail) ──▢ PE DB (Persistence Engine DB) β”‚
β”‚ β”‚ β”‚
β”‚ β”œβ”€β”€β–Ά IACA Inside (fragment emission) β”‚
β”‚ β”‚ β”‚ β”‚
β”‚ β”‚ β”œβ”€β”€β–Ά IACA FINISH (chain completion β†’ IA SBE message) β”‚
β”‚ β”‚ β”‚ β”‚ β”‚
β”‚ β”‚ β”‚ β”œβ”€β”€β–Ά IACA COPY (members) ──▢ Members (DropCopy) β”‚
β”‚ β”‚ β”‚ β”œβ”€β”€β–Ά IACA COPY (3rd parties) ──▢ DCG 3P's β”‚
β”‚ β”‚ β”‚ β”œβ”€β”€β–Ά IAkafka2DB.TRD ──▢ PE DB (trade persistence) β”‚
β”‚ β”‚ β”‚ └──▢ PackFULL / PackTOL ──▢ MDG Emitter ──▢ Members β”‚
β”‚ β”‚ β”‚ β”‚
β”‚ β”‚ └──▢ IDS (files to IDS) ──▢ Regulators (RTS nn) β”‚
β”‚ β”‚ β”‚
β”‚ β”œβ”€β”€β–Ά MktUpdt, FullTradeInfo ──▢ MDG ──▢ Members (market data multicast) β”‚
β”‚ β”‚ β”‚
β”‚ β”œβ”€β”€β–Ά Trade Fill ──▢ PTB (Post-Trade Box) β”‚
β”‚ β”‚ β”‚ β”‚
β”‚ β”‚ β”œβ”€β”€β–Ά PTB admin (resilience) β”‚
β”‚ β”‚ β”œβ”€β”€β–Ά SATURN/OBOE (regulatory reporting) β”‚
β”‚ β”‚ β”œβ”€β”€β–Ά PTB2EC ──▢ Enxt Clearing β”‚
β”‚ β”‚ β”œβ”€β”€β–Ά EC.POSTTRAD ──▢ Enxt Clearing β”‚
β”‚ β”‚ └──▢ Clearing houses: β”‚
β”‚ β”‚ EuroCCP, LCH Ltd, SIX Xclear β”‚
β”‚ β”‚ β”‚
β”‚ └──▢ ACK/NAK ──▢ OEG ──▢ Members (execution reports) β”‚
β”‚ β”‚
β”‚ External entities: DSS, BITA instr., Enxt Legacy instr., SMARTS β”‚
β”‚ Risk/Audit: Regulators, Risk/Audit systems β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
```
---
## Market Data Dissemination
From Trading Manual Section 5.
```
[FUTURE] Market data types to implement:
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ 1. Market by Orders (MBO) β”‚
β”‚ Every individual order visible in the book β”‚
β”‚ (currently: not disseminated by EuNEx) β”‚
β”‚ β”‚
β”‚ 2. Market by Limits (MBL) ← EuNEx has this (BookUpdateEvent) β”‚
β”‚ Aggregated qty per price level (BBO + depth) β”‚
β”‚ getAsks(n) / getBids(n) already implemented β”‚
β”‚ β”‚
β”‚ 3. Trades ← EuNEx has this (TradeEvent) β”‚
β”‚ Each trade with price, qty, timestamp β”‚
β”‚ β”‚
β”‚ 4. Trading Day Price Summary β”‚
β”‚ Open, High, Low, Close, Volume, VWAP β”‚
β”‚ (currently: not tracked by EuNEx) β”‚
β”‚ β”‚
β”‚ Format: SBE multicast (production) vs in-memory events (EuNEx) β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
```
---
## Implementation Priority Roadmap
```
Phase 1 (Current) βœ“ DONE
β”œβ”€β”€ Book with price-time priority matching
β”œβ”€β”€ OEGActor β†’ MECoreActor β†’ MDGActor pipeline
β”œβ”€β”€ Recovery Cause/Effect with Master/Mirror gating
β”œβ”€β”€ IACA fragment chains with completion detection
└── Simplx shim for single-threaded testing
Phase 2 β€” Core Trading Features
β”œβ”€β”€ Trading phases (pre-open, uncrossing, continuous, close, TAL)
β”œβ”€β”€ Uncrossing algorithm (max execution, min surplus, ref price)
β”œβ”€β”€ Price collars (dynamic + static) and reservations
β”œβ”€β”€ Additional order types (Stop, Pegged, Mid-Point, Iceberg, M2L)
β”œβ”€β”€ Additional validities (GTD, GTC, VFU, VFCU)
└── Trading groups and instrument configuration
Phase 3 β€” Infrastructure
β”œβ”€β”€ Real Simplx integration (multi-threaded, multi-core actors)
β”œβ”€β”€ Kafka persistence (replace FragmentStore with real Kafka)
β”œβ”€β”€ SBE encoding (replace event structs with SBE messages)
β”œβ”€β”€ PE DB (Persistence Engine database for order state)
└── FIX 5.0 SP2 gateway (replace shim OEG with FIX acceptor)
Phase 4 β€” Post-Trade & Distribution
β”œβ”€β”€ IACA FINISH + IACA COPY (DropCopy to members / 3rd parties)
β”œβ”€β”€ MDG multicast SBE feed
β”œβ”€β”€ IDS (Intraday Data Service β†’ files to regulators)
β”œβ”€β”€ PTB (Post-Trade Box) with trade routing
└── DCG (DropCopy Gateway for 3rd parties)
Phase 5 β€” Regulatory & Clearing
β”œβ”€β”€ SATURN ARM (MiFID II RTS 22 trade reporting to NCAs)
β”œβ”€β”€ SATURN OBOE (Off-Book On-Exchange for Dublin/Oslo)
β”œβ”€β”€ SLC Manager (Short Long Code anonymization)
β”œβ”€β”€ Commodities Reporting (RTS 21 position reporting)
β”œβ”€β”€ Clearing integration (EuroCCP, LCH Ltd, SIX Xclear)
└── Enxt Clearing (PTB2EC, EC.POSTTRAD)
Phase 6 β€” Scalability & Operations
β”œβ”€β”€ Multi-segment support (EQU, ETF, FXI, EQD, IDD, CMO, etc.)
β”œβ”€β”€ Partitioning (1 partition = 1 machine, cross-partition routing)
β”œβ”€β”€ Full Master/Mirror failover with Kafka replay
β”œβ”€β”€ TCS OTC (Trade Capture Service for OTC trades)
β”œβ”€β”€ SMARTS market surveillance integration
└── GUI resilience and operational tooling
```