Add test for executor
This commit is contained in:
@@ -30,42 +30,42 @@ public class BacktestTests : BaseTests
|
||||
// Setup mock dependencies for BacktestTradingBotGrain
|
||||
var backtestRepository = new Mock<IBacktestRepository>().Object;
|
||||
var grainLogger = new Mock<ILogger<BacktestTradingBotGrain>>().Object;
|
||||
|
||||
|
||||
// Setup service scope factory to return ALL TradingBotBase dependencies
|
||||
_scopeFactory = new Mock<IServiceScopeFactory>();
|
||||
var mockScope = new Mock<IServiceScope>();
|
||||
var mockServiceProvider = new Mock<IServiceProvider>();
|
||||
|
||||
|
||||
// Setup TradingBotBase logger
|
||||
var tradingBotLogger = TradingBaseTests.CreateTradingBotLogger();
|
||||
mockServiceProvider.Setup(x => x.GetService(typeof(ILogger<TradingBotBase>)))
|
||||
.Returns(tradingBotLogger);
|
||||
|
||||
|
||||
// Setup all services that TradingBotBase might need
|
||||
mockServiceProvider.Setup(x => x.GetService(typeof(IExchangeService)))
|
||||
.Returns(_exchangeService);
|
||||
|
||||
|
||||
mockServiceProvider.Setup(x => x.GetService(typeof(IAccountService)))
|
||||
.Returns(_accountService.Object);
|
||||
|
||||
|
||||
mockServiceProvider.Setup(x => x.GetService(typeof(ITradingService)))
|
||||
.Returns(_tradingService.Object);
|
||||
|
||||
|
||||
mockServiceProvider.Setup(x => x.GetService(typeof(IMoneyManagementService)))
|
||||
.Returns(_moneyManagementService.Object);
|
||||
|
||||
|
||||
// Setup additional services that might be needed
|
||||
var mockBotService = new Mock<IBotService>();
|
||||
mockServiceProvider.Setup(x => x.GetService(typeof(IBotService)))
|
||||
.Returns(mockBotService.Object);
|
||||
|
||||
|
||||
var mockMessengerService = new Mock<IMessengerService>();
|
||||
mockServiceProvider.Setup(x => x.GetService(typeof(IMessengerService)))
|
||||
.Returns(mockMessengerService.Object);
|
||||
|
||||
|
||||
mockScope.Setup(x => x.ServiceProvider).Returns(mockServiceProvider.Object);
|
||||
_scopeFactory.Setup(x => x.CreateScope()).Returns(mockScope.Object);
|
||||
|
||||
|
||||
// Create test user with account
|
||||
_testUser = new User
|
||||
{
|
||||
@@ -73,7 +73,7 @@ public class BacktestTests : BaseTests
|
||||
Name = "Test User",
|
||||
Accounts = new List<Account> { _account }
|
||||
};
|
||||
|
||||
|
||||
// Create BacktestTradingBotGrain instance directly
|
||||
_backtestGrain = new BacktestTradingBotGrain(grainLogger, _scopeFactory.Object, backtestRepository);
|
||||
}
|
||||
@@ -89,7 +89,7 @@ public class BacktestTests : BaseTests
|
||||
// Arrange
|
||||
var ticker = Ticker.ETH;
|
||||
var timeframe = Timeframe.FifteenMinutes;
|
||||
var daysBack = -10; // Fetch last 30 days of data
|
||||
var daysBack = -30; // Fetch last 30 days of data
|
||||
var startDate = DateTime.UtcNow.AddDays(daysBack);
|
||||
var endDate = DateTime.UtcNow;
|
||||
|
||||
@@ -117,7 +117,7 @@ public class BacktestTests : BaseTests
|
||||
Directory.CreateDirectory(dataDirectory);
|
||||
}
|
||||
|
||||
var fileName = $"{ticker}-{timeframe}-candles.json";
|
||||
var fileName = $"{ticker}-{timeframe}-candles-{DateTime.UtcNow:HH:m:s zzz}-.json";
|
||||
var filePath = Path.Combine(dataDirectory, fileName);
|
||||
|
||||
// Save to file
|
||||
@@ -181,10 +181,10 @@ public class BacktestTests : BaseTests
|
||||
|
||||
// Act - Call BacktestTradingBotGrain directly (no Orleans needed)
|
||||
var backtestResult = await _backtestGrain.RunBacktestAsync(
|
||||
config,
|
||||
candles.ToHashSet(),
|
||||
_testUser,
|
||||
save: false,
|
||||
config,
|
||||
candles.ToHashSet(),
|
||||
_testUser,
|
||||
save: false,
|
||||
withCandles: false);
|
||||
|
||||
// Output the result to console for review
|
||||
@@ -210,29 +210,29 @@ public class BacktestTests : BaseTests
|
||||
// Assert - Verify consistent backtest behavior
|
||||
// These values ensure that changes to TradingBotBase don't break the backtest logic
|
||||
Assert.NotNull(backtestResult);
|
||||
|
||||
|
||||
// Financial metrics - using decimal precision
|
||||
Assert.Equal(-106.56m, Math.Round(backtestResult.FinalPnl, 2));
|
||||
Assert.Equal(-187.36m, Math.Round(backtestResult.NetPnl, 2));
|
||||
Assert.Equal(80.80m, Math.Round(backtestResult.Fees, 2));
|
||||
Assert.Equal(1000.0m, backtestResult.InitialBalance);
|
||||
|
||||
|
||||
// Performance metrics
|
||||
Assert.Equal(31, backtestResult.WinRate);
|
||||
Assert.Equal(-10.66m, Math.Round(backtestResult.GrowthPercentage, 2));
|
||||
Assert.Equal(-0.67m, Math.Round(backtestResult.HodlPercentage, 2));
|
||||
|
||||
|
||||
// Risk metrics
|
||||
Assert.Equal(247.62m, Math.Round(backtestResult.MaxDrawdown.Value, 2));
|
||||
Assert.Equal(-0.021, Math.Round(backtestResult.SharpeRatio.Value, 3));
|
||||
Assert.Equal(0.0, backtestResult.Score);
|
||||
|
||||
|
||||
// Date range validation
|
||||
Assert.Equal(new DateTime(2025, 10, 14, 12, 0, 0), backtestResult.StartDate);
|
||||
Assert.Equal(new DateTime(2025, 10, 24, 11, 45, 0), backtestResult.EndDate);
|
||||
|
||||
|
||||
// Additional validation - strategy didn't outperform HODL
|
||||
Assert.True(backtestResult.GrowthPercentage < backtestResult.HodlPercentage,
|
||||
Assert.True(backtestResult.GrowthPercentage < backtestResult.HodlPercentage,
|
||||
"Strategy underperformed HODL as expected for this test scenario");
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user