The MARKET_DATA_FEED_STATUS message is an optional message sent by the Server to indicate the overall status of the market data feed. This status applies to all symbols that have been subscribed to for market data.

This can be set to MARKET_DATA_FEED_UNAVAILABLE, to indicate the market data feed is presently not available. Or it can be set to MARKET_DATA_FEED_AVAILABLE, to indicate the market data feed has been restored.

Upon a connection to the server, MARKET_DATA_FEED_AVAILABLE is assumed to be the status. It is not until there has been expressly given MARKET_DATA_FEED_UNAVAILABLE, will the data feed be considered lost.

This can be set to MARKET_DATA_FEED_UNAVAILABLE, to indicate the market data feed is presently not available for the symbol. Or it can be set to MARKET_DATA_FEED_AVAILABLE, to indicate the market data feed has been restored for the symbol.

Upon a connection to the server, MARKET_DATA_FEED_AVAILABLE is assumed to be the status. It is not until there has been expressly given MARKET_DATA_FEED_UNAVAILABLE, will the market data feed for the symbol be considered lost.

MARKET_DATA_REQUEST [s_MarketDataRequest structure] Client >> Server

The MARKET_DATA_REQUEST message will subscribe to market data for a particular Symbol or request a market data snapshot. The Server can also send market depth data in response to this message and not require a MARKET_DEPTH_REQUEST.

This needs to be set to SUBSCRIBE to subscribe to market data for the Symbol from the Server. The Server will respond with an initial MARKET_DATA_SNAPSHOT message and then provide MARKET_DATA_UPDATE_* updates as necessary.

This is the identifier which will be used in all of the market data response messages. This identifier is used so that the Symbol and Exchange do not have to be passed back in response messages from the Server. This makes the market data feed bandwidth efficient.

If the Server receives a MARKET_DATA_REQUEST for a Symbol and Exchange to subscribe to data for, that is currently subscribed to and this SymbolID is different, then the Server needs to reject it.

This is the identifier which will be used in all of the market depth data response messages.

This SymbolID can be the same as the one used in the MARKET_DATA_REQUEST message for the same Symbol and Exchange.

This identifier is used so that the Symbol does not have to be passed back in response messages from the Server. If the Server receives a MARKET_DEPTH_REQUEST for a Symbol and Exchange to subscribe to market depth data for, that is currently subscribed to and this SymbolID is different, then the Server should reject it.

The Server sends the MARKET_DATA_SNAPSHOT message to the Client immediately after a successful MARKET_DATA_REQUEST message has been received from the Client and it has indicated to subscribe to the symbol or requested the snapshot of data.

Any changes to the data fields within the MARKET_DATA_SNAPSHOT message during the trading session will be sent by the Server to the Client through the corresponding MARKET_DATA_UPDATE_* messages.

It is recommended that the MARKET_DATA_SNAPSHOT be sent by the Server at the start of a new trading session.

This message can be sent more often, however it is not intended to be sent frequently.

This message type does not signify a trade has occurred. It should never be interpreted by the Client in that way.

This is a message sent by Server to provide the initial market depth data entries to the Client after the Client subscribes to market data or separately subscribes to market depth data. The Client will need to separately subscribe to market depth data if the Server requires it.

Each message provides a single entry of depth data. Therefore, the Server will send multiple MARKET_DEPTH_SNAPSHOT_LEVEL messages in a series in order for the Client to build up its initial market depth book.

The first message will be identified by the IsFirstMessageInBatch field being set to 1. The last message will be identified by the IsLastMessageInBatch field being set to 1.

In the case where the market depth book is empty, the Server still needs to send through one single message with the SymbolID set, IsFirstMessageInBatch equal to 1 and IsLastMessageInBatch equal to 1. All other members will be at the default values. The Client will understand this as an empty book.

Set to 1 if this is the last message in a batch of messages. If there is only a single message to be sent, in case the market depth book is empty, then IsFirstMessageInBatch will equal 1 and IsLastMessageInBatch will equal 1.

Sent by the Server to the Client to Update/Insert or Delete a particular market depth price level in the market depth book maintained by the Client.

Each MARKET_DEPTH_UPDATE_LEVEL message updates one level of market depth on one side. An insert/update/delete model is used for market depth.

The Client will need to determine the based upon the price, what particular market depth level is being updated, inserted or deleted.

It is for this reason, that an insert/update is considered as one update type since it is possible to determine whether it is an insert or update based upon the existence of the price level in the existing market depth book on the Client side.

What this means is that when the UpdateType field is MARKET_DEPTH_INSERT_UPDATE_LEVEL, it is considered an insert if the price level is not found on the particular side of the market depth being updated. It is considered an update, if the price level is found on the particular side of market depth being updated.

This message uses a double datatype for the Price field. There is no level index. It is the responsibility of the Client to determine where in its market depth array it is maintaining where the insert/update/delete operation needs to occur. Since floating-point comparisons are not always precise, there should be a comparison made only to the number of decimal places the symbol specifies in its security definition. This can be determined through the SECURITY_DEFINITION_RESPONSE::PriceDisplayFormat field.

Specifies whether this is an MARKET_DEPTH_INSERT_UPDATE_LEVEL operation or a MARKET_DEPTH_DELETE_LEVEL operation.

MARKET_DEPTH_INSERT_UPDATE_LEVEL: Insert or update in the market depth book on the specified side, the particular Price and Volume specified. It is an insert operation of the price level does not exist. It is an update operation if the price level already exists. In the case of insert, the other levels in the market depth book need to be shifted to make room for the new level.

MARKET_DEPTH_DELETE_LEVEL: Remove from the market depth book on the specified side, the specified Price level. The other levels need to be shifted to fill in the missing level. In this particular case the Quantity is ignored and will be 0.

Sent by the Server to the Client when the session trade Volume needs to be updated.

The recommended rule for the Server to notify the Client of a change with the session trade volume to maintain bandwidth efficiency, is as follows: When a trade occurs for a symbol subscribed to, the Server will send a MARKET_DATA_UPDATE_TRADE message to the Client. The Client should then increment its session trade volume value for the symbol by the value in the Volume field in this message.

The Server will assume the Client is doing this. Therefore, when a trade occurs and the session trade volume does not equal the prior session trade volume plus the Volume for the most recent trade sent to the Client, then the Server must send out a MARKET_DATA_UPDATE_SESSION_VOLUME message to the client since the client calculation of the session trade volume is no longer correct.

It is assumed that the reason for this inconsistency is due to trades included within the session trade volume which have not been sent out as normal trades.

The Server should also send this message out at the frequency that the Server determines, such as every minute if there also has been a trade at that time.

Set to 1 if this is the last message in a batch of messages. If there is only a single message to be sent, in case the market depth book is empty, then IsFirstMessageInBatch will equal 1 and IsLastMessageInBatch will equal 1.

Specifies whether this is an MARKET_DEPTH_INSERT_UPDATE_LEVEL operation or a MARKET_DEPTH_DELETE_LEVEL operation.

MARKET_DEPTH_INSERT_UPDATE_LEVEL: Insert or update in the depth book on the specified side, the particular Price and Volume specified. It is an insert operation of the price level does not exist. It is an update operation if the price level already exists. In the case of insert, the other levels in the depth book need to be shifted to make room for the new level.

MARKET_DEPTH_DELETE_LEVEL: Remove from the depth book on the specified side, the specified Price level. The other levels need to be shifted to fill in the missing level.