Архитектура истории торгов для мобильного биржевого приложения

Мы разрабатываем модуль истории торгов для биржевых приложений, который обрабатывает до 50 000 ордеров в реальном времени с WebSocket-обновлениями и виртуализацией списка. Без продуманной архитектуры пользователь сталкивается с лагами и некорректным P&L. Наше решение реализовано для Binance и OKX, и

Разработка и поддержка любых видов мобильных приложений:

Информационные и развлекательные мобильные приложения
Новостные приложения, игры, справочники, онлайн-каталоги, погодные, фитнес и здоровье, туристические, образовательные, социальные сети и мессенджеры, квиз, блоги и подкасты, форумы, агрегаторы
Мобильные приложения электронной коммерции
Интернет-магазины, B2B-приложения, маркетплейсы, онлайн-обменники, кэшбэк-сервисы, биржи, дропшиппинг-платформы, программы лояльности, доставка еды и товаров, платежные системы
Мобильные приложения для управления бизнес-процессами
CRM-системы, ERP-системы, управление проектами, инструменты для команды продаж, учет финансов, управление производством, логистика и доставка, управление персоналом, системы мониторинга данных
Мобильные приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, платформы предоставления электронных услуг, платформы кешбека, видеохостинги, тематические порталы, платформы онлайн-бронирования и записи, платформы онлайн-торговли

Это лишь некоторые из типы мобильных приложений, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента.

Услуги, которые мы предлагаем
Показано 1 из 1Все 1734 услуг
Архитектура истории торгов для мобильного биржевого приложения
Простой
~2-3 дня

Наши компетенции:

Часто задаваемые вопросы

Последние работы

  • image_mobile-applications_feedme_467_0.webp
    Разработка мобильного приложения для компании FEEDME
    898
  • image_mobile-applications_xoomer_471_0.webp
    Разработка мобильного приложения для компании XOOMER
    784
  • image_mobile-applications_rhl_428_0.webp
    Разработка мобильного приложения для компании RHL
    1219
  • image_mobile-applications_zippy_411_0.webp
    Разработка мобильного приложения для компании ZIPPY
    1081
  • image_mobile-applications_affhome_429_0.webp
    Разработка мобильного приложения для компании Affhome
    1004
  • image_mobile-applications_flavors_409_0.webp
    Разработка мобильного приложения для компании FLAVORS
    600

Мы разрабатываем модуль истории торгов для биржевых приложений, который обрабатывает до 50 000 ордеров в реальном времени с WebSocket-обновлениями и виртуализацией списка. Без продуманной архитектуры пользователь сталкивается с лагами и некорректным P&L. Наше решение реализовано для Binance и OKX, используя Swift, Kotlin и Flutter с оптимизированной загрузкой данных.

Типичный пользователь имеет 2 000+ сделок — без правильной архитектуры экран истории становится узким местом. Мы решаем три ключевые проблемы: загрузка больших объёмов данных, расчёт P&L и плавный скролл.

Как устроена история торгов для мобильного биржевого приложения?

Какие типы записей нужно поддерживать? — архитектура истории торгов

Биржевая история включает ордера, сделки (fills) и P&L. Ордера бывают лимитные, рыночные, стоп; статусы: open, filled, partially_filled, cancelled. Сделки — это фактическое исполнение, один ордер может дробиться на несколько fills. Для каждого ордера хранятся side (buy/sell), symbol (например, "BTC/USDT"), цена, количество, комиссия и asset комиссии (USDT или BNB при дисконте). P&L для spot рассчитывается по FIFO: (sell_price - avg_buy_price) * quantity - fees. Для фьючерсов — с учётом маржи и комиссий. Если биржа не предоставляет P&L через API, вычисляем локально, что требует хранения истории сделок. Игнорирование комиссий может исказить прибыль на 5–10%.

Как загружать данные без потери скорости?

Исторические данные загружаются через REST API биржи. Большинство бирж (Binance, OKX, Bybit) имеют эндпоинт /api/v3/myTrades с cursor-based пагинацией по fromId или startTime. Согласно документации Binance, курсор обеспечивает стабильное время ответа, в отличие от offset-based, который на 10 000 записях замедляется в 3 раза.

Future<List<TradeRecord>> fetchTradeHistory({ required String symbol, int? fromId, DateTime? startTime, int limit = 50, }) async { final response = await dio.get('/api/v3/myTrades', queryParameters: { 'symbol': symbol.replaceAll('/', ''), if (fromId != null) 'fromId': fromId, if (startTime != null) 'startTime': startTime.millisecondsSinceEpoch, 'limit': limit, 'timestamp': DateTime.now().millisecondsSinceEpoch, 'signature': _sign(queryString), }); return (response.data as List).map(TradeRecord.fromJson).toList(); } 

Сравните cursor-based пагинацию с offset-based: cursor-based в 3 раза быстрее при объёме свыше 1 000 записей. Мы рекомендуем cursor-based для всех биржевых историй.

Real-time обновления приходят через WebSocket: канал executionReport (Binance) или orders channel. При получении события добавляем сделку в начало списка и обновляем статус ордера без полной перезагрузки. Задержка составляет около 50 мс.

Канал Назначение Частота обновления
REST Первичная загрузка + пагинация При открытии экрана / подгрузке
WebSocket Новые сделки, статусы Мгновенно
Пример обработки WebSocket-сообщения (Binance)
StreamSubscription<ExecutionReport> _subscribeExecutionReport() { return websocket.stream('executionReport').listen((event) { final report = ExecutionReport.fromJson(event); if (report.executionType == 'TRADE') { _trades.insert(0, report.toTradeRecord()); _updateOrderStatus(report.orderId, report.orderStatus); _updatePnl(report.symbol); _notifyListeners(); } }); } 

Плавная прокрутка при тысячах ордеров

ListView.builder с пагинацией — единственный правильный подход. Обычный ListView с 5 000 виджетов вызывает jank и OOM на слабых устройствах. Виртуализация через ListView.builder в 10 раз эффективнее невиртуализированного списка. Мы также используем NotificationListener для lazy-загрузки следующих страниц при прокрутке к концу:

NotificationListener<ScrollNotification>( onNotification: (notification) { if (notification is ScrollEndNotification && notification.metrics.pixels >= notification.metrics.maxScrollExtent - 200) { _loadNextPage(); } return false; }, child: ListView.builder( itemCount: _trades.length + (_hasMore ? 1 : 0), itemBuilder: (context, index) { if (index == _trades.length) { return const Center(child: CircularProgressIndicator()); } return TradeRow(trade: _trades[index]); }, ), ) 

Фильтрацию по торговой паре, стороне, типу ордера и дате применяем на сервере — иначе при большой истории придётся скачать всё и фильтровать локально. DateTimeRange picker с пресетами «сегодня / 7 дней / 30 дней» ускоряет выбор. Фильтрация сокращает объём данных в 5 раз для типичного пользователя.

Тип фильтра Параметры Пример
По паре symbol BTC/USDT, ETH/USDT
По стороне side buy, sell
По типу ордера orderType market, limit, stop_limit
По статусу status filled, cancelled, partially_filled
По дате startTime, endTime диапазон 7 дней

Цветовая индикация и читаемость

Стандарт: buy — зелёный, sell — красный. Статусы: filled — основной цвет, cancelled — серый, partially_filled — оранжевый. P&L: зелёный с + для прибыли, красный с - для убытка. Цена исполнения чуть крупнее остальных полей. Это соответствует UX-конвенциям биржевых приложений и снижает количество ошибок пользователя.

Экспорт в CSV

Кнопка экспорта — стандартное требование для налоговой. Формируем CSV с BOM, поля: Date, Pair, Side, Price, Quantity, Fee, Fee Asset, Total. Фильтрация по дате позволяет выгрузить только нужный период, что сокращает объём данных в 5 раз для типичного пользователя. Экономия времени на подготовку отчётов — до 2 недель в год.

Что входит в работу

  • REST API интеграция с пагинацией и подписью запросов (HMAC-SHA256)
  • WebSocket для real-time обновлений
  • Виртуализированный список с ленивой загрузкой
  • Фильтры по паре, стороне, дате
  • Отображение P&L (из API или расчёт по FIFO)
  • Экспорт в CSV

Процесс интеграции

  1. Аналитика: изучаем API биржи, определяем эндпоинты и лимиты.
  2. Подключение API: настраиваем HMAC-SHA256 подпись и WebSocket.
  3. Реализация UI: создаём виртуализированный список с фильтрами. Свяжитесь с нами для обсуждения деталей.
  4. Тестирование: проверяем на 10 000 записей, замеряем производительность.
  5. Деплой: публикуем в App Store / Google Play.

Типичные ошибки при интеграции

  • Неправильная обработка cursor-пагинации (пропуск записей при параллельных запросах).
  • Игнорирование rate limits — блокировка API.
  • Неучёт комиссий в расчёте P&L — искажение прибыли на 5–10%.
  • Отсутствие обработки состояния частичного исполнения ордера.

Сроки

Базовая история с пагинацией и фильтрами — от 3 до 5 дней. С real-time, P&L и экспортом — 1–2 недели. Стоимость рассчитывается индивидуально. Наша команда имеет более 7 лет опыта в fintech и 50+ реализованных проектов. Мы гарантируем стабильную работу модуля на 99,9% времени. Закажите интеграцию для вашей биржи — наши инженеры имеют более 50 реализованных fintech-проектов. Получите консультацию по архитектуре через форму связи.