/// <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));
        }
示例#3
0
        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);
        }
示例#4
0
        /// <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);
        }