Реалізація розміщення стоп-ордера в мобільному додатку біржі
Стоп-ордер — умовна заявка. Поки ціна не перетне stopPrice, ордер в ордербуці не з'являється. Досягла stopPrice — біржа автоматично розміщує лімітний (STOP_LOSS_LIMIT) або рринковий (STOP_LOSS) ордер. Користувачі плутають stopPrice та limitPrice: половина звернень в саппорт крипто-додатків — саме про це. Значить, UI повинен пояснювати механізм, а не просто рисувати два поля.
Типи стоп-ордерів та їх UX
STOP_LOSS_LIMIT (Binance) — три параметри:
-
stopPrice— тригер (ціна активації) -
price— лімітна ціна виконання -
quantity— об'єм
STOP_LOSS (рринковий) — тільки stopPrice та quantity. Після тригера виконується по ринку — гарантія виходу, але без гарантії ціни.
TAKE_PROFIT_LIMIT — аналогічна структура, але логіка зворотна: ордер активується при зростанні ціни вище stopPrice (для фіксації прибутку).
UI-рішення: розділити на два підрежими «Обмежити убиток» та «Зафіксувати прибуток» з візуальною діаграмою ціни. Показувати стрілку: «Ціна активації → Лімітна ціна виконання».
Валідація логіки цін
Типова ошибка: stopPrice та limitPrice рівні або limitPrice гірше stopPrice. Якщо при STOP_LOSS_LIMIT для продажу limitPrice >= stopPrice — ордер ніколи не виконається на практиці (ринок провалиться крізь обидва рівні). Рекомендований зазор: limitPrice на 0.1–0.5% нижче stopPrice при продажу.
// iOS — валідація зазору між stopPrice та limitPrice
func validateStopLimitPrices(stop: Decimal, limit: Decimal, side: OrderSide) -> ValidationResult {
switch side {
case .sell:
guard limit < stop else { return .error("Лімітна ціна повинна бути нижче ціни активації") }
let gap = (stop - limit) / stop
if gap < 0.001 { return .warning("Малий зазор — ризик неісполнення при різкому русі") }
case .buy:
guard limit > stop else { return .error("Лімітна ціна повинна бути вище ціни активації") }
}
return .valid
}
Відображення в списку ордерів
Стоп-ордер у стані очікування (PENDING) повинен відрізнятися візуально від активних. Мітка «Стоп» або «Умовний», ціна активації — крупно, лімітна — менше. Прогресс-бар «відстань до тригера» як % поточної ціни — корисний, але опціональний.
При WebSocket-подієї зміни статусу (executionReport з X=PENDING_CANCEL → FILLED) — відправити push-сповіщення: «Стоп-ордер сработав: продано 0.5 BTC по 41 200 USDT».
Часовий графік: 2–3 дні: три поля з валідацією логіки цін, підказки по механіці роботи ордера, відображення статусу в списку, push при срабативанні.







