Бумажная торговля на Polymarket c ИИ.

soprano

Client
Регистрация
25.08.2011
Сообщения
1 005
Благодарностей
1 217
Баллы
113
И снова здравствуйте.

Возможно, вы слышали, что такое Polymarket.

Для тех, кто не знает:

Polymarket — это один из крупнейших и самых популярных рынков предсказаний на блокчейне. Он позволяет голосовать за результат различных событий: спорт, политика, культура и так далее.

Для хранения активов пользователей используются некастодиальные кошельки. Это значит, что протокол не хранит приватные ключи пользователей и не может получить доступ к их активам.

Немного о прогнозировании
Прогноз всегда начинается с предсказания. Предсказание - основа, вокруг которой строятся пользовательские сценарии/надежды.
В контексте рынков прогнозов такое утверждение называется condition/состояние.
Это может быть вопрос, утверждение, описание ожидаемого результата, событие, предсказание и т. д.
Можно рассматривать это как форму высказывания, претендующую на истинность в будущем.

Примеры предсказаний на Polymarket:

В мае президентом США будет ПиДидди.

GPT-6 выйдет в релиз в 2026?

Биткойн будет стоить 100500 к 1 июня.

Самый кассовый фильм в 2026?


Каждое предсказание имеет дедлайн для проверки: исполнилось предсказание или нет.
За определение результата предсказания в Polymarket отвечает специальный оракул. Это основное, что надо знать.

Для доступа к Polymarket не нужен VPN или карты, всё работает даже в стране под санкциями.

Представляю вам бота, который автоматически торгует на Polymarket.

Он работает с использованием API Polymarket, и полностью имитирует торговлю.
Для реальной торговли вам нужно только подсоединить криптовалютный кошелек.
Команды бот получает через TG.

Для начала работы вам потребуются:

bot token - получите у @botfather
chat_id - ваш id в telegram
llm7 token - бесплатный токен для анализа

// -----------------------------
// TELEGRAM
// -----------------------------
string TELEGRAM_BOT_TOKEN = ...; // токен Telegram-бота для отправки сообщений и чтения команд через Bot API
string TELEGRAM_CHAT_ID = ...; // chat_id, куда бот шлет уведомления и откуда принимает команды
bool TELEGRAM_STARTUP_MESSAGE = true; // отправлять ли сообщение в Telegram при старте и после первого прохода цикла
bool TELEGRAM_VERBOSE_LOG = true; // писать ли в лог подробные ответы Telegram / CLOB / LLM7 для отладки

// polling
bool TELEGRAM_POLLING_ENABLED = true; // включен ли опрос Telegram getUpdates для приема команд
int TELEGRAM_POLL_TIMEOUT_SEC = 2; // long polling timeout в секундах для getUpdates
int TELEGRAM_POLL_LIMIT = 20; // максимум обновлений Telegram, забираемых за один poll-запрос
bool TELEGRAM_ACCEPT_COMMANDS_FROM_ANY_CHAT = false; // если true — команды можно принимать из любого чата, если false — только из TELEGRAM_CHAT_ID


// -----------------------------
// DATABASE / FILES
// -----------------------------
string DB_PATH = ...; // путь к SQLite-базе бота
string WORK_DIR = ...; // рабочая директория проекта
string LOG_DIR = ...; // директория для логов


// -----------------------------
// SCAN / TIMING
// -----------------------------
int SCAN_INTERVAL_SEC = 10; // пауза между итерациями основного цикла сканирования
int REPORT_INTERVAL_SEC = 3600; // интервал между часовыми отчетами в секундах
int SCAN_LIMIT = 1000; // максимум рынков, которые бот скачает с Gamma за один цикл
int PAGE_SIZE = 100; // размер одной страницы при запросе рынков из Gamma API
int WORKING_MARKETS_CAP = 250; // сколько лучших/подходящих рынков оставить в рабочем наборе после фильтрации
int PRICE_BATCH_TOKENS = 200; // сколько token_id запрашивать батчем в CLOB /prices
int MAX_ITERATIONS = 0; // сколько максимум циклов выполнить; 0 = работать бесконечно


// -----------------------------
// MARKET FILTERS
// -----------------------------
int LOOKBACK_POINTS = 2; // сколько последних снимков цен хранить для расчета движения цены
double MIN_SIGNAL_MOVE_ABS = 0.0005; // минимальное абсолютное изменение цены, чтобы считать движение значимым
double MIN_SIGNAL_MOVE_PCT = 0.001; // минимальное относительное изменение цены (в долях, не в %) для сигнала
double MIN_LIQUIDITY = 500.0; // минимальная ликвидность рынка, ниже которой рынок игнорируется
double MIN_ENTRY_PRICE = 0.05; // минимальная цена входа по исходу, чтобы не брать слишком дешевые контракты
double MAX_ENTRY_PRICE = 0.95; // максимальная цена входа по исходу, чтобы не брать слишком дорогие контракты
double MIN_HOURS_TO_END = 0.10; // минимальное число часов до завершения рынка, чтобы не входить в почти закрытый рынок
double MAX_HOURS_TO_END = 72.0; // максимальное число часов до завершения рынка, чтобы не брать слишком далекие рынки
double MAX_SPREAD = 0.15; // максимально допустимый спред между buy и sell ценой для входа
bool REQUIRE_BINARY_ONLY = true; // брать только бинарные рынки с 2 исходами


// -----------------------------
// PORTFOLIO RULES
// -----------------------------
int DEFAULT_MAX_POSITIONS = 4; // дефолтный максимум одновременно открытых позиций
double DEFAULT_AUTO_TP_PCT = 10.0; // дефолтный take-profit в %, при котором позиция закрывается в авто-режиме
double DEFAULT_AUTO_SL_PCT = 7.0; // дефолтный stop-loss в %, при котором позиция закрывается в авто-режиме
int DEFAULT_MAX_PER_CATEGORY = 2; // дефолтный максимум открытых позиций на одну категорию
double MIN_AUTO_ALLOC_USD = 10.0; // минимальная сумма аллокации в одну авто-сделку
double SELL_BEFORE_END_HOURS = 1.0; // за сколько часов до конца рынка принудительно закрывать позицию
int SIGNAL_COOLDOWN_MIN = 1; // кулдаун в минутах, чтобы не генерировать повторный сигнал слишком быстро по тому же рынку/токену


// -----------------------------
// DIVERSIFICATION
// -----------------------------
int MAX_SAME_ASSET = 2; // максимум открытых позиций на один и тот же базовый актив/тему (btc, eth, trump и т.д.)
double DEDUP_JACCARD = 0.72; // порог схожести текстов рынков по Jaccard, выше которого кандидат считается слишком похожим


// -----------------------------
// CATEGORY FILTERS
// -----------------------------
string ALLOWED_CATEGORIES_RAW = "crypto,macro,politics,companies,general"; // список разрешенных категорий рынков
string BLOCKED_CATEGORIES_RAW = "weather,sports"; // список запрещенных категорий рынков


// -----------------------------
// LLM7
// -----------------------------
bool LLM7_ENABLED = true; // использовать ли LLM7 вообще
string LLM7_TOKEN = ...; // токен доступа к LLM7 API
string LLM7_MODEL = "fast"; // модель LLM7 для кратких summaries по сделкам
bool LLM7_SUMMARY_ENABLED = true; // генерировать ли краткое summary через LLM7 при авто-входе
int LLM7_SUMMARY_MAX_CHARS = 500; // максимальная длина summary от LLM7


// -----------------------------
// LOOP / CONTROL
// -----------------------------
bool BOT_LOOP_ENABLED = true; // главный флаг работы бота; пока true — цикл крутится
bool AUTO_MODE_FORCE_ON_AT_START = false; // при старте принудительно включить auto_mode в portfolio_settings
bool SEND_HOURLY_REPORTS = true; // отправлять ли часовые отчеты в Telegram
bool SEND_DAILY_REPORTS = true; // отправлять ли суточные отчеты в Telegram
bool SEND_LLM7_SUMMARY = true; // прикладывать ли LLM7 summary к уведомлению об auto-buy

// служебные пути и идентификаторы
string START_UTC_STR = ...; // строка времени запуска бота в UTC
string RUN_ID = ...; // уникальный id текущего запуска бота

// runtime portfolio state
double runtime_bank_usd = 0.0; // текущий стартовый капитал из portfolio_settings
double runtime_cash_free_usd = 0.0; // текущий свободный кэш
int runtime_auto_mode = 0; // включен ли авто-режим торговли сейчас
int runtime_max_positions = ...; // текущий лимит позиций
double runtime_auto_tp_pct = ...; // текущий TP в %
double runtime_auto_sl_pct = ...; // текущий SL в %
int runtime_max_per_category = ...; // текущий лимит позиций на категорию

// runtime metrics
double metrics_open_market_value = 0.0; // рыночная стоимость открытых позиций
double metrics_invested_cost = 0.0; // суммарная стоимость входа открытых позиций
double metrics_realized = 0.0; // реализованный PnL по закрытым позициям
double metrics_unrealized = 0.0; // нереализованный PnL по открытым позициям
double metrics_total_pnl = 0.0; // общий PnL портфеля
double metrics_equity = 0.0; // equity = cash + market value открытых позиций
double metrics_total_return_pct = 0.0; // доходность портфеля в %
int metrics_open_count = 0; // число открытых позиций
int metrics_closed_count = 0; // число закрытых позиций
int metrics_wins_count = 0; // число прибыльных закрытых позиций
double metrics_win_rate = 0.0; // win rate

// telegram runtime state
long telegramLastUpdateIdLong = 0; // последний обработанный update_id Telegram
int telegramCommandsProcessedTotal = 0; // сколько команд всего обработано успешно
int telegramCommandsRejectedTotal = 0; // сколько команд отклонено по доступу
int telegramCommandsFailedTotal = 0; // сколько команд завершились ошибкой

// loop state
int scanIteration = 0; // номер текущей итерации цикла
bool firstLoop = true; // флаг первого цикла, нужен для first scan completed message
System.DateTime lastLoopStartedUtc = ...; // когда стартовала текущая итерация
System.DateTime lastHourlyReportUtc = ...; // время последнего часового отчета
System.DateTime lastDailyReportUtc = ...; // время последнего дневного отчета

// endpoints
string GAMMA_MARKETS_URL = "https://gamma-api.polymarket.com/markets"; // API рынков Polymarket Gamma
string CLOB_PRICES_URL = "https://clob.polymarket.com/prices"; // API цен CLOB
string LLM7_CHAT_COMPLETIONS_URL = "https://api.llm7.io/v1/chat/completions"; // API LLM7
string TELEGRAM_SEND_MESSAGE_URL = ...; // URL для sendMessage Telegram Bot API
string TELEGRAM_GET_UPDATES_URL = ...; // URL для getUpdates Telegram Bot API

Для работы бота просто запустите шаблон, затем в боте TG введите команду /help


Вот все команды в боте:
Статус и отчеты

/status — краткий статус бота

/report — подробный отчёт по портфелю

/portfolio — текущие настройки портфеля

/portfolio_status — статус портфеля как в paper-trading панели

/positions — открытые позиции

/closed — последние закрытые позиции

/signals — последние сигналы

/candidates — snapshot последнего top candidate

/debug_scan — debug snapshot последнего скана


Управление ботом

/start — стартовое сообщение

/help — список команд

/auto_On — включить авто-режим

/auto_Off — выключить авто-режим


Настройки paper portfolio

/set_bank 100 — задать стартовый капитал

/set_tp 10 — установить auto take-profit в %

/set_sl 7 — установить auto stop-loss в %

/set_maxpos 4 — установить максимум позиций

/set_maxcat 2 — установить лимит позиций на категорию


Ручное управление позициями

/close_123 — вручную закрыть позицию по ID
Это автоматический paper-trading бот для Polymarket.

Он делает следующее:
берет список рынков с Polymarket,
фильтрует их по ликвидности, времени до окончания, категориям и т.д.,
смотрит на недавнее движение цен,
выбирает самые сильные кандидаты,
виртуально “покупает” позиции,
виртуально “продает” их по take-profit / stop-loss / перед концом рынка,
ведет учет портфеля в SQLite,
принимает команды через Telegram,
присылает отчеты и уведомления.


Как он работает по шагам

Каждый цикл бот делает примерно так:

Читает настройки из SQLite.
Считает текущее состояние бумажного портфеля.
Забирает команды из Telegram.
Скачивает рынки Polymarket из Gamma API.
Фильтрует только подходящие рынки.
Берет цены по токенам из CLOB.
Запоминает последние цены, чтобы видеть движение.
Находит “топ movers” — где цена растет сильнее всего.
Строит список кандидатов на вход.
Убирает дубликаты и слишком похожие рынки.
Если включен auto mode — открывает виртуальные позиции.
Проверяет открытые позиции и закрывает их по правилам.
Шлет уведомления и периодические отчеты в Telegram.
Ждет SCAN_INTERVAL_SEC и начинает новый цикл.


Что нужно настроить перед запуском

1. Telegram
TELEGRAM_BOT_TOKEN
TELEGRAM_CHAT_ID
Иначе бот не сможет:
отправлять уведомления,
принимать команды.

2. База данных
DB_PATH уже задается автоматически в папке проекта.
Бот сам создаст SQLite-файл и таблицы.

3. LLM7
Если нужны AI-summary к сделкам:
заполни LLM7_TOKEN
Если не нужно:
можно поставить LLM7_ENABLED = false
или LLM7_SUMMARY_ENABLED = false

Для запуска торговли в телеграм боте запустите последовательно команды:

Запуск автоматической торговли:
1) /set_bank 100 (это сумма, вместо 100 ставьте любую цифру)

2) /auto_On (автоторговля)

3) /portfolio_status (анализ портфолио)

4) /positions (открытые позиции)
Бот после запуска какое-то время просто собирает информацию, затем ищет выгодные позиции и покупает их.
Бот может делать скальпинг: купил - прибыль - быстро продал, или позиционная торговля, когда актив держит несколько часов.

Вот так выглядит работа в боте:

140957


140958



140959


140960




Настоящую интеграцию с торговым API Polymarket / CLOB

Нужен модуль, который умеет:
выставлять реальные ордера BUY/SELL,
отменять ордера,
проверять статус ордера,
получать реальные исполнения (fills),
получать баланс аккаунта,
получать открытые ордера и реальные позиции.

Сейчас бот работает только с /prices, то есть читает цены, но не торгует.

Авторизация и подпись запросов
Для реальной торговли нужно:
приватный ключ / wallet,
адрес кошелька,
подпись запросов,
возможно API credentials / auth headers в зависимости от актуального способа работы с CLOB.
Без этого нельзя отправлять реальные ордера.

Реальную модель исполнения ордеров
Сейчас бот считает, что:
вход состоялся сразу по buyPrice,
выход состоялся сразу по sellPrice или mid.

Для реальной торговли надо добавить:
market order или limit order логика,
ожидание fill,
частичное исполнение,
проскальзывание,
обработку отмены/неисполнения,
повторное размещение ордера,
таймауты исполнения.

Баланс и риск-контроль на реальных средствах
Нужно добавить:
проверку реального доступного баланса перед открытием ордера,
резерв под комиссии,
лимиты дневного убытка,
лимит максимального риска на одну сделку,
лимит total exposure,
emergency stop.


Поддержку кошелька / сети / USDC
Для Polymarket обычно нужна вся цепочка:
кошелек,
USDC,
allowance / approval,
сеть,
возможно bridge / fund management.
То есть нужен не только “торговый запрос”, а полноценная обвязка под инфраструктуру аккаунта.

Просто запустите на пару дней и посмотрите как работает. Поиграйте с настройками.

ВАЖНО: в некоторых странах доступ возможен только через системы сокрытия трафика/IP.

Всем удачной торговли.
 

Вложения

Последнее редактирование:

Germango

Client
Регистрация
30.07.2013
Сообщения
95
Благодарностей
112
Баллы
33
@soprano прикольно, получается в теории этот бот может сигналить при ставках по типу той, которой сделал Magamyman за час до публичной новости? Имею ввиду что бот обнаружит, что кто-то занес мощную сумму - и дальше либо автоставка либо просто маякнёт в ТГ.
 

soprano

Client
Регистрация
25.08.2011
Сообщения
1 005
Благодарностей
1 217
Баллы
113
В теории - да. Всё надо тестировать, запустить на несколько дней и смотреть, что получается.
 
  • Спасибо
Реакции: Germango

kul0n

Client
Регистрация
10.03.2016
Сообщения
118
Благодарностей
77
Баллы
28
Спасибо за материал! Писал недавно похожий бот под зенку, конечно не без танцов с бубнами) Будет интересно посмотреть вашу реализацию.

UPD прочитал что все виртуально, жаль конечно) В целом под зенку запилить то что под споллером будет не просто, проще наверное сразу писать консольное приложения на С#

Для доступа к Polymarket не нужен VPN или карты, всё работает даже в стране под санкциями.
Тут вы не правы, во многих странах Polymarket запрещен.
 
Последнее редактирование:

smartmail

Client
Регистрация
18.04.2015
Сообщения
467
Благодарностей
244
Баллы
43
Спасибо за статью и реализацию, интересно
- особенно в связке с хайп-постами из телеги
о том, что кто-то снова озолотился в полимаркете :D
141330


Для доступа к Polymarket не нужен VPN или карты, всё работает даже в стране под санкциями.
не совсем так:
141329
 

soprano

Client
Регистрация
25.08.2011
Сообщения
1 005
Благодарностей
1 217
Баллы
113
Спасибо за статью и реализацию, интересно
- особенно в связке с хайп-постами из телеги
о том, что кто-то снова озолотился в полимаркете :D
Посмотреть вложение 141330


не совсем так:
Посмотреть вложение 141329
Вообще-то все правильно, я же не про торговлю говорю, а про доступ к платформе. Ставки не во всех странах разрешены, но это же не про санкции.
 

zhekan3

Client
Регистрация
27.12.2015
Сообщения
42
Благодарностей
6
Баллы
8
soprano Спасибо! Затестим, но снова пишет, что не хватает ddl-ки, хотя в папке она есть))
141333
141334
 
  • Спасибо
Реакции: soprano

soprano

Client
Регистрация
25.08.2011
Сообщения
1 005
Благодарностей
1 217
Баллы
113
Сам не знаю почему так, у меня тоже так же запускаются. Пускай разработчики ответят.
 
  • Спасибо
Реакции: zhekan3

smartmail

Client
Регистрация
18.04.2015
Сообщения
467
Благодарностей
244
Баллы
43
Вообще-то все правильно, я же не про торговлю говорю, а про доступ к платформе.
ну так-то у тебя статья не про описание платформы полимаркет, а про бот, который торгует на полимаркете:
Для доступа к Polymarket не нужен VPN или карты, всё работает даже в стране под санкциями.

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

zhekan3

Client
Регистрация
27.12.2015
Сообщения
42
Благодарностей
6
Баллы
8
В теории - да. Всё надо тестировать, запустить на несколько дней и смотреть, что получается.
Запустился, но после 1 интеграции выдает ошибку - "Выполнение действия CSharp OwnCode: v3. Доступ к ликвидированному объекту невозможен. Имя объекта: "SQLiteConnection"." и так по кругу
 

soprano

Client
Регистрация
25.08.2011
Сообщения
1 005
Благодарностей
1 217
Баллы
113
  • Спасибо
Реакции: smartmail

soprano

Client
Регистрация
25.08.2011
Сообщения
1 005
Благодарностей
1 217
Баллы
113
Запустился, но после 1 интеграции выдает ошибку - "Выполнение действия CSharp OwnCode: v3. Доступ к ликвидированному объекту невозможен. Имя объекта: "SQLiteConnection"." и так по кругу
Проверил, торгует сходу. Из настроек только bot token и chat_id нужны. Попробуйте библиотеку Sqlite удалить и снова добавить. И базу .db удалите созданную.
 

zhekan3

Client
Регистрация
27.12.2015
Сообщения
42
Благодарностей
6
Баллы
8
Проверил, торгует сходу. Из настроек только bot token и chat_id нужны. Попробуйте библиотеку Sqlite удалить и снова добавить. И базу .db удалите созданную.
Не помогло, и более того - после удаления dll новый не добавляется ни в какую, мистика прям ))

p.s. Да, и в самом конце кода нужно добавить "}", последняя строка, иначе ошибка
 

soprano

Client
Регистрация
25.08.2011
Сообщения
1 005
Благодарностей
1 217
Баллы
113
Заменил шаблон. У меня только что запускался. Надеюсь, у вас тоже заработает.
 

zhekan3

Client
Регистрация
27.12.2015
Сообщения
42
Благодарностей
6
Баллы
8

soprano

Client
Регистрация
25.08.2011
Сообщения
1 005
Благодарностей
1 217
Баллы
113
Буду искать, я немного почистил перед выкладыванием, наверно нечаянно удалил.
 

soprano

Client
Регистрация
25.08.2011
Сообщения
1 005
Благодарностей
1 217
Баллы
113
Ещё раз заменил, такой ошибки не должно быть.
 

smartmail

Client
Регистрация
18.04.2015
Сообщения
467
Благодарностей
244
Баллы
43
141356


как время будет - опусти порог пожалуйста до 7.8.4.0
 

soprano

Client
Регистрация
25.08.2011
Сообщения
1 005
Благодарностей
1 217
Баллы
113
Сделал 7.1.3.0
 
  • Спасибо
Реакции: smartmail

Кто просматривает тему: (Всего: 2, Пользователи: 0, Гости: 2)