private void ValidateBalance(IReadOnlyCollection <LimitOrder> limitOrders, AssetSettings baseAssetSettings, AssetSettings quoteAssetSettings) { List <LimitOrder> sellLimitOrders = limitOrders .Where(o => o.Error == LimitOrderError.None) .Where(o => o.Type == LimitOrderType.Sell) .OrderBy(o => o.Price) .ToList(); List <LimitOrder> buyLimitOrders = limitOrders .Where(o => o.Error == LimitOrderError.None) .Where(o => o.Type == LimitOrderType.Buy) .OrderByDescending(o => o.Price) .ToList(); if (sellLimitOrders.Any()) { decimal balance = _balanceService.GetByAssetId(ExchangeNames.Lykke, baseAssetSettings.AssetId).Amount; foreach (LimitOrder limitOrder in sellLimitOrders) { decimal amount = limitOrder.Volume.TruncateDecimalPlaces(baseAssetSettings.Accuracy, true); if (balance - amount < 0) { decimal volume = balance.TruncateDecimalPlaces(baseAssetSettings.Accuracy); limitOrder.UpdateVolume(volume); } balance = Math.Max(balance - amount, 0); } } if (buyLimitOrders.Any()) { decimal balance = _balanceService.GetByAssetId(ExchangeNames.Lykke, quoteAssetSettings.AssetId).Amount; foreach (LimitOrder limitOrder in buyLimitOrders) { decimal amount = (limitOrder.Price * limitOrder.Volume) .TruncateDecimalPlaces(quoteAssetSettings.Accuracy, true); if (balance - amount < 0) { decimal volume = (balance / limitOrder.Price).TruncateDecimalPlaces(baseAssetSettings.Accuracy); limitOrder.UpdateVolume(volume); } balance = Math.Max(balance - amount, 0); } } }
private async Task ValidateBalanceAsync(Settlement settlement) { IEnumerable <AssetSettlement> assetSettlements = settlement.Assets .Where(o => o.Error == SettlementError.NotEnoughFunds); foreach (AssetSettlement assetSettlement in assetSettlements) { assetSettlement.Error = SettlementError.None; } AssetSettlement[] assetSettlementsDirect = settlement.Assets .Where(o => o.Error == SettlementError.None) .Where(o => o.IsDirect && !o.IsExternal) .ToArray(); AssetSettlement[] assetSettlementsInUsd = settlement.Assets .Where(o => o.Error == SettlementError.None) .Where(o => !o.IsDirect) .ToArray(); foreach (AssetSettlement assetSettlement in assetSettlementsDirect) { AssetSettings assetSettings = await _instrumentService.GetAssetAsync(assetSettlement.AssetId, ExchangeNames.Lykke); Balance balance = _balanceService.GetByAssetId(ExchangeNames.Lykke, assetSettings.AssetId); if (balance.Amount - balance.Reserved < assetSettlement.Amount) { assetSettlement.Error = SettlementError.NotEnoughFunds; } } decimal amountInUsd = assetSettlementsInUsd.Sum(o => o.Amount * o.Price); AssetSettings usdAssetSettings = await _instrumentService.GetAssetAsync("USD", ExchangeNames.Lykke); Balance usdBalance = _balanceService.GetByAssetId(ExchangeNames.Lykke, usdAssetSettings.AssetId); if (usdBalance.Amount - usdBalance.Reserved < amountInUsd) { foreach (AssetSettlement assetSettlement in assetSettlementsInUsd) { assetSettlement.Error = SettlementError.NotEnoughFunds; } } }
public async Task <IReadOnlyCollection <IndexReport> > GetAsync() { IReadOnlyCollection <IndexSettings> indicesSettings = await _indexSettingsService.GetAllAsync(); var indexReports = new List <IndexReport>(); foreach (IndexSettings indexSettings in indicesSettings) { IndexPrice indexPrice = await _indexPriceService.GetByIndexAsync(indexSettings.Name); Token token = await _tokenService.GetAsync(indexSettings.AssetId); Balance balance = _balanceService.GetByAssetId(ExchangeNames.Lykke, indexSettings.AssetId); indexReports.Add(new IndexReport { Name = indexSettings.Name, AssetId = indexSettings.AssetId, AssetPairId = indexSettings.AssetPairId, Value = indexPrice?.Value, Price = indexPrice?.Price, Timestamp = indexPrice?.Timestamp, K = indexPrice?.K, Amount = token.Amount, OpenVolume = token.OpenVolume, OppositeVolume = token.OppositeVolume, Balance = balance.Amount, Alpha = indexSettings.Alpha, TrackingFee = indexSettings.TrackingFee, PerformanceFee = indexSettings.PerformanceFee, SellMarkup = indexSettings.SellMarkup, SellVolume = indexSettings.SellVolume, BuyVolume = indexSettings.BuyVolume, Weights = indexPrice?.Weights ?? new AssetWeight[0] }); } return(indexReports); }