Перейти к основному содержимому

Позиции

Позиция представляет владение пользователя на конкретном рынке. Когда вы покупаете акции на рынке, вы получаете позицию. Позиции отслеживают, что вы держите, по какой средней цене купили, и делаете ли вы ставку за (YES) или против (NO) исхода.


Поля позиции

ПолеТипОписание
idintegerУникальный идентификатор.
user_idintegerПользователь, которому принадлежит позиция.
market_idintegerРынок, к которому относится позиция.
token_typestring"YES" или "NO" -- тип удерживаемых акций.
amountintegerКоличество удерживаемых акций, в копейках. Всегда положительное.
avg_priceintegerСредневзвешенная цена покупки по шкале 0-10,000 (см. Цены и вероятности).
use_bonusbooleanБыла ли позиция приобретена за бонусный баланс.
created_attimestampКогда позиция была впервые открыта.

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. К базовым полям позиции добавляются следующие:

ПолеТипОписание
pnlintegerРеализованная прибыль или убыток в копейках. Положительное -- прибыль, отрицательное -- убыток.
won_sideinteger | null0 = YES выиграл, 1 = NO выиграл, null = позиция закрыта вручную до разрешения.
closed_attimestampКогда позиция была закрыта.

Ручное закрытие vs. разрешение

Существует два способа закрытия позиции:

  1. Разрешение рынка -- Определяется исход события. Все позиции на рынке рассчитываются автоматически. won_side устанавливается в 0 (YES выиграл) или 1 (NO выиграл).

  2. Ручное закрытие -- Пользователь продает свои акции обратно на рынок до разрешения (по текущей рыночной цене). won_side равен null, а pnl отражает разницу между ценой продажи и средней ценой покупки.


Бонусный баланс

Флаг use_bonus указывает, что позиция была открыта с использованием бонусного баланса пользователя вместо основного. Бонусный баланс формируется из реферальных вознаграждений и промоакций. Когда бонусная позиция рассчитывается, выплата идет на основной баланс, но первоначальные бонусные средства не возвращаются в случае проигрыша.


Обогащение позиции в API

Когда позиции возвращаются как часть профиля пользователя (GET /api/v1/users/me или GET /api/v1/users/{id}), они включают дополнительные контекстные поля для отображения:

ПолеОписание
event_idID родительского события.
event_name / event_name_ruНазвание события для отображения.
event_imageURL обложки события.
pool_name / pool_name_ruНазвание пула (вопроса).
market_name / market_name_ruНазвание рынка внутри пула.
side / side_ruЧитаемая метка стороны (например, "YES" / "ДА").
unrealized_pnlРасчетный PnL на основе текущей рыночной цены (лучший bid/ask), до закрытия позиции.

Для закрытых позиций обогащенный ответ дополнительно включает поля pnl, won_side и closed_at, описанные выше.


Пример жизненного цикла

  1. Открытие -- Пользователь размещает ордер на ПОКУПКУ акций YES по цене 3,500. Ордер исполняется и создает позицию с token_type: "YES", amount: 28571 (полученные акции), avg_price: 3500.

  2. Удержание -- Рынок движется. unrealized_pnl пользователя колеблется в зависимости от текущей рыночной цены.

  3. Закрытие -- Возможны варианты:

    • Рынок разрешается как YES: пользователь получает 10,000 за акцию, позиция закрывается с положительным PnL.
    • Рынок разрешается как NO: пользователь получает 0, позиция закрывается с отрицательным PnL.
    • Пользователь вручную продает по цене 5,200: позиция закрывается с PnL на основе разницы (5,200 - 3,500) за акцию.