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)