public PositionFormulas GetPositionData(int?portfolioId, string userId, string symbol)
        {
            List <Trade> allTradesBySymbol = _repo.GetTradesBySymbol(portfolioId, userId, symbol);

            if (allTradesBySymbol.Count == 0)
            {
                return(null);
            }

            // add the trades to the positon object.
            PositionFormulas position = new PositionFormulas(symbol);

            foreach (Trade trade in allTradesBySymbol)
            {
                position.AddTransaction(trade);
            }
            // get symbol prices from DB
            List <SecurityPrices> marketPrices = _repo.GetSecurityPrices(symbol);
            // make the below a private method - build price table
            // build DataFrame from Database Prices #
            DataFrame marketPricesFrame = CreatePriceTable(marketPrices);

            // #

            position.CalculateDailyPerformance(marketPricesFrame);
            return(position);
        }
Exemple #2
0
        public IActionResult PositionBreakdown(int?portfolioId, string positionSymbol)
        {
            if (portfolioId == null || positionSymbol == null)
            {
                return(NotFound());
            }

            PositionFormulas position = _service.GetPositionData(portfolioId, _userId, positionSymbol);

            if (position == null)
            {
                return(NotFound());
            }
            string portfolioName = _repo.GetPortfolioName(portfolioId);
            TradeableSecurities securityDetail = _repo.GetSecurityDetails(positionSymbol);

            PositionDataVM positionVM = new PositionDataVM {
                PortfolioId        = portfolioId,
                PortfolioName      = portfolioName,
                PositionObject     = position,
                PositionSymbolData = securityDetail
            };

            return(View(positionVM));
        }
        public void TestDailyShortPositionPerformance()
        {
            PositionFormulas position = new PositionFormulas(testSymbol);
            Trade            tradeA   = CreateTransaction(-500, testSymbol, 12.5m, new DateTime(2020, 5, 4));
            Trade            tradeB   = CreateTransaction(-600, testSymbol, 15m, new DateTime(2020, 5, 4));

            position.AddTransaction(tradeA);
            position.AddTransaction(tradeB);

            DataFrame priceTable = CreatePriceTable();

            position.CalculateDailyPerformance(priceTable);

            decimal[] performances = new decimal[] { -2.931m, -10.145m, -17.358m, -24.571m, -31.784m, -38.997m, -46.210m };
            PrimitiveDataFrameColumn <decimal> performance = new PrimitiveDataFrameColumn <decimal>("pct_change", performances);

            Assert.Equal(performance, position.GetDailyPerformance().Columns["pct_change"]);
        }
        public void TestDailyValuation()
        {
            // Two purchases on different days
            PositionFormulas position = new PositionFormulas(testSymbol);
            Trade            tradeA   = CreateTransaction(500, testSymbol, 12.5m, new DateTime(2020, 5, 4));
            Trade            tradeB   = CreateTransaction(600, testSymbol, 15m, new DateTime(2020, 5, 8));

            position.AddTransaction(tradeA);
            position.AddTransaction(tradeB);

            DataFrame priceTable = CreatePriceTable();

            position.CalculateDailyValuation(priceTable);

            decimal[] dailyValues = new decimal[] { 7135m, 7635m, 8135m, 8635m, 20097m, 21197m, 22297m };
            PrimitiveDataFrameColumn <decimal> dailyVals = new PrimitiveDataFrameColumn <decimal>($"{testSymbol}_MarketValue", dailyValues);

            Assert.Equal(dailyVals, position.GetDailyValuation().Columns[$"{testSymbol}_MarketValue"]);
        }
        public PortfolioData GetPortfolioData(string portfolioName, List <Trade> allTrades)
        {
            List <string> distinctTickers = allTrades.Select(t => t.Ticker).Distinct().ToList();

            PortfolioData userPortfolio = new PortfolioData(portfolioName);

            foreach (string ticker in distinctTickers)
            {
                PositionFormulas position = new PositionFormulas(ticker);
                foreach (Trade trade in allTrades)
                {
                    if (trade.Ticker == ticker)
                    {
                        position.AddTransaction(trade);
                    }
                }
                List <SecurityPrices> marketPrices      = _repo.GetSecurityPrices(ticker);
                DataFrame             marketPricesFrame = CreatePriceTable(marketPrices);

                position.CalculateDailyValuation(marketPricesFrame);
                userPortfolio.AddPositon(position);
            }
            return(userPortfolio);
        }