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); } }
private static List <IReadOnlyOrder> ConvertPurchaseOrderToIOrders(List <PurchaseOrder> purchaseOrders) { List <IReadOnlyOrder> orders = new List <IReadOnlyOrder>(); foreach (var purchase in purchaseOrders) { ICustomer customer = new Library.Model.Customer(purchase.Customer.FirstName, purchase.Customer.LastName, purchase.CustomerId); ILocation location = new Location( name: purchase.StoreLocation.Name, address: purchase.StoreLocation.Address.Print(), inventory: new Dictionary <IProduct, int>(), id: purchase.StoreLocation.Id ); Dictionary <IProduct, int> productQuantities = new Dictionary <IProduct, int>(); foreach (var line in purchase.OrderLines) { IProduct product = new Library.Model.Product(line.Product.Name, line.Product.Category, line.PurchaseUnitPrice, line.Product.Id); productQuantities.Add(product, line.Quantity); } var order = new ProcessedOrder(customer, location, productQuantities, purchase.DateProcessed, purchase.Id); orders.Add(order); } return(orders); }
private static void BroadcastProcessedOrder(ProcessedOrder order) { _txMessageQueue.Send(order); }