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 |
|