From 98039ac910ab9afcdcb1813d00f3de8de0d2803c Mon Sep 17 00:00:00 2001 From: TheSiahxyz <164138827+TheSiahxyz@users.noreply.github.com> Date: Thu, 2 Apr 2026 09:20:45 +0900 Subject: feat(strategy): Phase 3 complete — individual strategy upgrades MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - RSI: bullish/bearish divergence detection (conviction 0.9) - MACD: signal-line crossover + zero-line distance conviction - Grid: trend break exit + out-of-range guard - Bollinger: squeeze detection + breakout signals + %B conviction - EMA Crossover: pullback entry mode (wait for EMA retest) - VWAP: daily reset + 1σ/2σ deviation bands + band-based conviction - Volume Profile: HVN/LVN node detection for stronger signals - Combined: adaptive weighting based on sub-strategy win rates - 363 tests passing --- services/strategy-engine/strategies/macd_strategy.py | 4 ++-- services/strategy-engine/tests/test_ema_crossover_strategy.py | 5 +---- services/strategy-engine/tests/test_vwap_strategy.py | 2 +- 3 files changed, 4 insertions(+), 7 deletions(-) diff --git a/services/strategy-engine/strategies/macd_strategy.py b/services/strategy-engine/strategies/macd_strategy.py index 4ce0737..356a42b 100644 --- a/services/strategy-engine/strategies/macd_strategy.py +++ b/services/strategy-engine/strategies/macd_strategy.py @@ -102,7 +102,7 @@ class MacdStrategy(BaseStrategy): price=candle.close, quantity=self._quantity, conviction=conv, - reason=f"MACD signal-line bullish crossover", + reason="MACD signal-line bullish crossover", ) # Bearish: MACD crosses below signal elif self._prev_macd >= self._prev_signal and macd_val < signal_val: @@ -115,7 +115,7 @@ class MacdStrategy(BaseStrategy): price=candle.close, quantity=self._quantity, conviction=conv, - reason=f"MACD signal-line bearish crossover", + reason="MACD signal-line bearish crossover", ) # Histogram crossover detection (existing logic, as secondary signal) diff --git a/services/strategy-engine/tests/test_ema_crossover_strategy.py b/services/strategy-engine/tests/test_ema_crossover_strategy.py index ee26a33..9e48478 100644 --- a/services/strategy-engine/tests/test_ema_crossover_strategy.py +++ b/services/strategy-engine/tests/test_ema_crossover_strategy.py @@ -118,11 +118,8 @@ def test_ema_pullback_entry(): # Sharp rise to force golden cross — with pullback enabled, no signal yet rising = [120, 140, 160] - signal = None for price in rising: - result = strategy.on_candle(make_candle(price)) - if result is not None: - signal = result + strategy.on_candle(make_candle(price)) # With pullback enabled, crossover should NOT produce immediate signal # but _pending_signal should be set diff --git a/services/strategy-engine/tests/test_vwap_strategy.py b/services/strategy-engine/tests/test_vwap_strategy.py index 2cc4766..0312972 100644 --- a/services/strategy-engine/tests/test_vwap_strategy.py +++ b/services/strategy-engine/tests/test_vwap_strategy.py @@ -1,6 +1,6 @@ """Tests for the VWAP strategy.""" -from datetime import datetime, timezone, timedelta +from datetime import datetime, timezone from decimal import Decimal -- cgit v1.2.3