public async Task InitializeAsync(string walletId, string assetId, double amount)
        {
            if (Math.Abs(amount) <= Double.Epsilon)
            {
                return;
            }

            IReadOnlyCollection <AssetPair> assetPairs = await _assetsServiceWithCache.GetAllAssetPairsAsync();

            AssetPair assetPair = assetPairs
                                  .SingleOrDefault(o => o.BaseAssetId == assetId && o.QuotingAssetId == QuoteAssetId);

            if (assetPair == null)
            {
                assetPair = assetPairs
                            .SingleOrDefault(o => o.BaseAssetId == QuoteAssetId && o.QuotingAssetId == assetId);
            }

            if (assetPair == null)
            {
                throw new InvalidOperationException($"Asset pair found by asset '{assetId}' and '{QuoteAssetId}'");
            }

            Quote quote = await _quoteService.GetAsync(assetId, QuoteAssetId);

            var tradeData = new TradeData
            {
                Id                   = Guid.Empty.ToString("D"),
                Exchange             = ExchangeNames.Lykke,
                AssetPair            = assetPair.Id,
                BaseAsset            = assetId,
                QuoteAsset           = QuoteAssetId,
                Price                = quote.Mid,
                Volume               = (decimal)Math.Abs(amount),
                Type                 = amount < 0 ? TradeType.Sell : TradeType.Buy,
                Time                 = DateTime.UtcNow,
                LimitOrderId         = Guid.Empty.ToString("D"),
                OppositeClientId     = null,
                OppositeLimitOrderId = null
            };

            AssetRealisedPnL assetRealisedPnL = await CalculateAsync(tradeData, walletId, assetId);

            await _assetRealisedPnLRepository.InsertAsync(assetRealisedPnL);

            _log.InfoWithDetails("Realised PnL initialized", new { walletId, assetId, amount });

            _cache.Set(assetRealisedPnL);
        }
        public async Task CalculateAsync(LykkeTrade lykkeTrade)
        {
            WalletSettings walletSettings = await _walletSettingsService.GetWalletAsync(lykkeTrade.ClientId);

            if (walletSettings == null || !walletSettings.Enabled)
            {
                return;
            }

            AssetPair assetPair = await _assetsServiceWithCache.TryGetAssetPairAsync(lykkeTrade.AssetPairId);

            string[] assets = walletSettings.Assets
                              .Intersect(new[] { assetPair.BaseAssetId, assetPair.QuotingAssetId })
                              .ToArray();

            if (!assets.Any())
            {
                return;
            }

            var tradeData = new TradeData
            {
                Id                   = lykkeTrade.Id,
                Exchange             = ExchangeNames.Lykke,
                AssetPair            = assetPair.Id,
                BaseAsset            = assetPair.BaseAssetId,
                QuoteAsset           = assetPair.QuotingAssetId,
                Price                = lykkeTrade.Price,
                Volume               = lykkeTrade.Volume,
                Type                 = lykkeTrade.Type,
                Time                 = lykkeTrade.Time,
                LimitOrderId         = lykkeTrade.LimitOrderId,
                OppositeClientId     = lykkeTrade.OppositeClientId,
                OppositeLimitOrderId = lykkeTrade.OppositeLimitOrderId
            };

            foreach (string assetId in assets)
            {
                AssetRealisedPnL assetRealisedPnL =
                    await CalculateAsync(tradeData, walletSettings.Id, assetId);

                await _assetRealisedPnLRepository.InsertAsync(assetRealisedPnL);

                _cache.Set(assetRealisedPnL);
            }

            _log.InfoWithDetails("Lykke trade handled", tradeData);
        }
Exemplo n.º 3
0
 public static AssetPair ToAssetPair(Lykke.Service.Assets.Client.Models.AssetPair assetPair)
 {
     return(new AssetPair
     {
         Id = assetPair.Id,
         IsDisabled = assetPair.IsDisabled,
         Name = assetPair.Name,
         Accuracy = assetPair.Accuracy,
         InvertedAccuracy = assetPair.InvertedAccuracy,
         BaseAssetId = assetPair.BaseAssetId,
         QuotingAssetId = assetPair.QuotingAssetId,
         MinVolume = (decimal)assetPair.MinVolume,
         MinInvertedVolume = (decimal)assetPair.MinInvertedVolume,
         ExchangeId = assetPair.ExchangeId
     });
 }
Exemplo n.º 4
0
        public async Task <Quote> GetAsync(string baseAssetId, string quoteAssetId)
        {
            string directAssetPairId = $"{baseAssetId}{quoteAssetId}";

            if (baseAssetId == quoteAssetId)
            {
                return(new Quote(directAssetPairId, DateTime.UtcNow, 1, 1));
            }

            IReadOnlyCollection <AssetPair> assetPairs = await _assetsServiceWithCache.GetAllAssetPairsAsync();

            bool inverted = false;

            AssetPair assetPair = assetPairs
                                  .SingleOrDefault(o => o.BaseAssetId == baseAssetId && o.QuotingAssetId == quoteAssetId);

            if (assetPair == null)
            {
                inverted = true;

                assetPair = assetPairs
                            .SingleOrDefault(o => o.BaseAssetId == quoteAssetId && o.QuotingAssetId == baseAssetId);
            }

            if (assetPair == null)
            {
                throw new InvalidOperationException($"Asset pair does not exist for '{baseAssetId}'/'{quoteAssetId}'");
            }

            MarketProfile marketProfile = await GetMarketProfileAsync();

            FeedData feedData = marketProfile.Profile.FirstOrDefault(o => o.Asset == assetPair.Id);

            if (feedData == null)
            {
                throw new InvalidOperationException($"No quote for asset pair '{assetPair.Id}'");
            }

            if (inverted)
            {
                return(new Quote(assetPair.Id, feedData.DateTime, 1 / (decimal)feedData.Ask,
                                 1 / (decimal)feedData.Bid));
            }

            return(new Quote(assetPair.Id, feedData.DateTime, (decimal)feedData.Ask,
                             (decimal)feedData.Bid));
        }