SoftTraderBackend/ServiceHandler/PercentChangeEvaluator.cs
2026-03-20 12:38:18 -04:00

45 lines
1.3 KiB
C#

using System.Text.Json;
using Backend.DatabaseHandler;
using Backend.Interface;
namespace Backend.ServiceHander;
public sealed class PercentChangeEvaluator : IAlertEvaluator
{
public string AlertType => "percent_change";
public Task<AlertEvaluation> EvaluateAsync(AlertRecord alert, MarketDataService marketData)
{
var parameters = JsonSerializer.Deserialize<PercentChangeParameters>(alert.Parameters)
?? throw new InvalidOperationException($"Invalid parameters for alert {alert.Id}");
var snapshot = marketData.GetLiveQuote(alert.Symbol);
if (!snapshot.LastPrice.HasValue || !snapshot.PreviousClose.HasValue || snapshot.PreviousClose.Value == 0)
{
return Task.FromResult(new AlertEvaluation { Triggered = false });
}
double price = snapshot.LastPrice.Value;
double prevClose = snapshot.PreviousClose.Value;
double percentChange = (price - prevClose) / prevClose * 100.0;
bool triggered = parameters.PercentThreshold >= 0
? percentChange >= parameters.PercentThreshold
: percentChange <= parameters.PercentThreshold;
string updatedState = JsonSerializer.Serialize(new { lastPrice = price, percentChange });
return Task.FromResult(new AlertEvaluation
{
Triggered = triggered,
UpdatedLastState = updatedState
});
}
private sealed class PercentChangeParameters
{
public double PercentThreshold { get; set; }
}
}