পলিমার্কেট বট টিউটোরিয়াল · অধ্যায় 8 / 32

বটের জন্য পলিমার্কেট CLOB API: order book snapshot-এর জন্য REST endpoints, real-time আপডেটের জন্য WebSocket subscriptions, bids/asks parsing, mid-price এবং depth computing, code samples.

এই অধ্যায়ে কী আছে

CLOB API-ই হলো সেই জায়গা যেখানে orders sign করা হয়, পাঠানো হয়, match করা হয়, এবং order book থাকে। পলিমার্কেট-এর দুইটি SDK generation আছে - deprecated v1 এবং বর্তমান v2। এই অধ্যায়ে শুধু v2 cover করা হয়েছে; 2026-এ আপনি যে bot ship করবেন তাতে v1 থাকা উচিত নয়। আমরা REST snapshot path, WebSocket update channel, নতুন builder-দের আটকে দেওয়া parsing details, এবং reconnect logic নিয়ে আলোচনা করব - এগুলো ছাড়া একটি long-running bot কয়েক ঘণ্টার মধ্যেই out of sync হয়ে যায়।

  • CLOB v1 vs v2 (use v2]
  • Order book REST snapshot
  • WebSocket subscriptions: market and user channels
  • Parsing bids/asks/depth
  • Computing mid-price and best-bid/ask
  • Maker fees, taker fees, rebates
  • Code: connect WS and process price-change events
  • Reconnect and gap-handling

CLOB v1 vs v2 (use v2]

পলিমার্কেট দুইটি SDK generation maintain করে। v1 (@polymarket/clob-client on npm, py-clob-client <0.30) deprecated এবং 2024-এ যোগ হওয়া বেশ কিছু order type নেই। v2 (@polymarket/clob-client-v2 Node-এ v1.0.2, Python-এ py-clob-client 0.34.6+) হলো current standard।

তিনটি concrete difference। v2 multi-outcome market-এর জন্য negRisk flag support করে - NegRisk exchange late 2024-এ চালু হওয়ার পর থেকে এটি required। v2 WebSocket message shape-এর জন্য TypeScript types ship করে; v1 any return করে। v2 August 2025-এর Gnosis Safe signature flow natively handle করে; v1-এ custom signing glue লাগে।

এই অধ্যায়ের বাকি অংশ জুড়ে আমরা v2 ধরে লিখছি। আপনি যদি কোনো পুরনো tutorial-এ v1 code দেখেন, প্রমাণ না হওয়া পর্যন্ত সেটিকে broken ধরে নিন - বিশেষ করে NegRisk market-এ order placement v1-এ silently ভুল exchange contract-এ route হতে পারে।

Order book REST snapshot

REST snapshot endpoint নির্দিষ্ট একটি token-এর পূর্ণ book একটি নির্দিষ্ট সময়ে return করে।

GET https://clob.polymarket.com/book?token_id=<ERC1155_TOKEN_ID>

Response shape:

{
  "market": "0x...",
  "asset_id": "5413...",
  "timestamp": "1715600000000",
  "hash": "0x...",
  "bids": [{"price":"0.45","size":"120"}, {"price":"0.44","size":"380"}, ...],
  "asks": [{"price":"0.47","size":"85"}, {"price":"0.48","size":"210"}, ...]
}

Price string আকারে 2-3 decimal place-এ আসে; size হলো share count-এর string (dollar নয়)। Bids high-to-low sorted, asks low-to-high sorted। hash হলো deduplication marker - unchanged book-এর repeated poll একই hash return করে এবং আপনার bot processing skip করতে পারে।

একবারের lookup-এর জন্য REST snapshot-ই সঠিক পছন্দ (entry decision-এ price check)। Continuous monitoring-এর জন্য নিচের WebSocket channel ব্যবহার করুন।

WebSocket subscriptions: market and user channels

দুটি WebSocket channel গুরুত্বপূর্ণ।

Market channel: wss://ws-subscriptions-clob.polymarket.com/ws/market. এক বা একাধিক token subscribe করুন; order-book update যতক্ষণ ঘটছে ততক্ষণ তা receive করবেন।

{"type":"Market","markets":["0xCondId1","0xCondId2"]}

প্রতি change-এ message আসে। Type-এর মধ্যে আছে book (full snapshot), price_change (delta), tick_size_change (rare), এবং last_trade_price (সর্বশেষ fill)।

User channel: wss://ws-subscriptions-clob.polymarket.com/ws/user. Authenticated; আপনার own order event - fills, partial fills, cancellations - receive করবেন।

{"type":"User","auth":{"apiKey":"...","secret":"...","passphrase":"..."}}

Fill detect করার জন্য user channel সবচেয়ে clean way। orders REST endpoint poll করা বেশি expensive এবং poll-এর মধ্যে state change miss করতে পারে; WebSocket matcher সেটা acknowledge করার মুহূর্তেই event push করে।

Parsing bids/asks/depth

Order book হলো aggregated size-সহ price level-এর একটি list। ঠিকভাবে ধরার জন্য দুটি parsing convention গুরুত্বপূর্ণ।

Order direction: bids হলো buy order (এই price-এ কেউ BUY করতে চায়)। যখন আপনার bot sell করে, তখন আপনি একটি bid hit করেন। যখন আপনার bot buy করে, তখন আপনি ask lift করেন। পলিমার্কেট UI একই direction দেখায়; অন্য কিছু exchange উল্টোভাবে দেখায়।

Sorting: bids descending order-এ আসে (best bid প্রথমে)। asks ascending order-এ আসে (best ask প্রথমে)। Best bid হলো bids[0]; best ask হলো asks[0]। সতর্ক থাকুন: public WebSocket কখনও কখনও partial book update পাঠায় যা pre-sorted নয় - কোনো merge-এর পরে সবসময় defensively re-sort করুন।

কোনো level-এ depth মানে হলো transactable dollar value: price * size। Top-5-level depth একটি common liquidity metric: sum(b.price * b.size for b in bids[:5])। যদি top-5 depth $100-এর নিচে হয়, book illiquid এবং বেশিরভাগ strategy assumption ভেঙে যায়।

Computing mid-price and best-bid/ask

আপনার bot-এর দরকার তিনটি derived price point।

  • Best bid / best ask: bids[0].price এবং asks[0].price. আপনি বাস্তবে যেটাতে trade করতে পারবেন, এক share-এর জন্য।
  • Mid-price: (best_bid + best_ask) / 2. Spread-এর mathematical center। valuation-এর জন্য useful; আপনি mid-এ trade করেন না।
  • VWAP price for size N: cumulative size N-এ পৌঁছানো পর্যন্ত book walk করুন, তারপর size-weighted average price return করুন। এখনই N share BUY করার আসল cost, deeper level sweep ধরেই।

Edge case: bid বা ask side empty থাকা (কেউ sell করছে না, বা কেউ buy করছে না) মানে book one-sided। পলিমার্কেট-এর market structure-এ এটা resolved বা near-resolved market-এ ঘটে, যেখানে এক side 0.999-এ এবং loser side-এ কেউ liquidity offer করে না। best-bid = 0 বা best-ask = 1-কে "do not trade" signal হিসেবে নিন।

Maker fees, taker fees, rebates

পলিমার্কেট maker-taker fee model চালায়। মে 2026 অনুযায়ী সংখ্যা:

  • Taker fee: 0 (zero) - existing book liquidity lift করা order-এ কোনো fee নেই। মনে রাখবেন proxy operation-এ gas / network cost প্রযোজ্য।
  • Maker rebate: small positive, programmatic, eligible reward-program market-এ filled rested order অনুযায়ী paid out হয়। সব market-এ rewards নেই।
  • NegRisk markets: একই fee structure, তবে separate exchange contract-এ; rewards আলাদাভাবে accrue করে।

Zero taker fee পলিমার্কেট-কে traditional CFD venue থেকে অর্থবহভাবে আলাদা করে - বেশিরভাগ trading "cost" হলো bid-ask spread নিজেই, explicit fee নয়। প্রতিটি trade-এ spread cross করা strategy-র জন্য spread tax-ই আসল cost; সাধারণ book-এ round-trip 1-3 cents ধরে নিন, illiquid market-এ আরও বেশি।

Maker rebate chase করা কেবল তখনই worth করে যখন liquidity-rewards-eligible market আপনার strategy idea-এর সঙ্গে মিলে যায়। Chapter 19-এ liquidity-rewards farming একটি dedicated approach হিসেবে cover করা হয়েছে।

Code: connect WS and process price-change events

Minimal Node example: connect করুন, subscribe করুন, একটি token-এর জন্য প্রতিটি price-change event log করুন।

import WebSocket from "ws";
const ws = new WebSocket("wss://ws-subscriptions-clob.polymarket.com/ws/market");
ws.on("open", () => {
  ws.send(JSON.stringify({ type: "Market", markets: ["<CONDITION_ID>"] }));
});
ws.on("message", (data) => {
  const msg = JSON.parse(data.toString());
  if (msg.event_type === "price_change") {
    console.log("price_change", msg.asset_id, msg.changes);
  } else if (msg.event_type === "book") {
    console.log("book snapshot", msg.bids?.[0], msg.asks?.[0]);
  }
});
ws.on("close", () => console.log("closed"));
ws.on("error", (e) => console.error("err", e.message));

একটি WebSocket connection-এ প্রায় 30 token পর্যন্ত subscribe করা আরামদায়ক। এর বেশি হলে multiple connection-এ split করুন - server মাঝে মাঝে error না দিয়েই বড় subscription drop করে দেয়, ফলে silent stale book read তৈরি হয়।

Reconnect and gap-handling

একটি long-running WebSocket connection drop করবে। Cloudflare কয়েক ঘণ্টা পরপর connection cycle করে; network blink করে; পলিমার্কেট কখনও কখনও deploy করে। সে অনুযায়ী পরিকল্পনা করুন।

Reconnect strategy: close বা error-এ min(2^attempt, 30) seconds jitter-সহ wait করুন, তারপর re-subscribe করুন। Reconnect-এর পরে প্রথম successful message-এ attempt counter reset করুন।

Gap handling reconnect speed-এর চেয়ে বেশি গুরুত্বপূর্ণ। WebSocket disconnected থাকার সময় book নড়েছে। প্রতিটি reconnect-এ subscribed token-এর REST snapshot আবার fetch করুন এবং reconcile করুন: যেকোনো open position whose book meaningfully moved, state re-check দরকার; exits fire করতে হতে পারে; alarm stale হতে পারে। "আমি 30 seconds-এর book update miss করেছি" - এটা long-running bot-এর silent killer; bot stale state-এ চালতে থাকে এবং এমন price-এ order দেয় যা আর নেই।

Defensive pattern: WebSocket state যাই হোক না কেন, প্রতি মিনিটে সব subscribed book-এর snapshot নিন, এবং WS-কে snapshot poll-এর উপর built একটি fast-path optimization হিসেবে ধরুন।

প্রায়শই জিজ্ঞাসিত প্রশ্ন

পলিমার্কেট CLOB API endpoint কী?
Base CLOB endpoint হলো https://clob.polymarket.com (REST) এবং wss://ws-subscriptions-clob.polymarket.com/ws/market (WebSocket)। এগুলোই V2 endpoint, যা @polymarket/clob-client-v2 এবং py-clob-client ব্যবহার করে।
Order book পড়তে কি API key লাগে?
না। Order book read (snapshot এবং WebSocket subscription) public এবং কোনো authentication লাগে না। শুধু order place/cancel করা এবং account-specific data (positions, fills) পড়ার জন্য API key লাগে।
CLOB WebSocket কত দ্রুত price update push করে?
Order match হওয়ার গতিতে। Active market-এ প্রতি কয়েকশো millisecond-এ update দেখা যায়; thin market-এ শুধু actual order-এ update হয়। Depth change এবং trade event উভয়ই একই WS channel দিয়ে যায় - প্রতিটিকে সঠিকভাবে handle করতে event type parse করুন।
আমি কীভাবে পলিমার্কেট order book-এর mid-price compute করব?
mid = (best_bid + best_ask) / 2 যদি দুটোই থাকে; না থাকলে fallback হিসেবে last_trade_price ব্যবহার করুন। Thin book-এ সতর্ক থাকুন যেখানে best_bid best_ask-এর অনেক নিচে - তখন mid অর্থহীন হতে পারে। Mid-কে fair price হিসেবে ধরার আগে সবসময় spread-ও বিবেচনা করুন।
2026-এ পলিমার্কেট-এর maker fee কত?
বেশিরভাগ category-তে 0%। Maker-রা taker fee-এর 20-25% সমপরিমাণ rebate earn করে। Taker fee category অনুযায়ী ভিন্ন: sports 0.75%, politics 1.00%, economics 1.25%, crypto 1.80%। Rebate-vs-fee asymmetry-ই কারণ যে active bot প্রায় সবসময় market order-এর বদলে limit order দিয়ে quote করে।
WebSocket disconnect হলে কীভাবে handle করব?
Exponential backoff (1s, 2s, 4s, max 30s) দিয়ে reconnect করুন, একই market-এ re-subscribe করুন, এবং gap পূরণ করতে একটি REST snapshot আবার fetch করুন। Stale order book-এ কখনও ভরসা করবেন না - যদি 5 seconds-এর বেশি disconnected থাকেন, order place করার আগে fresh snapshot request করুন।