public void addSellOrder(Double sale_price, int sale_size) { if (BuyOrders.Count > 0) { // var SortedBuyOrders = BuyOrders.OrderByDescending(BuyOrder => BuyOrder.Price).ThenBy(BuyOrder => BuyOrder.TimeStamp).ToList(); // BuyOrders = SortedBuyOrders; SellOrder sale; foreach (BuyOrder buy_order in BuyOrders) { // if we have buy order with the same price do the trasaction and add it into Transaction list if (buy_order.Price >= sale_price) { if (buy_order.Size == sale_size) { // do full transacqion // do not add to sellOrders list // remove buyOrder from the buyOrders list sale = new SellOrder(sale_price, sale_size); Transactions.Add(sale); BuyOrders.Remove(buy_order); lastSale = sale_price; break; } else if (buy_order.Size > sale_size) { // do partial transacqion // do not add to sellOrders list // update buyOrder size to the remaining size in buyOrders list int remainingSize = buy_order.Size - sale_size; sale = new SellOrder(sale_price, sale_size); Transactions.Add(sale); buy_order.Size = remainingSize; lastSale = sale_price; break; } else if (buy_order.Size < sale_size) { // do partial transacqion // remove buyOrder from the buyOrders list // add to sellOrders for the remaining size in sellOrders list int remainingSize = sale_size - buy_order.Size; sale = new SellOrder(sale_price, buy_order.Size); Transactions.Add(sale); BuyOrders.Remove(buy_order); lastSale = sale_price; addSellOrder(sale_price, remainingSize); break; // SellOrder sellOrder = new SellOrder(sale_price, remainingSize); // SellOrders.Add(sellOrder); // var SortedSellOrders = SellOrders.OrderBy(SellOrder => SellOrder.Price).ThenBy(SellOrder => SellOrder.TimeStamp).ToList(); // SellOrders = SortedSellOrders; } } else { SellOrder sellOrder = new SellOrder(sale_price, sale_size); SellOrders.Add(sellOrder); var SortedSellOrders = SellOrders.OrderBy(SellOrder => SellOrder.Price).ThenBy(SellOrder => SellOrder.TimeStamp).ToList(); SellOrders = SortedSellOrders; break; } } } else { SellOrder sellOrder = new SellOrder(sale_price, sale_size); SellOrders.Add(sellOrder); var SortedSellOrders = SellOrders.OrderBy(SellOrder => SellOrder.Price).ThenBy(SellOrder => SellOrder.TimeStamp).ToList(); SellOrders = SortedSellOrders; } // market.Notify(); }