public async Task <string> RePlaceOrderAsync(string orderId, string symbol, decimal price, decimal size, MarketSide side)
        {
            try
            {
                var request = new BulkLimitOrderRequest();
                request.AssetPairId          = symbol;
                request.CancelPreviousOrders = false;
                request.Orders.Add(new BulkOrder()
                {
                    OldId  = orderId,
                    Side   = side == MarketSide.Long ? Side.Buy : Side.Sell,
                    Price  = price.ToString(CultureInfo.InvariantCulture),
                    Volume = size.ToString(CultureInfo.InvariantCulture)
                });

                var result = await Client.PrivateApi.PlaceBulkLimitOrderAsync(request);

                if (result.Error != null)
                {
                    Console.WriteLine($"ERROR: Cannot PlaceBulkLimitOrderAsync ({orderId}): {result.Error.Message}");
                    return(null);
                }

                var status = result.Payload.Statuses.FirstOrDefault();

                if (status == null || status.Error != ErrorCode.Success)
                {
                    Console.WriteLine($"ERROR: Cannot PlaceBulkLimitOrderAsync ({orderId}): {status.Error}");
                    return(null);
                }

                return(status.Id);
            }
            catch (Exception ex)
            {
                Console.WriteLine($"ERROR: Cannot RePlaceOrder ({orderId}):");
                Console.WriteLine(ex);
                return(null);
            }
        }
        public override async Task <BulkLimitOrderResponse> PlaceBulkLimitOrder(BulkLimitOrderRequest request, ServerCallContext context)
        {
            var walletId = context.GetHttpContext().User.GetWalletId();

            var items = request.Orders?.ToArray() ?? Array.Empty <BulkOrder>();

            var orders = new List <MultiOrderItemModel>();

            foreach (var item in items)
            {
                var order = new MultiOrderItemModel
                {
                    Id          = Guid.NewGuid().ToString(),
                    Price       = Convert.ToDouble(item.Price),
                    Volume      = Convert.ToDouble(item.Volume),
                    OrderAction = _mapper.Map <OrderAction>(item.Side),
                    OldId       = string.IsNullOrEmpty(item.OldId) ? null : item.OldId
                };

                orders.Add(order);
            }

            var multiOrder = new MultiLimitOrderModel
            {
                Id                   = Guid.NewGuid().ToString(),
                ClientId             = walletId,
                AssetPairId          = request.AssetPairId,
                CancelPreviousOrders = request.CancelPreviousOrders,
                Orders               = orders.ToArray()
            };

            if (request.OptionalCancelModeCase != BulkLimitOrderRequest.OptionalCancelModeOneofCase.None)
            {
                multiOrder.CancelMode = _mapper.Map <Lykke.MatchingEngine.Connector.Models.Api.CancelMode>(request.CancelMode);
            }

            MultiLimitOrderResponse response = await _matchingEngineClient.PlaceMultiLimitOrderAsync(multiOrder);

            if (response == null)
            {
                return(new BulkLimitOrderResponse
                {
                    Error = new Error
                    {
                        Code = _mapper.Map <ErrorCode>(HftApiErrorCode.MeRuntime),
                        Message = "ME not available"
                    }
                });
            }

            var bulkResponse = new BulkLimitOrderResponse
            {
                Payload = new BulkLimitOrderResponse.Types.BulkLimitOrderPayload
                {
                    AssetPairId = request.AssetPairId
                }
            };

            bulkResponse.Payload.Statuses.AddRange(response.Statuses?.Select(x => new BulkOrderItemStatus
            {
                Id     = x.Id,
                Price  = x.Price.ToString(CultureInfo.InvariantCulture),
                Volume = x.Volume.ToString(CultureInfo.InvariantCulture),
                Error  = _mapper.Map <ErrorCode>(x.Status.ToHftApiError().code)
            }));

            return(bulkResponse);
        }