О проекте
Клиент — активный трейдер, уже использующий десктопный терминал, но нуждающийся в контроле позиций в дороге. Основное требование: мобильное приложение должно давать полную картину портфеля и возможность быстро действовать без ноутбука.
Это не попытка воссоздать десктоп на телефоне. Мобильное приложение решает конкретную задачу: контроль и быстрые операции, пока вы не за столом.
Технические требования
- Android-приложение (минимум Android 10)
- Агрегированный вид портфеля по всем биржам
- Real-time обновление цен и PnL без ручного обновления экрана
- Push-уведомления: исполнен ордер, достигнут тейк-профит/стоп-лосс, резкое изменение цены
- Быстрое закрытие позиции — 2 тапа
- Офлайн-режим: базовая информация без интернета
Стек
Язык: Kotlin. Нативная разработка под Android — полный контроль над производительностью.
Архитектура: MVVM + Clean Architecture. Раздельные слои позволяют тестировать бизнес-логику независимо от UI и менять биржевые интеграции без переписывания интерфейса.
Real-time данные: WebSocket-соединения работают в фоновом Foreground Service. Данные обновляются даже если приложение свёрнуто.
Push-уведомления: двухуровневая система. Критические события (исполнен ордер) — серверный push через Firebase Cloud Messaging. Ценовые алерты — локальная обработка в приложении.
Локальная БД: Room (SQLite). История ордеров хранится локально — отсюда офлайн-режим.
UX-решения
Быстрое закрытие позиции
Требование «2 тапа» реализовано через bottom sheet с подтверждением. Первый тап: свайп по позиции вправо. Второй: подтверждение суммы и биржи. Рыночный ордер отправляется немедленно.
Экран портфеля
Главный экран: суммарный PnL за день, список открытых позиций с текущим PnL. Цены обновляются в реальном времени — PnL пересчитывается немедленно при каждом обновлении.
Адаптация под мобильные ограничения
Батарея
В режиме «экономии батареи» переходим на polling с интервалом 30 секунд вместо постоянного WebSocket.
Нестабильная сеть
WebSocket-клиент переподключается за < 1 секунды при восстановлении сети и сразу запрашивает актуальное состояние.
Результат
- Время от тапа «Закрыть» до исполнения ордера: < 800 мс
- Push-уведомление об исполнении: медиана 1,2 секунды
- Размер APK: 18 МБ
- Offline-режим: последние данные доступны без интернета