פרק 27 מתוך 33

הגרסה הקצרה

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

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

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

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

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

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

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

חלק 2: אימות ומודל ארנק ה-Proxy

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

מה אתם צריכים

  • מפתח API - נוצר ב-Settings → Developer של פולימרקט
  • מפתח פרטי - המפתח של ארנק המסחר שלכם (לא ה-seed phrase של ה-MetaMask הראשי)
  • כתובת funder - כתובת ארנק ה-proxy שלכם (מוצגת ב-Settings → Wallet)
  • Chain ID - 137 (Polygon mainnet)
  • Signature type - 1 (POLY_PROXY, סטנדרטי למשתמשי קמעונאות)
כללי אבטחה בלתי ניתנים למשא ומתן: לעולם אל תשמרו את המפתח הפרטי שלכם ב-git. השתמשו במשתני סביבה (.env) או במנהל סודות. לעולם אל תדביקו מפתחות ב-Discord, ב-GitHub issues או ב-ChatGPT. הניחו שכל מפתח שנגע ב-clipboard שלכם כבר נפרץ. החליפו מפתחות בכל ספק.
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 לאחר ההרצה הראשונה כדי שלא תפנו לנקודת הקצה של הגזירה בכל הפעלה.

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

חלק 4: גילוי שווקים דרך Gamma

לפני שתוכלו לסחור, אתם צריכים למצוא שווקים ששווה לסחור בהם. Gamma מחזיר JSON עם כל מה שממשק פולימרקט מציג: שאלה, תוצאות, מחירים, נפח 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 לעימוד)
05
פרק חמישי

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

זוהי נקודת הכאב מספר 1 בפיתוח בוטים לפולימרקט. 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 ומערך ה-clobTokenIds של Gamma מותאמים באינדקס. תמיד קראו את תווית התוצאה במקום להניח שאינדקס 0 הוא 'Yes'. בשווקים רב-תוצאתיים (NegRisk, אוסקר, בחירות), אינדקס 0 יכול להיות 'Kamala Harris' או 'Taylor Swift' - הסדר דטרמיניסטי אך ספציפי לשוק.

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

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

סוגי פקודות

סוגקודהתנהגותמתי להשתמש
Good Till CancelledGTCנח על הספר עד שמתמלא או עד שאתם מבטליםברירת מחדל. רוב אסטרטגיות ה-market making והגבול.
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

סקירת Gamma כל שנייה היא בזבזנית ותגיעו למגבלות הקצב מהר. ה-feed של 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)

קיימים שני feeds: ה-feed של /market (ספר פקודות ועסקאות ציבוריים) וה-feed של /user (אירועי הפקודות והמילויים שלכם, מאומת). בוטים בייצור מתחברים בדרך כלל לשניהם, מתחברים מחדש אוטומטית בניתוק, ומתייחסים ל-WebSocket כמקור האמת למצב הספר הנוכחי.

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

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

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

כשאתם נתקלים ב-HTTP 429, השרת מחזיר כותרת Retry-After. יישמו backoff מעריכי עם 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: ארכיטקטורת בוט לדוגמה

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

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

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

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

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

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

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

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

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

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

חלק 14 - טיפים מקצועיים מאומתים ל-API של פולימרקט

שתים-עשרה הרגלי ייצור ממפעילי בוטים חיים.
  1. שמרו את אישורי ה-API לאחר קריאת הגזירה הראשונה - 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 לכתובת ארנק ה-proxy שלכם בפולימרקט, לא ל-EOA שלכם. מפתח החתימה חי ב-EOA; הכספים חיים ב-proxy. בלבול ביניהם הוא באג האימות מספר 1.
  4. אינדקסו תוצאות לפי תווית, לעולם לא לפי מיקום - clobTokenIds[outcomes.index("Yes")] ולא clobTokenIds[0]. לשווקי NegRisk ואוסקר יש סדר שרירותי.
  5. סנכרנו את השעון לפני חתימה - POLY_TIMESTAMP חייב להיות בחלון צר. סחיפת NTP על VPS זול שוברת אימות בשקט. הריצו chrony או systemd-timesyncd.
  6. משכו מחדש את ספר ה-REST בכל חיבור-מחדש של WebSocket לפני שאתם נרשמים שוב. WebSocket נותן דלתות; אם פספסתם דלתא במהלך החיבור-מחדש, הספר המקומי שלכם מתבדל מהמציאות ותציטטו מחירים מפסידים.
  7. לעולם אל תפרצו יותר מ-10 פקודות לשנייה - נקודת הקצה /order מווסתת ב-500/10ש' פרץ ו-3,000/10דק' מתמשך. הוסיפו token-bucket rate limiter בצד הלקוח; Cloudflare מתעדף בתור במקום לזרוק, כך שניסיונות עיוורים מעצימים את הצבר.
  8. השתמשו ב-cancel_market_orders(market=conditionId) בעת כיבוי ולא ב-cancel_all(). ביטול בהיקף-שוק הוא אידמפוטנטי ובטוח יותר אם הבוט קורס באמצע לולאה בשוק אחד בלבד.
  9. עקבו אחר heartbeatMs לכל נכס - הוסיפו watchdog שמרענן בכוח כל שוק ללא עדכונים למשך 30ש' בשוק חי. feeds מיושנים של WS הם המקור הנפוץ ביותר לאלפא פנטום.
  10. רשמו את מזהה הפקודה לפני השליחה, לא אחריה. אידמפוטנטיות דורשת שהלקוח יחזיק את המזהה כדי שהתאוששות מקריסה תוכל לשלוח מחדש בלי מילויים כפולים.
  11. השתמשו ב-HeartBeats API (ינואר 2026+) לביטול-אוטומטי-בניתוק. הגדירו מרווח heartbeat ל-5ש'; השרת מבטל את כל הפקודות שלכם שנחות אם הוא מפספס שני heartbeats.
  12. בצעו paper-trade עם פקודות של 1 $ בשוק דק במשך 48 שעות לפני הגדלה. לפולימרקט אין testnet; פקודות אמיתיות זעירות הן הדרך האמינה היחידה לאמת אימות, חתימה, טיפול במילוי וזרימת ביטול.

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

מצבפעולהלמה
401 'invalid api key' בקריאה הראשונהבדקו ש-signature_type תואם למקור הארנק ושה-funder הוא כתובת ה-proxyאי-התאמה בין type 1 ל-2 היא 80% משגיאות 401; EOA-כ-funder הוא השאר
פקודות נדחות עם 'insufficient balance'שאלו את /balance-allowance לפני כל פקודה ושמרו רזרבה מקומיתCLOB שומר ביטחונות ברגע שאתם שולחים; שתי פקודות במקביל יכולות להזמין כפול
ויסות 429 בנקודת הקצה /orderבצעו backoff עם jitter: 2^attempt + random() בתקרה של 30ש'Cloudflare מווסת במקום לדחות; ניסיון נאיבי מעצים את הצבר
WebSocket התנתק באמצע עסקהצלמו את הספר דרך REST, התאימו את המצב המקומי, ואז הירשמו שובדלתות במהלך הפער אובדות; הצילום מסנכרן מחדש את סולמות המחיר
פקודה נשלחה אך אין אישור מילוישאלו את /data/order/{id} תוך 5ש'; אם ממתין, חכו; אם לא נמצא, החליפונדיר אך בר-תיקון; ברירת מחדל ל"בדוק מצב, ואז פעל"
שוק נפתר במהלך ציטוט פעילבטלו את כל הפקודות הפתוחות על אותו conditionId באירוע הפתרוןפקודות פוסט-פתרון יכולות להישאר כמילויי זומבי אם תקלות מתאם מופעלות
מריצים בוט market-makingצטטו בתוך 2 סנט מהאמצע עם גודל של 100+ מניותנוסחת התגמול משקללת צמידות + גודל + זמן-על-הספר; צמוד + גודל + מתמיד מנצח
מריצים בוט ארביטראז' על רב-תוצאתיהשתמשו ב-FOK לכל רגל, לא ב-GTCמילויים חלקיים ברגל A עם רגל B מלאה = חשיפה לא מגודרת והפסד מיידי
פעם ראשונה שבונים בוטבנו סורק קודם, ואז מנוע מחירים, ואז אות - לעולם לא אות קודםאותות ללא מצב ספר נקי הם מלכודות מתאם; הביאו את הצינורות לעבוד קודם
בוט ייצור קרס ב-3 לפנות בוקרהחזיקו אתחול-אוטומטי של systemd + התראת Telegram + מצב מתמשךכל בוט לא מאויש יקרוס; השאלה היחידה היא אם הוא מאתחל בצורה נקייה
דוגמה פתורה: לולאת market-maker מינימלית לתגמולי נזילות.

יעד. הרוויחו תגמולי נזילות בשוק פוליטיקה בעל נפח בינוני שמתומחר סביב 0.48 Yes / 0.52 No עם מרווח של 2 סנט. מאגר תגמול יומי של כ-40 $ לשוק זה.

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

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

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

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

הנקודה המרכזית

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

מה הלאה?