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

События и пулы

Intotes организует прогнозы в двухуровневую иерархию: События содержат один или несколько Пулов, и каждый пул содержит бинарные рынки. На этой странице объясняются обе концепции и их взаимосвязь.


События

Событие -- это контейнер верхнего уровня. Оно представляет реальное явление, на которое пользователи могут делать прогнозы -- футбольный матч, ценовой таргет криптовалюты, политические выборы и т.д.

Ключевые поля

ПолеТипОписание
idintegerУникальный идентификатор.
namestringОтображаемое имя (английский).
name_rustringОтображаемое имя (русский).
tagsstring[]Теги категоризации (например, ["football", "premier-league"]).
image_urlstring | nullОбложка для карточки события.
versus_imagesstring[]Два URL иконок участников (спортивные события).
versus_namesstring[]Два имени участников (спортивные события).
has_drawbooleanСуществует ли исход ничьей (спортивные события с трехсторонними рынками).
statusstringВычисляемое состояние жизненного цикла -- см. ниже.
is_activebooleanПри false событие скрыто из лент, поиска и прямых ссылок. Создатель все еще может видеть его в "моих событиях".
is_loop_eventbooleanПересоздается ли событие по повторяющемуся расписанию (например, циклы цен криптовалют).
main_pool_idinteger | nullПул, отображаемый в карточке события в ленте -- см. ниже.
created_attimestampКогда событие было создано.
closed_attimestamp | nullКогда событие было закрыто. Null, пока ещё активно.

Статус события

Статус -- это вычисляемое поле, определяемое на основе пулов события:

СтатусЗначение
"new"Событие ещё не началось. Все пулы ещё до своего времени live_at.
"started"Хотя бы один пул начался, но событие ещё не закрыто.
"paid"Событие закрыто и все выплаты произведены (closed_at установлено).

Циклические события (Loop events)

Циклическое событие -- это событие, которое автоматически пересоздается через фиксированный интервал. Используется для повторяющихся криптовалютных прогнозов (например, "Будет ли ETH выше $3,500 через 1 час?").

Поля, специфичные для циклов:

ПолеОписание
loop_interval_minutesВремя между пересозданиями циклов (например, 60 для почасовых).
next_recreate_atКогда текущий цикл заканчивается и создается новый.
loop_template_event_idID шаблонного события, хранящего конфигурацию.

Когда цикл закрывается, система рассчитывает все позиции, затем создает свежее событие из шаблона с обновленными параметрами (базовая цена, вероятности, token ID).

Дополнительные поля

  • fixture_id / fixture_sport -- Связь с внешним провайдером спортивных данных (API-Sports) для обновлений счета в реальном времени.
  • polymarket_event_url -- URL/slug для получения и синхронизации котировок с Polymarket.
  • pinned_until / pin_order -- Управляет закреплением события вверху ленты.

Пулы

Пул -- это вопрос внутри события. Каждый пул содержит один или несколько бинарных рынков (исходы YES/NO).

Например, событие футбольного матча может иметь три пула:

  1. "Победитель матча" (с рынками для Команды A, Ничьей, Команды B)
  2. "Всего голов больше 2.5"
  3. "Обе команды забьют"

Ключевые поля

ПолеТипОписание
idintegerУникальный идентификатор.
namestringТекст вопроса (английский).
name_rustringТекст вопроса (русский).
rulesstringОписание того, как определяется выигрышный исход.
won_sideinteger | nullИндекс выигрышного рынка после разрешения. Null, пока не разрешен.
finish_attimestamp | nullДедлайн, после которого нельзя размещать ордера. Если null, пул закрывается только вручную.
live_attimestamp | nullКогда пул становится активным и открывается торговля.
marginintegerОбщая маржа для пула (в копейках).
scorestring | nullТекущий счет для живых спортивных событий (например, "2-1").

Вычисляемые поля (не хранятся в БД)

  • sides / sides_ru -- Названия рынков, извлеченные из рынков пула.
  • volumes -- Объем торгов по каждому рынку.
  • totalPool -- Сумма объемов всех рынков.

Концепция main_pool_id

Каждое событие имеет необязательный main_pool_id, указывающий на один из его пулов. Это пул, рынки которого отображаются на карточке события в ленте. Когда пользователь видит событие в списке, показанные вероятности, цены и объемы берутся из этого основного пула.

Если main_pool_id не установлен, фронтенд обычно использует первый пул.


Метаданные пула

Каждый пул может содержать JSON-объект metadata с дополнительной конфигурацией. Это особенно важно для создания событий и циклических событий.

Основные поля метаданных

ПолеОписание
market_namesПользовательские названия для каждого рынка (например, ["Победит ли PSG?", "Закончится ли матч вничью?"]).
market_names_ruРусские версии названий рынков.
market_probabilitiesНачальные вероятности (0-1) для каждого рынка, используются вместо объемов.
market_imagesURL изображения для каждого рынка.
market_yes_names / market_no_namesПользовательские метки исходов YES/NO для каждого рынка (например, "Выше $100k" / "Ниже $100k").

Конфигурация LMSR

ПолеОписание
lmsr_b_kopecksПараметр ликвидности LMSR b для пула в копейках. Определяет, насколько сильно цены двигаются за сделку. Если не задан, используется глобальное значение по умолчанию.

Синхронизация с Polymarket

ПолеОписание
polymarket_token_idsМассив CLOB token ID Polymarket, сопоставленных с каждым рынком, для синхронизации цен в реальном времени через WebSocket.

Отслеживание криптоактивов

ПолеОписание
asset_symbolСимвол отслеживаемого актива (например, "BTCUSDT").
asset_base_price"Целевая цена", установленная при создании события.
asset_close_priceЦена актива на момент закрытия цикла.

Поля цикла

При закрытии цикла система записывает поля next_* в шаблонный пул для настройки предстоящего цикла:

  • next_asset_base_price -- Базовая цена для нового цикла.
  • next_market_probabilities -- Начальные вероятности для рынков нового цикла.
  • next_market_names, next_market_names_ru, next_market_images -- Структура рынков следующего цикла.
  • next_polymarket_token_ids -- Token ID для следующего цикла.

Они считываются воркером пересоздания и применяются к новому пулу.


Связи

Event (1)
├── Pool (1..N)
│ ├── Market (1..N) ← бинарные исходы YES/NO
│ └── metadata ← конфигурация, вероятности, отслеживание активов
└── main_pool_id ────────→ один из вышеуказанных пулов

Событие всегда имеет хотя бы один пул, и каждый пул всегда имеет хотя бы один рынок. Типичная структура для спортивного события с опцией ничьей -- один пул с тремя рынками (Команда A побеждает, Ничья, Команда B побеждает).