Інтеграція бота з API OKX
При автоматизації торгівлі на OKX ми стикаємося з неочевидними граблями: підпис запиту, управління позиціями через єдиний акаунт, WebSocket-реконнекти. Наша команда за 5 років виконала понад 30 інтеграцій торгових ботів з OKX, і кожна друга заявка від клієнтів стосувалася саме цієї біржі. Найчастіше проблеми виникають через невірний підпис — 401 помилка при кожній спробі, або неправильний режим торгівлі tdMode, що загрожує примусовим закриттям позицій. Розберемо, як уникнути цих помилок і зробити стабільну інтеграцію, що працює без збоїв.
OKX (колишній OKEx) — третя за обсягом централізована біржа з щоденним обсягом близько $5 млрд. Надає REST та WebSocket V5 API для spot, futures, options, margin. Особливість: єдиний акаунт (Unified Account) дозволяє торгувати всіма продуктами з одного балансу. Ми гарантуємо стабільність роботи інтеграції та надаємо підтримку після запуску.
Чому інтеграція бота з OKX складніше, ніж здається?
Основні підводні камені:
- Підпис запиту: OKX вимагає три заголовки та passphrase. Помилка в кодуванні підпису призводить до 401 помилки. Ми реалізували модуль аутентифікації, який протестований на тисячах запитів.
-
Єдиний акаунт: Позиції по споту, ф'ючерсам та опціонам прив'язані до одного балансу. Необхідно правильно вказувати
tdMode(cash, cross, isolated). Невірний режим може призвести до непередбаченої ліквідації. - WebSocket реконнекти: При розриві з'єднання потрібно повторно авторизуватися. Ми використовуємо механізм exponential backoff та перепідписку на канали.
Як виправити 401 помилку?
Перевірте, що timestamp у форматі UTC, passphrase збігається з вказаним при створенні ключа, а body для GET-запитів пустий. Також переконайтеся, що термін дії API-ключа не закінчився.Як правильно підписати запит до OKX?
OKX вимагає три заголовки для приватних запитів: API key, timestamp, signature, passphrase. Кроки:
- Створити рядок
timestamp + method + path + body. - Підписати його HMAC-SHA256 з secret key.
- Закодувати підпис у base64.
- Передати в заголовках
OK-ACCESS-KEY,OK-ACCESS-SIGN,OK-ACCESS-TIMESTAMP,OK-ACCESS-PASSPHRASE.
import hmac import hashlib import base64 import time import json import httpx class OKXClient: BASE_URL = "https://www.okx.com" def __init__(self, api_key: str, secret_key: str, passphrase: str, sandbox: bool = False): self.api_key = api_key self.secret_key = secret_key self.passphrase = passphrase if sandbox: self.BASE_URL = "https://www.okx.com" # sandbox через флаг в заголовке def _sign(self, timestamp: str, method: str, path: str, body: str = "") -> str: message = timestamp + method.upper() + path + body signature = hmac.new( self.secret_key.encode('utf-8'), message.encode('utf-8'), hashlib.sha256 ).digest() return base64.b64encode(signature).decode() def _headers(self, method: str, path: str, body: str = "", sandbox: bool = False) -> dict: timestamp = time.strftime('%Y-%m-%dT%H:%M:%S.000Z', time.gmtime()) headers = { "OK-ACCESS-KEY": self.api_key, "OK-ACCESS-SIGN": self._sign(timestamp, method, path, body), "OK-ACCESS-TIMESTAMP": timestamp, "OK-ACCESS-PASSPHRASE": self.passphrase, "Content-Type": "application/json" } if sandbox: headers["x-simulated-trading"] = "1" return headers Як розміщувати ордери на OKX через API?
async def place_order( self, inst_id: str, # 'BTC-USDT' для spot, 'BTC-USDT-SWAP' для perpetual td_mode: str, # 'cash' (spot), 'cross' або 'isolated' (futures) side: str, # 'buy' або 'sell' ord_type: str, # 'market', 'limit', 'post_only', 'fok', 'ioc' sz: str, # розмір px: str = None # ціна (для limit) ) -> dict: path = "/api/v5/trade/order" payload = { "instId": inst_id, "tdMode": td_mode, "side": side, "ordType": ord_type, "sz": sz } if px: payload["px"] = px body = json.dumps(payload) async with httpx.AsyncClient() as client: response = await client.post( f"{self.BASE_URL}{path}", content=body, headers=self._headers("POST", path, body) ) data = response.json() if data["code"] != "0": raise OKXError(f"Order failed: {data['msg']}") return data["data"][0] async def get_positions(self, inst_type: str = "SWAP") -> list: path = f"/api/v5/account/positions?instType={inst_type}" async with httpx.AsyncClient() as client: response = await client.get( f"{self.BASE_URL}{path}", headers=self._headers("GET", path) ) return response.json().get("data", []) Основні параметри ордера:
| Параметр | Тип | Опис |
|---|---|---|
| instId | string | Ідентифікатор інструменту (наприклад 'BTC-USDT') |
| tdMode | string | Режим торгівлі: 'cash', 'cross', 'isolated' |
| side | string | 'buy' або 'sell' |
| ordType | string | Тип ордера: 'market', 'limit', 'post_only', 'fok', 'ioc' |
| sz | string | Розмір (кількість або контракти) |
| px | string | Ціна (обов'язковий для limit) |
При розміщенні ордера OKX повертає код '0' при успіху. Всі інші коди (наприклад, '51000' — недостатньо коштів) потрібно обробляти окремо. Ми додали парсинг всіх кодів помилок з рекомендаціями.
Як підписатися на стріми OKX через WebSocket?
class OKXWebSocket: WS_PUBLIC = "wss://ws.okx.com:8443/ws/v5/public" WS_PRIVATE = "wss://ws.okx.com:8443/ws/v5/private" async def subscribe_trades(self, inst_id: str): async with websockets.connect(self.WS_PUBLIC) as ws: await ws.send(json.dumps({ "op": "subscribe", "args": [{"channel": "trades", "instId": inst_id}] })) async for msg in ws: data = json.loads(msg) if data.get("arg", {}).get("channel") == "trades": for trade in data.get("data", []): await self.on_trade(trade) async def login_private(self, ws): """Аутентифікація в приватному WebSocket""" timestamp = str(int(time.time())) sign = base64.b64encode( hmac.new( self.secret_key.encode(), f"{timestamp}GET/users/self/verify".encode(), hashlib.sha256 ).digest() ).decode() await ws.send(json.dumps({ "op": "login", "args": [{ "apiKey": self.api_key, "passphrase": self.passphrase, "timestamp": timestamp, "sign": sign }] })) За відгуками наших клієнтів, інтеграція з OKX на 20-30% швидше за часом розробки порівняно з Binance, завдяки більш продуманій документації. WebSocket OKX дає затримку стрімів в середньому на 15% нижче, ніж у Bybit — це критично для арбітражних стратегій та високочастотної торгівлі.
Які інструменти підтримує OKX?
| Тип | Формат | Приклад |
|---|---|---|
| Spot | {BASE}-{QUOTE} |
BTC-USDT |
| Perpetual (USDT) | {BASE}-{QUOTE}-SWAP |
BTC-USDT-SWAP |
| Futures quarterly | {BASE}-{QUOTE}-YYMMDD |
BTC-USDT-YYMMDD |
| Options | {BASE}-{QUOTE}-YYMMDD-STRIKE-C/P |
BTC-USD-YYMMDD-50000-C |
OKX Sandbox доступний за x-simulated-trading: 1 заголовком — не вимагає окремого URL. Офіційний Python SDK: pip install python-okx. Документація: OKX API.
Що входить в роботу при замовленні інтеграції?
- Аналіз вимог та проектування архітектури
- Реалізація модуля аутентифікації та маршрутизації
- Інтеграція REST API для торгових операцій
- Підключення WebSocket для стрімів цін та угод
- Тестування на sandbox-оточенні
- Навантажувальне тестування та перевірка стійкості
- Документація API та інструкція з експлуатації
- Підтримка протягом 30 днів після запуску
Типові помилки та їх рішення
Невірний підпис — причина №1 401 помилок. Перевірте, що timestamp в UTC, тіло запиту пусте для GET, і passphrase збігається з оригінальним. Закінчення терміну дії API-ключа: встановіть термін дії не менше 90 днів. Перевищення лімітів: OKX дозволяє 20 запитів на секунду на більшість ендпоінтів — додайте троттлінг. Ніколи не ігноруйте поле code: код 51000 говорить про недостачу коштів, а 50000 — про помилку системи.
Що дає єдиний акаунт OKX?
Єдиний акаунт дозволяє використовувати один баланс для всіх типів торгівлі: спот, ф'ючерси, опціони та маржинальна торгівля. Це спрощує управління капіталом та знижує необхідність переказу коштів між субрахунками. Для розробників це означає, що не потрібно писати окремі модулі для кожного продукту — достатньо коректно вказати tdMode та instId.
Строки та вартість
Строк інтеграції типового рішення — від 10 робочих днів. Вартість розраховується індивідуально в залежності від обсягу необхідного функціоналу (наприклад, підтримка ф'ючерсів або опціонів). Ми оцінимо ваш проект за 1 день і запропонуємо оптимальне рішення. Автоматизація торгівлі знижує прослизання на 10-15%, що при обороті $100 тис. дає економію до 15% на місяць. Отримайте консультацію — обговоримо деталі. Наша команда — 5 років досвіду в Web3, 30 інтеграцій з біржами, 10+ з OKX. Замовте інтеграцію.







