Реализация размещения стоп-ордера в мобильном приложении биржи
Стоп-ордер — это условная заявка. Пока цена не пересечёт 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 — ордер никогда не исполнится на практике (рынок провалится сквозь оба уровня). Рекомендуемый gap: limitPrice на 0.1–0.5% ниже stopPrice при продаже.
// iOS — валидация gap между 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 при срабатывании.







