الخلاصة السريعة
توفّر لك Polymarket ثلاث واجهات API عامة (واجهة API هي طريقة تتيح للبرامج قراءة التداولات أو تنفيذها تلقائيًا): CLOB للتداول، وGamma لاكتشاف الأسواق، وData للتحليلات. حزمة Python SDK الرسمية هي py-clob-client 0.34.6. تعتمد المصادقة على مفتاح API + توقيع ECDSA، وتُوقَّع الطلبات عبر EIP-712 من خلال محفظة وكيلة على Polygon. تضع حدود المعدّل سقفًا يقارب 60 طلبًا في الدقيقة لكل مفتاح. أكبر عقبة تواجه المطوّرين الجدد هي مشكلة ربط condition_id → token_id بين Gamma وCLOB. ابدأ بحلّها، وستصبح بقية الخطوات أوضح وأسهل. تُحقَّق على Polymarket مكافآت سيولة وفروق أسعار تلتقطها البوتات بنحو 40 مليون دولار شهريًا، ومعظمها تقريبًا من مستخدمي API.
الجزء 1: واجهات API الثلاث
تقسّم Polymarket العمل بوضوح بين ثلاث خدمات منفصلة. استخدام API المناسبة لكل مهمة يُبقي البوت سريعًا وبسيطًا وضمن حدود المعدّل.
| API | Base URL | Purpose | Auth Required |
|---|---|---|---|
| CLOB API | clob.polymarket.com | إنشاء الأوامر وإلغاؤها وتتبعها. قراءة دفاتر الأوامر. الاستعلام عن المراكز. | نعم (للتداول) |
| Gamma API | gamma-api.polymarket.com | استعراض الأسواق، وجلب البيانات الوصفية، والصور، وأسعار النتائج، والحجم، وتاريخ الانتهاء، والوسوم. | لا (عام) |
| Data API | data-api.polymarket.com | التداولات التاريخية، ولقطات المراكز، وتحليلات المستخدمين، وبيانات لوحة الصدارة. | لا (عام) |
تستخدم حلقة البوت النموذجية Gamma للعثور على الأسواق، وCLOB لجلب دفاتر الأوامر وتنفيذ التداولات، وData لاختبار أداء الاستراتيجية تاريخيًا دون اتصال. يمكنك اعتبار Gamma «الفهرس»، وCLOB «البورصة»، وData «المستودع».
الجزء 2: المصادقة ونموذج المحفظة الوكيلة
لا توقّع Polymarket التداولات باستخدام المفتاح الخاص لمحفظتك الرئيسية. بدلًا من ذلك، تستخدم محفظة وكيلة بأسلوب Gnosis Safe. تفوّض محفظتك الرئيسية محفظة وكيلة، وتتولى المحفظة الوكيلة تنفيذ جميع التداولات على Polygon. يتواصل بوت API الخاص بك مع تلك المحفظة الوكيلة.
ما تحتاج إليه
- مفتاح API - أنشئه من Polymarket Settings → Developer
- المفتاح الخاص - مفتاح محفظة التداول لديك (وليس عبارة الاسترداد لمحفظتك الرئيسية في MetaMask)
- عنوان المموّل - عنوان محفظتك الوكيلة (يظهر في Settings → Wallet)
- معرّف السلسلة -
137(شبكة Polygon الرئيسية) - نوع التوقيع -
1(POLY_PROXY، وهو المعيار للمستخدمين الأفراد)
الجزء 3: تثبيت py-clob-client
تُعدّ حزمة Python SDK الرسمية أسرع طريقة للانتقال من البداية إلى إرسال أول طلب لك. سنستخدم الإصدار 0.34.6، وهو الإصدار الحالي على PyPI (فبراير 2026) والإصدار الذي تعمل به تقريبًا معظم البوتات النشطة.
# Create a virtual environment first
python3 -m venv venv
source venv/bin/activate # macOS/Linux
venv\Scripts\activate # Windows
# Install the SDK
pip install py-clob-client==0.34.6 requests websocket-client python-dotenvإعدادات العميل الأساسية
import os
from dotenv import load_dotenv
from py_clob_client.client import ClobClient
from py_clob_client.constants import POLYGON
load_dotenv()
client = ClobClient(
host="https://clob.polymarket.com",
key=os.environ["POLY_PRIVATE_KEY"],
chain_id=POLYGON, # 137
signature_type=1, # POLY_PROXY
funder=os.environ["POLY_FUNDER"],
)
# One-time: derive and cache API credentials
client.set_api_creds(client.create_or_derive_api_creds())يوقّع استدعاء create_or_derive_api_creds() رسالة باستخدام مفتاحك الخاص، ثم يستبدل ذلك بمفتاح API وسرّ وعبارة مرور. خزّن هذه القيم في .env بعد التشغيل الأول، حتى لا تستدعي derive endpoint عند كل بدء تشغيل.
الجزء 4: اكتشاف الأسواق عبر Gamma
قبل أن تتمكّن من التداول، تحتاج إلى العثور على أسواق تستحق التداول. تُرجع Gamma بيانات JSON تحتوي على كل ما تعرضه واجهة Polymarket: السؤال، والنتائج، والأسعار، وحجم التداول خلال 24 ساعة، وتاريخ الانتهاء، والوسوم، والصور.
import requests
resp = requests.get(
"https://gamma-api.polymarket.com/markets",
params={
"active": "true",
"closed": "false",
"tag_slug": "politics",
"limit": 20,
"order": "volume24hr",
"ascending": "false",
},
timeout=10,
)
resp.raise_for_status()
markets = resp.json()
for m in markets:
print(f"{m['slug']:50} Yes ${float(m['outcomePrices'][0]):.3f} Vol24h ${m.get('volume24hr', 0):,.0f}")معاملات استعلام Gamma المفيدة
| Parameter | What it does |
|---|---|
tag_slug | التصفية حسب الفئة (سياسة، رياضة، عملات مشفرة، ثقافة، إلخ) |
active=true | الأسواق التي تقبل التداول حاليًا فقط |
closed=false | إخفاء الأسواق التي حُسمت |
order=volume24hr | الترتيب حسب حجم التداول الأخير (إشارة إلى السيولة) |
end_date_min | تاريخ ISO - لتجاوز الأسواق التي ستُحسم قريبًا جدًا |
limit | حتى 500 عنصر لكل صفحة (استخدم offset للتنقّل بين الصفحات) |
الجزء 5: ربط condition_id → token_id
هذه هي أكبر نقطة إزعاج عند بناء بوتات Polymarket. تُرجع Gamma قيمة condition_id (واحدة لكل سوق). أما تداولات CLOB فتستخدم token_id (واحدة لكل نتيجة). ستحتاج دائمًا إلى الاثنين معًا.
# Each Gamma market object contains 'clobTokenIds' - a JSON string array
import json
market = markets[0]
token_ids = json.loads(market['clobTokenIds']) # ['7410...', '1120...']
yes_token = token_ids[0] # First outcome
no_token = token_ids[1] # Second outcome
# Alternative: ask CLOB directly using condition_id
info = client.get_market(condition_id=market['conditionId'])
yes_token = info['tokens'][0]['token_id']تنبيه بخصوص ترتيب النتائج
مصفوفة outcomes في Gamma ومصفوفة clobTokenIds متطابقتان حسب الفهرس. اقرأ دائمًا تسمية النتيجة. لا تفترض أن الفهرس 0 هو "Yes". في الأسواق متعددة النتائج (NegRisk، الأوسكار، الانتخابات)، قد يكون الفهرس 0 هو "Kamala Harris" أو "Taylor Swift". الترتيب ثابت، لكنه خاص بكل سوق.
الجزء 6: قراءة دفاتر الأوامر
book = client.get_order_book(token_id=yes_token)
best_bid = float(book.bids[0].price) if book.bids else None
best_ask = float(book.asks[0].price) if book.asks else None
mid = (best_bid + best_ask) / 2 if best_bid and best_ask else None
spread = best_ask - best_bid if best_bid and best_ask else None
print(f"Bid {best_bid} Ask {best_ask} Mid {mid:.4f} Spread {spread:.4f}")تعود دفاتر الأوامر كمصفوفات مرتّبة (العروض bids تنازليًا، والطلبات asks تصاعديًا). يحتوي كل مستوى على price وsize. لتقدير الانزلاق السعري لطلب أكبر، مرّ على الدفتر واجمع القيمة الاسمية حتى تصل إلى الحجم المستهدف.
الجزء 6b: CLOB v2 REST Endpoints (مباشرة، بدون SDK)
تغلّف SDK هذه الواجهات، لكن معرفة endpoints المباشرة تساعدك على تصحيح الأخطاء، أو استخدام لغة أخرى، أو بناء عميل خفيف. عنوان Base URL: https://clob.polymarket.com. كل عمليات القراءة أدناه عامة - لا تحتاج إلى مصادقة. تم التحقق منها مباشرة في يونيو 2026.
| Endpoint | Method | What it returns |
|---|---|---|
/markets | GET | كل الأسواق (مع تقسيم الصفحات عبر next_cursor). يتضمن condition_id وtokens[] وminimum_tick_size وneg_risk. |
/sampling-markets | GET | الأسواق التي لديها دفتر أوامر نشط فقط - وهي أسرع طريقة للعثور على token_ids قابلة للتداول. |
/book?token_id= | GET | دفتر الأوامر الكامل: bids[] وasks[] مع السعر + الحجم. |
/price?token_id=&side=buy | GET | أفضل سعر لجهة معيّنة. side لا يميّز بين الأحرف الكبيرة والصغيرة (buy/BUY). يعيد {"price":"0.14"}. |
/midpoint?token_id= | GET | {"mid":"0.21"} - نقطة المنتصف بين أفضل bid وأفضل ask. |
/spread?token_id= | GET | {"spread":"0.14"} - أفضل ask ناقص أفضل bid. |
/tick-size?token_id= | GET | {"minimum_tick_size":0.01} - أصغر خطوة سعرية مسموح بها لذلك الرمز. |
/prices-history?market=&interval= | GET | نقاط الأسعار التاريخية. interval = 1m,1h,6h,1d,1w,max. |
/trades | GET | الصفقات الحديثة (تتطلب المصادقة لصفقاتك؛ وعامة لصفقات السوق). |
/order | POST | إرسال أمر موقّع (تتطلب المصادقة). |
/order | DELETE | إلغاء أمر واحد حسب المعرّف (مصادقة). |
/orders | GET | أوامرك المفتوحة والمعلّقة (مصادقة). |
/balance-allowance?asset_type= | GET | رصيد USDC لديك والسماحية على السلسلة (مصادقة). تحقّق منها قبل كل أمر. |
استجابات موثَّقة مباشرة من API الحي:
$ curl "https://clob.polymarket.com/price?token_id=7347...&side=buy"
{"price":"0.14"}
$ curl "https://clob.polymarket.com/midpoint?token_id=7347..."
{"mid":"0.21"}
$ curl "https://clob.polymarket.com/spread?token_id=7347..."
{"spread":"0.14"}
$ curl "https://clob.polymarket.com/tick-size?token_id=7347..."
{"minimum_tick_size":0.01}ترويسات مصادقة L2 (لاستخدام REST مباشرةً من دون SDK)
نقاط القراءة عامة. ولإجراء إرسال أو إلغاء الأوامر عبر REST مباشرةً، توقّع كل طلب باستخدام بيانات اعتماد API الخاصة بك. ينفّذ SDK ذلك نيابةً عنك؛ وفيما يلي ما يبنيه داخليًا:
| Header | What it carries |
|---|---|
POLY_ADDRESS | عنوان محفظة التوقيع الخاصة بك |
POLY_API_KEY | مفتاح API من create_or_derive_api_creds() |
POLY_PASSPHRASE | عبارة المرور من استدعاء الاشتقاق نفسه |
POLY_TIMESTAMP | ثواني UNIX الحالية (يجب أن تطابق ساعة الخادم - راجع نصيحة مزامنة الساعة) |
POLY_NONCE | nonce لكل طلب |
POLY_SIGNATURE | HMAC-SHA256 للقيمة timestamp + method + path + body، باستخدام secret الخاص بواجهة API كمفتاح، ومشفّرة بصيغة base64-url |
الجزء 7: إرسال الأوامر - الشراء والبيع
أمر محدد (GTC - الخيار الافتراضي)
from py_clob_client.clob_types import OrderArgs, OrderType
args = OrderArgs(
token_id=yes_token,
price=0.45,
size=100, # Shares, not dollars. 100 shares @ $0.45 = $45 max cost.
side="BUY",
)
signed_order = client.create_order(args)
response = client.post_order(signed_order, OrderType.GTC)
print(response)يوقّع استدعاء create_order رسالة منظّمة وفق EIP-712 باستخدام مفتاحك الخاص. بعد ذلك يرسلها post_order إلى CLOB. لا ترسل المفاتيح الخاصة الخام عبر الشبكة مطلقًا - بل الأوامر الموقّعة فقط.
اضبط السعر على tick أولًا
يجب أن يكون كل سعر أمر مضاعفًا دقيقًا لقيمة minimum_tick_size الخاصة بالسوق (0.01 في معظم الأسواق، و0.001 في الأسواق ذات الفروق الضيقة). يُرفض أي سعر لا يطابق tick. اجلب قيمة tick مرة واحدة وقرّب السعر إليها:
from py_clob_client.clob_types import OrderArgs, OrderType
tick = float(client.get_tick_size(token_id=yes_token)) # e.g. 0.01
def to_tick(p, tick): return round(round(p / tick) * tick, 4)
price = to_tick(0.453, tick) # -> 0.45 on a 0.01 marketBuy
side="BUY"، تكون size بوحدة الأسهم (وليس بالدولار). 100 سهم بسعر 0.45 دولارًا تكلف 45 دولارًا كحد أقصى، وتدفع 100 دولار إذا فازت النتيجة. الحد الأدنى لقيمة الأمر حوالي 1 دولار.
buy = OrderArgs(token_id=yes_token, price=to_tick(0.45, tick), size=100, side="BUY")
resp = client.post_order(client.create_order(buy), OrderType.GTC)
print(resp) # {'success': True, 'orderID': '0x...', 'status': 'live', ...}Sell
البيع يتم بالاستدعاء نفسه مع side="SELL". لا يمكنك بيع إلا الحصص التي تملكها بالفعل؛ ستُرفض محاولة بيع كمية تتجاوز مركزك مع خطأ "insufficient balance". ولـإغلاق مركز، بِع token_id نفسه الذي اشتريته.
sell = OrderArgs(token_id=yes_token, price=to_tick(0.62, tick), size=100, side="SELL")
resp = client.post_order(client.create_order(sell), OrderType.GTC)نظرة سريعة على معلمات الأمر
| Field | Meaning | Notes |
|---|---|---|
token_id | النتيجة التي تتداولها | ليس condition_id - راجع الجزء 5 |
side | BUY أو SELL | يتطلب BUY وجود USDC؛ ويتطلب SELL وجود حصص |
price | 0.001-0.999 | يجب أن يكون من مضاعفات حجم التكة |
size | عدد الحصص | الحد الأدنى لقيمة الأمر نحو 1 دولار أمريكي؛ التكلفة = السعر × الحجم |
| نوع الأمر | GTC / GTD / FOK / FAK | يُمرَّر إلى post_order(...) |
تجميع الخطوات: أول صفقة لك عبر API (سكربت واحد قابل للتشغيل)
هذا هو المسار الكامل من البداية إلى النهاية: الاتصال، العثور على سوق ذات سيولة، قراءة دفتر الأوامر، مواءمة السعر مع التكة، وضع أمر حقيقي صغير، ثم إلغاؤه. املأ القيمتين السريتين وشغّله. في أول تشغيل لك، ابدأ بحجم صغير جدًا (بضعة دولارات).
import os, json, requests
from dotenv import load_dotenv
from py_clob_client.client import ClobClient
from py_clob_client.constants import POLYGON
from py_clob_client.clob_types import OrderArgs, OrderType
load_dotenv()
# 1) Connect (signing key in your EOA, funds in your proxy/funder)
client = ClobClient(
"https://clob.polymarket.com",
key=os.environ["POLY_PRIVATE_KEY"],
chain_id=POLYGON, # 137
signature_type=1, # 1 = email/Magic proxy, 2 = browser-wallet proxy
funder=os.environ["POLY_FUNDER"],
)
client.set_api_creds(client.create_or_derive_api_creds()) # cache these after first run
# 2) Find the most-traded open market (Gamma, no auth)
m = requests.get(
"https://gamma-api.polymarket.com/markets",
params={"active": "true", "closed": "false", "order": "volume24hr",
"ascending": "false", "limit": 1}, timeout=10,
).json()[0]
token_id = json.loads(m["clobTokenIds"])[0] # index 0 = first outcome (read the label!)
print("Trading:", m["question"])
# 3) Read the book + the tick size
tick = float(client.get_tick_size(token_id))
book = client.get_order_book(token_id)
best_ask = float(book.asks[0].price)
print("best ask", best_ask, "| tick", tick)
# 4) Place a small BUY at the ask (tiny size to start)
price = round(round(best_ask / tick) * tick, 4) # snap to tick
order = OrderArgs(token_id=token_id, price=price, size=5, side="BUY") # 5 shares
resp = client.post_order(client.create_order(order), OrderType.GTC)
print(resp) # {'success': True, 'orderID': '0x...', ...}
# 5) Cancel it (clean up)
# client.cancel(order_id=resp["orderID"])أنواع الأوامر
| Type | Code | Behaviour | When to use |
|---|---|---|---|
| Good Till Cancelled | GTC | يبقى في دفتر الأوامر إلى أن يُنفَّذ أو تلغيه | الخيار الافتراضي. مناسب لمعظم استراتيجيات صناعة السوق والأوامر المحددة. |
| Good Till Date | GTD | يُلغى تلقائيًا عند طابع زمني محدد | للحالات المرتبطة بالأحداث: "ألغِ قبل 5 دقائق من بيان الفيدرالي" |
| Fill or Kill | FOK | يجب تنفيذ الحجم كاملًا فورًا، وإلا يُلغى بالكامل | أطراف المراجحة التي يفسدها التنفيذ الجزئي |
| Fill and Kill | FAK | ينفّذ ما يمكن تنفيذه عند السعر المحدد، ويلغي الباقي | أخذ السيولة بقوة؛ يعمل كأمر سوق مع سقف سعري |
الإلغاء
# Single order
client.cancel(order_id="0xabc...")
# Cancel all orders on a specific market
client.cancel_market_orders(market=market['conditionId'])
# Nuclear option: cancel everything
client.cancel_all()الجزء 8: البث عبر WebSocket
استطلاع Gamma كل ثانية يهدر الموارد، وستصل إلى حدود المعدل سريعًا. يوفّر بث WebSocket تحديثات فورية لدفتر الأوامر والصفقات بزمن تأخير أقل من ثانية.
import json, websocket
WS_URL = "wss://ws-subscriptions-clob.polymarket.com/ws/market"
def on_open(ws):
ws.send(json.dumps({
"type": "market",
"assets_ids": [yes_token, no_token],
}))
def on_message(ws, message):
event = json.loads(message)
if event.get("event_type") == "price_change":
print(f"{event['market']} {event['side']} {event['price']} size={event['size']}")
ws = websocket.WebSocketApp(
WS_URL,
on_open=on_open,
on_message=on_message,
)
ws.run_forever(ping_interval=20)توجد قناتان للبث. تنقل قناة /market دفتر الأوامر العام والصفقات. وتنقل قناة /user أحداث أوامرك وتنفيذاتك الخاصة (مع مصادقة). تتصل بوتات الإنتاج بالقناتين، وتعيد الاتصال تلقائيًا عند انقطاعه، وتتعامل مع WebSocket باعتباره مصدر الحقيقة لدفتر الأوامر الحالي.
الجزء 9: حدود المعدل والتراجع
| Endpoint class | Limit | Burst |
|---|---|---|
| وضع الأوامر (CLOB) | ~60 في الدقيقة لكل مفتاح API | ~10 في الثانية |
| إلغاء الأوامر | ~120 في الدقيقة | ~20 في الثانية |
| قراءات بيانات السوق (دفتر CLOB) | ~300 في الدقيقة | أعلى، ويتفاوت |
| Gamma API | سخية؛ احترم استجابات 429 | - |
| رسائل WebSocket | لا يوجد حد عملي للرسائل الواردة | - |
عندما تصل إلى HTTP 429، يعيد الخادم ترويسة Retry-After. استخدم تراجعًا أُسيًا مع jitter:
import random, time
def post_with_backoff(fn, *args, max_retries=6):
for attempt in range(max_retries):
try:
return fn(*args)
except Exception as e:
if "429" in str(e):
sleep = (2 ** attempt) + random.random()
time.sleep(min(sleep, 30))
continue
raise
raise RuntimeError("Too many retries")الجزء 10: بنية بوت مرجعية
كل بوت موثوق على Polymarket يتكوّن من المكوّنات الستة نفسها. ابنِ كل مكوّن كوحدة مستقلة، واجعل الترابط بينها خفيفًا.
| Component | Responsibility | APIs used |
|---|---|---|
| الماسح | مهمة مجدولة: تجلب الأسواق المطابقة لمعاييرك (الوسوم، حجم التداول، الأيام المتبقية حتى الانتهاء) | Gamma |
| محرك الأسعار | يحافظ على دفاتر أوامر محلية محدثة لحظيًا عبر WebSocket | CLOB WS |
| مولّد الإشارات | دالة صرفة: حالة دفتر الأوامر + البيانات الوصفية → المركز المستهدف | - (في الذاكرة) |
| مدير الأوامر | يقارن الأوامر الحالية بالهدف، ثم يضع أو يلغي الأوامر بأقل قدر ممكن | CLOB REST |
| مدير المخاطر | يفرض سقوفًا لكل سوق، وحدودًا للخسارة اليومية، وآليات إيقاف تلقائي | - (في الذاكرة + قاعدة بيانات) |
| المسجّل ودفتر القيود | يحفظ كل قرار وتنفيذ وإلغاء. يغذي تقارير الضرائب ويساعد في تصحيح الأخطاء. | SQLite / Postgres |
الجزء 11: أنماط الإخفاق الشائعة
- رفض السعر غير المطابق للحد الأدنى للتغير - يجب أن يكون السعر مضاعفًا دقيقًا لقيمة
minimum_tick_sizeالخاصة بالسوق. اجلبها عبر/tick-size?token_id=وقرّب السعر قبل التوقيع، وإلا فسيُرفض الأمر. - 404 "No orderbook exists" - استعلمت عن
/bookأو/priceأو/midpointلرمز مغلق أو محسوم. استخدم/sampling-marketsللعثور على رموز لها دفتر أوامر نشط. - بيانات WebSocket المتقادمة - تتبّع وقت آخر رسالة لكل أصل؛ إذا لم تصل تحديثات لأكثر من 30 ثانية في سوق نشط، فافرض تحديثًا عبر REST.
- تصادمات nonce - يتولى py-clob-client إدارة قيم nonce للأوامر نيابةً عنك، لكن إذا كنت تطوّر الموقّع الخاص بك، فزد قيمة nonce مع كل أمر.
- رصيد غير كافٍ - تحقق دائمًا من رصيد USDC قبل وضع الأمر؛ فقد يعرض الدفتر أمرك، لكن نظام المطابقة سيرفضه.
- السوق متوقف مؤقتًا أو قيد الحسم - تحقق من
market.active && !market.closedقبل التداول. تتأخر تحديثات Gamma عن CLOB بضع ثوانٍ قرب الحسم. - عدم تطابق محوّل NegRisk - تُوجَّه الأسواق متعددة النتائج عبر محوّل NegRisk منفصل. يتولى SDK ذلك، لكن تأكد من أن أمرك ذهب إلى وجهة التداول الصحيحة.
الجزء 12: مكافآت السيولة عبر API
تدير Polymarket مكافآت سيولة عامة بقيمة نحو 5 ملايين دولار شهريًا إضافةً إلى مكافآت مخصصة للرياضة بقيمة أكثر من 5 ملايين دولار شهريًا (راجع مكافآت السيولة). يذهب معظمها إلى صنّاع السوق المعتمدين على API. فهم يحافظون على عروض شراء وبيع بفوارق ضيقة عبر آلاف الأسواق.
تفضّل صيغة المكافآت الأوامر القريبة من نقطة المنتصف، مع أخذ الحجم ومدة بقاء الأمر في الدفتر في الحسبان. فيما يلي حلقة مبسطة لصناعة السوق:
- اقرأ دفتر الأوامر للسوق المستهدف
- احسب نقطة منتصف عادلة (مثلًا، VWAP لأفضل 3 مستويات على كل جانب)
- ضع عرض شراء عند
mid − spread_target/2وعرض بيع عندmid + spread_target/2 - مع كل تحديث WebSocket، أعد التسعير إذا ابتعد عرضك عن الهدف بأكثر من وحدة تغير سعرية واحدة
- ألغِ الأوامر واخرج إذا ضعفت السيولة في الدفتر أو ظهرت أخبار مؤثرة
الجزء 13: الانتقال إلى بيئة الإنتاج
- الاستضافة: يكفي خادم VPS بسعر 6 دولارات شهريًا (Hetzner، DigitalOcean) في أوروبا أو شرق الولايات المتحدة لمعظم البوتات. استضِفه قرب Polygon RPC إذا احتجت إلى زمن تأخير أقل من 10 مللي ثانية.
- RPC: استخدم Alchemy أو Infura أو QuickNode للحصول على Polygon RPC موثوق. تكفي الباقات المجانية إلى أن تبدأ بوضع مئات الأوامر في الدقيقة.
- المراقبة: استخدم Prometheus + Grafana للمقاييس، وبوت Telegram للتنبيهات. سجّل كل معرّف أمر ترسله وكل تنفيذ تستلمه.
- النسخ الاحتياطي: احفظ الحالة كل دقيقة. إذا تعطل خادم VPS أثناء تنفيذ جزئي، فستحتاج إلى الاستئناف خلال ثوانٍ، لا إلى المطابقة يدويًا.
- الضرائب: المسجّل لديك هو أيضًا سجل التدقيق؛ راجع دليل الضرائب.
الجزء 14 - نصائح احترافية مجرّبة لاستخدام Polymarket API
ورقة مختصرة: الموقف → الإجراء
| Situation | Action | Why |
|---|---|---|
| 401 "invalid api key" عند أول استدعاء | تحقّق من أن signature_type يطابق منشأ المحفظة وأن funder هو عنوان الوكيل | عدم التطابق بين النوع 1 والنوع 2 يفسّر 80% من أخطاء 401؛ والباقي سببه استخدام EOA كـ funder |
| رُفضت الأوامر برسالة "insufficient balance" | استعلم عن /balance-allowance قبل كل أمر، واحجز الرصيد محليًا | يحجز CLOB الضمان فور نشر الأمر؛ وقد يؤدي أمران متزامنان إلى حجز المبلغ نفسه مرتين |
| تقييد بمعدل 429 على endpoint /order | تراجع تدريجيًا مع jitter: 2^attempt + random() بحد أقصى 30 ثانية | Cloudflare يبطئ الطلبات بدلًا من رفضها؛ وإعادة المحاولة الساذجة تضخّم التراكم |
| انقطع WebSocket أثناء الصفقة | خذ لقطة للدفتر عبر REST، وصالح الحالة المحلية، ثم اشترك من جديد | تضيع التحديثات التفاضلية أثناء فترة الانقطاع؛ وتعيد اللقطة مزامنة سلالم الأسعار |
| وُضع الأمر لكن لم يصل تأكيد التنفيذ | استعلم عن /data/order/{id} خلال 5 ثوانٍ؛ إذا كان معلّقًا فانتظر، وإذا لم يُعثر عليه فاستبدله | حالة نادرة لكنها قابلة للاسترداد؛ اجعل القاعدة الافتراضية: "تحقّق من الحالة، ثم تصرّف" |
| حُسم السوق أثناء عرض سعر نشط | ألغِ كل الأوامر المفتوحة على ذلك conditionId عند حدث الحسم | قد تبقى أوامر ما بعد الحسم كتنفيذات شبحية إذا تسببت غرائب المهايئ في ذلك |
| تشغيل بوت لصناعة السوق | قدّم أسعارًا ضمن 2 سنت من midpoint وبحجم يزيد عن 100 سهم | تعطي صيغة المكافآت وزنًا لضيق الفارق + الحجم + مدة البقاء في الدفتر؛ الضيق + الحجم + الاستمرارية هي ما يفوز |
| تشغيل بوت موازنة على سوق متعدد النتائج | استخدم FOK لكل leg، وليس GTC | التنفيذ الجزئي في leg A مع تنفيذ كامل في leg B = تعرض غير مغطى وخسارة فورية |
| هذه أول مرة تبني فيها بوتًا | ابنِ الماسح أولًا، ثم محرّك التسعير، ثم الإشارة — لا تبدأ بالإشارة أبدًا | الإشارات بلا حالة دفتر نظيفة مصائد ارتباط؛ اجعل خطوط البيانات تعمل أولًا |
| تعطّل بوت الإنتاج عند 3 صباحًا | وفّر إعادة تشغيل تلقائية عبر systemd + تنبيه Telegram + حالة مستمرة | أي بوت يعمل بلا مراقبة سيتعطل؛ السؤال الوحيد هو هل سيُعاد تشغيله بسلاسة |
ماذا بعد؟
- الأدوات والموارد - لوحات معلومات وتحليلات ومصادر بيانات من جهات خارجية تكمل API
- استراتيجيات متقدمة - موازنة متعددة legs وتركيبات شبيهة بالخيارات مناسبة للبوتات
- مكافآت السيولة - الصيغ الدقيقة لكسب حسومات صناعة السوق
- دليل دفتر الأوامر - فهم أعمق لقراءة الدفتر قبل أن تبرمج ضده
- المصطلحات - تعريفات مبسطة لكل مصطلح في هذا الدليل











