Muneeb Nasir
Muneeb Nasir

Reputation: 2504

Why are repeating groups required when requesting market data over FIX?

Can anyone tell me, why we need to use repeating groups in market data request. And what response/reply should we receive from acceptor against market data request. Please tell how can we receive market data request on acceptor side?

Sending Market Data request

public void sendMarketDataRequest(SessionID sessionId, String request, int ord){ // request new or old
        String bankName = "HBL";
        String mdReqCcyPair = "EURUSD";
        String mkdreqId = "010qwerty";

        SubscriptionRequestType type = new SubscriptionRequestType('1');
        if(request.equals("new")){
            reqId.put(mkdreqId, mkdreqId);
        }else{
            type.setValue('2');
        }

        quickfix.fix44.MarketDataRequest mdRequest = new quickfix.fix44.MarketDataRequest(new MDReqID(mkdreqId), type, new MarketDepth(1));
        mdRequest.setField(new quickfix.field.Symbol(mdReqCcyPair));
        mdRequest.setField(new Product(2));
        mdRequest.setField(new NoRelatedSym(1));
        mdRequest.setField(new MDUpdateType(0));
        mdRequest.setField(new NoMDEntryTypes(3));
        mdRequest.setField(new StringField(582, "1"));

        quickfix.fix44.MarketDataSnapshotFullRefresh.NoMDEntries group = new quickfix.fix44.MarketDataSnapshotFullRefresh.NoMDEntries();
            group.set(new MDEntryType('0'));
            group.set(new MDEntryPx(12.32));
            group.set(new MDEntrySize(10));
            group.set(new OrderID("OrderId"));
            mdRequest.addGroup(group);

            group.set(new MDEntryType('1'));
            group.set(new MDEntryPx(12.32));
            group.set(new MDEntrySize(10));
            group.set(new OrderID("OrderId"));
            mdRequest.addGroup(group);

        qCcyPair.substring(0, 3);
        mdRequest.setField(new Currency(mdReqDealtCcy));
        mdRequest.setField(new NoPartyIDs(1));
        mdRequest.setField(new PartyID(bankName));

        try{
            boolean re = Session.sendToTarget(mdRequest, sessionId);
            System.out.println(mdRequest);
            System.out.println(re);
        }catch(Exception e){e.printStackTrace();}
    }

Receiving End Code

public void onMessage( quickfix.fix44.MarketDataRequest message,  SessionID sessionID )
                  throws FieldNotFound, UnsupportedMessageType, IncorrectTagValue {

                  System.out.println("On Message:   "+message);
}

Upvotes: 2

Views: 3205

Answers (1)

MD-Tech
MD-Tech

Reputation: 1224

Market data requests are not normally used for a single instrument; you normally want market data for a set of instruments. Each group in the repeating group set represents an instrument you want data for. The response will depend on your counterparty and when you last had a full market data refresh (usually daily). On your initial request and then at a fixed schedule thereafter you will receive a full market data refresh message . If your counterparty supports an intraday update model you will then receive snapshot refresh messages which are partial data refreshes. The snapshot message provides an update on just the market data that has changed since last refresh (full or partial) and is intended to be a smaller message and therefore, hopefully, lower latency. Not all counterparties support partial refresh. If you are on the acceptor side where you are receiving market data requests (obviously normally on the sell side) you should provide a full market data refresh first covering all of the requested instrument details. Whether you support incremental updates is a business decision.

Upvotes: 4

Related Questions