Реализация размещения рыночного ордера в мобильном приложении биржи
Рыночный ордер исполняется немедленно по лучшей доступной цене. Пользователь вводит только количество — цену не указывает. Это делает UI проще лимитного, но добавляет другую проблему: slippage. Пользователь нажал «Купить» при цене 42 000, а исполнился по 42 150 — и это нормально, но нужно показать это заранее.
Отображение ожидаемой цены исполнения
Рыночная цена меняется постоянно. Показывай в форме текущую лучшую цену из ордербука (ask для покупки, bid для продажи), обновляя её через WebSocket. Рядом — оценочная стоимость сделки: Amount × bestAsk. Подпись «Ориентировочно» и предупреждение о slippage при низкой ликвидности.
Низкая ликвидность — когда глубины ордербука не хватает, чтобы поглотить весь объём по первому уровню. Если пользователь хочет купить 10 BTC, а на лучшем уровне доступно только 3 BTC — реальная цена будет выше. Простая эвристика: пройтись по уровням ордербука и посчитать weighted average price (WAP) для указанного объёма.
// Android — расчёт средневзвешенной цены исполнения из снапшота ордербука
fun estimateMarketPrice(asks: List<Pair<BigDecimal, BigDecimal>>, targetQty: BigDecimal): BigDecimal {
var remaining = targetQty
var totalCost = BigDecimal.ZERO
for ((price, qty) in asks) {
val fill = minOf(remaining, qty)
totalCost += fill * price
remaining -= fill
if (remaining <= BigDecimal.ZERO) break
}
return if (remaining > BigDecimal.ZERO) BigDecimal.ZERO // недостаточно ликвидности
else totalCost.divide(targetQty, 8, RoundingMode.HALF_UP)
}
Поле ввода: количество или сумма
Для рыночного ордера биржи часто поддерживают два режима: указать количество базовой валюты (quoteOrderQty=false) или указать сумму в котируемой (quoteOrderQty в Binance). Переключатель BTC/USDT над полем Amount — стандартный UX. В режиме USDT пользователь вводит сумму, биржа сама рассчитывает количество.
Двойное подтверждение
Рыночный ордер нельзя отменить после отправки. Поэтому минимум — alert с кнопкой подтверждения. Для крупных сумм (выше порога, заданного в настройках) — требовать ввод PIN или биометрию заново.
Сроки: 2–3 дня включая WebSocket-обновление цены, расчёт WAP, переключатель режима ввода и диалог подтверждения.







