SlideShare a Scribd company logo
1 of 4
How to get MarketPrice from FixServer
using QuickFix?
Purpose

This in continuation with previous post on QuickFix which explain how to connect to FIX
Server and send order to Fix Server.

I don't have any environment to test now. I just want to give idea about how can we get
market price from FIX server if broker/exchange is sending market price in FIX messages.

I am assuming session has been setup with Fix Server. You can go thorough previous post to
understand about steps to set up session.


MarketDataRequest

Once session has setup, Fix Initiator application needs to send MarketDataRequest message
to FIX server.

Response can be different messages:

       MarketDataRequestReject
       This is reject response of MarketDataRequest message.
       Market Data - Incremental Refresh (MarketDataIncrementalRefresh)
       This message contain incremental update of market price. It's real time message for
       MarketDataRequest.
       Market Data - Snapshot / Full Refresh (MarketDataSnapshotFullRefresh)
       This message will be one per MarketDataRequest message. It contains snapshot of
       market prices.


Fix Initiator

Source Code

varmarketDataRequest = new MarketDataRequest();
marketDataRequest.set(new QuickFix.MDReqID(Utility.GetNewUniqueId()));
marketDataRequest.set(new QuickFix.SubscriptionRequestType('1'));
            //if market depth require
marketDataRequest.set(new QuickFix.MarketDepth(1));
marketDataRequest.set(new QuickFix.MDUpdateType(1));
marketDataRequest.set(new QuickFix.AggregatedBook(true));
varnoMDEntryTypes = new MarketDataRequest.NoMDEntryTypes();
varmdEntryType_bid = new QuickFix.MDEntryType('0');
noMDEntryTypes.set(mdEntryType_bid);
marketDataRequest.addGroup(noMDEntryTypes);
varmdEntryType_offer = new QuickFix.MDEntryType('1');
noMDEntryTypes.set(mdEntryType_offer);
marketDataRequest.addGroup(noMDEntryTypes);
varrelatedSymbol = new MarketDataRequest.NoRelatedSym();
relatedSymbol.set(new QuickFix.Symbol(instrument));
marketDataRequest.addGroup(relatedSymbol);
//Send message
Session.sendToTarget(marketDataRequest, _admin.TradeSessionId);

MarketDataRequest Message Fields

       NoRelatedSym: this is list of instrument for which you want to receive market prices.
       MarketDepth: if you want market depth in price then set it 1.
       MDEntryType: type of Market Data prices like Bid, Offer, Trade Price, Open price
       etc.

You can read more about each field here.

http://btobits.com/fixopaedia/fixdic50/message_Market_Data_Request_V_.html

Capture MarketData Response

Once Marketdatarequest message sent to FixServer, fix initiator expect marketdata response
in

       MarketDataIncrementalRefresh
       MarketDataSnapshotFullRefresh
       MarketDataRequestReject




MarketDataIncrementalRefresh

You can read more about this message:

http://btobits.com/fixopaedia/fixdic50/message_Market_Data_Incremental_Refresh_X_.html

Source Code

publicoverridevoidonMessage(MarketDataIncrementalRefresh message, SessionID session)
        {
try
            {
MDReqIDmdreqid = newMDReqID();
NoMDEntriesnomdentries = newNoMDEntries();
                QuickFix42.MarketDataIncrementalRefresh.NoMDEntries group
                    = newQuickFix42.MarketDataIncrementalRefresh.NoMDEntries();
MDUpdateActionmdupdateaction = newMDUpdateAction();
DeleteReasondeletereason = newDeleteReason();
MDEntryTypemdentrytype = newMDEntryType();
MDEntryIDmdentryid = newMDEntryID();
Symbolsymbol = newSymbol();
MDEntryOriginatormdentryoriginator = newMDEntryOriginator();
MDEntryPxmdentrypx = newMDEntryPx();
Currencycurrency = newCurrency();
MDEntrySizemdentrysize = newMDEntrySize();
ExpireDateexpiredate = newExpireDate();
ExpireTimeexpiretime = newExpireTime();
NumberOfOrdersnumberoforders = newNumberOfOrders();
MDEntryPositionNomdentrypositionno = newMDEntryPositionNo();

message.get(nomdentries);

message.getGroup(1, group);

int list = nomdentries.getValue();

for (uinti = 0; i< list; i++)
                {

message.getGroup(i + 1, group);
group.get(mdupdateaction);
if (mdupdateaction.getValue() == '2')
Console.WriteLine("Enter");
group.get(deletereason);
group.get(mdentrytype);
group.get(mdentryid);
group.get(symbol);
group.get(mdentryoriginator);
if (mdupdateaction.getValue() == '0')
group.get(mdentrypx);
group.get(currency);
if (mdupdateaction.getValue() == '0')
group.get(mdentrysize);
                }


Console.WriteLine("Got Symbol {0} Price {1}", symbol.getValue(),
mdentrypx.getValue());
            }
catch (Exception ex)
            {
Console.WriteLine(ex.Message);
            }
        }


MarketDataSnapshotFullRefresh

This message will be one per MarketDataRequest message. It contains snapshot of market
prices.
http://btobits.com/fixopaedia/fixdic50/message_Market_Data_Snapshot_Full_Refresh_W_.html



Source Code


publicoverridevoidonMessage(MarketDataSnapshotFullRefresh message, SessionID session)
        {

string Symbol = message.get(newSymbol()).getValue();

NoMDEntriesnoMDEntries = newNoMDEntries();
message.get(noMDEntries);
var group =
new QuickFix42.MarketDataSnapshotFullRefresh.NoMDEntries();
MDEntryTypeMDEntryType = newMDEntryType();
MDEntryPxMDEntryPx = newMDEntryPx();
MDEntrySizeMDEntrySize = newMDEntrySize();

message.getGroup(1, group);
group.get(MDEntryType);
group.get(MDEntryPx);
group.get(MDEntrySize);

message.getGroup(2, group);
group.get(MDEntryType);
group.get(MDEntryPx);
group.get(MDEntrySize);

Console.WriteLine("Symbol {0} Price {1}", Symbol, MDEntryPx);
        }



Market Data Request Reject
It is used when the broker cannot honor the Market Data Request, due to business or technical
reasons.

Fields

MDReqRejReason : Reject reason code

Text: Reject reason text.



I hope this post gives overview of how to capture Market Price from FIX server.

More Related Content

More from Neeraj Kaushik

Multithreading Presentation
Multithreading PresentationMultithreading Presentation
Multithreading PresentationNeeraj Kaushik
 
Concurrent Collections Object In Dot Net 4
Concurrent Collections Object In Dot Net 4Concurrent Collections Object In Dot Net 4
Concurrent Collections Object In Dot Net 4Neeraj Kaushik
 
Parallel Programming With Dot Net
Parallel Programming With Dot NetParallel Programming With Dot Net
Parallel Programming With Dot NetNeeraj Kaushik
 
DotNet &amp; Sql Server Interview Questions
DotNet &amp; Sql Server Interview QuestionsDotNet &amp; Sql Server Interview Questions
DotNet &amp; Sql Server Interview QuestionsNeeraj Kaushik
 

More from Neeraj Kaushik (6)

Multithreading Presentation
Multithreading PresentationMultithreading Presentation
Multithreading Presentation
 
Concurrent Collections Object In Dot Net 4
Concurrent Collections Object In Dot Net 4Concurrent Collections Object In Dot Net 4
Concurrent Collections Object In Dot Net 4
 
Parallel Programming With Dot Net
Parallel Programming With Dot NetParallel Programming With Dot Net
Parallel Programming With Dot Net
 
DotNet &amp; Sql Server Interview Questions
DotNet &amp; Sql Server Interview QuestionsDotNet &amp; Sql Server Interview Questions
DotNet &amp; Sql Server Interview Questions
 
Design UML diagrams
Design UML diagramsDesign UML diagrams
Design UML diagrams
 
Design UML diagrams
Design UML diagramsDesign UML diagrams
Design UML diagrams
 

How To Get Market Price From Fix Server Using Quick Fix

  • 1. How to get MarketPrice from FixServer using QuickFix? Purpose This in continuation with previous post on QuickFix which explain how to connect to FIX Server and send order to Fix Server. I don't have any environment to test now. I just want to give idea about how can we get market price from FIX server if broker/exchange is sending market price in FIX messages. I am assuming session has been setup with Fix Server. You can go thorough previous post to understand about steps to set up session. MarketDataRequest Once session has setup, Fix Initiator application needs to send MarketDataRequest message to FIX server. Response can be different messages: MarketDataRequestReject This is reject response of MarketDataRequest message. Market Data - Incremental Refresh (MarketDataIncrementalRefresh) This message contain incremental update of market price. It's real time message for MarketDataRequest. Market Data - Snapshot / Full Refresh (MarketDataSnapshotFullRefresh) This message will be one per MarketDataRequest message. It contains snapshot of market prices. Fix Initiator Source Code varmarketDataRequest = new MarketDataRequest(); marketDataRequest.set(new QuickFix.MDReqID(Utility.GetNewUniqueId())); marketDataRequest.set(new QuickFix.SubscriptionRequestType('1')); //if market depth require marketDataRequest.set(new QuickFix.MarketDepth(1)); marketDataRequest.set(new QuickFix.MDUpdateType(1)); marketDataRequest.set(new QuickFix.AggregatedBook(true)); varnoMDEntryTypes = new MarketDataRequest.NoMDEntryTypes(); varmdEntryType_bid = new QuickFix.MDEntryType('0'); noMDEntryTypes.set(mdEntryType_bid); marketDataRequest.addGroup(noMDEntryTypes); varmdEntryType_offer = new QuickFix.MDEntryType('1');
  • 2. noMDEntryTypes.set(mdEntryType_offer); marketDataRequest.addGroup(noMDEntryTypes); varrelatedSymbol = new MarketDataRequest.NoRelatedSym(); relatedSymbol.set(new QuickFix.Symbol(instrument)); marketDataRequest.addGroup(relatedSymbol); //Send message Session.sendToTarget(marketDataRequest, _admin.TradeSessionId); MarketDataRequest Message Fields NoRelatedSym: this is list of instrument for which you want to receive market prices. MarketDepth: if you want market depth in price then set it 1. MDEntryType: type of Market Data prices like Bid, Offer, Trade Price, Open price etc. You can read more about each field here. http://btobits.com/fixopaedia/fixdic50/message_Market_Data_Request_V_.html Capture MarketData Response Once Marketdatarequest message sent to FixServer, fix initiator expect marketdata response in MarketDataIncrementalRefresh MarketDataSnapshotFullRefresh MarketDataRequestReject MarketDataIncrementalRefresh You can read more about this message: http://btobits.com/fixopaedia/fixdic50/message_Market_Data_Incremental_Refresh_X_.html Source Code publicoverridevoidonMessage(MarketDataIncrementalRefresh message, SessionID session) { try { MDReqIDmdreqid = newMDReqID(); NoMDEntriesnomdentries = newNoMDEntries(); QuickFix42.MarketDataIncrementalRefresh.NoMDEntries group = newQuickFix42.MarketDataIncrementalRefresh.NoMDEntries(); MDUpdateActionmdupdateaction = newMDUpdateAction(); DeleteReasondeletereason = newDeleteReason(); MDEntryTypemdentrytype = newMDEntryType(); MDEntryIDmdentryid = newMDEntryID(); Symbolsymbol = newSymbol(); MDEntryOriginatormdentryoriginator = newMDEntryOriginator(); MDEntryPxmdentrypx = newMDEntryPx(); Currencycurrency = newCurrency();
  • 3. MDEntrySizemdentrysize = newMDEntrySize(); ExpireDateexpiredate = newExpireDate(); ExpireTimeexpiretime = newExpireTime(); NumberOfOrdersnumberoforders = newNumberOfOrders(); MDEntryPositionNomdentrypositionno = newMDEntryPositionNo(); message.get(nomdentries); message.getGroup(1, group); int list = nomdentries.getValue(); for (uinti = 0; i< list; i++) { message.getGroup(i + 1, group); group.get(mdupdateaction); if (mdupdateaction.getValue() == '2') Console.WriteLine("Enter"); group.get(deletereason); group.get(mdentrytype); group.get(mdentryid); group.get(symbol); group.get(mdentryoriginator); if (mdupdateaction.getValue() == '0') group.get(mdentrypx); group.get(currency); if (mdupdateaction.getValue() == '0') group.get(mdentrysize); } Console.WriteLine("Got Symbol {0} Price {1}", symbol.getValue(), mdentrypx.getValue()); } catch (Exception ex) { Console.WriteLine(ex.Message); } } MarketDataSnapshotFullRefresh This message will be one per MarketDataRequest message. It contains snapshot of market prices. http://btobits.com/fixopaedia/fixdic50/message_Market_Data_Snapshot_Full_Refresh_W_.html Source Code publicoverridevoidonMessage(MarketDataSnapshotFullRefresh message, SessionID session) { string Symbol = message.get(newSymbol()).getValue(); NoMDEntriesnoMDEntries = newNoMDEntries(); message.get(noMDEntries);
  • 4. var group = new QuickFix42.MarketDataSnapshotFullRefresh.NoMDEntries(); MDEntryTypeMDEntryType = newMDEntryType(); MDEntryPxMDEntryPx = newMDEntryPx(); MDEntrySizeMDEntrySize = newMDEntrySize(); message.getGroup(1, group); group.get(MDEntryType); group.get(MDEntryPx); group.get(MDEntrySize); message.getGroup(2, group); group.get(MDEntryType); group.get(MDEntryPx); group.get(MDEntrySize); Console.WriteLine("Symbol {0} Price {1}", Symbol, MDEntryPx); } Market Data Request Reject It is used when the broker cannot honor the Market Data Request, due to business or technical reasons. Fields MDReqRejReason : Reject reason code Text: Reject reason text. I hope this post gives overview of how to capture Market Price from FIX server.