পলিমার্কেট বট টিউটোরিয়াল ·
পলিমার্কেট 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 |
|---|---|---|---|
| Sports | 1 | NBA | 745 |
| Crypto | 21 | NFL | 450 |
| Politics | 2 | Tennis | 864 |
| Bitcoin | 100196 | Esports | 702 |
| Ethereum | 100383 | Soccer | 1059 |
| Election | 3 | EPL | 739 |
| Middle East | 1432 | UCL | 2186 |
?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 বা ট্যাগ দিয়ে ফিল্টার করুন।


