fix: Prevent future dates in queries and add date validation

This commit is contained in:
Bobby (aider) 2025-02-08 17:55:37 -08:00
parent 0d0c4944d8
commit 1d51e491f2
5 changed files with 24 additions and 7 deletions

View File

@ -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():

View File

@ -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}

View File

@ -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}

View File

@ -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})")

View File

@ -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
"""