예제 #1
0
        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);
                }
            }
        }
예제 #2
0
        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);
                }
            }
        }