Ejemplo n.º 1
0
        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
                };
            }
        }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
        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
                };
            }
        }