Appendix G

Foreign Exchange (F/X) Trading

Market Data Request

The Market Data Request message is used by the Initiator to initiate a streaming price feed. The MDReqID would be the stream ID. If the Initiator wishes to co-mingle different currency pairs into a single stream the Initiator should expect to receive multiple Market Data Snapshot messages as the initial response, one Market Data Snapshot message for each currency pair requested. The updates would be provided in a single Market Data Incremental Refresh message.

Field Usage Notes

  • SettleType and SettlDate fields are optional in a Market Data Request message. If a request is sent without either the SettlType or SettlDate specified, the Initiator could receive a significance amount of information. The Respondent may respond with a price stream of all available tenors for the currency pair.
  • MarketDepth is used by the Initiator to request depth of book or "vector prices" by specifying "full book" or best bid/offer by specifying "top of book". However, if the Respondent does not support the type of request the Respondent should reject the request via the Market Data Request Reject message.
  • AggregatedBook field is optionally used by the Initiator to request that only the aggregated entries be sent or not. Again, if the Respondent does not support the type of request then a Market Data Request Reject message should be sent.
    The combination of MarketDepth and AggregatedBook in the request would result in different content in the response.
  • MDEntryType, for FX, only the values "0" (Bid) or "1" (Offer) would be used.
  • MDQuoteType is used to specify whether the request is for indicative or tradeable, or both, streaming prices. Absence of this field provides the Respondent with the option whether to provide indicative and/or tradeable prices.
  • MDEntrySize is optionally used by the Initiator to specify a ceiling or "up to" quantity. The Respondent is free to provide prices for amounts up to the quantity specified by the Initiator in this field. If MDEntrySize is not specified then the market data response may contain prices for all quantity levels available for the requested currency pair.

Market Data Snapshot/Full Refresh

This message type is used by the Respondent to provide the initial or starting snapshot of a price stream for the currency pair requested. If the request contained multiple currency pairs then each pair will receive its own Market Data Snapshot to start, however, it must be noted that each Market Data Snapshot message will have the same MDReqID (the stream ID) but with price data for different currency pairs.

Field Usage Notes

  • MDReqID is required when responding to a Market Data Request message
  • MDEntryType for FX streaming prices is either "0" for Bid or "1" for Offer
  • MDEntryID is required and is a unique reference assigned by the Respondent for this instance of the market data entry.
  • MDEntryPx is required for FX. This specifies the "all in" or "outright" rate (spot rate + foward points).
  • MDEntrySize specifies the amount being for the bid/offer. This provides an "up to" or ceiling amount for the quoted rate.
  • ExpireTime in this message allows the Respondent to specify when the price will expire
  • MinQty is optionally used by the Respondent to specify the minimum quantity of an order to qualify for the rate quoted
  • QuoteEntryID is required and is a unique quote entry identifier as assigned by the Respondent.
  • MDQuoteType indicates whether the price is indicative or executable. Abscence of this field indicates the price is indicative.
  • MDEntrySpotRate is used for specifying the spot rate. It is recommended that either spot rate or forward points be specified for FX forwards.
  • MDEntryFowardPoints is used for specifying the forward points. This may be a negative value. It is recommended that either spot rate or forward points be specified for FX forwards.
  • SettlDate and SettlType is required.
  • The Parties component block is optionally used by multi-bank portals to identify the banks that are providing the rate information. PartyRole is required and in this case the role should be set to "executing broker".

Market Data Incremental Refresh

The Market Data Increment Refresh message is used to send price updates to the Initiator once a snapshot has been sent. For the most part the MDUpdateAction would be either "change" or "delete", however, a new price quote can be supplied in this message with an MDUpdateAction of "new". In this latter scenario, MDEntryType and a unique MDEntryID must be specified.

MDEntryID and QuoteEntryID Usage in Refreshes

The Market Data Incremental Refresh message is used when there is a change to the data of a previously sent MDEntryID or a deletion of a previously sent entry. MDEntryIDs must be unique for the day and each live entry must have an MDEntryID.

In an MDUpdateAction of "delete" the ID of the entry being deleted must be specified in MDEntryID. This signifies to the recipient that this is the entry to be removed.

In an MDUpdateAction of "change" there are two methods that can be used to refer to the entry being changed:

  • Refer to the MDEntryID being changed in the MDEntryID field itself. This also means that the ID will not change and remains a "live" ID.
  • Refer to the MDEntryID of the entry being changed in the MDEntryRefID and provide a new unique MDEntryID. This new MDEntryID would be the "live" ID. This would be the preferred method for firms that wish to maintain an audit trail of the changes to their pricing feed.

For changes/updates the Market Data Incremental Refresh message would contain only the MDEntryID of the entry being changed and only the data elements that are being changed.

For delete, the Respondent may send just the ID for the entry to be deleted in MDEntryID. This would minimize bandwidth usage.

QuoteEntryID is required and on a change/update this would be a new and unique ID as assigned by the Respondent.

Field Usage Notes

  • MDReqID is required when responding to a Market Data Request message
  • MDEntryType for FX streaming prices is either "0" for Bid or "1" for Offer
  • MDEntryID is required and is a unique reference assigned by the Respondent for this instance of the market data entry.
  • MDEntryPx is required for FX. This specifies the "all in" or "outright" rate (spot rate + foward points).
  • MDEntrySize specifies the amount being for the bid/offer. This provides an "up to" or ceiling amount for the quoted rate.
  • ExpireTime in this message allows the Respondent to specify when the price will expire
  • MinQty is optionally used by the Respondent to specify the minimum quantity in an order to qualify for the rate quoted
  • MDQuoteType indicates whether the price is indicative or executable. Abscence of this field indicates the price is indicative.
  • MDEntrySpotRate is used for specifying the spot rate. It is recommended that either spot rate or forward points be specified for FX forwards.
  • MDEntryFowardPoints is used for specifying the forward points. This may be a negative value. It is recommended that either spot rate or forward points be specified for FX forwards.
  • SettlDate and SettlType is required.
  • The Parties component block is optionally used by multi-bank portals to identify the dealers that are providing the rate information. PartyRole is required and in this case the role should be set to "executing broker".

Market Data Request Reject

The Market Data Request Reject message is used by the Respondent to reject the request from the Initiator. A reject reason must be supplied.

Field Usage Notes

  • MDReqRejReason is required.

Message Samples

These sample FIX message usage servers only to illustrate usgae of key fields in the different message types in the context of FX. Data used are fictional. Only relevent fields from the header and message body are shown (i.e. some message header and trailer fields are not shown).

Single Bank Market Data Request

The sample set of market data messages below illustrates a price stream request directly from a bank. It also illustrates the responses back from the bank.

Market Data Request: client requests best bid/offer tradeable prices for a 1-month forwards of a currency pair with a specified quantity in this example. The target bank is implicit in that it is assumed there is a direct FIX session between the client and the bank.

Market Data response messages: bank may provide prices at different quantities if client did not request a specific quantity. In this example, a quantity was specified and this is the ceiling amount. Prices may be indicative or tradeable, in this example the request was for tradeable only.


Market Data Request
35=V //MsgType - Market Data Request message type
49=ABC_AM //SenderCompID - sending client
56=SSBFX //TargetcompID - target bank
262=20050922.09:30:59.1 //MDReqID - uniquely assigned by client, format is arbitrary
263=1 //SubscriptionRequestType - snapshot+update
264=1 //MarketDepth - top of book
267=2 //NoMDEntryTypes
269=0 // [1] MDEntryType - bid
269=1 // [2] MDEntryType - offer
146=1 //NoRelatedSymbol - number of CCY pairs
55=EUR/USD // [1] Symbol - CCY pair
167=FOR // [1] SecurityType - foreign exchange
15=USD // [1] Currency - dealt currency
537=1 // [1] QuoteType - tradeable
63=M1 // [1] SettlType - 1-month tenor
38=20000000 // [1] OrderQty - 20 million

Market Data Snapshot
35=W //MsgType - Market Data Snapshot message type
49=SSBFX //SenderCompID - sending bank
56=ABC_AM //TargetCompID - target client
262=20050922.09:30:59.1 //MDReqID - uniquely assigned by client, format is arbitrary
55=EUR/USD //Symbol - CCY pair
167=FOR //SecurityType - foreign exchange
268=2 //NoMDEntries - number of MD entries
269=0 // [1] MDEntryType - Bid
278=EED02091-47AD-4EDD-A0AA-0B2D9D1B9B0F // [1] MDEntryID - unique entry identifier assigned by the bank. Format and scheme is arbitrary
270=1.2141 // [1] MDEntryPx - all-in bid price/rate
15=USD // [1] Currency - dealt currency
271=20000000 // [1] MDEntrySize - amount
299=FFA23081-51ED-78CE-B9AF-8F3D4B89D012 // [1] QuoteEntryID - unique quote identifier assigned by the bank. format and scheme is arbitrary
63=M1 // [1] SettlType - 1-month tenor
64=20051020 // [1] SettlDate - value date 1 month out
269=1 // [2] MDEntryType - Offer
278=FB5F1910-F110-11d2-BB9E-00C04F795683 // [2] MDEntryID - unique entry identifier assigned by the bank
270=1.2145 // [2] MDEntryPx - all-in offer price/rate
15=USD // [2] Currency - dealt currency
271=20000000 // [2] MDEntrySize - amount
299=92780B25-18CC-41C8-B9BE-3C9C571A8263 // [2] QuoteEntryID - unique quote identifier assigned by the bank
63=M1 // [2] SettlType - 1-month tenor
64=20051020 // [2] SettlDate - value date 1 month out

Market Data Incremental Refresh - the bank updates the bid side
35=X //MsgType - Market Data Incremental Refresh message type
49=SSBFX //SenderCompID - sending bank
56=ABC_AM //TargetCompID - target client
262=20050922.09:30:59.1 //MDReqID - uniquely assigned by client, format is arbitrary
268=1 //NoMDEntries - number of MD entries
279=1 // [1] MDUpdateAction - change/update
278=<new unique entry ID> // [1] MDEntryID - new unique entry ID assigned by the bank
280=EED02091-47AD-4EDD-A0AA-0B2D9D1B9B0F // [1] MDEntryRefID - referencing the entry to be changed/updated
270=1.2139F // [1] MDEntryPx - all-in bid price/rate
299=AAC02189-DF23-11FB-F135-4C0D4A83D238 // [1] QuoteEntryID - unique quote identifier assigned by the bank

"Exchange" Market Data Request

The sample set of market data messages below illustrates a price stream request from a customer to an exchange-style FX platform. It also illustrates the responses back from the exchange.

Market Data Request: client requests "aggregated full book" tradeable Spot prices for a currency pair with no specified quantity in this example.

Market Data response messages: exchange provides aggregated amounts at each bid/ask price points at different quantities. In this example the request was for tradeable only.


Market Data Request
35=V //MsgType - Market Data Request message type
49=ABC_AM //SenderCompID - sending client
56=FXEXCHANGE //TargetcompID - target exchange
262=20050921.09:30:59.1 //MDReqID - uniquely assigned by client, format is arbitrary
263=1 //SubscriptionRequestType - snapshot+update
264=0 //MarketDepth - full book
266=Y //AggregatedBook - one entry per side per price
267=1 //NoMDEntryTypes
269=1 // [1] MDEntryType - offer
146=1 //NoRelatedSymbol - number of CCY pairs
55=EUR/USD // [1] Symbol - CCY pair
167=FOR // [1] SecurityType - foreign exchange
15=USD // [1] Currency - dealt currency
537=1 // [1] QuoteType - tradeable
63=0 // [1] SettlType - spot

Market Data Snapshot
35=W //MsgType - Market Data Snapshot message type
49=FXEXCHANGE //SenderCompID - sending exchange
56=ABC_AM //TargetCompID - target client
262=20050921.09:30:59.1 //MDReqID - uniquely assigned by client, format is arbitrary
55=EUR/USD //Symbol - CCY pair
167=FOR //SecurityType - foreign exchange
268=3 //NoMDEntries - number of MD entries
269=1 // [1] MDEntryType - Offer
278=EED02091-47AD-4EDD-A0AA-0B2D9D1B9B0F // [1] MDEntryID - unique entry identifier assigned by the exchange. Format and scheme is arbitrary
270=1.2144 // [1] MDEntryPx - all-in offer price/rate
15=USD // [1] Currency - dealt currency
271=10000000 // [1] MDEntrySize - amount
299=FFA23081-51ED-78CE-B9AF-8F3D4B89D012 // [1] QuoteEntryID - unique quote identifier assigned by the exchange. format and scheme is arbitrary
63=0 // [1] SettlType - Spot
64=20050923 // [1] SettlDate - value date for spot settle
269=1 // [2] MDEntryType - Offer
278=FB5F1910-F110-11d2-BB9E-00C04F795683 // [2] MDEntryID - unique entry identifier assigned by the exchange
270=1.2145 // [2] MDEntryPx - all-in offer price/rate
15=USD // [2] Currency - dealt currency
271=50000000 // [2] MDEntrySize - amount
299=92780B25-18CC-41C8-B9BE-3C9C571A8263 // [2] QuoteEntryID - unique quote identifier assigned by the exchange
63=0 // [2] SettlType - Spot
64=20050923 // [2] SettlDate - value date for spot settle
269=1 // [3] MDEntryType - Offer
278=<unique id> // [3] MDEntryID - unique entry identifier assigned by the exchange
270=1.2146 // [3] MDEntryPx - all-in offer price/rate
15=USD // [3] Currency - dealt currency
271=15000000 // [3] MDEntrySize - amount
299=<unique id> // [3] QuoteEntryID - unique quote identifier assigned by the exchange
63=0 // [3] SettlType - Spot
64=20050923 // [3] SettlDate - value date for spot settle

Note that in the above Market Data Snapshot message the exchange assigned the unique MDEntryID and QuoteEntryID

Market Data Incremental Refresh - the exchange updates the one of the offers
35=X //MsgType - Market Data Incremental Refresh message type
49=FXEXCHANGE //SenderCompID - sending bank
56=ABC_AM //TargetCompID - target client
262=20050921.09:30:59.1 //MDReqID - uniquely assigned by client, format is arbitrary
268=1 //NoMDEntries - number of MD entries
279=1 // [1] MDUpdateAction - change/update
278=<new unique entry ID> // [1] MDEntryID - new unique entry ID assigned by the bank
280= FB5F1910-F110-11d2-BB9E-00C04F795683 // [1] MDEntryRefID - referencing the entry to be changed/updated
271=40000000 // [1] MDEntrySize - amount dropped
299=AAC02189-DF23-11FB-F135-4C0D4A83D238 // [1] QuoteEntryID - new unique quote identifier assigned by the bank