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