Розробка Telegram-бота для уведомлень про сділки
Трейдер не може 24/7 дивитися на екран. Telegram-бот для уведомлень вирішує це: миттєво сообщає про виконані ордери, досягнення price alert рівнів, зміни балансу та підозріла активність.
Типи уведомлень
Торговельні:
- Ордер повністю виконаний:
✅ BUY 0.1 BTC @ $42,150 — виконаний - Ордер частково виконаний:
⚡ SELL 0.05/0.1 ETH @ $2,205 — частково - Ордер скасований:
❌ Ордер #12345 скасований
Цінові алерти:
-
🔔 BTC/USDT досягнув $45,000 (ваш алерт)
Аккаунт:
- Виведення підтверджено:
💸 Виведення 500 USDT → 0x...a1b2 підтверджено - Новий вхід:
🔐 Новий вхід з IP 1.2.3.4 (Берлін)
Реалізація
from telegram import Bot
from telegram.ext import Application, CommandHandler, CallbackQueryHandler
class TradeNotificationBot:
def __init__(self, token: str):
self.bot = Bot(token)
self.app = Application.builder().token(token).build()
self._setup_handlers()
def _setup_handlers(self):
self.app.add_handler(CommandHandler('alerts', self.list_alerts))
self.app.add_handler(CommandHandler('addalert', self.add_price_alert))
self.app.add_handler(CallbackQueryHandler(self.handle_callback))
async def notify_fill(self, user_chat_id: int, trade: TradeEvent):
emoji = '✅' if trade.side == 'buy' else '🔴'
text = (
f"{emoji} Ордер виконаний\n"
f"Пара: {trade.pair}\n"
f"Сторона: {'Покупка' if trade.side == 'buy' else 'Продаж'}\n"
f"Обсяг: {trade.quantity} {trade.base_currency}\n"
f"Ціна: ${trade.price:,.2f}\n"
f"Сума: ${trade.total:,.2f}\n"
f"Час: {trade.timestamp.strftime('%H:%M:%S UTC')}"
)
await self.bot.send_message(chat_id=user_chat_id, text=text)
async def notify_price_alert(self, user_chat_id: int, alert: PriceAlert):
direction = '📈' if alert.direction == 'above' else '📉'
await self.bot.send_message(
chat_id=user_chat_id,
text=f"{direction} {alert.pair} досигнув {alert.price}\n"
f"Поточна ціна: {alert.current_price}"
)
Інтеграція з біржевим бэкендом
Уведомлення відправляються через event-driven систему. При кожному fill matching engine публікує подія в Redis Pub/Sub, notification worker підписується та відправляє в Telegram:
import redis.asyncio as aioredis
async def notification_worker():
r = aioredis.from_url('redis://localhost')
pubsub = r.pubsub()
await pubsub.subscribe('trade.fills', 'price.alerts', 'account.events')
async for message in pubsub.listen():
if message['type'] != 'message':
continue
event = json.loads(message['data'])
chat_id = await get_user_chat_id(event['user_id'])
if not chat_id:
continue # користувач не прив'язав Telegram
match event['type']:
case 'fill':
await notification_bot.notify_fill(chat_id, TradeEvent(**event))
case 'price_alert':
await notification_bot.notify_price_alert(chat_id, PriceAlert(**event))
Прив'язка Telegram аккаунту
Користувач прив'язує Telegram через унікальний токен в налаштуваннях біржі:
- Біржа генерує одноразовий токен:
LINK-a1b2c3d4 - Користувач відправляє
/link LINK-a1b2c3d4боту - Бот зберігає
(user_id, chat_id)зв'язок - Уведомлення йдуть на цей chat_id
Розробка Telegram-бота для уведомлень з прив'язкою аккаунту та price alerts: 1–2 тижні.







