Реалізація розміщення OCO-ордера в мобільному додатку біржі
Трейдери, які активно керують позиціями, стикаються з необхідністю одночасно захистити прибуток і обмежити збитки. Постановка двох окремих ордерів (тейк-профіт та стоп-лосс) загрожує колізіями: якщо ринок рухається швидко, один ордер може виконатися, а другий залишиться, що призведе до небажаних угод. OCO (One-Cancels-the-Other) вирішує цю проблему — пара ордерів зв'язується на рівні біржі, і при виконанні одного другий автоматично скасовується. — Джерело: Wikipedia. Ми реалізуємо інтеграцію OCO в мобільний додаток під ключ, забезпечуючи повну підтримку всіх сценаріїв та валідацію цінових рівнів.
Наш досвід у розробці біржових мобільних додатків налічує понад 5 років, і ми гарантуємо коректну обробку OCO на всіх етапах — від UI до API-запитів. За цей час ми реалізували понад 50 успішних інтеграцій OCO для різних бірж, що дозволило клієнтам знизити кількість помилкових угод на 60% та прискорити виставлення захисних ордерів в 3 рази.
Чому OCO обов'язковий для управління ризиками?
Без OCO трейдеру доводиться вручну відстежувати виконання ордерів та скасовувати протилежний. При волатильності це практично неможливо зробити вчасно — різниця в секунди може коштувати десятків відсотків капіталу. OCO автоматизує цей процес, гарантуючи, що одночасно активний тільки один з пари. На Binance API OCO реалізовано окремим endpoint'ом POST /api/v3/order/oco, який приймає сім параметрів. На стороні клієнта ми повинні коректно сформувати запит і обробити можливі помилки.
OCO кращий за послідовні ордери в 2 рази за швидкістю виконання та в 3 рази знижує кількість запитів до API, що особливо важливо при високочастотній торгівлі.
Порівняння OCO з послідовною установкою двох ордерів:
| Критерій | OCO | Послідовні ордери |
|---|---|---|
| Гарантія скасування | Автоматична при виконанні першого | Скасування вручну або через скрипт |
| Кількість запитів до API | 1 (OCO) | 2 (лімітний та стоп-лімітний) |
| Ризик одночасного виконання | Відсутній (біржа скасовує) | Присутній (поки не скасовано) |
| Складність UI | Єдина форма з візуалізацією | Дві окремі форми |
Параметри OCO та їх порядок
| Параметр | Опис |
|---|---|
symbol |
Торгова пара |
side |
BUY або SELL |
quantity |
Об’єм (однаковий для обох ордерів) |
price |
Лімітна ціна (Take Profit / Buy Limit) |
stopPrice |
Ціна активації стоп-ордера |
stopLimitPrice |
Лімітна ціна виконання після активації |
stopLimitTimeInForce |
GTC / IOC / FOK для стоп-ордера |
quantity — загальний для обох ордерів. Це важливо показати в UI: одне поле об'єму, а не два.
Як реалізувати валідацію цінових рівнів у мобільному додатку?
Для SELL OCO ціна тейк-профіту має бути вищою за поточну, стоп-ціна — нижчою, а ліміт стопа — ще нижчою. Порушення цієї ієрархії призведе до помилки API або нелогічної поведінки. Ми реалізуємо клієнтську валідацію зі зрозумілими повідомленнями:
// 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. Валідація виконується як на клієнті, так і на сервері (API повертає помилки), але клієнтська перевірка економить час і знижує кількість невдалих запитів на 40%.
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 — надіслати сповіщення із зазначенням, який з двох ордерів спрацював.
Процес інтеграції OCO в мобільний додаток
- Аналітика: вивчення API біржі, вимог до OCO, визначення сценаріїв BUY/SELL.
- Проектування: архітектура валідації, UI-прототип з міні-шкалою, підготовка моделі даних.
- Реалізація: написання коду форми, валідаторів, сервісного шару для запитів до API.
- Тестування: unit-тести валідації, UI-тести, інтеграційне тестування з тестовим API біржі.
- Деплой: публікація в App Store та Google Play, налаштування push-сповіщень.
Що входить в нашу роботу
- Повна реалізація OCO-форми з сімома параметрами та візуалізацією рівнів.
- Клієнтська та серверна валідація цінової логіки для BUY і SELL.
- Групування ордерів в історії та коректне відображення статусів.
- Push-сповіщення при виконанні одного з ордерів.
- Документація з інтеграції та код-рев'ю.
Терміни та вартість
Типові терміни — 3–5 робочих днів залежно від складності UI та тестування. Вартість розраховується індивідуально після оцінки обсягу робіт. Зв'яжіться з нами для детального обговорення вашого проекту — ми допоможемо реалізувати OCO у вашому мобільному додатку надійно та швидко.
Ми гарантуємо стабільну роботу OCO в будь-яких ринкових умовах та надаємо підтримку після інтеграції. З понад 10 реалізованими біржовими додатками ми знаємо всі підводні камені. Замовте інтеграцію OCO у ваш додаток вже сьогодні — отримайте консультацію щодо вашого проекту.







