using Controllers.PythonInterop; using Entities; using Microsoft.AspNetCore.Razor.TagHelpers; namespace Controllers.ProjectTest { public class D683_Project_Test { // TESTING Starting Money float Money = 1000; // TESTING WATCH STOCK LIST List TrackedStocks = new List() { new Stock(){ Symbol="NVDA" }, new Stock(){ Symbol="INTL" }, new Stock(){ Symbol="AAPL" }, new Stock(){ Symbol="SHOP" }, new Stock(){ Symbol="PANW" }, new Stock(){ Symbol="BBBY" }, new Stock(){ Symbol="REAL" }, new Stock(){ Symbol="W" }, new Stock(){ Symbol="ROKU" }, new Stock(){ Symbol="FUN" } }; // TESTING STOCK HISTORY List StockHistory = new List(); AIModule _aiModule; public D683_Project_Test( AIModule aiModule ) { _aiModule = aiModule; } public async Task Simulate() { float StartingMoney = Money; // Run once for each day 30 days straight for (int i=30; i>=0; i--) { // Go through each watched stock and find the highest prediction List threadpool = new List(); foreach(Stock cur in TrackedStocks) { // Predict the trend on a new thread Task thread = new Task(async () => { (string, float)Result = _aiModule.PredictAI(cur.Symbol, i); // If error log it if (!string.IsNullOrEmpty(Result.Item1)){ Console.WriteLine(Result.Item1); } // Write the score to the users tracked stocks cur.Score = Result.Item2; }); thread.Start(); threadpool.Add(thread); } // Wait for all processes to finish await Task.WhenAll( threadpool ); // Get the highest ranked Stock HighestRanking = new Stock(){ Symbol="NVDA", Score = -400 }; // Just a placeholder incase an empty list comes through there is a fallback foreach(Stock cur in TrackedStocks) { if (HighestRanking.Score < cur.Score) { HighestRanking = cur; } } // Sell all stocks float totalSale = 0; foreach(PurchasedStock cur in StockHistory) { if (cur.Sold == false) { // Get sell price float sellPrice = cur.Quantity * _aiModule.GetCurrentPrice( cur.Symbol ); // Add up the total sale totalSale += sellPrice; // Mark as sold cur.Sold = true; } } Money += totalSale; // Dont buy anything on the last run if (i != 0) { // Buy predicted stock float stockPrice = _aiModule.GetCurrentPrice( HighestRanking.Symbol ); // Get max stocks user can purchase [ int cast truncates the decimal ] int MaxQty = (int)( Money / stockPrice ); // Add the stock StockHistory.Add( new PurchasedStock(){ Symbol = HighestRanking.Symbol.ToUpper(), PurchasePrice = stockPrice, Quantity = MaxQty, } ); Money = Money - ( stockPrice * MaxQty ); } } // Return a score [Bigger than 0 is money earned] or [Less than 0 is money lost] return Money - StartingMoney; } } }