diff --git a/docker-compose.yml b/docker-compose.yml index 06e7ef2..b863f3f 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -5,6 +5,8 @@ services: restart: unless-stopped volumes: - ./data:/app/data + env_file: + - .env environment: - PYTHONUNBUFFERED=1 healthcheck: diff --git a/src/live/paper_trader.py b/src/live/paper_trader.py index 85144cd..650db13 100644 --- a/src/live/paper_trader.py +++ b/src/live/paper_trader.py @@ -10,6 +10,7 @@ import pandas as pd from src.live.cerbero_client import CerberoClient from src.live.signal_engine import SignalEngine +from src.live.telegram_notifier import notify_event LOG_DIR = Path(__file__).resolve().parents[2] / "data" / "paper_trades" INSTRUMENT = "ETH_USDC-PERPETUAL" @@ -52,6 +53,7 @@ class PaperTrader: with open(self.log_path, "a") as f: f.write(json.dumps(entry) + "\n") print(f" [{entry['timestamp'][:19]}] {event}: {json.dumps(data or {})}") + notify_event(event, data) def save_status(self): status = { diff --git a/src/live/telegram_notifier.py b/src/live/telegram_notifier.py new file mode 100644 index 0000000..93a8bb2 --- /dev/null +++ b/src/live/telegram_notifier.py @@ -0,0 +1,39 @@ +"""Notifiche Telegram per il paper trader.""" +from __future__ import annotations + +import os +import urllib.request +import urllib.parse +import json + +BOT_TOKEN = os.environ.get("TELEGRAM_BOT_TOKEN", "") +CHAT_ID = os.environ.get("TELEGRAM_CHAT_ID", "") + +NOTIFY_EVENTS = { + "SIGNAL", "OPENED", "CLOSED", "OPEN_FAILED", "CLOSE_FAILED", + "ERROR", "STARTUP", "SHUTDOWN", "TRAINING_FAILED", +} + + +def send_telegram(text: str) -> bool: + if not BOT_TOKEN or not CHAT_ID: + return False + try: + url = f"https://api.telegram.org/bot{BOT_TOKEN}/sendMessage" + data = urllib.parse.urlencode({"chat_id": CHAT_ID, "text": text, "parse_mode": "HTML"}).encode() + urllib.request.urlopen(url, data, timeout=10) + return True + except Exception: + return False + + +def notify_event(event: str, data: dict | None = None): + if event not in NOTIFY_EVENTS: + return + lines = [f"📊 {event}"] + if data: + for k, v in data.items(): + if k in ("signal",): + continue + lines.append(f" {k}: {v}") + send_telegram("\n".join(lines))