Реалізація фьючерсної торговлі в мобільному додатку біржі
Фьючерсна торговля на крипто-біржах — це вічні контракти (perpetual futures) без дати закінчення, з плечем до 125x та механізмом фандингу кожні 8 годин. На відміну від спот-торговлі, тут немає реального активу: тільки контракт на різницю цін. Це накладає принципово інші вимоги на інтерфейс: Mark Price, Funding Rate, Liquidation Price, Unrealized/Realized PnL та режим маржі — все це повинно відображатися у реальному часі.
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 в розрахунок входить весь доступний баланс — формула складніше.
UI торгового екрану
Фьючерсний торговий екран перегружений даними за визначенням. Рекомендована структура для мобільного:
Верх: Mark Price (крупно) | Last Price | Funding Rate + Countdown | 24h Change
Центр: Свічний графік (TradingView Lightweight Charts в WKWebView / WebView) з переключенням таймфреймів
Низ: Табі «Позиція» / «Відкриті ордери» / «Історія» + форма ордера
Форма ордера — Bottom Sheet з двома вкладками Long/Short. Поля: Leverage (слайдер), Price (для лімітних), Size (в контрактах або USDT), режим маржі Cross/Isolated.
TP/SL привязаний до позиції
У фьючерсах Take Profit та Stop Loss задаються не як окремі ордери, а як атрибути позиції. Binance Futures API: POST /fapi/v1/order з параметрами reduceOnly=true, або створення TP/SL через POST /fapi/v1/order з closePosition=true.
// 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
}
workingType: MARK_PRICE — TP/SL срабатывает по Mark Price, що захищає від хибних активацій при аномальних Last Price (wick hunting). Це потрібно пояснити користувачу в tooltip.
Real-time PnL та ліквідація
WebSocket Binance Futures: стрім @markPrice для Mark Price, userData stream з ORDER_TRADE_UPDATE та ACCOUNT_UPDATE для балансів та позицій. Весь UI позицій тримається на цих двох потоках.
При наближенні до liquidation (Margin Ratio > 80%): візуальний пульс (анімація рамки карточки позиції), push з high priority. При фактичній ліквідації — окремий екран з итогами: що було, по якій ціні закрито, скільки потеряно.
Часовий графік
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 місяці.







