Add scoring message
This commit is contained in:
@@ -60,6 +60,7 @@ public class Backtest
|
||||
[Required] public double Score { get; set; }
|
||||
public string RequestId { get; set; }
|
||||
public object? Metadata { get; set; }
|
||||
public string ScoreMessage { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// Creates a new TradingBotConfig based on this backtest's configuration for starting a live bot.
|
||||
|
||||
114
src/Managing.Domain/Backtests/BacktestScoringResult.cs
Normal file
114
src/Managing.Domain/Backtests/BacktestScoringResult.cs
Normal file
@@ -0,0 +1,114 @@
|
||||
using System.Text;
|
||||
|
||||
namespace Managing.Domain.Backtests;
|
||||
|
||||
public class BacktestScoringResult
|
||||
{
|
||||
public double Score { get; set; }
|
||||
public List<ScoringCheck> Checks { get; set; } = new();
|
||||
public string SummaryMessage { get; set; } = string.Empty;
|
||||
|
||||
public BacktestScoringResult(double score)
|
||||
{
|
||||
Score = score;
|
||||
}
|
||||
|
||||
public void AddCheck(string component, double score, double weight, string message, bool passed = true)
|
||||
{
|
||||
Checks.Add(new ScoringCheck
|
||||
{
|
||||
Component = component,
|
||||
Score = score,
|
||||
Weight = weight,
|
||||
Message = message,
|
||||
Passed = passed
|
||||
});
|
||||
}
|
||||
|
||||
public void AddEarlyExitCheck(string reason, string message)
|
||||
{
|
||||
Checks.Add(new ScoringCheck
|
||||
{
|
||||
Component = "Early Exit",
|
||||
Score = 0,
|
||||
Weight = 0,
|
||||
Message = message,
|
||||
Passed = false,
|
||||
IsEarlyExit = true
|
||||
});
|
||||
}
|
||||
|
||||
public void AddPenaltyCheck(string component, double penaltyMultiplier, string message)
|
||||
{
|
||||
Checks.Add(new ScoringCheck
|
||||
{
|
||||
Component = component,
|
||||
Score = 0,
|
||||
Weight = 0,
|
||||
Message = message,
|
||||
Passed = penaltyMultiplier >= 1.0,
|
||||
IsPenalty = true,
|
||||
PenaltyMultiplier = penaltyMultiplier
|
||||
});
|
||||
}
|
||||
|
||||
public string GenerateSummaryMessage()
|
||||
{
|
||||
if (Score == 0)
|
||||
{
|
||||
var earlyExit = Checks.FirstOrDefault(c => c.IsEarlyExit);
|
||||
if (earlyExit != null)
|
||||
{
|
||||
return $"Score: 0 - {earlyExit.Message}";
|
||||
}
|
||||
}
|
||||
|
||||
var passedChecks = Checks.Where(c => c.Passed && !c.IsEarlyExit && !c.IsPenalty).ToList();
|
||||
var failedChecks = Checks.Where(c => !c.Passed && !c.IsEarlyExit && !c.IsPenalty).ToList();
|
||||
var penalties = Checks.Where(c => c.IsPenalty).ToList();
|
||||
|
||||
var summary = new StringBuilder();
|
||||
summary.AppendLine($"Final Score: {Score:F1}/100");
|
||||
|
||||
if (passedChecks.Any())
|
||||
{
|
||||
summary.AppendLine($"✅ Passed Checks ({passedChecks.Count}):");
|
||||
foreach (var check in passedChecks.OrderByDescending(c => c.Score * c.Weight))
|
||||
{
|
||||
summary.AppendLine($" • {check.Component}: {check.Score:F1} points ({check.Message})");
|
||||
}
|
||||
}
|
||||
|
||||
if (failedChecks.Any())
|
||||
{
|
||||
summary.AppendLine($"❌ Failed Checks ({failedChecks.Count}):");
|
||||
foreach (var check in failedChecks)
|
||||
{
|
||||
summary.AppendLine($" • {check.Component}: {check.Message}");
|
||||
}
|
||||
}
|
||||
|
||||
if (penalties.Any())
|
||||
{
|
||||
summary.AppendLine($"⚠️ Applied Penalties ({penalties.Count}):");
|
||||
foreach (var penalty in penalties)
|
||||
{
|
||||
summary.AppendLine($" • {penalty.Component}: {penalty.Message}");
|
||||
}
|
||||
}
|
||||
|
||||
return summary.ToString().TrimEnd();
|
||||
}
|
||||
}
|
||||
|
||||
public class ScoringCheck
|
||||
{
|
||||
public string Component { get; set; } = string.Empty;
|
||||
public double Score { get; set; }
|
||||
public double Weight { get; set; }
|
||||
public string Message { get; set; } = string.Empty;
|
||||
public bool Passed { get; set; }
|
||||
public bool IsEarlyExit { get; set; }
|
||||
public bool IsPenalty { get; set; }
|
||||
public double PenaltyMultiplier { get; set; }
|
||||
}
|
||||
@@ -16,4 +16,5 @@ public class LightBacktest
|
||||
public decimal Fees { get; set; }
|
||||
public double? SharpeRatio { get; set; }
|
||||
public double Score { get; set; }
|
||||
public string ScoreMessage { get; set; } = string.Empty;
|
||||
}
|
||||
Reference in New Issue
Block a user