Позиции
Позиция представляет владение пользователя на конкретном рынке. Когда вы покупаете акции на рынке, вы получаете позицию. Позиции отслеживают, что вы держите, по какой средней цене купили, и делаете ли вы ставку за (YES) или против (NO) исхода.
Поля позиции
| Поле | Тип | Описание |
|---|---|---|
id | integer | Уникальный идентификатор. |
user_id | integer | Пользователь, которому принадлежит позиция. |
market_id | integer | Рынок, к которому относится позиция. |
token_type | string | "YES" или "NO" -- тип удерживаемых акций. |
amount | integer | Количество удерживаемых акций, в копейках. Всегда положительное. |
avg_price | integer | Средневзвешенная цена покупки по шкале 0-10,000 (см. Цены и вероятности). |
use_bonus | boolean | Была ли позиция приобретена за бонусный баланс. |
created_at | timestamp | Когда позиция была впервые открыта. |
Long и Short
Позиции на Intotes являются направленными:
- Long (YES) -- Вы держите токены YES. Вы получаете прибыль, если исход разрешается как YES. Ваш
token_typeравен"YES", аamountположительный. - Short (NO) -- Вы держите токены NO. Вы получаете прибыль, если исход разрешается как NO. Ваш
token_typeравен"NO", аamountположительный.
В обоих случаях amount всегда является положительным числом, представляющим количество удерживаемых акций (в копейках). Направление вашей ставки определяется полем token_type, а не знаком amount.
Расчет и PnL
Когда рынок разрешается, позиции рассчитываются автоматически:
- Победители (держащие правильный тип токена) получают 10,000 за акцию (в копейках). Поскольку цены при покупке всегда ниже 10,000, это гарантирует прибыль.
- Проигравшие (держащие неправильный тип токена) получают 0. Они теряют все свои вложения.
Расчет PnL
Прибыль и убыток рассчитывается как:
Для победителей: PnL = (10000 - avg_price) * amount / 10000
Для проигравших: PnL = -avg_price * amount / 10000
Например, если вы купили 50,000 копеек акций YES по средней цене 2,600 (26%):
- Если YES побеждает: PnL = (10,000 - 2,600) * 50,000 / 10,000 = +37,000 копеек
- Если NO побеждает: PnL = -2,600 * 50,000 / 10,000 = -13,000 копеек
Закрытые позиции
Когда позиция рассчитана (через разрешение рынка или ручное закрытие), она становится ClosedPosition. К базовым полям позиции добавляются следующие:
| Поле | Тип | Описание |
|---|---|---|
pnl | integer | Реализованная прибыль или убыток в копейках. Положительное -- прибыль, отрицательное -- убыток. |
won_side | integer | null | 0 = YES выиграл, 1 = NO выиграл, null = позиция закрыта вручную до разрешения. |
closed_at | timestamp | Когда позиция была закрыта. |
Ручное закрытие vs. разрешение
Существует два способа закрытия позиции:
-
Разрешение рынка -- Определяется исход события. Все позиции на рынке рассчитываются автоматически.
won_sideустанавливается в0(YES выиграл) или1(NO выиграл). -
Ручное закрытие -- Пользователь продает свои акции обратно на рынок до разрешения (по текущей рыночной цене).
won_sideравенnull, аpnlотражает разницу между ценой продажи и средней ценой покупки.
Бонусный баланс
Флаг use_bonus указывает, что позиция была открыта с использованием бонусного баланса пользователя вместо основного. Бонусный баланс формируется из реферальных вознаграждений и промоакций. Когда бонусная позиция рассчитывается, выплата идет на основной баланс, но первоначальные бонусные средства не возвращаются в случае проигрыша.
Обогащение позиции в API
Когда позиции возвращаются как часть профиля пользователя (GET /api/v1/users/me или GET /api/v1/users/{id}), они включают дополнительные контекстные поля для отображения:
| Поле | Описание |
|---|---|
event_id | ID родительского события. |
event_name / event_name_ru | Название события для отображения. |
event_image | URL обложки события. |
pool_name / pool_name_ru | Название пула (вопроса). |
market_name / market_name_ru | Название рынка внутри пула. |
side / side_ru | Читаемая метка стороны (например, "YES" / "ДА"). |
unrealized_pnl | Расчетный PnL на основе текущей рыночной цены (лучший bid/ask), до закрытия позиции. |
Для закрытых позиций обогащенный ответ дополнительно включает поля pnl, won_side и closed_at, описанные выше.
Пример жизненного цикла
-
Открытие -- Пользователь размещает ордер на ПОКУПКУ акций YES по цене 3,500. Ордер исполняется и создает позицию с
token_type: "YES",amount: 28571(полученные акции),avg_price: 3500. -
Удержание -- Рынок движется.
unrealized_pnlпользователя колеблется в зависимости от текущей рыночной цены. -
Закрытие -- Возможны варианты:
- Рынок разрешается как YES: пользователь получает 10,000 за акцию, позиция закрывается с положительным PnL.
- Рынок разрешается как NO: пользователь получает 0, позиция за крывается с отрицательным PnL.
- Пользователь вручную продает по цене 5,200: позиция закрывается с PnL на основе разницы (5,200 - 3,500) за акцию.