feat: Add time interval selection for SunnyBand scanner
This commit is contained in:
parent
1b6e93badf
commit
9c440f08da
@ -3,23 +3,67 @@ import pandas as pd
|
|||||||
from db.db_connection import create_client
|
from db.db_connection import create_client
|
||||||
from indicators.sunny_bands import SunnyBands
|
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"""
|
"""Fetch stock data from the database"""
|
||||||
client = create_client()
|
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"""
|
query = f"""
|
||||||
SELECT
|
SELECT
|
||||||
date,
|
{date_col} as date,
|
||||||
open,
|
open,
|
||||||
high,
|
high,
|
||||||
low,
|
low,
|
||||||
close,
|
close,
|
||||||
volume
|
volume
|
||||||
FROM stock_db.stock_prices_daily
|
FROM stock_db.{table}
|
||||||
WHERE ticker = '{ticker}'
|
WHERE ticker = '{ticker}'
|
||||||
AND date BETWEEN '{start_date.date()}' AND '{end_date.date()}'
|
AND {date_col} BETWEEN '{start_date.date()}' AND '{end_date.date()}'
|
||||||
ORDER BY date ASC
|
"""
|
||||||
"""
|
|
||||||
|
# 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:
|
try:
|
||||||
result = client.query(query)
|
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"\nInitializing scan for stocks between ${min_price:.2f} and ${max_price:.2f}")
|
||||||
print(f"Minimum volume: {min_volume:,}")
|
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()
|
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
|
# Get valid tickers
|
||||||
print("\nFetching qualified stocks...")
|
print("\nFetching qualified stocks...")
|
||||||
@ -93,7 +143,7 @@ def run_sunny_scanner(min_price: float, max_price: float, min_volume: int) -> No
|
|||||||
|
|
||||||
try:
|
try:
|
||||||
# Get price data
|
# 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:
|
if df.empty:
|
||||||
continue
|
continue
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user