diff --git a/src/Managing.Application/Bots/Grains/AgentGrain.cs b/src/Managing.Application/Bots/Grains/AgentGrain.cs index 7d68f787..ed8529a7 100644 --- a/src/Managing.Application/Bots/Grains/AgentGrain.cs +++ b/src/Managing.Application/Bots/Grains/AgentGrain.cs @@ -214,8 +214,8 @@ public class AgentGrain : Grain, IAgentGrain foreach (var position in positions.Where(p => p.IsOpen())) { var positionUsd = position.Open.Price * position.Open.Quantity; - var realized = position.ProfitAndLoss?.Realized ?? 0; - usdcInPositionsValue += positionUsd + realized; + var net = position.ProfitAndLoss?.Net ?? 0; + usdcInPositionsValue += positionUsd + net; } totalBalance = usdcWalletValue + usdcInPositionsValue; diff --git a/src/Managing.Application/ManageBot/BotService.cs b/src/Managing.Application/ManageBot/BotService.cs index 2593dfe2..9e352ea7 100644 --- a/src/Managing.Application/ManageBot/BotService.cs +++ b/src/Managing.Application/ManageBot/BotService.cs @@ -416,6 +416,26 @@ namespace Managing.Application.ManageBot } var usdcValue = usdcBalance?.Amount ?? 0m; + + // Get positions for the user and add their USDC value (similar to AgentGrain.UpdateSummary) + try + { + var positions = (await _tradingService.GetPositionByUserIdAsync(account.User.Id)) + .Where(p => p.IsValidForMetrics()).ToList(); + + foreach (var position in positions.Where(p => p.IsOpen())) + { + var positionUsd = position.Open.Price * position.Open.Quantity; + var net = position.ProfitAndLoss?.Net ?? 0; + usdcValue += positionUsd + net; + } + } + catch (Exception ex) + { + _tradingBotLogger.LogError(ex, "Error calculating position values for available allocation for user {UserId}", account.User.Id); + // Continue with calculation even if position retrieval fails + } + var available = usdcValue - totalAllocatedForAccount; return available < 0m ? 0m : available; });