Интеграция CCXT для мульти-биржевого подключения в мобильном приложении
CCXT (CryptoCurrency eXchange Trading Library) — это попытка абстрагироваться от десятков несовместимых биржевых API за единым интерфейсом. На вебе и в Node.js это работает хорошо. На мобиле — история сложнее.
Почему CCXT на мобиле — это не просто npm install
CCXT Pro (версия с WebSocket) весит в скомпилированном виде несколько мегабайт и тянет зависимости, которые в React Native требуют полифиллов: crypto, stream, buffer. Для React Native нужен react-native-crypto, readable-stream, настройка metro.config.js с алиасами — и это ещё до первой строки бизнес-логики.
На Flutter CCXT недоступен напрямую — только через Dart FFI или встроенный JavaScript runtime (JSCore на iOS, V8 через flutter_js). Практика показывает: проще написать тонкий адаптер-прокси на бэкенде (Node.js + CCXT) и общаться с мобилем через REST/WebSocket, чем тащить CCXT в Dart-окружение.
Для нативных iOS/Android CCXT не существует — там нужны нативные биржевые SDK или собственные REST-клиенты.
Унифицированный интерфейс: где он реально работает
CCXT даёт единый интерфейс для базовых операций:
const exchange = new ccxt.binance({ apiKey, secret });
const ticker = await exchange.fetchTicker('BTC/USDT');
const balance = await exchange.fetchBalance();
const order = await exchange.createOrder('BTC/USDT', 'limit', 'buy', 0.001, 45000);
Тот же код работает для ccxt.bybit, ccxt.okx, ccxt.kraken. Для агрегаторов портфеля, которые показывают балансы на нескольких биржах — это реальная экономия времени.
Проблема начинается там, где биржи расходятся в деталях. fetchOHLCV на Binance возвращает 1000 свечей, на KuCoin — 1500, на некоторых биржах — 100. createOrder принимает разные наборы параметров для стоп-лоссов и тейк-профитов — CCXT пытается нормализовать это через params, но биржи добавляют новые типы ордеров быстрее, чем библиотека успевает.
CCXT Pro и WebSocket на мобиле
CCXT Pro реализует WebSocket через свой Exchange.watchTrades(), watchOrderBook(), watchBalance(). Под капотом — обёртка над нативным WebSocket с reconnect-логикой. В React Native это работает через полифилл WebSocket (глобальный объект), который React Native предоставляет из коробки.
Ключевой нюанс: CCXT Pro использует await с while(true) для потребления стримов:
while (true) {
const trades = await exchange.watchTrades('BTC/USDT');
// обновляем UI
}
Это блокирующая конструкция. В React Native нужно запускать в отдельном контексте (через setInterval + Promise или Worker — в RN нет настоящих Workers, нужен react-native-multithreading или серверный прокси).
Архитектура мульти-биржевого приложения
Рекомендуемая схема для мобиля:
Mobile App
↕ WebSocket / REST
Backend Proxy (Node.js + CCXT)
↕ биржевые API
Binance / Bybit / OKX / ...
Прокси нормализует данные, управляет ротацией ключей, кэширует маркет-данные и агрегирует события с нескольких бирж в единый WebSocket-поток для мобиля. Мобильное приложение работает с одним соединением вместо N параллельных WebSocket-сессий — это критично для iOS, где фоновые сокеты убиваются агрессивно.
Если прокси неприемлем по архитектурным причинам (self-custody, no server policy) — реализуем нативные клиенты для каждой биржи с общим протоколом через TypeScript-интерфейс. Больше кода, больше тестов, но нет сервера-посредника.
Оценка
Мульти-биржевое приложение — нетривиальная задача. Оцениваем после уточнения: сколько бирж, нужна ли торговля или только просмотр портфеля, есть ли уже бэкенд. Срок MVP с 3–4 биржами и базовой торговлей — от 8 до 16 недель в зависимости от платформы и архитектуры.







