"""Tests for the RSI strategy.""" from datetime import datetime, timezone from decimal import Decimal from shared.models import Candle, OrderSide from strategies.rsi_strategy import RsiStrategy def make_candle(close: float, idx: int = 0) -> Candle: return Candle( symbol="BTC/USDT", timeframe="1m", open_time=datetime(2024, 1, 1, tzinfo=timezone.utc), open=Decimal(str(close)), high=Decimal(str(close)), low=Decimal(str(close)), close=Decimal(str(close)), volume=Decimal("1.0"), ) def test_rsi_strategy_no_signal_insufficient_data(): strategy = RsiStrategy() strategy.configure({}) candle = make_candle(50000.0) result = strategy.on_candle(candle) assert result is None def test_rsi_strategy_buy_signal_on_oversold(): strategy = RsiStrategy() strategy.configure({"period": 14, "oversold": 30, "overbought": 70}) # Feed 20 steadily declining prices to force RSI into oversold territory prices = [50000 - i * 500 for i in range(20)] signal = None for i, price in enumerate(prices): signal = strategy.on_candle(make_candle(price, i)) # We may or may not get a signal depending on RSI calculation; # if a signal is returned, it must be a BUY if signal is not None: assert signal.side == OrderSide.BUY