Most Market-making venues expect the liquidity provider to provide a  complete volume ladder per subscription, typically via MassQuote or MarketDataSnapshotFullRefresh messages.

For a given instrument, there may be multiple subscriptions, in order for the maker clients to be associated with a particular pricing scheme (Gold, Silver, Bronze).

In this context  each pricing scheme provides a custom combination of currency pairs, available liquidity (no. of rungs, and associated quantities), spread, granularity of pricing and so on. Each volume ladder update is complete and self-contained.


Currenex does not operate like this. Instead a set of "Tiers" are agreed between the Venue and the Maker. Each Tier is essentially a single bid-offer rung, for an arbitrary set of currencies. Currenex can be configured to associate each Tier with a specific quantity which will be specified in the associated subscription request. If not configured, the maker may provide whatever volume they wish, from update to update. 

Maker clients are associated with a arbitrary sets of Tiers. This has a great deal of inherent flexibility, but means that a substantial number of tiers are required in order to exactly replicate a 'standard' model on another venue. For example to deliver 5-rung Gold, Sliver, Bronze pricing across all pairs in Currenex you would need 15 separate Tiers. 


In the context of Whisperer Classic, this means the following:

Currenex makes a separate subscription request for each Tier - each of these will be forwarded to the API client. Key Currenex IDs are mapped as follows:


MFAPI-Out.QuoteRequestMessage.contents.mdStreamID = FIX-In.QuoteRequest.StreamReference[7533]
MFAPI-Out.QuoteRequestMessage.contents.quoteReqID = FIX-In.QuoteRequest.QuoteReqID[131]



The API client must of course respond to each individual request with a stream of MassQuote messages in the normal manner.  Key Currenex IDs are mapped as follows:


FIX-Out.MassQuote.QuoteSetID[302] = MFAPI-In.MassQuote.contents.quoteReqID
FIX-Out.MassQuote.NoQuoteSets{*}.NoQuoteEntries{*}.QuoteEntryID[299] = MFAPI-In.MassQuote.contents.quotes{*}.quoteID



However: It must be understood that each MassQuote is destined for a single, single-rung tier. It follows that each MassQuote message must itself comprise a single rung.