Расчёт и экспирация
На этой странице описаны опционы основной биржи Hypercall Exchange. Это европейские опционы с расчётом денежными средствами в USDC. При экспирации позиции автоматически рассчитываются по расчётной цене базового актива, а расчётная сумма зачисляется на ваш счёт или списывается с него.
Время экспирации
| Базовые активы | Время экспирации |
|---|---|
| BTC, ETH | 08:00 UTC |
| Акции и индексы (SPCX, SP500, BOT, MU, NVDA, META, MSFT, AAPL, SNDK, BABA) | 20:00 UTC |
20:00 UTC соответствует 16:00 по нью-йоркскому времени в период действия летнего времени в США. Время экспирации зафиксировано в UTC и при переходе на летнее время не сдвигается.
При экспирации:
- Новые заявки отклоняются
- Открытые заявки отменяются
- Позиции переходят в процесс расчёта
Движок проверяет наличие инструментов с истёкшим сроком раз в минуту.
Жизненный цикл инструмента
Инструмент последовательно проходит три состояния:
| Состояние | Описание | Торговля |
|---|---|---|
| Active | Обычная торговля | Разрешена |
| Expired Pending Price | Ожидание расчётной цены | Запрещена |
| Settled | Расчёт завершён, позиции закрыты | Н/П |
Переходы между состояниями
- Active в Expired Pending Price: наступило время экспирации контракта
- Expired Pending Price в Settled: расчётная цена доступна, и все позиции рассчитаны
Как только инструмент переходит в состояние Expired Pending Price, все открытые заявки отменяются, а новые отклоняются с ошибкой "Instrument has expired".
Расчётная цена
Расчётная цена представляет собой устойчивое 30-минутное среднее цены оракула Hyperliquid для базового актива за 30 минут, заканчивающиеся в момент экспирации.
| Параметр | Значение |
|---|---|
| Источник цены | Цена оракула Hyperliquid (oraclePx) для перпа на базовый актив. Для BTC и ETH используются основные перпы Hyperliquid, для акций и индексов используются перпы HIP-3 xyz, например xyz:NVDA. |
| Окно | 30 минут, заканчивается во время экспирации |
| Выборка | Каждое отдельное обновление оракула внутри окна, по его временной метке Hyperliquid |
| Минимум наблюдений | 500 |
| Усреднение | Усечённая медиана средних |
Как вычисляется среднее
- Сбор. Hypercall фиксирует каждую новую цену оракула, полученную в интервале от экспирации минус 30 минут до экспирации. Повторные чтения одного и того же обновления учитываются один раз, а всё, что опубликовано после экспирации, не используется.
- Усечение. Наблюдения сортируются по цене, и отбрасываются верхние 5% и нижние 5%.
- Группировка. Оставшиеся цены делятся примерно на √n групп, и по каждой группе считается среднее.
- Медиана этих групповых средних. Это и есть расчётная цена.
Благодаря усечению и медиане средних несколько выбросов перед экспирацией практически не сдвигают цену, при этом она отражает всё окно целиком.
Если наблюдений недостаточно
Окно, в котором меньше 500 наблюдений, никогда не используется. Если собственная запись Hypercall неполная (например, после перезапуска внутри окна), окно восстанавливается из архивной истории той же цены оракула Hyperliquid с тем же минимумом в 500 наблюдений и тем же способом усреднения. Если ни в одном источнике наблюдений недостаточно, инструмент остаётся в состоянии Expired Pending Price, и расчёт откладывается. Hypercall не проводит расчёт по неполному окну или по резервной цене.
Это не то же самое, что оценка позиций во время сбоя оракула. Проверки маржи и ликвидация продолжают оценивать позиции по последней зафиксированной спотовой цене, а заявки, увеличивающие риск, отклоняются, если этой цене больше 30 секунд. См. Режимы отказа. Последняя зафиксированная цена никогда не используется как расчётная.
Расчёт суммы
Расчётная сумма равна внутренней стоимости опциона по расчётной цене:
Колл-опционы:
Пут-опционы:
Где:
- = расчётная цена
- = цена страйка
- = размер позиции (со знаком: положительный для лонга, отрицательный для шорта)
Опционы вне денег (OTM) рассчитываются по нулю и удаляются. Премия выплачивается деньгами в момент сделки, поэтому при расчёте переходит только внутренняя стоимость. Это относится как к стандартной, так и к портфельной марже.
Примеры
Длинный колл (ITM):
- Позиция: лонг 2 BTC-100000-C
- Расчётная цена: $105,000
- Внутренняя стоимость: max(0, 105000 - 100000) = $5,000
- Расчётная сумма: 10,000** (зачисляется)
Короткий колл (ITM):
- Позиция: шорт 2 BTC-100000-C
- Расчётная цена: $105,000
- Расчётная сумма: 10,000** (списывается)
Длинный пут (OTM):
- Позиция: лонг 1 BTC-100000-P
- Расчётная цена: $105,000
- Внутренняя стоимость: max(0, 100000 - 105000) = $0
- Расчётная сумма: $0 (истекает без стоимости)
Процесс расчёта
При расчёте:
- Получение цены: берётся финальная 30-минутная расчётная цена
- Вычисление суммы: для каждой позиции рассчитывается внутренняя стоимость
- Движение средств: все опционы на один базовый актив с одной экспирацией рассчитываются одним пакетом, с неттингом по каждому счёту
- Удаление позиции: позиция закрывается и удаляется из портфеля
- Отправка события: в WebSocket-канал
portfolioотправляется сообщениеPositionExpired
Расчёт выполняется с гарантией идемпотентности. Повторное воспроизведение или перезапуск не могут привести к двойному расчёту.
Кто платит, в зависимости от режима маржи
- Стандартная маржа: счёт, который должен по расчёту, платит полную сумму из своих денежных средств в Hypercall.
- Портфельная маржа: счёт, который должен по расчёту, платит сначала из своих денежных средств в Hypercall, затем за счёт займа из пула кредитования PM. Всё, что пул не может профинансировать, становится отложенным обязательством, которое нужно погасить в течение периода урегулирования. См. Финансирование PM.
Если плательщик с портфельной маржой в пакете не смог заплатить полностью, счета-получатели в этом пакете делят собранные средства пропорционально, а остаток фиксируется как отложенное требование, которое выплачивается с процентами по мере погашения долга плательщиком. Инструмент рассчитывается в любом случае: неоплаченное обязательство никогда не останавливает расчёт.
События WebSocket
PositionExpired
Отправляется в канал portfolio при расчёте позиции:
{
"type": "PositionExpired",
"wallet_address": "0x...",
"symbol": "BTC-20250131-100000-C",
"position_size": "2",
"settlement_price": "5000",
"settlement_value": "10000",
"settlement_entry_price": "3200",
"cost_basis": "6400",
"net_pnl": "3600",
"timestamp": 1738310400000
}
| Поле | Описание |
|---|---|
position_size | Размер позиции со знаком (положительный = лонг, отрицательный = шорт) |
settlement_price | Внутренняя стоимость на один контракт |
settlement_value | Общая сумма денежного расчёта |
settlement_entry_price | Ваша цена входа на один контракт |
cost_basis | Стоимость приобретения позиции на момент расчёта |
net_pnl | P&L по расчёту за вычетом стоимости приобретения, без учёта комиссий |
Экспирация рынка
Отправляется в канал market_updates при экспирации инструмента:
{
"type": "MarketUpdate",
"action": "Expired",
"symbol": "BTC-20250131-100000-C",
"strike": "100000",
"is_call": true,
"underlying": "BTC",
"expiry": 1738310400,
"timestamp": 1738310400000
}
Эндпоинты API
Список инструментов по состоянию
GET /instruments?currency=BTC&status=EXPIRED_PENDING_PRICE
По умолчанию status равен ACTIVE. Можно передать EXPIRED_PENDING_PRICE, SETTLED, список через запятую или all.
Получение выплат по расчёту
GET /settlement-payouts?wallet=0x...
Возвращает записи о расчётах по вашему счёту. Необязательные параметры: symbol, ledger_applied, limit (по умолчанию 50, максимум 100) и offset.
Ответ:
{
"success": true,
"data": [
{
"id": 1,
"wallet": "0x...",
"symbol": "BTC-20250131-100000-C",
"expiry_ts": 1738310400,
"position_size": "2",
"settlement_price": "5000",
"settlement_value": "10000",
"settlement_entry_price": "3200",
"cost_basis": "6400",
"net_pnl": "3600",
"ledger_applied": true,
"is_seen": false,
"created_at": 1738310460000
}
],
"pagination": { "limit": 50, "offset": 0, "count": 1 },
"error": null
}
Обработка сбоев
Расчётная цена недоступна
Если расчётную цену не удаётся зафиксировать при экспирации:
- Инструмент остаётся в состоянии
Expired Pending Price - Торговля уже заблокирована
- Движок повторяет попытку при каждой проверке экспирации, раз в минуту
- Средства перемещаются только после появления расчётной цены, удовлетворяющей правилу 500 наблюдений
Перезапуск системы
Состояние расчёта сохраняется надёжно. При перезапуске системы:
- Инструменты с истёкшим сроком подхватываются при старте
- Расчёт продолжается автоматически
- Гарантии идемпотентности исключают двойной расчёт
Параметры
| Параметр | Значение | Описание |
|---|---|---|
| Интервал проверки экспирации | 60 секунд | Как часто движок проверяет экспирации и повторяет отложенные расчёты |
| Окно расчёта | 30 минут | Заканчивается во время экспирации |
| Минимум наблюдений | 500 | При меньшем количестве окно не используется |
| Усечение | 5% с каждого края | Отбрасываются до усреднения |
Рекомендации
- Следите за экспирациями: отслеживайте даты экспирации своих позиций через эндпоинт портфеля
- Планируйте заранее: закрывайте позиции до экспирации, если не хотите участвовать в расчёте
- Следите за последними 30 минутами: расчётная цена определяется оракулом за всё это окно, а не ценой в момент экспирации
- Подпишитесь на WebSocket: получайте события
PositionExpiredв реальном времени для мгновенного уведомления - Держите запас маржи: сохраняйте достаточно денежных средств или маржи на случай расчёта по коротким позициям в деньгах (ITM)
См. также:
- Ликвидация: что происходит при недостаточной марже
- Портфельная маржа: как позиции влияют на маржу
- Финансирование PM: как счета с портфельной маржой оплачивают расчёт
- Стандартная маржа: расчёт маржи по каждой позиции