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; } } } }
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); }
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); }
public Order GetBestBuyOrderToMatch(bool isBuy) { QuantityTrackingPriceLevel bestPriceLevel = isBuy ? _bestBidPriceLevel : _bestAskPriceLevel; if (bestPriceLevel != null) { return(bestPriceLevel.First); } return(null); }
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; } } }