From 05ab2846bb83273d1dd4d8e02d99f873a819a429 Mon Sep 17 00:00:00 2001 From: gahusb Date: Sun, 17 May 2026 12:55:15 +0900 Subject: [PATCH] =?UTF-8?q?feat(signal=5Fv2-phase4):=20foundation=20?= =?UTF-8?q?=E2=80=94=206=20env=20thresholds=20+=20state.signals?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit config.py: STOP_LOSS_PCT / TAKE_PROFIT_PCT / CHRONOS_SPREAD_THRESHOLD / ASKING_BID_RATIO_THRESHOLD / CONFIDENCE_THRESHOLD / MIN_MOMENTUM_FOR_BUY env vars with sensible defaults (Phase 0 spec §6.1-§6.2 values). state.py: PollState.signals dict[ticker, signal_body] for Phase 5 input. 45 existing tests still pass. Co-Authored-By: Claude Opus 4.7 (1M context) --- signal_v2/config.py | 18 ++++++++++++++++++ signal_v2/state.py | 1 + 2 files changed, 19 insertions(+) diff --git a/signal_v2/config.py b/signal_v2/config.py index e0c0033..305b417 100644 --- a/signal_v2/config.py +++ b/signal_v2/config.py @@ -35,6 +35,24 @@ class Settings: ) ) chronos_model: str = field(default_factory=lambda: os.getenv("CHRONOS_MODEL", "amazon/chronos-2")) + stop_loss_pct: float = field( + default_factory=lambda: float(os.getenv("STOP_LOSS_PCT", "-0.07")) + ) + take_profit_pct: float = field( + default_factory=lambda: float(os.getenv("TAKE_PROFIT_PCT", "0.15")) + ) + chronos_spread_threshold: float = field( + default_factory=lambda: float(os.getenv("CHRONOS_SPREAD_THRESHOLD", "0.6")) + ) + asking_bid_ratio_threshold: float = field( + default_factory=lambda: float(os.getenv("ASKING_BID_RATIO_THRESHOLD", "0.6")) + ) + confidence_threshold: float = field( + default_factory=lambda: float(os.getenv("CONFIDENCE_THRESHOLD", "0.7")) + ) + min_momentum_for_buy: str = field( + default_factory=lambda: os.getenv("MIN_MOMENTUM_FOR_BUY", "strong_up") + ) @property def kis_is_virtual(self) -> bool: diff --git a/signal_v2/state.py b/signal_v2/state.py index 11fd7a6..6fc4340 100644 --- a/signal_v2/state.py +++ b/signal_v2/state.py @@ -14,6 +14,7 @@ class PollState: daily_ohlcv: dict[str, list[dict]] = field(default_factory=dict) chronos_predictions: dict[str, dict] = field(default_factory=dict) minute_momentum: dict[str, str] = field(default_factory=dict) + signals: dict[str, dict] = field(default_factory=dict) last_updated: dict[str, str] = field(default_factory=dict) fetch_errors: dict[str, int] = field(default_factory=dict)