Эта страница переведена автоматически. Оригинал на английском языке является каноническим. Читать на английском
Перейти к основному содержимому

Ошибки и причины отклонения

Полный каталог кодов ошибок и причин отклонения.

Формат ответа с ошибкой

HTTP-ошибки (middleware)

Структурированные JSON-ошибки от middleware (HTTP 4xx/5xx):

{
"error": "<code>",
"message": "<human message>"
}

Отклонения на уровне движка (HTTP 200)

Торговые отклонения возвращаются с кодом HTTP 200 и OrderUpdateMessage.status = "REJECTED":

{
"timestamp": 1735000000000,
"info": { ... },
"status": "REJECTED",
"reason": "<exact rejection string>",
"filled_size": 0,
"order_id": null,
"wallet_address": "0x...",
"mmp_triggered": false
}

Важно: не полагайтесь на HTTP-коды состояния для торговых отклонений. Всегда проверяйте поля status и reason.

Коды ошибок middleware

Возвращаются как HTTP-ответы с ошибкой и структурированным JSON-телом.

КодHTTP-статусОписание
invalid_request400Не удаётся прочитать тело запроса
invalid_json400Ошибка парсинга JSON
missing_field400Отсутствует обязательное поле
invalid_wallet400Не удалось распарсить строку кошелька
invalid_parameter400Недопустимый параметр (например, size/price должны быть строками)
signature_verification_failed400Не удалось восстановить подпись EIP-712
unsupported_endpoint400Middleware не поддерживает этот путь
unauthorized401Подписант не авторизован для кошелька (ошибка авторизации агента)
internal_error500Непредвиденный сбой проверки авторизации агента

Причины отклонения на уровне движка

Появляются в OrderUpdateMessage.reason при status="REJECTED".

Истёкший инструмент

Причина: "Instrument has expired"

Источник: ордер размещён по инструменту, экспирация которого уже наступила.

Действие: проверьте экспирацию инструмента через GET /instruments или GET /markets.

Аккаунт без средств

Причина: "Account has no funds. Please deposit before trading."

Источник: денежный баланс аккаунта <= 0.0.

Действие: пополните кошелёк USDC перед началом торговли.

Недостаточная маржа

Причина: "Insufficient margin: required={:.2}, available={:.2}, shortfall={:.2}"

Пример: "Insufficient margin: required=1500.00, available=1200.00, shortfall=300.00"

Источник: предторговая проверка маржи выявила, что доступного обеспечения (эквити) недостаточно для покрытия маржинальных требований после предполагаемого ордера.

Для аккаунтов со стандартной маржой требуемое обеспечение зависит от стороны опциона, типа опциона, страйка, цены базового актива и текущего портфеля. См. Стандартная маржа с описанием актуальной маржинальной модели на момент запуска.

Действие:

  1. Проверьте портфель через GET /portfolio?wallet=...
  2. Изучите расчёт маржи в разделе Маржа
  3. Уменьшите размер позиции или добавьте обеспечение

Отсутствие спотовой цены

Причина: "Failed to get portfolio: No spot price available for underlying: {underlying}"

Источник: движок не может получить спотовую цену базового актива, необходимую для симуляции исполнения.

Действие: проверьте подключение к фиду спотовых цен Hyperliquid. Спотовые цены поступают из WebSocket-фида allMids.

Ограничения по тирам

Причина: "Tier1 users cannot go short. Filled long position: {filled}, total sell orders (including new): {total} (symbol: {symbol})"

Источник: кошелёк имеет уровень tier1 (только длинные позиции) и попытался продать без достаточной исполненной длинной позиции.

Действие:

  1. Проверьте уровень через GET /user-tier?wallet=...
  2. Убедитесь, что все продажи покрыты исполненными длинными позициями
  3. Свяжитесь с Hypercall, если вам нужен доступ продавца опционов для интеграции маркетмейкера

Недопустимый символ

Причина: "Invalid symbol: {symbol}"

Источник: для данного символа не существует книги заявок.

Действие:

  1. Проверьте существование рынка через GET /instrument-specs и GET /markets
  2. Проверьте формат символа: UNDERLYING-YYYYMMDD-STRIKE-(C|P)

Ошибка парсинга символа

Причина: "Failed to parse symbol: {detail}"

Источник: символ не соответствует ожидаемому формату.

Действие: убедитесь, что формат символа соответствует UNDERLYING-EXPIRY-STRIKE-(C|P) или формату Deribit DDMMMYY.

Ошибки отмены

Ордер не найден

Причина: "Order not found for cancellation: {client_id}"

Источник: ордер с указанным client_id не найден.

Действие: убедитесь, что client_id указан верно и ордер существует, через GET /orders?wallet=....

Книга заявок не найдена

Причина: "Orderbook not found for symbol: {symbol}"

Источник: для данного символа книга заявок не существует.

Действие: убедитесь, что символ корректен и рынок существует.

Ордер отсутствует в книге заявок

Причина: "Order {id} not found in orderbook {symbol}"

Источник: ID ордера существует, но ордера нет в книге заявок (возможно, он исполнен или отменён).

Действие: проверьте статус ордера через GET /orders?wallet=....

Ордер уже исполнен

Причина: "Order {id} is already filled and cannot be cancelled"

Источник: ордер был полностью исполнен до запроса на отмену.

Действие: проверьте статус ордера через GET /orders?wallet=....

Ордер уже отменён

Причина: "Order {id} was already cancelled"

Источник: ордер уже был отменён.

Действие: проверьте статус ордера через GET /orders?wallet=....

Валидация ордеров на перпы

Причина: "Perp order missing underlying symbol"

Источник: ордер на бессрочный контракт не содержит поле underlying.

Действие: убедитесь, что ордер на перп включает символ underlying.

Срабатывание MMP

Причина: "MMP triggered during fill processing"

Источник: лимиты MMP превышены в процессе обработки исполнения. Ордер был частично исполнен, затем сработал MMP и отменил оставшийся объём.

Действие:

  1. Проверьте конфигурацию MMP через GET /mmp-config?wallet=...&currency=...
  2. Изучите метрики окна исполнений
  3. Скорректируйте лимиты MMP или сбросьте состояние MMP через POST /mmp-config/reset

Полная семантика MMP описана в разделе MMP.

Отмена по MMP (прочие ордера)

Причина: "Order canceled by MMP trigger"

Источник: ордер был отменён, поскольку другой ордер для той же пары кошелёк+базовый актив вызвал срабатывание MMP.

Действие: проверьте конфигурацию MMP и активность исполнений.

Ошибки валидации на уровне обработчика

Возвращаются с кодом HTTP 400 до попадания в движок.

Валидация цены

Ошибка: "Price validation failed: Price {price} has {n} significant figures, maximum allowed is 5"

Источник: цена содержит более 5 значащих цифр.

Действие: округлите цену до ≤ 5 значащих цифр.

Формат размера/цены

Ошибка: "Size must be greater than 0" или "Price must be greater than 0"

Источник: размер или цена <= 0 либо не могут быть распарсены как число с плавающей точкой.

Действие: убедитесь, что size и price — корректные положительные числа (в виде строк).

Недопустимый формат символа

Ошибка: HTTP 400 с сообщением об ошибке от обработчика

Источник: символ не распознаётся как валидный опционный символ.

Действие: проверьте формат символа: UNDERLYING-YYYYMMDD-STRIKE-(C|P).

Ошибки массовых ордеров

Массовые эндпоинты возвращают ошибки по каждому элементу в BulkOrderResult.error:

  • "Signature verification failed: ..."
  • "Unauthorized: signer not authorized for wallet"
  • "Price validation failed: ..."
  • "Size must be greater than 0"
  • "Price must be greater than 0"
  • "Failed to send order to engine"
  • "No response from engine"

Каждый результат содержит index (позицию в массиве запроса) и булево поле success.

Ошибки WebSocket

Контрольные сообщения WebSocket:

{
"type": "Error",
"message": "Authentication required for this channel"
}

Частые ошибки:

  • "Authentication required for this channel": попытка подписаться на приватный канал без параметра ?wallet=
  • "Client not found": внутренняя ошибка (соединение потеряно)

Лучшие практики обработки ошибок

  1. Всегда проверяйте поле status: не полагайтесь на HTTP-коды состояния при торговых отклонениях
  2. Разбирайте строку reason: используйте точные строки причин для программной обработки
  3. Обрабатывайте ошибки массовых запросов: проверяйте BulkOrderResult.error для каждого элемента
  4. Логика повторов: не повторяйте отклонённые (REJECTED) ордера — сначала устраните первопричину
  5. Логирование: логируйте полный OrderUpdateMessage для отладки отклонений

Справочная таблица кодов ошибок

Причина отклоненияКатегорияHTTP-статусДействие
Instrument has expiredЭкспирация200Проверьте экспирацию, используйте другой инструмент
Account has no funds...Средства200Внесите средства (когда будет реализовано)
Insufficient margin: ...Маржа200Уменьшите размер, добавьте обеспечение, проверьте портфель
Failed to get portfolio: No spot price...Данные200Проверьте подключение к фиду Hyperliquid
Tier1 users cannot go short...Тир200Перейдите на tier2 или покройте продажи
Invalid symbol: ...Символ200Убедитесь, что рынок существует
Order not found for cancellation: ...Отмена200Убедитесь, что ордер существует
Order {id} is already filled...Отмена200Ордер уже исполнен
Order {id} was already cancelledОтмена200Ордер уже отменён
MMP triggered during fill processingMMP200Проверьте конфигурацию MMP, скорректируйте лимиты
Order canceled by MMP triggerMMP200Проверьте конфигурацию MMP, скорректируйте лимиты
signature_verification_failedАутентификация400Проверьте подпись и кодировку строк
unauthorizedАутентификация401Одобрите агента или подпишите кошельком
Price validation failed: ...Валидация400Округлите цену до ≤ 5 значащих цифр

Отладка отклонений

  1. Проверьте параметры ордера: убедитесь, что symbol, price, size, side указаны верно
  2. Проверьте портфель: GET /portfolio?wallet=... — текущие позиции и денежные средства
  3. Проверьте тир: GET /user-tier?wallet=... — ограничения по уровню
  4. Проверьте MMP: GET /mmp-config?wallet=...&currency=... — лимиты MMP
  5. Проверьте рынок: GET /markets и GET /instruments — существование инструмента
  6. Изучите логи: серверные логи могут содержать дополнительный контекст (не доступен через API)

Ссылки

  • Логика отклонений: реализована в торговом движке
  • Проверки маржи: выполняются до принятия ордера
  • Проверки тиров: выполняются по уровню кошелька
  • Валидация обработчика: стандартная валидация запросов