diff options
Diffstat (limited to 'services/strategy-engine/tests')
| -rw-r--r-- | services/strategy-engine/tests/test_asian_session_rsi.py | 29 | ||||
| -rw-r--r-- | services/strategy-engine/tests/test_sentiment_wiring.py | 31 |
2 files changed, 60 insertions, 0 deletions
diff --git a/services/strategy-engine/tests/test_asian_session_rsi.py b/services/strategy-engine/tests/test_asian_session_rsi.py index b311220..db031f0 100644 --- a/services/strategy-engine/tests/test_asian_session_rsi.py +++ b/services/strategy-engine/tests/test_asian_session_rsi.py @@ -159,3 +159,32 @@ def test_reset_clears_all(): def test_warmup_period(): s = _make_strategy(rsi_period=14) assert s.warmup_period == 15 + + +def test_ema_filter_blocks_below_ema(): + """Entry blocked when price is below EMA.""" + s = AsianSessionRsiStrategy() + s._rsi_period = 5 + s._rsi_oversold = 40 + s._quantity = Decimal("0.5") + s._take_profit_pct = 1.5 + s._stop_loss_pct = 0.7 + s._session_start_utc = 0 + s._session_end_utc = 2 + s._max_trades_per_day = 3 + s._max_consecutive_losses = 10 + s._ema_period = 5 + s._require_bullish_candle = False # Test EMA only + + # Feed rising prices to set EMA high, then sharp drop + for i in range(10): + s.on_candle(_candle(200 + i * 5, hour=0, minute=i * 5)) + # Now feed low price -- below EMA, RSI should be low + signals = [] + for i in range(5): + sig = s.on_candle(_candle(100 - i * 5, hour=0, minute=(15 + i) * 5 % 60)) + if sig is not None: + signals.append(sig) + # Should have no BUY signals because price is way below EMA + buy_sigs = [s for s in signals if s.side == OrderSide.BUY] + assert len(buy_sigs) == 0 diff --git a/services/strategy-engine/tests/test_sentiment_wiring.py b/services/strategy-engine/tests/test_sentiment_wiring.py new file mode 100644 index 0000000..f1a816f --- /dev/null +++ b/services/strategy-engine/tests/test_sentiment_wiring.py @@ -0,0 +1,31 @@ +"""Test sentiment is wired into strategy engine.""" +import sys +from pathlib import Path + +sys.path.insert(0, str(Path(__file__).resolve().parents[1] / "src")) +sys.path.insert(0, str(Path(__file__).resolve().parents[1])) + +from shared.sentiment import SentimentData +from strategies.asian_session_rsi import AsianSessionRsiStrategy + + +def test_strategy_accepts_sentiment(): + s = AsianSessionRsiStrategy() + data = SentimentData(fear_greed_value=20, fear_greed_label="Extreme Fear") + s.update_sentiment(data) + assert s._sentiment is not None + assert s._sentiment.fear_greed_value == 20 + + +def test_strategy_blocks_on_extreme_greed(): + s = AsianSessionRsiStrategy() + data = SentimentData(fear_greed_value=85) + s.update_sentiment(data) + assert not s._check_sentiment() + + +def test_strategy_allows_on_fear(): + s = AsianSessionRsiStrategy() + data = SentimentData(fear_greed_value=20) + s.update_sentiment(data) + assert s._check_sentiment() |
