FCX FIX Specification v1.0.0
Market data and order entry interfaces of the FCX exchange.
| Version | 1.0.0, provisional, 2026-11-10 | Status | Decisions recorded in FCX-183; later ones (symbols, 2026-10-14) in FCX-126 and FCX-116. Open points are in the appendix. |
|---|---|---|---|
| Audience | FCX engineering and partner teams. FCMs and market makers after FCX-181. | Standard | FIXT 1.1, FIX 5.0 SP2. Market data in the shape of CDNA 4.3. |
1. Introduction
FCX is an exchange for binary event contracts. A contract normally settles at 0 or 100. If the event is cancelled or cannot be resolved, FCX settles the contract manually at a fair price from 0 to 100, for example the VWAP (6.5).
FCX runs two FIX gateways:
- Market data gateway. Exchange status, instrument discovery, instrument status, order book and trades. The message structure follows the CDNA Fully Collateralized Exchange FIX Specification 4.3, section 5, so a client already integrated with CDNA market data needs few changes. Section 9 lists the differences.
- Order entry gateway. Orders, cancels, replaces, execution reports and positions. This interface is FCX's own.
Every instrument is the "Yes" side of one proposition. There is no "No" instrument: to buy No at price P, sell Yes at 100 − P. A market that can end in a draw has one instrument per outcome: a 3-way moneyline is three instruments (home, draw, away). No instrument settles as a tie.
2. Conventions
| Item | Rule |
|---|---|
| Protocol | Transport 8=FIXT.1.1. Application FIX 5.0 SP2: 1137=9 on Logon. FCX refuses any other 1137. |
| Dictionary | FCX publishes one FIX 5.0 SP2 dictionary for each gateway (FCX-181). FCX validates every message against it. In a repeating group, the first field of each entry (the delimiter) must come first, because it marks where the entry starts. The other fields of the entry can come in any order. |
| Extensions | Not in FIX 5.0 SP2, taken from CDNA: values 460=102 (Event) and 326=50 (Settled); tags 5001, 10300, 10301 and 10302 (market data), 6867 and 35002 (Logon). FCX's own: tag 60013 AlphaStrike (6.1.1). The FCX dictionary (FCX-181) defines them. |
| Required | Y = FCX rejects the message without this tag. C = required in some cases (see the note). N = optional. |
| Times | UTC. UTCTimestamp is yyyyMMdd-HH:mm:ss.SSS. |
| Dates | yyyyMMdd, UTC. |
| Invalid message | A message that breaks the dictionary gets a session Reject (35=3) with 373 SessionRejectReason. Logon is the exception: a Logon that fails a check in 4.4, including a missing 553, 554 or 96, gets Logout (35=5), not 35=3. |
| Unsupported MsgType | Business Message Reject (35=j) with 380=3 on both gateways, see section 8. A MsgType that FIX does not define gets a session Reject (35=3) with 373=11 instead. The session stays up in both cases. |
3. Gateways and sessions
| Gateway | Port | Messages in | Messages out | API key |
|---|---|---|---|---|
| Market data | 10004 provisional | g, x, c, e, V | h, y, d, f, W, X, Y, j | Read-only or trading |
| Order entry | 10003 | D, F, G, H, AF, AN | 8, 9, j, AO, AP | Trading only |
Each gateway has its own host. Connect over AWS PrivateLink TBD; nothing is on the public internet. FCX gives you the hosts, the CompIDs, and an API key with its secret.
| Property | Value |
|---|---|
| Role | FCX is the acceptor. The client is the initiator. |
| SenderCompID (49), TargetCompID (56) | Assigned by FCX for each session. |
| Session schedule | 24 hours. No daily reset. |
| HeartBtInt (108) | Set by the client on Logon. 30 seconds is recommended. |
| Session messages | Standard FIXT 1.1: Heartbeat (0), Test Request (1), Resend Request (2), Reject (3), Sequence Reset (4), Logout (5), Logon (A). |
| Sequence numbers | Market data: reset at each logon, see 6.9. Order entry: see 7.11. |
3.1 Standard header
Every message on both gateways starts with this header. On messages from FCX, 49 and 56 are swapped.
| Tag | Name | Req | Value |
|---|---|---|---|
| 8 | BeginString | Y | FIXT.1.1. First field. |
| 9 | BodyLength | Y | Second field. |
| 35 | MsgType | Y | Third field. |
| 1128 | ApplVerID | N | If sent, 9. The version comes from 1137 on Logon. FCX does not send it. |
| 49 | SenderCompID | Y | Your CompID, assigned by FCX. |
| 56 | TargetCompID | Y | FCX's CompID for the gateway, assigned by FCX. |
| 34 | MsgSeqNum | Y | Sequence number. |
| 43 | PossDupFlag | C | Y on every resent message, also as the reply to a Resend Request (2). |
| 97 | PossResend | C | Y when the message can repeat one sent under another sequence number. FCX does not send it. |
| 52 | SendingTime | Y | UTCTimestamp, milliseconds. |
| 122 | OrigSendingTime | C | Required with 43=Y: the 52 of the first send. If it is not known, the same value as 52. |
Header tags not in this table are not used: 50, 57, 115, 116, 128, 129, 142 to 145, 90, 91, 212, 213, 347, 369, 627 to 630. FCX ignores them and does not send them. Each session is one firm; there is no third-party routing (115, 128).
| Header check | FCX reply |
|---|---|
| 49 or 56 does not match the session | Reject (35=3) with 373=9, then Logout (35=5). |
| 52 more than 120 seconds from FCX time provisional | Reject (35=3) with 373=10, then Logout (35=5). Use NTP. |
1128 not 9 | Reject (35=3) with 373=18. |
34 lower than expected, without 43=Y | Logout (35=5), standard FIXT 1.1. |
43=Y without 122 | Reject (35=3) with 373=1. |
3.2 Standard trailer
| Tag | Name | Req | Value |
|---|---|---|---|
| 10 | CheckSum | Y | Last field. Three digits: the sum of every byte before tag 10, modulo 256. |
Signature (89) and SignatureLength (93) are not used. A message with a wrong 9 or 10 is dropped without a reply, as in standard FIXT 1.1.
4. Logon and authentication
Both gateways use the CDNA logon signature, which is the Crypto.com FIX digital signature: HMAC-SHA256 over the sequence number, the key and a nonce. A client that already logs on to CDNA can reuse its code.
4.1 Logon tags
| Tag | Name | Req | Value |
|---|---|---|---|
| 34 | MsgSeqNum | Y | Sequence number of this Logon. It is part of the signature. |
| 98 | EncryptMethod | Y | Exactly 0. |
| 108 | HeartBtInt | Y | Seconds. |
| 141 | ResetSeqNumFlag | N | Y to reset sequence numbers. |
| 553 | Username | Y | Your API key. |
| 554 | Password | Y | The signature, as hex (see 4.2). Case is not significant. |
| 95 | RawDataLength | Y | Length of tag 96. |
| 96 | RawData | Y | Nonce: current time in milliseconds since the Unix epoch, digits only. |
| 1137 | DefaultApplVerID | Y | 9 (FIX 5.0 SP2). |
| 6867 | CancelOnDisconnectScope | N | Order entry only. Y: this connection (7.11). |
| 35002 | CancelOnDisconnectType | N | Order entry only. 0 disable, 3 enable (7.11). |
4.2 Signature
- Build the string
"public/auth" + MsgSeqNum + ApiKey + Label + Nonce. There are no separators. Labelissystem_labelFCXon the order entry gateway. It is empty on the market data gateway.MsgSeqNumis tag 34 in decimal.Nonceis tag 96, exactly as sent.- Compute HMAC-SHA256 of the UTF-8 string. The key is the UTF-8 bytes of your API secret, as issued.
- Put the result in tag 554 as lowercase hex (64 characters).
Test vectors (demonstration values only):
ApiKey fcx-demo-key
Secret demo-secret
34 1
96 1791469800000
Order entry signed string public/auth1fcx-demo-keysystem_labelFCX1791469800000
554 6531aa33213112601b883adea536eefddfe04b7484f7d39729b54c33c250e76a
Market data signed string public/auth1fcx-demo-key1791469800000
554 4c84678e7484099de725266416ca1cf8427fab02dbd630f2c9851094adffc9b8
Python reference:
import hashlib, hmac, time
def logon_fields(api_key, secret, seq_num, label, heart_bt_int=30):
nonce = str(int(time.time() * 1000))
signed = f"public/auth{seq_num}{api_key}{label}{nonce}"
sig = hmac.new(secret.encode("utf-8"), signed.encode("utf-8"), hashlib.sha256).hexdigest()
return {553: api_key, 554: sig, 95: len(nonce), 96: nonce, 98: 0, 108: heart_bt_int, 1137: 9}
4.3 Rules
- The nonce must be within 30 seconds of FCX time, ahead or behind. Use NTP.
- FCX refuses a second logon with the same key and nonce inside that window, even with a new sequence number.
- A read-only key can log on to the market data gateway only.
4.4 Refused Logon
FCX replies with Logout (35=5), a 58 text and SessionStatus (1409), then closes the connection. A refused authentication says 58=Logon not authenticated and not which check failed.
| 1409 | Cause |
|---|---|
| 5 | Invalid credentials: missing 553, 554 or 96; 98 not 0; nonce not numeric, stale or replayed; unknown key; bad signature. |
| 6 | Key locked: revoked, expired, or a read-only key on order entry. |
| 7 | The gateway is stopping: 58=Gateway is shutting down. Log on again once it is back. |
A Logon with 1137 missing or not 9, or with 95 missing, also gets Logout (35=5). Its 1409 value is TBD (FCX-107).
A Logon that breaks the dictionary gets Logout (35=5) with no 1409. Its 58 names the tag. For example, 35002 not 0 or 3 gets 58=Invalid Logon message: Value is incorrect (out of range) for this tag, field=35002, and 6867 not Y gets the same text with field=6867.
5. Prices and quantities
| Item | Rule |
|---|---|
| Price unit | Cents per contract. A contract normally pays 100 cents ($1.00) or 0. Price 50 means $0.50. |
| Price range | Greater than 0 and less than 100. |
| Decimals on the wire | At most 2 in, exactly 2 out (for example 50.00), on both gateways. |
| Tick size | Set per instrument: a coarse step (default 1 cent), and optionally a finer step of 0.1 cent near 0 and 100. The market data gateway publishes the bands for each instrument (6.1.3). |
| Quantity | Number of contracts. Must be at least the minimum and a multiple of the round lot of the instrument (6.1.3). |
6. Market data gateway
A typical session:
- Log on. FCX sends Trading Session Status (h) at once.
- Send Security List Request (x) with
559=4,263=1and10300=Y. FCX sends the list (y), subscribes you to status (f) for each instrument, and then sends a Security Definition (d) for each new or changed instrument. - Send one Market Data Request (V) for each instrument you want to watch.
6.1 Symbology and instrument blocks
Each instrument has one Symbol(55), its instrument code. The symbol is unique across all instruments, live or settled, and does not change for the life of the instrument. A symbol is never re-used: after the instrument settles, no other instrument gets its symbol. FCX tells you that an instrument has settled with a Security Status 326=50.
- Product code (1151): the type of market, for example
ITF_TEN_TW(ITF tennis, tournament winner). Many instruments share one product code. - Instrument code (55): one outcome of one fixture. It is the product code, then the parts that the product defines, joined by
_. Each product sets its template in its product filing. - Example,
ITF_TEN_TW_{YYMMDD}_{DRAWID}_{PLAYERID}:ITF_TEN_TW_261025_D0004567_P01234is the last scheduled event date, the draw id and the player id.
Structure of ITF_TEN_TW_261025_D0004567_P01234:
| Part | Value | Meaning | Also in |
|---|---|---|---|
| Product code | ITF_TEN_TW | The product code as a whole: the type of market, here ITF tennis, tournament winner. Do not split it. | 1151 |
{YYMMDD} | 261025 | Last scheduled event date, 25 October 2026. | 200 (20261025) |
{DRAWID} | D0004567 | The draw: one tournament event, for example the men's singles. | |
{PLAYERID} | P01234 | The outcome: this player wins the draw. |
One draw with many players gives one instrument per player. The instruments share every part except the last:
| 55 | 60013 |
|---|---|
ITF_TEN_TW_261025_D0004567_P01234 | M25 [City] MS 2026-10-19/25 champion: [Player A] |
ITF_TEN_TW_261025_D0004567_P05678 | M25 [City] MS 2026-10-19/25 champion: [Player B] |
ITF_TEN_TW_261025_D0004567_P09012 | M25 [City] MS 2026-10-19/25 champion: [Player C] |
- Do not parse the symbol to get its parts. Each product has its own template, and new products add new templates. Only these parts have tags of their own: the product code (1151) and the contract date (200). 60013 is the outcome label, not an id. The event is in the Underlying block (6.1.4) and 871=99. Other parts, such as the draw id and the player id, are only in the symbol.
- Treat the symbol as an opaque string. Its length differs by product; the example has 33 characters.
- Other products (for example a moneyline) get their templates in their own product filings TBD.
6.1.1 Instrument block
| Tag | Name | Value |
|---|---|---|
| 55 | Symbol | Instrument code (6.1). |
| 48 | SecurityID | FCX instrument id. |
| 22 | SecurityIDSource | 8 (Exchange Symbol). Sent with 48, as FIX requires. |
| 454 | NoSecurityAltID | 1 |
| → 455 | SecurityAltID | Instrument code, the same as 55. |
| → 456 | SecurityAltIDSource | 8 (Exchange Symbol). |
| 1151 | SecurityGroup | Product code (6.1). |
| 207 | SecurityExchange | FCX MIC, WSLX. |
| 460 | Product | 102 (Event). |
| 167 | SecurityType | OPT |
| 762 | SecuritySubType | BINARY_OPTION |
| 200 | MaturityMonthYear | Contract date, yyyyMMdd: the last scheduled event date. |
| 541 | MaturityDate | Expiry date. |
| 202 | StrikePrice | Strike. Sent only for strike-based markets (for example crypto and finance), not for event markets. |
| 969 | MinPriceIncrement | Coarse tick, in cents (for example 1.00). Always a valid step. The finer step near 0 and 100 is in the trading rules (6.1.3). |
| 1146 | MinPriceIncrementAmount | Cash value of one coarse tick for one contract, in Currency (15). 0.01 USD for a 1-cent tick. |
| 1482 | OptPayoutType | 3 (Binary). |
| 1195 | OptPayoutAmount | Cash paid for one contract that settles at 100, in Currency (15): 1.00 USD. |
| 1199 | CapPrice | 100.00, in cents. Top of the price band. |
| 1200 | FloorPrice | 0.00, in cents. Bottom of the price band. |
| 107 | SecurityDesc | Human-readable name. |
| 60013 | AlphaStrike | Outcome label, for example M25 [City] MS 2026-10-19/25 champion: [Player A]. FCX extension. |
6.1.2 Instrument Extension block
| Tag | Name | Value |
|---|---|---|
| 870 | NoInstrAttrib | Count. |
| → 871 | InstrAttribType | 500 open time and 501 close time, always as a pair, UTC timestamps, sent until the instrument resolves or settles; 502 settled time, the resolution time once resolved; 99 event metadata. For strike-based markets only, FCX also sends 511 period code, 512 period index, 521 strike operator, 522 strike index, 523 strike display precision, 531 underlying rounding value and 532 underlying month, with the CDNA meanings; values TBD. Event markets do not have these parts, and FCX does not send them. |
| → 872 | InstrAttribValue | Value for the type. |
Event metadata (871=99). JSON with the same envelope as CDNA event metadata V3.0 (CDNA): eventCode, eventName and an eventMetadata list of codes. The code list is FCX's own. It works for any kind of event, not only sports. For each CDNA code and its FCX code, see 9.1. Each instrument carries its event, market and outcome data. Group events on 458 or eventCode, markets on PREDICT_MARKET_ID.
- Entries sorted by code. Keys exactly
eventPropertyTypeCodeandeventPropertyValue. All values are trimmed strings. DatetimesYYYY-MM-DDThh:mm:ss+00:00, UTC. - A required code with no value yet is sent as
TBD, for example before the market's event is listed.eventCodeand 458 are the event's code as soon as the market names its event. eventCode= 458, one per event.eventNameis display only, and not unique. The outcome label is in 60013.- FCX ids:
eventCode,PREDICT_MARKET_ID,PREDICT_OUTCOME_ID. FCX generates them when it lists the market. Data provider ids:ID_PROVIDERandPROVIDER_*.
Classification. Four levels place each event in a tree, from broad to narrow. The same codes apply to every category.
| Level | Code | Meaning | Sports example | Non-sports examples |
|---|---|---|---|---|
| 1 | PREDICT_CATEGORY | The broad area. | Sports | Economics · Crypto · Weather |
| 2 | TOPIC | The subject inside the category. For sports, the sport. | TENNIS | Interest Rates · Bitcoin · Temperature |
| 3 | SERIES | A family of events that repeat inside the topic. For sports, the league, tour or tier. | ITF M15 | US Fed Rate · BTC Daily Close · NYC Daily High |
| 4 | SECTION | A group of events inside one series, such as a tournament, round, week or release. | M15 Monastir | Dec 2026 FOMC · Nov 2026 · Week of 2026-11-02 |
Example paths: Sports › TENNIS › ITF M15 › M15 Monastir › Bertrand vs Arce Fernandez. Economics › Interest Rates › US Fed Rate › Dec 2026 FOMC › Rate decision.
| Req | Y required · C conditional · N optional |
|---|---|
| Unique | Y unique across FCX · P unique per ID_PROVIDER · N not unique |
| Products | ML ITF_TEN_ML · TW ITF_TEN_TW |
Event
| Code | Req | Unique | Type | Values / description |
|---|---|---|---|---|
| PREDICT_CATEGORY | Y | N | Enum | Sports |
| EVENT_DATE | Y | N | Datetime | Scheduled start. |
| NAME | Y | N | String | ML: Home vs Away. TW: tournament and draw name. |
| FEED_TYPE | Y | N | Enum | SINGLES |
| VERSION | Y | N | String | 1.0 |
| PREDICT_EVENT_TYPE | Y | N | Enum | Game (ML), Tournament (TW) |
| TOPIC | Y | N | Enum | TENNIS |
| SERIES | Y | N | Enum | ITF M15, ITF M25, ITF W15, ITF W35, ITF W50, ITF W75, ITF W100 |
| SECTION | Y | N | String | The tournament, for example M15 Monastir. |
| HOME_PARTICIPANT | C | N | String | ML. First player in provider order. |
| AWAY_PARTICIPANT | C | N | String | ML. Second player. |
| ID_PROVIDER | C | N | Enum | INFRONT. With any PROVIDER_*. |
| PROVIDER_EVENT_ID | C | P | String | With ID_PROVIDER. Match (ML) or tournament (TW). |
| PROVIDER_HOME_ID, PROVIDER_AWAY_ID | C | P | String | ML, with ID_PROVIDER. |
| PROVIDER_TOURNAMENT_ID | N | P | String | ML. Parent tournament. |
| VENUE | N | N | String | |
| EVENT_END_DATE | C | N | Datetime | TW. |
Market
| Code | Req | Unique | Type | Values / description |
|---|---|---|---|---|
| PREDICT_MARKET_ID | Y | Y | String | FCX market id. Stable for the life of the market. |
| PREDICT_CONTRACT_TYPE | Y | N | Enum | Moneyline (ML), Tournament Winner (TW) |
| PREDICT_MARKET_TYPE | Y | N | Enum | Game Line (ML), Tournament Prop (TW) |
| PREDICT_PERIOD_TYPE | Y | N | Enum | Full Game (ML), Tournament (TW) |
| PREDICT_OUTCOME_TYPE | C | N | Enum | ML: Home. The side of the Yes. |
Outcome
| Code | Req | Unique | Type | Values / description |
|---|---|---|---|---|
| PREDICT_OUTCOME_ID | Y | Y | String | FCX outcome id. One per instrument. |
| PARTICIPANT | Y | N | String | The player the Yes is about. |
| PROVIDER_PARTICIPANT_ID | C | P | String | With ID_PROVIDER. |
Two-way markets (ML). One instrument, the Yes = Home. No = sell the Yes (section 9); it has no instrument and no outcome id. The Yes side does not change after listing. Settlement in 6.5.
| Yes | No | |
|---|---|---|
| Participant | HOME_PARTICIPANT, PROVIDER_HOME_ID | AWAY_PARTICIPANT, PROVIDER_AWAY_ID |
| Label | 60013 | AWAY_PARTICIPANT + " to win" |
Example: ITF_TEN_ML, Yes = Robin Bertrand to win.
{"eventCode": "5f1c2d8e-3b4a-4c6f-9a2e-7d1b0c3e4f51",
"eventName": "Robin Bertrand vs Mario Arce Fernandez",
"eventMetadata": [
{"eventPropertyTypeCode": "AWAY_PARTICIPANT", "eventPropertyValue": "Mario Arce Fernandez"},
{"eventPropertyTypeCode": "EVENT_DATE", "eventPropertyValue": "2026-10-21T12:00:00+00:00"},
{"eventPropertyTypeCode": "FEED_TYPE", "eventPropertyValue": "SINGLES"},
{"eventPropertyTypeCode": "HOME_PARTICIPANT", "eventPropertyValue": "Robin Bertrand"},
{"eventPropertyTypeCode": "ID_PROVIDER", "eventPropertyValue": "INFRONT"},
{"eventPropertyTypeCode": "NAME", "eventPropertyValue": "Robin Bertrand vs Mario Arce Fernandez"},
{"eventPropertyTypeCode": "PARTICIPANT", "eventPropertyValue": "Robin Bertrand"},
{"eventPropertyTypeCode": "PREDICT_CATEGORY", "eventPropertyValue": "Sports"},
{"eventPropertyTypeCode": "PREDICT_CONTRACT_TYPE", "eventPropertyValue": "Moneyline"},
{"eventPropertyTypeCode": "PREDICT_EVENT_TYPE", "eventPropertyValue": "Game"},
{"eventPropertyTypeCode": "PREDICT_MARKET_ID", "eventPropertyValue": "b2e7a9c4-6d13-4f8a-8c5e-1a9f3d7b2c60"},
{"eventPropertyTypeCode": "PREDICT_MARKET_TYPE", "eventPropertyValue": "Game Line"},
{"eventPropertyTypeCode": "PREDICT_OUTCOME_ID", "eventPropertyValue": "e8d4c1b7-2a96-4e3f-b5d8-9c7a1f2e3d48"},
{"eventPropertyTypeCode": "PREDICT_OUTCOME_TYPE", "eventPropertyValue": "Home"},
{"eventPropertyTypeCode": "PREDICT_PERIOD_TYPE", "eventPropertyValue": "Full Game"},
{"eventPropertyTypeCode": "PROVIDER_AWAY_ID", "eventPropertyValue": "3c9e5a71-8f24-4b6d-a1e3-6b2d8f4c9a17"},
{"eventPropertyTypeCode": "PROVIDER_EVENT_ID", "eventPropertyValue": "7a3f1e92-4c58-4d0b-9e6a-2f8c5b1d3e74"},
{"eventPropertyTypeCode": "PROVIDER_HOME_ID", "eventPropertyValue": "d41b6c28-9e73-4a5f-b2c8-5e1a7d9f3b06"},
{"eventPropertyTypeCode": "PROVIDER_PARTICIPANT_ID", "eventPropertyValue": "d41b6c28-9e73-4a5f-b2c8-5e1a7d9f3b06"},
{"eventPropertyTypeCode": "PROVIDER_TOURNAMENT_ID", "eventPropertyValue": "9b6d2f40-1a87-4e3c-8d5b-4c7e9a2f1b83"},
{"eventPropertyTypeCode": "SECTION", "eventPropertyValue": "M15 Monastir"},
{"eventPropertyTypeCode": "SERIES", "eventPropertyValue": "ITF M15"},
{"eventPropertyTypeCode": "TOPIC", "eventPropertyValue": "TENNIS"},
{"eventPropertyTypeCode": "VENUE", "eventPropertyValue": "Magic Hotel Skanes Family Monastir, Monastir"},
{"eventPropertyTypeCode": "VERSION", "eventPropertyValue": "1.0"}
]}
6.1.3 Trading rules
Sent in each Security List entry and each Security Definition (FCX-179).
| Tag | Name | Value |
|---|---|---|
| 1205 | NoTickRules | Number of price bands: 1 if one step covers the whole band, else 3. |
| → 1206 | StartTickPriceRange | Band start. |
| → 1207 | EndTickPriceRange | Band end. |
| → 1208 | TickIncrement | Step inside the band. |
| 561 | RoundLot | Quantity increment, per instrument. Can be fractional, for example 0.01, or 1 for whole contracts. |
| 562 | MinTradeVol | Minimum quantity. |
The TickRules group is an FCX extension: CDNA has one tick size. Trading opens at the first Open Time (871=500, 6.1.2); there is no separate first trading time.
The bands set the tick of each price. A band holds its start price; the last band also holds its end. A valid order price is a multiple of the tick of its band and strictly between 0 and 100 (section 5); 0 and 100 are band edges only. Default, no fine step: one band, 0 to 100 step 1.00. Example with a fine step within 5 cents of each edge: 0 to 5 step 0.10, 5 to 95 step 1.00, 95 to 100 step 0.10. The width of the fine region is set per instrument.
6.1.4 Underlying block
The underlying of an instrument is its event, for example a match.
| Tag | Name | Value |
|---|---|---|
| 711 | NoUnderlyings | 1 |
| → 311 | UnderlyingSymbol | FCX instrument code. Order entry does not use it; use 55 (7.1). |
| → 313 | UnderlyingMaturityMonthYear | Scheduled date of the event, yyyyMMdd, UTC. If the event moves, FCX sends a new Security Definition (d). |
| → 457 | NoUnderlyingSecurityAltID | 1 |
| →→ 458 | UnderlyingSecurityAltID | FCX event code: the same value as eventCode in 871=99. All instruments on one event have the same value. |
| →→ 459 | UnderlyingSecurityAltIDSource | 8 (Exchange Symbol). |
| → 887 | NoUnderlyingStips | 1 |
| →→ 888, 889 | UnderlyingStipType, Value | SECTOR, EVENTS. |
6.2 Trading Session Status Request (35=g) and Trading Session Status (35=h)
FCX sends an h after each successful logon, and to every session when the exchange status changes. You do not need to subscribe.
| Msg | Tag | Name | Value |
|---|---|---|---|
| g | 335 | TradSesReqID | Your request id. Y |
| g | 263 | SubscriptionRequestType | Required by FIX. FCX ignores it. |
| h | 335 | TradSesReqID | Echo, when the h answers a g. |
| h | 336 | TradingSessionID | 1 (Day). |
| h | 340 | TradSesStatus | FCX trades 24/7. 2 open: the normal state. 0 unknown: the gateway has lost its link to the exchange and cannot confirm the state. 1 halted: the whole exchange is halted, for example for a deployment; not sent at launch (FCX-196). 3 closed is not used. A halt of one instrument is in Security Status (f), not here. |
6.3 Security List Request (35=x) and Security List (35=y)
| Tag | Name | Req | Value |
|---|---|---|---|
| 320 | SecurityReqID | Y | Your request id. |
| 559 | SecurityListRequestType | Y | 4 all instruments, 2 by Product (460). |
| 460 | Product | C | FIX product class. Required when 559=2. Every FCX instrument is 102 (Event), so 460=102 returns the same list as 559=4. FCX has no list filter by product code (1151): filter the list yourself. |
| 263 | SubscriptionRequestType | Y | 0 snapshot, 1 snapshot and updates: FCX then sends a d for each new instrument that matches the request, and for each change to a listed instrument; 2 unsubscribe. |
| 5001 | IncludeTestInstrument | N | Default N. |
| 10300 | SubscribeSecStatus | N | Default N. If Y, each entry carries 326 and you are subscribed to Security Status (f) for those instruments. |
| 10301 | ComboFilterType | N | 0 no filter, 1 exclude combos, 2 combos only. FCX lists no combos. |
| 10302 | SnapshotSettledStatus | N | Default Y. If Y, FCX sends an f (326=50) for each instrument settled since 00:00 UTC of the previous day provisional. |
FCX answers with one or more y messages:
| Tag | Name | Value |
|---|---|---|
| 320 | SecurityReqID | Echo. |
| 560 | SecurityRequestResult | 0 valid, 2 not found, 3 not authorised, 4 unavailable. |
| 393 | TotNoRelatedSym | Total entries across all chunks. |
| 893 | LastFragment | Y on the last chunk. |
| 146 | NoRelatedSym | Entries in this chunk: at most 20 provisional (FCX-129). |
| → Instrument, Instrument Extension and Underlying blocks, trading rules (6.1), 15 Currency, and 326 when 10300=Y (values as in 6.5). | ||
The list comes from the FCX database, so it is complete at any time, also just after a gateway restart. An instrument with no valid tick setup cannot take orders, so it is not listed until the setup is fixed. If FCX cannot read the database, you get one y with 560=4 and no entries: send the request again.
An x with 263=1 replaces your x subscription with the same 320, also when the new one matches nothing; 263=2 with that 320 ends it. An x with 263=0 leaves your subscriptions as they are. x and c keep separate 320s: a c never ends an x subscription.
6.4 Security Definition Request (35=c) and Security Definition (35=d)
| Tag | Name | Req | Value |
|---|---|---|---|
| 320 | SecurityReqID | Y | Your request id. |
| 321 | SecurityRequestType | C | 0. Required for 263=0 or 1. |
| 55 | Symbol | C | The instrument. Required for 263=0 or 1. |
| 263 | SubscriptionRequestType | Y | 0, 1 or 2. |
The d carries 320, 323 SecurityResponseType (1 accepted, 5 rejected, 6 not found), the blocks and trading rules from 6.1, and 15 Currency. With 263=1, you receive a new d when that instrument changes. A c covers one instrument; to receive new instruments, send x with 263=1 (6.3). A c with 263=0 or 1 and no 55 gets Reject (3) with 373=1; an unknown 55, or an instrument with no valid tick setup, gets a d with 323=6. If FCX cannot read the database, the d has 323=5 and 58 Text.
As for x (6.3): a c with 263=1 replaces your c subscription with the same 320, 263=2 ends it, and 263=0 leaves it. An x never ends a c subscription.
6.5 Security Status Request (35=e) and Security Status (35=f)
| Tag | Name | Req | Value |
|---|---|---|---|
| 324 | SecurityStatusReqID | Y | Your request id. |
| 55 | Symbol | Y | Instrument. |
| 263 | SubscriptionRequestType | Y | 0 snapshot, 1 snapshot and updates, 2 unsubscribe. |
The f:
| Tag | Name | Value |
|---|---|---|
| 324 | SecurityStatusReqID | Echo. |
| 55 | Symbol | |
| 48 | SecurityID | |
| 22 | SecurityIDSource | 8 |
| 325 | UnsolicitedIndicator | N on an f that answers e, or is part of the snapshot after x with 10300=Y or 10302=Y. Y on an f sent later because the status changed (FCX-127). |
| 326 | SecurityTradingStatus | 17 open, 2 halted, 18 closed, 20 unknown symbol, 50 settled. |
| When 326=50, also: | ||
| 870, 871, 872 | InstrAttrib | 870=1, 871=502, settled time in 872. |
| 711 → 311, 457, 458, 459 | Underlying | As in 6.1.4. |
| 883 | UnderlyingEndPrice | Strike-based markets only: the value of the underlying at expiry. Not sent for event markets. |
| 31 | LastPx | Settlement price, from 0.00 to 100.00. Normally 100.00 or 0.00. A manual settlement can be at any price in that range. |
| 58 | Text | EVENT_CANCELED when operations set the price (VWAP or a fair price): the event was cancelled or could not be resolved. |
| 2451 | SettlPriceDeterminationMethod | 9 (Manual) when operations set the price. Not sent on a settlement at 0 or 100, also when operations approved that outcome (FCX-136). |
FCX maps its instrument states to 326: Open to 17; Halted and Suspended to 2; Inactive to 18; Resolved and settled to 50. A resolved instrument reports 50 from its own state, not only through the settled list of 10302. When an instrument settles, FCX ends the subscription.
6.6 Market Data Request (35=V)
| Tag | Name | Req | Value |
|---|---|---|---|
| 262 | MDReqID | Y | Unique for the session. |
| 263 | SubscriptionRequestType | Y | 1 subscribe, 2 unsubscribe. 0 is rejected. |
| 264 | MarketDepth | Y | 0 full book, 1 top of book. |
| 265 | MDUpdateType | C | 1 incremental. Required for 263=1. |
| 266 | AggregatedBook | C | Y by price level, N by order. Required when 269 has 0 or 1. |
| 267 | NoMDEntryTypes | Y | Count. |
| → 269 | MDEntryType | Y | 0 bid, 1 offer, 2 trade. A book request must ask for both 0 and 1. FCX does not send settlement price (6); settlement is in Security Status (35=f, 6.5). Index (3): strike-based markets only, the current value of the underlying; values TBD. |
| 146 | NoRelatedSym | Y | 1. One instrument per request. |
| → 55 | Symbol | Y | Instrument. |
| 10300 | SubscribeSecStatus | N | If Y, FCX also sends the current f and subscribes you to status. |
A new request for the same instrument and entry types replaces the old one. Subscriptions end when the instrument settles.
6.7 Market Data Snapshot (35=W) and Incremental Refresh (35=X)
FCX answers a subscribe with one W that holds the current state, then sends X messages for each change.
| Tag | Name | Value |
|---|---|---|
| 262 | MDReqID | Echo. |
| 55 | Symbol | W only, top level. X has no top-level 55. |
| 268 | NoMDEntries | Count. |
| → 279 | MDUpdateAction | X only: 0 new, 1 change, 2 delete. A trade entry (269=2) is deleted only when FCX voids that trade (FCX-200); that entry carries 269, 278 and 55 only, and 278 is the id the 279=0 carried. |
| → 269 | MDEntryType | 0, 1 or 2. |
| → 55 | Symbol | X only, in each entry. Required. |
| → 278 | MDEntryID | On every entry, as CDNA. Bid and offer: an id that stays the same while the price level (266=Y) or the order (266=N) exists; an X with 279=1 or 2 refers to it. Trade: the trade id. |
| → 270 | MDEntryPx | Price, 2 decimal places. |
| → 271 | MDEntrySize | Contracts. |
| → 272, 273 | MDEntryDate, MDEntryTime | Trade entries: date and time of the trade, UTC. |
| → 2446 | AggressorSide | Trade entries, market maker sessions only. |
Trade entries are anonymous: they name no account or order of either party. When your account is a party to the trade, you also get an Execution Report (8) on order entry (7.5). Its 527 SecondaryExecID is the 278 of the trade entry.
If a book has no change for 30 seconds, FCX sends an empty X (268=0) for it, with the 262 of the subscription. Use it to confirm the subscription is alive.
6.8 Market Data Request Reject (35=Y)
The Y carries 262, 281 and 58. It has no 55, as in standard FIX 5.0 SP2; match the reject to your request by 262.
| 281 | Meaning |
|---|---|
| 0 | Unknown symbol |
| 1 | Duplicate MDReqID |
| 2 | Insufficient bandwidth: too many subscriptions on the session (6.9) |
| 3 | Insufficient permissions |
| 4 | Unsupported SubscriptionRequestType |
| 5 | Unsupported MarketDepth |
| 6 | Unsupported MDUpdateType |
| 7 | Unsupported AggregatedBook |
| 8 | Unsupported MDEntryType |
6.9 Limits and recovery
| Item | Rule |
|---|---|
| Subscriptions | One limit for every session: 10,000 provisional. Past it: Y with 281=2 and the limit in 58. A request that re-uses an active MDReqID: Y with 281=1. |
| Slow consumer | If 1,000 messages are queued for your session, FCX merges the queued book entries (269=0, 1) of each subscription (262) and instrument by 278, and keeps their net effect: new then change is one new with the latest values; change then change is one change; new then delete is dropped; change then delete is one delete. Other sequences are sent as they are. The book you build from the merged X is the same as from every X (FCX-180). Trades (269=2) and status (f) are never merged. If 10,000 messages are queued, or the oldest queued message is more than 30 seconds old, FCX sends Logout (5) with 58=Slow consumer: <n> messages queued and disconnects. All values provisional. |
| Reconnect | Subscriptions end with the session. After each logon, send x, c, e and V again. Every snapshot comes from the FCX database and is complete. |
| Sequence numbers | FCX resets both sequence numbers at each logon (FCX-180), with or without 141=Y in your Logon, and replies with 141=Y. FCX answers a Resend Request (2) with Sequence Reset (4) and 123=Y; it never replays market data. Recover by snapshot. |
| Missed settlements | Settled instruments come back in a snapshot: x with 10302=Y sends an f with 326=50 for each instrument settled in the same window as 10302 (6.3). For one instrument, send e. Your settled positions are on the order entry gateway (7.9). |
7. Order entry gateway
Each message must carry an Account (1) that FCX has assigned to the session. Use a trading key to log on.
End customers. FCX opens one account for each end customer that an FCM or ISV registers (FCX-124). The FCM or ISV sends that account in 1, and its session can use the accounts of all its end customers. A new order or replace needs the end customer's KYC to be approved. A cancel does not. A revoked approval can still trade for up to 300 seconds. A new approval counts within 5 seconds. FCX does not read a Parties block on orders. A market maker sends its own account.
7.1 Instrument block
Identify the instrument by Symbol (55), as in market data (FCX-193). FCX does not read 311, 202, 541 or 20001 on inbound messages.
| Tag | Name | Req | Value |
|---|---|---|---|
| 55 | Symbol | Y | Symbol from the market data gateway. |
| 48 | SecurityID | N | FCX instrument id. If sent, it must name the same instrument as 55, else FCX rejects the message. |
| 22 | SecurityIDSource | C | 8 (Exchange Symbol). Required when 48 is sent. |
Outbound messages carry 55, 48 and 22=8.
7.2 New Order Single (35=D)
| Tag | Name | Req | Value |
|---|---|---|---|
| 11 | ClOrdID | Y | Your order id. Unique for the session in a UTC day. A repeat gets 103=6 (FCX-76). Only the matching engine on the cluster order path checks this; the legacy path (the default today) does not refuse a repeat. |
| 1 | Account | Y | Account assigned to the session. |
| Instrument block (7.1) | |||
| 54 | Side | Y | 1 Buy, 2 Sell. |
| 38 | OrderQty | Y | Contracts. A multiple of 561 RoundLot and at least 562 MinTradeVol; it can be fractional. Else: 103=13. |
| 40 | OrdType | Y | 2 Limit. |
| 44 | Price | Y | Cents, see section 5. |
| 59 | TimeInForce | Y | 1 GTC, 3 IOC, 4 FOK. |
| 60 | TransactTime | Y | Required by FIX 5.0 SP2. |
7.3 Order Cancel/Replace Request (35=G)
Changes price or quantity of a resting order. Tags as for D, plus 41 OrigClOrdID (Y), the ClOrdID of the order to replace. The replacement gets a new OrderID (37). Track orders by ClOrdID. If FCX refuses a G with an Order Cancel Reject (35=9), the original order is unchanged and keeps working, including when the refusal is a limit (102=99). FCX replaces only an order of the account in 1, as for F (7.4). 37 OrderID (N): as for F, it must be the OrderID of the order that 41 names, else 102=1.
7.4 Order Cancel Request (35=F)
| Tag | Name | Req | Value |
|---|---|---|---|
| 11 | ClOrdID | Y | Id of this request. |
| 41 | OrigClOrdID | Y | ClOrdID of the order to cancel. |
| 37 | OrderID | N | FCX OrderID. If present, it must be the OrderID of the order that 41 names in the account in 1, or NONE as the pending report gave it. Else: 102=1 (FCX-185). |
| 1 | Account | Y | Account. |
| Instrument block (7.1) | |||
| 54 | Side | Y | Side of the order. |
| 38 | OrderQty | N | Ignored. F cancels all the remaining quantity; to reduce an order, send G (FCX-185). |
| 60 | TransactTime | Y | Required by FIX 5.0 SP2. |
FCX cancels only an order of the account in 1. If 37 or 41 names an order of another account, or no order, FCX sends 35=9 with 102=1 and cancels nothing. The reply is the same in both cases, so it does not show whether the order exists.
An F or G that names an order FCX has received but not yet accepted waits until FCX accepts it and then runs as sent. If FCX refuses the order instead, the F or G gets 35=9 with 102=1. If FCX never learns the order's outcome, it gets 35=9 with 102=99 and 58=Order pending; send again: send it again after the New. A 37 of NONE on the F or G, copied from the pending report, is read as absent: 41 names the order.
7.5 Execution Report (35=8)
| Tag | Name | Value |
|---|---|---|
| 37 | OrderID | FCX order id. FCX assigns it when it accepts the order, so a Pending New or Pending Replace report (150=A, 150=E) carries NONE and the first report with the id is the New (150=0) or Replaced (150=5). NONE also on a gateway reject. |
| 11 | ClOrdID | Your ClOrdID. On a cancel or replace, the ClOrdID of the F or G. |
| 41 | OrigClOrdID | On a cancel or replace: the ClOrdID of the order it cancels or replaces. |
| 17 | ExecID | Unique. |
| 527 | SecondaryExecID | On fills: FCX trade id. |
| 150, 39 | ExecType, OrdStatus | See the table below. |
| 103 | OrdRejReason | When 39=8 on a rejected order or a status reply for an unknown order. See 7.8. |
| 1 | Account | |
| Instrument block (7.1) | ||
| 54, 38, 40, 44, 59 | Order fields | As on the order. |
| 32, 31 | LastQty, LastPx | Fill quantity and price. |
| 14, 151, 6 | CumQty, LeavesQty, AvgPx | Totals. AvgPx 0.00 if no fill. |
| 60 | TransactTime | Event time, UTC. |
| 58 | Text | Reason, on rejects and system cancels. |
| Event | 150 | 39 |
|---|---|---|
| Received, not yet accepted (a D, G or F reached FCX) | A Pending New, E Pending Replace, 6 Pending Cancel | A, E, 6 |
| Accepted | 0 New | 0 New |
| Replaced | 5 Replaced | 0, or 1 if filled in part |
| Partial fill | F Trade | 1 Partially filled |
| Complete fill | F Trade | 2 Filled |
| Cancelled by you or by FCX (IOC or FOK not filled, self-trade prevention, instrument halted, expired or removed, account restricted, a price limit change that leaves the order outside the new limits, a price multiplier change, an instrument asset change, free cash below zero after a fee, a charge or a position move) | 4 Canceled | 4 Canceled |
| Rejected | 8 Rejected | 8 Rejected |
| Fill voided by FCX | H Trade Cancel | See below |
Voided trade. FCX can void a single trade, manually, for compliance (FCX-200). Each side gets an 8 with 150=H, 19 ExecRefID = the 17 of the original fill, 527 = the FCX trade id, and the reason in 58. On this report 14 and 6 leave out the voided fill. The voided quantity does not go back into the book: it is in 84 CxlQty, which holds everything that will not trade, voided and cancelled alike, so 38 = 14 + 151 + 84 on it. An order that filled 4, had its residual cancelled and then had that fill voided reads 14=0, 151=0, 84=10. 39 is then 1 if 14 > 0 and 151 > 0, 0 if 14 = 0 and 151 > 0, and 4 if 151 = 0. An order that is still working keeps trading, and its next Execution Report counts the voided fill again, because the matcher's running total is not corrected yet (FCX-100). An Order Status Request (7.10) reads the voided fill out, and is the reliable answer until that lands. FCX also sends an unsolicited AP (7.9) and a market data trade delete (6.7). The three are separate reports, each carrying the whole state it reports, and FCX promises no order between them. A whole market is never voided; see section 1.
7.6 Order Cancel Reject (35=9)
Tags 37, 11, 41, 1, the instrument block (7.1), 39, 434 (1 for F, 2 for G), 102 and 58. If 55 names no instrument, the block is only the 55 of the request, and 102 is 1: such a request names no order either, so the reply is the one an unknown order gets, with 58=Unknown symbol (FCX-282). 39 is the current status of the original order, for example A (Pending New), 0, 1, 2 or 4. With 102=1, 39 is 8, so an order of another account gives nothing away (FCX-185). With 102=0 on the cluster order path, 39 is the last status FCX holds for the order, final or not: A, 0 or 1 when the report that ended the order is still to come. On the legacy order path the reject can arrive before the order's reports, so 39 is the order's final status, or 2 when none is known yet; this rule goes with the legacy path (FCX-77). A 35=F or 35=G whose 55 does not match the order can be refused as too late (102=0) while the order is still live: FCX does not compare 55 with the order. 102 values are in 7.8. After any 35=9, the original order is unchanged. After FCX reloads an order from its stored row, 39 comes from that row, and an order reduced without a fill reads 1.
7.7 Business Message Reject (35=j)
Sent for a price with more than 2 decimal places: 45, 372, 379 (ClOrdID), 380=18, 58. Sent for an unsupported MsgType (section 8): 45, 372, 379 when the request has an id, 380=3, 58.
7.8 Reject reasons
OrdRejReason (103) is on an Execution Report (7.5); CxlRejReason (102) is on an Order Cancel Reject (7.6). Tag 102 has fewer values than 103, so a cause with no 102 of its own is 99, with the detail in 58.
| 102 | Cause |
|---|---|
| 0 | Too late to cancel or replace. This does not guarantee that the original order is done; see 7.6. |
| 1 | Unknown order: 37 or 41 names no order, or an order of another account (FCX-185). Also a 55 that names no instrument, which names no order either, with 58 Unknown symbol (FCX-282). |
| 18 | Price off tick on a replace. More than 2 decimal places gets 35=j instead (7.7). |
| 99 | Other: missing or invalid field, halted instrument, rate limit, a request past the in-flight limit (7.11). See 58. |
| 103 | Cause |
|---|---|
| 0 | Account restricted or deactivated (FCX-137). A liquidation-only account can send only orders that reduce its obligation. A frozen account can send no order. Also an end-customer account whose KYC is not approved, with 58 Sub-account KYC is not approved. |
| 1 | Unknown symbol, or 48 does not match 55. |
| 2 | Instrument not open for trading yet. |
| 3 | Credit check failed. |
| 4 | Instrument past last trade date. |
| 5 | Unknown order: Order Status Request (35=H) for an order that does not exist or is not of the account in 1 (7.10). |
| 6 | Duplicate order: 11 already used (7.2). Sent on the cluster order path only; the legacy path does not refuse a repeat. |
| 13 | Quantity not a multiple of the round lot, or below 562 MinTradeVol. |
| 16 | Price outside limits. |
| 18 | Price off tick. More than 2 decimal places gets 35=j instead (7.7). |
| 99 | Other: missing or invalid field, halted instrument, rate limit. Also a missing account, an unknown account, or an account not assigned to the session, with 58 missing accountNumber, invalid accountNumber or unauthorized account. An order or replace that arrives while the gateway stops, with 58 Gateway is shutting down; one still inside the gateway when its connection dropped, with 58 Connection closed before the order was sent (7.11). An F or G whose order has no outcome yet, with 58 Order pending; send again (7.4). An order whose account's resting orders on the instrument take cash from another account, with 58 Resting orders take cash from another account. See 58. |
7.9 Positions (35=AN, AO, AP)
Request For Positions (AN): 710 PosReqID, 724 PosReqType (0 positions), 1 Account, 715 ClearingBusinessDate (FCX ignores the value) and 60 TransactTime, required; instrument block optional. With no 55, 48, 311, 202 or 541, FCX reports every instrument; with 55, only that instrument. An unknown 55, a 48 that does not match 55, or a 48, 311, 202 or 541 without 55 gets 728=99 (FCX-193). 1 takes the place of the Parties block. A session sees only its own positions: a market maker its own account, an FCM or ISV the accounts of its end customers (section 7). Positions of other participants are only on the drop copy gateway (FCX-208). FCX answers with AO (710, 721 PosMaintRptID, 727 TotalNumPosReports, 729 PosReqStatus 0 completed or 2 rejected, 728: 0 valid, 2 no positions, 3 not authorized (1 is unknown or not an account of the session; 58 unauthorized account in both cases, so the reply does not show whether the account exists), 99 error; 55, 48 and 22 as the AN sent them), then one AP for each open trade of the account (a position entry), not one per instrument.
On every AP, unsolicited or an answer to an AN, 715 ClearingBusinessDate is the New York date of the posting time, rolled to the next day at 18:00 New York time (America/New_York, EDT in summer and EST in winter).
When an instrument settles, FCX sends an unsolicited AP for each account with a position in it (FCX-195): 325=Y, 721, 715 ClearingBusinessDate, 1, the instrument block, 730 SettlPrice (the same as 31 on 35=f), 731=1 (Final), 702/703 DLV with 704/705 the settled quantity, and 753/707/708 SETL with the cash paid, in USD. One AP per account, not per lot or per side: 704 or 705 is the net quantity just before settlement, and 708 is the cash credited for every settled lot, gross of any settlement fee (a fee is on its own BA, 7.12). The Parties block (453) names the clearing org, the exchange and the account, as on the answer to an AN. FCX also sends an unsolicited AP to each side of a voided trade (FCX-200): the same shape without 730, 731 and the 753 block, because a void pays nothing, and 702/703 TOT with 704/705 the net position the void leaves behind. A void whose position clearing did not state sends the Trade Cancel alone, rather than an AP reading flat. It sends one to each side when operations transfer a position between accounts (FCX-137). A transfer is not a trade: it sends no Execution Report and no market data trade. FCX does not send an AP after each fill; each fill is in an Execution Report (35=8, 7.5). Cash balances are not positions: see 7.12.
7.10 Order Status Request (35=H) and Order Mass Status Request (35=AF)
Use these to rebuild the state of your orders when resend cannot (FCX-198). FCX answers only for orders of the account in 1. 14 and 6 leave out a voided fill, so an order that filled and then had a fill voided reads 39=4 with 151=0, the same as its Trade Cancel (7.5). Only a void does that. An order you reduced and then filled reads 39=2 with 38 the quantity after the reduction, as on its Execution Reports, so 14 equals 38 there.
| Message | Tags in | Reply |
|---|---|---|
| H | 11 (the ClOrdID of the order), 37 (optional), 1, the instrument block (7.1), 54, 790 OrdStatusReqID (optional). | One 8 with 150=I and the current 39, 14, 151, 6, and 790 if sent. An unknown order, or an order of another account: 8 with 150=I, 39=8, 103=5; the same reply in both cases. |
| AF | 584 MassStatusReqID, 585 (7 all orders, 1 one instrument, named by the instrument block of 7.1), 1. 8 (orders of a party) is accepted for CDNA clients and treated as 7: FCX does not read a Parties group, and 1 selects the account (FCX-198). | One 8 with 150=I and 584 for each open order of the account, 912=Y on the last. No open orders: one 8 with 37=NONE, 11=NONE, 150=I, 39=8, 14=0, 151=0, 912=Y, 58=No open orders, and 55 and 54 as [N/A] and 1, or the 55 of the request. No 103. |
7.11 Limits and recovery
| Item | Rule |
|---|---|
| Orders in flight | Per account, set by FCX for each client. D and G count. Past it: D gets 8 with 103=99; G gets 9 with 102=99. |
| Orders per instrument | Per account and instrument per second, set by FCX for each client. D and G count. Past it: as for orders in flight. Cancels are not limited. |
| Cancel on disconnect | When the order entry connection drops, logs out, or the gateway stops, FCX cancels the resting orders that this session placed, with 58=Cancelled on disconnect. Orders placed by another session on the same account, or over REST, stay. The reports for the cancelled orders queue in the message store while the session is logged out, and arrive by resend after the next Logon. Each session has its own default in its configuration, off unless set on. Logon tags 6867 (scope, Y) and 35002 (type: 0 disable, 3 enable), sent together, override it for one connection. Known difference from CDNA: a Logon with any other value of 6867 or 35002 gets no reply; CDNA answers with a Logout. |
| Sequence numbers | Kept across logons and gateway restarts (FCX-187). Send 141=Y on Logon to reset both sides to 1. |
| Resend | Missed Execution Reports (8) and Position Reports (AP), including settlement, are recovered by Resend Request (2). FCX resends with 43=Y and 122 (3.1). FCX keeps the message store across gateway restarts, so resend also covers messages sent before a restart (FCX-187). How long messages stay in the store: TBD (FCX-187). If resend cannot fill a gap, send AF for open orders (7.10) and AN for positions (7.9). |
7.12 Cash balances (35=BB, BG, BA)
Collateral Inquiry (BB): 909 CollInquiryID and 1 Account, required; 263 SubscriptionRequestType absent or 0. A session asks only for the accounts it holds (section 7). The account that holds the collateral reports: a market maker its own account; an FCM or ISV its own account, which holds the collateral for all its end customers (FCX-137). An end customer has no balance of its own, so a BB that names an end-customer account is refused, and 58 names the FCM account to ask for instead. Until FCX-99 books a fill's cash on the collateral account, that FCM figure is short of the margin and fees of its end customers. FCX answers with Collateral Inquiry Ack (BG): 909, 945 CollInquiryStatus 0 accepted or 4 rejected, 946 CollInquiryResult (0 successful; 8 a subscription was asked for; 9 not an account of the session, or an end-customer account; 99 unknown account, 1 missing, or a read error), 911 TotNumReports 1 when accepted, 1, and 58 on a refusal. A refused BB gets no BA.
One Collateral Report (BA) follows an accepted BB: 908 CollRptID, 909, 60 TransactTime, 910=3, 1, 15 Currency, 715 ClearingBusinessDate, and three amounts in that currency with two decimals. The ledger holds USD only (section 5), so 15 is USD; an unsolicited BA names the asset the posting moved. 900 TotalNetValue is everything the account owns: cash, today's unsettled movements and the collateral held. 901 CashOutstanding is the part held as collateral against open positions. 899 MarginExcess is the part free for new orders and withdrawals, so 900 = 901 + 899. 899 and 901 are each rounded half-up to two decimals and 900 is the sum of the two rounded amounts, so the identity holds on the wire. Snapshots only: a client that wants a fresh balance sends another BB.
FCX also sends an unsolicited BA, 325=Y and no 909, when a balance changes outside order flow: a deposit, a withdrawal, a charge, a trading or admin fee, and a reconciliation. One report per account per posting, whatever sub-accounts it moved. A fill sends no BA: the fill is on the Execution Report (7.5), and the margin it posts is not reported on its own. An offline client gets the unsolicited reports by resend (7.11). Settlement (FCX-195) and a trade void (FCX-200) do not send one yet, although both are built: clearing writes the payout and the refund straight to the ledger. A position transfer (FCX-137) will send one when it lands.
8. Not supported
| Gateway | MsgType |
|---|---|
| Market data | Any application MsgType not in section 6, including quotes, RFQ and combos. The session messages in section 3 are supported. Reply: j with 380=3. |
| Order entry | Any application MsgType not in section 7, for example q, E, s, AB, R, AH, AE, AD. The session messages in section 3 are supported. Reply: j with 380=3. |
Order types not supported: market, stop, pegged, Day, GTD, iceberg, minimum quantity.
9. Divergence from CDNA
For clients that already connect to CDNA. Market data follows CDNA 4.3 except for these points. Where CDNA gives a tag a meaning other than standard FIX 5.0 SP2, FCX uses the standard meaning. Order entry is FCX's own interface.
| Item | FCX | CDNA |
|---|---|---|
| Symbol scheme | Product code, then the parts the product defines, for example ITF_TEN_TW_261025_D0004567_P01234. Product code in 1151. | Dot path, for example NX.F.OPT.GOLD.D.1.1. |
| Outcome label | Tag 60013 AlphaStrike. Not in 871=99. | ALPHA_STRIKE in 871=99, required. |
| Symbol re-use | Never | After the instrument has expired and settled |
| Instruments per market | One per proposition, the "Yes". Buy No at P = sell Yes at 100 − P. A market with a draw has one instrument per outcome. | One per outcome, also for a two-way market. |
| 871=99 codes | Generic classification and provider codes, for any kind of event. Code by code in 9.1. | Sports codes. |
eventCode in 871=99 | One per event, the same value as 458. | One per contract, the same value as PREDICT_OUTCOME_ID. |
| Two-way market metadata (ML, 6.1.2) | One instrument, the Yes: PREDICT_OUTCOME_TYPE=Home. The No side is named by AWAY_PARTICIPANT and PROVIDER_AWAY_ID, and has no PREDICT_OUTCOME_ID. | One instrument per outcome, each with its own PREDICT_OUTCOME_ID, PREDICT_OUTCOME_TYPE and PARTICIPANT. |
Schema VERSION | 1.0, the FCX code list. | 3.0 |
FEED_TYPE | Required, always SINGLES. | Optional, SINGLES or COMBOS. |
| Tick rules | TickRules group (1205): one band, or three with a fine step near the edges. | One tick size. |
| Underlying alternative id | FCX event code in 458, 459=8 (Exchange Symbol). | Feeder symbol of the underlying price in 458, 459=5 (RIC). |
| Tick size and tick value | Standard FIX: tick size in 969, tick value in 1146. 996 is not sent. | Tick size in 996, tick value in 969. |
| Quantity | Contracts, a multiple of 561 RoundLot; can be fractional. | Integers only. |
| Cancel on disconnect | As CDNA: per connection, Logon tags 6867 and 35002 together. A default for each session, off unless set on (FCX-184). | Logon tags 6867 and 35002. |
| Symbol-part attributes (871 = 511, 512, 521, 522, 523, 531, 532) | Sent only for strike-based markets. Not sent for event markets. | Required on every instrument. |
| Market data entry types | 0, 1, 2, and 3 (index value) for strike-based markets. 6 is not sent. | 0, 1, 2 only (4.3 erratum). |
| Subscription limit reject | 281=2 (Insufficient bandwidth), standard FIX. | No code for it; 2 is not in the CDNA list. |
| Trade time | 272 and 273 on each trade entry. | Not sent. |
| Symbol in Incremental Refresh (X) | 55 in each entry, required, as in standard FIX. No top-level 55. | Top-level 55; the 55 in each entry is deprecated. |
| Market Data Request Reject (Y) | No 55, as in standard FIX. | Sends 55. |
| Void and manual settlement | A market is never voided. 2451=9 marks a manual settlement at a fair price, with 58=EVENT_CANCELED. A void applies to one trade, on order entry (7.5). | 2451=9 on a VOID settlement. |
| UnderlyingEndPrice (883) | Strike-based markets only. | On a settled instrument. |
| Ties | None. Each outcome of a 3-way market is its own instrument. 58 is never EVENT_TIE. | 58=EVENT_TIE on 35=f. |
| Combos, RFQ | Not offered. FEED_TYPE is always SINGLES. | Offered. |
| FCM end customer on orders | The end customer's own FCX account in 1 (section 7). No Parties block. | Parties block: 452=29 (Intermediary, the FCM) and 452=3 (Client ID). |
| Unsolicited Collateral Report | FCX adds 325 UnsolicitedIndicator to BA (7.12), as standard FIX has it on AP. Not in FIX 5.0 SP2's BA. | No balance messages. |
| Order entry signature label | system_labelFCX. Change this one string in a CDNA client. | system_labelONEEX. |
9.1 Event metadata codes (871=99)
For clients that parse CDNA event metadata V3.0. Each CDNA code and the FCX code that replaces it. A code not in this table has the same name and meaning in both. The FCX codes are in 6.1.2.
| CDNA | FCX | Change for a CDNA client |
|---|---|---|
| SPORTS_GROUPING | TOPIC | FCX TOPIC is the sport only (TENNIS, BASKETBALL). CDNA SPORTS_GROUPING can be a sport or a league (TENNIS, NBA). Where CDNA sends a league, read FCX SERIES. |
| LEAGUE | SERIES | Always sent. CDNA sends LEAGUE only for some sports. |
| None | SECTION | New. The tournament, round or week inside the series. |
| ALPHA_STRIKE | Tag 60013 | Read the outcome label from the instrument block. FCX does not send ALPHA_STRIKE. |
| None | ID_PROVIDER | New. Names the data provider of all PROVIDER_* ids. |
| EXTERNAL_GAME_ID, EXTERNAL_FIGHT_ID | PROVIDER_EVENT_ID | One code for any kind of event. |
| EXTERNAL_TOURNAMENT_ID | PROVIDER_TOURNAMENT_ID | Rename. |
| EXTERNAL_HOME_ID, EXTERNAL_AWAY_ID | PROVIDER_HOME_ID, PROVIDER_AWAY_ID | Rename. |
| TEAM_ID, PLAYER_ID | PROVIDER_PARTICIPANT_ID | One code for a team or a player. |
| EXTERNAL_MARKET_ID, EXTERNAL_OUTCOME_ID | PREDICT_MARKET_ID, PREDICT_OUTCOME_ID | FCX sends its own market and outcome ids only. |
| DOUBLE_HEADER, GAME_NUMBER, PREDICT_VALUE | Not sent | No FCX product uses them yet. |
Appendix: open points and build status internal, remove before sending to clients
Decisions still open
| Point | Ticket |
|---|---|
| Confirm PrivateLink as the only client connectivity at launch, and the final hostnames. Internal dev access is through Twingate. | FCX-125, FCX-194 |
| Values for strike-based markets: 871 = 511 to 532, 202, 883, and 269=3 (crypto and finance, after launch). | FCX-126 |
| Provisional values to confirm: port 10004; 10,000 subscriptions; conflation at 1,000, disconnect at 10,000 or 30 s; 20 entries per y. | FCX-125, FCX-180, FCX-129 |
| Cancel on disconnect scope per connection (provisional). | FCX-184 |
| Licence to redistribute provider ids (assumed granted). | FCX-138 |
871=99 for two-way markets (6.1.2): the No side has no FCX outcome id; clients that need one must derive it. Agree the TOPIC, SERIES and SECTION values with FMX catalog. The adapter worker reads SPORTS_GROUPING and LEAGUE today and must read the new codes. ITF_TEN_ML needs a product filing and symbol template in 6.1. An explicit No label if clients need one; today it is derived from AWAY_PARTICIPANT. | |
| How long the order entry message store keeps messages for resend (7.11). | FCX-187 |
| 1409 value for a Logon with a bad 1137 or no 95 (4.4). | FCX-107 |
| Settled-instrument snapshot window for 10302, 00:00 UTC of the previous day (6.3). | FCX-127 |
| Duplicate ClOrdID window: the session, one UTC day (7.2). Decided; only the matching engine on the cluster order path checks it, and the legacy path (the default today) does not refuse a repeat. | FCX-76 |
| 103 value and 58 for a refusal by a position limit, and by an underfunded shared collateral account (7.8). | FCX-101, FCX-99 |
| Header rules (3.1): the 120 s SendingTime window is the QuickFIX/J default, not a decision; no third-party routing (115, 128). | FCX-183 |
| 901 on BA is the collateral held against positions; the cash held by working orders is not on FIX. A trading fee draws an unsolicited BA, so a fee-bearing fill is followed by one (7.12). | FCX-217 |
Not built yet: the spec states the target
Tickets marked "blocks" must be done before FCX-181 publishes this document.
| Gap | Ticket |
|---|---|
| Message store on the container disk: a restart loses resend history (7.11). Blocks. | FCX-187 |
| Order status H and AF (7.10). Blocks. | FCX-198 |
An F or G whose 55 does not match the order can be refused as too late (102=0) while the order is live (7.6). 39 is then the order's live status on the cluster order path, and 2 on the legacy order path until FCX-77. | none yet |
| An FCM's cash balance (7.12) omits the margin and fees of its end customers: clearing books a fill's cash on the account that sent the order, not on the collateral account, and an account the external API created has no banking rows at all. The end-customer account is refused by design, so this figure is the only one a client sees. FCX-99's own work item is "make clearing book a fill's cash on the collateral account". | FCX-99 |
Account restriction tiers (7.5, 7.8): 103=0 on new orders, and cancel of resting orders, for liquidation-only and frozen accounts. | FCX-137 |
| A void on the cluster order path (7.5): the core has no void command, so only the legacy order path voids a trade. The market data delete needs no core change. | FCX-200 |
| A void does not correct the matcher's running CumQty (7.5). The Trade Cancel and an Order Status answer read the voided fill out, but the order stays in the book with its old total, so its next Execution Report counts that fill again and 38 = 14 + 151 + 84 fails on it. Only an order still working is affected. | FCX-100 |
| Client connectivity over PrivateLink (section 3). | FCX-194 |
Trading Session Status (6.2) is always 340=2. The unsolicited 340=0 on a lost link to the exchange, and 340=2 when it is back, are not sent yet. | FCX-247 |
| A repeated ClOrdID is not refused on the legacy path (7.2); goes away with FCX-77. | FCX-77 |
| Clearing notices (positions, balances) reach the order entry gateway over a message broker, sent after the database commit. A crash or a broker failure between the two loses the notice while the ledger keeps the effect. A lost settlement AP (7.9) has no recovery: AN shows no open position once the instrument settled. Market data (W, X, f) does not use the broker on the cluster order path: the gateway derives it from the exchange's event stream. | FCX-247 |
| Unsolicited BA when an instrument settles, a trade is voided or a position is transferred (7.12). The request path and the deposit, withdrawal, fee and reconciliation reports are built. | FCX-195, FCX-200, FCX-137 |
Sources: epic FCX-116 and tickets FCX-125 to FCX-131, FCX-179 to FCX-182, FCX-192; FCX-77; FCX-99; FCX-101; FCX-107; FCX-110; FCX-124; FCX-132 (merged, #92); FCX-133; FCX-136; FCX-137; FCX-184 to FCX-187; FCX-193 to FCX-200; FCX-206; FCX-217. FCX-186 is fixed on main (FCX-113, #96).