Пример #1
0
 private void RemoveEmptyPriceLevel(QuantityTrackingPriceLevel priceLevel, SortedDictionary <Price, QuantityTrackingPriceLevel> side, bool isBuy)
 {
     if (priceLevel.OrderCount == 0)
     {
         side.Remove(priceLevel.Price);
         if (isBuy && _bestBidPriceLevel.Price == priceLevel.Price)
         {
             _bestBidPriceLevel = null;
             if (side.Count > 0)
             {
                 var keyval = side.FirstOrDefault();
                 _bestBidPriceLevel = keyval.Value;
             }
         }
         else if (!isBuy && _bestAskPriceLevel.Price == priceLevel.Price)
         {
             _bestAskPriceLevel = null;
             if (side.Count > 0)
             {
                 var keyval = side.FirstOrDefault();
                 _bestAskPriceLevel = keyval.Value;
             }
         }
     }
 }
Пример #2
0
 private static QuantityTrackingPriceLevel GetPriceLevel(Price price, SortedDictionary <Price, QuantityTrackingPriceLevel> side)
 {
     if (!side.TryGetValue(price, out QuantityTrackingPriceLevel priceLevel))
     {
         priceLevel = new QuantityTrackingPriceLevel(price);
         side.Add(price, priceLevel);
     }
     return(priceLevel);
 }
Пример #3
0
        public bool FillOrder(Order order, Quantity quantity)
        {
            SortedDictionary <Price, QuantityTrackingPriceLevel> side = order.IsBuy ? _bidSide : _askSide;
            QuantityTrackingPriceLevel priceLevel = side[order.Price];
            bool orderFilled = priceLevel.Fill(order, quantity);

            RemoveEmptyPriceLevel(priceLevel, side, order.IsBuy);
            return(orderFilled);
        }
Пример #4
0
        public Order GetBestBuyOrderToMatch(bool isBuy)
        {
            QuantityTrackingPriceLevel bestPriceLevel = isBuy ? _bestBidPriceLevel : _bestAskPriceLevel;

            if (bestPriceLevel != null)
            {
                return(bestPriceLevel.First);
            }
            return(null);
        }
Пример #5
0
 public void AddOrderOpenBook(Order order)
 {
     order.Sequnce = ++_sequence;
     if (order.IsBuy)
     {
         QuantityTrackingPriceLevel priceLevel = GetPriceLevel(order.Price, _bidSide);
         priceLevel.AddOrder(order);
         if (_bestBidPriceLevel == null || order.Price > _bestBidPriceLevel.Price)
         {
             _bestBidPriceLevel = priceLevel;
         }
     }
     else
     {
         QuantityTrackingPriceLevel priceLevel = GetPriceLevel(order.Price, _askSide);
         priceLevel.AddOrder(order);
         if (_bestAskPriceLevel == null || order.Price < _bestAskPriceLevel.Price)
         {
             _bestAskPriceLevel = priceLevel;
         }
     }
 }