Інтеграція 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 / ...
Прокси нормалізує дані, управляє ротацією ключів, кешує маркет-дані й агрегує eventi з кількох бирж у єдиний WebSocket-потік для мобіля. Мобільний додаток працює з одним з'єднанням замість N паралельних WebSocket-сесій — це критично для iOS, де фонові сокети вбиваються агресивно.
Якщо прокси неприйнятний з архітектурних причин (self-custody, no server policy) — реалізуємо нативні клієнти для кожної біржи з спільним протоколом через TypeScript-інтерфейс. Більше коду, більше тестів, але немає сервера-посередника.
Оцінка
Мульти-біржевий додаток — нетривіальна задача. Оцінюємо після уточнення: скільки бирж, потрібна літоргівля або лише перегляд портфеля, є ліже бекенд. MVP з 3–4 біржами й базовою торгівлею — від 8 до 16 тижнів залежно від платформи й архітектури.







