Реалізація розміщення 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 при виконанні.







