Page History
...
rejected order acceptance order timeout Main Thread MFMarketMakerHandler MFMaker
«create»
«create»
.connect() APIResult
.run() onStartsubscribePricing
subscribeTrading
onSubscriptionEvent(MARKET_MAKER_TRADING)
onSubscriptionEvent(MARKET_MAKER_PRICING)
onQuoteRequest() - One for each available marketID
submitQuotes()
.stop()
.onStop()
.join()
.close()
APIResult
Figure 9.1. – Showing a normal flow of submit quotes through whisperer. Make sure both the trading and pricing connects are subscribed. Most venues require this as a precondition for them to send the quoteRequest messages to the maker.Main Thread MFMarketMakerHandler MFMaker
.run()
onQuoteRequest() - One for each available marketID
rejectQuoteRequest() - called for the respective quote request to close.
Figure 9.2. – A maker rejecting a quote request from the venue. This is for the case where a maker does not wish to price to an available stream. (Assuming a subscription to Pricing and Trading)
Main Thread MFMarketMakerHandler MFMaker
.run()
onQuoteRequest() - One for each available marketID
submitQuotes()
onMassQuoteAck(REJECTED or EXPIRED)
Figure 9.3. – The venue rejecting a quote request. This is for the case where the venue decides to close a stream. (Assuming a subscription to Pricing and Trading)
Main Thread MFMarketMakerHandler MFMaker
.run()
onQuoteRequest() - One for each available marketID
cancelQuoteRequest()
Figure 9.4. – A maker cancelling a quote request from the venue. This is for the case where a maker wants to cancel quotes on the venue. The options are either all live quotes, quotes for a particular symbol, or a particular quote. The supported options differ by venue. (Assuming a subscription to Pricing and Trading)
Main Thread MFMarketMakerHandler MFMaker
.run()
onQuoteRequest() - One for each available marketID
submitQuotes()
onSubscriptionEvent(status == ERROR, reason == "Application Error.")
Figure 9.5. – This occurs when there is an unrecoverable error, such as a BusinessMessageReject being sent from the venue because of an invalid price (such as a negative price). This acts as a kill switch to get the maker out of the market by disconnecting the sessions since the error can not cannot be programmatically recovered from. (Assuming a subscription to Pricing and Trading)
Main Thread MFMarketMakerHandler MFMaker
.run()
onQuoteRequest() - One for each available marketID
submitQuotes()
onNewOrder()
rejectOrder()
Figure 9.6. – A maker accepting a new order from the venue. When a client executes on an order, Whisperer will send a NewOrder to the maker for them to accept or reject. Rejecting an order will notify the exchange to not fill the order. (Assuming a subscription to Pricing and Trading)
Main Thread MFMarketMakerHandler MFMaker
.run()
onQuoteRequest() - One for each available marketID
submitQuotes()
onNewOrder()
acceptOrder()
onTradeCaptureAck(status == REJECTED)
Figure 9.7. – A maker accepting a new order from the venue but the venue rejecting the acceptance. This might happen, for instance, when a an acceptOrder fails validation, due to a wrong quoteID. (Assuming a subscription to Pricing and Trading)
Main Thread MFMarketMakerHandler MFMaker
.run()
onQuoteRequest() - One for each available marketID
submitQuotes()
onNewOrder()
acceptOrder()
orderTimeout()
Figure 9.8. – A maker accepting a new order from the venue, but doing so too slow. This will generate an OrderTimeout message from the venue notifying the response time was too slow. This causes the fill to be rejected. (Assuming a subscription to Pricing and Trading)