Реализация фьючерсной торговли в мобильном приложении биржи
Мы разрабатываем мобильные модули для фьючерсной торговли — с вечными контрактами (perpetual futures), плечом до 125x и механизмом фондирования. В отличие от спотовой торговли, здесь нет реального актива, только контракт на разницу цен. Это накладывает принципиально иные требования на интерфейс: Mark Price, Funding Rate, Liquidation Price, unrealized/realized PnL и режим маржи — всё должно обновляться в реальном времени. Ниже — как мы решаем эти задачи.
Почему фьючерсная торговля сложнее спотовой на мобильных устройствах?
Спотовый экран показывает цену, график и форму ордера. Фьючерсный — добавляет показатели маржи, ликвидации, фондирования и переключение Long/Short. При этом все данные должны быть доступны без скролла и путаницы. Ошибка в отображении Liquidation Price может привести к потере средств. Поэтому мы используем проверенные архитектурные решения: WebSocket для стримов, кэширование Mark Price локально, и формулу расчёта ликвидации с учётом режима Cross/Isolated.
Perpetual Futures: ключевые концепции для UI
Mark Price — индексная цена, рассчитываемая биржей на основе средневзвешенной нескольких спот-площадок и funding premium. По ней считается PnL и liquidation — не по Last Price. Разница между Mark и Last может достигать 0.5–2% при высокой волатильности. В UI показываем оба значения.
Funding Rate — ставка, которую лонги платят шортам (или наоборот) каждые 8 часов. При значительном отклонении ставка может составлять 0.1% каждые 8 часов (~0.3% в сутки). Показываем Funding Rate и таймер до следующего начисления в карточке позиции.
Leverage на фьючерсах — динамически меняется через слайдер или поле. Максимальное плечо зависит от размера позиции: например, на Binance 125x доступно только для позиций до 50 000 USDT.
Liquidation Price: расчёт для фьючерсов
Формула для USDM perpetual (Binance Futures), LONG позиция:
LiquidationPrice = EntryPrice × (1 - InitialMarginRate + MaintenanceMarginRate) где InitialMarginRate = 1 / Leverage.
// Android — liquidation price для perpetual futures LONG fun calcLiqPriceLong( entryPrice: BigDecimal, leverage: Int, mmRate: BigDecimal = BigDecimal("0.005") // Maintenance Margin Rate ): BigDecimal { val imr = BigDecimal.ONE.divide(BigDecimal(leverage), 8, RoundingMode.HALF_UP) return entryPrice.multiply(BigDecimal.ONE.subtract(imr).add(mmRate)) .setScale(2, RoundingMode.HALF_UP) } Для позиций с усреднениями — пересчёт Entry Price по средневзвешенной и обновление Liquidation Price. При Cross Margin в расчёт входит весь баланс.
Как обеспечить реальную безопасность позиций с помощью TP/SL?
В фьючерсах Take Profit и Stop Loss задаются как атрибуты позиции, а не отдельные ордера. Binance Futures API: POST /fapi/v1/order с параметрами reduceOnly=true, или создание TP/SL через closePosition=true. Важно использовать workingType: MARK_PRICE — TP/SL срабатывает по Mark Price, что защищает от ложных срабатываний (wick hunting). Это объясняем пользователю в tooltip.
// iOS — создание TP/SL для фьючерсной позиции struct FuturesTpSlRequest: Codable { let symbol: String let side: String // противоположная текущей позиции let type: String // TAKE_PROFIT_MARKET или STOP_MARKET let stopPrice: String let closePosition: String // "true" let workingType: String // MARK_PRICE или CONTRACT_PRICE let timeInForce: String // GTE_GTC } Согласно Binance API Reference, такой подход исключает случайные ликвидации.
UI торгового экрана: что мы делаем иначе
Фьючерсный торговый экран перегружен данными. Наша структура для мобильного:
- Верх: Mark Price (крупно), Last Price, Funding Rate + Countdown, 24h Change
- Центр: свечной график (TradingView Lightweight Charts в WebView) с переключением таймфреймов
- Снизу: табы «Позиция» / «Открытые ордера» / «История» + форма ордера
Форма ордера — Bottom Sheet с вкладками Long/Short. Поля: Leverage (слайдер), Price (лимитные), Size (в контрактах или USDT), режим маржи Cross/Isolated.
Сравнение подходов к UI: спот vs фьючерсы
| Параметр | Спот | Фьючерс |
|---|---|---|
| Отображение цены | Last Price | Mark Price + Last Price |
| Позиция | отдельный экран | встроенная в торговый экран |
| Плечо | нет | слайдер/поле |
| Риск-менеджмент | лимитные ордера | TP/SL, ликвидация |
| Обновление данных | REST каждые N сек | WebSocket real-time |
Наш опыт и гарантии качества
Мы занимаемся мобильной разработкой биржевых приложений 5+ лет, реализовали более 10 проектов для криптобирж и брокеров. Каждый модуль проходит код-ревью, нагрузочное тестирование и проверку соответствия App Store / Google Play гайдлайнам. Предоставляем полную документацию и поддержку на этапе интеграции.
Что входит в работу
- Архитектурное проектирование модуля (схемы потоков данных, ноды WebSocket)
- Разработка UI-компонентов под iOS (Swift/SwiftUI) и Android (Kotlin/Jetpack Compose)
- Интеграция с биржевым API (REST + WebSocket)
- Настройка push-уведомлений (APNs/FCM) для рисков ликвидации
- Тестирование: unit-тесты, UI-тесты, тестирование на эмуляторах и реальных устройствах
- Документация для разработчиков и пользователей
- Помощь в публикации в App Store / Google Play
Сроки
MVP фьючерсного модуля (perpetual, Long/Short, TP/SL):
| Компонент | Срок |
|---|---|
| WebSocket Mark Price + Funding Rate | 3 дня |
| Форма ордера с плечом и режимом маржи | 1 неделя |
| Real-time позиции: PnL, Liquidation Price | 1 неделя |
| TP/SL привязанный к позиции | 3 дня |
| История сделок и фандинговых выплат | 3 дня |
| Push-уведомления рисков | 3 дня |
Итого: 4–6 недель. Полноценный модуль с Multi-asset Mode, Portfolio Margin, hedge mode — 3 месяца.
Оценим ваш проект бесплатно — свяжитесь для консультации. Пишите, мы расскажем, как реализовать фьючерсную торговлю под ключ в вашем приложении.







