From c3873962548e79a409053355a07abdb043b6b2b0 Mon Sep 17 00:00:00 2001 From: "Bobby (aider)" Date: Wed, 12 Feb 2025 19:40:01 -0800 Subject: [PATCH] refactor: Update scanner initialization to accept start and end dates as parameters --- src/screener/scanner_controller.py | 11 ++++++++--- src/screener/t_atr_ema.py | 14 +++++++++++--- src/utils/scanner_utils.py | 10 ++++++++-- 3 files changed, 27 insertions(+), 8 deletions(-) diff --git a/src/screener/scanner_controller.py b/src/screener/scanner_controller.py index 4695e21..204ed24 100644 --- a/src/screener/scanner_controller.py +++ b/src/screener/scanner_controller.py @@ -1,3 +1,4 @@ +from datetime import datetime from screener.t_sunnyband import run_sunny_scanner from screener.t_atr_ema import run_atr_ema_scanner from screener.t_atr_ema_v2 import run_atr_ema_scanner_v2 @@ -18,10 +19,14 @@ def run_technical_scanner(scanner_choice: str, start_date: str, end_date: str, portfolio_size (float): Portfolio size for position sizing interval (str): Time interval for data (default: "1d") """ + # Convert string dates to datetime objects + start_dt = datetime.strptime(start_date, "%Y-%m-%d") + end_dt = datetime.strptime(end_date, "%Y-%m-%d") + scanner_map = { - "sunnybands": lambda: run_sunny_scanner(min_price, max_price, min_volume, portfolio_size, interval), - "atr-ema": lambda: run_atr_ema_scanner(min_price, max_price, min_volume, portfolio_size, interval), - "atr-ema_v2": lambda: run_atr_ema_scanner_v2(min_price, max_price, min_volume, portfolio_size, interval) + "sunnybands": lambda: run_sunny_scanner(min_price, max_price, min_volume, portfolio_size, interval, start_dt, end_dt), + "atr-ema": lambda: run_atr_ema_scanner(min_price, max_price, min_volume, portfolio_size, interval, start_dt, end_dt), + "atr-ema_v2": lambda: run_atr_ema_scanner_v2(min_price, max_price, min_volume, portfolio_size, interval, start_dt, end_dt) } scanner_func = scanner_map.get(scanner_choice) diff --git a/src/screener/t_atr_ema.py b/src/screener/t_atr_ema.py index 737208d..ccda5f2 100644 --- a/src/screener/t_atr_ema.py +++ b/src/screener/t_atr_ema.py @@ -56,11 +56,19 @@ def check_entry_signal(df: pd.DataFrame) -> list: return signals -def run_atr_ema_scanner(min_price: float, max_price: float, min_volume: int, portfolio_size: float = None, interval: str = "1d") -> None: +def run_atr_ema_scanner(min_price: float, max_price: float, min_volume: int, + portfolio_size: float = None, interval: str = "1d", + start_date: datetime = None, end_date: datetime = None) -> None: try: - # Initialize scanner components + # Initialize scanner components with all parameters interval, start_date, end_date, qualified_stocks, calculator = initialize_scanner( - min_price, max_price, min_volume, portfolio_size, interval + min_price=min_price, + max_price=max_price, + min_volume=min_volume, + portfolio_size=portfolio_size, + interval=interval, + start_date=start_date, + end_date=end_date ) if not qualified_stocks: diff --git a/src/utils/scanner_utils.py b/src/utils/scanner_utils.py index 0687e28..b4df54b 100644 --- a/src/utils/scanner_utils.py +++ b/src/utils/scanner_utils.py @@ -3,7 +3,9 @@ from utils.data_utils import get_user_input, get_stock_data, get_qualified_stock from screener.user_input import get_interval_choice, get_date_range from trading.position_calculator import PositionCalculator -def initialize_scanner(min_price: float, max_price: float, min_volume: int, portfolio_size: float = None, interval: str = "1d") -> tuple: +def initialize_scanner(min_price: float, max_price: float, min_volume: int, + portfolio_size: float = None, interval: str = "1d", + start_date: datetime = None, end_date: datetime = None) -> tuple: """ Initialize common scanner components @@ -13,10 +15,14 @@ def initialize_scanner(min_price: float, max_price: float, min_volume: int, port min_volume (int): Minimum volume threshold portfolio_size (float, optional): Portfolio size for position calculations interval (str, optional): Time interval for data (default: "1d") + start_date (datetime, optional): Start date for scanning + end_date (datetime, optional): End date for scanning """ print(f"\nScanning for stocks ${min_price:.2f}-${max_price:.2f} with min volume {min_volume:,}") - start_date, end_date = get_date_range() + # Remove the get_date_range() call and use the passed parameters + if not start_date or not end_date: + raise ValueError("start_date and end_date must be provided") qualified_stocks = get_qualified_stocks(start_date, end_date, min_price, max_price, min_volume)