Polymarket Bot Tutorial · Chapter 3 of 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, code samples.
Що охоплює цей розділ
Вибір мови значно менш вирішальний, ніж це сприймають більшість розробників. 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.
- У вас є сильна наявна експертиза? Якщо ви щодня пишете на Python, пишіть bot на Python. Якщо ви щодня пишете на TypeScript, пишіть bot на Node. Нижче differences у якості SDK реальні, але вони менші за ціну боротьби з незнайомою мовою.
- Чи є strategy latency-critical? Якщо ваша edge залежить від реакції менш ніж за 50ms (5-minute crypto markets, market-making під час news), hot path виграє від Rust або Go. Більшості strategies це не потрібно.
- Чи будете ви запускати більше ніж одну strategy? Один Python process може комфортно керувати 10-20 markets. Понад це async Node або split-process Python масштабуються краще.
Чесний default для першого bot - Python. Перемикайтеся лише тоді, коли виміряне обмеження змусить це зробити.
Python (default choice)
Python є default, тому що SDK найповніший, а цикл ітерації найшвидший. py-clob-client у версії 0.34.6 (May 2026) покриває кожен важливий endpoint CLOB v2: market і limit orders, варіанти FOK/FAK/GTC, reads order book, reads балансу/allowance, а також direct chain operations через web3.py.
Переваги: mature SDK, простий data analysis з pandas, велика спільнота, web3.py для on-chain reads. Недоліки: async ergonomics незручніші, ніж у JavaScript, GIL обмежує multi-core speedups (зазвичай це не має значення для bot, що працює з I/O), startup time на cold containers повільний.
Рекомендовано для: 80% розробників. Особливо для тих, чия strategy включає backtesting, statistical analysis або будь-яку data work поряд із execution.
Node.js (full-stack devs)
Node.js - це stack із другою найкращою підтримкою. @polymarket/clob-client-v2 у версії 1.0.6 покриває ті самі endpoints, що й Python SDK, із TypeScript types всюди. Async нативний і швидкий; WebSocket handling чудовий.
Переваги: найкраща async story, native TypeScript types, велика ecosystem для HTTP + WS, легко deploy-ити на тому ж Node runtime, що й web dashboard. Недоліки: для великих token IDs потрібен BigInt або обробка як string (ERC-1155 IDs - 256-bit), data tools на кшталт pandas слабші.
Рекомендовано для: розробників, які вже підтримують JavaScript stack і хочуть один runtime. Також: для тих, хто будує dashboard разом із bot - спільні types між bot core і Next.js dashboard прибирають цілий клас багів.
Rust (latency-critical hot path)
У Rust немає офіційного Polymarket SDK. Ви будуєте напряму проти V2 REST і WebSocket APIs, використовуючи reqwest (HTTP), tokio-tungstenite (WebSocket) і ethers-rs або alloy для signing. Це приблизно два дні setup work проти 30 хвилин у Python.
Переваги: native EIP-712 signing без JS subprocess, sub-millisecond order construction, deterministic memory profile під навантаженням, без GC pauses. Недоліки: без SDK ви реалізуєте заново те, що користувачі Python отримують безкоштовно (clobToken ID parsing, response schema validation, salt/nonce management). Виграш у latency становить 20-100ms порівняно з добре налаштованим Python, і це має значення лише для sub-second strategies.
Рекомендовано для: hot path market-making bot або trade-firing leg news-arb bot. Майже ніколи - для всього bot.
Setup commands per stack
Мінімальні команди для working signed order проти mainnet (один endpoint CLOB v2).
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.
When to mix stacks (Python control plane + Rust hot path)
Pattern, до якого сходяться багато production bots: Python для всього, що пов’язане з decisions, Rust - для execution leg, де важливі мілісекунди.
Архітектура: 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. Node version daemon цілком підходить для sub-100ms; Rust справді виправдовує себе лише нижче 50ms.












