Exemplo n.º 1
0
        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);
        }