private void ResolveBidMatching(TradingOrder tradingOrder) { var matchingAsks = _orderStore .Asks .Where(a => a.Price <= tradingOrder.Price) .OrderBy(_ => _.Price) .ToList(); // best price comes first ResolveMatching(tradingOrder, matchingAsks, (matchingAsk, shareToTrade) => { var trade = new TradeSettled { Price = tradingOrder.Price, Units = shareToTrade, AskOrderId = matchingAsk.OrderId, StockId = _stockId, BidOrderId = tradingOrder.OrderId }; _tradeSettled.Add(trade); }); }
private void ResolveAskMatching(TradingOrder tradingOrder) { var matchingBids = _orderStore .Bids .Where(a => a.Price >= tradingOrder.Price) .OrderByDescending(_ => _.Price) // best price comes first .ToList(); ResolveMatching(tradingOrder, matchingBids, (matchingBid, shareToTrade) => { var trade = new TradeSettled { Price = tradingOrder.Price, Units = shareToTrade, AskOrderId = tradingOrder.OrderId, StockId = _stockId, BidOrderId = matchingBid.OrderId }; _tradeSettled.Add(trade); }); }
public void Settle_Bid_Order_Should_Publish_Event() { //arrange TradeSettled tradeSettled = null; SetupSubscribe <TradeSettled>((ts) => tradeSettled = ts); var bid = NewBid(units: 10, price: 99.99m); var ask = NewAsk(units: 10, price: 99.99m); //act _matcher.Tell(bid); _matcher.Tell(ask); Thread.Sleep(2000); //assert Assert.NotNull(tradeSettled); Assert.Equal(99.99m, tradeSettled.Price); Assert.Equal(10, tradeSettled.Units); Assert.Equal(ask.Order.OrderId, tradeSettled.AskOrderId); Assert.Equal(bid.Order.OrderId, tradeSettled.BidOrderId); }
private static void NotifyTradeSettled(TradeSettled trade) => Notify(trade);