Polymarket Bot Tutorial · الفصل 3 من 32

اختر حزمة Polymarket bot الخاصة بك: Python (py-clob-client 0.34.6)، أو Node.js (@polymarket/clob-client-v2 v1.0.6)، أو Rust (لا يوجد SDK رسمي، ابنِ على ethers-rs). المزايا، العيوب، زمن الاستجابة، وأمثلة على الكود.

ما الذي يغطيه هذا الفصل

اختيار اللغة أقل أهمية بكثير مما يتعامل معه معظم المطورين. يوفّر Polymarket نفس REST وWebSocket endpoints لكل اللغات؛ واختيار SDK يحدد غالبًا مقدار كود الربط الذي ستكتبه بنفسك. لدى Python وNode SDKs تتم صيانتها رسميًا؛ أما Rust فلا يملك SDK رسميًا، لكنه قابل للتنفيذ في المسار الحرج. يستعرض هذا الفصل المفاضلات، ويعرض نفس مهمة "جلب دفتر الأوامر" في كل لغة حتى يكون الفرق ملموسًا، وينتهي بنمط stack مختلط هو ما ينتهي إليه معظم bots الإنتاجية فعليًا.

  • إطار اتخاذ القرار
  • Python (الخيار الافتراضي)
  • Node.js (مطورو full-stack)
  • Rust (المسار الحرج شديد الحساسية للاتجاه)
  • أوامر الإعداد لكل stack
  • Skeleton للكود: جلب order book بثلاث لغات
  • متى تخلط بين stacks (Python control plane + Rust hot path)

إطار اتخاذ القرار

ثلاثة أسئلة تحسم 90% من اختيار stack.

  1. هل لديك مهارة قوية سابقة؟ إذا كنت تكتب Python يوميًا، فاكتب bot بـ Python. إذا كنت تكتب TypeScript يوميًا، فاكتب bot بـ Node. الفروقات في جودة الـ SDK أدناه حقيقية، لكنها أصغر من تكلفة الصراع مع لغة غير مألوفة.
  2. هل الاستراتيجية شديدة الحساسية للـ latency؟ إذا كانت ميزتك تعتمد على التفاعل في أقل من 50ms (أسواق crypto لمدة 5 دقائق، market-making أثناء الأخبار)، فإن المسار الحرج يستفيد من Rust أو Go. معظم الاستراتيجيات لا تحتاج إلى ذلك.
  3. هل ستشغّل أكثر من استراتيجية واحدة؟ يمكن لعملية Python واحدة إدارة 10-20 سوقًا بسهولة. وما بعد ذلك، يكون Node async أو Python مقسّم العمليات أكثر قابلية للتوسع.

الافتراضي الصريح لأول bot هو Python. لا تنتقل إلا عندما يفرض عليك قيدٌ مقاس ذلك.

Python (الخيار الافتراضي)

Python هو الخيار الافتراضي لأن الـ SDK هو الأكثر اكتمالًا ولأن دورة التجربة والتكرار هي الأسرع. يغطي py-clob-client بالإصدار 0.34.6 (مايو 2026) كل CLOB v2 endpoints المهمة: أوامر السوق والأوامر المحددة، ونسخ FOK/FAK/GTC، وقراءة order book، وقراءة الرصيد/allowance، وعمليات on-chain المباشرة عبر web3.py.

المزايا: SDK ناضج، تحليل بيانات سهل مع pandas، مجتمع كبير، وweb3.py للقراءات on-chain. العيوب: ergonomics الخاصة بـ async أقل سلاسة مقارنةً بـ JavaScript، وGIL يحد من تحسين السرعة عبر تعدد الأنوية (وهو نادرًا ما يهم في bot يعتمد على I/O)، ووقت الإقلاع على containers الباردة بطيء.

موصى به لـ: 80% من المطورين. خصوصًا أي شخص تتضمن استراتيجيته backtesting أو التحليل الإحصائي أو أي عمل بيانات إلى جانب التنفيذ.

Node.js (مطورو full-stack)

Node.js هو stack الثاني من حيث جودة الدعم. يغطي @polymarket/clob-client-v2 بالإصدار 1.0.6 نفس الـ endpoints الموجودة في Python SDK مع Typescript types في كل مكان. async أصلي وسريع؛ والتعامل مع WebSocket ممتاز.

المزايا: أفضل قصة لـ async، Typescript types أصلية، منظومة كبيرة لـ HTTP + WS، وسهولة النشر على نفس runtime الخاص بـ Node مثل لوحة الويب. العيوب: دقة الأرقام تتطلب BigInt أو التعامل كنصوص مع token IDs الكبيرة (IDs الخاصة بـ ERC-1155 هي 256-bit)، وأدوات البيانات المكافئة لـ pandas أضعف.

موصى به لـ: المطورين الذين يديرون أصلًا stack JavaScript ويريدون runtime واحدًا. وكذلك: أي شخص يبني dashboard إلى جانب bot - مشاركة الأنواع بين bot core وdashboard مبني بـ Next.js تزيل فئة من الأخطاء.

Rust (المسار الحرج شديد الحساسية للـ latency)

لا يوجد SDK رسمي لـ Polymarket في Rust. تبني مباشرةً فوق V2 REST وWebSocket APIs باستخدام reqwest (HTTP)، وtokio-tungstenite (WebSocket)، وethers-rs أو alloy للتوقيع. هذا يعني تقريبًا يومين من الإعداد مقابل 30 دقيقة في Python.

المزايا: EIP-712 signing أصلي دون subprocess من JS، وإنشاء الأوامر في أقل من millisecond، وبصمة ذاكرة حتمية تحت الحمل، ولا توجد pauses من GC. العيوب: عدم وجود SDK يعني أنك تعيد تنفيذ ما يحصل عليه مستخدمو Python مجانًا (parsing لـ clobToken ID، والتحقق من schema للردود، وإدارة salt/nonce). مكسب الـ latency يكون 20-100ms مقارنةً بـ Python مضبوط جيدًا، وهذا يهم فقط للاستراتيجيات ذات الزمن تحت الثانية.

موصى به لـ: المسار الحرج في bot market-making، أو الجزء الذي يطلق الصفقات في bot news-arb. ونادرًا ما يكون هو bot بالكامل.

أوامر الإعداد لكل stack

أقل الأوامر اللازمة للحصول على order موقّع يعمل على mainnet (نقطة 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.

الوقت حتى أول order: حوالي 10 دقائق في Python، وحوالي 15 دقيقة في Node، و4-8 ساعات في Rust.

Skeleton للكود: جلب order book بثلاث لغات

نفس المهمة - جلب order book لرمز Polymarket - في كل 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]);

نفس شكل الرد في اللغات الثلاث. تكلفة Rust تظهر في كل ما عدا ذلك - التوقيع، وإنشاء الأوامر، والتعامل مع الأخطاء - وليس في مسار القراءة.

متى تخلط بين stacks (Python control plane + Rust hot path)

النمط الذي تصل إليه كثير من bots الإنتاجية: Python لكل ما يتعلق بالقرارات، وRust لطبقة التنفيذ التي تعمل في millisecond.

البنية: عملية Python تقرأ حالة السوق، وتشغّل منطق الاستراتيجية، وتكتب ملف أوامر صغيرًا (مثلًا {"action":"buy","token":"...","size":10,"price":0.45}) إلى Unix socket. ثم يستمع daemon مكتوب بـ Rust على ذلك الـ socket، ويوقّع الأمر، ويرسله إلى CLOB. يمكن لعملية Python أن تكون بطيئة ومريحة؛ بينما daemon المكتوب بـ Rust سريع ومختصر.

نقطة التسليم هي الأساس: عبر عزل خطوة التوقيع على order، يتم استرجاع هامش تحمّل الأعطال في Python من دون التضحية بالـ latency. نحن نستخدم هذا النمط نفسه في bots الإنتاج الخاصة بنا - Python يرسل النوايا، وdaemon بـ Node على /tmp/clob.sock يتولى التوقيع. نسخة Node من الـ daemon مناسبة لما دون 100ms؛ أما Rust فلا يستحق العناء إلا تحت 50ms.

الأسئلة الشائعة

هل py-clob-client متوافق مع Polymarket V2؟
نعم. py-clob-client 0.34.6 (الإصدار الذي نشغله في الإنتاج على VPS لدينا حتى مايو 2026) متوافق مع V2 ويعمل مع ترحيل collateral إلى pUSD. يتم تثبيت الحزمة عبر "pip install py-clob-client".
ما هو SDK الرسمي لـ Polymarket على Node.js؟
@polymarket/clob-client-v2 (حاليًا v1.0.6 حتى مايو 2026). إن "v2" في اسم الحزمة مهم - الحزمة الأقدم @polymarket/clob-client هي V1 ولا يُنصح بها للمشاريع الجديدة. ثبّتها عبر "npm install @polymarket/clob-client-v2".
هل يوجد SDK رسمي لـ Polymarket في Rust؟
لا. حتى مايو 2026 لا يوجد SDK رسمي لـ Rust من Polymarket. يبني مستخدمو Rust مباشرةً فوق V2 REST وWebSocket APIs باستخدام ethers-rs (لتوقيع EIP-712) وreqwest أو hyper (لـ HTTP/WS). هذا يتطلب كودًا أكثر، لكن مكاسب الـ latency والتوازي مهمة لـ market making.
هل يمكنني استخدام Go لـ Polymarket bot؟
نعم، تقنيًا - لدى Go مكتبات جيدة لـ HTTP وEthereum (go-ethereum). لا يوجد SDK رسمي لـ Go، لذلك ستبني فوق REST API مباشرةً. لا نرى Go مستخدمًا بكثرة لـ Polymarket bots مثل Python أو Node.js، لكنه ممكن تمامًا.
هل يجب أن أستخدم Python أم Node.js إذا كنت أعرفهما معًا؟
استخدم Python إذا كانت استراتيجيتك كثيفة البحث والتحليل (pandas، NumPy، scikit-learn). واستخدم Node.js إذا كانت استراتيجيتك لحظية / driven-by-events وتريد اللغة نفسها للعميل والخادم. كلاهما يصل إلى نفس CLOB endpoints؛ وكلاهما سريع بما يكفي لأي استراتيجية غير HFT.
هل أحتاج إلى TypeScript مع Node SDK؟
ليس شرطًا، لكنه موصى به. يأتي @polymarket/clob-client-v2 مع TypeScript types، واصطياد أخطاء الأنواع وقت البناء يوفر الكثير من التصحيح عندما تكون payloads الخاصة بـ EIP-712 أو أنواع الأوامر خاطئة.
ما مدى السرعة التي يحتاجها Polymarket bot؟
معظم الاستراتيجيات تكفيها milliseconds، وليس microseconds. تفيد بنية السوق في الرياضة وmarket making من زمن أقل من 100ms؛ أما arbitrage على الأخبار فيتحمل 500-1000ms. استخدم Python لمنطق الاستراتيجية، وانتقل إلى Rust للمسار الحرج فقط إذا أثبت profiling للـ latency أنه مهم لميزتك.