Позиции и PnL
Когда вы покупаете или продаете токены на Yoyo Market (далее — Yoyo), платформа отслеживает ваши активы как позиции. Каждая позиция представляет вашу чистую экспозицию к конкретному исходу на рынке.
Структура позиции
Запись позиции содержит следующие ключевые поля:
| Поле | Описание |
|---|---|
market_id | Рынок, к которому принадлежит позиция. |
token_type | "YES" или "NO" — какой токен вы держите. |
amount | Количество удерживаемых акций, в копейках. Всегда положительное значение. |
avg_price | Средневзвешенная цена приобретения позиции (0–10000). |
Длинные и короткие позиции
- Длинная позиция = владение токенами YES. Вы получаете прибыль, если событие разрешается как YES и цена растет.
- Короткая позиция = владение токенами NO. Вы получаете прибыль, если событие разрешается как NO (эквивалентно, если цена YES снижается).
В модели данных положительное количество токенов указывает на длинную позицию в этом типе токена. Если вы держите токены YES, вы в длинной позиции по YES; если держите токены NO, вы в длинной позиции по NO (что фактически является короткой позицией по исходу события).
Отслеживание средней цены
avg_price обновляется с каждой сделкой, добавляющей к позиции. Она представляет средневзвешенную стоимость всех акций в позиции:
avg_price = total_cost / total_shares
Когда вы частично закрываете позицию (продаете часть акций), avg_price остается неизменной — она всегда отражает вашу оригинальную стоимость для оставшихся акций.
Нереализованный PnL
Нереализованный PnL (прибыль и убыток) представляет выигрыш или потерю, которые вы бы реализовали, закрыв позицию по текущей рыночной ц ене:
unrealized_pnl = (current_price - avg_price) * amount // для YES (long)
unrealized_pnl = (avg_price - current_price) * amount // для NO (short по YES)
Это значение колеблется по мере изменения рыночных цен и отображается в реальном времени в представлениях позиций.
Позиция с деталями
API возвращает обогащенные объекты позиций (PositionWithDetails), включающие контекстную информацию помимо необработанных числовых данных:
| Поле | Описание |
|---|---|
event_name | Название родительского события. |
pool_name | Название пула, содержащего рынок. |
market_name | Название конкретного рынка. |
current_price | Последняя рыночная цена для типа токена. |
unrealized_pnl | Рассчитанный нереализованный PnL. |
Это устраняет необходимость дополнительных API-вызовов для разрешения названий событий и рынков при отображении позиций в интерфейсе.
Закрытые позиции
Когда позиция полностью закрыта (вручную или через расчет), она становится закрытой позицией с дополнительными данными расчета:
| Поле | Описание |
|---|---|
pnl | Реализованная прибыль или убыток в копейках. |
won_side | Исход, который победил при разрешении события ("YES" или "NO"). |
closed_at | Временная метка закрытия позиции. |
Закрытые позиции доступны как объекты ClosedPositionWithDetails, включающие все контекстные поля из представления открытой позиции плюс информацию о расчете.
Получение позиций
Открытые позиции
Открытые позиции возвращаются как часть эндпоинтов портфеля пользователя. Каждая открытая позиция включает текущую рыночную цену и нереализованный PnL.
Закрытые позиции
GET /api/v1/market/positions/completed
Authorization: Bearer <token>
Возвращает список всех закрытых позиций с полными деталями, включая реализованный PnL, выигрышную сторону и контекст события/рынка.
Расчет
Когда событие разрешается, все открытые позиции на его рынках рассчитываются автоматически:
- Выигрышная сторона (например, токены YES при разрешении события как YES): Каждая акция выплачивает 10000 копеек (100%).
- Проигравшая сторона (например, токены YES при разрешении события как NO): Каждая акция выплачивает 0 копеек.
Ваш реализованный PnL от расчета:
pnl = (payout_per_share - avg_price) * amount
Для победителей: pnl = (10000 - avg_price) * amount
Для проигравших: pnl = (0 - avg_price) * amount
См. также
- Закрытие позиций — Как вручную закрыть позицию
- Размещение ордеров — Ордера, создающие или изменяющие позиции
- Комиссии и сборы — Комиссии уменьшают эффективный PnL