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);
            }
        }
        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);
        }
Beispiel #3
0
 private static void BroadcastProcessedOrder(ProcessedOrder order)
 {
     _txMessageQueue.Send(order);
 }