Ошибки и причины отклонения
Полный каталог кодов ошибок и причин отклонения.
Формат ответа с ошибкой
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_request | 400 | Не удаётся прочитать тело запроса |
invalid_json | 400 | Ошибка парсинга JSON |
missing_field | 400 | Отсутствует обязательное поле |
invalid_wallet | 400 | Не удалось распарсить строку кошелька |
invalid_parameter | 400 | Недопустимый параметр (например, size/price должны быть строками) |
signature_verification_failed | 400 | Не удалось восстановить подпись EIP-712 |
unsupported_endpoint | 400 | Middleware не поддерживает этот путь |
unauthorized | 401 | Подписант не авторизован для кошелька (ошибка авторизации агента) |
internal_error | 500 | Непредвиденный сбой проверки авторизации агента |
Причины отклонения на уровне движка
Появляются в 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"
Источник: предторговая проверка маржи выявила, что доступного обеспечения (эквити) недостаточно для покрытия маржинальных требований после предполагаемого ордера.
Для аккаунтов со стандартной маржой требуемое обеспечение зависит от стороны опциона, типа опциона, страйка, цены базового актива и текущего портфеля. См. Стандартная маржа с описанием актуальной маржинальной модели на момент запуска.
Действие:
- Проверьте портфель через
GET /portfolio?wallet=... - Изучите расчёт маржи в разделе Маржа
- Уменьшите размер позиции или добавьте обеспечение
Отсутствие спотовой цены
Причина: "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 (только длинные позиции) и попытался продать без достаточной исполненной длинной позиции.
Действие:
- Проверьте уровень через
GET /user-tier?wallet=... - Убедитесь, что все продажи покрыты исполненными длинными позициями
- Свяжитесь с Hypercall, если вам нужен доступ продавца опционов для интеграции маркетмейкера
Недопустимый символ
Причина: "Invalid symbol: {symbol}"
Источник: для данного символа не существует книги заявок.
Действие:
- Проверьте существование рынка через
GET /instrument-specsиGET /markets - Проверьте формат символа:
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 и отменил оставшийся объём.
Действие:
- Проверьте конфигурацию MMP через
GET /mmp-config?wallet=...¤cy=... - Изучите метрики окна исполнений
- Скорректируйте лимиты 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": внутренняя ошибка (соединение потеряно)
Лучшие практики обработки ошибок
- Всегда проверяйте поле
status: не полагайтесь на HTTP-коды состояния при торговых отклонениях - Разбирайте строку
reason: используйте точные строки причин для программной обработки - Обрабатывайте ошибки массовых запросов: проверяйте
BulkOrderResult.errorдля каждого элемента - Логика повторов: не повторяйте отклонённые (
REJECTED) ордера — сначала устраните первопричину - Логирование: логируйте полный
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 processing | MMP | 200 | Проверьте конфигурацию MMP, скорректируйте лимиты |
Order canceled by MMP trigger | MMP | 200 | Проверьте конфигурацию MMP, скорректируйте лимиты |
signature_verification_failed | Аутентификация | 400 | Проверьте подпись и кодировку строк |
unauthorized | Аутентификация | 401 | Одобрите агента или подпишите кошельком |
Price validation failed: ... | Валидация | 400 | Округлите цену до ≤ 5 значащих цифр |
Отладка отклонений
- Проверьте параметры ордера: убедитесь, что
symbol,price,size,sideуказаны верно - Проверьте портфель:
GET /portfolio?wallet=...— текущие позиции и денежные средства - Проверьте тир:
GET /user-tier?wallet=...— ограничения по уровню - Проверьте MMP:
GET /mmp-config?wallet=...¤cy=...— лимиты MMP - Проверьте рынок:
GET /marketsиGET /instruments— существование инструмента - Изучите логи: серверные логи могут содержать дополнительный контекст (не доступен через API)
Ссылки
- Логика отклонений: реализована в торговом движке
- Проверки маржи: выполняются до принятия ордера
- Проверки тиров: выполняются по уровню кошелька
- Валидация обработчика: стандартная валидация запросов