Add scoring message

This commit is contained in:
2025-07-17 15:57:51 +07:00
parent da48ee37ba
commit e27b4c4a76
9 changed files with 224 additions and 46 deletions

View File

@@ -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.

View 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; }
}

View File

@@ -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;
}