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.
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:, де одразу б'ється по інтерфейсу без жодної затримки. Такий цикл за секунду випустить десятки-сотні запитів, миттєво впреться в ліміт, а у важких випадках весь ключ ненадовго обмежать. У будь-якому частому циклі лишай паузи.
На практиці: наш власний промах
fetch_ticker для десятка з гаком пар без жодної затримки, ще й забули ввімкнути enableRateLimit. Менш ніж за хвилину термінал почав сипати RateLimitExceeded (тобто 50011), а наступні запити майже всі пропадали. Ми зробили два кроки: спершу додали при ініціалізації 'enableRateLimit': True, потім обгорнули запит кожної пари у ту функцію відкату with_retry вище. Перезапустили — усі десяток із гаком пар повернулися нормально, зрідка спрацьовував відкат на одну-дві спроби, секунда-дві очікування — і все, за весь прохід сканера ліміт частоти більше не вилазив. Висновок прямий: б'єш по інтерфейсу в циклі — обмеження швидкості й відкат це стандарт, а не опція.
Поширені запитання
Як читати помилку 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.
Ціни на криптоактиви різко коливаються, ф'ючерси й плече можуть призвести до повної втрати капіталу. Квант і автоматизована торгівля не гарантують прибутку — використовуй лише кошти, втрату яких можеш дозволити.