public PortfolioQueryResult Handle(PortfolioQuery query) { var portfolio = _repo.Load(); var portfolioReturns = PortfolioManager.CalculateReturns(portfolio); return(Result()); PortfolioQueryResult Result() { return(new PortfolioQueryResult { PortfolioValue = portfolio.Entries.Sum(e => e.Qty * e.CurrentPrice), PortfolioRateOfReturn = portfolioReturns.TotalRateOfReturn, Stocks = portfolio.Entries.Select(Map).ToArray() }); PortfolioQueryResult.StockInfo Map(Portfolio.Stock e) => new PortfolioQueryResult.StockInfo { Name = e.Name, Symbol = e.Symbol, Currency = e.Currency, Qty = e.Qty, BuyingPrice = e.BuyingPrice, CurrentPrice = e.CurrentPrice, BuyingValue = e.Qty * e.BuyingPrice, CurrentValue = e.Qty * e.CurrentPrice, Return = portfolioReturns.Returns[e.Symbol].Return, RateOfReturn = portfolioReturns.Returns[e.Symbol].RateOfReturn }; } }
public void CalculateReturns() { var portfolio = new Portfolio(); portfolio.Entries.Add(new Portfolio.Stock { Symbol = "S1", Qty = 5, BuyingPrice = 2.0m, CurrentPrice = 4.0m }); portfolio.Entries.Add(new Portfolio.Stock { Symbol = "S2", Qty = 10, BuyingPrice = 11.0m, CurrentPrice = 16.0m }); var result = PortfolioManager.CalculateReturns(portfolio); Assert.Equal(10.0m, result.Returns["S1"].Return); Assert.Equal(1.0m, result.Returns["S1"].RateOfReturn); Assert.Equal(50.0m, result.Returns["S2"].Return); Assert.Equal(0.45m, result.Returns["S2"].RateOfReturn, 2); Assert.Equal(60.0m, result.TotalReturn); Assert.Equal(0.5m, result.TotalRateOfReturn); }
public Output Process(IMessage _, IMessageContext model) { var queryModel = model as PortfolioQueryContextModel; var prices = new Portfolio { Entries = queryModel.Entries .Select(e => new Portfolio.Stock { Qty = e.Qty, Bought = e.Bought, BuyingPrice = e.BuyingPrice, Currency = e.Currency, CurrentPrice = e.CurrentPrice, LastUpdated = e.LastUpdated, Name = e.Name, Symbol = e.Symbol }) .ToList() }; var returns = PortfolioManager.CalculateReturns(prices); return(new QueryOutput(Result())); PortfolioQueryResult Result() { return(new PortfolioQueryResult { PortfolioValue = queryModel.Entries.Sum(e => e.Qty * e.CurrentPrice), PortfolioRateOfReturn = returns.TotalRateOfReturn, Stocks = queryModel.Entries.Select(Map).ToArray() }); PortfolioQueryResult.StockInfo Map(PortfolioQueryContextModel.StockInfo e) => new PortfolioQueryResult.StockInfo { Name = e.Name, Symbol = e.Symbol, Currency = e.Currency, Qty = e.Qty, BuyingPrice = e.BuyingPrice, CurrentPrice = e.CurrentPrice, BuyingValue = e.Qty * e.BuyingPrice, CurrentValue = e.Qty * e.CurrentPrice, Return = returns.Returns[e.Symbol].Return, RateOfReturn = returns.Returns[e.Symbol].RateOfReturn }; } }