From 46a6cdcd879d1f012187e5a185623fd990bfea45 Mon Sep 17 00:00:00 2001 From: cryptooda Date: Thu, 7 Aug 2025 14:47:36 +0700 Subject: [PATCH] Fix manual position open --- .../Abstractions/ITradingBot.cs | 1 + .../Bots/Grains/LiveTradingBotGrain.cs | 18 ++++++++++++++++-- .../Bots/TradingBotBase.cs | 2 +- .../Bots/TradingBotGrainState.cs | 7 +++++++ 4 files changed, 25 insertions(+), 3 deletions(-) diff --git a/src/Managing.Application/Abstractions/ITradingBot.cs b/src/Managing.Application/Abstractions/ITradingBot.cs index 452fed3..ba00788 100644 --- a/src/Managing.Application/Abstractions/ITradingBot.cs +++ b/src/Managing.Application/Abstractions/ITradingBot.cs @@ -24,6 +24,7 @@ namespace Managing.Application.Abstractions decimal GetProfitAndLoss(); decimal GetTotalFees(); Task LoadAccount(); + Task LoadLastCandle(); Task OpenPositionManually(TradeDirection direction); Task CloseTrade(LightSignal signal, Position position, Trade tradeToClose, decimal lastPrice, diff --git a/src/Managing.Application/Bots/Grains/LiveTradingBotGrain.cs b/src/Managing.Application/Bots/Grains/LiveTradingBotGrain.cs index f8c2ad2..6f41fc1 100644 --- a/src/Managing.Application/Bots/Grains/LiveTradingBotGrain.cs +++ b/src/Managing.Application/Bots/Grains/LiveTradingBotGrain.cs @@ -249,8 +249,8 @@ public class LiveTradingBotGrain : Grain, ILiveTradingBotGrain, IRemindable throw new InvalidOperationException("Account name is required for live trading"); } - // Create the trading bot instance - var logger = _scopeFactory.CreateScope().ServiceProvider.GetRequiredService>(); + using var scope = _scopeFactory.CreateScope(); + var logger = scope.ServiceProvider.GetRequiredService>(); var tradingBot = new TradingBotBase(logger, _scopeFactory, config); // Restore state from grain state @@ -261,6 +261,7 @@ public class LiveTradingBotGrain : Grain, ILiveTradingBotGrain, IRemindable tradingBot.ExecutionCount = _state.State.ExecutionCount; tradingBot.Identifier = _state.State.Identifier; tradingBot.LastPositionClosingTime = _state.State.LastPositionClosingTime; + tradingBot.LastCandle = _state.State.LastCandle; return tradingBot; } @@ -311,6 +312,17 @@ public class LiveTradingBotGrain : Grain, ILiveTradingBotGrain, IRemindable throw new InvalidOperationException("Bot is not running"); } + // Ensure LastCandle is available for manual position opening + if (_tradingBot.LastCandle == null) + { + _logger.LogInformation("LastCandle is null, loading latest candle data for manual position opening"); + await _tradingBot.LoadLastCandle(); + + // Sync the loaded candle to grain state + SyncStateFromBase(); + await _state.WriteStateAsync(); + } + return await _tradingBot.OpenPositionManually(direction); } catch (Exception ex) @@ -367,6 +379,7 @@ public class LiveTradingBotGrain : Grain, ILiveTradingBotGrain, IRemindable _tradingBot.ExecutionCount = _state.State.ExecutionCount; _tradingBot.Identifier = _state.State.Identifier; _tradingBot.LastPositionClosingTime = _state.State.LastPositionClosingTime; + _tradingBot.LastCandle = _state.State.LastCandle; } private void SyncStateFromBase() @@ -379,6 +392,7 @@ public class LiveTradingBotGrain : Grain, ILiveTradingBotGrain, IRemindable _state.State.ExecutionCount = _tradingBot.ExecutionCount; _state.State.Identifier = _tradingBot.Identifier; _state.State.LastPositionClosingTime = _tradingBot.LastPositionClosingTime; + _state.State.LastCandle = _tradingBot.LastCandle; _state.State.Config = _tradingBot.Config; } diff --git a/src/Managing.Application/Bots/TradingBotBase.cs b/src/Managing.Application/Bots/TradingBotBase.cs index 536d3af..75d3232 100644 --- a/src/Managing.Application/Bots/TradingBotBase.cs +++ b/src/Managing.Application/Bots/TradingBotBase.cs @@ -107,7 +107,7 @@ public class TradingBotBase : ITradingBot } } - private async Task LoadLastCandle() + public async Task LoadLastCandle() { await ServiceScopeHelpers.WithScopedService(_scopeFactory, async exchangeService => { diff --git a/src/Managing.Application/Bots/TradingBotGrainState.cs b/src/Managing.Application/Bots/TradingBotGrainState.cs index 6c72299..84948a9 100644 --- a/src/Managing.Application/Bots/TradingBotGrainState.cs +++ b/src/Managing.Application/Bots/TradingBotGrainState.cs @@ -1,4 +1,5 @@ using Managing.Domain.Bots; +using Managing.Domain.Candles; using Managing.Domain.Indicators; using Managing.Domain.Trades; using Managing.Domain.Users; @@ -114,4 +115,10 @@ public class TradingBotGrainState /// [Id(17)] public DateTime? LastPositionClosingTime { get; set; } + + /// + /// The last candle data used for trading decisions + /// + [Id(18)] + public Candle? LastCandle { get; set; } } \ No newline at end of file