Page History
Synopsis
The MarketFactory Aggregate Feed (Agg-Feed) is an MFAPI connection combining marketdata from a range of Feeds specified by a customerconfigured by MF and requested by the customer. The participating Feeds direct marketdata to direct market data to the Agg-Feed as defined within the Whisperer configuration, resulting in a consolidated book.
Agg-Feed Topology Diagram
| Gliffy Diagram | ||||
|---|---|---|---|---|
|
The parent orders may then be further fragmented into "child orders" that can be distributed between different Feeds feeds (that give access to separate liquidity pools). The Feeds can then be
Market Data
The Agg Feed consolidates data across input feeds, and is configurable so you can decide which feeds to consolidate.
For example you may:
- have permission for data from Liquidity Venues A, B, C, and D
- need to use the data from A,B,and C for one purpose e.g. your Voice Desk
- need to use data from C,D for a different purpose e.g. your Autohedger
In that case the Agg feed would be configured to give you two feeds:
- Feed X with input from feeds A,B,C, consolidated and attributed
- Feed Y with input from feeds C,D, consolidated and attributed
You could also choose to see the original feeds A,B,C,D in addition to the aggregated feeds, for example if you feed each LPs data in isolation into an analysis tool.
Order Types Permitted
The Agg-Feed permits the following order types;
- LIMIT IOC ORDERS
- LIMIT GTC ORDERS
- GTC STOP ORDERS
- LIMIT GTC STOP ORDERS
LIMIT Orders need a valid limit price, while STOP Orders require a valid stop price provided at the time of submission with submitOrder(). The submitted orders go to the Agg-Feed where they are held until either the order expires or the specified LIMIT or STOP price is available for execution.
- MARKET IOC ORDERS
IOC Orders
Submitted IOC orders will sweep the aggregated book. If all available liquidity is hit there is a resting period (set by default at 50 milliseconds) where additional liquidity that is quoted will be taken.
Order Handling
The Agg-Feed will not allow any two orders to hit the same liquidity. With the order that is executed first depending on how close an order is to the current market. The order that is closest to the current market is the order that is executed first.
- Where multiple orders are placed on the same limit price – the older oldest will be executed first.
- Where no liquidity is available, GTC and STOP orders will remain in the system.
- Cancel and modify actions are support for GTC and STOP orders.
Agg Feed Limits in the Portal
Orders that are submitted using the Agg-Feed can be tracked using the order tracking feature on the MarketFactory portal
Order Persistence
The Agg-Feed orders do not persist across disconnects or the end of the week.
Sample order
In the example below, a buy order was submitted on the agg-feed for 2MM EUR/USD at 1.13718. The agg-feed broke the parent order into two child orders for 1MM, which both executed at different exchanges. The TradeCaptureMessage shows which feed executed the order in the origFeedID field. In this example, 1MM was filled with Currenex (origFeedID=35) and 1MM was filled with ParFX (origFeedID=47).
| Code Block | ||
|---|---|---|
| ||
2018-11-20 21:41:00 424,129 <SubmitOrderMessage (userID=109 quoteID="" onBehalfOfCompID="" contents=(orderID=6533845649035624476 clOrdID="test5339" timeApiClient=1542750060422025946 timeApiServer=1542750060424093072 timeHandler=0 feedID=62 marketID=2 side=BID amount=2000000000000000 price=1137180000 ordType=LIMIT timeInForce=IOC stopPrice=0 maxShow=0 minAmount=0 parameters=[]) modelID="")>
2018-11-20 21:41:00 424,643 <OrderReceivedMessage (userID=109 contents=(sequenceID=148 orderID=6533845649035624476 clOrdID="test5339" modelID="" timeApiServer=1542750060424617239 timeApiClient=0 feedID=62 marketID=2 side=BID amount=2000000000000000 price=1137180000 ordType=LIMIT timeInForce=IOC))>
2018-11-20 21:41:00 431,485 <OrderSubmittedMessage (userID=109 contents=(sequenceID=149 orderID=6533845649035624476 clOrdID="test5339" exOrdID="4895961074" modelID="" amount=2000000000000000 ordStatus=ACCEPTED timeExchange=1542750060429000000 timeHandler=1542750060431360669 timeApiServer=1542750060431475498 timeApiClient=0 feedID=62 marketID=2))>
2018-11-20 21:41:00 433,790 <TradeCaptureMessage (userID=109 origPrice=1137180000 contents=(sequenceID=150 orderID=6533845649035624476 clOrdID="test5339" exOrdID="4895961074" exPendingID="" exTradeID="A20183240BXV400" modelID="" timeExchange=1542750060431000000 timeHandler=1542750060433596573 timeApiServer=1542750060433773896 timeApiClient=1 feedID=62 origFeedID=35 marketID=2 side=BID amount=1000000000000000 price=1137180000 isTaker=T matchStatus=DONE counterPartyID="FXTrades" tradeDate=1542672000000000000 settlDate=1542931200000000000))>
2018-11-20 21:41:00 518,538 <TradeCaptureMessage (userID=109 origPrice=1137100000 contents=(sequenceID=151 orderID=6533845649035624476 clOrdID="test5339" exOrdID="18112000000018338" exPendingID="" exTradeID="181120011800006471" modelID="" timeExchange=1542750060482000000 timeHandler=1542750060518312073 timeApiServer=1542750060518370748 timeApiClient=1 feedID=62 origFeedID=47 marketID=2 side=BID amount=1000000000000000 price=1137100000 isTaker=T matchStatus=DONE counterPartyID="demobank1" tradeDate=1542672000000000000 settlDate=1542931200000000000))>
2018-11-20 21:41:00 518,551 <OrderDoneMessage (userID=109 contents=(sequenceID=152 orderID=6533845649035624476 clOrdID="test5339" exOrdID="" modelID="" timeExchange=0 timeHandler=1542750060518340302 timeApiServer=1542750060518545629 timeApiClient=0 feedID=62 marketID=2))> |
Sample data
The market data message below shows a change to a single price level. The total liquidity available at price 1.13685 is 7MM, which is made up of three quotes from different exchanges. The components field shows each quote size and which venue it came from. In this case, there is a 3MM quote from JPM (feedID=19), 1MM quote from BNPP (feedID=20), and 3MM quote from CITI (feedID=21).
| Code Block | ||
|---|---|---|
| ||
================================================================================MktDataMessage
2018-11-20 20:10:04 318,435 <MktDataMessage ( mvd=( fmID=( marketID=2 feedID=62 )
timeExchange=2018-11-20 20:10:04.318000
timeArrival=2018-11-20 20:10:04.318183
timeHandler=2018-11-20 20:10:04.318415
timeEnhanced=1970-01-01 00:00:00.000000
timeApiServer=1970-01-01 00:00:00.000000
timeApiClient=1970-01-01 00:00:00.000000
isSnapshot=F
mdEntryList=[
( price=1.1368500000 amount=7,000,000 minAmount=0 updateAction=CHANGE element=LEVEL side=BID source=1 numberOfOrders=3 components="19:3000000,20:1000000,21:3000000," )
fmIDsInBatch=[ ( marketID=2 feedID=62 ) ]
batchID=20571532
streamID=0 )> |
| Info | ||
|---|---|---|
| ||
The Agg-Feed may present a -1 sequence number (or sequenceID=-1) specifically for OrderRejected events, this value is considered 'valid' due to the way in which orders are handled. The negative number can arise due to NOP limits being exceeded, in addition to orders that are unable to be routed to the FeedServer (e.g as a result of an INVALID_MARKET where the instrument pair is not enabled to execute the order) |
...