feat: notifiche Telegram dal paper trader via bot
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -5,6 +5,8 @@ services:
|
|||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
volumes:
|
volumes:
|
||||||
- ./data:/app/data
|
- ./data:/app/data
|
||||||
|
env_file:
|
||||||
|
- .env
|
||||||
environment:
|
environment:
|
||||||
- PYTHONUNBUFFERED=1
|
- PYTHONUNBUFFERED=1
|
||||||
healthcheck:
|
healthcheck:
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ import pandas as pd
|
|||||||
|
|
||||||
from src.live.cerbero_client import CerberoClient
|
from src.live.cerbero_client import CerberoClient
|
||||||
from src.live.signal_engine import SignalEngine
|
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"
|
LOG_DIR = Path(__file__).resolve().parents[2] / "data" / "paper_trades"
|
||||||
INSTRUMENT = "ETH_USDC-PERPETUAL"
|
INSTRUMENT = "ETH_USDC-PERPETUAL"
|
||||||
@@ -52,6 +53,7 @@ class PaperTrader:
|
|||||||
with open(self.log_path, "a") as f:
|
with open(self.log_path, "a") as f:
|
||||||
f.write(json.dumps(entry) + "\n")
|
f.write(json.dumps(entry) + "\n")
|
||||||
print(f" [{entry['timestamp'][:19]}] {event}: {json.dumps(data or {})}")
|
print(f" [{entry['timestamp'][:19]}] {event}: {json.dumps(data or {})}")
|
||||||
|
notify_event(event, data)
|
||||||
|
|
||||||
def save_status(self):
|
def save_status(self):
|
||||||
status = {
|
status = {
|
||||||
|
|||||||
@@ -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"📊 <b>{event}</b>"]
|
||||||
|
if data:
|
||||||
|
for k, v in data.items():
|
||||||
|
if k in ("signal",):
|
||||||
|
continue
|
||||||
|
lines.append(f" {k}: {v}")
|
||||||
|
send_telegram("\n".join(lines))
|
||||||
Reference in New Issue
Block a user