diff --git a/src/Managing.Application.Abstractions/Repositories/ITradingRepository.cs b/src/Managing.Application.Abstractions/Repositories/ITradingRepository.cs index 7b03dd6..c4192f7 100644 --- a/src/Managing.Application.Abstractions/Repositories/ITradingRepository.cs +++ b/src/Managing.Application.Abstractions/Repositories/ITradingRepository.cs @@ -25,6 +25,7 @@ public interface ITradingRepository Task GetPositionByIdentifierAsync(Guid identifier); Task> GetPositionsAsync(PositionInitiator positionInitiator); Task> GetPositionsByStatusAsync(PositionStatus positionStatus); + Task> GetAllPositionsAsync(); Task UpdateScenarioAsync(Scenario scenario); Task UpdateStrategyAsync(IndicatorBase indicatorBase); diff --git a/src/Managing.Application.Abstractions/Services/ITradingService.cs b/src/Managing.Application.Abstractions/Services/ITradingService.cs index 2328f5f..3071461 100644 --- a/src/Managing.Application.Abstractions/Services/ITradingService.cs +++ b/src/Managing.Application.Abstractions/Services/ITradingService.cs @@ -35,6 +35,7 @@ public interface ITradingService Task UpdateScenarioAsync(Scenario scenario); Task UpdateIndicatorAsync(IndicatorBase indicatorBase); Task> GetBrokerPositions(Account account); + Task> GetAllDatabasePositionsAsync(); Task InitPrivyWallet(string publicAddress); // Synth API integration methods diff --git a/src/Managing.Application/Grains/PlatformSummaryGrain.cs b/src/Managing.Application/Grains/PlatformSummaryGrain.cs index e2d517d..c2068a3 100644 --- a/src/Managing.Application/Grains/PlatformSummaryGrain.cs +++ b/src/Managing.Application/Grains/PlatformSummaryGrain.cs @@ -75,14 +75,8 @@ public class PlatformSummaryGrain : Grain, IPlatformSummaryGrain, IRemindable { _logger.LogInformation("Refreshing platform summary data"); - // Get all data in parallel for better performance - var agentsTask = _agentService.GetAllAgentSummaries(); - var strategiesTask = _botService.GetBotsAsync(); - - await Task.WhenAll(agentsTask, strategiesTask); - - var agents = await agentsTask; - var strategies = await strategiesTask; + var agents = await _agentService.GetAllAgentSummaries(); + var strategies = await _botService.GetBotsAsync(); // Calculate totals var totalAgents = agents.Count(); @@ -183,19 +177,20 @@ public class PlatformSummaryGrain : Grain, IPlatformSummaryGrain, IRemindable try { // Get all open positions from all accounts - var openPositions = await _tradingService.GetBrokerPositions(null); + // Get positions directly from database instead of exchange + var allPositions = await _tradingService.GetAllDatabasePositionsAsync(); + var openPositions = allPositions?.Where(p => !p.IsFinished()); if (openPositions?.Any() == true) { var positionCount = openPositions.Count(); - // Calculate open interest as the sum of position notional values - // Open interest = sum of (position size * price) for all open positions + // Calculate open interest as the sum of leveraged position notional values + // Open interest = sum of (position size * price * leverage) for all open positions var openInterest = openPositions - .Where(p => p.Open?.Price > 0 && p.Open?.Quantity > 0) - .Sum(p => p.Open.Price * p.Open.Quantity); + .Sum(p => (p.Open.Price * p.Open.Quantity) * p.Open.Leverage); - _logger.LogDebug("Calculated position metrics: {PositionCount} positions, {OpenInterest} open interest", + _logger.LogDebug("Calculated position metrics: {PositionCount} positions, {OpenInterest} leveraged open interest", positionCount, openInterest); return (openInterest, positionCount); diff --git a/src/Managing.Application/Trading/TradingService.cs b/src/Managing.Application/Trading/TradingService.cs index c5b24dc..3c9678a 100644 --- a/src/Managing.Application/Trading/TradingService.cs +++ b/src/Managing.Application/Trading/TradingService.cs @@ -250,6 +250,11 @@ public class TradingService : ITradingService return await _exchangeService.GetBrokerPositions(account); } + public async Task> GetAllDatabasePositionsAsync() + { + return await _tradingRepository.GetAllPositionsAsync(); + } + private async Task ManageTrader(TraderFollowup a, List tickers) { var shortAddress = a.Account.Address.Substring(0, 6); diff --git a/src/Managing.Infrastructure.Database/PostgreSql/PostgreSqlTradingRepository.cs b/src/Managing.Infrastructure.Database/PostgreSql/PostgreSqlTradingRepository.cs index c48768a..e5bc0c3 100644 --- a/src/Managing.Infrastructure.Database/PostgreSql/PostgreSqlTradingRepository.cs +++ b/src/Managing.Infrastructure.Database/PostgreSql/PostgreSqlTradingRepository.cs @@ -397,6 +397,21 @@ public class PostgreSqlTradingRepository : ITradingRepository } } + public async Task> GetAllPositionsAsync() + { + var positions = await _context.Positions + .AsNoTracking() + .Include(p => p.User) + .Include(p => p.OpenTrade) + .Include(p => p.StopLossTrade) + .Include(p => p.TakeProfit1Trade) + .Include(p => p.TakeProfit2Trade) + .ToListAsync() + .ConfigureAwait(false); + + return PostgreSqlMappers.Map(positions); + } + #endregion #region Signal Methods diff --git a/src/Managing.WebApp/src/pages/botsPage/botList.tsx b/src/Managing.WebApp/src/pages/botsPage/botList.tsx index cfc8a83..a1743c2 100644 --- a/src/Managing.WebApp/src/pages/botsPage/botList.tsx +++ b/src/Managing.WebApp/src/pages/botsPage/botList.tsx @@ -94,15 +94,15 @@ const BotList: React.FC = ({ list }) => { ) } - function getToggleBotStatusBadge(status: string, identifier: string) { + function getToggleBotStatusBadge(status: BotStatus, identifier: string) { const classes = - baseBadgeClass() + (status == 'Up' ? ' bg-error' : ' bg-success') + baseBadgeClass() + (status == BotStatus.Running ? ' bg-error' : ' bg-success') return (