Files
AI-Stock-Trader/WebServer/Controllers/ProjectTest.cs
T

111 lines
3.9 KiB
C#

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<Stock> TrackedStocks = new List<Stock>() {
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<PurchasedStock> StockHistory = new List<PurchasedStock>();
AIModule _aiModule;
public D683_Project_Test( AIModule aiModule ) {
_aiModule = aiModule;
}
public async Task<float> 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<Task> threadpool = new List<Task>();
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;
}
}
}