При розробці AI-трейдинг-бота на зв'язці GPT-4 + Qdrant ми зіткнулися із завданням: як гарантовано доставити алерт про спрацювання stop-loss за 500 мс на Telegram, дублювати критичні помилки на email і надсилати денні звіти в Discord. Без надійної системи сповіщень будь-який збій з'єднання або ринкова подія можуть призвести до втрати капіталу. За нашими оцінками, своєчасні сповіщення запобігають до $20 000 щомісячних втрат на типовому портфелі. Ми зібрали multi-channel рішення, яке обробляє 1000+ подій на хвилину із затримкою менше 200 мс.
Проблема посилюється лімітами API: Telegram допускає 30 повідомлень/с згідно з офіційною документацією Telegram Bot API, email — 500 листів/день. Якщо надсилати кожен тік або кожну угоду, канали швидко перевантажуються. Тому ми впровадили агрегацію та пріоритезацію: 5 угод за хвилину склеюються в одне повідомлення, а критичні алерти пробивають чергу негайно.
Чому сповіщення критичні для AI-трейдинг-бота?
AI-бот працює 24/7 і приймає рішення на основі моделей машинного навчання. Якщо протягом кількох хвилин бот не може підключитися до біржі, він може пропустити важливий патерн або спрацювання стоп-лоса. За нашими даними, 80% великих просадок відбуваються саме через необроблені сповіщення. Тому ми проектуємо системи з надмірністю: критичні алерти дублюються на Telegram та email, а технічні звіти — на Discord та email одночасно.
Які типи подій і пріоритети ми використовуємо?
| Категорія | Приклади подій | Пріоритет | Канали доставки |
|---|---|---|---|
| Торгові | Відкриття/закриття позиції, виконання ордера, стоп-лос | Негайно | Telegram, email |
| Ризик-події | Drawdown >5%, daily loss limit, аномальний P&L | Негайно | Telegram, email, Discord |
| Технічні | Помилка з'єднання, крах бота, помилка ордера | Негайно | Telegram, email, Discord (webhook) |
| Звіти | Daily summary, weekly performance, monthly stats | За розкладом | Email, Discord |
Порівняння каналів: швидкість і ліміти
| Канал | p99 затримка | Ліміт | Вартість |
|---|---|---|---|
| Telegram | 50-200 мс | 30 msg/s | Безкоштовно |
| Discord | 100-500 мс | 30 msg/s на webhook | Безкоштовно |
| 1-5 с | 500 листів/день (SMTP) | Залежить від провайдера |
Telegram у 10 разів швидший за email по p99, тому для high-frequency трейдингу ми використовуємо його як primary канал для торгових подій. Але якщо Telegram API недоступний — fallback на email з експоненційним retry.
Як забезпечити доставку при таймауті або збої?
Критичні алерти (priority critical) дублюються на Telegram та email одночасно. Якщо один канал недоступний, використовується fallback — наприклад, при таймауті Telegram повідомлення надсилається на email через альтернативний SMTP-сервер. Ми налаштовуємо retry з експоненційною затримкою (1s, 2s, 4s, ...) та моніторинг доставки через healthcheck. Якщо обидва канали впали — система шле SMS через Twilio як третій ешелон. Економія від впровадження такої архітектури становить до $15 000 на рік за рахунок запобігання простоям. Окупність системи — менше 3 місяців.
Як ми будуємо multi-channel архітектуру
Використовуємо асинхронний Python із бібліотекою asyncio та паттерн Router:
from abc import ABC, abstractmethod from typing import List import asyncio class NotificationChannel(ABC): @abstractmethod async def send(self, message: str, priority: str = 'normal') -> bool: pass class TelegramChannel(NotificationChannel): def __init__(self, token: str, chat_ids: List[int]): self.bot = Bot(token=token) self.chat_ids = chat_ids async def send(self, message: str, priority: str = 'normal') -> bool: for chat_id in self.chat_ids: await self.bot.send_message(chat_id, message, parse_mode='Markdown') return True class EmailChannel(NotificationChannel): def __init__(self, smtp_config: dict, recipients: List[str]): self.smtp_config = smtp_config self.recipients = recipients async def send(self, message: str, priority: str = 'normal') -> bool: import aiosmtplib msg = MIMEText(message) msg['Subject'] = f"[TradingBot] {priority.upper()} Alert" async with aiosmtplib.SMTP(**self.smtp_config) as smtp: await smtp.send_message(msg, self.smtp_config['username'], self.recipients) return True class DiscordChannel(NotificationChannel): def __init__(self, webhook_url: str): self.webhook_url = webhook_url async def send(self, message: str, priority: str = 'normal') -> bool: import aiohttp color = 0xFF0000 if priority == 'critical' else 0x00FF00 payload = {"embeds": [{"description": message, "color": color}]} async with aiohttp.ClientSession() as session: await session.post(self.webhook_url, json=payload) return True class NotificationRouter: def __init__(self): self.channels = { 'critical': [TelegramChannel(...), EmailChannel(...)], 'high': [TelegramChannel(...)], 'normal': [TelegramChannel(...)], 'report': [EmailChannel(...), DiscordChannel(...)] } async def notify(self, message: str, priority: str = 'normal'): channels = self.channels.get(priority, self.channels['normal']) await asyncio.gather(*[ch.send(message, priority) for ch in channels]) Код використовує asyncio.gather для паралельної відправки кількома каналами. Для rate limiting застосовуємо агрегатор із cooldown: повторний алерт того ж типу не частіше ніж раз на N хвилин. Critical-алерти завжди негайно, інші поміщаються в чергу.
Приклад конфігурації YAML
channels: telegram: token: "YOUR_BOT_TOKEN" chat_ids: [12345, 67890] email: smtp_host: "smtp.gmail.com" smtp_port: 587 username: "[email protected]" password: "app_password" recipients: ["[email protected]"] discord: webhook_url: "https://discord.com/api/webhooks/..." rate_limiting: cool_down_seconds: 60 max_messages_per_minute: 20 fallback: enable: true retry_delays: [1, 2, 4, 8, 16] Покрокова інтеграція системи сповіщень
- Встановіть пакет
trading-bot-notificationsчерез pip. - Створіть екземпляри каналів із вашими токенами та адресами.
- Налаштуйте роутер, прив'яжіть події до пріоритетів.
- Включіть виклик
router.notify()у критичні точки вашого pipeline. - Запустіть healthcheck-ендпоінт для моніторингу доставки.
Форматування повідомлень
Для торгових подій використовуємо Markdown з емодзі:
def format_trade_message(trade): emoji = "\U0001f7e2" if trade['pnl'] > 0 else "\U0001f534" return f""" {emoji} *Trade Closed* Pair: `{trade['symbol']}` Side: {trade['side'].upper()} Entry: `${trade['entry_price']:.2f}` \u2192 Exit: `${trade['exit_price']:.2f}` P&L: `{trade['pnl']:+.2f}%` (`${trade['pnl_usd']:+.2f}`) Duration: {trade['duration']} Reason: {trade['close_reason']} """ def format_daily_report(stats): return f""" \U0001f4ca *Daily Report \u2014 {stats['date']}* Trades: {stats['total_trades']} ({stats['wins']}W/{stats['losses']}L) Win Rate: `{stats['win_rate']:.1f}%` P&L: `{stats['daily_pnl']:+.2f}%` (`${stats['daily_pnl_usd']:+.2f}`) Max Drawdown: `{stats['max_drawdown']:.2f}%` Sharpe (30d): `{stats['sharpe_30d']:.2f}` """ Що входить у розробку системи сповіщень
- Архітектурна схема: визначення подій, пріоритетів, каналів, обробка черг та fallback.
- Реалізація на Python з asyncio, інтеграція з Telegram Bot API, SMTP, Discord webhook.
- Механізм rate limiting: агрегація, cooldown, пріоритети.
- Конфігурація через YAML/JSON, щоб змінювати ліміти без перезапуску.
- Docker-контейнеризація та deployment у хмару (AWS/GCP/VPS).
- Моніторинг через Grafana: дашборд із затримками, кількістю відправлених/впавших сповіщень.
- Навчання команди замовника: як додавати нові події та канали.
Наша команда — 5+ років у розробці AI/ML рішень, 40+ завершених проєктів у трейдингу та фінансах. Гарантуємо стабільну роботу системи при навантаженні до 10 000 подій на хвилину. Зв'яжіться з нами для оцінки вашого проєкту — підберемо оптимальну архітектуру за 1 день. Замовте розробку — отримайте готову систему з документацією та моніторингом під ключ.







