Реалізація ф'ючерсної торгівлі в мобільному додатку біржі
Ми розробляємо мобільні модулі для ф'ючерсної торгівлі — з вічними контрактами (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 та ліквідація — не за 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 місяці.
Оцінимо ваш проєкт безкоштовно — зв'яжіться для консультації. Пишіть, ми розповімо, як реалізувати ф'ючерсну торгівлю під ключ у вашому додатку.







