Інтеграція бота з API OKX

Проєктуємо та розробляємо блокчейн-рішення повного циклу: від архітектури смарт-контрактів до запуску DeFi-протоколів, NFT-маркетплейсів та криптобірж. Аудит безпеки, токеноміка, інтеграція з наявною інфраструктурою.
Показано 1 з 1Усі 1306 послуг
Інтеграція бота з API OKX
Простий
~2-3 дні
Часті запитання

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

Етапи блокчейн-розробки

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1285
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1198
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    902
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1121
  • image_logo-advance_0.webp
    Розробка логотипу компанії B2B Advance
    589
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    856

Інтеграція бота з API OKX

OKX (раніше OKEx) — третя за обсягом централізована біржа. Надає REST та WebSocket V5 API для spot, futures, options та margin. Ключова особливість: уніфікований аккаунт (Unified Account) дозволяє торгувати всіма продуктами з одного балансу.

Аутентифікація

OKX вимагає три заголовки для приватних запитів: API key, timestamp, signature та 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

Торговельні операції

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", [])

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

Тип Формат Приклад
Spot {BASE}-{QUOTE} BTC-USDT
Perpetual (USDT) {BASE}-{QUOTE}-SWAP BTC-USDT-SWAP
Futures квартальні {BASE}-{QUOTE}-YYMMDD BTC-USDT-241227
Options {BASE}-{QUOTE}-YYMMDD-STRIKE-C/P BTC-USD-241227-50000-C

OKX Sandbox доступна через заголовок x-simulated-trading: 1 — не потребує окремого URL. Офіційний Python SDK: pip install python-okx. Документація: okx.com/docs-v5.