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