From 2cc6cc5deec6f875636a60d31d24f049e128da41 Mon Sep 17 00:00:00 2001 From: cryptooda Date: Thu, 13 Nov 2025 11:56:11 +0700 Subject: [PATCH] Refactor BacktestExecutor to use net PnL calculations consistently across methods. Updated variable names for clarity and ensured final results reflect net profit after fees. Minor adjustment in TradingBotBase to directly access net PnL from position profit and loss. --- src/Managing.Application/Backtests/BacktestExecutor.cs | 10 +++++----- src/Managing.Application/Bots/TradingBotBase.cs | 2 +- .../src/components/organism/PositionsModal/index.tsx | 1 + 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/Managing.Application/Backtests/BacktestExecutor.cs b/src/Managing.Application/Backtests/BacktestExecutor.cs index bc2c42cb..f1cd0b03 100644 --- a/src/Managing.Application/Backtests/BacktestExecutor.cs +++ b/src/Managing.Application/Backtests/BacktestExecutor.cs @@ -335,11 +335,11 @@ public class BacktestExecutor var resultCalculationStart = Stopwatch.GetTimestamp(); // Calculate final results (using existing optimized methods) - var finalPnl = tradingBot.GetProfitAndLoss(); + var netPnl = tradingBot.GetProfitAndLoss(); // This returns Net PnL (after fees) var winRate = tradingBot.GetWinRate(); var stats = TradingHelpers.GetStatistics(tradingBot.WalletBalances); var growthPercentage = - TradingHelpers.GetGrowthFromInitalBalance(tradingBot.WalletBalances.FirstOrDefault().Value, finalPnl); + TradingHelpers.GetGrowthFromInitalBalance(tradingBot.WalletBalances.FirstOrDefault().Value, netPnl); var hodlPercentage = TradingHelpers.GetHodlPercentage(candles.First(), candles.Last()); var fees = tradingBot.GetTotalFees(); @@ -348,7 +348,7 @@ public class BacktestExecutor growthPercentage: (double)growthPercentage, hodlPercentage: (double)hodlPercentage, winRate: winRate, - totalPnL: (double)finalPnl, + totalPnL: (double)netPnl, fees: (double)fees, tradeCount: tradingBot.Positions.Count, maxDrawdownRecoveryTime: stats.MaxDrawdownRecoveryTime, @@ -378,7 +378,7 @@ public class BacktestExecutor var result = new Backtest(config, tradingBot.Positions, tradingBot.Signals, withCandles ? candles : new HashSet()) { - FinalPnl = finalPnl, + FinalPnl = netPnl, // Net PnL (after fees) WinRate = winRate, GrowthPercentage = growthPercentage, HodlPercentage = hodlPercentage, @@ -393,7 +393,7 @@ public class BacktestExecutor StartDate = candles.FirstOrDefault()!.OpenTime, EndDate = candles.LastOrDefault()!.OpenTime, InitialBalance = initialBalance, - NetPnl = finalPnl - fees, + NetPnl = netPnl, // Already net of fees }; if (save && user != null) diff --git a/src/Managing.Application/Bots/TradingBotBase.cs b/src/Managing.Application/Bots/TradingBotBase.cs index 558277a0..a17430aa 100644 --- a/src/Managing.Application/Bots/TradingBotBase.cs +++ b/src/Managing.Application/Bots/TradingBotBase.cs @@ -2132,7 +2132,7 @@ public class TradingBotBase : ITradingBot { if (position.IsValidForMetrics() && position.ProfitAndLoss != null) { - netPnl += position.GetPnLBeforeFees(); + netPnl += position.ProfitAndLoss.Net; } } diff --git a/src/Managing.WebApp/src/components/organism/PositionsModal/index.tsx b/src/Managing.WebApp/src/components/organism/PositionsModal/index.tsx index d587d02e..67a26f14 100644 --- a/src/Managing.WebApp/src/components/organism/PositionsModal/index.tsx +++ b/src/Managing.WebApp/src/components/organism/PositionsModal/index.tsx @@ -1,2 +1,3 @@ export { default as PositionsModal } from './PositionsModal' +