Реалізація push-сповіщень про сделки торгового бота
Торговий бот закрив позицію ночами — користувач побачив сповіщення вранці. За це час ціна пішла на 8%, і момент для реакції вже упущений. Push-сповіщення для торгового бота — це не "приємна фіча", а частина робочого процесу трейдера.
Що здесь ломается чаще всього
Типічна проблема: бот працює на сервері, надсилає сповіщення через FCM, але на Android з включеною оптимізацією батареї сповіщення приходить з опозданням 10–20 хвилин. Причина — Doze Mode відкладає мережеві операції, FCM за замовчуванням використовує "normal priority". Для фінансових сповіщень потрібен явний "priority": "high" в FCM payload, тоді повідомлення доставляється через high-priority канал та буджить пристрій.
На 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 Priority | 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 днів при наявності серверної частини бота.







