private void FilterUserCriteriaForComposition(PortfolioComposition portfolioComposition, decimal?portfolioCompositionLimit) { if (portfolioCompositionLimit != 0 && portfolioCompositionLimit != null) { portfolioComposition.IndividualStockWeightages = portfolioComposition.IndividualStockWeightages.Where(x => x.CurrentValueRatio <= portfolioCompositionLimit); } }
public async Task <PortfolioComposition> GetPortfolioComposition(ulong userId) { var portfolioComposition = new PortfolioComposition(); var individualWeightages = new List <IndividualStockWeightage>(); var holdings = await _stockHoldingService.GetAllHoldingsForUserWithStockDetails(userId); var tickers = holdings.Select(x => x.Stock.Ticker); var lastQuoteForStocks = await _marketDataService.GetLastStockQuote(tickers); var tickerLastQuoteMap = lastQuoteForStocks.ToDictionary(x => x.Symbol); foreach (var holding in holdings) { if (tickerLastQuoteMap.ContainsKey(holding.Stock.Ticker)) { var individualWeightage = new IndividualStockWeightage(); individualWeightage.Ticker = holding.Stock.Ticker; individualWeightage.Country = holding.Stock.Country; individualWeightage.Sector = holding.Stock.Sector; individualWeightage.Industry = holding.Stock.Industry; foreach (var holdingDetail in holding.HoldingDetails) { individualWeightage.TotalCurrentValue += tickerLastQuoteMap[individualWeightage.Ticker].Price * holdingDetail.Quantity; individualWeightage.TotalPurchasePrice += holdingDetail.Price * holdingDetail.Quantity; } FindAmountsByCountry(individualWeightage, portfolioComposition); FindAmountsByIndustry(individualWeightage, portfolioComposition); FindAmountsBySector(individualWeightage, portfolioComposition); portfolioComposition.TotalCost += individualWeightage.TotalPurchasePrice; portfolioComposition.TotalInvestmentValue += individualWeightage.TotalCurrentValue; individualWeightages.Add(individualWeightage); } } foreach (var individualWeightage in individualWeightages) { individualWeightage.PurchasePriceRatio = Math.Round(((individualWeightage.TotalPurchasePrice / portfolioComposition.TotalCost) * 100), 2); individualWeightage.CurrentValueRatio = Math.Round((individualWeightage.TotalCurrentValue / portfolioComposition.TotalInvestmentValue) * 100, 2); } Task.WaitAll(Task.Run(() => { FindRatiosByCountry(portfolioComposition); }), Task.Run(() => { FindRatiosByIndustry(portfolioComposition); }), Task.Run(() => { FindRatiosBySector(portfolioComposition); })); portfolioComposition.IndividualStockWeightages = individualWeightages; return(portfolioComposition); }
private void FindRatiosByIndustry(PortfolioComposition portfolioComposition) { foreach (var entry in portfolioComposition.InvestmentAmountByIndustry) { portfolioComposition.InvestmentRatioByIndustry[entry.Key] = Math.Round((entry.Value / portfolioComposition.TotalCost) * 100, 2); } foreach (var entry in portfolioComposition.CurrentValueAmountByIndustry) { portfolioComposition.CurrentValueRatioByIndustry[entry.Key] = Math.Round((entry.Value / portfolioComposition.TotalInvestmentValue) * 100, 2); } }
private void MapCompositionAndRecommendation(CompositionAndRecommendation compositionAndRecommendation, PortfolioComposition portfolioComposition, IEnumerable <ScraperAnalysis> scraperAnalyses) { var analysesMap = MapAnalyses(scraperAnalyses); compositionAndRecommendation.TotalCost = portfolioComposition.TotalCost; compositionAndRecommendation.TotalInvestmentValue = portfolioComposition.TotalInvestmentValue; var compositionAndRecommendationMap = new Dictionary <string, Tuple <IndividualStockWeightage, ScraperAnalysis> >(); foreach (var stockWeightage in portfolioComposition.IndividualStockWeightages) { if (!compositionAndRecommendationMap.ContainsKey(stockWeightage.Ticker) && analysesMap.ContainsKey(stockWeightage.Ticker)) { var portfolioAndRecommendation = new Tuple <IndividualStockWeightage, ScraperAnalysis>(stockWeightage, analysesMap[stockWeightage.Ticker]); compositionAndRecommendationMap[stockWeightage.Ticker] = portfolioAndRecommendation; } } compositionAndRecommendation.Analyses = compositionAndRecommendationMap; }
private void FindAmountsByIndustry(IndividualStockWeightage individualWeightage, PortfolioComposition portfolioComposition) { if (!string.IsNullOrEmpty(individualWeightage.Industry)) { if (!portfolioComposition.InvestmentAmountByIndustry.ContainsKey(individualWeightage.Industry)) { portfolioComposition.InvestmentAmountByIndustry[individualWeightage.Industry] = individualWeightage.TotalPurchasePrice; } else { portfolioComposition.InvestmentAmountByIndustry[individualWeightage.Industry] += individualWeightage.TotalPurchasePrice; } if (!portfolioComposition.CurrentValueAmountByIndustry.ContainsKey(individualWeightage.Industry)) { portfolioComposition.CurrentValueAmountByIndustry[individualWeightage.Industry] = individualWeightage.TotalCurrentValue; } else { portfolioComposition.CurrentValueAmountByIndustry[individualWeightage.Industry] += individualWeightage.TotalCurrentValue; } } }