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);
        }
Пример #2
0
        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);
        }