Add kaigen debit credit for backtest

This commit is contained in:
2025-07-15 10:31:21 +07:00
parent f1c7259bc6
commit 11778aa2a4
7 changed files with 326 additions and 13 deletions

View File

@@ -27,6 +27,7 @@ namespace Managing.Application.Backtesting
private readonly IScenarioService _scenarioService;
private readonly IAccountService _accountService;
private readonly IMessengerService _messengerService;
private readonly IKaigenService _kaigenService;
public Backtester(
IExchangeService exchangeService,
@@ -35,7 +36,8 @@ namespace Managing.Application.Backtesting
ILogger<Backtester> logger,
IScenarioService scenarioService,
IAccountService accountService,
IMessengerService messengerService)
IMessengerService messengerService,
IKaigenService kaigenService)
{
_exchangeService = exchangeService;
_botFactory = botFactory;
@@ -44,6 +46,7 @@ namespace Managing.Application.Backtesting
_scenarioService = scenarioService;
_accountService = accountService;
_messengerService = messengerService;
_kaigenService = kaigenService;
}
public Backtest RunSimpleBotBacktest(Workflow workflow, bool save = false)
@@ -82,20 +85,66 @@ namespace Managing.Application.Backtesting
string requestId = null,
object metadata = null)
{
var candles = GetCandles(config.Ticker, config.Timeframe, startDate, endDate);
var result = await RunBacktestWithCandles(config, candles, user, withCandles, requestId, metadata);
// Set start and end dates
result.StartDate = startDate;
result.EndDate = endDate;
if (save && user != null)
string creditRequestId = null;
// Debit user credits before starting the backtest
if (user != null)
{
_backtestRepository.InsertBacktestForUser(user, result);
try
{
creditRequestId = await _kaigenService.DebitUserCreditsAsync(user.Name, 3);
_logger.LogInformation("Successfully debited credits for user {UserName} with request ID {RequestId}",
user.Name, creditRequestId);
}
catch (Exception ex)
{
_logger.LogError(ex, "Failed to debit credits for user {UserName}. Backtest will not proceed.", user.Name);
throw new Exception($"Failed to debit credits: {ex.Message}");
}
}
return result;
try
{
var candles = GetCandles(config.Ticker, config.Timeframe, startDate, endDate);
var result = await RunBacktestWithCandles(config, candles, user, withCandles, requestId, metadata);
// Set start and end dates
result.StartDate = startDate;
result.EndDate = endDate;
if (save && user != null)
{
_backtestRepository.InsertBacktestForUser(user, result);
}
return result;
}
catch (Exception ex)
{
// If backtest fails and we debited credits, attempt to refund
if (user != null && !string.IsNullOrEmpty(creditRequestId))
{
try
{
var refundSuccess = await _kaigenService.RefundUserCreditsAsync(creditRequestId, user.Name);
if (refundSuccess)
{
_logger.LogInformation("Successfully refunded credits for user {UserName} after backtest failure", user.Name);
}
else
{
_logger.LogError("Failed to refund credits for user {UserName} after backtest failure", user.Name);
}
}
catch (Exception refundEx)
{
_logger.LogError(refundEx, "Error during refund attempt for user {UserName}", user.Name);
}
}
throw;
}
}
/// <summary>