MeowQuant — незалежний сторонній інформаційний сайт, а не офіційний OKX. Кнопка реєстрації містить код запрошення OK30001, і ми можемо отримати за це винагороду за просування. Повне розкриття →

OKX · API на практиці

Поширені помилки OKX API та чек-лист діагностики: виправляй за цією таблицею

Хто пише квант-скрипти, у вісьмох випадках із десяти застрягає не на стратегії, а на одному червоному рядку помилки: скрипт запускається, у термінал вилазить незрозумілий code з англійським текстом — і людина впадає в ступор. Хороша новина: помилок OKX API лише кілька частих різновидів, і коли розумієш, як кожна виглядає й якій причині відповідає, діагностика стає набагато швидшою.

У цій статті ми (команда MeowQuant) звели в чек-лист помилки, на які наступали самі й які раз по раз бачили у спільнотах. Ядро — таблиця кодів помилок: щось зламалося — спершу знайди в таблиці за кодом чи ключовим словом, а потім дивись відповідну покрокову діагностику нижче. Прочитавши, ти зможеш розв'язувати більшість помилок самотужки за лічені хвилини, а не тупити в червоний текст.

Спершу навчись читати помилку: code + msg

Перший крок діагностики — зрозуміти саму помилку. Коли інтерфейс OKX повертає помилку, у ній три речі:

  • HTTP-статус: найгрубший шар, наприклад 401 (проблема автентифікації), 429 (забагато запитів), 400 (проблема в самому запиті).
  • code: власний числовий код помилки OKX, найточніше вказує на тип проблеми. Це твоя головна опора в діагностиці.
  • msg: текстовий опис, допомагає підтвердити напрямок, інколи прямо вказує, яке поле хибне.

Якщо ти на ccxt, він загортає ці сирі помилки в зручніші типи винятків: проблему автентифікації кидає як AuthenticationError, ліміт частоти — RateLimitExceeded, брак коштів — InsufficientFunds. У тексті винятку зазвичай є й оригінальні code та msg від OKX. Гарна звичка — обгорнути все у try/except і чітко вивести:

import ccxt

okx = ccxt.okx({
    'apiKey':   'твій_apiKey',
    'secret':   'твій_secret',
    'password': 'твій_Passphrase',
    'enableRateLimit': True,
})

try:
    balance = okx.fetch_balance()
    print('USDT доступно:', balance['USDT']['free'])
except ccxt.AuthenticationError as e:
    print('Автентифікація не вдалася, перевір три облікові дані й системний час:', e)
except ccxt.RateLimitExceeded as e:
    print('Спрацював ліміт частоти, сповільни запити:', e)
except ccxt.BaseError as e:
    print('Інша помилка, дивись оригінальні code/msg:', e)

Запиши той рядок code й msg із винятку дослівно, звір із таблицею нижче — і майже завжди локалізуєш, до якого класу проблем це належить.

Таблиця частих помилок

Ця таблиця охоплює кілька помилок, на які новачки наштовхуються найчастіше. Коди наводимо за чинною документацією OKX API v5 (OKX інколи коригує значення кодів; якщо щось не збігається — орієнтуйся на текст msg і офіційну документацію), а суть — поєднати «причину → як виправити».

Помилка (code / ключове слово)Найімовірніша причинаЯк виправити
50011
Too Many Requests / ліміт частоти
Надто щільні запити спрацювали на захист від перевищення частоти Увімкни enableRateLimit; усе одно впираєшся — додай повтор з експоненційним відкатом, не використовуй цикл while без затримки
Invalid sign
автентифікація не вдалася
Невірний підпис: найчастіше помилка в Passphrase, або apiKey/secret скопійовано неправильно, або неточний системний час По черзі звір три облікові дані на пробіли/відсутні символи; переконайся, що в password вписано Passphrase; синхронізуй системний час
API key недійсний
APIKey does not exist
apiKey скопійовано неправильно, його видалено або використано не те середовище (реальний key як демо) Скопіюй apiKey з кабінету заново; переконайся, що ключ ще існує й не видалений; звір перемикач sandbox із середовищем
Помилка Passphrase
passphrase incorrect
У поле password у ccxt уписано пароль для входу, а не Passphrase, заданий при створенні ключа Заміни password на Passphrase, який ти задав при створенні того ключа; не пам'ятаєш — лишається видалити ключ і створити заново
Недостатньо коштів
Insufficient balance
Сума ордера перевищує доступний баланс, або кошти на іншому рахунку (наприклад, фінансовий vs торговий) Зменш обсяг ордера; переконайся, що кошти на торговому рахунку; на демо можна скинути віртуальні кошти
Застаріла часова мітка
timestamp expired
Системний час локальної машини відхилився надто сильно, мітка підпису вийшла за допуск OKX Увімкни автокорекцію часу через NTP, синхронізуй системний час; хмарні сервери зазвичай уже мають це ввімкнене
Недостатньо прав
permission denied
Цей ключ не має потрібного права (типово: поставлено лише читання, без торгівлі) Зайди в керування API й додай цьому ключу право «Торгівля», перестворювати не треба
IP не в білому списку
IP not allowed
Ключу налаштовано білий список IP, але поточна вихідна адреса не в списку (змінилася мережа/увімкнено проксі/змінився IP) Додай поточну вихідну IP-адресу в білий список цього ключа; IP часто міняється — подумай поки не ставити білий список
Торгова пара не існує
instrument does not exist
Помилка у форматі symbol або ф'ючерсний формат для спотового ордера Спот пиши як BTC/USDT (великими зі слешем); спершу load_markets() подивись доступні пари
Невідповідність кількості/точності
size too small
Обсяг менший за мінімальний для пари, або неправильна кількість знаків точності Через load_markets() подивись limits і precision для цієї пари й округли за вимогою

Покрокова діагностика й виправлення

Таблиця дає напрямок, цей розділ — деталі. Обери ту помилку, на яку наштовхнувся, і дивись далі.

Автентифікаційні (Invalid sign / API key недійсний / помилка Passphrase)

Це зона найбільших провалів новачків; перевіряй у цьому порядку — влучатимеш найчастіше:

  • Спершу перевір Passphrase. У поле password у ccxt має бути вписано саме той Passphrase, який ти задав при створенні ключа — не пароль для входу й не secret. На цей пункт припадає більша половина провалів автентифікації.
  • Потім перевір apiKey / secret на помилку копіювання. Часто при вставці на початку/в кінці з'являються зайві пробіли або зникають один-два символи. Найнадійніше — скопіювати з кабінету заново.
  • Перевір ще й системний час. Неточний час робить мітку підпису застарілою, проявляється теж як помилка автентифікації. Увімкни корекцію через NTP.

Недостатньо прав

Типовий симптом — «можу перевірити баланс, не можу виставити ордер». Баланс іде через право читання, ордер — через право торгівлі, вони надаються окремо. Зайди в керування API в кабінеті OKX, знайди цей ключ і додай «Торгівлю» — перестворювати не треба. Якщо мимохідь ставив виведення — прибери: квант-ключ ніколи не повинен мати права виведення.

Недостатньо коштів

Окрім буквального браку грошей, є й прихована причина: у OKX різні рахунки (фінансовий, торговий тощо), і твої кошти можуть бути не на тому, з якого виставляється ордер. Переконайся, що кошти переведено на торговий рахунок. На демо — якщо віртуальні кошти скінчилися, скинь їх в інтерфейсі демо. Це теж перевага того, щоб спершу практикуватися на демо — проби й помилки не коштують справжніх грошей.

symbol / точність

Спотові пари в ccxt — це ВЕЛИКІ/ВЕЛИКІ з прямим слешем, наприклад BTC/USDT. Напишеш BTCUSDT, маленькими чи у ф'ючерсному форматі — буде помилка. Кількість надто мала або точність невірна — через load_markets() подивись мінімальний обсяг і точність для пари й роби за вимогою. Повний приклад виставлення ордера є в нашій статті Квант на OKX API.

Діагностуєш-діагностуєш, і виявляється, що проблема в самому рахунку? Якщо в тебе ще немає чистого рахунку спеціально під скрипти — варто відкрити окремий. Зареєструйся в OKX за нашим кодом запрошення OK30001 — буде знижка на комісії, і вона так само діє на ордери через API. Натисни тут, щоб зареєструватися в OKX і відкрити API →

Ліміт частоти й повтор із відкатом

Ліміт частоти (50011 / Too Many Requests) — те, на що скриптери впираються найчастіше і що варто запобігати наперед. Це не означає, що ти щось зробив не так, — просто надто щільні запити спрацювали на захист біржі. Обробляється у два шари:

Шар перший: увімкни вбудоване обмеження швидкості ccxt. При ініціалізації додай 'enableRateLimit': True, ccxt сам уставлятиме розумні паузи між запитами, і в більшості випадків цього кроку достатньо:

okx = ccxt.okx({
    'apiKey':   'твій_apiKey',
    'secret':   'твій_secret',
    'password': 'твій_Passphrase',
    'enableRateLimit': True,   # автообмеження швидкості, вмикай одразу
})

Шар другий: додай повтор з експоненційним відкатом. Якщо твоя стратегія в певні моменти справді шле дуже щільно (наприклад, одночасно опитує багато пар), самого автообмеження може бракувати, і ти інколи впиратимешся. Тоді обгорни ключові запити шаром повтору: уперся раз — чекай 1 с і повтори, ще раз — 2 с, 4 с, поступово збільшуючи, а після кількох спроб — здавайся з помилкою.

import ccxt, time

def with_retry(fn, max_tries=5):
    delay = 1
    for i in range(max_tries):
        try:
            return fn()
        except ccxt.RateLimitExceeded:
            print(f'Ліміт частоти, спроба {i+1}, чекаю {delay}с і повторюю')
            time.sleep(delay)
            delay *= 2          # експоненційний відкат: 1 → 2 → 4 → 8 ...
    raise RuntimeError('Кілька повторів — усе ще ліміт частоти, здаюся')

# Вжиток: кидай сюди виклик, який упирається в ліміт
ticker = with_retry(lambda: okx.fetch_ticker('BTC/USDT'))
print(ticker['last'])

Негативний приклад: не пиши while True:, де одразу б'ється по інтерфейсу без жодної затримки. Такий цикл за секунду випустить десятки-сотні запитів, миттєво впреться в ліміт, а у важких випадках весь ключ ненадовго обмежать. У будь-якому частому циклі лишай паузи.

На практиці: наш власний промах

📋 Тест редакції · 2026-06-05
О 16:47 ми на демо OKX відлагоджували скрипт-сканер кількох пар, і з порога в циклі підряд викликали fetch_ticker для десятка з гаком пар без жодної затримки, ще й забули ввімкнути enableRateLimit. Менш ніж за хвилину термінал почав сипати RateLimitExceeded (тобто 50011), а наступні запити майже всі пропадали. Ми зробили два кроки: спершу додали при ініціалізації 'enableRateLimit': True, потім обгорнули запит кожної пари у ту функцію відкату with_retry вище. Перезапустили — усі десяток із гаком пар повернулися нормально, зрідка спрацьовував відкат на одну-дві спроби, секунда-дві очікування — і все, за весь прохід сканера ліміт частоти більше не вилазив. Висновок прямий: б'єш по інтерфейсу в циклі — обмеження швидкості й відкат це стандарт, а не опція.
Попередження про ризик: розв'язана помилка означає лише, що скрипт працює, а не що він заробляє. Страшніше за червоний рядок те, коли скрипт без помилок чесно й безперервно виставляє хибні ордери. Ціни на криптоактиви різко коливаються, капітал може суттєво зменшитися аж до нуля; автоматизована торгівля може збільшити збитки, а торгівля з ф'ючерсами й плечем може призвести до 100% втрати капіталу. Ця стаття — впорядкування технічного матеріалу, вона не є інвестиційною порадою; використовуй лише кошти, втрату яких можеш дозволити повністю, і дотримуйся місцевих законів.

Поширені запитання

Як читати помилку OKX API?

Коли інтерфейс OKX повертає помилку, у відповіді є code (числовий код помилки), msg (текстовий опис) і HTTP-статус. Дивись спершу code — він найточніше вказує на тип проблеми; msg допомагає підтвердити напрямок. У ccxt помилка зазвичай загорнута у відповідний тип винятку (наприклад, AuthenticationError, RateLimitExceeded, InsufficientFunds), і в тексті винятку зазвичай є оригінальні code та msg від OKX. Просто пошукай цей рядок дослівно — і майже завжди локалізуєш проблему.

Чому постійно вилазить помилка автентифікації / Invalid sign?

Три найчастіші причини помилок автентифікації: перша — у поле password у ccxt не вписано Passphrase від OKX (помилково вписано пароль для входу); друга — при копіюванні apiKey чи secret з'явилися зайві пробіли або зникли символи; третя — неточний системний час, через що часова мітка підпису застаріла. Перевіряй у цьому порядку — і переважна більшість Invalid sign вирішується.

Що робити при ліміті частоти (50011 / Too Many Requests)?

Ліміт частоти — це захист, який спрацьовує від надто щільних запитів. Найпростіше рішення — увімкнути enableRateLimit при ініціалізації ccxt, він сам уставлятиме паузи між запитами. Якщо все одно впираєшся — додай у код повтор з експоненційним відкатом: уперся раз — чекай 1 с, ще раз — 2 с, 4 с, поступово збільшуючи. Не бий по інтерфейсу циклом while True без затримки.

Можу перевірити баланс, але ордер видає недостатньо прав — чому?

Перевірка балансу — це право читання, виставлення ордера — право торгівлі, при створенні ключа вони надаються окремо. Можеш дивитися, але не можеш виставляти — практично завжди це означає, що поставлено лише читання без торгівлі. Зайди в керування API в кабінеті OKX і додай цьому ключу право торгівлі — перестворювати не треба.

Що означає застаріла часова мітка (timestamp expired)?

OKX має допуск на часову мітку в запиті; якщо системний час твого комп'ютера чи сервера неточний і відхилення перевищує допуск, підпис буде відхилено через застарілу мітку. Рішення — синхронізувати системний час із точним мережевим, увімкнути автокорекцію через NTP. Хмарні сервери зазвичай мають це за замовчуванням, локальні машини інколи «пливуть».

Чому видає «торгова пара не існує»?

Найімовірніше, помилка у форматі symbol. У ccxt спотові пари — великими літерами з прямим слешем, наприклад BTC/USDT; напишеш BTCUSDT, btc/usdt чи візьмеш ф'ючерсний формат для спотового ордера — отримаєш «торгова пара не існує». Не впевнений — спершу print(okx.load_markets().keys()) і подивись, які пари взагалі доступні.

Коли пройдеш цей етап діагностики, твій скрипт перестане застрягати на дрібницях. Далі варто витратити час на те, щоб вписати ризик-менеджмент у код — страшніше за помилку те, коли скрипт без помилок безперервно виставляє хибні ордери. І не забувай: новий код спершу кидай у демо, діагностика не коштуватиме справжніх грошей.

Діагностику налагоджено — готовий до серйозних стратегій?

Спершу підготуй рахунок і API, на демо налаштуй процес і відлов помилок, а потім переходь на справжні гроші. Новий рахунок, зареєстрований за кодом запрошення, має знижку на комісії, і вона так само діє на ордери через API.

OK30001 Реєстрація OKX із OK30001 →

Ціни на криптоактиви різко коливаються, ф'ючерси й плече можуть призвести до повної втрати капіталу. Квант і автоматизована торгівля не гарантують прибутку — використовуй лише кошти, втрату яких можеш дозволити.