Реализация фьючерсной торговли в мобильном приложении биржи
Фьючерсная торговля на криптобиржах — это вечные контракты (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 месяца.







