diff --git a/src/screener/t_sunnyband.py b/src/screener/t_sunnyband.py index 6cb3c12..38c9537 100644 --- a/src/screener/t_sunnyband.py +++ b/src/screener/t_sunnyband.py @@ -3,23 +3,67 @@ import pandas as pd from db.db_connection import create_client from indicators.sunny_bands import SunnyBands -def get_stock_data(ticker: str, start_date: datetime, end_date: datetime) -> pd.DataFrame: +def get_interval_choice() -> str: + """Get user's preferred time interval""" + print("\nSelect Time Interval:") + print("1. Daily") + print("2. 5 minute") + print("3. 15 minute") + print("4. 30 minute") + print("5. 1 hour") + + while True: + choice = input("\nEnter your choice (1-5): ") + if choice == "1": + return "daily" + elif choice == "2": + return "5min" + elif choice == "3": + return "15min" + elif choice == "4": + return "30min" + elif choice == "5": + return "1hour" + else: + print("Invalid choice. Please try again.") + +def get_stock_data(ticker: str, start_date: datetime, end_date: datetime, interval: str) -> pd.DataFrame: """Fetch stock data from the database""" client = create_client() + # Select appropriate table based on interval + if interval == "daily": + table = "stock_prices_daily" + date_col = "date" + else: + table = "stock_prices" + date_col = "window_start" + query = f""" SELECT - date, + {date_col} as date, open, high, low, close, volume - FROM stock_db.stock_prices_daily + FROM stock_db.{table} WHERE ticker = '{ticker}' - AND date BETWEEN '{start_date.date()}' AND '{end_date.date()}' - ORDER BY date ASC - """ + AND {date_col} BETWEEN '{start_date.date()}' AND '{end_date.date()}' + """ + + # Add interval filtering for intraday data + if interval != "daily": + minutes_map = { + "5min": 5, + "15min": 15, + "30min": 30, + "1hour": 60 + } + minutes = minutes_map[interval] + query += f" AND (toMinute(fromUnixTimestamp(window_start)) % {minutes}) = 0" + + query += " ORDER BY date ASC" try: result = client.query(query) @@ -57,9 +101,15 @@ def run_sunny_scanner(min_price: float, max_price: float, min_volume: int) -> No print(f"\nInitializing scan for stocks between ${min_price:.2f} and ${max_price:.2f}") print(f"Minimum volume: {min_volume:,}") - # Get date range (60 days of data for calculations) + # Get user's preferred interval + interval = get_interval_choice() + + # Adjust date range based on interval end_date = datetime.now() - start_date = end_date - timedelta(days=60) + if interval == "daily": + start_date = end_date - timedelta(days=60) + else: + start_date = end_date - timedelta(days=5) # Less history needed for intraday # Get valid tickers print("\nFetching qualified stocks...") @@ -93,7 +143,7 @@ def run_sunny_scanner(min_price: float, max_price: float, min_volume: int) -> No try: # Get price data - df = get_stock_data(ticker, start_date, end_date) + df = get_stock_data(ticker, start_date, end_date, interval) if df.empty: continue