Пример #1
0
        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);
        }
Пример #2
0
        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);
        }
Пример #3
0
 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;
             }
         }
     }
 }
Пример #4
0
        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;
        }