מדריך Polymarket Bot · פרק 10 מתוך 32
הסבר על סוגי פקודות ב-Polymarket לבוני בוטים: Fill-or-Kill (FOK), Fill-and-Kill (FAK), Good-til-Cancelled (GTC), וההבדלים בין limit ל-market. כולל כללי החלטה ברמת production.
מה מכסה הפרק הזה
בלבול סביב סוגי פקודות הוא קטגוריית הבאגים היקרה ביותר עבור בוני בוטים חדשים. שליחת FOK כשצריך GTC גורמת לפספוס כניסות; שליחת GTC כשצריך FOK משאירה פקודות resting שמתמלאות שעות אחר כך במחירים גרועים. הפרק הזה הוא עץ ההחלטה והברירות המחדל ברמת production שהוכיחו את עצמן לאורך אלפי פקודות.
- עץ החלטה מהיר
- FOK: כשחייבים להתמלא או לדלג
- FAK: כשחלקי מילוי מקובלים
- GTC: כשאתם רוצים להישאר על ה-book
- Limit מול market ומס ה-spread
- ברירות המחדל שלנו ב-production (קניות FOK, מכירות GTC)
- קוד: ביצוע כל סוג פקודה
עץ החלטה מהיר
שלוש שאלות קובעות כל הצבת פקודה.
- האם אתם צריכים fill מובטח עכשיו, ובכלל לא אם אי אפשר לקבל אותו עכשיו? → FOK.
- האם אתם רוצים כמה fill שאפשר לקבל עכשיו, מוכנים לחלקי מילוי, בלי פקודת resting? → FAK.
- האם אתם רוצים להישאר על ה-book במחיר שלכם ולחכות שמישהו יגיע אליכם? → GTC.
זה הכול. רוב הבאגים של בוטים סביב סוגי פקודות מגיעים מבחירה ב-#1 כשבעצם רציתם #3 ("קנייה" הופכת ל"לא נפתחה פוזיציה כי ה-spread היה רחב מדי") או בחירה ב-#3 כשבעצם רציתם #1 ("קנייה" הופכת לפקודה resting שממלאת שעות אחר כך ברגע הלא נכון).
FOK: כשחייבים להתמלא או לדלג
Fill-or-Kill מבצע התאמה לכל גודל הפקודה במחיר המבוקש או טוב ממנו, באופן מיידי. אם אי אפשר למלא את כל הכמות מיד, הפקודה נדחית ושום דבר לא קורה. בלי resting, בלי partial.
השתמשו ב-FOK עבור: כניסות בארביטראז' על חדשות (אתם רוצים להיכנס רק במחיר החדשות, לא במקום שבו השוק יהיה בעוד 30 שניות); יציאות take-profit ביעד מסוים כשחלקי מילוי יטשטשו את הנהלת החשבונות; כל מצב שבו האסטרטגיה מניחה ביצוע אטומי.
הפשרה: FOK נדחה לעיתים קרובות יותר מסוגי פקודות אחרים, במיוחד ב-books לא נזילים. תמיד צריך מסלול חלופי - להעריך מחדש את תנאי האסטרטגיה ולנסות שוב אם הוא עדיין תקף, או להמשיך הלאה.
FAK: כשחלקי מילוי מקובלים
Fill-and-Kill (נקרא גם "immediate or cancel") מבצע התאמה לכמה שהוא יכול עכשיו, ואז מבטל את השאר שלא מולא. אפשר לקבל את כל הכמות, חלק ממנה, או אפס.
השתמשו ב-FAK עבור: קניית market עם תקרת מחיר מסוימת (להרים את ה-ask עד N סנטים מעל ה-mid); מכירות sweep-the-book כשצריך לצמצם מלאי בדחיפות; כל אסטרטגיה שבה "קצת פוזיציה עדיף על כלום".
מבחינה תפעולית זה מסובך יותר מ-FOK, כי הבוט צריך לדעת אם קיבל 100% או 30% לפני שהוא מחליט על הצעד הבא. תגובת המילוי כוללת שדה filled_size - תמיד לקרוא אותו.
GTC: כשאתם רוצים להישאר על ה-book
Good-til-Cancelled נשארת על ה-book במחיר שלכם עד למילוי או עד שתבטלו. אין timeout (סוגי פקודות אחרים ב-API v2 כוללים GTD עם תפוגה).
השתמשו ב-GTC עבור: מכירות take-profit ב-+Nc מעל הכניסה; מכירות stop-loss ב--Nc מתחת לכניסה (עם הסתייגויות - ראו בהמשך); ציטוטים דו-צדדיים ב-market making; כל פוזיציה שבה הבוט מוכן לחכות למחיר טוב יותר.
כלל קשיח: GTC דורש ≥ 5 shares. פקודות מתחת ל-5 shares נדחות על ידי ה-CLOB עם Size (X) lower than the minimum: 5. בוט שמפרסם מכירת GTC של 4 shares נכשל בשקט בהגדרת היציאה ונשאר עם הפוזיציה עד הסיום. תמיד לבדוק שהמלאי ≥ 5 לפני פרסום GTC; אם הכמות קטנה יותר, לעבור ל-FAK או להחזיק עד הסיום.
Limit מול market ומס ה-spread
מבחינה טכנית, כל פקודה ב-Polymarket היא פקודת limit - אפילו מה שבוטים קוראים לו "market buy" מציין תקרת מחיר. ההבדל הוא אם המחיר הזה נמצא ב-best ask (למעשה כמו פקודת market, תתמלא מול ה-book) או מתחתיו (תישאר resting על ה-book).
מס ה-spread הוא העלות של חציית ה-spread - bid 0.45, ask 0.47, mid 0.46. סיבוב מלא שקונה ב-ask ומוכר ב-bid משלם 2 סנט לכל share. באסטרטגיה עם שיעור הצלחה של 60% ויעדי +3c/-4c, ה-spread של 2c הוא ההבדל בין רווח להפסד.
דפוס maker (פרסום GTC ב-bid או מתחתיו, והמתנה שיפגעו בכם) אוסף את ה-spread במקום לשלם אותו. המחיר הוא מילוי לא ודאי - ייתכן שלעולם לא יתמלאו. בעסקאות עם conviction גבוהה, משלמים את ה-spread. לצבירה פסיבית, עובדים את ה-book.
ברירות המחדל שלנו ב-production (קניות FOK, מכירות GTC)
הדפוס שאליו רוב הבוטים שלנו ב-production מתכנסים:
- כניסות: FOK ב-ask + 0-2 סנט. אם הבוט החליט לקנות, הוא צריך לקנות עכשיו או לדלג. לעיתים נדירות שווה להשאיר פקודת כניסה resting - המצב שהפעיל את החלטת הקנייה משתנה מהר יותר מהזמן שהפקודה תישאר resting.
- יציאות take-profit: GTC במחיר היעד. מפורסמות מיד אחרי שהכניסה מתמלאת. אנחנו נותנים לשוק להגיע אלינו; לא רודפים אחרי ה-bid כלפי מטה. עם ≥ 5 shares.
- stop-loss: תלוי במקרה. GTC עובדת לאסטרטגיות איטיות שבהן שינויי המחיר מוגבלים. בשווקים מהירים stop ב-GTC לא יתמלא אם המחיר יחלוף דרכו במהירות; אנחנו מחזיקים עד הסיום בגרסת option-D (זיכרון: trader-gtc-sell.md).
הדפוס שמרני - פחות fills, פחות slippage. גרסה אגרסיבית יותר משתמשת בכניסות FAK וביציאות FAK, ומקבלת מילוי חלקי. בחרו גישה אחת והישארו עקביים; ערבוב החלטות פר-עסקה מזמין בלבול.
קוד: ביצוע כל סוג פקודה
דוגמת reference לביצוע פקודות ב-Python עם py-clob-client (v0.34.6).
from py_clob_client.client import ClobClient
from py_clob_client.clob_types import OrderArgs, OrderType
c = ClobClient(host="https://clob.polymarket.com", chain_id=137,
key=PRIVATE_KEY, signature_type=2, funder=PROXY)
c.set_api_creds(creds)
# FOK buy: fill 10 shares at price 0.45 or skip
args = OrderArgs(token_id=TOKEN, price=0.45, size=10, side="BUY")
resp = c.create_and_post_order(args, OrderType.FOK)
# FAK buy: take as much as you can at 0.45 or below
resp = c.create_and_post_order(args, OrderType.FAK)
# GTC sell: rest a sell at 0.85 for 10 shares
sell_args = OrderArgs(token_id=TOKEN, price=0.85, size=10, side="SELL")
resp = c.create_and_post_order(sell_args, OrderType.GTC)
אותן פעולות ב-Node עם @polymarket/clob-client-v2: החליפו את OrderType.FOK ב-clob.OrderType.GTC וכו'; המתודה היא createAndPostOrder. יש להגדיר את ה-negRisk flag (פרק 11) בארגומנט השני עבור שווקי multi-outcome - אם הוא חסר, הבקשה תנותב לחוזה exchange לא נכון.












