Реалізація маржинальної торговлі в мобільному додатку біржі
Маржинальна торговля — робота з заємними коштами. Користувач вносить залог (маржу), біржа надає плече 3x, 5x, 10x. Прибуток та збиток рахуються від повного об'єму позиції, а не від залогу. Якщо збиток наближається до суми маржі — біржа примусово закриває позицію (liquidation). Реалізувати це на мобільному — значить побудувати складну систему відображення ризиків у реальному часі.
Маржинальні акаунти: Isolated та Cross
Два режими з принципово різною логікою:
Cross Margin — весь баланс маржинального рахунку служить залогом для всіх позицій. Одна позиція «з'їдає» маржу іншої. Liquidation price розраховується для всього рахунку.
Isolated Margin — кожна торговельна пара має окремий ізольований маржинальний гаманець. Максимальний збиток обмежений сумою в цьому гаманці. Для мобільного UX ізольована маржа простіше: користувач розуміє, що втрачає тільки те, що внесе на конкретну пару.
UI повинен явно розмежовувати ці два режими. Перемикач з коротким поясненням (тултіп або bottom sheet з прикладом) — обов'язковий.
Розрахунок Liquidation Price
Liquidation Price — ключовий індикатор для маржинальної позиції. Користувач повинен бачити його прямо в інтерфейсі до відкриття позиції.
Формула для ISOLATED LONG (спрощена для Binance):
LiquidationPrice = EntryPrice × (1 - 1/Leverage + MaintenanceMarginRate)
Maintenance Margin Rate для більшості пар Binance: 0.5–1.5% залежно від тиру.
// iOS — розрахунок liquidation price для ізольованої long-позиції
struct MarginPositionCalculator {
static func liquidationPriceLong(
entryPrice: Decimal,
leverage: Int,
maintenanceMarginRate: Decimal = 0.005
) -> Decimal {
let leverageDecimal = Decimal(leverage)
return entryPrice * (1 - 1 / leverageDecimal + maintenanceMarginRate)
}
static func liquidationPriceShort(
entryPrice: Decimal,
leverage: Int,
maintenanceMarginRate: Decimal = 0.005
) -> Decimal {
let leverageDecimal = Decimal(leverage)
return entryPrice * (1 + 1 / leverageDecimal - maintenanceMarginRate)
}
}
Оновлювати liquidation price при кожній зміні розміру плеча або суми маржі. Показувати його червоним кольором з відсотком відстані від поточної ціни — «Ліквідація в 14.3% від поточної».
Margin Ratio та Margin Call
Margin Ratio = Обслуговувана маржа / Капітал рахунку × 100%.
- Нижче 100% — рахунок у нормі
- 80–100% — жовта зона, push-сповіщення «Внесіть додаткову маржу»
- Вище 100% — примусове закриття позицій (liquidation)
На екрані відкритої позиції — прогресс-бар Margin Ratio з кольоровою градацією (зелений → жовтий → червоний). WebSocket оновлює баланс та P&L у реальному часі.
Заём та погашення
Робота з маржинальним займом — окремий flow:
-
Заём (Borrow): користувач вказує суму та валюту. Біржа повертає
tranId. Інтерфейс показує доступний ліміт займу, поточну процентну ставку (hourly/annual), максимально доступну суму. -
Погашення (Repay): спочатку погашаються проценти, потім тіло боргу. Кнопка «Погасити все» розраховує повну суму до погашення включаючи нараховані проценти.
На Binance API: POST /sapi/v1/margin/loan та POST /sapi/v1/margin/repay. Ставки доступні через GET /sapi/v1/margin/interestRateHistory.
Уведомлення та алерти ризиків
Маржинальна торговля вимагає проактивних сповіщень:
- Margin Ratio > 75% → push «Наближаєтесь до ліквідації на BTC/USDT»
- Маржинальний займ нараховує проценти > X USDT → періодичне нагадування
- Позиція примусово закрита → миттєвий push з сумою збитку
Firebase Cloud Messaging з high priority для уведомлень про ліквідацію — APNs apns-priority: 10, FCM priority: high. Звичайний priority може затримати доставку на кілька хвилин, що критично при маржинальній торговлі.
Інтерфейс відкритої позиції
Карточка відкритої позиції повинна показувати:
| Поле | Оновлення |
|---|---|
| Unrealized PnL (USDT та %) | Real-time WebSocket |
| Liquidation Price | При зміні маржі |
| Margin Ratio | Real-time |
| Leverage | Статично при відкриванні |
| Entry Price / Mark Price | Real-time |
Mark Price (честна ціна по індексу) — важливо відрізняти від Last Price. Саме по Mark Price рахується PnL та liquidation, не по Last Price.
Часовий графік та масштаб
| Компонент | Час |
|---|---|
| Перемикач Cross/Isolated з поясненнями | 3 дні |
| Форма ордера з плечом та розрахунком liquidation | 1 тиждень |
| Заём та погашення + UI ставок | 1 тиждень |
| Real-time PnL та Margin Ratio у WebSocket | 1 тиждень |
| Push-сповіщення ризиків (Margin Call, Liquidation) | 3 дні |
| Історія позицій та угод | 3 дні |
Мінімальний маржинальний модуль: 4–5 тижнів. Повноцінна система з Cross/Isolated, історією займів, детальною аналітикою позицій — 2–3 місяці.







