diff --git a/src/main.py b/src/main.py index 6beb178..5951617 100644 --- a/src/main.py +++ b/src/main.py @@ -505,8 +505,9 @@ async def trading_cycle( outlook = playbook.market_outlook if outlook == MarketOutlook.BEARISH: min_confidence = 90 + elif outlook == MarketOutlook.BULLISH: + min_confidence = 75 else: - # BULLISH/NEUTRAL: use base threshold (min 80 per CLAUDE.md non-negotiable rule) min_confidence = base_threshold if match.confidence < min_confidence: logger.info( diff --git a/tests/test_main.py b/tests/test_main.py index ccafd90..f00467f 100644 --- a/tests/test_main.py +++ b/tests/test_main.py @@ -2729,18 +2729,13 @@ class TestMarketOutlookConfidenceThreshold: assert call_args.kwargs["action"] == "BUY" @pytest.mark.asyncio - async def test_bullish_outlook_uses_same_threshold_as_neutral( + async def test_bullish_outlook_lowers_buy_confidence_threshold( self, mock_broker: MagicMock, mock_market: MagicMock, mock_telegram: MagicMock, ) -> None: - """BUY with confidence 77 should be suppressed even in bullish market. - - CLAUDE.md non-negotiable rule: confidence < 80 → force HOLD. - BULLISH outlook does NOT lower the threshold below 80. - (issue #205) - """ + """BUY with confidence 77 should proceed in bullish market (threshold=75).""" engine = MagicMock(spec=ScenarioEngine) engine.evaluate = MagicMock(return_value=self._make_buy_match_with_confidence(77)) playbook = self._make_playbook_with_outlook("bullish") @@ -2772,8 +2767,7 @@ class TestMarketOutlookConfidenceThreshold: call_args = decision_logger.log_decision.call_args assert call_args is not None - # confidence 77 < 80 → must be suppressed to HOLD - assert call_args.kwargs["action"] == "HOLD" + assert call_args.kwargs["action"] == "BUY" @pytest.mark.asyncio async def test_bullish_outlook_suppresses_very_low_confidence_buy( @@ -2782,7 +2776,7 @@ class TestMarketOutlookConfidenceThreshold: mock_market: MagicMock, mock_telegram: MagicMock, ) -> None: - """BUY with confidence 70 should be suppressed even in bullish market (threshold=80).""" + """BUY with confidence 70 should be suppressed even in bullish market (threshold=75).""" engine = MagicMock(spec=ScenarioEngine) engine.evaluate = MagicMock(return_value=self._make_buy_match_with_confidence(70)) playbook = self._make_playbook_with_outlook("bullish")