Налаштування торгового бота в мобільному застосунку
Торговий бот працює на сервері, мобільний застосунок — його панель управління. Користувач приходить не програмувати бота, а налаштовувати: виставити тейк-профіт, стоп-лос, розмір позиції, обрати пари. Помилка в одному полі (наприклад, плече 100x замість 10x) може призвести до непередбачених ордерів. Інтерфейс має бути передбачуваним — невірні значення не повинні йти на сервер. Ми розробляємо такі екрани під ключ з 7+ років досвіду у фінансових мобільних застосунках (понад 50 проєктів). Гарантуємо відповідність App Store Review Guidelines і політикам Google Play.
Як правильно валідувати числові параметри?
Параметри торгового бота поділяються на кілька груп. Числові з обмеженнями: тейк-профіт у відсотках (0.1–50%), розмір ордера в USDT (мінімум диктує біржа), плече для ф'ючерсів (1x–125x). Для таких параметрів використовуємо TextField з валідацією на льоту плюс слайдер для швидкого вибору поширених значень. Слайдер у 3 рази прискорює налаштування типових значень порівняно з полем введення.
Переліки: тип ордера (limit/market/stop), напрямок (long/short/both), таймфрейм для сигналу. Тут — Picker / DropdownMenu / сегментовані кнопки. Торгові пари: користувач обирає зі списку доступних пар на біржі. Список підвантажується через API біржі, кешується та підтримує пошук. Реалізація на Flutter з використанням StateNotifier для керування станом.
// Flutter — форма параметрів з валідацією
class BotSettingsForm extends ConsumerStatefulWidget { ... }
class _BotSettingsFormState extends ConsumerState<BotSettingsForm> {
final _formKey = GlobalKey<FormState>();
late TextEditingController _takeProfitController;
late TextEditingController _stopLossController;
@override
Widget build(BuildContext context) {
return Form(
key: _formKey,
child: Column(
children: [
TextFormField(
controller: _takeProfitController,
keyboardType: const TextInputType.numberWithOptions(decimal: true),
inputFormatters: [FilteringTextInputFormatter.allow(RegExp(r'^\d+\.?\d{0,2}'))],
validator: (value) {
final v = double.tryParse(value ?? '');
if (v == null || v < 0.1 || v > 50) return 'Допустимо: 0.1 – 50%';
return null;
},
decoration: const InputDecoration(
labelText: 'Тейк-профіт (%)',
suffixText: '%',
),
),
// ... інші поля
ElevatedButton(
onPressed: _submit,
child: const Text('Зберегти'),
),
],
),
);
}
void _submit() {
if (!_formKey.currentState!.validate()) return;
final params = BotParams(
takeProfit: double.parse(_takeProfitController.text),
stopLoss: double.parse(_stopLossController.text),
);
ref.read(botSettingsProvider.notifier).save(params);
}
}
Як захистити бота від випадкових змін?
Зміна параметрів працюючого бота — небезпечна операція. Якщо бот тримає відкриті позиції, зміна стоп-лосу або розміру ордера може викликати непередбачені ордери. Тому перед відправкою — підтвердження з показом diff: «Тейк-профіт: 2% → 3.5%». Додатково: деякі параметри можна змінювати тільки при зупиненому боті (наприклад, торгові пари або тип стратегії). Такі поля блокуються в UI, якщо bot.status == RUNNING, з поясненням «Зупиніть бота для зміни».
Чому pessimistic update, а не optimistic?
Для операцій з налаштуваннями використовуємо pessimistic update: спочатку запит на сервер, при успіху — оновлюємо UI. Не оптимістично, тому що якщо бот відхилив параметри (наприклад, мінімальний ордер на біржі — $10, а користувач ввів $5), потрібно одразу показати помилку з сервера, а не відкатувати. На Riverpod (Flutter) паттерн через AsyncNotifier:
class BotSettingsNotifier extends AsyncNotifier<BotSettings> {
@override
Future<BotSettings> build() => ref.read(botRepositoryProvider).getSettings(botId);
Future<void> save(BotParams params) async {
state = const AsyncLoading();
state = await AsyncValue.guard(
() => ref.read(botRepositoryProvider).updateSettings(botId, params),
);
}
}
Які типові помилки виникають при налаштуванні?
Початківці часто забувають про мінімальний крок зміни для деяких бірж (наприклад, тейк-профіт з кроком 0.1%). Або вводять плече, що перевищує допустиме для обраної торгової пари. Щоб цього уникнути, ми додаємо динамічні підказки під полями: вони показують поточний ліміт при введенні значення за межами норми. Також використовується debounce для запиту валідації на сервері, щоб не перевантажувати API.
Як зберегти налаштування? Покрокова інструкція
- Заповніть форму: введіть числові параметри (тейк-профіт, стоп-лос, розмір ордера). Валідація спрацьовує при введенні.
- Виберіть торгові пари з пошукового списку.
- Перевірте diff в діалозі підтвердження: червоним старі значення, зеленим нові.
- Натисніть «Зберегти». Якщо бот активний, небезпечні поля заблоковані — спочатку зупиніть бота.
- Після успішної відповіді сервера — оновлення UI. У разі помилки — повідомлення сервера.
Порівняння optimistic vs pessimistic update
| Критерій |
Optimistic |
Pessimistic |
| Швидкість UI |
Миттєво |
Після відповіді |
| Ризик розсинхрону |
Високий |
Нульовий |
| Підходить для |
Чати, лайки |
Фінансові операції |
| Обробка помилок |
Відкат стану |
Показ помилки сервера |
Pessimistic update надійніший для торгових ботів: запобігає помилковим ордерам.
Що входить в роботу
| Компонент |
Опис |
| Форма налаштувань |
Валідація всіх числових полів (min/max, precision) |
| Вибір торгових пар |
Пошук, підвантаження з API біржі, кешування |
| Блокування небезпечних полів |
При активному боті поля блокуються з поясненням |
| Confirmation dialog |
Показує diff змін перед відправкою |
| Чернетка |
Збереження в SharedPreferences / UserDefaults |
Строки розробки
Орієнтовно 4–6 робочих днів залежно від кількості параметрів і складності валідаційних правил. Вартість розраховується індивідуально після аналізу вимог. Щоб отримати точну оцінку, напишіть нам — ми проаналізуємо вашу специфікацію і запропонуємо рішення.
Чому обирають нас
Ми — команда мобільних розробників з 7+ років досвіду у фінансових застосунках. Налагоджений процес code review та тестування. Всі рішення відповідають App Store Review Guidelines та політикам Google Play. Оцінимо ваш проєкт безкоштовно і дамо рекомендації. Зв'яжіться з нами, щоб обговорити ваш проєкт. Отримайте консультацію з налаштування UI для торгового бота. Замовте розробку екрана налаштувань вже сьогодні.
Аналітика мобільних застосунків: Firebase, Amplitude, AppsFlyer та атрибуція
Наша команда регулярно стикається з проектами, де аналітика вже «налаштована», але реальних інсайтів немає. Типовий приклад — стартап з 50k DAU: трекінг десятків подій без жодної відповіді на питання «чому користувачі не доходять до оплати». За два тижні ми побудували базову воронку і з'ясували, що 70% аудиторії відвалюється на екрані верифікації номера телефону. Після локалізації бага retention зріс на 12%. Висновок: аналітика повинна починатися з конкретних питань, а не з трекінгу всього підряд.
Чому таксономія подій — основа аналітики мобільних застосунків?
Firebase Analytics, Amplitude, Mixpanel — технічно схожі. Різниця в тому, що ви в них кладете. Типова помилка: події screen_view, button_tap_1, button_tap_2 без контексту. Через місяць ніхто не пам'ятає, що таке button_tap_2.
Правильна таксономія: об'єкт + дія + контекст. product_viewed, checkout_started, payment_completed з параметрами product_id, category, price, source. Це дозволяє будувати воронки, когортний аналіз та retention без додаткового трекінгу.
Ми фіксуємо naming convention у tracking plan — документі (Google Sheet або Amplitude Data Catalog), де описано кожну подію, її параметри та умови спрацьовування. Tracking plan синхронізується з командою аналітиків до початку розробки, а не після. Такий підхід гарантує, що через місяць дані залишаться інтерпретованими, а не перетворяться на звалище. Досвід впровадження на 50+ проектах підтверджує: при відсутності tracking plan вартість підтримки аналітики зростає у 2-3 рази за рахунок переробок.
Що обрати для аналітики мобільних застосунків: Firebase, Amplitude чи Mixpanel?
Таблиця нижче показує ключові відмінності трьох популярних платформ. Вибір залежить від бюджету, трафіку та завдань.
| Критерій |
Firebase Analytics |
Amplitude |
Mixpanel |
| Безкоштовний ліміт |
Безліміт (в рамках Spark-плану) |
До 10 млн events/міс |
До 1 тис. MTU/міс (Special) |
| Затримка даних |
До 24 годин (стандарт) |
Хвилини (real-time) |
Хвилини (real-time) |
| Воронки та когорти |
Базові воронки, обмежена кількість |
Глибокі воронки, Journeys, когорти |
Funnels, Retention, Insights |
| BigQuery-експорт |
Так (безкоштовно, сирі дані) |
Так (підписка) |
Так (Enterprise) |
| Session Replay |
Ні |
Є (iOS/Android SDK) |
Ні |
| Інтеграція з рекламою |
Google Ads (нативна) |
Через Universal Links |
Через партнерів |
Firebase Analytics — безкоштовно, глибока інтеграція з Google Ads, BigQuery-експорт для сирих даних. Обмеження: затримка даних до 24 годин, обмежені воронки. Для стартапів з Google Ads трафіком — перший вибір.
Amplitude — продуктова аналітика з акцентом на когорти та шляхи користувача. Journeys (колишній Pathfinder) показує реальні шляхи між подіями — не передбачувані воронки, а фактичні маршрути. Session Replay — запис сесій для UX-аналізу. Безкоштовний тир до 10 млн events/місяць достатній для більшості продуктів на старті.
Mixpanel — ближче до Amplitude, сильніший у сегментації в реальному часі. Insights, Funnels, Retention — базові інструменти, які закривають 90% аналітичних завдань продакта.
Більш формальні визначення цих платформ можна знайти у Wikipedia (Firebase) та Wikipedia (Amplitude).
Як вирішити проблему мультиканальної атрибуції з AppsFlyer?
Знати звідки прийшов користувач — окреме завдання. Firebase Attribution працює лише всередині Google-екосистеми. Для мультиканальної атрибуції (Facebook Ads, TikTok, Apple Search Ads, programmatic) потрібен MMP — Mobile Measurement Partner.
AppsFlyer — лідер ринку. OneLink — universal deep link, який працює на iOS та Android і коректно атрибутує встановлення з будь-якого каналу. Protect360 — вбудований захист від fraud (фейкові встановлення, click injection на Android). Adjust та Branch — конкуренти з подібним функціоналом. Branch сильний у deep linking; Adjust популярний у gaming.
Згідно з Apple, з iOS 14.5 застосунки повинні отримувати дозвіл користувача через ATT перед збором IDFA для відстеження. AppsFlyer використовує probabilistic matching (IP + user agent + timing) для цих користувачів — точність нижча, але краще ніж нічого. SKAdNetwork та Privacy Preserving Attribution надають агреговані дані від Apple із затримкою 24-72 години.
Як налаштувати crash-аналітику, щоб не пропускати баги?
Firebase Crashlytics — стандарт для crash reporting. Автоматично групує креші за стектрейсом, показує affected users %, velocity alerts при зростанні crash rate більш ніж на 10% за годину.
Важливо: символікація. На iOS .dSYM файли повинні автоматично завантажуватися при кожній збірці — через Fastlane upload_symbols_to_crashlytics або Xcode Cloud built-in. Без символів креш у Crashlytics виглядає як набір адрес пам'яті. Це трапляється частіше, ніж здається при переході на новий CI — в одному проекті з аудиторією 500k користувачів ми виявили, що 40% крешів залишалися несимволізованими через пропущений етап у CI/CD. Після автоматизації час реакції на баги скоротився з 3 годин до 15 хвилин.
Для React Native та Flutter — @sentry/react-native та sentry_flutter дають додатковий контекст: breadcrumbs, мережеві запити перед крешем, стан Redux/Provider.
Нижче — порівняння популярних інструментів crash-аналітики для вибору під свої завдання.
| Критерій |
Firebase Crashlytics |
Sentry |
Instabug |
| Безкоштовний ліміт |
Безліміт (в рамках Spark) |
5k events/міс |
250 MAU |
| Групування |
За стектрейсом + параметри |
За fingerprint |
За стектрейсом + метадані |
| Символікація |
Автоматична (через файл) |
Автоматична (через CLI) |
Автоматична |
| Velocity alerts |
Так (за % зміни) |
Так (за кількістю) |
Так (за порогом) |
| Дод. контекст |
Logs, Keys, Custom Keys |
Breadcrumbs, User, Tags |
User steps, мережеві запити |
| Ціна |
Безкоштовно (у Firebase) |
Від $26/міс (Team) |
Від $99/міс |
Налаштування оточення
Три оточення з окремими Firebase проектами: dev, staging, production. Змішувати аналітику з тестових сесій і production — поширена помилка, яка спотворює всі метрики. На iOS через GoogleService-Info.plist для кожної схеми, на Android через google-services.json у папці кожного flavor.
Терміни: базова аналітика з Firebase + Crashlytics — 3-5 днів. Повноцінний tracking plan + Amplitude/Mixpanel з воронками та когортами — 2-3 тижні. Атрибуція через AppsFlyer з deep linking та fraud protection — 1-2 тижні. Вартість розраховується індивідуально залежно від складності інтеграцій.
Що входить у нашу роботу
В рамках впровадження аналітики ми надаємо:
- Розробку та узгодження tracking plan з командами продукту та маркетингу.
- Інтеграцію SDK (Firebase, Amplitude, Mixpanel, AppsFlyer) з урахуванням вашого стеку (Swift/Kotlin/Flutter/React Native).
- Налаштування воронок, когорт, дашбордів та алертів.
- Автоматизацію символікації та завантаження .dSYM через Fastlane.
- Документацію щодо подій та параметрів.
- Навчання команди роботі з аналітичною платформою.
- Два тижні пост-релізної підтримки та коригування трекінгу.
Наш досвід — 7 років впровадження аналітики та понад 80 успішних проектів у сфері мобільної розробки. Ми гарантуємо коректність даних і прозорість кожного етапу.
Зв'яжіться з нами, щоб отримати консультацію з налаштування аналітики вашого застосунку. Замовте аудит поточної аналітики — і ми покажемо, які метрики ви втрачаєте.