diff --git a/src/Managing.Api/Controllers/BacktestController.cs b/src/Managing.Api/Controllers/BacktestController.cs index 14356d4..77eec85 100644 --- a/src/Managing.Api/Controllers/BacktestController.cs +++ b/src/Managing.Api/Controllers/BacktestController.cs @@ -192,7 +192,8 @@ public class BacktestController : BaseController MaxDrawdown = b.MaxDrawdown, Fees = b.Fees, SharpeRatio = b.SharpeRatio, - Score = b.Score + Score = b.Score, + ScoreMessage = b.ScoreMessage }), TotalCount = totalCount, CurrentPage = page, @@ -256,7 +257,8 @@ public class BacktestController : BaseController MaxDrawdown = b.MaxDrawdown, Fees = b.Fees, SharpeRatio = b.SharpeRatio, - Score = b.Score + Score = b.Score, + ScoreMessage = b.ScoreMessage }), TotalCount = totalCount, CurrentPage = page, diff --git a/src/Managing.Application.Tests/CryptoHelpersTests.cs b/src/Managing.Application.Tests/CryptoHelpersTests.cs index 7d5ccfc..83a8324 100644 --- a/src/Managing.Application.Tests/CryptoHelpersTests.cs +++ b/src/Managing.Application.Tests/CryptoHelpersTests.cs @@ -10,8 +10,8 @@ public class CryptoHelpersTests public void EncryptAesGcm_And_DecryptAesGcm_RoundTrip_Works() { // Arrange - var secretKey = "supersecretkey1234567890123456"; // 32 bytes - var token = "0x1234567890abcdef-johndoe"; + var secretKey = "KaigenXCowchain"; // 32 bytes + var token = "0xC6327E7191726EDBcaA7f8b7FBec147dc2A5d830-NotOsasa"; // Act var encrypted = CryptoHelpers.EncryptAesGcm(token, secretKey); diff --git a/src/Managing.Application/Backtesting/Backtester.cs b/src/Managing.Application/Backtesting/Backtester.cs index 8836e1d..c4153eb 100644 --- a/src/Managing.Application/Backtesting/Backtester.cs +++ b/src/Managing.Application/Backtesting/Backtester.cs @@ -335,7 +335,7 @@ namespace Managing.Application.Backtesting ? AggregateValues(indicatorsValues, bot.IndicatorsValues) : new Dictionary(), Score = scoringResult.Score, - ScoreMessage = scoringResult.SummaryMessage, + ScoreMessage = scoringResult.GenerateSummaryMessage(), Id = Guid.NewGuid().ToString(), RequestId = requestId, Metadata = metadata, diff --git a/src/Managing.Application/Shared/MessengerService.cs b/src/Managing.Application/Shared/MessengerService.cs index 3c22747..5ca789f 100644 --- a/src/Managing.Application/Shared/MessengerService.cs +++ b/src/Managing.Application/Shared/MessengerService.cs @@ -258,6 +258,7 @@ public class MessengerService : IMessengerService $"{(config.MaxPositionTimeHours.HasValue && config.MaxPositionTimeHours.Value > 0 ? $"ā° Max Position Time (hrs): {config.MaxPositionTimeHours.Value} | " : "")}šŸ Close Early When Profitable: {(config.CloseEarlyWhenProfitable ? "Yes" : "No")}\n" + $"\nšŸ“ˆ Performance Metrics:\n" + $"⭐ Score: {score:F1}/100\n" + + $"šŸ” Score Analysis: {backtest.ScoreMessage}\n" + $"šŸ† Win Rate: {winRate:F1}%\n" + $"šŸ“Š Total Trades: {tradeCount}\n" + $"šŸ’° Final PnL: ${finalPnl:F2}\n" + diff --git a/src/Managing.Domain/Backtests/BacktestScoringResult.cs b/src/Managing.Domain/Backtests/BacktestScoringResult.cs index 00c6250..13ac306 100644 --- a/src/Managing.Domain/Backtests/BacktestScoringResult.cs +++ b/src/Managing.Domain/Backtests/BacktestScoringResult.cs @@ -54,22 +54,23 @@ public class BacktestScoringResult 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 earlyExits = Checks.Where(c => c.IsEarlyExit).ToList(); var summary = new StringBuilder(); summary.AppendLine($"Final Score: {Score:F1}/100"); + if (earlyExits.Any()) + { + summary.AppendLine($"🚫 Early Exit Reasons ({earlyExits.Count}):"); + foreach (var earlyExit in earlyExits) + { + summary.AppendLine($" • {earlyExit.Component}: {earlyExit.Message}"); + } + } + if (passedChecks.Any()) { summary.AppendLine($"āœ… Passed Checks ({passedChecks.Count}):"); diff --git a/src/Managing.Infrastructure.Database/BacktestRepository.cs b/src/Managing.Infrastructure.Database/BacktestRepository.cs index 9b02eed..2634926 100644 --- a/src/Managing.Infrastructure.Database/BacktestRepository.cs +++ b/src/Managing.Infrastructure.Database/BacktestRepository.cs @@ -104,6 +104,7 @@ public class BacktestRepository : IBacktestRepository .Include(b => b.StartDate) .Include(b => b.EndDate) .Include(b => b.Score) + .Include(b => b.ScoreMessage) .Include(b => b.Config) .Include(b => b.Fees) .Include(b => b.Statistics); @@ -232,6 +233,7 @@ public class BacktestRepository : IBacktestRepository .Include(b => b.StartDate) .Include(b => b.EndDate) .Include(b => b.Score) + .Include(b => b.ScoreMessage) .Include(b => b.Config) .Include(b => b.Fees) .Include(b => b.Statistics); diff --git a/src/Managing.WebApp/src/components/organism/Backtest/backtestTable.tsx b/src/Managing.WebApp/src/components/organism/Backtest/backtestTable.tsx index ff47297..7ce70b2 100644 --- a/src/Managing.WebApp/src/components/organism/Backtest/backtestTable.tsx +++ b/src/Managing.WebApp/src/components/organism/Backtest/backtestTable.tsx @@ -267,16 +267,36 @@ const BacktestTable: React.FC = ({list, isFetching, onSortCh { Header: 'Score', accessor: 'score', - Cell: ({cell}: any) => ( - - {cell.row.values.score.toFixed(2)} - - ), + Cell: ({cell}: any) => { + const backtest = cell.row.original as LightBacktestResponse; + const scoreMessage = backtest.scoreMessage || 'No scoring details available'; + + return ( +
+
+ {cell.row.values.score.toFixed(2)} +
+
+
+ {scoreMessage} +
+
+
+ ); + }, disableFilters: true, disableSortBy: false, sortType: 'basic', diff --git a/src/Managing.WebApp/src/generated/ManagingApi.ts b/src/Managing.WebApp/src/generated/ManagingApi.ts index 934a507..a38631a 100644 --- a/src/Managing.WebApp/src/generated/ManagingApi.ts +++ b/src/Managing.WebApp/src/generated/ManagingApi.ts @@ -3432,6 +3432,7 @@ export interface Backtest { score: number; requestId?: string; metadata?: any | null; + scoreMessage?: string; } export interface TradingBotConfig { @@ -3816,6 +3817,7 @@ export interface LightBacktestResponse { fees?: number; sharpeRatio?: number | null; score?: number; + scoreMessage?: string | null; } export interface RunBacktestRequest { diff --git a/src/Managing.WebApp/src/generated/ManagingApiTypes.ts b/src/Managing.WebApp/src/generated/ManagingApiTypes.ts index 0b76101..b1b9723 100644 --- a/src/Managing.WebApp/src/generated/ManagingApiTypes.ts +++ b/src/Managing.WebApp/src/generated/ManagingApiTypes.ts @@ -238,6 +238,7 @@ export interface Backtest { score: number; requestId?: string; metadata?: any | null; + scoreMessage?: string; } export interface TradingBotConfig { @@ -622,6 +623,7 @@ export interface LightBacktestResponse { fees?: number; sharpeRatio?: number | null; score?: number; + scoreMessage?: string | null; } export interface RunBacktestRequest {