Dmitry Beresnev
commited on
Commit
Β·
014e90f
1
Parent(s):
36e6d76
fix detailed report for the insider trades
Browse files
src/api/insiders/insider_trading_aggregator.py
CHANGED
|
@@ -720,6 +720,7 @@ class InsiderTradingAggregator:
|
|
| 720 |
trades=trades
|
| 721 |
)
|
| 722 |
|
|
|
|
| 723 |
def format_telegram_message(self, report: TradingReport) -> str:
|
| 724 |
"""Generate formatted Telegram message from trading report"""
|
| 725 |
if not report:
|
|
@@ -778,6 +779,57 @@ class InsiderTradingAggregator:
|
|
| 778 |
message += f"\nπ **Sources:** {', '.join(sources)}\n"
|
| 779 |
message += f"β° Generated: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}"
|
| 780 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 781 |
return message
|
| 782 |
|
| 783 |
# BUG FIX: This method was combined with the one below it, causing a SyntaxError.
|
|
|
|
| 720 |
trades=trades
|
| 721 |
)
|
| 722 |
|
| 723 |
+
'''
|
| 724 |
def format_telegram_message(self, report: TradingReport) -> str:
|
| 725 |
"""Generate formatted Telegram message from trading report"""
|
| 726 |
if not report:
|
|
|
|
| 779 |
message += f"\nπ **Sources:** {', '.join(sources)}\n"
|
| 780 |
message += f"β° Generated: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}"
|
| 781 |
|
| 782 |
+
return message
|
| 783 |
+
'''
|
| 784 |
+
|
| 785 |
+
def format_telegram_message(self, report: TradingReport) -> str:
|
| 786 |
+
"""Generate formatted Telegram message from trading report"""
|
| 787 |
+
if not report:
|
| 788 |
+
return "β No insider trading data found for the specified period."
|
| 789 |
+
|
| 790 |
+
trend_emoji = "π" if report.net_value > 0 else "π" if report.net_value < 0 else "β‘οΈ"
|
| 791 |
+
|
| 792 |
+
message = f"π *INSIDER TRADING REPORT* π\n\n"
|
| 793 |
+
message += f"π’ *Company:* {report.company_name} (${report.symbol})\n"
|
| 794 |
+
message += f"π
*Period:* {report.period_start.strftime('%Y-%m-%d')} to {report.period_end.strftime('%Y-%m-%d')}\n\n"
|
| 795 |
+
|
| 796 |
+
message += "π *SUMMARY*\n"
|
| 797 |
+
message += f"β’ Total Trades: {report.total_trades}\n"
|
| 798 |
+
message += f"β’ Buy Trades: {report.buy_trades} π’\n"
|
| 799 |
+
message += f"β’ Sell Trades: {report.sell_trades} π΄\n\n"
|
| 800 |
+
|
| 801 |
+
message += "π° *FINANCIAL IMPACT*\n"
|
| 802 |
+
message += f"β’ Total Bought: ${report.total_value_bought:,.2f}\n"
|
| 803 |
+
message += f"β’ Total Sold: ${report.total_value_sold:,.2f}\n"
|
| 804 |
+
message += f"β’ Net Position: {trend_emoji} ${report.net_value:,.2f}\n\n"
|
| 805 |
+
|
| 806 |
+
message += "π₯ *TOP INSIDERS BY ACTIVITY*\n"
|
| 807 |
+
for i, (name, count, value) in enumerate(report.top_insiders, 1):
|
| 808 |
+
display_name = (name[:35] + '...') if len(name) > 38 else name
|
| 809 |
+
message += f"`{i}.` {display_name}\n"
|
| 810 |
+
message += f" β Trades: {count} | Value: ${value:,.0f}\n"
|
| 811 |
+
|
| 812 |
+
if report.trades:
|
| 813 |
+
message += "\nπ *RECENT SIGNIFICANT TRADES*\n"
|
| 814 |
+
top_trades = sorted(report.trades, key=lambda x: abs(x.value), reverse=True)[:5]
|
| 815 |
+
|
| 816 |
+
for trade in top_trades:
|
| 817 |
+
insider_name = (trade.insider_name[:30] + '...') if len(trade.insider_name) > 33 else trade.insider_name
|
| 818 |
+
trans_type = "BUY" if "buy" in trade.transaction_type.lower() or "a" == trade.transaction_type.lower() else "SELL"
|
| 819 |
+
emoji = 'π’' if trans_type == 'BUY' else 'π΄'
|
| 820 |
+
|
| 821 |
+
date_str = trade.transaction_date_dt.strftime(
|
| 822 |
+
'%Y-%m-%d') if trade.transaction_date_dt else trade.transaction_date[:10]
|
| 823 |
+
|
| 824 |
+
message += f"\n{emoji} *{trans_type}* | {insider_name}\n"
|
| 825 |
+
message += f"`Date: {date_str}`\n"
|
| 826 |
+
message += f"`Shares: {trade.shares:,d}`\n"
|
| 827 |
+
message += f"`Value: ${abs(trade.value):,.0f}`\n"
|
| 828 |
+
|
| 829 |
+
sources = sorted(list(set(t.source for t in report.trades)))
|
| 830 |
+
message += f"\nπ *Sources:* {', '.join(sources)}\n"
|
| 831 |
+
message += f"β° Generated: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}"
|
| 832 |
+
|
| 833 |
return message
|
| 834 |
|
| 835 |
# BUG FIX: This method was combined with the one below it, causing a SyntaxError.
|