private void ProcessMarketDataFullRefresh(Message msg) { Debug.Assert(MsgType.Market_Data_Snapshot_Full_Refresh == msg.Type); MarketDataUpdate update = new MarketDataUpdate(); string symbol = msg.Get(Tags.Symbol); bool isPriceChanged = false; Group mdDEntries = msg.GetGroup(Tags.NoMDEntries); for (int i = 0; i < mdDEntries.NumberOfInstances; ++i) { string priceValue = mdDEntries.Get(Tags.MDEntryPx, i); if (null != priceValue) { double price; if (double.TryParse(priceValue, NumberStyles.Number, CultureInfo.InvariantCulture, out price)) { double size = 0; string sizeValue = mdDEntries.Get(Tags.MDEntrySize, i); if (!string.IsNullOrEmpty(sizeValue)) { double.TryParse(sizeValue, NumberStyles.Number, CultureInfo.InvariantCulture, out size); } string entryType = mdDEntries.Get(Tags.MDEntryType, i); if (MDEntryType.Bid == entryType) { if (update.Bid != price || update.BidSize != size) { update.Bid = price; update.BidSize = size; isPriceChanged = true; } } else if (MDEntryType.Offer == entryType) { if (update.Ask != price || update.AskSize != size) { update.Ask = price; update.AskSize = size; isPriceChanged = true; } } else if (MDEntryType.Trade == entryType) { TradeArgs rv = new TradeArgs(symbol, price, size); if (TradeReceived != null) { TradeReceived(this, rv); } } } } } if (isPriceChanged) { PriceChangeArgs rv = new PriceChangeArgs(symbol, update.Bid, update.BidSize, update.Ask, update.AskSize); if (PriceChange != null) { PriceChange(this, rv); } } }
private void ProcessMarketDataIncrementalRefresh(Message msg) { Debug.Assert(MsgType.Market_Data_Incremental_Refresh == msg.Type); string mdReqID = msg.Get(Tags.MDReqID); MarketDataUpdate update; lock (lastMD) { if (!lastMD.TryGetValue(mdReqID, out update)) { update = new MarketDataUpdate(); lastMD.Add(mdReqID, update); } } string symbol = null; bool isPriceChanged = false; Group mdDEntries = msg.GetGroup(Tags.NoMDEntries); for (int i = 0; i < mdDEntries.NumberOfInstances; ++i) { if (null == symbol) { symbol = mdDEntries.Get(Tags.Symbol, i); } else { Debug.Assert(mdDEntries.Get(Tags.Symbol, i) == symbol); } string priceValue = mdDEntries.Get(Tags.MDEntryPx, i); if (null != priceValue) { double price; if (double.TryParse(priceValue, NumberStyles.Number, System.Globalization.CultureInfo.InvariantCulture, out price)) { double size = 0; string sizeValue = mdDEntries.Get(Tags.MDEntrySize, i); if (!string.IsNullOrEmpty(sizeValue)) { double.TryParse(sizeValue, NumberStyles.Number, CultureInfo.InvariantCulture, out size); } string entryType = mdDEntries.Get(Tags.MDEntryType, i); if (MDEntryType.Bid == entryType) { if (update.Bid != price) { update.Bid = price; update.BidSize = size; isPriceChanged = true; } } else if (MDEntryType.Offer == entryType) { if (update.Ask != price) { update.Ask = price; update.AskSize = size; isPriceChanged = true; } } else if (MDEntryType.Trade == entryType) { TradeArgs rv = new TradeArgs(symbol, price, size); if (TradeReceived != null) { TradeReceived(this, rv); } } } } } if (isPriceChanged) { PriceChangeArgs rv = new PriceChangeArgs(symbol, update.Bid, update.BidSize, update.Ask, update.AskSize); if (PriceChange != null) { PriceChange(this, rv); } } }