From b9d21e2e2f7ae096c2f8a01bb142a685683b5b90 Mon Sep 17 00:00:00 2001 From: TheSiahxyz <164138827+TheSiahxyz@users.noreply.github.com> Date: Thu, 2 Apr 2026 09:44:43 +0900 Subject: feat: add market sentiment filters (Fear & Greed, CryptoPanic, CryptoQuant) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - SentimentProvider: fetches Fear & Greed Index (free, no key), CryptoPanic news sentiment (free key), CryptoQuant exchange netflow (free key) - SentimentData: aggregated should_buy/should_block logic - Fear < 30 = buy opportunity, Greed > 80 = block buying - Negative news < -0.5 = block buying - Exchange outflow = bullish, inflow = bearish - Integrated into Asian Session RSI strategy as entry filter - All providers optional — disabled when API key missing - 14 sentiment tests + 386 total tests passing --- .../tests/test_bollinger_strategy.py | 42 ++++++++++++---------- 1 file changed, 24 insertions(+), 18 deletions(-) (limited to 'services/strategy-engine/tests/test_bollinger_strategy.py') diff --git a/services/strategy-engine/tests/test_bollinger_strategy.py b/services/strategy-engine/tests/test_bollinger_strategy.py index 473d9b4..7761f2d 100644 --- a/services/strategy-engine/tests/test_bollinger_strategy.py +++ b/services/strategy-engine/tests/test_bollinger_strategy.py @@ -107,12 +107,14 @@ def test_bollinger_squeeze_detection(): """Tight bandwidth → no signal during squeeze.""" # Use a strategy with a high squeeze threshold so constant prices trigger squeeze s = BollingerStrategy() - s.configure({ - "period": 5, - "num_std": 2.0, - "min_bandwidth": 0.0, - "squeeze_threshold": 0.5, # Very high threshold to ensure squeeze triggers - }) + s.configure( + { + "period": 5, + "num_std": 2.0, + "min_bandwidth": 0.0, + "squeeze_threshold": 0.5, # Very high threshold to ensure squeeze triggers + } + ) # Feed identical prices → bandwidth = 0 (below any threshold) for _ in range(6): @@ -126,12 +128,14 @@ def test_bollinger_squeeze_detection(): def test_bollinger_squeeze_breakout_buy(): """Squeeze ends with price above SMA → BUY signal.""" s = BollingerStrategy() - s.configure({ - "period": 5, - "num_std": 1.0, - "min_bandwidth": 0.0, - "squeeze_threshold": 0.01, - }) + s.configure( + { + "period": 5, + "num_std": 1.0, + "min_bandwidth": 0.0, + "squeeze_threshold": 0.01, + } + ) # Feed identical prices to create a squeeze (bandwidth = 0) for _ in range(6): @@ -149,12 +153,14 @@ def test_bollinger_squeeze_breakout_buy(): def test_bollinger_pct_b_conviction(): """Signals near band extremes have higher conviction via %B.""" s = BollingerStrategy() - s.configure({ - "period": 5, - "num_std": 1.0, - "min_bandwidth": 0.0, - "squeeze_threshold": 0.0, # Disable squeeze for this test - }) + s.configure( + { + "period": 5, + "num_std": 1.0, + "min_bandwidth": 0.0, + "squeeze_threshold": 0.0, # Disable squeeze for this test + } + ) # Build up with stable prices for _ in range(5): -- cgit v1.2.3