private async Task CompleteAssetSettlementAsync(AssetSettlement assetSettlement)
        {
            try
            {
                AssetHedgeSettings assetHedgeSettings =
                    await _assetHedgeSettingsService.GetByAssetIdAsync(assetSettlement.AssetId);

                if (!assetSettlement.IsDirect && !assetSettlement.IsExternal)
                {
                    // In this case position will be closed automatically by hedge limit order.
                }
                else
                {
                    await _positionService.CloseAsync(assetSettlement.AssetId, assetHedgeSettings.Exchange,
                                                      assetSettlement.ActualAmount, assetSettlement.ActualPrice);
                }

                assetSettlement.Status = AssetSettlementStatus.Completed;
            }
            catch (Exception exception)
            {
                _log.ErrorWithDetails(exception, "An error occurred while completing asset settlement",
                                      assetSettlement);

                assetSettlement.Error = SettlementError.Unknown;
            }

            await _settlementRepository.UpdateAsync(assetSettlement);
        }
        public async Task <AssetHedgeSettingsModel> GetByIndexAsync(string assetId)
        {
            AssetHedgeSettings assetHedgeSettings = await _assetHedgeSettingsService.GetByAssetIdAsync(assetId);

            if (assetHedgeSettings == null)
            {
                throw new ValidationApiException(HttpStatusCode.NotFound, "The asset hedge settings does not exist");
            }

            return(Mapper.Map <AssetHedgeSettingsModel>(assetHedgeSettings));
        }
        public async Task CreateLimitOrderAsync(string assetId, string exchange, LimitOrderType limitOrderType,
                                                decimal price, decimal volume, string userId)
        {
            AssetHedgeSettings assetHedgeSettings =
                await _assetHedgeSettingsService.GetByAssetIdAsync(assetId, exchange);

            if (assetHedgeSettings == null)
            {
                throw new InvalidOperationException("Asset hedge settings not found");
            }

            if (assetHedgeSettings.Mode != AssetHedgeMode.Manual)
            {
                throw new InvalidOperationException("Asset hedge settings mode should be 'Manual'");
            }

            if (!_exchangeAdapters.TryGetValue(assetHedgeSettings.Exchange, out IExchangeAdapter exchangeAdapter))
            {
                throw new InvalidOperationException("There is no exchange provider");
            }

            HedgeLimitOrder hedgeLimitOrder = HedgeLimitOrder.Create(assetHedgeSettings.Exchange,
                                                                     assetHedgeSettings.AssetId, assetHedgeSettings.AssetPairId, limitOrderType, PriceType.Limit, price,
                                                                     volume);

            hedgeLimitOrder.Context = new { price, volume, userId }.ToJson();

            _log.InfoWithDetails("Manual hedge limit order created", new { hedgeLimitOrder, userId });

            await exchangeAdapter.ExecuteLimitOrderAsync(hedgeLimitOrder);
        }