public async Task CloseOrderAsync(string accountId, string orderId) { var account = await _accountInfoRepository.GetByIdAsync(accountId); var activeOrder = await _marketOrderRepository.GetAsync(accountId, orderId); var assetPair = await _dictionaryProxy.GetAssetPairByIdAsync(activeOrder.AssetPairId); var quote = await _assetPairQuoteRepository.GetByIdAsync(activeOrder.AssetPairId); var transactionHistory = new TransactionHistory { AccountId = activeOrder.ClientId, AssetPairId = activeOrder.AssetPairId, CompletedAt = DateTime.UtcNow, TransactionId = activeOrder.Id, Price = activeOrder.OrderAction == OrderAction.Buy ? quote.Ask : quote.Bid }; var profitLoss = await _orderCalculator.CalculateProfitLossAsync(activeOrder.Price, transactionHistory.Price, activeOrder.Volume, assetPair, account.BaseAssetId); transactionHistory.ProfitLoss = profitLoss; await _transactionHistoryRepository.AddAsync(transactionHistory); await _marketOrderRepository.DeleteAsync(accountId, orderId); account.Balance += profitLoss; await _accountInfoRepository.UpdateAsync(account); await _matchingEngineEventSubscriber.AccountUpdatedAsync(accountId); }
private async Task <List <OrderBook> > GetOrderBooks() { var assetPairQuotes = await _assetPairQuoteRepository.GetAllAsync(); var orderBook = new List <OrderBook>(); foreach (var assetPairQuote in assetPairQuotes) { var assetPair = await _dictionaryProxy.GetAssetPairByIdAsync(assetPairQuote.AssetPairId); var significantDigit = Math.Pow(10, -assetPair.Accuracy); var sign = _rnd.Next(0, 1) * 2 - 1; var ask = assetPairQuote.Ask + sign * significantDigit; var bid = assetPairQuote.Bid + sign * significantDigit; var orderBookItemSell = new OrderBook { AssetPair = assetPair, Price = ask, OrderAction = OrderAction.Sell, Volume = -1 * _rnd.Next(500, 100000) }; var orderBookItemBuy = new OrderBook { AssetPair = assetPair, Price = bid, OrderAction = OrderAction.Buy, Volume = _rnd.Next(500, 100000) }; orderBook.Add(orderBookItemSell); orderBook.Add(orderBookItemBuy); } return(orderBook); }