Polymarket Bot Tutorial · Глава 3 из 32
Выберите свой Polymarket bot stack: Python (py-clob-client 0.34.6), Node.js (@polymarket/clob-client-v2 v1.0.6) или Rust (официального SDK нет, сборка на ethers-rs). Плюсы, минусы, latency, примеры кода.
Что рассматривается в этой главе
Выбор языка куда менее важен, чем это обычно представляют многие разработчики. Polymarket предоставляет одни и те же REST и WebSocket endpoints для любого языка; выбор SDK в основном определяет, сколько glue code вы напишете сами. У Python и Node есть официально поддерживаемые SDK; у Rust его нет, но для hot path это вполне реализуемо. В этой главе мы разберём trade-offs, покажем одну и ту же задачу "fetch order book" на каждом языке, чтобы разница была наглядной, и закончим mixed-stack pattern, к которому на практике приходят большинство production bots.
- Decision framework
- Python (default choice)
- Node.js (full-stack devs)
- Rust (latency-critical hot path)
- Setup commands per stack
- Code skeleton: fetch order book in 3 languages
- When to mix stacks (Python control plane + Rust hot path)
Decision framework
Три вопроса закрывают 90% выбора stack.
- Есть ли у вас сильный уже имеющийся skill? Если вы каждый день пишете на Python, пишите bot на Python. Если вы каждый день пишете на TypeScript, пишите bot на Node. Различия в качестве SDK ниже - реальные, но они меньше, чем цена борьбы с незнакомым языком.
- Является ли strategy latency-critical? Если ваше edge зависит от реакции быстрее 50ms (crypto markets на 5 минут, market-making во время новостей), hot path выигрывает от Rust или Go. Большинству strategies это не нужно.
- Будете ли вы запускать больше одной strategy? Один Python process может комфортно управлять 10-20 markets. Выше этого async Node или Python с разделением процессов масштабируется лучше.
Честный default для первого bot - Python. Переходите на другой stack только если измеримое ограничение заставляет это сделать.
Python (default choice)
Python - default choice, потому что SDK самый полный, а цикл итераций самый быстрый. py-clob-client версии 0.34.6 (май 2026) покрывает все важные endpoints CLOB v2: market и limit orders, варианты FOK/FAK/GTC, чтение order book, чтение balance/allowance, а также direct chain operations через web3.py.
Плюсы: mature SDK, удобный data analysis с pandas, большое community, web3.py для on-chain reads. Минусы: async ergonomics хуже, чем в JavaScript, GIL ограничивает multi-core speedup (для I/O-bound bot это обычно неважно), startup time в cold containers медленный.
Рекомендуется для: 80% builders. Особенно для тех, чья strategy включает backtesting, statistical analysis или любую работу с данными вместе с execution.
Node.js (full-stack devs)
Node.js - второй по качеству поддержки stack. @polymarket/clob-client-v2 версии 1.0.6 покрывает те же endpoints, что и Python SDK, с TypeScript types повсюду. Async - нативный и быстрый; обработка WebSocket отличная.
Плюсы: лучшая история с async, нативные TypeScript types, большой ecosystem для HTTP + WS, легко деплоить в том же Node runtime, что и web dashboard. Минусы: для больших token IDs требуется точность чисел через BigInt или обработка строк (ERC-1155 IDs - 256-bit), инструменты работы с данными уровня pandas слабее.
Рекомендуется для: builders, которые уже поддерживают JavaScript stack и хотят один runtime. Также для тех, кто строит dashboard вместе с bot - общий use of types между core bot и Next.js dashboard убирает целый класс bugs.
Rust (latency-critical hot path)
У Rust нет официального Polymarket SDK. Вы строите решения напрямую поверх V2 REST и WebSocket APIs, используя reqwest (HTTP), tokio-tungstenite (WebSocket) и ethers-rs или alloy для signing. Это примерно два дня setup вместо 30 минут в Python.
Плюсы: native EIP-712 signing без JS subprocess, sub-millisecond order construction, детерминированный memory profile под нагрузкой, без GC pauses. Минусы: без SDK вам приходится заново реализовывать то, что Python users получают бесплатно (parsing clobToken ID, validation schema response, management salt/nonce). Выигрыш в latency - 20-100ms по сравнению с хорошо настроенным Python, и он важен только для sub-second strategies.
Рекомендуется для: hot path market-making bot или trade-firing части news-arb bot. Почти никогда - для всего bot целиком.
Setup commands per stack
Минимальные команды для рабочего signed order в mainnet (один CLOB v2 endpoint).
Python:
python -m venv venv && source venv/bin/activate
pip install py-clob-client==0.34.6 web3 python-dotenv
# Set POLYGON_RPC, PRIVATE_KEY, POLY_FUNDER in .env
Node:
npm init -y
npm install @polymarket/[email protected] ethers dotenv
# Set POLYGON_RPC, PRIVATE_KEY, POLY_FUNDER in .env
Rust:
cargo new --bin pmt
cd pmt
cargo add tokio reqwest serde serde_json ethers alloy tungstenite tokio-tungstenite
# Hand-write signer + endpoint client; no SDK shortcut.
Time-to-first-order: ~10 min Python, ~15 min Node, ~4-8 hours Rust.
Code skeleton: fetch order book in 3 languages
Одна и та же задача - получить order book для Polymarket token - в каждом stack. Все три варианта обращаются к одному и тому же CLOB v2 REST endpoint.
Python (py-clob-client):
from py_clob_client.client import ClobClient
client = ClobClient(host="https://clob.polymarket.com", chain_id=137)
book = client.get_order_book("<token_id>")
print(book.bids[:3], book.asks[:3])
Node (@polymarket/clob-client-v2):
import { ClobClient } from "@polymarket/clob-client-v2";
const c = new ClobClient({ host: "https://clob.polymarket.com", chain: 137 });
const book = await c.getOrderBook("<token_id>");
console.log(book.bids.slice(0,3), book.asks.slice(0,3));
Rust (direct HTTP):
let url = format!("https://clob.polymarket.com/book?token_id={}", token);
let book: serde_json::Value = reqwest::get(&url).await?.json().await?;
println!("{:?} {:?}", &book["bids"][..3], &book["asks"][..3]);
Одинаковая response shape во всех трёх. Цена Rust - в остальном: signing, order construction, error handling - а не в read path.
Когда смешивать stack (Python control plane + Rust hot path)
Паттерн, к которому приходят многие production bots: Python для всего, что связано с decisions, Rust - для millisecond execution leg.
Architecture: Python process читает market state, запускает strategy logic и записывает небольшой command file (например, {"action":"buy","token":"...","size":10,"price":0.45}) в Unix socket. Rust daemon слушает этот socket, подписывает order и отправляет его в CLOB. Python process может быть медленным и удобным; Rust daemon - быстрым и минимальным.
Handoff - ключевой момент: изолируя signed-order step, мы возвращаем себе crash budget Python без потери latency. Мы используем именно этот pattern в наших production bots - Python emits intentions, Node daemon на /tmp/clob.sock занимается signing. Версия daemon на Node подходит для sub-100ms; Rust начинает действительно оправдывать себя только ниже 50ms.












