| # 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 |
| ``` |
|
|