private PortfolioHistory CreatePortfolioHistoryForDate(DateTime date, DomainObjects.Portfolio.Portfolio portfolio, List <AssetValue> currentAssetValues, List <AssetValue> previousAssetValues) { var projection = PortfolioBusiness.GetProjectionAtDate(date, portfolio); if (projection != null) { var assetsIds = projection.Distribution.Select(d => d.AssetId).Distinct(); if (assetsIds.Count() == currentAssetValues.Count && assetsIds.Count() == previousAssetValues.Count) { var portfolioRealValue = 0.0; foreach (var assetDistribution in projection.Distribution) { var currentAssetValue = currentAssetValues.FirstOrDefault(a => a.AssetId == assetDistribution.AssetId); var previousAssetValue = previousAssetValues.FirstOrDefault(a => a.AssetId == assetDistribution.AssetId); portfolioRealValue += currentAssetValue.Value / previousAssetValue.Value * assetDistribution.Percent; } var portfolioHistory = new PortfolioHistory() { Date = date, PortfolioId = portfolio.Id, RealValue = portfolioRealValue - 100.0, ProjectionValue = projection.ProjectionValue, OptimisticProjectionValue = projection.OptimisticProjectionValue, PessimisticProjectionValue = projection.PessimisticProjectionValue }; Data.Insert(portfolioHistory); return(portfolioHistory); } } return(null); }
public void UpdatePortfolioHistory(DomainObjects.Portfolio.Portfolio portfolio) { var lastUpdatedValue = LastPortfolioHistoryDate(portfolio.Id); if (lastUpdatedValue >= DateTime.UtcNow.Date) { return; } var assetsIds = portfolio.Projections.SelectMany(p => p.Distribution.Select(d => d.AssetId)).Distinct(); var assetValuesByDate = AssetValueBusiness.GetAssetValuesGroupedByDate(assetsIds, lastUpdatedValue ?? portfolio.CreationDate).OrderBy(v => v.Key).ToList(); CreatePortfolioHistoryForEachAssetValueDate(portfolio, assetValuesByDate); }
private void CreatePortfolioHistoryForEachAssetValueDate(DomainObjects.Portfolio.Portfolio portfolio, IList <KeyValuePair <DateTime, List <AssetValue> > > assetValuesByDate) { if (assetValuesByDate.Any()) { KeyValuePair <DateTime, List <AssetValue> > previousAssetValue = GetFirstAssetValueAndRemoveFromList(assetValuesByDate); foreach (var assetValue in assetValuesByDate) { var portfolioHistory = CreatePortfolioHistoryForDate(assetValue.Key, portfolio, assetValue.Value, previousAssetValue.Value); if (portfolioHistory != null) { previousAssetValue = assetValue; } } } }
internal Projection Create(DomainObjects.Portfolio.Portfolio portfolio, double projectionValue, RiskType risk, double? optimisticProjection, double? pessimisticProjection, Dictionary<int, double> distribution) { var projection = SetNew(portfolio.Id, projectionValue, risk, optimisticProjection, pessimisticProjection); using (var transaction = new TransactionalDapperCommand()) { transaction.Insert(projection); var distributions = DistributionBusiness.SetNew(projection.Id, distribution); foreach (Distribution dist in distributions) transaction.Insert(dist); portfolio.ProjectionId = projection.Id; transaction.Update(portfolio); projection.Distribution = distributions; transaction.Commit(); } return projection; }