NAV Navbar

FIX Market Data

Overview

Trading applications need information about the state of the market in order to effectively execute their strategies on an exchange. Seed CX provides a FIX Market Data Gateway which delivers market data to participants that have subscribed to the service. It is a so-called Level 3 or market-by-order system, where a complete view of the market (down to the level of anonymized individual orders) is made available for every instrument traded at Seed CX.

Supported Message Types

Administrative Messages

The following Administrative message types are supported under MsgType (35):

Application Messages

The following Applications message types are supported under MsgType (35):

Inbound Messages (Client → Seed CX)

Outbound Messages (Seed CX → Client)

Sequence Diagrams

Connectivity and Logon

The API client must establish a FIX session by sending a Logon (35=A) message. Seed CX will act as an acceptor for all FIX sessions.

For all inbound messages, SenderCompID (49) is required. For all Application messages, both SenderCompID (49) and SenderSubID (50) fields are required. The values of these fields are bilaterally agreed between Seed CX and the client during the onboarding process.

Seed CX FIX Logon Message Flow

Initial Market Data Request

After performing the Logon process, the participant is required to send a MarketDataRequest (35=V) with a list of instruments' symbols to request a market data subscription for those instruments. If the request is malformed, or if any of the symbols specified is invalid, the whole request will be rejected and no subscription will be established. The Seed CX FIX Market Data Gateway will transmit a Reject (35=3) or MarketDataRequestReject (35=Y) with error codes describing the reject reason. If the MarketDataRequest (35=V) is valid, the participant will be subscribed to the market data flow for the instruments specified in the request. As a subscription confirmation, the Seed CX FIX Market Data Gateway will immediately transmit a SecurityStatus (35=f) message followed by a MarketDataSnaphotFullRefresh (35=W) message for each instrument specified in the request. Participant's client applications should use the snapshot as the initial state of instrument's order book.

Seed CX FIX Full Snapshot Flow

Ongoing and Incremental Updates

Any subsequent market data changes will be communicated using MarketDataIncrementalRefresh (35=X) messages, which the client applications need to apply to the instrument's order book. However, it is important to note that it is possible for the SecurityStatus (35=f) and MarketDataSnapshotFullRefresh (35=W) messages to be transmitted at any time (for example when an instrument transitions from Open to Close) and they should be appropriately processed by participant's client applications. Any new SecurityStatus (35=f) and MarketDataSnapshotFullRefresh (35=W) messages is the current state of the market.

Seed CX FIX MD Ongoing Updates Flow

Header and Trailer

Standard Header

Tag Name Required Data Type Description
8 BeginString Y String Must be FIX.4.4 for FIX 4.4 protocol version.
Must be the first field in the message.
9 BodyLength Y Length Must be the second field in the message.
35 MsgType Y String Message type.
Must be the third field in the message.
49 SenderCompID Y String Company identifier as allocated by Seed CX.
56 TargetCompID Y String Receiver FIX session identifier.
Always SEEDCX.
34 MsgSeqNum Y SeqNum Message sequence number.
50 SenderSubID N String The trading account ID which represents the unique combination of user and CTI code, produced and can be found in SeedPortal.
The value must be appropriately assigned to the SenderCompID (49).
142 SenderLocationID N String ISO identifier of message originator's location.
52 SendingTime Y UTCTimestamp Time of message transmission.
369 LastMsgSeqNumProcessed N SeqNum The last MsgSeqNum (34) value received and processed.
Used to detect a backlog.

Standard Trailer

Tag Name Required Data Type Description
10 Checksum Y String Checksum of message and end of message delimiter.

Administrative Messages

The following are the message layouts for each FIX Market Data message supported by Seed CX:

Logon (35=A)

Tag Field Name Data Type Req’d Description
Component <StandardHeader>
98 EncryptMethod Int Y Method of encryption.
Not validated by Seed CX.
Supported values:
0 = None
108 HeartBtInt Int Y Heartbeat interval as assigned by the client.
Note: Same value used by both sides.
141 ResetSeqNumFlag Char N Indicates that both sides of the FIX session should reset sequence numbers.
Supported values:
N = No
Y = Yes, reset sequence numbers

Note: For FIX Market Data it is recommended to always set this field to N.

Component <StandardTrailer>

Client to Seed CX

8=FIX.4.4|9=77|35=A|34=1|49=LPZD0A20X5|52=20181222-00:58:31.652|56=SEEDCX|98=0|108=30|141=Y|10=135|

The Logon (35=A) message is used by a market participant to establish a FIX session with Seed CX. The Logon (35=A) message must be the first message sent by the client requesting to initiate a FIX session. It must be received within 5 seconds from establishing the connection, otherwise the connection will be closed.

Seed CX to Client

8=FIX.4.4|9=0099|35=A|49=SEEDCX|56=LPZD0A20X5|34=1|142=US,IL|52=20181222-00:58:31.667810958|369=1|98=0|108=30|141=Y|10=127|

A successful logon will result in a Logon (35=A) acknowledgement sent by Seed CX.

Heartbeat (35=0)

The Heartbeat (35=0) message is used by both the initiator and Seed CX during periods of inactivity. The duration of the inactive period is determined by the field HeartBtInt (108) in Logon (35=A) message.

Tag Field Name Data Type Req’d Description
Component <StandardHeader>
112 TestReqID String N Conditionally required if the heartbeat message is generated in response to a TestRequest (35=1) message.
Component <StandardTrailer>

TestRequest (35=1)

Heartbeat (35=0) and TestRequest (35=1) messages are used by Seed CX to monitor the live status of a FIX Session.

In the event of no response within the agreed upon heartbeat interval, HeartBtInt (108), in Logon (35=A) message, a TestRequest (35=1) message will be sent. The client must respond immediately to the TestRequest (35=1) message.

If Seed CX does not receive a response to the TestRequest (35=1) message within the heartbeat interval, it will terminate the FIX session to the counterparty.

Tag Field Name Data Type Req’d Description
Component <StandardHeader>
112 TestReqID String Y TestRequest (35=1) identifier.
Component <StandardTrailer>

ResendRequest (35=2)

ResendRequest (35=2) message is used as per FIX specification. It is not recommended to request resends of large ranges of market data messages; requesting a full snapshot may be more appropriate.

Tag Field Name Data Type Req’d Description
Component <StandardHeader>
7 BeginSeqNo SeqNum Y Message sequence number of first message in range to be resent. Valid sequence number for session.
16 EndSeqNo SeqNum Y Message sequence number of last message in range to be resent. Specify 0 for all the messages subsequent to a particular message.
Component <StandardTrailer>

Reject (35=3)

8=FIX.4.4|9=173|35=3|49=SEEDCX|56=YIZUG0TPF6|34=5|50=SCXM|142=US,IL|57=FKIDMMZZ7YAV|52=20181001-15:14:52.766813855|369=5|45=5|371=55|373=1|58=The message is missing required fields.|1028=N|10=015|

The Reject (35=3) message will be sent by Seed CX when a message is received but cannot be properly processed due to session-level rule violation.

Tag Field Name Data Type Req’d Description
Component <StandardHeader>
45 RefSeqNum SeqNum Y MsgSeqNum (34) of the rejected message.
371 RefTagID String N The tag number of the FIX field being referenced.
372 RefMsgType String N The MsgType (35) of the FIX message being referenced.
373 SessionRejectReason Int N Code to identify reason for a session-level Reject (35=3) message.
Supported values:
1 = Required tag missing
5 = Value is incorrect (out of range) for this tag
9 = CompID problem
58 Text String N Provides the reason the message was rejected.
Component <StandardTrailer>

SequenceReset (35=4)

SequenceReset (35=4) message can be used for both Gap Fill or to reset sequence numbers.

Tag Field Name Data Type Req’d Description
Component <StandardHeader>
36 NewSeqNo SeqNum Y New sequence number. The number cannot be lower than the expected sequence number of either side of the connection.
123 GapFillFlag Boolean N Indicates the sequence reset message is replacing messages which will not be resent.
Supported values:
Y = Gap Fill message, MsgSeqNum (34) is valid
N = Sequence Reset, ignore MsgSeqNum (34)
Component <StandardTrailer>

Logout (35=5)

Logout (35=5) message initiates or confirms the termination of a FIX session.

Tag Field Name Data Type Req’d Description
Component <StandardHeader>
58 Text String N Reason for logout.
789 NextExpectedMsgSeqNum SeqNum Y Next expected MsgSeqNum (34) value to be received.
Component <StandardTrailer>

Application Messages

MarketDataRequest (35=V)

8=FIX.4.4|9=172|35=V|34=2|49=LPZD0A20X5|52=20181222-01:07:05.748|56=SEEDCX|50=NTIUJDS6DGA6|146=1|55=COSP:BTC/USD|262=7MUbdowJTF2mdf0dsrW6HA|263=1|264=3|267=5|269=0|269=1|269=2|269=4|269=5|10=079|
Tag Name Required Data Type Description
Component <StandardHeader>
262 MDReqID Y String
263 SubscriptionRequestType Y Char Supported values:
0 Snapshot
1 Snapshot + Updates
2 Unsubscribe
264 MarketDepth Y Integer Only a value of 0 (full market depth) is supported.
267 NoMDEntryTypes Y NumInGroup Number of entry types requested.
→ 269 MDEntryType Y Char Supported values:
0 Bid
1 Offer
2 Trade
4 Opening Price
5 Closing Price
NOTE: The current implementation will transmit all market data entries, regardless of the types specified in the request.
146 NoRelatedSym Y NumInGroup Number of symbols requested.
→ 55 Symbol Y String
Component <StandardTrailer>

SecurityStatus (35=f)

8=FIX.4.4|9=0135|35=f|49=SEEDCX|56=LPZD0A20X5|34=11|142=US,IL|52=20181222-01:02:00.031206898|369=2|55=COSP:BTC/USD|326=4|60=20181222-01:02:00.031197919|10=132|
Tag Name Required Data Type Description
Component <StandardHeader>
55 Symbol Y String
326 SecurityTradingStatus Y Integer Supported values:
2 Trading Halt
4 Close
17 Ready to Trade
18 Trading Unavailable
20 Unknown or invalid state
21 Pre-Open
60 TransactTime Y UTCTimestamp
Component <StandardTrailer>

MarketDataSnapshotFullRefresh (35=W)

8=FIX.4.4|9=0222|35=W|49=SEEDCX|56=LPZD0A20X5|34=3|142=US,IL|52=20181221-20:50:51.569058805|369=2|1181=14033|55=COSP:BTC/USD|268=2|269=0|270=3380.0|271=5.0|278=327600000000004780|290=0|269=0|270=3380.0|271=5.0|278=327600000000004784|290=1|10=053|
Tag Name Required Data Type Description
Component <StandardHeader>
1181 ApplSeqNum Y SeqNum Application sequence number, used to reconcile in-flight MarketDataIncrementalRefresh (X) messages.
55 Symbol Y String
268 NoMDEntries Y Integer Number of repeating entries, with a value of 0 representing an empty book.
→ 269 MDEntryType Y Char Market Data entry type.
→ 270 MDEntryPx Y Price Market Data entry price.
→ 271 MDEntrySize Y Qty
→ 278 MDEntryID N String Unique identifier of the Market Data entry. For bids and offers, this field represents a unique order identifier.
→ 290 MDEntryPositionNo Y Integer Position of a bid or offer, numbered from most to least competitive.
Component <StandardTrailer>

MarketDataIncrementalRefresh (35=X)

8=FIX.4.4|9=165|35=X|34=5|49=SEEDCX|52=20181222-00:58:34.102821195|56=LPZD0A20X5|142=US,IL|369=2|268=1|1181=53|279=0|269=1|55=COSP:BTC/USD|270=6990.0|271=5.0|278=327600000000000024|10=135|
Tag Name Required Data Type Description
Component <StandardHeader>
268 NoMDEntries Y Integer Number of market data entries.
→ 1181 ApplSeqNum Y SeqNum Unique sequence number per instrument.
→ 279 MDUpdateAction Y Char Supported values:
0 New
1 Change
2 Delete
→ 269 MDEntryType N Char Supported values:
0 Bid
1 Offer
2 Trade
4 Opening Price
5 Closing Price
→ 55 Symbol Y String
→ 270 MDEntryPx N Price Not populated for MDUpdateAction of Delete 279=2.
→ 271 MDEntrySize N Qty Not populated for MDUpdateAction of Delete 279=2.
Not populated for opening 269=4 and closing 269=5 prices.
→ 278 MDEntryID N String Unique identifier of the Market Data entry.
For bids and offers, this field represents a unique order identifier.
For trades, this field represents a unique execution identifier.
Not populated for MDUpdateAction of Delete 279=2.
→ 280 MDEntryRefID N String Reference to a previous Market Data entry.
For instance, the original order or execution identifier for changes or deletions.
Not populated for MDUpdateAction of New 279=0.
Component <StandardTrailer>

MarketDataRequestReject (35=Y)

Tag Name Required Data Type Description
Component <StandardHeader>
281 MDReqRejReason Y Char Supported values:
0 Unknown Symbol
1 Missing MDReqID
2 Insufficient Bandwidth
3 Insufficient Permissions
4 Unsupported SubscriptionRequestType
5 Unsupported Market Depth
6 Unsupported MDUpdateType
8 Unsupported MDEntryType
58 Text N String
Component <StandardTrailer>