diff --git a/src/Managing.Application.Tests/BotsTests.cs b/src/Managing.Application.Tests/BotsTests.cs index ac7f5dc..e16521b 100644 --- a/src/Managing.Application.Tests/BotsTests.cs +++ b/src/Managing.Application.Tests/BotsTests.cs @@ -688,7 +688,8 @@ namespace Managing.Application.Tests tradingBalance: config.BotTradingBalance, startDate: backtestResult.StartDate, endDate: backtestResult.EndDate, - timeframe: config.Timeframe + timeframe: config.Timeframe, + moneyManagement: config.MoneyManagement ); var scenarioResult = new ScenarioBacktestResult diff --git a/src/Managing.Application/Backtesting/Backtester.cs b/src/Managing.Application/Backtesting/Backtester.cs index a97a594..031081d 100644 --- a/src/Managing.Application/Backtesting/Backtester.cs +++ b/src/Managing.Application/Backtesting/Backtester.cs @@ -325,7 +325,8 @@ namespace Managing.Application.Backtesting tradingBalance: config.BotTradingBalance, startDate: candles[0].Date, endDate: candles.Last().Date, - timeframe: config.Timeframe + timeframe: config.Timeframe, + moneyManagement: config.MoneyManagement ); var scoringResult = BacktestScorer.CalculateDetailedScore(scoringParams); diff --git a/src/Managing.Domain/Backtests/BacktestScoringParams.cs b/src/Managing.Domain/Backtests/BacktestScoringParams.cs index fcef9b5..37844f7 100644 --- a/src/Managing.Domain/Backtests/BacktestScoringParams.cs +++ b/src/Managing.Domain/Backtests/BacktestScoringParams.cs @@ -1,3 +1,4 @@ +using Managing.Domain.MoneyManagements; using static Managing.Common.Enums; namespace Managing.Domain.Backtests; @@ -20,6 +21,7 @@ public class BacktestScoringParams public DateTime StartDate { get; } public DateTime EndDate { get; } public Timeframe Timeframe { get; } + public MoneyManagement MoneyManagement { get; } public BacktestScoringParams( double sharpeRatio, @@ -35,7 +37,8 @@ public class BacktestScoringParams decimal tradingBalance = 0, DateTime startDate = default, DateTime endDate = default, - Timeframe timeframe = Timeframe.OneHour) + Timeframe timeframe = Timeframe.OneHour, + MoneyManagement moneyManagement = null) { SharpeRatio = sharpeRatio; GrowthPercentage = growthPercentage; @@ -51,5 +54,6 @@ public class BacktestScoringParams StartDate = startDate; EndDate = endDate; Timeframe = timeframe; + MoneyManagement = moneyManagement; } } \ No newline at end of file diff --git a/src/Managing.Domain/Shared/Helpers/BacktestScore.cs b/src/Managing.Domain/Shared/Helpers/BacktestScore.cs index fd47b5a..f25a6c4 100644 --- a/src/Managing.Domain/Shared/Helpers/BacktestScore.cs +++ b/src/Managing.Domain/Shared/Helpers/BacktestScore.cs @@ -189,6 +189,19 @@ public class BacktestScorer result.AddPenaltyCheck("HODL Underperformance", newMultiplier, $"Underperforming HODL by {hodlUnderperformance:F2}% applied {hodlPenalty:F1}% penalty"); } + // 9. Money Management Risk/Reward Penalty (Dynamic) + if (p.MoneyManagement != null && p.MoneyManagement.StopLoss > 0 && p.MoneyManagement.TakeProfit > 0) + { + var riskRewardRatio = (double)(p.MoneyManagement.TakeProfit / p.MoneyManagement.StopLoss); + if (riskRewardRatio <= 1.0) // If Risk/Reward ratio is not above 1:1 + { + var riskRewardPenalty = (1.0 - riskRewardRatio) * 0.5; // 50% penalty per 0.1 ratio below 1.0 + var newMultiplier = Math.Max(0.2, 1 - riskRewardPenalty); + penaltyMultiplier *= newMultiplier; + result.AddPenaltyCheck("Poor Risk/Reward Ratio", newMultiplier, $"Risk/Reward ratio of {riskRewardRatio:F2}:1 below 1:1 threshold applied {riskRewardPenalty:F1}% penalty"); + } + } + return baseScore * penaltyMultiplier; }