Реализация размещения OCO-ордера в мобильном приложении биржи
OCO (One-Cancels-the-Other) — это пара из лимитного и стоп-лимитного ордера, связанных на уровне биржи: при исполнении одного второй отменяется автоматически. Классическое применение: купил BTC по 40 000, поставил Take Profit на 45 000 (лимитный) и Stop Loss на 38 000 (стоп-лимитный). Какой сработает первым — второй исчезает.
На Binance API OCO — отдельный endpoint: POST /api/v3/order/oco. Он принимает семь параметров одновременно, и у него своя логика ошибок. Интерфейс должен помочь пользователю корректно заполнить все семь полей, не запутавшись.
Параметры OCO и их порядок
| Параметр | Описание |
|---|---|
symbol |
Торговая пара |
side |
BUY или SELL |
quantity |
Объём (одинаковый для обоих ордеров) |
price |
Лимитная цена (Take Profit / Buy Limit) |
stopPrice |
Цена активации стоп-ордера |
stopLimitPrice |
Лимитная цена исполнения после активации |
stopLimitTimeInForce |
GTC / IOC / FOK для стоп-ордера |
quantity — общий для обоих ордеров. Это важно показать в UI: одно поле объёма, а не два.
Логика валидации цен для SELL OCO
При продаже: price > currentPrice > stopPrice > stopLimitPrice.
// Android — валидация ценовой логики OCO SELL
data class OcoValidationError(val field: String, val message: String)
fun validateOcoSell(
currentPrice: BigDecimal,
limitPrice: BigDecimal,
stopPrice: BigDecimal,
stopLimitPrice: BigDecimal
): List<OcoValidationError> {
val errors = mutableListOf<OcoValidationError>()
if (limitPrice <= currentPrice)
errors += OcoValidationError("price", "Take Profit должен быть выше текущей цены")
if (stopPrice >= currentPrice)
errors += OcoValidationError("stopPrice", "Stop цена должна быть ниже текущей цены")
if (stopLimitPrice >= stopPrice)
errors += OcoValidationError("stopLimitPrice", "Лимит стопа должен быть ниже цены активации")
return errors
}
Для BUY OCO логика зеркальная: stopLimitPrice > stopPrice > currentPrice > price.
UI-концепция: одна карточка — два уровня
Показывать OCO как единую карточку с визуализацией трёх ценовых уровней на мини-шкале:
▲ Take Profit: 45 000 USDT (лимитный ордер)
│
● Текущая цена: ~41 500 USDT
│
▼ Stop: 38 500 → Limit: 38 200 USDT (стоп-лимитный)
Цвет: зелёный для Take Profit, красный для Stop Loss. Это снижает когнитивную нагрузку и число ошибок при заполнении.
Отмена и статусы
OCO на Binance имеет orderListId — ID группы. При отображении в истории ордеров группируй оба ордера под одним orderListId. Если один исполнен — второй помечается как CANCELED с причиной OTHER_SIDE_CANCELED.
Событие в WebSocket: listOrderStatus с типом OCO. При переходе в ALL_DONE — отправить уведомление с указанием, какой из двух ордеров сработал.
Сроки: 3–5 дней: форма с семью параметрами, мини-шкала визуализации цен, валидация логики для BUY/SELL, группировка в истории ордеров, push при исполнении.







