Create a simulation to test 1 month of data in 30 mins
This commit is contained in:
@@ -17,14 +17,17 @@ namespace Controllers.Automation {
|
||||
_paymentProcessor = PaymentProcessor;
|
||||
}
|
||||
|
||||
public void GlobalPredictAI() {
|
||||
public void GlobalPredictAI(int DaysBefore = 0, bool testmode = false) {
|
||||
|
||||
// Start this process on a background thread so its non-blocking
|
||||
Task thread = new Task(() => {
|
||||
|
||||
// Load the userlist
|
||||
List<string>? UserList = JsonConvert.DeserializeObject<List<string>>(_dbDriver.Get("Users"));
|
||||
List<string> VerifiedUserList = UserList != null ? UserList : new List<string>();
|
||||
List<string> VerifiedUserList = new List<string>(){ "TESTMODE" };
|
||||
if (!testmode) {
|
||||
List<string>? UserList = JsonConvert.DeserializeObject<List<string>>(_dbDriver.Get("Users"));
|
||||
VerifiedUserList = UserList != null ? UserList : new List<string>();
|
||||
}
|
||||
|
||||
// Process each request at the same time for speed improvement
|
||||
Parallel.ForEach(VerifiedUserList, async (username) => {
|
||||
@@ -40,7 +43,7 @@ namespace Controllers.Automation {
|
||||
|
||||
// Predict the trend on a new thread
|
||||
Task thread = new Task(() => {
|
||||
(string, float)Result = _aiModule.PredictAI(cur.Symbol);
|
||||
(string, float)Result = _aiModule.PredictAI(cur.Symbol, DaysBefore);
|
||||
|
||||
// If error log it
|
||||
if (!string.IsNullOrEmpty(Result.Item1)){
|
||||
|
||||
@@ -0,0 +1,111 @@
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
@@ -27,8 +27,8 @@ namespace Controllers.PythonInterop {
|
||||
}
|
||||
|
||||
// Return ( Error, Signal )
|
||||
public (string, float) PredictAI(string StockSymbol) {
|
||||
(bool, string) Success = PyProcess.RunPythonProcess(_PyPath, _ExecPath + "/aipredictor.py", returns: true, PyArgs: StockSymbol);
|
||||
public (string, float) PredictAI(string StockSymbol, int DataEndDaysAgo = 0) {
|
||||
(bool, string) Success = PyProcess.RunPythonProcess(_PyPath, _ExecPath + "/aipredictor.py", returns: true, PyArgs: $"{StockSymbol} {DataEndDaysAgo}");
|
||||
if (!Success.Item1) {
|
||||
return (Success.Item2, 0);
|
||||
} else {
|
||||
|
||||
Reference in New Issue
Block a user