Polymarket Bot Tutorial · Chapitre 10 sur 32
Les order types de Polymarket expliqués pour les bot builders : Fill-or-Kill (FOK), Fill-and-Kill (FAK), Good-til-Cancelled (GTC), et les arbitrages limit-vs-market. Avec des decision rules de niveau production.
Ce que couvre ce chapitre
La confusion autour des order types est la catégorie de bug la plus coûteuse pour les nouveaux bot builders. Envoyer un FOK quand un GTC était nécessaire provoque des entrées manquées ; envoyer un GTC quand un FOK était nécessaire laisse des resting orders qui se remplissent des heures plus tard à de mauvais prix. Ce chapitre est l'arbre de décision et les defaults de production qui ont résisté à des milliers d'ordres.
- Arbre de décision rapide
- FOK : quand vous devez exécuter ou passer
- FAK : quand les partial fills sont acceptables
- GTC : quand vous voulez rester sur le book
- Limit vs market et la spread tax
- Nos defaults de production (FOK buys, GTC sells)
- Code : placer chaque order type
Arbre de décision rapide
Trois questions décident de chaque order placement.
- Avez-vous besoin d'un fill garanti tout de suite, et pas du tout si vous ne pouvez pas l'obtenir maintenant ? → FOK.
- Voulez-vous autant de fill que possible immédiatement, en acceptant les partial fills, sans resting order ? → FAK.
- Voulez-vous rester sur le book à votre prix et attendre que quelqu'un vienne à vous ? → GTC.
C'est tout. La plupart des bugs de bot liés aux order types viennent du choix du point #1 alors que vous vouliez le #3 (un "buy" se transforme en "no position parce que le spread était trop large") ou du choix du #3 alors que vous vouliez le #1 (un "buy" se transforme en resting order qui se remplit des heures plus tard au mauvais moment).
FOK : quand vous devez exécuter ou passer
Fill-or-Kill fait correspondre l'ordre entier au prix demandé ou mieux, instantanément. Si la taille totale ne peut pas être remplie instantanément, l'ordre est rejeté et rien ne se passe. Pas de resting, pas de partial.
Utilisez FOK pour : les entrées d'arbitrage sur news (vous voulez entrer uniquement au prix de la news, pas là où le marché sera dans 30 s) ; les take-profit exits à une cible précise lorsque les partial fills brouilleraient la comptabilité ; chaque fois que la stratégie suppose une exécution atomique.
Le compromis : FOK est rejeté plus souvent que les autres order types, surtout sur les books illiquides. Prévoyez toujours un fallback path - réévaluez la condition de la stratégie et réessayez si elle est toujours valide, ou passez à autre chose.
FAK : quand les partial fills sont acceptables
Fill-and-Kill (aussi appelé "immediate or cancel") exécute autant que possible tout de suite, puis annule le reliquat non rempli. Vous pouvez obtenir la taille complète, un partial fill, ou zéro.
Utilisez FAK pour : un market-buy avec un plafond de prix précis (prenez l'ask jusqu'à N cents au-dessus du mid) ; les sells qui sweep the book lorsqu'il faut réduire l'inventaire de toute urgence ; toute stratégie où "avoir une position partielle vaut mieux que rien."
Opérationnellement plus délicat que FOK, car le bot doit savoir s'il a obtenu 100 % ou 30 % avant de décider de l'étape suivante. La réponse de fill inclut un champ filled_size - lisez-le toujours.
GTC : quand vous voulez rester sur le book
Good-til-Cancelled reste sur le book à votre prix jusqu'à exécution ou annulation. Pas de timeout (les autres order types dans l'API v2 incluent GTD avec une expiration).
Utilisez GTC pour : les take-profit sells à +Nc au-dessus de l'entrée ; les stop-loss sells à -Nc en dessous de l'entrée (avec des réserves - voir ci-dessous) ; le market-making avec des quotes des deux côtés ; toute position pour laquelle le bot est prêt à attendre un meilleur prix.
Règle stricte : GTC nécessite ≥ 5 shares. Les ordres en dessous de 5 shares sont rejetés par le CLOB avec Size (X) lower than the minimum: 5. Un bot qui poste un GTC sell de 4 shares échoue silencieusement à placer la sortie et laisse la position aller jusqu'à la résolution. Vérifiez toujours que l'inventory est ≥ 5 avant de poster un GTC ; sinon, basculez vers FAK ou ride-to-resolve si c'est plus petit.
Limit vs market et la spread tax
Chaque ordre Polymarket est techniquement un limit order - même ce que les bots appellent un "market buy" spécifie un plafond de prix. La distinction est de savoir si ce prix est au meilleur ask (effectivement un market order, il se remplira contre le book) ou en dessous (il restera sur le book).
La spread tax est le coût du crossing - bid 0.45, ask 0.47, mid 0.46. Un aller-retour qui achète à l'ask et vend au bid paie 2 cents par share. Sur une stratégie à 60 % de taux de réussite avec des objectifs +3c/-4c, cet écart de 2c fait la différence entre profit et perte.
Le maker pattern (poster un GTC au bid ou en dessous, attendre d'être pris) encaisse le spread au lieu de le payer. Le coût est l'incertitude du fill - vous pouvez ne jamais être touché. Pour les trades à forte conviction, payez le spread. Pour l'accumulation passive, travaillez le book.
Nos defaults de production (FOK buys, GTC sells)
Le pattern vers lequel convergent la plupart de nos bots de production :
- Entries : FOK à ask + 0-2 cents. Si le bot a décidé d'acheter, il doit acheter maintenant ou passer. Laisser une entrée en resting order vaut rarement le coup - la situation qui a déclenché la décision d'achat change plus vite que l'ordre ne restera en attente.
- Take-profit exits : GTC au prix cible. Posté immédiatement après le fill de l'entrée. Nous laissons le marché venir à nous ; nous ne poursuivons pas le bid à la baisse. Avec ≥ 5 shares.
- Stop-loss : au cas par cas. GTC fonctionne pour les stratégies lentes où les variations de prix sont bornées. Sur les marchés qui bougent vite, un stop GTC ne se remplira pas si le prix le traverse trop rapidement ; nous ride-to-resolve en mode option-D (mémoire : trader-gtc-sell.md).
Ce pattern est conservateur - moins de fills, moins de slippage. Une variante plus agressive utilise des FAK entries et des FAK exits, en acceptant les partial fills. Choisissez-en un et restez cohérent ; mélanger les décisions trade par trade invite la confusion.
Code : placer chaque order type
Référence de placement d'ordres en Python avec 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)
Les mêmes opérations en Node avec @polymarket/clob-client-v2 : remplacez OrderType.FOK par clob.OrderType.GTC etc. ; la méthode est createAndPostOrder. Le flag negRisk (chapitre 11) doit être défini dans le deuxième argument pour les marchés à outcomes multiples - l'omettre route vers le mauvais exchange contract.












