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)); }
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); } }