コード例 #1
0
        public List <Outcome> Run(IEnumerable <ReturnData> list, InputData input, List <IPortfolioAdjustments> ajustmentStrategies)
        {
            var portfolio  = input.Portfolio;
            var outcomes   = new List <Outcome>();
            int monthCount = 1;

            foreach (var month in list)
            {
                var work = new PortfolioWork()
                {
                    Portfolio      = portfolio,
                    MonthProcessed = monthCount++,
                    ReturnData     = month,
                    Adjustments    = ajustmentStrategies,
                    Input          = input
                };
                var outcome = new PortfolioCalculator().CalculateMonthReturn(work);
                outcomes.Add(outcome);
                //Clone first to make sure the copy is a deep clone... then clear out the temp adjustments.
                portfolio = outcome.NewPortfolio.GetClone();
                portfolio.TemporaryInvestmentAdjustments.Clear();
            }

            outcomes.TrimExcess();

            return(outcomes);
        }
コード例 #2
0
        public PortfolioWork UpdatePortfolio(PortfolioWork portfolio)
        {
            foreach (var item in portfolio.Adjustments)
            {
                item.Init(portfolio);
                portfolio = item.Adjust(portfolio);
            }

            return(portfolio);
        }
コード例 #3
0
        public override bool ShouldOffset(PortfolioWork portfolio)
        {
            if (StartMonth > portfolio.MonthProcessed)
            {
                return(false);
            }
            if (EndMonth != null && EndMonth < portfolio.MonthProcessed)
            {
                return(false);
            }

            return(true);
        }
コード例 #4
0
        public PortfolioWork Adjust(PortfolioWork portfolio)
        {
            var cash = portfolio.Portfolio.ComputedInvestments()[from];

            if (cash <= 0)
            {
                return(portfolio);          //no cash to remove...
            }
            var equity = portfolio.Portfolio.ComputedInvestments()[to];

            var glide = glidePerDataRow;

            //Never glide to a negative number.
            if (cash <= glide)
            {
                glide = cash;
            }
            equity = equity + glide;
            cash   = cash - glide;
            portfolio.Portfolio.Investments[from] = cash;
            portfolio.Portfolio.Investments[to]   = equity;

            return(portfolio);
        }
コード例 #5
0
 public abstract bool ShouldOffset(PortfolioWork portfolio);
コード例 #6
0
 public virtual void Offset(PortfolioWork portfolio)
 {
     portfolio.Portfolio.InvestmentAmount += OffsetAmount;
 }
コード例 #7
0
 public void Init(PortfolioWork portfolio)
 {
 }