feat: add Telegram notifications and configurable stop loss
- notify.py: buy/sell/error alerts via upbit_trading_jm_bot - STOP_LOSS_PCT: trailing stop configurable via .env (default -5%) - notify_buy/notify_sell called on every trade execution Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
51
core/notify.py
Normal file
51
core/notify.py
Normal file
@@ -0,0 +1,51 @@
|
||||
"""Telegram 매매 알림."""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import logging
|
||||
import os
|
||||
|
||||
import requests
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
_TOKEN = os.getenv("TELEGRAM_TRADE_TOKEN", "")
|
||||
_CHAT_ID = os.getenv("TELEGRAM_CHAT_ID", "")
|
||||
_API = "https://api.telegram.org/bot{token}/sendMessage"
|
||||
|
||||
|
||||
def _send(text: str) -> None:
|
||||
if not _TOKEN or not _CHAT_ID:
|
||||
logger.warning("Telegram 설정 없음, 알림 스킵")
|
||||
return
|
||||
try:
|
||||
requests.post(
|
||||
_API.format(token=_TOKEN),
|
||||
json={"chat_id": _CHAT_ID, "text": text, "parse_mode": "HTML"},
|
||||
timeout=5,
|
||||
)
|
||||
except Exception as e:
|
||||
logger.error(f"Telegram 알림 실패: {e}")
|
||||
|
||||
|
||||
def notify_buy(ticker: str, price: float, amount: float, invested_krw: int) -> None:
|
||||
_send(
|
||||
f"📈 <b>[매수]</b> {ticker}\n"
|
||||
f"가격: {price:,.0f}원\n"
|
||||
f"수량: {amount}\n"
|
||||
f"투자금: {invested_krw:,}원"
|
||||
)
|
||||
|
||||
|
||||
def notify_sell(ticker: str, price: float, pnl_pct: float, reason: str) -> None:
|
||||
emoji = "✅" if pnl_pct >= 0 else "🔴"
|
||||
_send(
|
||||
f"{emoji} <b>[매도]</b> {ticker}\n"
|
||||
f"가격: {price:,.0f}원\n"
|
||||
f"수익률: {pnl_pct:+.1f}%\n"
|
||||
f"사유: {reason}"
|
||||
)
|
||||
|
||||
|
||||
def notify_error(message: str) -> None:
|
||||
_send(f"⚠️ <b>[오류]</b>\n{message}")
|
||||
Reference in New Issue
Block a user