From 1e9c0c8c1928c421800b14e5c028134d250b5411 Mon Sep 17 00:00:00 2001 From: MuslemRahimi Date: Wed, 6 Nov 2024 00:09:17 +0100 Subject: [PATCH] update cron job --- app/cron_insider_tracker.py | 11 +++++--- app/cron_reddit_bot.py | 54 ++++++++++++++++++++++++++++++++----- 2 files changed, 55 insertions(+), 10 deletions(-) diff --git a/app/cron_insider_tracker.py b/app/cron_insider_tracker.py index 8424a24..cf86d3b 100644 --- a/app/cron_insider_tracker.py +++ b/app/cron_insider_tracker.py @@ -71,6 +71,9 @@ def aggregate_transactions(transactions, min_value=100_000): # Calculate average value avg_value = sum(t['value'] for t in group_list) / len(group_list) + # Calculate the total number of shares in the group + total_shares = sum(t['shares'] for t in group_list) + # Only include transactions with average value >= min_value if avg_value >= min_value: # Find latest filing date @@ -79,19 +82,21 @@ def aggregate_transactions(transactions, min_value=100_000): for t in group_list ).strftime('%Y-%m-%d %H:%M:%S') - # Create aggregated transaction with formatted name + # Create aggregated transaction with formatted name and total shares result.append({ 'reportingName': format_name(key[0]), 'symbol': key[1], 'transactionType': key[2], 'filingDate': latest_date, - 'avgValue': avg_value + 'avgValue': avg_value, + 'totalShares': total_shares # Added total shares here }) # Sort the final result by filingDate return sorted(result, key=lambda x: x['filingDate'], reverse=True) + async def get_data(session, symbols): res_list = [] for page in range(0, 20): # Adjust the number of pages as needed @@ -107,6 +112,7 @@ async def get_data(session, symbols): "reportingName": item.get("reportingName"), "symbol": item.get("symbol"), "filingDate": item.get("filingDate"), + "shares": item.get("securitiesTransacted"), "value": round(item.get("securitiesTransacted") * item.get("price"),2), "transactionType": "Buy" if item.get("acquistionOrDisposition") == "A" else "Sell" if item.get("acquistionOrDisposition") == "D" @@ -124,7 +130,6 @@ async def get_data(session, symbols): break res_list = aggregate_transactions(res_list) - new_data = [] for item in res_list: diff --git a/app/cron_reddit_bot.py b/app/cron_reddit_bot.py index 574bc58..34fde40 100644 --- a/app/cron_reddit_bot.py +++ b/app/cron_reddit_bot.py @@ -141,6 +141,40 @@ def format_recent_earnings_data(earnings_data): return "".join(formatted_items) +def format_upcoming_dividends_data(dividends_data): + """Format dividends data into Reddit-friendly markdown with nested bullet points.""" + formatted_items = [] + + for item in dividends_data: + symbol = item.get('symbol', None) + if symbol is not None: + name = item.get('name', 'Unknown') + dividend = item.get('dividend', 0) + dividend_prior = item.get('dividendPrior', 1) + dividend_yoy = calculate_yoy_change(dividend, dividend_prior) + dividend_yield = item.get('dividendYield', 0) + ex_dividend_date = item.get('exDividendDate') + payable_date = item.get('payableDate') + record_date = item.get('recordDate') + + # Create hyperlink for symbol + symbol_link = f"[{symbol}](https://stocknear.com/stocks/{symbol})" + + # Format the entry text with nested bullet points + entry = ( + f"**{name}** ({symbol_link}) has announced its upcoming dividend details:\n\n" + f"* **Dividend:** ${dividend:.2f} per share " + f"({dividend_yoy:+.2f}% YoY)\n" + f"* **Dividend Yield:** {dividend_yield:.2f}%\n" + f"* **Ex-Dividend Date:** {datetime.fromisoformat(ex_dividend_date).strftime('%b %d, %Y')}\n" + f"* **Payable Date:** {datetime.fromisoformat(payable_date).strftime('%b %d, %Y')}\n" + f"* **Record Date:** {datetime.fromisoformat(record_date).strftime('%b %d, %Y')}\n\n" + ) + formatted_items.append(entry) + + return "".join(formatted_items) + + def post_to_reddit(): # Load environment variables load_dotenv() @@ -158,11 +192,12 @@ def post_to_reddit(): data = orjson.loads(file.read()) #formatted_text = format_upcoming_earnings_data(data.get('upcomingEarnings', [])) - #title = f"Upcoming Earnings for today, {formatted_date}" - - formatted_text = format_recent_earnings_data(data.get('recentEarnings', [])) - title = f"Recent Earnings for today, {formatted_date}" + #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}" try: # Initialize Reddit instance reddit = praw.Reddit( @@ -175,18 +210,23 @@ def post_to_reddit(): # Define the subreddit and post details 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=earnings_flair_id + flair_id=dividends_flair_id ) print(f"Post created successfully with 'Earnings' flair: {post.url}") - - + + except praw.exceptions.PRAWException as e: print(f"Error posting to Reddit: {str(e)}") return None