Stale Quote Protection refers to configuration settings that can be invoked by MarketFactory, to direct FeedServers to reject orders submitted by the customer application. Rather than sending previously quoted orders to the trading venue. The intent of this is to prevent orders being sent to the venue that are too old or stale, and would ultimately result in venue rejection.
Stale quote protection is available for Taker (liquidity consumer) connections to venues, where the customer application submits previously-quoted orders ( that contain within them a quoteID) specifically;
| Name of Trading Venue | MF Feed name |
|---|---|
| Bank of America Meryll Lynch | BAML |
| BNP Paribas | BNPP |
| Barclays Bank | Barx |
| Citadel Securities | Citadel |
| Citi Bank | Citi |
| Commerz Bank | Commerz |
| Credit Suisse | CreditSuisse |
| Deutsche Rapid | DeuRapid |
| EBS Select | EBS Select |
| Goldman Sachs | GoldmanSachs |
| HSBC | HSBC |
| Morgan Stanley | Morgan Stanley |
| Nomura | Nomura |
| Royal Bank of Canada | RBC |
| Royal Bank of Scotland | RBS |
| Saxo Markets | Saxo |
| Societe Generale | SocGen |
| Standard Chartered | StandardChartered |
| UBS | UBS |
| XTX | XTX |
Stale Quote Protection (Y/N)
By default MarketFactory stores up to 64 historic quotes in a per-pair cache.
Enabling Stale Quote protection ensures that the client will never submit orders to the venue against quotes in this cache beyond a certain staleness:
StaleAfterMilliseconds (chronological age) <2000ms - The number of milliseconds at or after which a quote is considered stale and excluded from consideration for quotes that can be sent to a venue. We start timing staleness of a quote at the point the quote is deleted. The most recent quote is always valid.
DeleteMessageBuffer (number of quotes age) = 5 - The number of ticks for which a quote is valid. Quotes that arrived less recently than this number of ticks are considered stale and excluded from consideration for quotes that can be sent to a venue. The most recent quote is always valid.
If both parameters are specified, either setting can cause a quote to be removed from consideration. Another way to think of it is that both conditions must be satisfied in order for a quote to be considered valid.
Example
Quotes
To keep the example simple, we'll use only bid quotes. The example below displays that the history of quotes that live for a duration of a single tick.
QuoteID | Price | Quantity | Status | Delete Time |
|---|---|---|---|---|
| Quote1 | 1.40 | 1000000 | deleted | 00:00:05 |
| Quote2 | 1.30 | 1000000 | deleted | 00:00:04 |
| Quote3 | 1.10 | 2000000 | deleted | 00:00:03 |
| Quote4 | 1.20 | 1000000 | deleted | 00:00:02 |
| Quote5 | 1.10 | 1000000 | deleted | 00:00:01 |
| Quote6 | 1 | 1000000 | current |
StaleAfterMilliseconds=2000, DeleteMessageBuffer not specified
The example below demonstrates the history of quotes once the condition of stale after 200 milliseconds is invoked without the deleted message buffer
Price and Quantity Needed | Quote matched | What happens |
|---|---|---|
| 1000000@1 | Quote6 | QuoteID returned |
| [email protected] | Quote3 | No quote matched – Quote3 is too old |
| [email protected] | Quote5 | QuoteID returned |
| [email protected] | Quote2 | No quote matched – Quote2 is too old |
StaleAfterMilliseconds not specified, DeleteMessageBuffer = 3
With both conditions invoked (and the buffer size set to a tick size of three (3)) the history for the same period would be seen as below:
Price and Quantity Needed | Quote matched | What happens |
|---|---|---|
| 1000000@1 | Quote6 | QuoteID returned |
| [email protected] | Quote3 | QuoteID returned |
| [email protected] | Quote5 | QuoteID returned |
| [email protected] | Quote2 | No quote matched – Quote2 is outside DeleteMessageBuffer |