From ac1707c4396430310edb87c2038eb711c61eb3f1 Mon Sep 17 00:00:00 2001 From: cryptooda Date: Fri, 14 Nov 2025 20:02:51 +0700 Subject: [PATCH] Add test for RSI Divergence --- .../Indicators/RsiDivergenceTests.cs | 58 +++++++++++++++++++ .../Indicators/RunIndicatorsBase.cs | 33 +++++++++++ .../Managing.Domain.Tests.csproj | 3 + .../performance-benchmarks-two-scenarios.csv | 3 + .../performance-benchmarks.csv | 3 + 5 files changed, 100 insertions(+) create mode 100644 src/Managing.Domain.Tests/Indicators/RsiDivergenceTests.cs create mode 100644 src/Managing.Domain.Tests/Indicators/RunIndicatorsBase.cs diff --git a/src/Managing.Domain.Tests/Indicators/RsiDivergenceTests.cs b/src/Managing.Domain.Tests/Indicators/RsiDivergenceTests.cs new file mode 100644 index 00000000..e2e18257 --- /dev/null +++ b/src/Managing.Domain.Tests/Indicators/RsiDivergenceTests.cs @@ -0,0 +1,58 @@ +using FluentAssertions; +using Managing.Domain.Strategies.Signals; +using Xunit; +using static Managing.Common.Enums; + +namespace Managing.Domain.Tests; + +/// +/// Tests for RSI Divergence indicator signal generation. +/// Tests verify that the indicator produces a consistent number of signals +/// when run on the same historical data. +/// +public class RsiDivergenceTests : RunIndicatorsBase +{ + [Fact] + public void RsiDivergenceIndicator_Should_Generate_Consistent_Signal_Count() + { + // Arrange + var rsiIndicator = new RsiDivergenceIndicatorBase("RSI_Divergence_Test", 14); + + // Act + var signals = RunIndicatorAndGetSignals(rsiIndicator); + var signalCount = signals.Count; + + // Assert + // The RSI divergence indicator should generate a consistent number of signals + // when run on the same historical ETH data. + // This test ensures that any changes to the indicator logic don't accidentally + // change the signal generation behavior. + signalCount.Should().BeGreaterThan(0, "RSI divergence indicator should generate signals from historical data"); + signalCount.Should().Be(11, "RSI divergence indicator should generate exactly 11 signals with the current ETH dataset"); + } + + [Fact] + public void RsiDivergenceIndicator_Should_Generate_Valid_Signals() + { + // Arrange + var rsiIndicator = new RsiDivergenceIndicatorBase("RSI_Divergence_Test", 14); + + // Act + var signals = RunIndicatorAndGetSignals(rsiIndicator); + + // Assert + signals.Should().NotBeNull(); + signals.Should().NotBeEmpty(); + + // Verify each signal has required properties + foreach (var signal in signals) + { + signal.Should().NotBeNull(); + signal.Date.Should().NotBe(default(DateTime)); + // Enums cannot be null by definition, so we just verify they have valid values + signal.Direction.Should().BeOneOf(TradeDirection.Long, TradeDirection.Short); + signal.Ticker.Should().NotBe(Ticker.Unknown); + signal.Confidence.Should().BeOneOf(Confidence.Low, Confidence.Medium, Confidence.High); + } + } +} \ No newline at end of file diff --git a/src/Managing.Domain.Tests/Indicators/RunIndicatorsBase.cs b/src/Managing.Domain.Tests/Indicators/RunIndicatorsBase.cs new file mode 100644 index 00000000..be1c0321 --- /dev/null +++ b/src/Managing.Domain.Tests/Indicators/RunIndicatorsBase.cs @@ -0,0 +1,33 @@ +using Managing.Core; +using Managing.Domain.Candles; +using Managing.Domain.Indicators; +using Managing.Domain.Strategies; + +namespace Managing.Domain.Tests; + +public class RunIndicatorsBase +{ + protected readonly List TestCandles; + + public RunIndicatorsBase() + { + // Load the ETH Fifteen Minutes candles data for indicator testing + TestCandles = FileHelpers.ReadJson>("Data/ETH-FifteenMinutes-candles-20:44:15 +00:00-.json"); + } + + /// + /// Runs an indicator on the test candles and returns the signals generated + /// + /// The indicator to run + /// List of signals generated by the indicator + protected List RunIndicatorAndGetSignals(IndicatorBase indicator) + { + // Convert list to HashSet as expected by the Run method + var candleSet = TestCandles.ToHashSet(); + + // Run the indicator + var signals = indicator.Run(candleSet); + + return signals ?? new List(); + } +} \ No newline at end of file diff --git a/src/Managing.Domain.Tests/Managing.Domain.Tests.csproj b/src/Managing.Domain.Tests/Managing.Domain.Tests.csproj index 6279b16c..7467735f 100644 --- a/src/Managing.Domain.Tests/Managing.Domain.Tests.csproj +++ b/src/Managing.Domain.Tests/Managing.Domain.Tests.csproj @@ -30,6 +30,9 @@ Always + + Always + diff --git a/src/Managing.Workers.Tests/performance-benchmarks-two-scenarios.csv b/src/Managing.Workers.Tests/performance-benchmarks-two-scenarios.csv index ab591342..3907d9d9 100644 --- a/src/Managing.Workers.Tests/performance-benchmarks-two-scenarios.csv +++ b/src/Managing.Workers.Tests/performance-benchmarks-two-scenarios.csv @@ -15,3 +15,6 @@ DateTime,TestName,CandlesCount,ExecutionTimeSeconds,ProcessingRateCandlesPerSec, 2025-11-12T14:04:57Z,Telemetry_ETH_RSI_EMACROSS,5760,6.45,893.2,15.27,16.06,23.13,0.0,0,0.0,0.0,0.0,0.0,-53491.95,20,-53.49,0.00,d9489691,dev,development 2025-11-12T17:31:53Z,Telemetry_ETH_RSI_EMACROSS,5760,5.10,1128.5,15.26,15.61,23.10,0.0,0,0.0,0.0,0.0,0.0,-34137.42,20,-34.14,0.00,6d6f70ae,dev,development 2025-11-13T19:34:27Z,Telemetry_ETH_RSI_EMACROSS,5760,3.68,1566.4,15.26,15.45,23.08,0.0,0,0.0,0.0,0.0,0.0,-35450.45,20,-49.76,0.00,1f7d9146,dev,development +2025-11-14T12:43:33Z,Telemetry_ETH_RSI_EMACROSS,5760,6.43,896.2,29.02,22.13,36.21,0.0,0,0.0,0.0,0.0,0.0,-35450.45,20,-49.76,0.00,b60295fc,dev,development +2025-11-14T12:45:51Z,Telemetry_ETH_RSI_EMACROSS,5760,4.12,1398.2,29.05,21.88,36.24,0.0,0,0.0,0.0,0.0,0.0,-35450.45,20,-49.76,0.00,b60295fc,dev,development +2025-11-14T12:46:43Z,Telemetry_ETH_RSI_EMACROSS,5760,3.86,1491.9,29.05,20.88,36.27,0.0,0,0.0,0.0,0.0,0.0,-35450.45,20,-49.76,0.00,b60295fc,dev,development diff --git a/src/Managing.Workers.Tests/performance-benchmarks.csv b/src/Managing.Workers.Tests/performance-benchmarks.csv index fb1e6cf6..1fed7416 100644 --- a/src/Managing.Workers.Tests/performance-benchmarks.csv +++ b/src/Managing.Workers.Tests/performance-benchmarks.csv @@ -60,3 +60,6 @@ DateTime,TestName,CandlesCount,ExecutionTimeSeconds,ProcessingRateCandlesPerSec, 2025-11-12T17:31:53Z,Telemetry_ETH_RSI,5760,3.145,1826.0,15.26,16.99,24.08,0.00,0,0.0,2982.49,0.00,0.52,-29063.40,24,-29.06,0.00,6d6f70ae,dev,development 2025-11-13T19:31:55Z,Telemetry_ETH_RSI,5760,3.27,1755.7,15.26,17.03,24.09,0.00,0,0.0,3141.00,0.00,0.55,-30689.97,24,-51.70,0.00,1f7d9146,dev,development 2025-11-13T19:34:27Z,Telemetry_ETH_RSI,5760,1.655,3461.5,15.26,17.10,23.48,0.00,0,0.0,1595.88,0.00,0.28,-30689.97,24,-51.70,0.00,1f7d9146,dev,development +2025-11-14T12:43:33Z,Telemetry_ETH_RSI,5760,4.345,1324.3,21.03,20.35,28.95,0.00,0,0.0,4210.13,0.00,0.73,-30689.97,24,-51.70,0.00,b60295fc,dev,development +2025-11-14T12:45:51Z,Telemetry_ETH_RSI,5760,2.235,2576.6,29.03,20.37,36.11,0.00,0,0.0,2103.00,0.00,0.37,-30689.97,24,-51.70,0.00,b60295fc,dev,development +2025-11-14T12:46:43Z,Telemetry_ETH_RSI,5760,3.44,1669.8,28.85,20.34,35.90,0.00,0,0.0,3304.34,0.00,0.57,-30689.97,24,-51.70,0.00,b60295fc,dev,development