private void HandlerOrder(Order order, Action onSuccess, Action <string> onFailure) { var validation = ValidateOrder(order); if (!validation.IsValid) { onFailure?.Invoke(validation.Reason); return; } var bestBidPrice = _orderStore.BestBid; var bestAskPrice = _orderStore.BestAsk; // Accept bid (buy) and ask (sell) orders of a specified quantity and price for 1 stock var tradingOrder = TradingOrder.New(order); _orderStore.Add(tradingOrder); onSuccess?.Invoke(); // Publishes an event when an order has been accepted (not necessarily matched) NotifyOrderPlaced(order); // Find if any matched, Publishes an event when a bid order has been settled with a matching ask order, partially or otherwise ResolveMatching(tradingOrder); // Publishes an event when the best bid and ask price changes if (IsPriceChanging(bestBidPrice, bestAskPrice)) { NotifyPriceChanged(); } }