diff --git a/src/db/db_connection.py b/src/db/db_connection.py index 395c788..19d34a8 100644 --- a/src/db/db_connection.py +++ b/src/db/db_connection.py @@ -9,7 +9,7 @@ from dotenv import load_dotenv load_dotenv() # Configure logging -logging.basicConfig(level=logging.INFO) +logging.basicConfig(level=logging.WARNING) logger = logging.getLogger(__name__) def create_client(): diff --git a/src/screener/t_atr_ema.py b/src/screener/t_atr_ema.py index a4f54c0..58c66c7 100644 --- a/src/screener/t_atr_ema.py +++ b/src/screener/t_atr_ema.py @@ -4,7 +4,7 @@ from datetime import datetime, timedelta import pandas as pd from db.db_connection import create_client from trading.position_calculator import PositionCalculator -from utils.data_utils import get_stock_data +from utils.data_utils import get_stock_data, validate_signal_date from indicators.three_atr_ema import ThreeATREMAIndicator def check_atr_ema_bullish_signal(df: pd.DataFrame) -> bool: @@ -65,6 +65,7 @@ def run_atr_ema_scanner(min_price: float, max_price: float, min_volume: int, por max(window_start) as last_update FROM stock_db.stock_prices WHERE window_start BETWEEN {start_ts} AND {end_ts} + AND toDateTime(window_start/1000000000) <= now() GROUP BY ticker HAVING last_close BETWEEN {min_price} AND {max_price} AND total_volume >= {min_volume} diff --git a/src/screener/t_atr_ema_v2.py b/src/screener/t_atr_ema_v2.py index c879c2f..2d13c5a 100644 --- a/src/screener/t_atr_ema_v2.py +++ b/src/screener/t_atr_ema_v2.py @@ -3,7 +3,7 @@ import pandas as pd import os from db.db_connection import create_client from trading.position_calculator import PositionCalculator -from utils.data_utils import get_stock_data +from utils.data_utils import get_stock_data, validate_signal_date from screener.user_input import get_interval_choice, get_date_range from indicators.three_atr_ema import ThreeATREMAIndicator @@ -81,6 +81,7 @@ def run_atr_ema_scanner_v2(min_price: float, max_price: float, min_volume: int, max(window_start) as last_update FROM stock_db.stock_prices WHERE window_start BETWEEN {start_ts} AND {end_ts} + AND toDateTime(window_start/1000000000) <= now() GROUP BY ticker HAVING last_close BETWEEN {min_price} AND {max_price} AND total_volume >= {min_volume} diff --git a/src/screener/t_sunnyband.py b/src/screener/t_sunnyband.py index a8263fb..28f1b82 100644 --- a/src/screener/t_sunnyband.py +++ b/src/screener/t_sunnyband.py @@ -6,7 +6,7 @@ from db.db_connection import create_client from indicators.sunny_bands import SunnyBands from trading.position_calculator import PositionCalculator from screener.user_input import get_interval_choice, get_date_range -from utils.data_utils import get_stock_data +from utils.data_utils import get_stock_data, validate_signal_date @@ -187,6 +187,7 @@ def run_sunny_scanner(min_price: float, max_price: float, min_volume: int, portf max(window_start) as last_update FROM stock_db.stock_prices WHERE window_start BETWEEN {start_ts} AND {end_ts} + AND toDateTime(window_start/1000000000) <= now() GROUP BY ticker HAVING last_close BETWEEN {min_price} AND {max_price} AND total_volume >= {min_volume} @@ -265,7 +266,7 @@ def run_sunny_scanner(min_price: float, max_price: float, min_volume: int, portf bullish_signals.append(signal_data) # Update print output format dollar_risk = position['potential_loss'] * -1 - signal_date = df.iloc[-1]['date'] # Get the date of the signal + signal_date = validate_signal_date(df.iloc[-1]['date']) # Get and validate the date signal_data['signal_date'] = signal_date # Add to signal data print(f"\n🟢 {ticker} @ ${current_price:.2f} on {signal_date.strftime('%Y-%m-%d %H:%M')}") print(f" Size: {position['shares']} shares (${position['position_value']:.2f})") diff --git a/src/utils/data_utils.py b/src/utils/data_utils.py index 3174d80..a36662e 100644 --- a/src/utils/data_utils.py +++ b/src/utils/data_utils.py @@ -2,6 +2,21 @@ import pandas as pd from datetime import datetime, timedelta from db.db_connection import create_client +def validate_signal_date(signal_date: datetime) -> datetime: + """ + Validate and adjust signal date if needed + + Args: + signal_date (datetime): Signal date to validate + + Returns: + datetime: Valid signal date (not in future) + """ + current_date = datetime.now() + if signal_date > current_date: + return current_date + return signal_date + def get_stock_data(ticker: str, start_date: datetime, end_date: datetime, interval: str) -> pd.DataFrame: """ Fetch stock data from the database with enhanced fallback logic @@ -41,8 +56,7 @@ def get_stock_data(ticker: str, start_date: datetime, end_date: datetime, interv AND window_start BETWEEN {int(start_date.timestamp() * 1e9)} AND {int(end_date.timestamp() * 1e9)} - AND toYear(toDateTime(window_start/1000000000)) <= toYear(now()) - AND toYear(toDateTime(window_start/1000000000)) >= (toYear(now()) - 1) + AND toDateTime(window_start/1000000000) <= now() ORDER BY date ASC """