diff --git a/src/screener/t_atr_ema.py b/src/screener/t_atr_ema.py index 47a3192..6b1919e 100644 --- a/src/screener/t_atr_ema.py +++ b/src/screener/t_atr_ema.py @@ -91,7 +91,7 @@ def run_atr_ema_scanner(min_price: float, max_price: float, min_volume: int, por bullish_signals = [] - for ticker, current_price, current_volume, last_update in qualified_stocks: + for ticker, current_price, current_volume, last_update, stock_type in qualified_stocks: try: # Get historical data based on interval df = get_stock_data(ticker, start_date, end_date, interval) @@ -110,6 +110,7 @@ def run_atr_ema_scanner(min_price: float, max_price: float, min_volume: int, por 'target_price': signal_data['ema'], 'volume': current_volume, 'signal_date': signal_date, + 'stock_type': stock_type, # Add stock type 'last_update': datetime.fromtimestamp(last_update/1000000000) } diff --git a/src/utils/data_utils.py b/src/utils/data_utils.py index 3b7a49e..148db30 100644 --- a/src/utils/data_utils.py +++ b/src/utils/data_utils.py @@ -28,7 +28,7 @@ def print_signal(signal_data: dict, signal_type: str = "🔍") -> None: signal_type (str): Emoji indicator for signal type (default: 🔍) """ try: - print(f"\n{signal_type} {signal_data['ticker']} @ ${signal_data['entry_price']:.2f} on {signal_data['signal_date'].strftime('%Y-%m-%d %H:%M')}") + print(f"\n{signal_type} {signal_data['ticker']} ({signal_data['stock_type']}) @ ${signal_data['entry_price']:.2f} on {signal_data['signal_date'].strftime('%Y-%m-%d %H:%M')}") print(f" Size: {signal_data['shares']} shares (${signal_data['position_size']:.2f})") print(f" Stop: ${signal_data['stop_loss']:.2f} (7%) | Target: ${signal_data['target_price']:.2f}") print(f" Risk/Reward: 1:{signal_data['risk_reward_ratio']:.1f} | Risk: ${abs(signal_data['risk_amount']):.2f}") @@ -50,7 +50,7 @@ def get_qualified_stocks(start_date: datetime, end_date: datetime, min_price: fl min_volume (int): Minimum trading volume Returns: - list: List of tuples (ticker, price, volume, last_update) + list: List of tuples (ticker, price, volume, last_update, type) """ try: start_ts = int(start_date.timestamp() * 1000000000) @@ -60,12 +60,14 @@ def get_qualified_stocks(start_date: datetime, end_date: datetime, min_price: fl query = f""" WITH filtered_data AS ( SELECT - ticker, - window_start, - close, - volume, - toDateTime(toDateTime(window_start/1000000000)) as trade_date - FROM stock_db.stock_prices + sp.ticker, + sp.window_start, + sp.close, + sp.volume, + t.type as stock_type, + toDateTime(toDateTime(sp.window_start/1000000000)) as trade_date + FROM stock_db.stock_prices sp + JOIN stock_db.stock_tickers t ON sp.ticker = t.ticker WHERE window_start BETWEEN {start_ts} AND {end_ts} AND toDateTime(window_start/1000000000) <= now() AND close BETWEEN {min_price} AND {max_price} @@ -74,15 +76,17 @@ def get_qualified_stocks(start_date: datetime, end_date: datetime, min_price: fl daily_data AS ( SELECT ticker, + stock_type, toDate(trade_date) as date, argMax(close, window_start) as daily_close, sum(volume) as daily_volume FROM filtered_data - GROUP BY ticker, toDate(trade_date) + GROUP BY ticker, stock_type, toDate(trade_date) ), latest_data AS ( SELECT ticker, + any(stock_type) as stock_type, argMax(daily_close, date) as last_close, sum(daily_volume) as total_volume, max(toUnixTimestamp(date)) as last_update @@ -94,13 +98,14 @@ def get_qualified_stocks(start_date: datetime, end_date: datetime, min_price: fl ticker, last_close, total_volume, - last_update + last_update, + stock_type FROM latest_data ORDER BY ticker """ result = client.query(query) - qualified_stocks = [(row[0], row[1], row[2], row[3]) for row in result.result_rows] + qualified_stocks = [(row[0], row[1], row[2], row[3], row[4]) for row in result.result_rows] return qualified_stocks