Реализация маржинальной торговли в мобильном приложении биржи
Маржинальная торговля — это работа с заёмными средствами. Пользователь вносит залог (маржу), биржа предоставляет кредитное плечо 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 месяца.







