Реализация push-уведомлений о сделках торгового бота
Торговый бот закрыл позицию ночью — пользователь увидел уведомление утром. За это время цена ушла на 8%, и момент для реакции уже упущен. Push-уведомления для торгового бота — это не «приятная фича», а часть рабочего процесса трейдера.
Что здесь ломается чаще всего
Типичная проблема: бот работает на сервере, отправляет уведомление через FCM, но на Android с включённым battery optimization уведомление приходит с опозданием 10–20 минут. Причина — Doze Mode откладывает сетевые операции, FCM использует «normal priority» по умолчанию. Для финансовых уведомлений нужен явный "priority": "high" в FCM payload, тогда сообщение доставляется через high-priority channel и будит устройство.
На iOS похожая история с Background App Refresh — если пользователь отключил его для приложения, бэкграунд-fetch не сработает. Единственный надёжный способ — APNs push с content-available: 1 или interruption-level: time-sensitive.
Архитектура уведомлений для бота
Бот генерирует событие (открытие/закрытие сделки, срабатывание стоп-лосса, достижение тейк-профита) → серверный обработчик формирует payload → Firebase Admin SDK отправляет в FCM/APNs.
Минимальный payload для сделки:
{
"notification": {
"title": "BTC/USDT ✅ Закрыто +2.3%",
"body": "Buy 0.05 BTC @ 67,420 → Sell @ 68,980"
},
"android": { "priority": "high" },
"apns": {
"headers": { "apns-priority": "10" },
"payload": { "aps": { "interruption-level": "time-sensitive" } }
},
"data": { "trade_id": "t_9182", "symbol": "BTCUSDT", "pnl": "2.31" }
}
data поле используется для deep link — тап открывает экран конкретной сделки с деталями.
Типы уведомлений и их приоритет
| Событие | Приоритет FCM | APNs interruption-level |
|---|---|---|
| Стоп-лосс сработал | high | time-sensitive |
| Тейк-профит | high | time-sensitive |
| Открытие позиции | high | active |
| Дневной отчёт | normal | passive |
| Ошибка подключения к бирже | high | time-sensitive |
Разделение важно: пользователь может разрешить «критические» уведомления даже в режиме «Не беспокоить» — это работает через iOS Focus Filters и Android notification channels с IMPORTANCE_HIGH.
Клиентская часть
На Flutter реализуем через firebase_messaging пакет. Главное — правильно обработать три состояния: foreground, background, terminated. В terminated state уведомление обрабатывается через FirebaseMessaging.instance.getInitialMessage() при следующем старте приложения.
На React Native — @react-native-firebase/messaging, логика та же.
Запрос разрешений делаем не при старте, а при первом действии, связанном с ботом — конверсия в разрешение значительно выше, чем при cold start.
Сроки интеграции в готовое приложение: 3–7 дней при наличии серверной части бота.







