125 lines
7.7 KiB
C#
125 lines
7.7 KiB
C#
using Managing.Application.Abstractions.Services;
|
|
using Managing.Application.Abstractions.Shared;
|
|
using Managing.Domain.Backtests;
|
|
using Managing.Domain.Bots;
|
|
using Managing.Domain.Candles;
|
|
using Managing.Domain.Users;
|
|
using Microsoft.Extensions.Logging;
|
|
using static Managing.Common.Enums;
|
|
|
|
namespace Managing.Application.Backtests;
|
|
|
|
/// <summary>
|
|
/// Adapter that wraps BacktestExecutor to implement IBacktester interface.
|
|
/// Used in compute workers where Backtester (with SignalR dependencies) is not available.
|
|
/// Only implements methods needed for genetic algorithm execution.
|
|
/// </summary>
|
|
public class BacktestExecutorAdapter : IBacktester
|
|
{
|
|
private readonly BacktestExecutor _executor;
|
|
private readonly IExchangeService _exchangeService;
|
|
private readonly ILogger<BacktestExecutorAdapter> _logger;
|
|
|
|
public BacktestExecutorAdapter(
|
|
BacktestExecutor executor,
|
|
IExchangeService exchangeService,
|
|
ILogger<BacktestExecutorAdapter> logger)
|
|
{
|
|
_executor = executor;
|
|
_exchangeService = exchangeService;
|
|
_logger = logger;
|
|
}
|
|
|
|
public async Task<LightBacktest> RunTradingBotBacktest(
|
|
TradingBotConfig config,
|
|
DateTime startDate,
|
|
DateTime endDate,
|
|
User user = null,
|
|
bool save = false,
|
|
bool withCandles = false,
|
|
string requestId = null,
|
|
object metadata = null)
|
|
{
|
|
// Load candles using ExchangeService
|
|
var candles = await _exchangeService.GetCandlesInflux(
|
|
TradingExchanges.Evm,
|
|
config.Ticker,
|
|
startDate,
|
|
config.Timeframe,
|
|
endDate);
|
|
|
|
if (candles == null || candles.Count == 0)
|
|
{
|
|
throw new InvalidOperationException(
|
|
$"No candles found for {config.Ticker} on {config.Timeframe} from {startDate} to {endDate}");
|
|
}
|
|
|
|
// Execute using BacktestExecutor
|
|
var result = await _executor.ExecuteAsync(
|
|
config,
|
|
candles,
|
|
user,
|
|
save,
|
|
withCandles,
|
|
requestId,
|
|
metadata,
|
|
progressCallback: null);
|
|
|
|
return result;
|
|
}
|
|
|
|
public async Task<LightBacktest> RunTradingBotBacktest(
|
|
TradingBotConfig config,
|
|
HashSet<Candle> candles,
|
|
User user = null,
|
|
bool withCandles = false,
|
|
string requestId = null,
|
|
object metadata = null)
|
|
{
|
|
// Execute using BacktestExecutor
|
|
var result = await _executor.ExecuteAsync(
|
|
config,
|
|
candles,
|
|
user,
|
|
save: false,
|
|
withCandles,
|
|
requestId,
|
|
metadata,
|
|
progressCallback: null);
|
|
|
|
return result;
|
|
}
|
|
|
|
// Methods not needed for compute worker - throw NotImplementedException
|
|
public Task<bool> DeleteBacktestAsync(string id) => throw new NotImplementedException("Not available in compute worker");
|
|
public bool DeleteBacktests() => throw new NotImplementedException("Not available in compute worker");
|
|
public IEnumerable<Backtest> GetBacktestsByUser(User user) => throw new NotImplementedException("Not available in compute worker");
|
|
public Task<IEnumerable<Backtest>> GetBacktestsByUserAsync(User user) => throw new NotImplementedException("Not available in compute worker");
|
|
public IEnumerable<Backtest> GetBacktestsByRequestId(Guid requestId) => throw new NotImplementedException("Not available in compute worker");
|
|
public Task<IEnumerable<Backtest>> GetBacktestsByRequestIdAsync(Guid requestId) => throw new NotImplementedException("Not available in compute worker");
|
|
public (IEnumerable<LightBacktest> Backtests, int TotalCount) GetBacktestsByRequestIdPaginated(Guid requestId, int page, int pageSize, string sortBy = "score", string sortOrder = "desc") => throw new NotImplementedException("Not available in compute worker");
|
|
public Task<(IEnumerable<LightBacktest> Backtests, int TotalCount)> GetBacktestsByRequestIdPaginatedAsync(Guid requestId, int page, int pageSize, string sortBy = "score", string sortOrder = "desc") => throw new NotImplementedException("Not available in compute worker");
|
|
public Task<Backtest> GetBacktestByIdForUserAsync(User user, string id) => throw new NotImplementedException("Not available in compute worker");
|
|
public Task<bool> DeleteBacktestByUserAsync(User user, string id) => throw new NotImplementedException("Not available in compute worker");
|
|
public Task<bool> DeleteBacktestsByIdsForUserAsync(User user, IEnumerable<string> ids) => throw new NotImplementedException("Not available in compute worker");
|
|
public bool DeleteBacktestsByUser(User user) => throw new NotImplementedException("Not available in compute worker");
|
|
public (IEnumerable<LightBacktest> Backtests, int TotalCount) GetBacktestsByUserPaginated(User user, int page, int pageSize, BacktestSortableColumn sortBy, string sortOrder = "desc", BacktestsFilter? filter = null) => throw new NotImplementedException("Not available in compute worker");
|
|
public Task<(IEnumerable<LightBacktest> Backtests, int TotalCount)> GetBacktestsByUserPaginatedAsync(User user, int page, int pageSize, BacktestSortableColumn sortBy, string sortOrder = "desc", BacktestsFilter? filter = null) => throw new NotImplementedException("Not available in compute worker");
|
|
public Task<bool> DeleteBacktestsByRequestIdAsync(Guid requestId) => throw new NotImplementedException("Not available in compute worker");
|
|
public Task<int> DeleteBacktestsByFiltersAsync(User user, BacktestsFilter filter) => throw new NotImplementedException("Not available in compute worker");
|
|
public Task InsertBundleBacktestRequestForUserAsync(User user, BundleBacktestRequest bundleRequest, bool saveAsTemplate = false) => throw new NotImplementedException("Not available in compute worker");
|
|
public Task SaveBundleBacktestRequestAsync(User user, BundleBacktestRequest bundleRequest) => throw new NotImplementedException("Not available in compute worker");
|
|
public Task CreateJobsForBundleRequestAsync(BundleBacktestRequest bundleRequest) => throw new NotImplementedException("Not available in compute worker");
|
|
public IEnumerable<BundleBacktestRequest> GetBundleBacktestRequestsByUser(User user) => throw new NotImplementedException("Not available in compute worker");
|
|
public Task<IEnumerable<BundleBacktestRequest>> GetBundleBacktestRequestsByUserAsync(User user) => throw new NotImplementedException("Not available in compute worker");
|
|
public BundleBacktestRequest? GetBundleBacktestRequestByIdForUser(User user, Guid id) => throw new NotImplementedException("Not available in compute worker");
|
|
public Task<BundleBacktestRequest?> GetBundleBacktestRequestByIdForUserAsync(User user, Guid id) => throw new NotImplementedException("Not available in compute worker");
|
|
public void UpdateBundleBacktestRequest(BundleBacktestRequest bundleRequest) => throw new NotImplementedException("Not available in compute worker");
|
|
public Task UpdateBundleBacktestRequestAsync(BundleBacktestRequest bundleRequest) => throw new NotImplementedException("Not available in compute worker");
|
|
public void DeleteBundleBacktestRequestByIdForUser(User user, Guid id) => throw new NotImplementedException("Not available in compute worker");
|
|
public Task DeleteBundleBacktestRequestByIdForUserAsync(User user, Guid id) => throw new NotImplementedException("Not available in compute worker");
|
|
public IEnumerable<BundleBacktestRequest> GetBundleBacktestRequestsByStatus(BundleBacktestRequestStatus status) => throw new NotImplementedException("Not available in compute worker");
|
|
public Task<IEnumerable<BundleBacktestRequest>> GetBundleBacktestRequestsByStatusAsync(BundleBacktestRequestStatus status) => throw new NotImplementedException("Not available in compute worker");
|
|
}
|
|
|