From 12a398a29a72499304208237d22179499e9670cb Mon Sep 17 00:00:00 2001 From: Youssef Aitousarrah Date: Tue, 14 Apr 2026 17:19:54 -0700 Subject: [PATCH] feat(scanners): remove caps for technical_breakout; add missing config entry MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - technical_breakout: max_tickers 150 → 0 (reads from OHLCV cache, no need for cap) - minervini: fix stale default max_tickers 50 → 0 in code (config already 0) - default_config: add missing technical_breakout scanner config entry Co-Authored-By: Claude Sonnet 4.6 --- tradingagents/dataflows/discovery/scanners/minervini.py | 2 +- .../dataflows/discovery/scanners/technical_breakout.py | 5 +++-- tradingagents/default_config.py | 8 ++++++++ 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/tradingagents/dataflows/discovery/scanners/minervini.py b/tradingagents/dataflows/discovery/scanners/minervini.py index 2eb1a3b1..fe40e48d 100644 --- a/tradingagents/dataflows/discovery/scanners/minervini.py +++ b/tradingagents/dataflows/discovery/scanners/minervini.py @@ -42,7 +42,7 @@ class MinerviniScanner(BaseScanner): self.sma_200_slope_days = self.scanner_config.get("sma_200_slope_days", 20) self.min_pct_off_low = self.scanner_config.get("min_pct_off_low", 30) self.max_pct_from_high = self.scanner_config.get("max_pct_from_high", 25) - self.max_tickers = self.scanner_config.get("max_tickers", 50) + self.max_tickers = self.scanner_config.get("max_tickers", 0) # 0 = no cap def scan(self, state: Dict[str, Any]) -> List[Dict[str, Any]]: if not self.is_enabled(): diff --git a/tradingagents/dataflows/discovery/scanners/technical_breakout.py b/tradingagents/dataflows/discovery/scanners/technical_breakout.py index 22208d03..96101ff0 100644 --- a/tradingagents/dataflows/discovery/scanners/technical_breakout.py +++ b/tradingagents/dataflows/discovery/scanners/technical_breakout.py @@ -22,7 +22,7 @@ class TechnicalBreakoutScanner(BaseScanner): def __init__(self, config: Dict[str, Any]): super().__init__(config) - self.max_tickers = self.scanner_config.get("max_tickers", 150) + self.max_tickers = self.scanner_config.get("max_tickers", 0) # 0 = no cap self.min_volume_multiple = self.scanner_config.get("min_volume_multiple", 2.0) self.lookback_days = self.scanner_config.get("lookback_days", 20) @@ -37,7 +37,8 @@ class TechnicalBreakoutScanner(BaseScanner): logger.warning("No tickers loaded for breakout scan") return [] - tickers = tickers[: self.max_tickers] + if self.max_tickers: + tickers = tickers[: self.max_tickers] cache_dir = self.config.get("discovery", {}).get("ohlcv_cache_dir", "data/ohlcv_cache") logger.info(f"Loading OHLCV for {len(tickers)} tickers from cache (3mo)...") diff --git a/tradingagents/default_config.py b/tradingagents/default_config.py index aca33a82..a5510978 100644 --- a/tradingagents/default_config.py +++ b/tradingagents/default_config.py @@ -240,6 +240,14 @@ DEFAULT_CONFIG = { "fetch_market_cap": False, # Skip for speed (1 NaN out of 30 features) "max_workers": 8, # Parallel feature computation threads }, + "technical_breakout": { + "enabled": True, + "pipeline": "momentum", + "limit": 10, + "max_tickers": 0, # 0 = no cap (reads from OHLCV cache) + "min_volume_multiple": 2.0, # Min volume vs 20d avg to confirm breakout + "lookback_days": 20, # Days for volume/price lookback + }, "minervini": { "enabled": True, "pipeline": "momentum",