Beispiel #1
0
        private static void ProcessOrder(Order order)
        {
            // Update timestamp to server time
            order.Timestamp = DateTime.UtcNow;

            // Try to match the order
            var orderBook = _orderBooks[order.Symbol];
            var matches   = orderBook.Orders
                            .Where(bookOrder => bookOrder.OrderSide != order.OrderSide &&
                                   (order.OrderSide == OrderSide.Buy ? bookOrder.Price <= order.Price : bookOrder.Price >= order.Price) &&
                                   bookOrder.Quantity == order.Quantity) // TODO: temporary (remove when handle partial fills)
                            .OrderBy(bookOrder => bookOrder.Price)
                            .ThenBy(bookOrder => bookOrder.Timestamp)
                            .ToList();

            // TODO: handle partial fills (execute some trades and put the rest of the order in the queue)

            if (matches.Any())
            {
                // Delete from orders if matched and broadcast the trade to everyone
                var match = matches.First();
                orderBook.Orders.Remove(match);
                BroadcastProcessedOrder(ProcessedOrder.CreateFromOrder(match));
                BroadcastProcessedOrder(ProcessedOrder.CreateFromOrder(order));
            }
            else
            {
                // Put in order book if not matched
                orderBook.Orders.Add(order);
                BroadcastOrderAddedToOrderBook(order);
            }
        }