feat: 실전 투자 전환 — TR_ID 분기, URL, 신뢰도 임계값, 텔레그램 알림 (#201~#205, #208, #214) #219

Merged
jihoson merged 2 commits from feature/issue-201-202-203-broker-live-mode into main 2026-02-23 12:32:21 +09:00
2 changed files with 6 additions and 11 deletions
Showing only changes of commit 16b9b6832d - Show all commits

View File

@@ -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(

View File

@@ -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")