private void OnQuotationsResponse(QuotationsResponse response)
        {
            foreach (var quote in response.Quotations)
            {
                var message = new Level1ChangeMessage
                {
                    SecurityId = new SecurityId {
                        Native = quote.SecId
                    },
                    ServerTime = SessionHolder.CurrentTime.Convert(TimeHelper.Moscow),
                };

                message.TryAdd(Level1Fields.AccruedCouponIncome, quote.AccruedIntValue);
                message.TryAdd(Level1Fields.OpenPrice, quote.Open);
                message.TryAdd(Level1Fields.HighPrice, quote.High);
                message.TryAdd(Level1Fields.LowPrice, quote.Low);
                message.TryAdd(Level1Fields.ClosePrice, quote.ClosePrice);
                message.TryAdd(Level1Fields.BidsCount, quote.BidsCount);
                message.TryAdd(Level1Fields.BidsVolume, (decimal?)quote.BidsVolume);
                message.TryAdd(Level1Fields.AsksCount, quote.AsksCount);
                message.TryAdd(Level1Fields.AsksVolume, (decimal?)quote.AsksVolume);
                message.TryAdd(Level1Fields.HighBidPrice, quote.HighBid);
                message.TryAdd(Level1Fields.LowAskPrice, quote.LowAsk);
                message.TryAdd(Level1Fields.Yield, quote.Yield);
                message.TryAdd(Level1Fields.MarginBuy, quote.BuyDeposit);
                message.TryAdd(Level1Fields.MarginSell, quote.SellDeposit);
                message.TryAdd(Level1Fields.HistoricalVolatility, quote.Volatility);
                message.TryAdd(Level1Fields.TheorPrice, quote.TheoreticalPrice);
                message.TryAdd(Level1Fields.Change, quote.Change);
                message.TryAdd(Level1Fields.Volume, (decimal?)quote.VolToday);
                message.TryAdd(Level1Fields.StepPrice, quote.PointCost);
                message.TryAdd(Level1Fields.OpenInterest, (decimal?)quote.OpenInterest);
                message.TryAdd(Level1Fields.TradesCount, quote.TradesCount);

                if (quote.Status != null)
                {
                    message.Add(Level1Fields.State, quote.Status.Value.FromTransaq());
                }


                // Transaq передает только изменения (например, передать только цену сделки, если объем при этом не изменился)

                message.TryAdd(Level1Fields.LastTradePrice, quote.LastTradePrice);
                message.TryAdd(Level1Fields.LastTradeVolume, (decimal?)quote.LastTradeVolume);

                if (quote.LastTradeTime != null)
                {
                    message.Add(Level1Fields.LastTradeTime, quote.LastTradeTime.Value.ApplyTimeZone(TimeHelper.Moscow));
                }

                message.TryAdd(Level1Fields.BestBidPrice, quote.BestBidPrice);
                message.TryAdd(Level1Fields.BestBidVolume, (decimal?)quote.BestBidVolume);

                message.TryAdd(Level1Fields.BestAskPrice, quote.BestAskPrice);
                message.TryAdd(Level1Fields.BestAskVolume, (decimal?)quote.BestAskVolume);

                SendOutMessage(message);
            }
        }
        private void OnProcessLevel1(string[] data)
        {
            var f = Wrapper.FieldsLevel1;

            foreach (var row in data)
            {
                var cols    = row.ToColumns();
                var paperNo = f.PaperNo.GetValue(cols);
                var secId   = new SecurityId {
                    Native = paperNo
                };

                var l1Msg = new Level1ChangeMessage
                {
                    SecurityId = secId,
                    ServerTime = (f.LastUpdateDate.GetValue(cols).Date + f.LastUpdateTime.GetValue(cols).TimeOfDay).ApplyTimeZone(TimeHelper.Moscow)
                };

                l1Msg.Add(Level1Fields.State, f.TradingStatus.GetValue(cols));

                l1Msg.TryAdd(Level1Fields.MarginBuy, f.GoBuy.GetValue(cols));
                l1Msg.TryAdd(Level1Fields.MarginSell, f.GoSell.GetValue(cols));

                l1Msg.TryAdd(Level1Fields.OpenInterest, (decimal)f.OpenPosQty.GetValue(cols));

                var minPrice = f.MinDeal.GetValue(cols);
                var maxPrice = f.MaxDeal.GetValue(cols);

                l1Msg.TryAdd(Level1Fields.OpenPrice, f.OpenPrice.GetValue(cols));
                l1Msg.TryAdd(Level1Fields.ClosePrice, f.ClosePrice.GetValue(cols));
                l1Msg.TryAdd(Level1Fields.HighPrice, maxPrice);
                l1Msg.TryAdd(Level1Fields.LowPrice, minPrice);

                l1Msg.TryAdd(Level1Fields.BestBidPrice, f.Buy.GetValue(cols));
                l1Msg.TryAdd(Level1Fields.BestBidVolume, (decimal)f.BuyQty.GetValue(cols));
                l1Msg.TryAdd(Level1Fields.BestAskPrice, f.Sell.GetValue(cols));
                l1Msg.TryAdd(Level1Fields.BestAskVolume, (decimal)f.SellQty.GetValue(cols));

                l1Msg.TryAdd(Level1Fields.MinPrice, minPrice);
                l1Msg.TryAdd(Level1Fields.MaxPrice, maxPrice);

                l1Msg.TryAdd(Level1Fields.Multiplier, (decimal)f.LotSize.GetValue(cols));

                l1Msg.TryAdd(Level1Fields.ImpliedVolatility, f.Volatility.GetValue(cols));
                l1Msg.TryAdd(Level1Fields.TheorPrice, f.TheorPrice.GetValue(cols));

                l1Msg.TryAdd(Level1Fields.LastTradePrice, f.LastPrice.GetValue(cols));
                l1Msg.TryAdd(Level1Fields.LastTradeVolume, (decimal)f.LastQty.GetValue(cols));

                l1Msg.TryAdd(Level1Fields.PriceStep, f.PriceStep.GetValue(cols));

                l1Msg.TryAdd(Level1Fields.BidsVolume, (decimal)f.BuySQty.GetValue(cols));
                l1Msg.TryAdd(Level1Fields.BidsCount, f.BuyCount.GetValue(cols));
                l1Msg.TryAdd(Level1Fields.AsksVolume, (decimal)f.SellSQty.GetValue(cols));
                l1Msg.TryAdd(Level1Fields.AsksCount, f.SellCount.GetValue(cols));

                SendOutMessage(l1Msg);
            }
        }
        private void OnSessionMarketDataChanged(OrderBookEvent orderBookEvent)
        {
            var time  = TimeHelper.GregorianStart.AddMilliseconds(orderBookEvent.Timestamp).ApplyTimeZone(TimeZoneInfo.Utc);
            var secId = new SecurityId {
                Native = orderBookEvent.InstrumentId
            };

            var l1Msg = new Level1ChangeMessage
            {
                ServerTime = time,
                SecurityId = secId,
            };

            if (orderBookEvent.HasMarketClosePrice)
            {
                l1Msg.Add(Level1Fields.ClosePrice, orderBookEvent.MktClosePrice);
            }

            if (orderBookEvent.HasDailyHighestTradedPrice)
            {
                l1Msg.Add(Level1Fields.HighPrice, orderBookEvent.DailyHighestTradedPrice);
            }

            if (orderBookEvent.HasDailyLowestTradedPrice)
            {
                l1Msg.Add(Level1Fields.LowPrice, orderBookEvent.DailyLowestTradedPrice);
            }

            if (orderBookEvent.HasLastTradedPrice)
            {
                l1Msg.Add(Level1Fields.LastTradePrice, orderBookEvent.LastTradedPrice);
            }

            SendOutMessage(l1Msg);

            SendOutMessage(new QuoteChangeMessage
            {
                SecurityId = secId,
                Bids       = orderBookEvent.BidPrices.Select(p => new QuoteChange(Sides.Buy, p.Price, p.Quantity)),
                Asks       = orderBookEvent.AskPrices.Select(p => new QuoteChange(Sides.Sell, p.Price, p.Quantity)),
                ServerTime = time
            });
        }
        private static Level1ChangeMessage ToLevel2(string value)
        {
            var parts = value.SplitByComma();

            var isBidValid = parts[10] == "T";
            var isAskValid = parts[11] == "T";

            if (!isBidValid && !isAskValid)
            {
                return(null);
            }

            var date = parts[7].ToDateTime("yyyy-MM-dd");

            var l1Msg = new Level1ChangeMessage
            {
                SecurityId = new SecurityId
                {
                    SecurityCode = parts[0],
                    BoardCode    = parts[1]
                },
            };

            // http://www.iqfeed.net/dev/api/docs/ConditionCodes.cfm
            l1Msg.Add(Level1Fields.IsSystem, parts[8] == "52");

            if (isAskValid)
            {
                l1Msg.ServerTime = date.Add(parts[9].To <TimeSpan>()).ApplyTimeZone(TimeHelper.Est);

                l1Msg
                .TryAdd(Level1Fields.BestAskPrice, parts[3].To <decimal>())
                .TryAdd(Level1Fields.BestAskVolume, parts[5].To <decimal>())
                .Add(Level1Fields.BestAskTime, l1Msg.ServerTime);
            }

            if (isBidValid)
            {
                var bidTime = date.Add(parts[6].To <TimeSpan>()).ApplyTimeZone(TimeHelper.Est);

                if (bidTime > l1Msg.ServerTime)
                {
                    l1Msg.ServerTime = bidTime;
                }

                l1Msg
                .TryAdd(Level1Fields.BestBidPrice, parts[2].To <decimal>())
                .TryAdd(Level1Fields.BestBidVolume, parts[4].To <decimal>())
                .Add(Level1Fields.BestBidTime, bidTime);
            }

            return(l1Msg);
        }
        private void OnSecurityChanged(string smartId, Tuple <decimal?, decimal?, DateTime> lastTrade, decimal?open, decimal?high, decimal?low, decimal?close, decimal?volume, QuoteChange bid, QuoteChange ask,
                                       decimal?openInt, Tuple <decimal?, decimal?> goBuySell, Tuple <decimal?, decimal?> goBase, Tuple <decimal?, decimal?> limits, int tradingStatus, Tuple <decimal?, decimal?> volatTheorPrice)
        {
            var secId = new SecurityId {
                Native = smartId
            };

            var message = new Level1ChangeMessage
            {
                SecurityId    = secId,
                ExtensionInfo = new Dictionary <object, object>
                {
                    { SmartComExtensionInfoHelper.SecurityOptionsMargin, goBase.Item1 },
                    { SmartComExtensionInfoHelper.SecurityOptionsSyntheticMargin, goBase.Item2 }
                },
                ServerTime = CurrentTime.Convert(TimeHelper.Moscow),
            };

            message.TryAdd(Level1Fields.LastTradePrice, lastTrade.Item1);
            message.TryAdd(Level1Fields.LastTradeVolume, lastTrade.Item2);
            message.Add(Level1Fields.LastTradeTime, lastTrade.Item3.ApplyTimeZone(TimeHelper.Moscow));

            var prevQuotes = _bestQuotes.TryGetValue(secId);

            if (bid.Price != 0)
            {
                message.Add(Level1Fields.BestBidPrice, bid.Price);

                if (prevQuotes != null && prevQuotes.First != null && prevQuotes.First.Item1 == bid.Price)
                {
                    message.Add(Level1Fields.BestBidVolume, prevQuotes.First.Item2);
                }
            }

            if (ask.Price != 0)
            {
                message.Add(Level1Fields.BestAskPrice, ask.Price);

                if (prevQuotes != null && prevQuotes.Second != null && prevQuotes.Second.Item1 == ask.Price)
                {
                    message.Add(Level1Fields.BestAskVolume, prevQuotes.Second.Item2);
                }
            }

            message.TryAdd(Level1Fields.BidsVolume, bid.Volume);
            message.TryAdd(Level1Fields.AsksVolume, ask.Volume);

            message.TryAdd(Level1Fields.OpenPrice, open);
            message.TryAdd(Level1Fields.LowPrice, low);
            message.TryAdd(Level1Fields.HighPrice, high);
            message.TryAdd(Level1Fields.ClosePrice, close);

            message.TryAdd(Level1Fields.MinPrice, limits.Item1);
            message.TryAdd(Level1Fields.MaxPrice, limits.Item2);

            message.TryAdd(Level1Fields.MarginBuy, goBuySell.Item1);
            message.TryAdd(Level1Fields.MarginSell, goBuySell.Item2);
            message.TryAdd(Level1Fields.OpenInterest, openInt);

            message.TryAdd(Level1Fields.ImpliedVolatility, volatTheorPrice.Item1);
            message.TryAdd(Level1Fields.TheorPrice, volatTheorPrice.Item2);

            message.TryAdd(Level1Fields.Volume, volume);

            message.Add(Level1Fields.State, tradingStatus == 0 ? SecurityStates.Trading : SecurityStates.Stoped);

            SendOutMessage(message);
        }
		private static Level1ChangeMessage ToLevel2(string value)
		{
			var parts = value.SplitByComma();

			var isBidValid = parts[10] == "T";
			var isAskValid = parts[11] == "T";

			if (!isBidValid && !isAskValid)
				return null;

			var date = parts[7].ToDateTime("yyyy-MM-dd");

			var l1Msg = new Level1ChangeMessage
			{
				SecurityId = new SecurityId
				{
					SecurityCode = parts[0],
					BoardCode = parts[1]
				},
			};

			// http://www.iqfeed.net/dev/api/docs/ConditionCodes.cfm
			l1Msg.Add(Level1Fields.IsSystem, parts[8] == "52");

			if (isAskValid)
			{
				l1Msg.ServerTime = date.Add(parts[9].To<TimeSpan>()).ApplyTimeZone(TimeHelper.Est);

				l1Msg
					.TryAdd(Level1Fields.BestAskPrice, parts[3].To<decimal>())
					.TryAdd(Level1Fields.BestAskVolume, parts[5].To<decimal>())
					.Add(Level1Fields.BestAskTime, l1Msg.ServerTime);
			}

			if (isBidValid)
			{
				var bidTime = date.Add(parts[6].To<TimeSpan>()).ApplyTimeZone(TimeHelper.Est);

				if (bidTime > l1Msg.ServerTime)
					l1Msg.ServerTime = bidTime;

				l1Msg
					.TryAdd(Level1Fields.BestBidPrice, parts[2].To<decimal>())
					.TryAdd(Level1Fields.BestBidVolume, parts[4].To<decimal>())
					.Add(Level1Fields.BestBidTime, bidTime);
			}

			return l1Msg;
		}
		private void OnSecurityChanged(string smartId, Tuple<decimal, decimal, DateTime> lastTrade, decimal open, decimal high, decimal low, decimal close, decimal volume, QuoteChange bid, QuoteChange ask,
			decimal openInt, Tuple<decimal, decimal> goBuySell, Tuple<decimal, decimal> goBase, Tuple<decimal, decimal> limits, int tradingStatus, Tuple<decimal, decimal> volatTheorPrice)
		{
			var secId = new SecurityId { Native = smartId };

			var message = new Level1ChangeMessage
			{
				SecurityId = secId,
				ExtensionInfo = new Dictionary<object, object>
				{
					{ SmartComExtensionInfoHelper.SecurityOptionsMargin, goBase.Item1 },
					{ SmartComExtensionInfoHelper.SecurityOptionsSyntheticMargin, goBase.Item2 }
				},
				ServerTime = CurrentTime.Convert(TimeHelper.Moscow),
			};

			message.TryAdd(Level1Fields.LastTradePrice, lastTrade.Item1);
			message.TryAdd(Level1Fields.LastTradeVolume, lastTrade.Item2);
			message.Add(Level1Fields.LastTradeTime, lastTrade.Item3.ApplyTimeZone(TimeHelper.Moscow));

			var prevQuotes = _bestQuotes.TryGetValue(secId);

			if (bid.Price != 0)
			{
				message.Add(Level1Fields.BestBidPrice, bid.Price);

				if (prevQuotes != null && prevQuotes.First != null && prevQuotes.First.Item1 == bid.Price)
					message.Add(Level1Fields.BestBidVolume, prevQuotes.First.Item2);
			}

			if (ask.Price != 0)
			{
				message.Add(Level1Fields.BestAskPrice, ask.Price);

				if (prevQuotes != null && prevQuotes.Second != null && prevQuotes.Second.Item1 == ask.Price)
					message.Add(Level1Fields.BestAskVolume, prevQuotes.Second.Item2);
			}

			message.TryAdd(Level1Fields.BidsVolume, bid.Volume);
			message.TryAdd(Level1Fields.AsksVolume, ask.Volume);

			message.TryAdd(Level1Fields.OpenPrice, open);
			message.TryAdd(Level1Fields.LowPrice, low);
			message.TryAdd(Level1Fields.HighPrice, high);
			message.TryAdd(Level1Fields.ClosePrice, close);

			message.TryAdd(Level1Fields.MinPrice, limits.Item1);
			message.TryAdd(Level1Fields.MaxPrice, limits.Item2);

			message.TryAdd(Level1Fields.MarginBuy, goBuySell.Item1);
			message.TryAdd(Level1Fields.MarginSell, goBuySell.Item2);
			message.TryAdd(Level1Fields.OpenInterest, openInt);

			message.TryAdd(Level1Fields.ImpliedVolatility, volatTheorPrice.Item1);
			message.TryAdd(Level1Fields.TheorPrice, volatTheorPrice.Item2);

			message.TryAdd(Level1Fields.Volume, volume);

			message.Add(Level1Fields.State, tradingStatus == 0 ? SecurityStates.Trading : SecurityStates.Stoped);

			SendOutMessage(message);
		}
		private void OnSessionMarketDataChanged(OrderBookEvent orderBookEvent)
		{
			var time = TimeHelper.GregorianStart.AddMilliseconds(orderBookEvent.Timestamp).ApplyTimeZone(TimeZoneInfo.Utc);
			var secId = new SecurityId { Native = orderBookEvent.InstrumentId };

			var l1Msg = new Level1ChangeMessage
			{
				ServerTime = time,
				SecurityId = secId,
			};

			if (orderBookEvent.HasMarketClosePrice)
				l1Msg.Add(Level1Fields.ClosePrice, orderBookEvent.MktClosePrice);

			if (orderBookEvent.HasDailyHighestTradedPrice)
				l1Msg.Add(Level1Fields.HighPrice, orderBookEvent.DailyHighestTradedPrice);

			if (orderBookEvent.HasDailyLowestTradedPrice)
				l1Msg.Add(Level1Fields.LowPrice, orderBookEvent.DailyLowestTradedPrice);

			if (orderBookEvent.HasLastTradedPrice)
			{
				l1Msg.Add(Level1Fields.LastTradePrice, orderBookEvent.LastTradedPrice);
			}

			SendOutMessage(l1Msg);

			SendOutMessage(new QuoteChangeMessage
			{
				SecurityId = secId,
				Bids = orderBookEvent.BidPrices.Select(p => new QuoteChange(Sides.Buy, p.Price, p.Quantity)),
				Asks = orderBookEvent.AskPrices.Select(p => new QuoteChange(Sides.Sell, p.Price, p.Quantity)),
				ServerTime = time
			});
		}
		private void OnQuotationsResponse(QuotationsResponse response)
		{
			foreach (var quote in response.Quotations)
			{
				var message = new Level1ChangeMessage
				{
					SecurityId = new SecurityId { Native = quote.SecId },
					ServerTime = CurrentTime.Convert(TimeHelper.Moscow),
				};

				message.TryAdd(Level1Fields.AccruedCouponIncome, quote.AccruedIntValue);
				message.TryAdd(Level1Fields.OpenPrice, quote.Open);
				message.TryAdd(Level1Fields.HighPrice, quote.High);
				message.TryAdd(Level1Fields.LowPrice, quote.Low);
				message.TryAdd(Level1Fields.ClosePrice, quote.ClosePrice);
				message.TryAdd(Level1Fields.BidsCount, quote.BidsCount);
				message.TryAdd(Level1Fields.BidsVolume, (decimal?)quote.BidsVolume);
				message.TryAdd(Level1Fields.AsksCount, quote.AsksCount);
				message.TryAdd(Level1Fields.AsksVolume, (decimal?)quote.AsksVolume);
				message.TryAdd(Level1Fields.HighBidPrice, quote.HighBid);
				message.TryAdd(Level1Fields.LowAskPrice, quote.LowAsk);
				message.TryAdd(Level1Fields.Yield, quote.Yield);
				message.TryAdd(Level1Fields.MarginBuy, quote.BuyDeposit);
				message.TryAdd(Level1Fields.MarginSell, quote.SellDeposit);
				message.TryAdd(Level1Fields.HistoricalVolatility, quote.Volatility);
				message.TryAdd(Level1Fields.TheorPrice, quote.TheoreticalPrice);
				message.TryAdd(Level1Fields.Change, quote.Change);
				message.TryAdd(Level1Fields.Volume, (decimal?)quote.VolToday);
				message.TryAdd(Level1Fields.StepPrice, quote.PointCost);
				message.TryAdd(Level1Fields.OpenInterest, (decimal?)quote.OpenInterest);
				message.TryAdd(Level1Fields.TradesCount, quote.TradesCount);

				if (quote.Status != null)
					message.Add(Level1Fields.State, quote.Status.Value.FromTransaq());

				
				// Transaq передает только изменения (например, передать только цену сделки, если объем при этом не изменился)

				message.TryAdd(Level1Fields.LastTradePrice, quote.LastTradePrice);
				message.TryAdd(Level1Fields.LastTradeVolume, (decimal?)quote.LastTradeVolume);

				if (quote.LastTradeTime != null)
					message.Add(Level1Fields.LastTradeTime, quote.LastTradeTime.Value.ToDto());

				message.TryAdd(Level1Fields.BestBidPrice, quote.BestBidPrice);
				message.TryAdd(Level1Fields.BestBidVolume, (decimal?)quote.BestBidVolume);

				message.TryAdd(Level1Fields.BestAskPrice, quote.BestAskPrice);
				message.TryAdd(Level1Fields.BestAskVolume, (decimal?)quote.BestAskVolume);

				SendOutMessage(message);
			}
		}
		private void OnProcessLevel1(string[] data)
		{
			var f = Wrapper.FieldsLevel1;

			foreach (var row in data)
			{
				var cols = row.ToColumns();
				var paperNo = f.PaperNo.GetValue(cols);
				var secId = new SecurityId { Native = paperNo };

				var l1Msg = new Level1ChangeMessage
				{
					SecurityId = secId,
					ServerTime = (f.LastUpdateDate.GetValue(cols).Date + f.LastUpdateTime.GetValue(cols).TimeOfDay).ApplyTimeZone(TimeHelper.Moscow)
				};

				l1Msg.Add(Level1Fields.State, f.TradingStatus.GetValue(cols));

				l1Msg.TryAdd(Level1Fields.MarginBuy, f.GoBuy.GetValue(cols));
				l1Msg.TryAdd(Level1Fields.MarginSell, f.GoSell.GetValue(cols));

				l1Msg.TryAdd(Level1Fields.OpenInterest, (decimal)f.OpenPosQty.GetValue(cols));

				var minPrice = f.MinDeal.GetValue(cols);
				var maxPrice = f.MaxDeal.GetValue(cols);

				l1Msg.TryAdd(Level1Fields.OpenPrice, f.OpenPrice.GetValue(cols));
				l1Msg.TryAdd(Level1Fields.ClosePrice, f.ClosePrice.GetValue(cols));
				l1Msg.TryAdd(Level1Fields.HighPrice, maxPrice);
				l1Msg.TryAdd(Level1Fields.LowPrice, minPrice);

				l1Msg.TryAdd(Level1Fields.BestBidPrice, f.Buy.GetValue(cols));
				l1Msg.TryAdd(Level1Fields.BestBidVolume, (decimal)f.BuyQty.GetValue(cols));
				l1Msg.TryAdd(Level1Fields.BestAskPrice, f.Sell.GetValue(cols));
				l1Msg.TryAdd(Level1Fields.BestAskVolume, (decimal)f.SellQty.GetValue(cols));

				l1Msg.TryAdd(Level1Fields.MinPrice, minPrice);
				l1Msg.TryAdd(Level1Fields.MaxPrice, maxPrice);

				l1Msg.TryAdd(Level1Fields.Multiplier, (decimal)f.LotSize.GetValue(cols));

				l1Msg.TryAdd(Level1Fields.ImpliedVolatility, f.Volatility.GetValue(cols));
				l1Msg.TryAdd(Level1Fields.TheorPrice, f.TheorPrice.GetValue(cols));

				l1Msg.TryAdd(Level1Fields.LastTradePrice, f.LastPrice.GetValue(cols));
				l1Msg.TryAdd(Level1Fields.LastTradeVolume, (decimal)f.LastQty.GetValue(cols));

				l1Msg.TryAdd(Level1Fields.PriceStep, f.PriceStep.GetValue(cols));

				l1Msg.TryAdd(Level1Fields.BidsVolume, (decimal)f.BuySQty.GetValue(cols));
				l1Msg.TryAdd(Level1Fields.BidsCount, f.BuyCount.GetValue(cols));
				l1Msg.TryAdd(Level1Fields.AsksVolume, (decimal)f.SellSQty.GetValue(cols));
				l1Msg.TryAdd(Level1Fields.AsksCount, f.SellCount.GetValue(cols));

				SendOutMessage(l1Msg);
			}
		}