From 343b85dadae8c253784c73d99d2d41f9da83ebdf Mon Sep 17 00:00:00 2001 From: cryptooda Date: Sat, 4 Oct 2025 18:31:50 +0700 Subject: [PATCH] Fix fetch and restart bot --- .../Bots/Grains/LiveTradingBotGrain.cs | 32 +++++++++---------- .../PostgreSql/PostgreSqlTradingRepository.cs | 2 +- .../EvmManager.cs | 23 +++++++------ 3 files changed, 30 insertions(+), 27 deletions(-) diff --git a/src/Managing.Application/Bots/Grains/LiveTradingBotGrain.cs b/src/Managing.Application/Bots/Grains/LiveTradingBotGrain.cs index 8345e15a..02589f63 100644 --- a/src/Managing.Application/Bots/Grains/LiveTradingBotGrain.cs +++ b/src/Managing.Application/Bots/Grains/LiveTradingBotGrain.cs @@ -248,13 +248,21 @@ public class LiveTradingBotGrain : Grain, ILiveTradingBotGrain, IRemindable public async Task StopAsync() { - // Check if bot has open positions in database before allowing stop - var hasOpenPositions = await HasOpenPositionsInDatabaseAsync(); - if (hasOpenPositions) + await StopAsyncInternal(false); + } + + private async Task StopAsyncInternal(bool isRestarting) + { + // Only check for open positions if this is not part of a restart operation + if (!isRestarting) { - _logger.LogWarning("Cannot stop LiveTradingBotGrain {GrainId} - bot has open positions in database", - this.GetPrimaryKey()); - throw new InvalidOperationException("Cannot stop bot while it has open positions. Please close all positions first."); + var hasOpenPositions = await HasOpenPositionsInDatabaseAsync(); + if (hasOpenPositions) + { + _logger.LogWarning("Cannot stop LiveTradingBotGrain {GrainId} - bot has open positions in database", + this.GetPrimaryKey()); + throw new InvalidOperationException("Cannot stop bot while it has open positions. Please close all positions first."); + } } // The check is now against the registry status @@ -578,18 +586,10 @@ public class LiveTradingBotGrain : Grain, ILiveTradingBotGrain, IRemindable { _logger.LogInformation("Restarting LiveTradingBotGrain {GrainId}", this.GetPrimaryKey()); - // Check if bot has open positions in database before allowing restart - var hasOpenPositions = await HasOpenPositionsInDatabaseAsync(); - if (hasOpenPositions) - { - _logger.LogWarning("Cannot restart LiveTradingBotGrain {GrainId} - bot has open positions in database", - this.GetPrimaryKey()); - throw new InvalidOperationException("Cannot restart bot while it has open positions. Please close all positions first."); - } - try { - await StopAsync(); + // Use internal stop method that bypasses open position check for restart + await StopAsyncInternal(true); // Add a small delay to ensure stop operations complete await Task.Delay(100); diff --git a/src/Managing.Infrastructure.Database/PostgreSql/PostgreSqlTradingRepository.cs b/src/Managing.Infrastructure.Database/PostgreSql/PostgreSqlTradingRepository.cs index fd330323..474f6af0 100644 --- a/src/Managing.Infrastructure.Database/PostgreSql/PostgreSqlTradingRepository.cs +++ b/src/Managing.Infrastructure.Database/PostgreSql/PostgreSqlTradingRepository.cs @@ -402,7 +402,7 @@ public class PostgreSqlTradingRepository : ITradingRepository entity.ProfitAndLoss = position.ProfitAndLoss?.Realized ?? 0; entity.NetPnL = position.ProfitAndLoss?.Net ?? 0; entity.UiFees = position.UiFees; - entity.OriginDirection = position.OriginDirection; + // entity.OriginDirection = position.OriginDirection; entity.GasFees = position.GasFees; entity.Status = position.Status; entity.MoneyManagementJson = position.MoneyManagement != null diff --git a/src/Managing.Infrastructure.Web3/EvmManager.cs b/src/Managing.Infrastructure.Web3/EvmManager.cs index 1a2a1f82..27c5ea68 100644 --- a/src/Managing.Infrastructure.Web3/EvmManager.cs +++ b/src/Managing.Infrastructure.Web3/EvmManager.cs @@ -184,7 +184,7 @@ public class EvmManager : IEvmManager public async Task> GetAllBalances(Chain chain, string publicAddress) { var cacheKey = $"balances_{chain.Name}_{publicAddress.ToLowerInvariant()}"; - + // Try to get from cache first var cachedBalances = _cacheService.GetValue>(cacheKey); if (cachedBalances != null) @@ -194,7 +194,7 @@ public class EvmManager : IEvmManager // If not in cache, fetch from blockchain var balances = new List(); - + foreach (var ticker in TokenService.GetEligibleTickersForBalance()) { try @@ -349,14 +349,14 @@ public class EvmManager : IEvmManager { // Define the assets and chains we want to query var assets = new[] { Ticker.USDC, Ticker.ETH }; - var chains = new[] { "arbitrum", "ethereum" }; + var chains = new[] { "arbitrum" }; // Get balances from Web3Proxy service var balances = await _web3ProxyService.GetWalletBalanceAsync(publicAddress, assets, chains); // Convert Balance objects to EvmBalance objects var evmBalances = new List(); - + foreach (var balance in balances) { if (balance.Amount > 0) @@ -395,7 +395,7 @@ public class EvmManager : IEvmManager { // Log the exception and fallback to original implementation if Web3Proxy fails Console.WriteLine($"Web3Proxy balance retrieval failed: {ex.Message}"); - + var chainBalances = new List(); var chains = ChainService.GetChains(); @@ -442,24 +442,27 @@ public class EvmManager : IEvmManager if (gmxPrices == null) { - Console.WriteLine($"Warning: GMX API returned null for ticker {ticker}, timeframe {timeframe}, startDate {startDate:yyyy-MM-dd HH:mm:ss}"); + Console.WriteLine( + $"Warning: GMX API returned null for ticker {ticker}, timeframe {timeframe}, startDate {startDate:yyyy-MM-dd HH:mm:ss}"); return new List(); } if (gmxPrices.Candles == null || !gmxPrices.Candles.Any()) { - Console.WriteLine($"Warning: GMX API returned empty candles array for ticker {ticker}, timeframe {timeframe}, startDate {startDate:yyyy-MM-dd HH:mm:ss}"); + Console.WriteLine( + $"Warning: GMX API returned empty candles array for ticker {ticker}, timeframe {timeframe}, startDate {startDate:yyyy-MM-dd HH:mm:ss}"); return new List(); } var filteredCandles = gmxPrices.Candles.Where(p => p[0] >= startDate.AddMinutes(-1).ToUnixTimestamp()).ToList(); - + if (!filteredCandles.Any()) { - Console.WriteLine($"Warning: No candles found after filtering for ticker {ticker}, timeframe {timeframe}, startDate {startDate:yyyy-MM-dd HH:mm:ss}. Total candles before filtering: {gmxPrices.Candles.Count}"); + Console.WriteLine( + $"Warning: No candles found after filtering for ticker {ticker}, timeframe {timeframe}, startDate {startDate:yyyy-MM-dd HH:mm:ss}. Total candles before filtering: {gmxPrices.Candles.Count}"); return new List(); } - + var candles = new List(); var timeBetweenCandles = CandleHelpers.GetBaseIntervalInSeconds(timeframe);