פרק 27 מתוך 33

הגרסה הקצרה

פולימרקט חושפת שלושה APIs ציבוריים: CLOB (מסחר), Gamma (גילוי שווקים), ו-Data (אנליטיקה). ה-SDK הרשמי של Python הוא py-clob-client 0.34.6. האימות משתמש ב-מפתח API + חתימת ECDSA, כאשר פקודות נחתמות באמצעות EIP-712 דרך ארנק פרוקסי של Polygon. מגבלות הקצב מציבות אתכם בערך על 60 פקודות/דקה לכל מפתח. המלכוד הגדול ביותר למפתחים חדשים הוא בעיית המיפוי condition_id → token_id בין Gamma ל-CLOB - פותרים אותה קודם, וכל השאר מסתדר. בערך 40M$ לחודש בתגמולי נזילות וב-מרווח (spread) שנלכד בידי בוטים נצברים בפולימרקט, כמעט כולו בידי משתמשי API.

מה תלמדו: איך שלושת ה-APIs משתלבים יחד, איך להתקין ולהגדיר py-clob-client, איך לאמת עם ארנק הפרוקסי שלכם, איך למשוך שווקים וספרי פקודות, איך להניח ולבטל פקודות, איך להזרים עדכוני מחיר בזמן אמת דרך WebSocket, מהן מגבלות הקצב המדויקות ואיך לבצע backoff בצורה נקייה, ואיך לבנות ארכיטקטורת בוט מוכנה לייצור שתוכלו להרחיב.
דרישות קדם: חשבון Polymarket טעון עם לפחות עסקה ידנית אחת שבוצעה, Python 3.8+ (או Node.js), והיכרות בסיסית עם HTTP, JSON, וקוד async. אם עדיין לא מסחרתם ידנית, התחילו עם העסקה הראשונה לפני חיבור בוט.
תרשים ארכיטקטורה: CLOB, Gamma ו-Data APIs

שלושה שירותים נפרדים: CLOB ‏(9,000/10s auth) למסחר, Gamma ‏(4,000/10s public) לגילוי, Data ‏(1,000/10s public) לניתוח היסטורי.

01
פרק ראשון

חלק 1: שלושת ה-APIs

פולימרקט מפרידה בצורה נקייה בין תחומי האחריות דרך שלושה שירותים נפרדים. שימוש ב-API הנכון לכל משימה שומר על הבוט מהיר, פשוט, ובתוך מגבלות הקצב.

APIBase URLמטרהנדרש אימות
CLOB APIclob.polymarket.comהנחה, ביטול ומעקב אחר פקודות. קריאת ספרי פקודות. שאילתת פוזיציות.כן (למסחר)
Gamma APIgamma-api.polymarket.comעיון בשווקים, שליפת מטא-דאטה, תמונות, מחירי תוצאות, נפח, תפוגה, תגיות.לא (ציבורי)
Data APIdata-api.polymarket.comעסקאות היסטוריות, צילומי פוזיציות, אנליטיקה של משתמשים, נתוני טבלת מובילים.לא (ציבורי)

לולאת בוט טיפוסית משתמשת ב-Gamma (Gamma) כדי למצוא שווקים, ב-CLOB (CLOB) כדי למשוך ספרי פקודות ולהניח עסקאות, וב-Data (Data) כדי לבצע back-test לביצועי האסטרטגיה באופן לא מקוון. חשבו על Gamma כעל ה"קטלוג", על CLOB כעל ה"בורסה", ועל Data כעל ה"מחסן".

טיפ מקצועי: Gamma ו-Data אינן דורשות אימות. אפשר לחקור אותן עם curl או בדפדפן כבר עכשיו - בלי צורך בחשבון. זו דרך מצוינת לעשות פרוטוטייפ עוד לפני שמייצרים מפתח API.
זרימת אימות L1 של EIP-712 בתוספת L2 HMAC-SHA256

L1 חותם על מבנה EIP-712 בשם "ClobAuthDomain" עם chainId 137 כדי לגזור אישורים. L2 HMAC-SHA256 חותם על כל בקשה עוקבת עם כותרות POLY_SIGNATURE.

02
פרק שני

חלק 2: אימות ומודל ארנק הפרוקסי

פולימרקט לא חותמת על עסקאות עם המפתח הפרטי של הארנק הראשי שלכם. במקום זאת, היא משתמשת ב-ארנק פרוקסי בסגנון Gnosis Safe: הארנק הראשי שלכם מאשר פרוקסי, והפרוקסי מבצע את כל העסקאות ב-Polygon. הבוט שלכם מתקשר מול אותו פרוקסי.

מה צריך

  • מפתח API - יצירה ב-Polymarket Settings → Developer
  • מפתח פרטי - המפתח של ארנק המסחר שלכם (לא seed phrase של ה-MetaMask הראשי)
  • כתובת מממן - כתובת ארנק הפרוקסי שלכם (מוצגת ב-Settings → Wallet)
  • Chain ID - 137 (Polygon mainnet)
  • סוג חתימה - 1 (POLY_PROXY, תקן למשתמשי ריטייל)
חובות אבטחה שאינם נתונים למשא ומתן: לעולם אל תעשו commit למפתח הפרטי שלכם ל-git. השתמשו במשתני סביבה (.env) או במנהל סודות. לעולם אל תדביקו מפתחות ב-Discord, ב-GitHub issues, או ב-ChatGPT. הניחו שכל מפתח שנוגע ב-clipboard שלכם כבר נפגע. סובבו מפתחות אם יש ספק.
התקנת py-clob-client 0.34.6 והגדרת ClobClient

סוג חתימה 1 (POLY_PROXY) לחשבונות Magic-link, סוג 2 (GNOSIS_SAFE) לפרוקסי של ארנקי דפדפן, סוג 0 (EOA) למפתחות ישירים. נדרש funder עבור סוגים 1 ו-2.

03
פרק שלישי

חלק 3: התקנת py-clob-client

ה-SDK הרשמי של Python הוא הדרך המהירה ביותר לעבור מאפס לפקודה ראשונה. נשתמש בגרסה 0.34.6, שהיא העדכנית נכון לאפריל 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, secret ו-passphrase. שמרו אותם ב-.env אחרי ההרצה הראשונה כדי שלא תצטרכו לפגוע בנקודת ה-derive בכל עלייה.

דוגמה עובדת - .env מינימלי:
POLY_PRIVATE_KEY=0xabc...
POLY_FUNDER=0xdef...
POLY_API_KEY=...
POLY_SECRET=...
POLY_PASSPHRASE=...
פרמטרי שאילתת שוק של Gamma וצורת התגובה

Gamma /markets מחזיר outcomePrices, clobTokenIds, volume24hr, tags. השתמשו ב-tag_slug + order=volume24hr כשאילתת ברירת המחדל לסורק הבוט.

04
פרק רביעי

חלק 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 שימושיים

פרמטרמה הוא עושה
tag_slugסינון לפי קטגוריה (politics, sports, crypto, culture וכו')
active=trueרק שווקים שמקבלים כרגע עסקאות
closed=falseהסתרת שווקים שיושבו
order=volume24hrמיון לפי נפח עדכני (אות לנזילות)
end_date_minתאריך ISO - דילוג על שווקים שיתיישבו מוקדם מדי
limitעד 500 לעמוד (השתמשו ב-offset לעימוד)
מיפוי condition_id ל-token_id בין Gamma ל-CLOB

Gamma חושפת conditionId (אחד לכל שוק); CLOB סוחר ב-token_id (אחד לכל תוצאה). clobTokenIds הוא מערך מחרוזות בקידוד JSON שממופה לפי אינדקס לתוצאות.

05
פרק חמישי

חלק 5: מיפוי condition_id ל-token_id

זוהי נקודת הכאב מספר 1 בפיתוח בוטים ל-Polymarket. Gamma מחזירה condition_id (אחד לכל שוק). פקודות ב-CLOB משתמשות ב-token_id (אחד לכל תוצאה). תמיד צריך את שניהם.

הטעות: העברת condition_id לנקודות קצה של CLOB שמצפות ל-token_id. תקבלו שגיאה חמקמקה של "invalid token". תמיד ממפים קודם, סוחרים אחר כך.
# 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" - הסדר דטרמיניסטי אך תלוי-שוק.

ספר פקודות של CLOB עם רמות bid/ask והחלקת הליכה

הספר מוחזר כ-bids בסדר יורד, asks בסדר עולה. יש לעבור על הרמות כדי להעריך מחיר מילוי עבור notional יעד לפני שליחת FAK דמוי-שוק.

06
פרק שישי

חלק 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. כדי להעריך החלקה עבור פקודה גדולה יותר, עוברים על הספר ומצברים notional עד שמצרכים את גודל היעד.

השוואה של סוגי פקודות GTC, GTD, FOK, FAK

GTC נשארת על הספר, GTD מתבטלת אוטומטית בזמן מסוים, FOK דורשת מילוי מלא או ביטול מלא, FAK לוקחת מה שאפשר במחיר לימיט ומבטלת את השאר.

07
פרק שביעי

חלק 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. לעולם אינכם שולחים מפתחות פרטיים גולמיים ברשת - רק פקודות חתומות.

סוגי פקודות

סוגCodeהתנהגותמתי להשתמש
Good Till CancelledGTCנשארת על הספר עד שממולאת או עד שאתם מבטליםברירת מחדל. רוב אסטרטגיות יצירת השוק והלימיט.
Good Till DateGTDמתבטלת אוטומטית בזמן חותמת מוגדרמונע-אירוע: "לבטל 5 דקות לפני פרסום הפד"
Fill or KillFOKחייבת להתמלא במלואה מיד או להתבטל לחלוטיןרגלי ארביטראז' שבהן מילוי חלקי הורס את העסקה
Fill and KillFAKממלאת כל מה שאפשר במחיר הלימיט, ומבטלת את השארלוקחת אגרסיבית - מתנהגת כמו פקודת שוק עם תקרת מחיר

ביטול

# 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()
08
פרק שמיני

חלק 8: הזרמת WebSocket

Polling של 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 כמקור האמת למצב הספר הנוכחי.

Heartbeat והתחברויות מחדש: שלחו ping כל 20 שניות. אם פספסתם שני pong-ים, התחברו מחדש. בעת התחברות מחדש, תמיד משכו שוב את ספר הפקודות דרך REST קודם, ואז בצעו resubscribe - אחרת הספר המקומי יסטה מהמציאות.
09
פרק תשיעי

חלק 9: מגבלות קצב ו-backoff

מחלקת נקודת קצהמגבלהBurst
מיקום פקודות (CLOB)~60 / דקה לכל מפתח API~10 / שנייה
ביטול פקודות~120 / דקה~20 / שנייה
קריאות נתוני שוק (ספר CLOB)~300 / דקהגבוה יותר, משתנה
Gamma APIנדיב; יש לכבד 429-
הודעות WebSocketאין מגבלה מעשית נכנסת-

כשמקבלים HTTP 429, השרת מחזיר כותרת Retry-After. יש להטמיע exponential backoff with 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
פרק עשירי

חלק 10: ארכיטקטורת בוט ייחוס

לכל בוט Polymarket חזק יש את אותם שישה רכיבים. בנו כל אחד כמודול נפרד; שמרו על צימוד רופף ביניהם.

רכיבאחריותAPIs בשימוש
סורקמשימת זמן: משיכת שווקים שתואמים לקריטריונים שלכם (תגיות, נפח, ימים עד תפוגה)Gamma
מנוע מחירשמירה על ספרי פקודות מקומיים בזמן אמת דרך WebSocketCLOB WS
מחולל אותותפונקציה טהורה: מצב ספר + מטא-דאטה → פוזיציית יעד- (in-memory)
מנהל פקודותהשוואת פקודות נוכחיות מול יעד, הנחה/ביטול במינימוםCLOB REST
מנהל סיכוןאכיפת תקרות לכל שוק, גבולות הפסד יומיים, מפסקים- (in-memory + DB)
לוג ו-ledgerשמירת כל החלטה, מילוי וביטול. מזין דוחות מס ודיבוג.SQLite / Postgres
אמינות קודם כול: לפני שמבצעים אופטימיזציה ל-PnL, ודאו שהבוט שלכם יכול להפעיל את עצמו מחדש בצורה נקייה ב-3 בבוקר ביום ראשון בלי אדם. זה אומר הנחת פקודות idempotent (השתמשו ב-client-side order IDs), מצב מתמיד, והתראות אוטומטיות (Telegram, Discord, PagerDuty) על כל חריגה לא מטופלת.

חלק 11: מצבי כשל נפוצים

  • נתוני WebSocket מיושנים - עקבו אחרי זמן ההודעה האחרונה לכל asset; אם אין עדכונים במשך >30 שניות בשוק פעיל, כפו רענון REST.
  • התנגשויות nonce - py-clob-client מטפל ב-order nonces עבורכם, אבל אם אתם בונים signer משלכם, הגדילו את ה-nonce בכל פקודה.
  • יתרה לא מספקת - תמיד בדקו יתרת USDC לפני הנחה; הספר עשוי להציג את הפקודה שלכם, אבל המנוע ידחה במילוי.
  • שוק מושהה או ביישוב - בדקו market.active && !market.closed לפני מסחר. עדכוני Gamma מפגרים אחרי CLOB בכמה שניות סביב היישוב.
  • אי-התאמה ב-NegRisk adapter - שווקים רב-תוצאה נשלחים דרך adapter נפרד של NegRisk. ה-SDK מטפל בזה, אבל יש לוודא שהפקודה נשלחה לזירה הנכונה.
מגבלת Testnet: Polymarket לא מפעילה testnet ציבורי ב-2026. "Paper trading" פירושו הנחת פקודות אמיתיות קטנות ($1-$5) בשווקים עם נזילות נמוכה. הקצו כמה דולרים לשבוע הראשון של הדיבוג - זה יחסוך לכם מאות בהמשך.

חלק 12: תגמולי נזילות דרך API

Polymarket מפעילה ~5M$/חודש בתגמולי נזילות כלליים ועוד 5M$+/חודש בתגמולים ייעודיים לספורט (ראו תגמולי נזילות). הרוב המוחלט זורם ל-market makers מונעי-API שמסוגלים לשמור על ציטוטים דו-צדדיים צרים לאורך אלפי שווקים.

נוסחת התגמול מתגמלת פקודות ליד מחיר אמצע, גודל וזמן על הספר. לולאת market making מינימלית:

  1. קראו את ספר הפקודות עבור שוק היעד
  2. חשבו midpoint הוגן (למשל VWAP של 3 הרמות העליונות בכל צד)
  3. הניחו bid ב-mid - spread_target/2 ו-ask ב-mid + spread_target/2
  4. בכל עדכון WebSocket, עשו repricing אם ה-quote שלכם סטה יותר מ-tick אחד מהיעד
  5. בטלו וצאו אם הספר נעשה דק או אם מתפרסמת ידיעה

חלק 13: מעבר לייצור

  • אחסון: VPS ב-6$ לחודש (Hetzner, DigitalOcean) באירופה או US-East מספיק לרוב הבוטים. ניתן למקם סמוך ל-Polygon RPC אם צריך השהיה של פחות מ-10ms.
  • RPC: השתמשו ב-Alchemy, Infura, או QuickNode ל-Polygon RPC אמין. שכבות חינמיות מספיקות עד שמניחים מאות פקודות בדקה.
  • ניטור: Prometheus + Grafana למדדים; בוט Telegram להתראות. רשמו כל order ID שאתם שולחים וכל מילוי שאתם מקבלים.
  • גיבויים: שמרו מצב בכל דקה. אם ה-VPS מת באמצע מילוי, תרצו להמשיך תוך שניות, לא לבצע reconciliation ידני.
  • מס: הלוג שלכם הוא גם trail הביקורת שלכם - ראו מדריך מס.

חלק 14 - טיפים מאומתים ל-Polymarket API

שנים-עשר הרגלי ייצור ממפעילי בוטים חיים.
  1. שמרו במטמון את אישורי ה-API אחרי קריאת ה-derive הראשונה - create_or_derive_api_creds() כפופה למגבלת קצב ואיטית. שמרו apiKey/secret/passphrase ב-.env וטענו בפתיחה.
  2. השתמשו ב-signature_type=2 (GNOSIS_SAFE) אם חיברתם קודם ארנק דפדפן, ו-signature_type=1 (POLY_PROXY) רק לחשבונות Magic-link בדוא"ל. סוג לא תואם מחזיר 401 "invalid api key."
  3. הגדירו funder לכתובת ארנק הפרוקסי שלכם של Polymarket, לא ל-EOA שלכם. מפתח החתימה חי ב-EOA; הכספים חיים בפרוקסי. בלבול ביניהם הוא באג האימות מספר 1.
  4. אינדקסו תוצאות לפי תווית, לעולם לא לפי מיקום - clobTokenIds[outcomes.index("Yes")] ולא clobTokenIds[0]. לשווקי NegRisk ואוסקר יש סדר שרירותי.
  5. סנכרנו את השעון לפני חתימה - ‏POLY_TIMESTAMP חייב להיות בתוך חלון צר. סטיית NTP ב-VPS זול שוברת אימות בשקט. הפעילו chrony או systemd-timesyncd.
  6. משכו מחדש את ספר ה-REST בכל התחברות WebSocket מחדש לפני resubscribe. WebSocket נותן deltas; אם פספסתם delta בזמן ההתחברות מחדש הספר המקומי יסטה מהמציאות ותצוטטו מחירים מפסידים.
  7. לעולם אל תתפוצצו מעל 10 פקודות בשנייה - נקודת הקצה /order מגבילה burst ל-500/10s ול-3,000/10min ברצף. הוסיפו token-bucket rate limiter בצד הלקוח; Cloudflare תתור במקום להפיל, כך ש-retry עיוור רק יגדיל את התור.
  8. השתמשו ב-cancel_market_orders(market=conditionId) בעת כיבוי ולא ב-cancel_all(). ביטול לפי שוק הוא idempotent ובטוח יותר אם הבוט קורס באמצע לולאה רק על שוק אחד.
  9. עקבו אחרי heartbeatMs לכל asset - הוסיפו watchdog שמרענן בכפייה כל שוק ללא עדכונים במשך 30 שניות בשוק חי. פידים מיושנים של WS הם מקור נפוץ ביותר ל-phantom edge.
  10. רשמו את order ID לפני השליחה, לא אחריה. idempotency דורשת שהלקוח ייקח בעלות על ה-ID כדי שבשחזור קריסה אפשר יהיה לשלוח שוב בלי מילויים כפולים.
  11. השתמשו ב-HeartBeats API ‏(ינואר 2026+)‏ לביטול אוטומטי בעת ניתוק. הגדירו heartbeat interval ל-5 שניות; השרת מבטל את כל הפקודות היושבות שלכם אם הוא מפספס שני heartbeats.
  12. בצעו paper trade עם פקודות של $1 בשוק דק במשך 48 שעות לפני הגדלה. לפולימרקט אין testnet; פקודות אמיתיות קטנות הן הדרך היחידה האמינה לאמת אימות, חתימה, טיפול במילוי וזרימת ביטול.

גיליון מצב → פעולה

מצבפעולהלמה
401 "invalid api key" בקריאה ראשונהבדקו שה-signature_type תואם למקור הארנק ושה-funder הוא כתובת הפרוקסיאי-התאמה בין Type 1 ל-2 היא 80% משגיאות ה-401; EOA בתור funder הוא השאר
פקודות נדחות עם "insufficient balance"שאילתת /balance-allowance לפני כל פקודה ושמירה מקומית של רזרבהCLOB שומר בטוחה את הקולטרל ברגע השליחה; שתי פקודות מקבילות יכולות לשמור כפול
429 throttling ב-/order endpointBack off with jitter: 2^attempt + random() עם תקרה של 30 שניותCloudflare מגבילה במקום לדחות; retry נאיבי מגדיל את התור
WebSocket התנתק באמצע מסחרצלמו את הספר דרך REST, בצעו reconcile למצב המקומי, ואז resubscribedeltas במהלך הפער אובדים; snapshot מסנכרן מחדש את מדרגות המחיר
הונחה פקודה אבל לא התקבלה אישור מילוישאילתה /data/order/{id} בתוך 5 שניות; אם ממתין, לחכות; אם לא נמצא, להחליףנדיר אך בר-התאוששות; ברירת המחדל היא "בדקו מצב, ואז פעלו"
השוק יושב במהלך ציטוט פעילבטלו את כל הפקודות הפתוחות על אותו conditionId בעת אירוע היישובפקודות לאחר היישוב עלולות להישאר כמילויי זומבי אם מוזרות adapter מופעלות
הרצת בוט יצירת שוקציטטו בתוך 2 סנט ממחיר האמצע עם גודל של 100+ sharesנוסחת התגמול שוקלת tightness + size + time-on-book; tight + size + persistent מנצחים
הרצת בוט ארביטראז' על רב-תוצאההשתמשו ב-FOK לכל רגל, לא ב-GTCמילויים חלקיים ברגל A עם רגל B מלאה = חשיפה לא מגודרת והפסד מיידי
פעם ראשונה בבניית בוטבנו סורק קודם, ואז מנוע מחיר, ואז signal - לעולם לא signal קודםSignals בלי מצב ספר נקי הם מלכודות קורלציה; קודם תנו לצינורות לעבוד
בוט ייצור קרס ב-3amדאגו ל-systemd auto-restart + התראת Telegram + מצב מתמידכל בוט לא מפוקח יקרוס; השאלה היחידה היא אם הוא יעלה מחדש בצורה נקייה
דוגמה עובדת: לולאת market-ספק נזילות (maker) מינימלית לתגמולי נזילות.

מטרה. להרוויח תגמולי נזילות בשוק פוליטיקה בנפח בינוני במחיר בערך 0.48 Yes / 0.52 No עם מרווח (spread) של 2 סנט. מאגר תגמול יומי ~$40 עבור השוק הזה.

הגדרה. WebSocket מתחבר לשני ה-token_ids. שומרים במטמון את ה-mid האחרון שנצפה. מגדירים spread_target = 0.02, size = 200 shares לכל צד, reprice_threshold = 0.005 (5 ticks).

לולאה. בכל עדכון WS של הספר: מחשבים mid חדש = VWAP של 3 ה-bids וה-asks העליונים. אם |הצעות נוכחיות - mid יעד| > reprice_threshold, מבטלים את שתי הפקודות הקיימות, מניחים bid חדש ב-mid-0.01 ו-ask חדש ב-mid+0.01. מגבילים את עדכון המחיר פעם ל-2 שניות לכל צד.

סיכון. מלאי מקסימלי לכל צד = 1,000 shares. אם המלאי > 500, מרחיבים את ה-מרווח בצד הזה ב-0.005 לכל 100 shares. מפסק: אם ה-mid זז >0.05 בתוך 60 שניות, מבטלים הכול ועוצרים 5 דקות.

תוצאה (ריצה אמיתית של 7 ימים). מולאו ~14,000 shares על פני 680 פקודות, שולמו $0 ב-לוקח נזילות (taker) fees (צד ספק נזילות), הושגו $31.40 בהחזרים על נזילות, P&L כיווני נטו היה -$4.10 (הפסדי מלאי קטנים). נטו +$27.30 במשך 7 ימים על הון עבודה של $500 = ~8% חודשי. ניתן להרחיב באופן ליניארי על פני 30-50 שווקים במקביל על VPS יחיד.

המסר המרכזי

הסוחרים שמרוויחים בעקביות בפולימרקט מתייחסים ל-polymarket api guide כאל מערכת, לא כאל תחושת בטן. שמרו את המספרים שלמעלה - הם ההבדל בין הארנקים הרווחיים של 7.6% לבין השאר.

מה הלאה?