summaryrefslogtreecommitdiff
path: root/services/strategy-engine/tests
diff options
context:
space:
mode:
authorTheSiahxyz <164138827+TheSiahxyz@users.noreply.github.com>2026-04-02 09:56:42 +0900
committerTheSiahxyz <164138827+TheSiahxyz@users.noreply.github.com>2026-04-02 09:56:42 +0900
commit87bf67bac771181aeb4f4c5bb11fae8f343c12bb (patch)
treebd8feb016f7f1729e7448ff54927fe40f15fe9f3 /services/strategy-engine/tests
parentc32ea21d0e29a0894fe94ecc4236145541bce3ab (diff)
feat: wire sentiment into engine + add EMA/bullish candle entry filters
Diffstat (limited to 'services/strategy-engine/tests')
-rw-r--r--services/strategy-engine/tests/test_asian_session_rsi.py29
-rw-r--r--services/strategy-engine/tests/test_sentiment_wiring.py31
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()