コード例 #1
0
        public async Task Publish(MarketOrderWithTrades marketOrderWithTrades)
        {
            if (marketOrderWithTrades == null)
            {
                return;
            }

            var clientId = await _clientAccountClient.GetClientByWalletAsync(marketOrderWithTrades.Order.ClientId);

            var order = await _ordersConverter.ConvertAsync(marketOrderWithTrades.Order);

            PublishOrdersToClient(clientId, new[] { order });
        }
コード例 #2
0
        public async Task HandleMarketOrderSell()
        {
            AccountEntity testAccount = (AccountEntity)await this.AccountRepository.TryGetAsync(this.TestAccountId1);

            Assert.NotNull(testAccount);
            BalanceDTO accountBalance1 = testAccount.BalancesParsed.Where(b => b.Asset == this.TestAsset1).FirstOrDefault();

            Assert.NotNull(accountBalance1);
            BalanceDTO accountBalance2 = testAccount.BalancesParsed.Where(b => b.Asset == this.TestAsset2).FirstOrDefault();

            Assert.NotNull(accountBalance2);

            string badMarketOrderId = Guid.NewGuid().ToString();
            string marketOrderId    = Guid.NewGuid().ToString();
            double volume           = 0.1;
            bool   isStraight       = true;
            double reservedVolume   = 0.0;

            //Attempt bad buy
            string badMarketOrderResponse = await this.Consumer.Client.HandleMarketOrderAsync(
                badMarketOrderId, this.TestAccountId1, this.TestAssetPair.Id, OrderAction.Sell, accountBalance1.Balance + 10, isStraight, reservedVolume);

            Assert.NotNull(badMarketOrderResponse);

            MarketOrderWithTrades badMessage = (MarketOrderWithTrades)await this.WaitForRabbitMQ <MarketOrderWithTrades>(
                o => o.order.externalId == badMarketOrderId);

            Assert.NotNull(badMessage);
            Assert.True(badMessage.order.id == badMarketOrderResponse);
            Assert.True(badMessage.order.clientId == this.TestAccountId1);
            Assert.True(badMessage.order.assetPairId == this.TestAssetPair.Id);
            Assert.True(badMessage.order.straight == isStraight);
            Assert.True(badMessage.order.volume == (accountBalance1.Balance + 10) * -1);
            Assert.True(badMessage.order.reservedLimitVolume == reservedVolume);

            Assert.True(badMessage.order.status == "NotEnoughFunds");

            //Attempt proper sell
            string marketOrderResponse = await this.Consumer.Client.HandleMarketOrderAsync(
                marketOrderId, this.TestAccountId1, this.TestAssetPair.Id, OrderAction.Sell, volume, isStraight, reservedVolume);

            Assert.NotNull(marketOrderResponse);

            MarketOrderWithTrades message = (MarketOrderWithTrades)await this.WaitForRabbitMQ <MarketOrderWithTrades>(
                o => o.order.externalId == marketOrderId);

            Assert.NotNull(message);
            Assert.True(message.order.id == marketOrderResponse);
            Assert.True(message.order.clientId == this.TestAccountId1);
            Assert.True(message.order.assetPairId == this.TestAssetPair.Id);
            Assert.True(message.order.straight == isStraight);
            Assert.True(message.order.volume == volume * -1);
            Assert.True(message.order.reservedLimitVolume == reservedVolume);

            Assert.True(message.order.status == "Matched");

            double sumOfLimitVolumes  = 0.0;
            double sumOfMarketVolumes = 0.0;
            double currentPrice       = 0.0;

            foreach (var trade in message.trades)
            {
                Assert.True(trade.limitAsset == this.TestAsset2);
                Assert.True(trade.marketAsset == this.TestAsset1);
                Assert.True(trade.marketClientId == this.TestAccountId1);

                if (double.TryParse(trade.limitVolume, NumberStyles.Float, CultureInfo.InvariantCulture, out double parsedLimitVolume) &&
                    double.TryParse(trade.marketVolume, NumberStyles.Float, CultureInfo.InvariantCulture, out double parsedMarketVolume) &&
                    double.TryParse(trade.price, NumberStyles.Float, CultureInfo.InvariantCulture, out double parsedPrice))
                {
                    sumOfLimitVolumes  += parsedLimitVolume;
                    sumOfMarketVolumes += parsedMarketVolume;
                    currentPrice        = parsedPrice;
                    Assert.True(MathUtils.RoundDown(parsedLimitVolume, this.AssetPrecission) ==
                                MathUtils.RoundDown(parsedMarketVolume * parsedPrice, this.AssetPrecission));
                }
            }

            Assert.True(sumOfMarketVolumes == volume);

            //check MarketOrders table
            MarketOrderEntity marketOrderDBRecord = (MarketOrderEntity)await this.MarketOrdersRepository.TryGetAsync(marketOrderResponse);

            //Assert.NotNull(marketOrderDBRecord);
            if (marketOrderDBRecord != null)
            {
                Assert.True(marketOrderDBRecord.AssetPairId == this.TestAssetPair.Id);
                Assert.True(marketOrderDBRecord.ClientId == this.TestAccountId1);
                Assert.True(marketOrderDBRecord.Price == currentPrice);
                Assert.True(marketOrderDBRecord.Status == "Matched");
                Assert.True(marketOrderDBRecord.Straight == true);
                Assert.True(marketOrderDBRecord.Volume == volume * -1);
            }

            //check accoutn balance change
            AccountEntity checkTestAccount = (AccountEntity)await this.AccountRepository.TryGetAsync(this.TestAccountId1);

            BalanceDTO checkAccountBalance1 = checkTestAccount.BalancesParsed.Where(b => b.Asset == this.TestAsset1).FirstOrDefault();
            BalanceDTO checkAccountBalance2 = checkTestAccount.BalancesParsed.Where(b => b.Asset == this.TestAsset2).FirstOrDefault();

            Assert.True(Math.Round(checkAccountBalance1.Balance - accountBalance1.Balance, this.AssetPrecission) == Math.Round(sumOfMarketVolumes * -1, this.AssetPrecission));
            Assert.True(Math.Round(checkAccountBalance2.Balance - accountBalance2.Balance, this.AssetPrecission) == Math.Round(sumOfLimitVolumes, this.AssetPrecission));
        }
コード例 #3
0
 private async Task ProcessMessageAsync(MarketOrderWithTrades orders)
 {
     _ordersPublisher.Publish(orders);
 }