Торговый бот на OKX: интеграция API под ключ

Интеграция бота с API OKX При автоматизации торговли на OKX мы сталкиваемся с неочевидными граблями: подпись запроса, управление позициями через единый аккаунт, WebSocket-реконнекты. Наша команда за 5 лет выполнила более 30 интеграций торговых ботов с OKX, и каждая вторая заявка от клиентов касал

Направления блокчейн-разработки

Часто задаваемые вопросы

Последние работы

  • image_website-b2b-advance_0.webp
    Разработка сайта компании B2B ADVANCE
    1450
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1308
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    1003
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1269
  • image_logo-advance_0.webp
    Разработка логотипа компании B2B Advance
    719
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    1009

Интеграция бота с 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. Шаги:

  1. Создать строку timestamp + method + path + body.
  2. Подписать её HMAC-SHA256 с secret key.
  3. Закодировать подпись в base64.
  4. Передать в заголовках 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. Закажите интеграцию.