Exemple #1
0
        public void Test_StocksVolumeWeightedStockPrice()
        {
            string stock        = "GIN";
            double lastDividend = 0;
            double stockPrice   = 25;


            CommonStock testStock = new CommonStock(stock, lastDividend, stockPrice);

            //Add 10 trades

            testStock.addTrade(DateTime.Now.AddMinutes(-3), 100, true, 250);   //Sell 100 shares now at 250
            testStock.addTrade(DateTime.Now.AddMinutes(-1), 300, false, 260);  //Buy 300 shares now at 260
            testStock.addTrade(DateTime.Now.AddMinutes(-6), 10, true, 240);    //Sell 10 shares now at 240
            testStock.addTrade(DateTime.Now, 400, true, 230);                  //Sell 400 shares now at 230
            testStock.addTrade(DateTime.Now.AddMinutes(-8), 1000, false, 235); //Sell 1000 shares now at 235
            testStock.addTrade(DateTime.Now.AddMinutes(-30), 100, true, 250);  //Sell 100 shares now at 250
            testStock.addTrade(DateTime.Now.AddMinutes(-16), 300, false, 260); //Buy 300 shares now at 260
            testStock.addTrade(DateTime.Now.AddMinutes(-5), 10, true, 240);    //Sell 10 shares now at 240
            testStock.addTrade(DateTime.Now.AddMinutes(-2), 400, true, 230);   //Sell 400 shares now at 230
            testStock.addTrade(DateTime.Now.AddMinutes(-7), 1000, false, 235); //Sell 1000 shares now at 235

            double expectedResult = (100 * 250.0 + 300 * 260 + 10 * 240 + 400 * 230 + 1000 * 235 + 10 * 240 + 400 * 230 + 1000 * 235) / (100 + 300 + 10 + 400 + 1000 + 10 + 400 + 1000);

            double vwsp = testStock.volumeWeightedStockPrice();

            Assert.AreEqual(expectedResult, vwsp);
        }
        public void TestGeometricMeanOfVWSP()
        {
            CommonStock commonStock1 = new CommonStock("Test", 8, 100);
            CommonStock commonStock2 = new CommonStock("Second Test", 10, 60);

            var now = DateTime.Now;

            var oneMinsBeforeNow   = now.AddMinutes(-1);
            var twoMinsBeforeNow   = now.AddMinutes(-2);
            var threeMinsBeforeNow = now.AddMinutes(-3);
            var fourMinsBeforeNow  = now.AddMinutes(-4);

            var firstTrade  = new Trade(1, TradeIndicator.Buy, 10, oneMinsBeforeNow);
            var secondTrade = new Trade(2, TradeIndicator.Buy, 10, twoMinsBeforeNow);
            var thirdTrade  = new Trade(3, TradeIndicator.Buy, 10, threeMinsBeforeNow);
            var fourthTrade = new Trade(4, TradeIndicator.Buy, 10, fourMinsBeforeNow);
            var fifthTrade  = new Trade(6, TradeIndicator.Buy, 20, fourMinsBeforeNow);

            commonStock1.AddNewTrade(firstTrade);
            commonStock1.AddNewTrade(secondTrade);
            commonStock1.AddNewTrade(thirdTrade);

            commonStock2.AddNewTrade(fourthTrade);
            commonStock2.AddNewTrade(fifthTrade);

            StockMarket market = new StockMarket(new List <CommonStock> {
                commonStock1, commonStock2
            });

            Assert.AreEqual(market.CalculateGBCEWeightedStockPrice(), Math.Sqrt(160), 0.001);
        }
        public void TestCommonShareDividendYieldCalculation(double lastdividend, int parValue, double price,
                                                            double expectedValue)
        {
            CommonStock commonStock = new CommonStock("Test", lastdividend, parValue);

            Assert.AreEqual(commonStock.CalculateDividendYield(price), expectedValue);
        }
        public void TestPERatioCalculation(double lastdividend, int parValue, double price,
                                           double expectedValue)
        {
            CommonStock commonStock = new CommonStock("Test", lastdividend, parValue);

            Assert.AreEqual(commonStock.CalculatePriceEarningsRatio(price), expectedValue);
        }
Exemple #5
0
        public void CalculateVolumeWeightedStockPriceTest()
        {
            var stock = new CommonStock {
                symbol = "TEA", lastDividend = 10, parValue = 100
            };
            var trade1 = new Trade {
                stockSymbol = "TEA", timestamp = DateTime.Now.AddMinutes(-60), price = 5, direction = TradeDirection.BUY, quantity = 50
            };

            exchangeStock.RecordTrade(trade1);
            var trade2 = new Trade {
                stockSymbol = "TEA", timestamp = DateTime.Now, price = 10, direction = TradeDirection.BUY, quantity = 100
            };

            exchangeStock.RecordTrade(trade2);
            var trade3 = new Trade {
                stockSymbol = "TEA", timestamp = DateTime.Now, price = 100, direction = TradeDirection.BUY, quantity = 3
            };

            exchangeStock.RecordTrade(trade3);

            var currentStockPrice  = exchangeStock.CalculateVolumeWeightedStockPrice("TEA", 15);
            var expectedStockPrice = 1300d / 103d;

            Assert.AreEqual(expectedStockPrice, currentStockPrice);
        }
        public void TestInvalidPriceInYieldCalcThrowsException(double price)
        {
            CommonStock commonStock   = new CommonStock("Test", 8, 100);
            CommonStock preferedStock = new PreferredStock("Test", 8, 100, 0.02);

            Assert.Throws <ArgumentOutOfRangeException>(() => commonStock.CalculateDividendYield(price));
            Assert.Throws <ArgumentOutOfRangeException>(() => preferedStock.CalculateDividendYield(price));
        }
Exemple #7
0
        public void AddCommonStockTest()
        {
            var stockCommon = new CommonStock {
                symbol = "POP", lastDividend = 8, parValue = 100
            };

            exchangeStock.AddStock(stockCommon);
            Assert.AreEqual(stockCommon, exchangeStock.GetStockBySymbol("POP"));
        }
Exemple #8
0
        public void CalculatPriceEarningsRatioForComonStockTest()
        {
            var stockCommon = new CommonStock {
                symbol = "TEA", lastDividend = 10, parValue = 100
            };
            var currentPeRatio  = exchangeStock.CalculatePriceEarningsRatio(stockCommon, 100);
            var expectedPeRatio = 1000;

            Assert.AreEqual(expectedPeRatio, currentPeRatio);
        }
Exemple #9
0
        public void CalculateDividendYieldForCommonStockTest()
        {
            var stockCommon = new CommonStock {
                symbol = "TEA", lastDividend = 10, parValue = 100
            };
            var currentDividendCommon = exchangeStock.CalculateDividendYield(stockCommon, 100);
            var expectedDividendYield = 0.1;

            Assert.AreEqual(expectedDividendYield, currentDividendCommon);
        }
        public void GetTrades_ForACertainStock_ReturnsTheCorrectTradesForThatStock()
        {
            // Arrange
            var dateTimeProvider = new Mock <IDateTimeProvider>();
            var tradeRepository  = new Mock <TradeRepository>(dateTimeProvider.Object);
            var teaStock         = new CommonStock {
                StockSymbol = "TEA"
            };
            var popStock = new CommonStock {
                StockSymbol = "POP"
            };
            var aleStock = new CommonStock {
                StockSymbol = "ALE"
            };

            tradeRepository.Protected().Setup <List <Trade> >("Trades").Returns(
                new List <Trade>
            {
                new Trade {
                    Stock = teaStock, Quantity = 1
                },
                new Trade {
                    Stock = popStock, Quantity = 2
                },
                new Trade {
                    Stock = aleStock, Quantity = 3
                },
                new Trade {
                    Stock = aleStock, Quantity = 4
                },
                new Trade {
                    Stock = teaStock, Quantity = 5
                },
                new Trade {
                    Stock = teaStock, Quantity = 6
                },
                new Trade {
                    Stock = aleStock, Quantity = 7
                }
            });

            // Act
            var trades = tradeRepository.Object.GetTrades(new CommonStock {
                StockSymbol = "TEA"
            });

            // Assert
            Assert.AreEqual(3, trades.Count);
            var quantities = trades.Select(x => x.Quantity).ToList();

            Assert.That(quantities, Contains.Item(1));
            Assert.That(quantities, Contains.Item(5));
            Assert.That(quantities, Contains.Item(6));
        }
        public void Equals_IfStockSymbolIsNull_ReturnsFalse()
        {
            // Arrange
            var stock1 = new CommonStock();
            var stock2 = new PreferredStock();

            // Act
            var areEquals = stock1.Equals(stock2);

            // Assert
            Assert.False(areEquals);
        }
Exemple #12
0
        public void Test_StocksCommonYieldException()
        {
            string stock        = "POP";
            double lastDividend = 8;
            double stockPrice   = 25;
            double price        = 0;


            CommonStock testStock = new CommonStock(stock, lastDividend, stockPrice);


            double dividendYield = testStock.DividendYield(price);
        }
        public void Equals_WithOneObjectNotAStock_ReturnsFalse()
        {
            // Arrange
            var stock1 = new CommonStock {
                StockSymbol = "TEA"
            };
            var trade = new Trade();

            // Act
            var areEquals = stock1.Equals(trade);

            // Assert
            Assert.False(areEquals);
        }
Exemple #14
0
        public void CalculateDividendYield_WithZeroPrice_ThrowsArgumentException()
        {
            // Arrange
            var stock = new CommonStock
            {
                LastDividend = 20
            };

            // Act
            var testDelegate = new TestDelegate(() => stock.CalculateDividendYield(0));

            // Assert
            Assert.That(testDelegate, Throws.ArgumentException);
        }
Exemple #15
0
        public decimal CalculateDividendYield_WithNonZeroPriceAndPositiveDividend_CorrectlyCalculates(decimal price)
        {
            // Arrange
            var stock = new CommonStock
            {
                LastDividend = 10
            };

            // Act
            var result = stock.CalculateDividendYield(price);

            // Assert
            return(result);
        }
Exemple #16
0
        public void Test_StocksCommonYield()
        {
            string stock        = "POP";
            double lastDividend = 8;
            double stockPrice   = 25;
            double price        = 64;
            double expected     = lastDividend / price;

            CommonStock testStock = new CommonStock(stock, lastDividend, stockPrice);


            double dividendYield = testStock.DividendYield(price);

            Assert.AreEqual(expected, dividendYield);
        }
        public void Equals_WithTwoStocksWithDifferentSymbol_ReturnsFalse()
        {
            // Arrange
            var stock1 = new CommonStock {
                StockSymbol = "TEA"
            };
            var stock2 = new CommonStock {
                StockSymbol = "TEB"
            };

            // Act
            var areEquals = stock1.Equals(stock2);

            // Assert
            Assert.False(areEquals);
        }
        public void Equals_WithTwoStocksWithSameSymbolOfDifferentSubtypes_ReturnsTrue()
        {
            // Arrange
            var stock1 = new CommonStock {
                StockSymbol = "TEA"
            };
            var stock2 = new PreferredStock {
                StockSymbol = "TEA"
            };

            // Act
            var areEquals = stock1.Equals(stock2);

            // Assert
            Assert.True(areEquals);
        }
Exemple #19
0
        public void SellTradeRecordTest()
        {
            var stockCommon = new CommonStock {
                symbol = "POP", lastDividend = 8, parValue = 100
            };

            exchangeStock.AddStock(stockCommon);
            exchangeStock.BuyStock(stockCommon.symbol, 10, 3);
            exchangeStock.SellStock(stockCommon.symbol, 5, 5);
            exchangeStock.BuyStock(stockCommon.symbol, 5, 2);

            var currentBuyTrades  = exchangeStock.tradeList.Where(trade => trade.direction.Equals(TradeDirection.SELL)).ToList().Count;
            var expectedBuyTrades = 1;

            Assert.AreEqual(expectedBuyTrades, currentBuyTrades);
        }
Exemple #20
0
        public void TestCommonStockYield()
        {
            // Test Common Stock

            CommonStock stock;

            stock = new CommonStock("TST", 0, 100);

            float yield;

            // Test 0/50 => 0
            yield = stock.GetDividendYield(50);
            Assert.AreEqual(0, yield, float.Epsilon);

            // Test 10/10 => 1
            stock.LastDividend = 10;
            yield = stock.GetDividendYield(10);
            Assert.AreEqual(1, yield, float.Epsilon);

            // Test 10/0 => NaN
            yield = stock.GetDividendYield(0);
            Assert.AreEqual(float.NaN, yield);

            // LastPrice

            stock = new CommonStock("TST", 0, 100);

            // Test 0/50 => 0
            stock.LastPrice = 50;
            yield           = stock.GetDividendYield();
            Assert.AreEqual(0, yield, float.Epsilon);

            // Test 10/10 => 1
            stock.LastPrice    = 10;
            stock.LastDividend = 10;
            yield = stock.GetDividendYield();
            Assert.AreEqual(1, yield, float.Epsilon);

            // Test 10/0 => NaN
            stock.LastPrice = 0;
            yield           = stock.GetDividendYield();
            Assert.AreEqual(float.NaN, yield);
        }
        public void Setup()
        {
            tradeRepositoryMock = new Mock <ITradeRepository>();
            var now = new DateTime(2017, 2, 17, 22, 22, 34);
            var dateTimeProvider = new Mock <IDateTimeProvider>();

            dateTimeProvider.Setup(x => x.Now).Returns(now);

            tradeCalculator = new TradeCalculator(tradeRepositoryMock.Object, dateTimeProvider.Object);
            teaStock        = new CommonStock {
                StockSymbol = "TEA"
            };
            ginStock = new CommonStock {
                StockSymbol = "GIN"
            };
            aleStock = new CommonStock {
                StockSymbol = "ALE"
            };
        }
Exemple #22
0
        public void TestStockCollectionGeometricMean()
        {
            StockCollection stocks = new StockCollection();

            GenericStock stock1 = new CommonStock("TS1", 5, 100);
            GenericStock stock2 = new CommonStock("TS2", 10, 100);
            GenericStock stock3 = new CommonStock("TS3", 15, 100);

            stocks.Add(stock1);
            stocks.Add(stock2);
            stocks.Add(stock3);

            float gm;

            // If no any prices => no result
            gm = stocks.GetGeometricMean();
            Assert.AreEqual(float.NaN, gm);

            float price1 = 110;
            float price2 = 50;
            float price3 = 10;

            stock1.LastPrice = price1;
            stock2.LastPrice = price2;

            // If there is at least one stock w/o price => no result
            gm = stocks.GetGeometricMean();
            Assert.AreEqual(float.NaN, gm);

            stock3.LastPrice = price3;

            // result is the 3-sq of price1*price2*price3
            gm = stocks.GetGeometricMean();
            float mul = 1.0f;

            mul *= price1;
            mul *= price2;
            mul *= price3;
            float nsq = 1f / 3;

            Assert.AreEqual(Math.Pow(mul, nsq), gm, 0.0001f);
        }
Exemple #23
0
        public void Test_StocksAddTrades()
        {
            string stock        = "GIN";
            double lastDividend = 0;
            double stockPrice   = 25;


            CommonStock testStock = new CommonStock(stock, lastDividend, stockPrice);

            //Add 5 trades

            testStock.addTrade(DateTime.Now.AddMinutes(-3), 100, true, 250);   //Sell 100 shares now at 250
            testStock.addTrade(DateTime.Now.AddMinutes(-1), 300, false, 260);  //Buy 300 shares now at 260
            testStock.addTrade(DateTime.Now.AddMinutes(-6), 10, true, 240);    //Sell 10 shares now at 240
            testStock.addTrade(DateTime.Now, 400, true, 230);                  //Sell 400 shares now at 230
            testStock.addTrade(DateTime.Now.AddMinutes(-8), 1000, false, 235); //Sell 1000 shares now at 235

            Assert.AreEqual(5, testStock.stockTrades.Count);                   //Check there are 5 trades
            Assert.AreEqual(230, testStock.stockTrades.Values[0].tradePrice);  //Check the first trade in the list has a price of 235 - i.e. the most recent trade
        }
        public void TestVWSPNoTradesInLastFiveMinutes()
        {
            CommonStock commonStock = new CommonStock("Test", 8, 100);

            var now = DateTime.Now;

            var sixMinsFromNow   = now.AddMinutes(6);
            var sevenMinsFromNow = now.AddMinutes(7);
            var sixMinsBeforeNow = now.AddMinutes(-6);

            var firstTrade  = new Trade(1, TradeIndicator.Buy, 10, sixMinsFromNow);
            var secondTrade = new Trade(1, TradeIndicator.Buy, 10, sevenMinsFromNow);
            var thirdTrade  = new Trade(1, TradeIndicator.Buy, 10, sixMinsBeforeNow);

            commonStock.AddNewTrade(firstTrade);
            commonStock.AddNewTrade(secondTrade);
            commonStock.AddNewTrade(thirdTrade);

            Assert.AreEqual(commonStock.CalculateVolumeWeightedStockPrice(), 0);
        }
        public void TestVolumeWeightedStockPrice()
        {
            CommonStock commonStock = new CommonStock("Test", 8, 100);

            var now = DateTime.Now;

            var oneMinsBeforeNow   = now.AddMinutes(-1);
            var twoMinsBeforeNow   = now.AddMinutes(-2);
            var threeMinsBeforeNow = now.AddMinutes(-3);

            var firstTrade  = new Trade(1, TradeIndicator.Buy, 10, oneMinsBeforeNow);
            var secondTrade = new Trade(2, TradeIndicator.Buy, 10, twoMinsBeforeNow);
            var thirdTrade  = new Trade(3, TradeIndicator.Buy, 10, threeMinsBeforeNow);

            commonStock.AddNewTrade(firstTrade);
            commonStock.AddNewTrade(secondTrade);
            commonStock.AddNewTrade(thirdTrade);

            Assert.AreEqual(commonStock.CalculateVolumeWeightedStockPrice(), 10);
        }
Exemple #26
0
        public void TestCommonStockPERatio()
        {
            CommonStock stock;

            stock = new CommonStock("TST", 10, 100);

            float pe;

            // Test 0/10 => 0
            pe = stock.GetPERatio(0);
            Assert.AreEqual(0, pe, float.Epsilon);

            // Test 10/10 => 1
            pe = stock.GetPERatio(10);
            Assert.AreEqual(1, pe, float.Epsilon);

            // Test 10/0 => NaN
            stock.LastDividend = 0;
            pe = stock.GetPERatio(10);
            Assert.AreEqual(float.NaN, pe);

            // LastPrice
            stock = new CommonStock("TST", 10, 100);

            // Test 0/10 => 0
            stock.LastPrice = 0;
            pe = stock.GetPERatio();
            Assert.AreEqual(0, pe, float.Epsilon);

            // Test 10/10 => 1
            stock.LastPrice = 10;
            pe = stock.GetPERatio();
            Assert.AreEqual(1, pe, float.Epsilon);

            // Test 10/0 => NaN
            stock.LastPrice    = 10;
            stock.LastDividend = 0;
            pe = stock.GetPERatio();
            Assert.AreEqual(float.NaN, pe);
        }
        public void AddTrade_WithDetails_SuccessfullyAddsTradeToList()
        {
            // Arrange
            var dateTimeProvider = new Mock <IDateTimeProvider>();
            var localTimestamp   = new DateTime(2017, 2, 17, 22, 14, 44);

            dateTimeProvider.Setup(x => x.Now).Returns(localTimestamp);
            var tradeRepository = new TradeRepository(dateTimeProvider.Object);
            var teaStock        = new CommonStock {
                StockSymbol = "TEA"
            };

            // Act
            var trade = tradeRepository.AddTrade(teaStock, 100, TransactionType.Buy, 1.23M);

            // Assert
            Assert.AreEqual(1, tradeRepository.TradeCount);
            Assert.AreEqual(100, trade.Quantity);
            Assert.AreEqual(TransactionType.Buy, trade.TransactionType);
            Assert.AreEqual(1.23, trade.TradePrice);
            Assert.AreEqual(localTimestamp, trade.LocalTimestamp);
            Assert.AreEqual(teaStock, trade.Stock);
        }
Exemple #28
0
        public void Test_StocksVolumeWeightedStockPriceException()
        {
            string stock        = "GIN";
            double lastDividend = 0;
            double stockPrice   = 25;


            CommonStock testStock = new CommonStock(stock, lastDividend, stockPrice);

            //Add 10 trades

            testStock.addTrade(DateTime.Now.AddMinutes(-23), 100, true, 250);   //Sell 100 shares now at 250
            testStock.addTrade(DateTime.Now.AddMinutes(-21), 300, false, 260);  //Buy 300 shares now at 260
            testStock.addTrade(DateTime.Now.AddMinutes(-26), 10, true, 240);    //Sell 10 shares now at 240
            testStock.addTrade(DateTime.Now.AddMinutes(-22), 400, true, 230);   //Sell 400 shares now at 230
            testStock.addTrade(DateTime.Now.AddMinutes(-28), 1000, false, 235); //Sell 1000 shares now at 235
            testStock.addTrade(DateTime.Now.AddMinutes(-30), 100, true, 250);   //Sell 100 shares now at 250
            testStock.addTrade(DateTime.Now.AddMinutes(-16), 300, false, 260);  //Buy 300 shares now at 260
            testStock.addTrade(DateTime.Now.AddMinutes(-25), 10, true, 240);    //Sell 10 shares now at 240
            testStock.addTrade(DateTime.Now.AddMinutes(-42), 400, true, 230);   //Sell 400 shares now at 230
            testStock.addTrade(DateTime.Now.AddMinutes(-17), 1000, false, 235); //Sell 1000 shares now at 235

            double vwsp = testStock.volumeWeightedStockPrice();
        }