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); }
public PortfolioWork UpdatePortfolio(PortfolioWork portfolio) { foreach (var item in portfolio.Adjustments) { item.Init(portfolio); portfolio = item.Adjust(portfolio); } return(portfolio); }
public override bool ShouldOffset(PortfolioWork portfolio) { if (StartMonth > portfolio.MonthProcessed) { return(false); } if (EndMonth != null && EndMonth < portfolio.MonthProcessed) { return(false); } return(true); }
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); }
public abstract bool ShouldOffset(PortfolioWork portfolio);
public virtual void Offset(PortfolioWork portfolio) { portfolio.Portfolio.InvestmentAmount += OffsetAmount; }
public void Init(PortfolioWork portfolio) { }