/// <summary> /// Calculate ticker info from recent trade and update it /// </summary> /// <param name="trade"></param> public void CalculateTickerInfo(Trade trade) { var tickerReadModel = _tickerInfoRepository.GetTickerInfoByCurrencyPair(trade.CurrencyPair); if (tickerReadModel == null) { TickerInfoReadModel model = new TickerInfoReadModel(trade.CurrencyPair, trade.ExecutionPrice.Value, trade.ExecutedVolume.Value); //model.CurrencyPair = trade.CurrencyPair; _persistanceRepository.SaveOrUpdate(model); } else { object[] todays = CalculateTodaysData(trade); log.Debug("Recevied today:" + todays); object[] last24Hours = Calculate24HoursData(trade); log.Debug("Received 24Hours:" + last24Hours); decimal openingPrice = 0; decimal lastTradePrice = 0; decimal lastTradeVolume = 0; IList <TradeReadModel> trades = _tradeRepository.GetTradesBetweenDates(trade.ExecutionTime, DateTime.Today, trade.CurrencyPair); if (trades != null) { if (trades.Count > 0) { log.Debug("Total Trades=" + trades.Count); openingPrice = trades[trades.Count - 1].Price; lastTradePrice = trades[0].Price; lastTradeVolume = trades[0].Volume; } } tickerReadModel.UpdateTickerInfo(todays, last24Hours, openingPrice, lastTradePrice, lastTradeVolume); _persistanceRepository.SaveOrUpdate(tickerReadModel); } }
public void ValidateCancelOrderCommand_IfOrderIdAndTraderIdIsValidAndOrderStatusIsNotCompleteOrCancelled_CommandWillBeValidated() { Order order = OrderFactory.CreateOrder("1234", "XBTUSD", "limit", "buy", 5, 10, new StubbedOrderIdGenerator()); OrderReadModel model = ReadModelAdapter.GetOrderReadModel(order); _persistanceRepository.SaveOrUpdate(model); CancelOrderCommand command = new CancelOrderCommand(order.OrderId, order.TraderId); ICancelOrderCommandValidation validation = new CancelOrderCommandValidation(_orderRepository); Assert.True(validation.ValidateCancelOrderCommand(command)); }
public void SaveTradeReadModel_IfSaveOrUpdateMethodIsCalled_ItShouldGetSavedInTheDatabase() { Order buyOrder = OrderFactory.CreateOrder("1234", "XBTUSD", "market", "buy", 5, 0, new StubbedOrderIdGenerator()); Order sellOrder = OrderFactory.CreateOrder("1234", "XBTUSD", "market", "sell", 5, 0, new StubbedOrderIdGenerator()); //Trade trade=new Trade("XBTUSD",new Price(100),new Volume(10),DateTime.Now,buyOrder,sellOrder); Trade trade = TradeFactory.GenerateTrade("XBTUSD", new Price(100), new Volume(10), buyOrder, sellOrder); TradeReadModel model = ReadModelAdapter.GetTradeReadModel(trade); _persistanceRepository.SaveOrUpdate(model); TradeReadModel getSavedModel = _tradeRepository.GetById(trade.TradeId.Id.ToString()); Assert.NotNull(getSavedModel); AssertAreEqual(getSavedModel, model); }
/// <summary> /// Receives trade when events are raised /// </summary> /// <param name="trade"></param> void OnTradeArrived(Trade trade) { _persistanceRepository.SaveOrUpdate(ReadModelAdapter.GetTradeReadModel(trade)); _ohlcCalculation.CalculateAndPersistOhlc(trade); _tickerInfoCalculation.CalculateTickerInfo(trade); Tuple <string, string> currencies = CurrencySplitterService.SplitCurrencyPair(trade.CurrencyPair); // Update the balance on hte Funds BC _balanceValidationService.TradeExecuted(currencies.Item1, currencies.Item2, trade.ExecutedVolume.Value, trade.ExecutionPrice.Value, trade.ExecutionTime, trade.TradeId.Id, trade.BuyOrder.TraderId.Id, trade.SellOrder.TraderId.Id, trade.BuyOrder.OrderId.Id, trade.SellOrder.OrderId.Id); }
public void CalculateAndPersistOhlc(Trade latestTrade) { DateTime ohlcdDateTime = latestTrade.ExecutionTime.AddSeconds(-1 * latestTrade.ExecutionTime.Second); //IList<TradeReadModel> trades=_tradeRepository.GetTradesBetweenDates(latestTrade.ExecutionTime,ohlcdDateTime); OhlcReadModel model = _ohlcRepository.GetOhlcByDateTime(ohlcdDateTime.AddMinutes(1)); if (model == null) { //means it is 1st trade of that minute OhlcReadModel newOhlcReadModel = new OhlcReadModel(latestTrade.CurrencyPair, ohlcdDateTime.AddMinutes(1), latestTrade.ExecutionPrice.Value, latestTrade.ExecutionPrice.Value, latestTrade.ExecutionPrice.Value, latestTrade.ExecutionPrice.Value, latestTrade.ExecutedVolume.Value); _persistanceRepository.SaveOrUpdate(newOhlcReadModel); } else { // IList<TradeReadModel> trades = _tradeRepository.GetTradesBetweenDates(latestTrade.ExecutionTime, // ohlcdDateTime); //decimal volume = CalculateVolume(trades); //update the ohlc model.UpdateOhlc(latestTrade); _persistanceRepository.SaveOrUpdate(model); } }
/// <summary> /// Handles the event of change in orders /// </summary> /// <param name="order"></param> void OnOrderStatusChanged(Order order) { _persistanceRepository.SaveOrUpdate(ReadModelAdapter.GetOrderReadModel(order)); // If the order has been cancelled, send the info to Funds BC so that the funds can be updated if (order.OrderState == OrderState.Cancelled) { // First split the curreny pair into base and quote currency Tuple <string, string> splittedCurrencyPair = CurrencySplitterService.SplitCurrencyPair(order.CurrencyPair); if (!string.IsNullOrEmpty(splittedCurrencyPair.Item1) && !string.IsNullOrEmpty(splittedCurrencyPair.Item2)) { // Send to the Infrastructure service which will communicate cross Bounded Context _balanceValidationService.OrderCancelled(splittedCurrencyPair.Item1, splittedCurrencyPair.Item2, order.TraderId.Id, order.OrderSide.ToString(), order.OrderId.Id, order.OpenQuantity.Value, order.Price.Value); } } }
public void SaveOrderReadModel_IfSaveOrUpdateMethodIsCalled_ItShouldGetSavedInTheDatabase() { Order order = OrderFactory.CreateOrder("1234", "XBTUSD", "limit", "buy", 5, 10, new StubbedOrderIdGenerator()); string id = DateTime.Now.ToString(); order.OrderState = OrderState.Complete; OrderReadModel model = ReadModelAdapter.GetOrderReadModel(order); _persistanceRepository.SaveOrUpdate(model); OrderReadModel getReadModel = _orderRepository.GetOrderById(order.OrderId.Id.ToString()); Assert.NotNull(getReadModel); AssertAreEqual(getReadModel, model); Assert.NotNull(getReadModel.ClosingDateTime); }