Add precalculated signals list + multi scenario test

This commit is contained in:
2025-11-11 14:05:09 +07:00
parent e810ab60ce
commit 903413692c
7 changed files with 359 additions and 17 deletions

View File

@@ -372,6 +372,109 @@ public class BacktestExecutorTests : BaseTests, IDisposable
Console.WriteLine($"✅ Performance test passed: {candlesPerSecond:F1} candles/sec");
}
[Fact]
public async Task ExecuteBacktest_With_Two_Scenarios_Should_Show_Performance_Telemetry()
{
// Arrange - Test with 2 indicators to verify pre-calculated signals optimization works with multiple scenarios
var candles =
FileHelpers.ReadJson<List<Candle>>("../../../Data/ETH-FifteenMinutes-candles-20:44:15 +00:00-.json");
Assert.NotNull(candles);
Assert.NotEmpty(candles);
Console.WriteLine($"DEBUG: Loaded {candles.Count} candles for two-scenarios performance telemetry test");
var scenario = new Scenario("ETH_TwoScenarios_Backtest");
var rsiDivIndicator = ScenarioHelpers.BuildIndicator(IndicatorType.RsiDivergence, "RsiDiv", period: 14);
var emaCrossIndicator = ScenarioHelpers.BuildIndicator(IndicatorType.EmaCross, "EmaCross", period: 21);
scenario.Indicators = new List<IndicatorBase> { (IndicatorBase)rsiDivIndicator, (IndicatorBase)emaCrossIndicator };
scenario.LoopbackPeriod = 15; // 15 minutes loopback period as requested
var config = new TradingBotConfig
{
AccountName = _account.Name,
MoneyManagement = MoneyManagement,
Ticker = Ticker.ETH,
Scenario = LightScenario.FromScenario(scenario),
Timeframe = Timeframe.FifteenMinutes,
IsForWatchingOnly = false,
BotTradingBalance = 100000,
IsForBacktest = true,
CooldownPeriod = 1,
MaxLossStreak = 0,
FlipPosition = false,
Name = "ETH_TwoScenarios_Performance_Test",
FlipOnlyWhenInProfit = true,
MaxPositionTimeHours = null,
CloseEarlyWhenProfitable = false
};
// Track execution time
var startTime = DateTime.UtcNow;
// Act
var result = await _backtestExecutor.ExecuteAsync(
config,
candles.ToHashSet(),
_testUser,
save: false,
withCandles: false,
requestId: null,
bundleRequestId: null,
metadata: null,
progressCallback: null);
var executionTime = DateTime.UtcNow - startTime;
// Assert - Verify the result is valid
Assert.NotNull(result);
Assert.Equal(Ticker.ETH, result.Config.Ticker);
Assert.Equal(100000, result.InitialBalance);
Assert.True(result.Score >= 0);
// Business Logic Baseline Assertions - ensure consistency over time
// These values establish the expected baseline for the two-scenarios test
const decimal expectedFinalPnl = 2018.27m;
const double expectedScore = 19.18;
const int expectedWinRatePercent = 40; // 40% win rate
const decimal expectedGrowthPercentage = 2.02m;
// Allow small tolerance for floating-point precision variations
const decimal pnlTolerance = 0.01m;
const double scoreTolerance = 0.01;
const decimal growthTolerance = 0.01m;
Assert.True(Math.Abs(result.FinalPnl - expectedFinalPnl) <= pnlTolerance,
$"Final PnL {result.FinalPnl:F2} differs from expected baseline {expectedFinalPnl:F2} (tolerance: ±{pnlTolerance:F2})");
Assert.True(Math.Abs(result.Score - expectedScore) <= scoreTolerance,
$"Score {result.Score:F2} differs from expected baseline {expectedScore:F2} (tolerance: ±{scoreTolerance:F2})");
Assert.True(Math.Abs(result.WinRate - expectedWinRatePercent) <= 5,
$"Win Rate {result.WinRate}% differs from expected baseline {expectedWinRatePercent}% (tolerance: ±5%)");
Assert.True(Math.Abs(result.GrowthPercentage - expectedGrowthPercentage) <= growthTolerance,
$"Growth {result.GrowthPercentage:F2}% differs from expected baseline {expectedGrowthPercentage:F2}% (tolerance: ±{growthTolerance:F2}%)");
// Performance metrics
var totalCandles = candles.Count;
var candlesPerSecond = totalCandles / executionTime.TotalSeconds;
// Log comprehensive performance metrics
Console.WriteLine($"📊 === TWO-SCENARIOS PERFORMANCE TELEMETRY ===");
Console.WriteLine($"⏱️ Total Execution Time: {executionTime.TotalSeconds:F2}s");
Console.WriteLine($"📈 Candles Processed: {totalCandles} ({candlesPerSecond:F1} candles/sec)");
Console.WriteLine($"🎯 Final PnL: {result.FinalPnl:F2} (Expected: {expectedFinalPnl:F2})");
Console.WriteLine($"📊 Score: {result.Score:F2} (Expected: {expectedScore:F2})");
Console.WriteLine($"📈 Win Rate: {result.WinRate}% (Expected: {expectedWinRatePercent}%)");
Console.WriteLine($"📈 Growth: {result.GrowthPercentage:F2}% (Expected: {expectedGrowthPercentage:F2}%)");
Console.WriteLine($"🎭 Scenario: {scenario.Name} ({scenario.Indicators.Count} indicators, LoopbackPeriod: {scenario.LoopbackPeriod})");
// Performance assertion - should be reasonably fast even with 2 indicators
Assert.True(candlesPerSecond > 200, $"Expected >200 candles/sec with 2 indicators, got {candlesPerSecond:F1} candles/sec");
Console.WriteLine($"✅ Two-scenarios performance test passed: {candlesPerSecond:F1} candles/sec with {scenario.Indicators.Count} indicators");
}
public void Dispose()
{
_loggerFactory?.Dispose();

View File

@@ -0,0 +1,4 @@
DateTime,TestName,CandlesCount,ExecutionTimeSeconds,ProcessingRateCandlesPerSec,MemoryStartMB,MemoryEndMB,MemoryPeakMB,SignalUpdatesCount,SignalUpdatesSkipped,SignalUpdateEfficiencyPercent,BacktestStepsCount,AverageSignalUpdateMs,AverageBacktestStepMs,FinalPnL,WinRatePercent,GrowthPercentage,Score,CommitHash,GitBranch,Environment
2025-11-11T06:53:40Z,ExecuteBacktest_With_Two_Scenarios_Should_Show_Performance_Telemetry,576037926 576037588,1.52 1.53,3792.6 3758,8,15.26,11.35,23.73,0.0,0,0.0,0.0,0.0,0.0,2018.27,4000,00,2.02,1919,e810ab60,dev,development
2025-11-11T06:58:31Z,ExecuteBacktest_With_Two_Scenarios_Should_Show_Performance_Telemetry,576038904 576038584,1.48 1.49,3890.4 3858,4,15.27,11.03,23.74,0.0,0,0.0,0.0,0.0,0.0,2018.27 (Expected: 2018.27),4000,00 (Expected: 40,0%),2.02 (Expected: 2.02%),19181918,e810ab60,dev,development
2025-11-11T07:03:00Z,ExecuteBacktest_With_Two_Scenarios_Should_Show_Performance_Telemetry,576033954 576033649,1.70 1.71,3395.4 3364,9,15.29,11.00,23.75,0.0,0,0.0,0.0,0.0,0.0,2018.27 (Expected: 2018.27),40 (Expected: 40%),2.02 (Expected: 2.02%),19191918,e810ab60,dev,development
1 DateTime,TestName,CandlesCount,ExecutionTimeSeconds,ProcessingRateCandlesPerSec,MemoryStartMB,MemoryEndMB,MemoryPeakMB,SignalUpdatesCount,SignalUpdatesSkipped,SignalUpdateEfficiencyPercent,BacktestStepsCount,AverageSignalUpdateMs,AverageBacktestStepMs,FinalPnL,WinRatePercent,GrowthPercentage,Score,CommitHash,GitBranch,Environment
2 2025-11-11T06:53:40Z,ExecuteBacktest_With_Two_Scenarios_Should_Show_Performance_Telemetry,576037926 576037588,1.52 1.53,3792.6 3758,8,15.26,11.35,23.73,0.0,0,0.0,0.0,0.0,0.0,2018.27,4 000,00,2.02,1919,e810ab60,dev,development
3 2025-11-11T06:58:31Z,ExecuteBacktest_With_Two_Scenarios_Should_Show_Performance_Telemetry,576038904 576038584,1.48 1.49,3890.4 3858,4,15.27,11.03,23.74,0.0,0,0.0,0.0,0.0,0.0,2018.27 (Expected: 2018.27),4 000,00 (Expected: 40,0%),2.02 (Expected: 2.02%),19181918,e810ab60,dev,development
4 2025-11-11T07:03:00Z,ExecuteBacktest_With_Two_Scenarios_Should_Show_Performance_Telemetry,576033954 576033649,1.70 1.71,3395.4 3364,9,15.29,11.00,23.75,0.0,0,0.0,0.0,0.0,0.0,2018.27 (Expected: 2018.27),40 (Expected: 40%),2.02 (Expected: 2.02%),19191918,e810ab60,dev,development

View File

@@ -33,3 +33,14 @@ DateTime,TestName,CandlesCount,ExecutionTimeSeconds,ProcessingRateCandlesPerSec,
2025-11-11T05:50:25Z,ExecuteBacktest_With_Large_Dataset_Should_Show_Performance_Telemetry,5760,0.915,6292.9,15.27,11.04,23.72,770.66,3828,66.5,69.13,0.40,0.01,24560.79,38,24.56,6015,c66f6279,dev,development
2025-11-11T05:52:21Z,ExecuteBacktest_With_Large_Dataset_Should_Show_Performance_Telemetry,5760,1.045,5475.3,15.27,11.30,23.71,907.47,3828,66.5,64.87,0.47,0.01,24560.79,38,24.56,6015,c66f6279,dev,development
2025-11-11T05:54:40Z,ExecuteBacktest_With_Large_Dataset_Should_Show_Performance_Telemetry,5760,1.445,3959.3,15.26,11.11,23.72,1222.26,3828,66.5,111.35,0.63,0.02,24560.79,38,24.56,6015,c66f6279,dev,development
2025-11-11T06:10:59Z,ExecuteBacktest_With_Large_Dataset_Should_Show_Performance_Telemetry,5760,1.22,4683.2,15.26,10.84,23.72,1048.26,3828,66.5,79.79,0.54,0.01,24560.79,38,24.56,6015,e810ab60,dev,development
2025-11-11T06:15:18Z,ExecuteBacktest_With_Large_Dataset_Should_Show_Performance_Telemetry,5760,1.85,3102.1,15.78,14.48,24.59,1559.17,3828,66.5,142.94,0.81,0.02,24560.79,38,24.56,6015,e810ab60,dev,development
2025-11-11T06:16:50Z,ExecuteBacktest_With_Large_Dataset_Should_Show_Performance_Telemetry,5760,1.58,3629.2,15.26,15.20,24.06,1386.27,3828,66.5,101.01,0.72,0.02,24560.79,38,24.56,6015,e810ab60,dev,development
2025-11-11T06:22:25Z,ExecuteBacktest_With_Large_Dataset_Should_Show_Performance_Telemetry,5760,1.445,3966.6,15.26,10.45,24.60,1256.25,3828,66.5,109.62,0.65,0.02,24560.79,38,24.56,6015,e810ab60,dev,development
2025-11-11T06:23:44Z,ExecuteBacktest_With_Large_Dataset_Should_Show_Performance_Telemetry,5760,1.265,4544.2,15.26,11.24,23.71,1023.42,3828,66.5,80.77,0.53,0.01,24560.79,38,24.56,6015,e810ab60,dev,development
2025-11-11T06:41:40Z,ExecuteBacktest_With_Large_Dataset_Should_Show_Performance_Telemetry,5760,0.835,6870.8,15.27,10.21,23.73,720.71,3828,66.5,52.24,0.37,0.01,24560.79,38,24.56,6015,e810ab60,dev,development
2025-11-11T06:44:52Z,ExecuteBacktest_With_Large_Dataset_Should_Show_Performance_Telemetry,5760,1.095,5217.4,15.26,11.07,23.72,945.37,3828,66.5,72.77,0.49,0.01,24560.79,38,24.56,6015,e810ab60,dev,development
2025-11-11T06:45:12Z,ExecuteBacktest_With_Large_Dataset_Should_Show_Performance_Telemetry,5760,1.07,5356.7,15.26,11.18,23.73,897.94,3828,66.5,91.98,0.46,0.02,24560.79,38,24.56,6015,e810ab60,dev,development
2025-11-11T06:53:40Z,ExecuteBacktest_With_Large_Dataset_Should_Show_Performance_Telemetry,5760,1.12,5112.2,15.26,11.35,23.73,927.80,3828,66.5,78.67,0.48,0.01,24560.79,38,24.56,6015,e810ab60,dev,development
2025-11-11T06:58:31Z,ExecuteBacktest_With_Large_Dataset_Should_Show_Performance_Telemetry,5760,1.55,3699.6,15.27,11.03,23.74,1319.91,3828,66.5,117.22,0.68,0.02,24560.79,38,24.56,6015,e810ab60,dev,development
2025-11-11T07:03:00Z,ExecuteBacktest_With_Large_Dataset_Should_Show_Performance_Telemetry,5760,2.11,2720.5,15.29,11.00,23.75,1780.10,3828,66.5,145.96,0.92,0.03,24560.79,38,24.56,6015,e810ab60,dev,development
1 DateTime TestName CandlesCount ExecutionTimeSeconds ProcessingRateCandlesPerSec MemoryStartMB MemoryEndMB MemoryPeakMB SignalUpdatesCount SignalUpdatesSkipped SignalUpdateEfficiencyPercent BacktestStepsCount AverageSignalUpdateMs AverageBacktestStepMs FinalPnL WinRatePercent GrowthPercentage Score CommitHash GitBranch Environment
33 2025-11-11T05:50:25Z ExecuteBacktest_With_Large_Dataset_Should_Show_Performance_Telemetry 5760 0.915 6292.9 15.27 11.04 23.72 770.66 3828 66.5 69.13 0.40 0.01 24560.79 38 24.56 6015 c66f6279 dev development
34 2025-11-11T05:52:21Z ExecuteBacktest_With_Large_Dataset_Should_Show_Performance_Telemetry 5760 1.045 5475.3 15.27 11.30 23.71 907.47 3828 66.5 64.87 0.47 0.01 24560.79 38 24.56 6015 c66f6279 dev development
35 2025-11-11T05:54:40Z ExecuteBacktest_With_Large_Dataset_Should_Show_Performance_Telemetry 5760 1.445 3959.3 15.26 11.11 23.72 1222.26 3828 66.5 111.35 0.63 0.02 24560.79 38 24.56 6015 c66f6279 dev development
36 2025-11-11T06:10:59Z ExecuteBacktest_With_Large_Dataset_Should_Show_Performance_Telemetry 5760 1.22 4683.2 15.26 10.84 23.72 1048.26 3828 66.5 79.79 0.54 0.01 24560.79 38 24.56 6015 e810ab60 dev development
37 2025-11-11T06:15:18Z ExecuteBacktest_With_Large_Dataset_Should_Show_Performance_Telemetry 5760 1.85 3102.1 15.78 14.48 24.59 1559.17 3828 66.5 142.94 0.81 0.02 24560.79 38 24.56 6015 e810ab60 dev development
38 2025-11-11T06:16:50Z ExecuteBacktest_With_Large_Dataset_Should_Show_Performance_Telemetry 5760 1.58 3629.2 15.26 15.20 24.06 1386.27 3828 66.5 101.01 0.72 0.02 24560.79 38 24.56 6015 e810ab60 dev development
39 2025-11-11T06:22:25Z ExecuteBacktest_With_Large_Dataset_Should_Show_Performance_Telemetry 5760 1.445 3966.6 15.26 10.45 24.60 1256.25 3828 66.5 109.62 0.65 0.02 24560.79 38 24.56 6015 e810ab60 dev development
40 2025-11-11T06:23:44Z ExecuteBacktest_With_Large_Dataset_Should_Show_Performance_Telemetry 5760 1.265 4544.2 15.26 11.24 23.71 1023.42 3828 66.5 80.77 0.53 0.01 24560.79 38 24.56 6015 e810ab60 dev development
41 2025-11-11T06:41:40Z ExecuteBacktest_With_Large_Dataset_Should_Show_Performance_Telemetry 5760 0.835 6870.8 15.27 10.21 23.73 720.71 3828 66.5 52.24 0.37 0.01 24560.79 38 24.56 6015 e810ab60 dev development
42 2025-11-11T06:44:52Z ExecuteBacktest_With_Large_Dataset_Should_Show_Performance_Telemetry 5760 1.095 5217.4 15.26 11.07 23.72 945.37 3828 66.5 72.77 0.49 0.01 24560.79 38 24.56 6015 e810ab60 dev development
43 2025-11-11T06:45:12Z ExecuteBacktest_With_Large_Dataset_Should_Show_Performance_Telemetry 5760 1.07 5356.7 15.26 11.18 23.73 897.94 3828 66.5 91.98 0.46 0.02 24560.79 38 24.56 6015 e810ab60 dev development
44 2025-11-11T06:53:40Z ExecuteBacktest_With_Large_Dataset_Should_Show_Performance_Telemetry 5760 1.12 5112.2 15.26 11.35 23.73 927.80 3828 66.5 78.67 0.48 0.01 24560.79 38 24.56 6015 e810ab60 dev development
45 2025-11-11T06:58:31Z ExecuteBacktest_With_Large_Dataset_Should_Show_Performance_Telemetry 5760 1.55 3699.6 15.27 11.03 23.74 1319.91 3828 66.5 117.22 0.68 0.02 24560.79 38 24.56 6015 e810ab60 dev development
46 2025-11-11T07:03:00Z ExecuteBacktest_With_Large_Dataset_Should_Show_Performance_Telemetry 5760 2.11 2720.5 15.29 11.00 23.75 1780.10 3828 66.5 145.96 0.92 0.03 24560.79 38 24.56 6015 e810ab60 dev development