45 lines
1.3 KiB
C#
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; }
|
|
}
|
|
}
|