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);
        }
        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"]);
        }