Exemple #1
0
        public async Task PlaceBulkOrder()
        {
            var client = GetClient <IOrdersApi>();
            var order  = new PlaceBulkOrderModel
            {
                AssetPairId          = "BTCUSD",
                CancelPreviousOrders = true,
                Orders = Enumerable.Range(0, 10).Select(x => new BulkOrderItemModel
                {
                    OrderAction = OrderAction.Buy,
                    Price       = 500 + x,
                    Volume      = 0.001m
                })
            };

            var result = await client.PlaceBulkOrder(order).TryExecute();

            if (result.Success)
            {
                result.Result.Should().NotBeNull();
                result.Result.Statuses.Should().HaveCount(10);
                result.Result.Statuses.Should().NotContain(x => x.Id == Guid.Empty);
            }
            else
            {
                result.Error.Should().NotBeNull();
            }
        }
        public async Task <IActionResult> PlaceBulkOrder([FromBody] PlaceBulkOrderModel order)
        {
            var assetPair = _assetPairsReadModel.TryGetIfEnabled(order.AssetPairId);

            if (assetPair == null)
            {
                return(NotFound($"Asset-pair {order.AssetPairId} could not be found or is disabled."));
            }

            if (!_requestValidator.ValidateAssetPair(order.AssetPairId, assetPair, out var badRequestModel))
            {
                return(BadRequest(badRequestModel));
            }

            var asset = _assetsReadModel.TryGetIfEnabled(assetPair.BaseAssetId);

            if (asset == null)
            {
                throw new InvalidOperationException($"Base asset '{assetPair.BaseAssetId}' for asset pair '{assetPair.Id}' not found.");
            }

            var items = order.Orders?.ToArray() ?? new BulkOrderItemModel[0];

            foreach (var item in items)
            {
                var price = item.Price;
                if (!_requestValidator.ValidatePrice(price, out badRequestModel))
                {
                    return(BadRequest(badRequestModel));
                }

                var volume    = item.Volume;
                var minVolume = assetPair.MinVolume;
                if (!_requestValidator.ValidateVolume(volume, minVolume, asset.DisplayId, out badRequestModel))
                {
                    return(BadRequest(badRequestModel));
                }

                item.Price  = price;
                item.Volume = volume;
            }

            var walletId = User.GetUserId();
            var response = await _matchingEngineAdapter.PlaceBulkLimitOrderAsync(
                clientId : walletId,
                assetPair : assetPair,
                items : items,
                cancelPrevious : order.CancelPreviousOrders,
                cancelMode : order.CancelMode
                );

            if (response.Error != null)
            {
                return(BadRequest(response));
            }

            return(Ok(response.Result));
        }
Exemple #3
0
        public async Task ReplaceBulkOrder()
        {
            var assetPair = "BTCUSD";
            var client    = GetClient <IOrdersApi>();

            await client.CancelAll();

            var order = new PlaceBulkOrderModel
            {
                AssetPairId = assetPair,
                Orders      = Enumerable.Range(0, 2).Select(x => new BulkOrderItemModel
                {
                    OrderAction = OrderAction.Buy,
                    Price       = 500 + x,
                    Volume      = 0.0001m
                })
            };

            var first = await client.PlaceBulkOrder(order);

            await Task.Delay(TimeSpan.FromSeconds(1));

            order = new PlaceBulkOrderModel
            {
                AssetPairId = assetPair,
                Orders      = first.Statuses
                              .Where(x => x.Error == null)
                              .Select(x => new BulkOrderItemModel
                {
                    OrderAction = OrderAction.Buy,
                    OldId       = x.Id.ToString(),
                    Price       = 1m + x.Price,
                    Volume      = 0.0001m
                })
            };

            var result = await client.PlaceBulkOrder(order);

            await Task.Delay(TimeSpan.FromSeconds(1));

            foreach (var old in first.Statuses)
            {
                var current = await client.GetOrder(old.Id);

                current.Status.Should().Be(OrderStatus.Replaced);
            }

            foreach (var item in result.Statuses)
            {
                var current = await client.GetOrder(item.Id);

                current.Status.Should().Be(OrderStatus.Placed);
            }
        }