পলিমার্কেট বট টিউটোরিয়াল ·

পলিমার্কেট Gamma API-এর গভীর বিশ্লেষণ: /events এবং /markets এন্ডপয়েন্ট, পেজিনেশন, ট্যাগ ID (864 Tennis, 745 NBA, ইত্যাদি), 24h ভলিউম অনুযায়ী ফিল্টারিং, রেট-সীমা, এবং Python ও Node কোড নমুনা।

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

Gamma হলো পলিমার্কেটের ক্যাটালগ API - এটি ফ্রন্ট-এন্ডে দেখানো প্রতিটি ইভেন্ট, প্রতিটি বাজার, ট্যাগ, ছবি, এবং নিষ্পন্ন ফলাফল তালিকাভুক্ত করে। CLOB API ট্রেড করে; Gamma বলে কী ট্রেডযোগ্য। আবিষ্কার-স্তরে বেশিরভাগ বট-বাগ আসে এই দুটোকে গুলিয়ে ফেলা থেকে, অথবা পেজিনেশন-চুক্তি মিস করার কারণে। এই অধ্যায়টি Gamma-এর প্রধান এন্ডপয়েন্টের ক্ষেত্র-রেফারেন্স, যেখানে আমাদের প্রোডাকশন ফেচার যে সঠিক প্যারামিটার-আচরণের ওপর নির্ভর করে তা দেখানো হয়েছে।

এটি পলিমার্কেট ট্রেডিং বট তৈরি নিয়ে আমাদের 32-অধ্যায়ের সিরিজের 7ম অধ্যায়। নিচের অংশগুলোতে আমরা বিষয়টি গভীরভাবে কভার করেছি। প্রতিটি অংশের মূল লেখা অধ্যায়-ভিত্তিকভাবে লেখা ও প্রকাশ হচ্ছে; FAQ উত্তর ও রেফারেন্স ইতিমধ্যে সম্পূর্ণ এবং আমাদের নিজের ট্রেডার চালানোর প্রোডাকশন-অভিজ্ঞতা প্রতিফলিত করে।

  • Gamma বনাম CLOB: কখন কোনটি ব্যবহার করবেন
  • /events এন্ডপয়েন্টের গঠন
  • /markets এন্ডপয়েন্টের গঠন
  • ট্যাগ এবং ট্যাগ ID (যাচাইকৃত তালিকা)
  • ফিল্টারিং: active, closed, volume24hr অনুক্রম
  • পেজিনেশন এবং সীমা
  • রেট-সীমা এবং ক্যাশিং
  • কোড: শীর্ষ 24h-ভলিউমের বাজার আনা

Gamma বনাম CLOB: কখন কোনটি ব্যবহার করবেন

দুটি ভিন্ন কাজের জন্য দুটি ভিন্ন সার্ভিস।

Gamma (gamma-api.polymarket.com): ক্যাটালগ। এটি ইভেন্ট, বাজার, ট্যাগ, বিবরণ, ছবি, নিষ্পন্ন ফলাফল, 24-ঘণ্টার ভলিউম, মোট ভলিউম, শেষ তারিখ তালিকাভুক্ত করে। শুধু-পড়া HTTP। বেশিরভাগ পড়ার জন্য প্রমাণীকরণ লাগে না। অবিরত আপডেট হয়, তবে ক্রমশ-সঙ্গতিপূর্ণ - সদ্য বন্ধ হওয়া কোনো বাজার কয়েক সেকেন্ডের জন্যও closed: false দেখাতে পারে।

CLOB (clob.polymarket.com): ট্রেডিং + অর্ডার বুক। এটি বর্তমান সেরা বিড/আস্ক, শীর্ষ-N বুক-গভীরতা, সাম্প্রতিক ট্রেড তালিকাভুক্ত করে। লেখার এন্ডপয়েন্টের জন্য প্রমাণীকৃত (অর্ডার বসানো, বাতিল)। বুক-আপডেটের জন্য রিয়েল-টাইম WebSocket চ্যানেল পাওয়া যায়।

মূল নিয়ম: কী ট্রেড করবেন তা খুঁজতে Gamma ব্যবহার করুন; ট্রেড করতে CLOB ব্যবহার করুন। Gamma থেকে দাম পড়া বট পুরনো ডেটা ব্যবহার করছে - Gamma-এর দাম-ক্ষেত্র CLOB-এর অর্ডার বুকের চেয়ে কম ঘন ঘন আপডেট হয়। CLOB থেকে বাজারের মেটাডেটা পড়া মানে অপ্রয়োজনীয় বেশি অনুরোধ করা।

/events এন্ডপয়েন্টের গঠন

GET /events ইভেন্ট-স্তরের ডেটা ফেরত দেয়। একটি "ইভেন্ট" হলো একটি পলিমার্কেট পাতা; একটি ইভেন্টের মধ্যে একাধিক বাজার থাকতে পারে (যেমন 2024 Presidential Election ইভেন্টে প্রতিটি প্রার্থীর জন্য একটি করে বাজার আছে)।

মূল ক্ষেত্র:

  • slug: URL-নিরাপদ শনাক্তকারী, ইভেন্টের জীবনকাল জুড়ে স্থির।
  • title, description: মানুষের প্রদর্শনের জন্য।
  • endDate (ISO 8601): কখন ইভেন্ট বন্ধ হবে।
  • active, closed: বুলিয়ান; লাইভ ইভেন্টের জন্য কোয়েরিতে ?active=true&closed=false একসঙ্গে ব্যবহার করুন।
  • volume, volume24hr: USD মোট।
  • tags: ট্যাগ-অবজেক্টের অ্যারে (নিচের ট্যাগ অংশ দেখুন)।
  • markets: শিশু বাজার-অবজেক্টের অ্যারে (/markets গঠন দেখুন)।

সবচেয়ে সাধারণ আবিষ্কার-প্যাটার্ন: GET /events?active=true&closed=false&order=volume24hr&ascending=false&limit=100। এটি বর্তমানে লাইভ থাকা সর্বোচ্চ ভলিউমের 100টি ইভেন্ট ফেরত দেয়।

/markets এন্ডপয়েন্টের গঠন

GET /markets বাজার-স্তরের ডেটা ফেরত দেয়। একটি বাজার হলো একটি Y/N বা বহু-ফলাফল কন্ট্রাক্ট; এটি একটি ইভেন্টের ভিতরে থাকে।

মূল ক্ষেত্র:

  • slug: URL-নিরাপদ শনাক্তকারী।
  • question: ট্রেডিং পাতায় দেখানো শিরোনাম (যেমন "Will Trump be president on January 1, 2027?")।
  • outcomes: ফলাফল-নামের JSON স্ট্রিং, যেমন '["Yes","No"]'। বাইনারির জন্য সবসময় দুটি উপাদান; NegRisk-এর জন্য আরও বেশি।
  • outcomePrices: দশমিক আকারে বর্তমান দামের JSON স্ট্রিং, যেমন '["0.62","0.38"]'। উভয় দিকের যোগফল স্প্রেড বাদে প্রায় 1.0।
  • clobTokenIds: outcomes-এর সঙ্গে সারিবদ্ধ ERC-1155 টোকেন ID-এর JSON স্ট্রিং। এগুলোই আপনি আসলে কেনেন/বেচেন।
  • negRisk: বুলিয়ান; বহু-ফলাফল যোগফল-১ বাজারের জন্য true। অর্ডার বসানোর ক্ষেত্রে গুরুত্বপূর্ণ (অধ্যায় 11)।

outcomes / outcomePrices / clobTokenIds ক্ষেত্রগুলো পার্সড অ্যারে হিসেবে নয়, JSON স্ট্রিং হিসেবে আসে - ব্যবহারের আগে JSON-ডিকোড করুন।

ট্যাগ এবং ট্যাগ ID (যাচাইকৃত তালিকা)

ট্যাগ হলো শ্রেণিগত লেবেল (Sports, Crypto, Tennis, NBA, ইত্যাদি)। সবচেয়ে বেশি ব্যবহৃত শ্রেণিগুলোর যাচাইকৃত প্রোডাকশন ট্যাগ ID:

ট্যাগIDট্যাগID
Sports1NBA745
Crypto21NFL450
Politics2Tennis864
Bitcoin100196Esports702
Ethereum100383Soccer1059
Election3EPL739
Middle East1432UCL2186

?tag_id=745 ব্যবহার করে নির্দিষ্ট ট্যাগে ফিল্টার করুন, অথবা স্লাগ দিয়ে ?tag_slug=nba দিন। স্লাগ-ভিত্তিক ফিল্টারিং কোডে বেশি পাঠযোগ্য, কিন্তু একটু ধীর; প্রোডাকশন ডিফল্ট হলো ID-ভিত্তিক।

ফিল্টারিং: active, closed, volume24hr অনুক্রম

যে চারটি ফিল্টার-মাত্রা আপনি 95% সময় ব্যবহার করবেন।

  • active=true|false: true দিলে পলিমার্কেট টিম UI থেকে লুকিয়ে রাখা বাজার বাদ পড়ে।
  • closed=true|false: false দিলে নিষ্পন্ন বাজার বাদ পড়ে। active=true&closed=false সংমিশ্রণটি লাইভ ফিল্টারের মধ্যে সবচেয়ে সাধারণ।
  • order=volume24hr, order=volume, order=endDate: সাজানোর কি। বর্তমানে সক্রিয় বাজার খুঁজতে সবচেয়ে উপযোগী হলো volume24hr।
  • ascending=true|false: বেশিরভাগ এন্ডপয়েন্টে ডিফল্ট হলো true; ভলিউম অনুক্রমে প্রায় সবসময় false চাইবেন।

সতর্কতা: tag_id দিয়ে ফিল্টার করার সঙ্গে order=volume24hr ও ascending=false একত্রে দিলে, ট্যাগে লাইভ বাজার খুব কম থাকলে কখনও কখনও ফাঁকা পাতা ফেরত আসতে পারে। এ ক্ষেত্রে সবসময় অতিরিক্ত আনুন (যা দেখাবেন তার চেয়ে বেশি অনুরোধ করুন) এবং পরে ফিল্টার করুন।

পেজিনেশন এবং সীমা

limit প্যারাম প্রতি কলে 1-500 পর্যন্ত গ্রহণ করে। উল্লেখ না করলে ডিফল্ট হলো 100। 500-এর বেশি দিলে সার্ভার নীরবে সীমাবদ্ধ করে - আপনি 500 পাবেন, কিন্তু প্রতিক্রিয়ায় আরও আছে কি না তার কোনো ইঙ্গিত থাকবে না।

পেজিনেশন offset-ভিত্তিক: দ্বিতীয় পাতার জন্য ?limit=500&offset=500। এখানে কার্সর-ভিত্তিক পেজিনেশন নেই, তাই যুগপৎ ইনসার্টের ফলে কলের মধ্যে পাতা-সীমা সরে যেতে পারে। অধিকাংশ বটের আবিষ্কারের জন্য এটি গ্রহণযোগ্য; আর্কাইভ-স্ক্র্যাপের জন্য স্থিতিশীল ক্ষেত্র (endDate বা createdAt) দিয়ে সাজান এবং slug দিয়ে ওভারল্যাপ শনাক্ত করুন।

"সব লাইভ বাজার" পাওয়ার ব্যবহারিক প্যাটার্ন: limit=500&order=volume24hr&ascending=false আনুন। এতে ভলিউম অনুযায়ী শীর্ষ 500 কভার হয়, যা মূলত অ-তুচ্ছ কার্যকলাপ থাকা প্রায় সব বাজার। পাতা 1-এর বাইরে যাওয়া খুব কমই দরকার - ভলিউম-বণ্টনের লেজে থাকা বাজারগুলো সংজ্ঞাগতভাবেই কার্যকলাপের জায়গা নয়।

রেট-সীমা এবং ক্যাশিং

Gamma-এর সামনে Cloudflare আছে এবং IP অনুযায়ী নরম রেট-সীমা প্রয়োগ করে। প্রোডাকশন চাপে দেখা অভিজ্ঞতাগত সীমা:

  • একটি IP থেকে ~30 req/sec পর্যন্ত টানা: ঠিক আছে।
  • 100+ req/sec আকস্মিক: মাঝে মাঝে 429 আসে, রিট্রাই সফল হয়।
  • ~500 req/sec টানা: রেট-সীমা পাতা বা সাময়িক ব্লক (10-60s)।

প্রকাশিত প্রতিক্রিয়া-হেডারে বেশিরভাগ এন্ডপয়েন্টের জন্য Cache-Control মান 30-60 সেকেন্ড থাকে। এটি মানুন - একই ইভেন্ট এক মিনিটে 10 বার পুনরায় আনার কোনো লাভ নেই। প্রোডাকশন ক্যাশিং প্যাটার্ন: পূর্ণ URL কি করে ইন-প্রসেস LRU + TTL, 30s TTL। এতে অনুরোধ-সংখ্যা বাঁচে এবং বিলম্ব কমে।

উচ্চ-কম্পাঙ্কের কৌশলের জন্য, Gamma ডেটাকে একটি স্থানীয় স্টোরে মিরর করুন যা একটিমাত্র ফেচার-প্রসেস দ্বারা আপডেট হবে; একাধিক গ্রাহক সেই স্টোর থেকে পড়বে। একটি ফেচার × অনেক গ্রাহক > অনেক ফেচার × Gamma।

কোড: শীর্ষ 24h-ভলিউমের বাজার আনুন

তিনটি ভাষায় রেফারেন্স ফেচার, যা 24-ঘণ্টার ভলিউম অনুযায়ী শীর্ষ 50টি লাইভ বাজার ফেরত দেয়।

Python:

import requests
r = requests.get("https://gamma-api.polymarket.com/events",
                 params={"active":"true","closed":"false",
                         "order":"volume24hr","ascending":"false","limit":50},
                 timeout=10)
for ev in r.json()[:50]:
    print(ev["slug"], ev.get("volume24hr"))

Node:

const url = "https://gamma-api.polymarket.com/events?active=true&closed=false" +
            "&order=volume24hr&ascending=false&limit=50";
const events = await fetch(url).then(r => r.json());
for (const ev of events) console.log(ev.slug, ev.volume24hr);

Curl:

curl -s "https://gamma-api.polymarket.com/events?active=true&closed=false&order=volume24hr&ascending=false&limit=50" \
  | jq '.[].slug'

পলিমার্কেট gamma /events এন্ডপয়েন্ট ফ্রি-টেক্সট অনুসন্ধান প্যারামিটার সমর্থন করে না - ?q=foo বা ?search=foo যোগ করলে নীরবে ডিফল্ট অনুক্রম ফেরত আসে। slug বা ট্যাগ দিয়ে ফিল্টার করুন।

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

পলিমার্কেট Gamma API কী?
Gamma হলো পলিমার্কেটের মেটাডেটা ও আবিষ্কার API। এটি ইভেন্ট/বাজারের তালিকা, শিরোনাম, বিবরণ, শেষ তারিখ, ট্যাগ, এবং সমষ্টিগত ভলিউম দেয়। এটি রিয়েল-টাইম অর্ডার বুক ডেটা দেয় না - সেটি থাকে CLOB API-তে। বেশিরভাগ আবিষ্কার ও বিশ্লেষণের ক্ষেত্রে আপনি Gamma থেকেই শুরু করবেন।
পলিমার্কেটে ইভেন্ট ও বাজারের মধ্যে পার্থক্য কী?
একটি ইভেন্ট এক বা একাধিক বাজারকে দলবদ্ধ করে, যেগুলো একই প্রশ্ন-থিম ভাগ করে। একটি বাজার হলো নির্দিষ্ট Yes/No ফলাফল, যার নিজস্ব অর্ডার বুক ও টোকেন ID আছে। একটি "2026 NBA Champion" ইভেন্টে 30টি বাজার থাকে (প্রতি দলের জন্য একটি করে)। বাইনারি Yes/No ইভেন্টের নিচে 1টি অন্তর্নিহিত বাজার থাকে।
পলিমার্কেট ট্যাগ ID কীভাবে খুঁজব?
ট্যাগ gamma /tags এন্ডপয়েন্টের মাধ্যমে উন্মুক্ত হয়। আমরা প্রোডাকশনে যেসব যাচাইকৃত ID ব্যবহার করি: 864 Tennis, 745 NBA। URL-এ ট্যাগ স্লাগ (?tag_slug=tennis) ও ফ্রি-টেক্সট কোয়েরি (?q=tennis) অনির্ভরযোগ্য - কেবল সংখ্যাসূচক tag_id ব্যবহার করুন। স্লাগের ওপর নির্ভর করার আগে /tags পরীক্ষা করুন।
পলিমার্কেট ইভেন্টকে 24h ভলিউম অনুযায়ী কীভাবে সাজাব?
/events?order=volume24hr&ascending=false - এটিই বেশিরভাগ "trending markets" উইজেটের ভিত্তি। মেয়াদোত্তীর্ণ বা বিরত বাজার বাদ দিতে active=true&closed=false-এর সঙ্গে মিলিয়ে দিন। limit ডিফল্ট 25; প্রতি কলে সর্বোচ্চ 500।
Gamma-তে পেজিনেশন সীমা আছে কি?
হ্যাঁ। /events ও /markets এন্ডপয়েন্ট limit (প্রতি কলে সর্বোচ্চ 500) এবং পেজিনেশনের জন্য offset গ্রহণ করে। বেশিরভাগ লাইব্রেরি স্বয়ংক্রিয়ভাবে পেজিনেট করে না - সম্পূর্ণ তালিকা দরকার হলে `limit`-এর চেয়ে কম ফলাফল পাওয়া পর্যন্ত offset দিয়ে লুপ করুন।
Gamma কি WebSocket সমর্থন করে?
না। Gamma কেবল REST। রিয়েল-টাইম আপডেটের (দাম-পরিবর্তন, নতুন বাজার, অর্ডার বুক) জন্য CLOB WebSocket ব্যবহার করুন - এই সিরিজের অধ্যায় 8-এ তা আলোচিত।