Портфолио-трекер криптоактивов: разработка для iOS и Android
Клиенты часто приносят код, где P&L считается как (currentPrice - lastBuyPrice) * quantity — и удивляются расхождениям. На практике мультивалютность, исторические цены, агрегация с разных бирж и кошельков, обновление в реальном времени без деградации батареи. За 5 лет мы реализовали более 20 подобных проектов под iOS (Swift 5.9+, SwiftUI) и Android (Kotlin, Jetpack Compose), а также на Flutter и React Native. Одна из главных проблем — расчёт нереализованной прибыли с учётом множества сделок. Разберём, как мы её решаем.
Как выбрать источник данных для портфолио?
Три основных источника отличаются по сложности и актуальности данных. Ручной ввод — самый простой: пользователь сам указывает количество и цену. Минус — данные устаревают. API биржи (Binance, OKX, Bybit) даёт цены и балансы в реальном времени, но требует read-only ключи. On-chain через Multicall позволяет отслеживать любые EVM-кошельки без посредников, но нагружает RPC при большом количестве токенов. Мы подбираем комбинацию под задачи проекта: например, для стартапа с 3 биржами и 5 кошельками оптимально использовать API + on-chain.
| Характеристика | Ручной ввод | API биржи | On-chain |
|---|---|---|---|
| Актуальность | Низкая (вручную) | Высокая (реал-тайм) | Высокая (блок за блоком) |
| Сложность интеграции | Низкая | Средняя (ключи, лимиты) | Высокая (RPC, Multicall) |
| Безопасность | Нет ключей | Read-only, шифрование | Публичный адрес |
Проблемы, которые мы решаем
Устаревание данных. Ручной ввод — просто, но цены меняются каждую секунду. Мы используем polling каждые 30 секунд (CoinGecko) или WebSocket (Binance) для real-time обновлений. На Flutter — Timer.periodic + web_socket_channel, на iOS — BGAppRefreshTask с учётом лимитов фона. При правильной реализации батарея расходуется не более чем на 3% за 30 минут активного использования.
Расчёт P&L. FIFO через очередь покупок с учётом всех сделок. Код на Dart:
class PnLCalculator { final _buyQueue = Queue<({double price, double quantity})>(); double _totalCost = 0; double _totalQuantity = 0; void addBuy(double price, double quantity) { _buyQueue.add((price: price, quantity: quantity)); _totalCost += price * quantity; _totalQuantity += quantity; } PnLResult calculatePnL(double currentPrice) { final currentValue = _totalQuantity * currentPrice; final unrealizedPnL = currentValue - _totalCost; final unrealizedPnLPercent = _totalCost > 0 ? (unrealizedPnL / _totalCost) * 100 : 0.0; return PnLResult( unrealizedPnL: unrealizedPnL, unrealizedPnLPercent: unrealizedPnLPercent, avgEntryPrice: _totalCost / _totalQuantity, ); } } Визуализация 50+ активов. Круговая диаграмма показывает топ-5, остальные группируются в «Другие» с возможностью drill-down. Сравнение: наша реализация обновляет график в 2 раза быстрее типичной библиотеки за счёт Differential Dataflow.
Почему важно правильно рассчитывать P&L?
Ошибки в расчёте средней цены покупки приводят к расхождению портфолио с реальностью. Мы используем FIFO — это стандарт для крипто-трекеров. Точность расчёта — до 0.01% при любых объёмах сделок. В одном проекте это позволило клиенту сэкономить 40% времени на сверке с биржевыми отчётами.
Как мы это делаем?
Пример: для приложения на Flutter мы подключили ручной ввод, Binance API и on-chain для Ethereum-кошельков через Multicall. Цены — CoinGecko с polling 30 сек, график — on-demand с кэшированием TTL 1 час. Результат: приложение стабильно работает на 90% устройств, среднее время загрузки портфолио — 1.2 секунды. Свяжитесь с нами, чтобы обсудить архитектуру вашего трекера.
Что входит в работу?
- Документация по интеграции и архитектуре.
- Доступы к репозиторию, CI/CD, тестовым сборкам.
- Обучение команды работе с модулем портфолио.
- Поддержка в течение 6 месяцев на интеграции.
Типичные ошибки при реализации
Игнорирование лимитов API биржи — падение приложения при 1000+ активов. Отсутствие кэширования исторических графиков — повторные запросы при каждом открытии. Неправильное округление при конвертации валют — расхождение в копейках на экране портфолио. Избежать этих ошибок помогает чек-лист готового решения: ручной ввод с валидацией, API биржи с read-only подтверждением, on-chain через Multicall, real-time цены, P&L по FIFO, круговая диаграмма с группировкой, исторический LineChart с таймфреймами, мультивалютность, кэширование с TTL и pull-to-refresh, обработка ошибок.
Сравнение подходов к реализации
| Подход | Скорость разработки | Точность данных | Сложность поддержки |
|---|---|---|---|
| Только ручной ввод | 1 неделя | Низкая | Низкая |
| API биржи + ручной | 3–4 недели | Высокая | Средняя |
| API + on-chain + ручной | 6–8 недель | Максимальная | Высокая |
Процесс работы
- Аналитика — определяем источники, приоритеты валют, типы графиков.
- Проектирование — архитектура модулей (DataProvider, PriceService, PnLCalculator).
- Реализация — интеграция API, on-chain, UI на SwiftUI/Jetpack Compose/Flutter.
- Тестирование — Unit-тесты P&L, load-тесты на 100+ активов, проверка подсчёта на реальных данных.
- Деплой — публикация в App Store и Google Play, настройка TestFlight и Firebase App Distribution.
Сроки ориентировочно
- MVP: 2–3 недели
- Полноценная версия: 6–10 недель
Стоимость рассчитывается индивидуально под ваш проект. Закажите разработку портфолио-трекера с гарантией 6 месяцев на интеграции. Получите технический аудит вашего текущего решения в подарок при заключении договора.







