225 lines
7.5 KiB
Plaintext
225 lines
7.5 KiB
Plaintext
@page "/"
|
|
@using Controllers.Payment
|
|
@using Controllers.ProjectTest
|
|
@using Microsoft.Extensions.FileSystemGlobbing.Internal.PathSegments
|
|
@rendermode InteractiveServer
|
|
|
|
<PageTitle>Home</PageTitle>
|
|
|
|
<div class="main-area">
|
|
|
|
<!-- Login Frame -->
|
|
@if (Session == null){
|
|
<div class="gridFrame">
|
|
<div><h2>LOGIN</h2></div>
|
|
<div class="loginRow">
|
|
<div><span>username</span></div>
|
|
<input @bind-value="userName" type="text" />
|
|
</div>
|
|
<div class="loginRow">
|
|
<div><span>password</span></div>
|
|
<input @bind-value="passWord" type="password" />
|
|
</div>
|
|
<div class="loginRow">
|
|
<button @onclick="LoginSession">Login</button>
|
|
<button @onclick="registerSession">Register</button>
|
|
</div>
|
|
<div>
|
|
<span style="color: red;">@loginError</span>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- User Frame -->
|
|
}else{
|
|
<div class="gridFrame">
|
|
<div><h2>Account</h2></div>
|
|
<span>UserName: @Session.UserName</span><br />
|
|
<div>
|
|
<span>Money: $@Session.Money</span>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Tool Frame -->
|
|
<div>
|
|
<div class="gridFrame">
|
|
<div>
|
|
<div><h2>Actions</h2></div>
|
|
<div>
|
|
<input placeholder="Stock Symbol [NVDA]" @bind="addStockSymbol" />
|
|
<button @onclick="addStock">Add To Watched Stocks</button>
|
|
</div>
|
|
<br />
|
|
<div>
|
|
<button @onclick="RunTest">Run 1Mo Evaluation</button>
|
|
<br />
|
|
<span>@TestResults</span>
|
|
</div>
|
|
<span>@resultError</span>
|
|
</div>
|
|
</div>
|
|
<!-- Tracked Stocks -->
|
|
<div style="margin-top: 20px;" class="gridFrame">
|
|
<div>
|
|
<h2>Watched Stocks</h2>
|
|
</div>
|
|
<div style="column-count: 2;">
|
|
@foreach (Stock cur in Session.TrackedStocks){
|
|
<div class="signalBlock">
|
|
<p style="text-align: center; font-weight: bold;">@cur.Symbol</p>
|
|
<p>AI Predicted Score: @cur.Score</p>
|
|
<button @onclick="() => {removeStock(cur);}">Remove</button>
|
|
</div>
|
|
}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
}
|
|
|
|
<!-- AI Frame -->
|
|
@if (Session != null){
|
|
<div>
|
|
<!-- Trade History -->
|
|
<div class="gridFrame">
|
|
<div>
|
|
<h2>Auto Trade History</h2>
|
|
</div>
|
|
@foreach (PurchasedStock cur in Session.TradeHistory){
|
|
<div class="signalBlock">
|
|
<p style="text-align: center; font-weight: bold;">@cur.Symbol</p>
|
|
<p>Purchased Quantity: @cur.Quantity</p>
|
|
<p>Purchased Price: @cur.PurchasePrice</p>
|
|
<p>Sell Price: @cur.PurchasePrice</p>
|
|
</div>
|
|
}
|
|
</div>
|
|
</div>
|
|
}
|
|
|
|
</div>
|
|
|
|
@code {
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////////////
|
|
/// Code Region
|
|
/////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
loginSession? Session = null;
|
|
string resultError = "";
|
|
|
|
|
|
|
|
|
|
// Login Stuff
|
|
string userName = "";
|
|
string passWord = "";
|
|
string loginError = "";
|
|
void LoginSession(){
|
|
string dbPrefix = $"[{userName.ToLower()}]:";
|
|
|
|
// Check if user already exists
|
|
string passwordhash = dbDriver.Get( dbPrefix + "password" );
|
|
if (string.IsNullOrEmpty(passwordhash)){
|
|
loginError = "no account found with that username";
|
|
return;
|
|
}
|
|
|
|
// Check the password is valid
|
|
if (!BCrypt.Verify( passWord, passwordhash )){
|
|
loginError = "wrong password";
|
|
return;
|
|
}
|
|
|
|
// Load the users account
|
|
List<PurchasedStock>? history = JsonConvert.DeserializeObject<List<PurchasedStock>>( dbDriver.Get( dbPrefix + "history" ) );
|
|
List<Stock>? stocks = JsonConvert.DeserializeObject<List<Stock>>( dbDriver.Get( dbPrefix + "watched" ) );
|
|
bool moneyLoaded = float.TryParse(dbDriver.Get( dbPrefix + "money" ), out float moneyResult);
|
|
Session = new loginSession(){
|
|
UserName = userName.ToLower(),
|
|
TradeHistory = history != null ? history : new List<PurchasedStock>(),
|
|
TrackedStocks = stocks != null ? stocks : new List<Stock>(),
|
|
Money = moneyLoaded ? moneyResult : 1000
|
|
};
|
|
}
|
|
|
|
void registerSession(){
|
|
string dbPrefix = $"[{userName.ToLower()}]:";
|
|
|
|
// Check if user already exists
|
|
string passwordhash = dbDriver.Get( dbPrefix + "password" );
|
|
if (!string.IsNullOrEmpty(passwordhash)){
|
|
loginError = "account is taken";
|
|
return;
|
|
}
|
|
|
|
// Create User Object on the database
|
|
dbDriver.Set( dbPrefix + "password", BCrypt.HashPassword( passWord, BCrypt.GenerateSalt() ) );
|
|
dbDriver.Set( dbPrefix + "money", "1000" );
|
|
Session = new loginSession(){
|
|
UserName = userName.ToLower(),
|
|
TradeHistory = new List<PurchasedStock>(),
|
|
TrackedStocks = new List<Stock>(),
|
|
Money = 1000
|
|
};
|
|
|
|
// Add the users to a global table for automation
|
|
List<string>? Users = JsonConvert.DeserializeObject<List<string>>( dbDriver.Get( "Users" ) );
|
|
List<string> verifiedUsers = Users != null ? Users : new List<string>();
|
|
verifiedUsers.Add(userName.ToLower());
|
|
dbDriver.Set( "Users", JsonConvert.SerializeObject(verifiedUsers) );
|
|
}
|
|
|
|
|
|
|
|
|
|
string addStockSymbol = "";
|
|
void addStock(){
|
|
|
|
// Make sure a session exists
|
|
if (Session == null){
|
|
return;
|
|
}
|
|
|
|
// Add a tracked stock to the users account
|
|
Session.TrackedStocks.Add(new Stock(){
|
|
Symbol = addStockSymbol.ToUpper()
|
|
});
|
|
|
|
// Save the users account
|
|
string dbPrefix = $"[{userName.ToLower()}]:";
|
|
dbDriver.Set(dbPrefix + "watched", JsonConvert.SerializeObject(Session.TrackedStocks) );
|
|
}
|
|
|
|
|
|
|
|
|
|
void removeStock(Stock stock){
|
|
|
|
// Make sure a session exists
|
|
if (Session == null){
|
|
return;
|
|
}
|
|
|
|
// Remove the stock
|
|
Session.TrackedStocks.Remove(stock);
|
|
|
|
// Save the users account
|
|
string dbPrefix = $"[{userName.ToLower()}]:";
|
|
dbDriver.Set(dbPrefix + "watched", JsonConvert.SerializeObject(Session.TrackedStocks) );
|
|
}
|
|
|
|
|
|
string TestResults = "";
|
|
async Task RunTest(){
|
|
|
|
// Make sure a session exists
|
|
if (Session == null){
|
|
return;
|
|
}
|
|
|
|
// Simulate 1 month
|
|
D683_Project_Test tests = new D683_Project_Test(aiModule);
|
|
float score = await tests.Simulate(Session.TrackedStocks);
|
|
TestResults = $"The amount of money the AI did better than the SPY: ${score} or { score / 10 }% better";
|
|
}
|
|
|
|
} |