From c280d40167bf5e97a436ee9e2711b9a9f11fb0b0 Mon Sep 17 00:00:00 2001 From: MuslemRahimi Date: Wed, 6 Nov 2024 23:26:53 +0100 Subject: [PATCH] update cron job --- app/cron_market_movers.py | 34 +++++++++++------- app/cron_reddit_bot.py | 75 ++++++++++++++++++++++++--------------- app/market_movers.py | 6 ++-- 3 files changed, 70 insertions(+), 45 deletions(-) diff --git a/app/cron_market_movers.py b/app/cron_market_movers.py index 38bf299..f3afe19 100755 --- a/app/cron_market_movers.py +++ b/app/cron_market_movers.py @@ -123,7 +123,7 @@ def add_rank(data): item['rank'] = index return data -async def get_gainer_loser_active_stocks(): +async def get_gainer_loser_active_stocks(symbols): #Database read 1y and 3y data query_fundamental_template = """ @@ -160,7 +160,6 @@ async def get_gainer_loser_active_stocks(): gainer_json, loser_json, active_json = await asyncio.gather(*tasks) - gainer_json = [{k: v for k, v in stock.items() if stock['symbol'] in symbols} for stock in gainer_json] gainer_json = [entry for entry in gainer_json if entry] @@ -222,17 +221,26 @@ async def get_gainer_loser_active_stocks(): entry['marketCap'] = None entry['volume'] = None + filtered_active_json = sorted(filtered_active_json, key=lambda x: (x['marketCap'] >= 10**9, x['volume']), reverse=True) - stocks = filtered_gainer_json[:20] + filtered_loser_json[:20] + filtered_active_json[:20] + # Get the original lengths + gainer_length = len(filtered_gainer_json) + loser_length = len(filtered_loser_json) + active_length = len(filtered_active_json) - #remove change key element + # Combine all lists + stocks = filtered_gainer_json + filtered_loser_json + filtered_active_json + + # Remove change key element stocks = [{k: v for k, v in stock.items() if k != "change"} for stock in stocks] - - day_gainer_json = stocks[:20] - day_loser_json = stocks[20:40] - day_active_json = stocks[40:60] + + # Slice based on the original lengths + day_gainer_json = stocks[:gainer_length] + day_loser_json = stocks[gainer_length:gainer_length + loser_length] + day_active_json = stocks[gainer_length + loser_length:] + query_market_movers = """ SELECT @@ -338,8 +346,8 @@ async def get_pre_after_market_movers(symbols): # Sort the list by changesPercentage in descending order and slice the top 10 - gainers = sorted(res_list, key=lambda x: x['changesPercentage'], reverse=True)[:20] - losers = sorted(res_list, key=lambda x: x['changesPercentage'], reverse=False)[:20] + gainers = sorted(res_list, key=lambda x: x['changesPercentage'], reverse=True)[:50] + losers = sorted(res_list, key=lambda x: x['changesPercentage'], reverse=False)[:50] for index, item in enumerate(gainers, start=1): item['rank'] = index # Add rank field @@ -380,14 +388,14 @@ try: con = sqlite3.connect('stocks.db') cursor = con.cursor() cursor.execute("PRAGMA journal_mode = wal") - cursor.execute("SELECT DISTINCT symbol FROM stocks WHERE (exchangeShortName = 'NYSE' OR exchangeShortName = 'NASDAQ' or exchangeShortName = 'AMEX')") + cursor.execute("SELECT DISTINCT symbol FROM stocks") symbols = [row[0] for row in cursor.fetchall()] #Filter out tickers - symbols = [symbol for symbol in symbols if symbol != "STEC"] + #symbols = [symbol for symbol in symbols if symbol != "STEC"] - data = asyncio.run(get_gainer_loser_active_stocks()) + data = asyncio.run(get_gainer_loser_active_stocks(symbols)) with open(f"json/market-movers/data.json", 'w') as file: ujson.dump(data, file) diff --git a/app/cron_reddit_bot.py b/app/cron_reddit_bot.py index 34fde40..d8ca4bd 100644 --- a/app/cron_reddit_bot.py +++ b/app/cron_reddit_bot.py @@ -175,29 +175,50 @@ def format_upcoming_dividends_data(dividends_data): return "".join(formatted_items) +import os +from datetime import datetime +import orjson +import praw +from dotenv import load_dotenv + def post_to_reddit(): # Load environment variables load_dotenv() - # Get current date + # Get current date with formatting today = datetime.now() month_str = today.strftime("%b") day = today.day - year = today.year # Added the year variable + year = today.year day_suffix = "th" if 11 <= day <= 13 else {1: "st", 2: "nd", 3: "rd"}.get(day % 10, "th") formatted_date = f"{month_str} {day}{day_suffix} {year}" - # Load and format data + # Load and parse data from JSON file with open("json/dashboard/data.json", "rb") as file: data = orjson.loads(file.read()) - #formatted_text = format_upcoming_earnings_data(data.get('upcomingEarnings', [])) - #title = f"Upcoming Earnings for {formatted_date}" - - #formatted_text = format_recent_earnings_data(data.get('recentEarnings', [])) - #title = f"Recent Earnings for {formatted_date}" - formatted_text = format_upcoming_dividends_data(data.get('recentDividends', [])) - title = f"Upcoming Dividend Announcements for {formatted_date}" + # Define the post configurations + post_configs = [ + { + "data_key": "upcomingEarnings", + "format_func": format_upcoming_earnings_data, + "title": f"Upcoming Earnings for {formatted_date}", + "flair_id": "b9f76638-772e-11ef-96c1-0afbf26bd890" + }, + { + "data_key": "recentEarnings", + "format_func": format_recent_earnings_data, + "title": f"Recent Earnings for {formatted_date}", + "flair_id": "b9f76638-772e-11ef-96c1-0afbf26bd890" + }, + { + "data_key": "recentDividends", + "format_func": format_upcoming_dividends_data, + "title": f"Upcoming Dividend Announcements for {formatted_date}", + "flair_id": "27d56764-9bc8-11ef-9264-322a4c2c1b46" + } + ] + try: # Initialize Reddit instance reddit = praw.Reddit( @@ -208,31 +229,27 @@ def post_to_reddit(): user_agent=os.getenv('REDDIT_USER_AGENT', 'script:my_bot:v1.0 (by /u/username)') ) - # Define the subreddit and post details + # Define the subreddit subreddit = reddit.subreddit("stocknear") - #for flair in subreddit.flair.link_templates: - # print(f"Flair ID: {flair['id']}, Flair Text: {flair['text']}") - - earnings_flair_id = 'b9f76638-772e-11ef-96c1-0afbf26bd890' - dividends_flair_id = '27d56764-9bc8-11ef-9264-322a4c2c1b46' - - # Submit the post with the formatted text - - post = subreddit.submit( - title=title, - selftext=formatted_text, - flair_id=dividends_flair_id - ) - print(f"Post created successfully with 'Earnings' flair: {post.url}") - + # Loop through post configurations to submit each post + for config in post_configs: + formatted_text = config["format_func"](data.get(config["data_key"], [])) + title = config["title"] + flair_id = config["flair_id"] + + # Submit the post + post = subreddit.submit( + title=title, + selftext=formatted_text, + flair_id=flair_id + ) + print(f"Post created successfully: {post.url}") except praw.exceptions.PRAWException as e: print(f"Error posting to Reddit: {str(e)}") - return None except Exception as e: print(f"Unexpected error: {str(e)}") - return None if __name__ == "__main__": - post_to_reddit() \ No newline at end of file + post_to_reddit() diff --git a/app/market_movers.py b/app/market_movers.py index a02dcf8..0f8c331 100644 --- a/app/market_movers.py +++ b/app/market_movers.py @@ -86,11 +86,11 @@ class Past_Market_Movers: performance_data.sort(key=lambda x: x[3], reverse=True) high_volume = sorted(performance_data, key=lambda x: x[4], reverse=True) - for symbol, name, price, changes_percentage, volume, market_cap in performance_data[:20]: + for symbol, name, price, changes_percentage, volume, market_cap in performance_data[:50]: gainer_data.append({'symbol': symbol, 'name': name, 'price': price, 'changesPercentage': changes_percentage, 'volume': volume, 'marketCap': market_cap}) - for symbol, name, price, changes_percentage, volume, market_cap in performance_data[-20:]: + for symbol, name, price, changes_percentage, volume, market_cap in performance_data[-50:]: loser_data.append({'symbol': symbol, 'name': name, 'price': price, 'changesPercentage': changes_percentage, 'volume': volume, 'marketCap': market_cap}) - for symbol, name, price, changes_percentage, volume, market_cap in high_volume[:20]: + for symbol, name, price, changes_percentage, volume, market_cap in high_volume[:50]: active_data.append({'symbol': symbol, 'name': name, 'price': price, 'changesPercentage': changes_percentage, 'volume': volume, 'marketCap': market_cap})