Skip to main content

Data Model: YU10-fix-ingress

FIX ↔ internal field mapping​

Inbound NewOrderSingle (35=D) β†’ order-new input event​

FIX tagFieldInternalRule
11ClOrdIDledger key (with session)Required; duplicate per session β†’ rejected (FR-FIX10)
49SenderCompIDsession β†’ accountIdResolved at logon via FIX_SESSION_ACCOUNTS; Account(1) if present must equal the mapped account or the order is rejected
55SymbolsecurityIdResolved through the existing symbol table; unknown symbol β†’ application rejection (ER Rejected)
54Sideside1=Buy, 2=Sell; others β†’ session Reject
38OrderQtyqtyPositive integer; else session Reject
44PricelimitPxRequired (OrdType(40)=2 limit only); fixed-point conversion identical to the REST path
60TransactTime; Accepted, not carried (event time is assigned at sequencing, as for REST)

Inbound OrderCancelRequest (35=F) β†’ cancel input event​

FIX tagFieldInternalRule
41OrigClOrdIDledger lookup β†’ orderRefUnknown β†’ OrderCancelReject(9) with CxlRejReason
11ClOrdIDledger key for the cancel itselfDuplicate rule applies
49SenderCompIDownership checkSession's account must own the order or OrderCancelReject

Inbound OrderStatusRequest (35=H) β†’ read-model lookup (no ring publish)​

FIX tagFieldRule
11/41(Orig)ClOrdIDledger lookup β†’ orderRef β†’ in-memory read model β†’ ExecutionReport with ExecType(150)=I

Outbound ExecutionReport (35=8) from output events​

Output eventExecType(150) / OrdStatus(39)Notes
ORDER_ACCEPTED0 New / 0 New
ORDER_PARTIALLY_FILLEDF Trade / 1 Partially filledLastQty(32), LastPx(31) from the fill
ORDER_FILLEDF Trade / 2 Filled
ORDER_CANCELED4 Canceled / 4 Canceled
ORDER_REJECTED8 Rejected / 8 RejectedRisk reason in Text(58) (e.g. POSITION_LIMIT, CREDIT_LIMIT, PRICE_COLLAR)
ORDER_NOT_FOUND (from cancel)β†’ OrderCancelReject (35=9)CxlRejReason(102)=1 unknown order

Every outbound report carries ClOrdID(11), OrderID(37)=internal orderRef, Symbol(55), Side(54), LeavesQty(151), CumQty(14), AvgPx(6).

Correlation ledger record (append-only, on PVC)​

Fixed-length binary record, little-endian, in ${FIX_DATA_DIR}/clordid-ledger.dat:

OffsetFieldType
0sessionKey hashint64 (FNV-1a of SenderCompID:TargetCompID)
8inputSeqint64
16orderRefint32
20clOrdIdLenint16
22clOrdIdUTF-8, max 64 bytes, zero-padded
86pad2 bytes (88-byte record)

Written before ring publish; forced with the same amortized-batch discipline as the journal; rehydrated fully at startup into the in-memory maps ((session, clOrdId) β†’ inputSeq/orderRef for duplicates and cancels; inputSeq β†’ (session, clOrdId) for the report handler).

Session configuration​

EnvMeaning
FIX_ACCEPTOR_PORTAcceptor TCP port (default 18130)
FIX_SESSION_ACCOUNTSCOMPID:accountId[,…]; the complete set of CompIDs allowed to log on
FIX_DATA_DIRFIX store + ledger directory (default /var/lib/traderx-lmax/fix)
FIX_TARGET_COMP_IDServer CompID (default TRADERX)

QuickFIX/J session settings live in fix/acceptor.cfg generated from these envs at startup: FIX.4.4, file store + file log under FIX_DATA_DIR, PersistMessages=Y, heartbeat 30s.

No changes​

InputEvent, OutputEvent, RestingOrder, the journal record, the replication record, the snapshot format, and every database table are unchanged by this state.