fix: Prevent future dates in queries and add date validation
This commit is contained in:
parent
0d0c4944d8
commit
1d51e491f2
@ -9,7 +9,7 @@ from dotenv import load_dotenv
|
|||||||
load_dotenv()
|
load_dotenv()
|
||||||
|
|
||||||
# Configure logging
|
# Configure logging
|
||||||
logging.basicConfig(level=logging.INFO)
|
logging.basicConfig(level=logging.WARNING)
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
def create_client():
|
def create_client():
|
||||||
|
|||||||
@ -4,7 +4,7 @@ from datetime import datetime, timedelta
|
|||||||
import pandas as pd
|
import pandas as pd
|
||||||
from db.db_connection import create_client
|
from db.db_connection import create_client
|
||||||
from trading.position_calculator import PositionCalculator
|
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
|
from indicators.three_atr_ema import ThreeATREMAIndicator
|
||||||
|
|
||||||
def check_atr_ema_bullish_signal(df: pd.DataFrame) -> bool:
|
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
|
max(window_start) as last_update
|
||||||
FROM stock_db.stock_prices
|
FROM stock_db.stock_prices
|
||||||
WHERE window_start BETWEEN {start_ts} AND {end_ts}
|
WHERE window_start BETWEEN {start_ts} AND {end_ts}
|
||||||
|
AND toDateTime(window_start/1000000000) <= now()
|
||||||
GROUP BY ticker
|
GROUP BY ticker
|
||||||
HAVING last_close BETWEEN {min_price} AND {max_price}
|
HAVING last_close BETWEEN {min_price} AND {max_price}
|
||||||
AND total_volume >= {min_volume}
|
AND total_volume >= {min_volume}
|
||||||
|
|||||||
@ -3,7 +3,7 @@ import pandas as pd
|
|||||||
import os
|
import os
|
||||||
from db.db_connection import create_client
|
from db.db_connection import create_client
|
||||||
from trading.position_calculator import PositionCalculator
|
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 screener.user_input import get_interval_choice, get_date_range
|
||||||
from indicators.three_atr_ema import ThreeATREMAIndicator
|
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
|
max(window_start) as last_update
|
||||||
FROM stock_db.stock_prices
|
FROM stock_db.stock_prices
|
||||||
WHERE window_start BETWEEN {start_ts} AND {end_ts}
|
WHERE window_start BETWEEN {start_ts} AND {end_ts}
|
||||||
|
AND toDateTime(window_start/1000000000) <= now()
|
||||||
GROUP BY ticker
|
GROUP BY ticker
|
||||||
HAVING last_close BETWEEN {min_price} AND {max_price}
|
HAVING last_close BETWEEN {min_price} AND {max_price}
|
||||||
AND total_volume >= {min_volume}
|
AND total_volume >= {min_volume}
|
||||||
|
|||||||
@ -6,7 +6,7 @@ from db.db_connection import create_client
|
|||||||
from indicators.sunny_bands import SunnyBands
|
from indicators.sunny_bands import SunnyBands
|
||||||
from trading.position_calculator import PositionCalculator
|
from trading.position_calculator import PositionCalculator
|
||||||
from screener.user_input import get_interval_choice, get_date_range
|
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
|
max(window_start) as last_update
|
||||||
FROM stock_db.stock_prices
|
FROM stock_db.stock_prices
|
||||||
WHERE window_start BETWEEN {start_ts} AND {end_ts}
|
WHERE window_start BETWEEN {start_ts} AND {end_ts}
|
||||||
|
AND toDateTime(window_start/1000000000) <= now()
|
||||||
GROUP BY ticker
|
GROUP BY ticker
|
||||||
HAVING last_close BETWEEN {min_price} AND {max_price}
|
HAVING last_close BETWEEN {min_price} AND {max_price}
|
||||||
AND total_volume >= {min_volume}
|
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)
|
bullish_signals.append(signal_data)
|
||||||
# Update print output format
|
# Update print output format
|
||||||
dollar_risk = position['potential_loss'] * -1
|
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
|
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"\n🟢 {ticker} @ ${current_price:.2f} on {signal_date.strftime('%Y-%m-%d %H:%M')}")
|
||||||
print(f" Size: {position['shares']} shares (${position['position_value']:.2f})")
|
print(f" Size: {position['shares']} shares (${position['position_value']:.2f})")
|
||||||
|
|||||||
@ -2,6 +2,21 @@ import pandas as pd
|
|||||||
from datetime import datetime, timedelta
|
from datetime import datetime, timedelta
|
||||||
from db.db_connection import create_client
|
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:
|
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
|
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
|
AND window_start BETWEEN
|
||||||
{int(start_date.timestamp() * 1e9)} AND
|
{int(start_date.timestamp() * 1e9)} AND
|
||||||
{int(end_date.timestamp() * 1e9)}
|
{int(end_date.timestamp() * 1e9)}
|
||||||
AND toYear(toDateTime(window_start/1000000000)) <= toYear(now())
|
AND toDateTime(window_start/1000000000) <= now()
|
||||||
AND toYear(toDateTime(window_start/1000000000)) >= (toYear(now()) - 1)
|
|
||||||
ORDER BY date ASC
|
ORDER BY date ASC
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user