From faec7e2e5a9f738fc9161bcf2a844191ce914ed8 Mon Sep 17 00:00:00 2001 From: cryptooda Date: Sun, 5 Oct 2025 03:21:59 +0700 Subject: [PATCH] Fix win and loses count --- src/Managing.Api/Controllers/DataController.cs | 11 ++++++----- src/Managing.Domain/Shared/Helpers/TradingBox.cs | 3 ++- .../PostgreSql/PostgreSqlBotRepository.cs | 4 ++-- .../src/pages/dashboardPage/agentSearch.tsx | 1 + 4 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/Managing.Api/Controllers/DataController.cs b/src/Managing.Api/Controllers/DataController.cs index 8ba731dc..25f8c7d5 100644 --- a/src/Managing.Api/Controllers/DataController.cs +++ b/src/Managing.Api/Controllers/DataController.cs @@ -475,14 +475,15 @@ public class DataController : ControllerBase decimal totalVolume = strategy.Volume; decimal volumeLast24h = strategy.Volume; - // Calculate win/loss statistics - (int wins, int losses) = (strategy.TradeWins, strategy.TradeLosses); - - int winRate = wins + losses > 0 ? (wins * 100) / (wins + losses) : 0; - // Fetch positions associated with this bot using the provided trading service var positions = await tradingService.GetPositionsByInitiatorIdentifierAsync(strategy.Identifier); + // Calculate win/loss statistics from actual positions (including open positions) + int wins = positions.Count(p => p.ProfitAndLoss != null && p.ProfitAndLoss.Realized > 0); + int losses = positions.Count(p => p.ProfitAndLoss != null && p.ProfitAndLoss.Realized <= 0); + + int winRate = wins + losses > 0 ? (wins * 100) / (wins + losses) : 0; + // Convert positions to view models var positionViewModels = positions.Select(MapPositionToViewModel).ToList(); diff --git a/src/Managing.Domain/Shared/Helpers/TradingBox.cs b/src/Managing.Domain/Shared/Helpers/TradingBox.cs index ae8a67b1..0cde6131 100644 --- a/src/Managing.Domain/Shared/Helpers/TradingBox.cs +++ b/src/Managing.Domain/Shared/Helpers/TradingBox.cs @@ -526,6 +526,7 @@ public static class TradingBox /// /// Gets the win/loss counts from positions + /// Counts all positions including open ones based on their current PnL /// /// List of positions to analyze /// A tuple containing (wins, losses) @@ -540,7 +541,7 @@ public static class TradingBox { wins++; } - else + else if (position.ProfitAndLoss != null && position.ProfitAndLoss.Realized <= 0) { losses++; } diff --git a/src/Managing.Infrastructure.Database/PostgreSql/PostgreSqlBotRepository.cs b/src/Managing.Infrastructure.Database/PostgreSql/PostgreSqlBotRepository.cs index a9dc36ab..91d51add 100644 --- a/src/Managing.Infrastructure.Database/PostgreSql/PostgreSqlBotRepository.cs +++ b/src/Managing.Infrastructure.Database/PostgreSql/PostgreSqlBotRepository.cs @@ -219,8 +219,8 @@ public class PostgreSqlBotRepository : IBotRepository ? query.OrderBy(b => b.Pnl) : query.OrderByDescending(b => b.Pnl), "winrate" => sortDirection.ToLower() == "asc" - ? query.OrderBy(b => b.TradeWins / (b.TradeWins + b.TradeLosses)) - : query.OrderByDescending(b => b.TradeWins / (b.TradeWins + b.TradeLosses)), + ? query.OrderBy(b => (b.TradeWins + b.TradeLosses) > 0 ? (double)b.TradeWins / (b.TradeWins + b.TradeLosses) : 0) + : query.OrderByDescending(b => (b.TradeWins + b.TradeLosses) > 0 ? (double)b.TradeWins / (b.TradeWins + b.TradeLosses) : 0), "agentname" => sortDirection.ToLower() == "asc" ? query.OrderBy(b => b.User.AgentName) : query.OrderByDescending(b => b.User.AgentName), diff --git a/src/Managing.WebApp/src/pages/dashboardPage/agentSearch.tsx b/src/Managing.WebApp/src/pages/dashboardPage/agentSearch.tsx index 860f6926..754e3264 100644 --- a/src/Managing.WebApp/src/pages/dashboardPage/agentSearch.tsx +++ b/src/Managing.WebApp/src/pages/dashboardPage/agentSearch.tsx @@ -91,6 +91,7 @@ function AgentSearch({ index }: { index: number }) { const calculateSummary = () => { if (!agentData?.strategies.length) return null + console.log(agentData.strategies) const totalPnL = agentData.strategies.reduce((sum, strategy) => sum + (strategy.pnL || 0), 0) const totalNetPnL = agentData.strategies.reduce((sum, strategy) => sum + (strategy.netPnL || 0), 0) const totalVolume = agentData.strategies.reduce((sum, strategy) => sum + (strategy.totalVolumeTraded || 0), 0)