/// <summary> /// Finds the 2 most profitable days to trade on by comparing the highest and lowest stock prices for the month. /// </summary> /// <param name="monthlyStocks"></param> /// <returns>The two best trading days to buy and sell on.</returns> public static MostProfitableStocks FindMostProfitableStocks(List <Stock> monthlyStocks) { double largestStockPriceDifference = 0; MostProfitableStocks mostProfitableMonthlyStocks = null; foreach (Stock stockToBuy in monthlyStocks) { foreach (Stock stockToSell in monthlyStocks.Where(x => x.Day > stockToBuy.Day)) { double stockPriceDifference = stockToSell.Price - stockToBuy.Price; if (mostProfitableMonthlyStocks == null || stockPriceDifference >= largestStockPriceDifference) { largestStockPriceDifference = stockPriceDifference; mostProfitableMonthlyStocks = new MostProfitableStocks { StockToBuy = stockToBuy, StockToSell = stockToSell }; } } } return(mostProfitableMonthlyStocks); }
/// <summary> /// Outputs the 2 most profitable stocks of the month to buy and sell to the user /// </summary> /// <param name="mostProfitableStocks"></param> public static void OutputStocks(MostProfitableStocks mostProfitableStocks) { Console.WriteLine($"{mostProfitableStocks.StockToBuy.Day}({mostProfitableStocks.StockToBuy.Price}), {mostProfitableStocks.StockToSell.Day}({mostProfitableStocks.StockToSell.Price})"); Console.WriteLine("Press any key to exit..."); Console.ReadLine(); }
public void FindBestDaysToTradeOn_NoStocks() { // Arrange List <Stock> stocks = new List <Stock>(); // Act MostProfitableStocks mostProfitableStocks = ProfitableStockFinder.FindMostProfitableStocks(stocks); // Assert mostProfitableStocks.Should().BeNull(); }
/// <summary> /// Main /// </summary> /// <param name="args">The arguments.</param> public static void Main(string[] args) { string[] stockPricesInput = File.ReadAllText(@"L:\StockPriceInputFiles\ChallengeSampleDataSet1.txt").Split(','); List <Stock> monthlyStocks = StockBuilder.BuildStocks(stockPricesInput); MostProfitableStocks mostProfitableMonthlystocks = ProfitableStockFinder.FindMostProfitableStocks(monthlyStocks); if (mostProfitableMonthlystocks != null) { OutputMostProfitableStocks.OutputStocks(mostProfitableMonthlystocks); } else { Console.WriteLine("No stock prices found in file. Please ensure the input file contains comma seperated decimals only."); Console.WriteLine("Press any key to exit..."); Console.ReadLine(); } }
public void FindBestDaysToTradeOn_NoDifferenceInMonthlystockPrice() { // Arrange List <Stock> stocks = new List <Stock> { new Stock { Day = 1, Price = 1.00 }, new Stock { Day = 2, Price = 1.00 }, new Stock { Day = 3, Price = 1.00 }, new Stock { Day = 4, Price = 1.00 }, new Stock { Day = 5, Price = 1.00 }, }; // Act MostProfitableStocks mostProfitableStocks = ProfitableStockFinder.FindMostProfitableStocks(stocks); // Assert mostProfitableStocks.StockToBuy.Day.Should().Be(stocks[3].Day); mostProfitableStocks.StockToSell.Day.Should().Be(stocks[4].Day); }
public void FindBestDaysToTradeOn_Valid() { // Arrange List <Stock> stocks = new List <Stock> { new Stock { Day = 1, Price = 1.00 }, new Stock { Day = 2, Price = 2.00 } }; // Act MostProfitableStocks mostProfitableStocks = ProfitableStockFinder.FindMostProfitableStocks(stocks); // Assert mostProfitableStocks.StockToBuy.Should().BeEquivalentTo(stocks.First()); mostProfitableStocks.StockToSell.Should().BeEquivalentTo(stocks.Last()); }