Enhance SpotBot to improve position recovery logic and add token balance verification after closing positions. The changes include filtering for recent unfinished positions and logging detailed information during position closure, ensuring better tracking and error handling for token balances.

This commit is contained in:
2025-12-29 16:39:02 +07:00
parent 493a2be368
commit ee8db1cdc8
2 changed files with 74 additions and 5 deletions

View File

@@ -57,6 +57,11 @@ public class CloseSpotPositionCommandHandler(
}
amountToSwap = tokenBalance.Amount;
logger?.LogInformation(
"Closing spot position: PositionId={PositionId}, Ticker={Ticker}, TokenBalance={TokenBalance}, Swapping to USDC",
request.Position.Identifier, request.Position.Ticker, amountToSwap);
swapResult = await tradingService.SwapGmxTokensAsync(
request.Position.User,
account.Name,
@@ -70,10 +75,17 @@ public class CloseSpotPositionCommandHandler(
if (!swapResult.Success)
{
logger?.LogError(
"Failed to close spot position: PositionId={PositionId}, Ticker={Ticker}, Error={Error}",
request.Position.Identifier, request.Position.Ticker, swapResult.Error ?? swapResult.Message);
throw new InvalidOperationException(
$"Failed to close spot position: {swapResult.Error ?? swapResult.Message}");
}
logger?.LogInformation(
"Spot position swap completed successfully: PositionId={PositionId}, Ticker={Ticker}, AmountSwapped={AmountSwapped}, Hash={Hash}",
request.Position.Identifier, request.Position.Ticker, amountToSwap, swapResult.Hash);
// Build the closing trade directly for backtest (no exchange call needed)
var closedTrade = exchangeService.BuildEmptyTrade(
request.Position.Open.Ticker,