Polymarket Bot Tutorial · Kapitel 10 von 32
Polymarket order types erklärt für Bot-Builder: Fill-or-Kill (FOK), Fill-and-Kill (FAK), Good-til-Cancelled (GTC) und Limit-vs-Market-Kompromisse. Mit Production-grade Entscheidungsregeln.
Was dieses Kapitel abdeckt
Verwirrung bei order types ist für neue Bot-Builder die mit Abstand teuerste Bug-Kategorie. Wenn du FOK sendest, obwohl GTC nötig gewesen wäre, verpasst du Entries; wenn du GTC sendest, obwohl FOK nötig gewesen wäre, bleiben resting orders liegen und werden Stunden später zu katastrophalen Preisen gefüllt. Dieses Kapitel ist der decision tree und die Production-Defaults, die sich bei Tausenden von orders bewährt haben.
- Quick decision tree
- FOK: wenn du fillen oder skippen musst
- FAK: wenn partials akzeptabel sind
- GTC: wenn du im book resting sein willst
- Limit vs market und die spread tax
- Unsere Production-Defaults (FOK buys, GTC sells)
- Code: jeden order type platzieren
Quick decision tree
Drei Fragen entscheiden über jede order placement.
- Brauchst du einen guaranteed fill sofort, und zwar gar nicht, wenn du ihn jetzt nicht bekommst? → FOK.
- Willst du so viel fill wie möglich sofort, partials akzeptieren, keine resting order? → FAK.
- Willst du zu deinem Preis im book resting sein und warten, bis jemand zu dir kommt? → GTC.
Das war's. Die meisten bot bugs rund um order types entstehen daraus, dass #1 gewählt wird, obwohl #3 gemeint war (ein "buy" wird zu "no position because the spread was too wide") oder #3 gewählt wird, obwohl #1 gemeint war (ein "buy" wird zu einer resting order, die Stunden später zum falschen Zeitpunkt gefüllt wird).
FOK: wenn du fillen oder skippen musst
Fill-or-Kill matched die gesamte order zum gewünschten Preis oder besser, sofort. Wenn die volle size nicht sofort gefüllt werden kann, wird die order abgelehnt und nichts passiert. Kein resting, kein partial.
Nutze FOK für: news-arbitrage entries (du willst nur zum News-Preis rein, nicht dort, wo der Markt in 30s steht); take-profit exits zu einem bestimmten Ziel, wenn partials das bookkeeping verkomplizieren würden; immer dann, wenn die Strategie atomic execution voraussetzt.
Der Trade-off: FOK wird öfter abgelehnt als andere order types, besonders auf illiquiden books. Habe immer einen fallback path - bewerte die strategy condition neu und versuche es erneut, wenn sie noch gültig ist, oder mach weiter.
FAK: wenn partials akzeptabel sind
Fill-and-Kill (auch "immediate or cancel" genannt) matched so viel wie möglich sofort und cancelt dann den nicht gefüllten Rest. Du kannst die volle size bekommen, ein partial oder gar nichts.
Nutze FAK für: market-buy mit einem bestimmten Preis-Ceiling (hebe das ask bis zu N cents über mid); sweep-the-book sells, wenn du Inventory dringend reduzieren willst; jede strategy, bei der "some position is better than none" gilt.
Operativ kniffliger als FOK, weil der bot wissen muss, ob er 100% oder 30% bekommen hat, bevor er den nächsten Schritt entscheidet. Die fill response enthält ein filled_size-Feld - lies es immer aus.
GTC: wenn du im book resting sein willst
Good-til-Cancelled rests im book zu deinem Preis, bis es gefüllt oder von dir gecancelt wird. Kein Timeout (andere order types in der v2 API enthalten GTD mit einem expiry).
Nutze GTC für: take-profit sells bei +Nc über entry; stop-loss sells bei -Nc unter entry (mit Vorbehalten - siehe unten); market-making mit Quotes auf beiden Seiten; jede Position, bei der der bot bereit ist, auf einen besseren Preis zu warten.
Die harte Regel: GTC erfordert ≥ 5 shares. Orders unter 5 shares werden von der CLOB abgelehnt mit Size (X) lower than the minimum: 5. Ein bot, der einen 4-share GTC sell postet, setzt das Exit stillschweigend nicht und trägt die Position bis zur resolution. Prüfe immer Inventory ≥ 5, bevor du GTC postest; falle auf FAK oder ride-to-resolve zurück, wenn es weniger ist.
Limit vs market und die spread tax
Jede Polymarket order ist technisch eine limit order - selbst das, was bots "market buy" nennen, setzt ein Preis-Ceiling. Der Unterschied ist, ob dieser Preis am besten ask liegt (effektiv eine market order, wird gegen das book gefüllt) oder darunter (wird im book resting sein).
Die spread tax sind die Kosten des Crossings - bid 0.45, ask 0.47, mid 0.46. Ein Round Trip, der zum ask kauft und zum bid verkauft, zahlt 2 cents pro share. Bei einer Strategie mit 60% win-rate und +3c/-4c-Zielen ist diese 2c spread der Unterschied zwischen Gewinn und Verlust.
Maker pattern (GTC am bid oder darunter posten und darauf warten, dass du getroffen wirst) kassiert den spread statt ihn zu zahlen. Der Preis ist ein unsicherer fill - vielleicht wirst du nie getroffen. Für hochüberzeugte Trades zahle den spread. Für passives Accumulation arbeite das book.
Unsere Production-Defaults (FOK buys, GTC sells)
Das Muster, auf das unsere Production-Bots am häufigsten hinauslaufen:
- Entries: FOK bei ask + 0-2 cents. Wenn der bot beschlossen hat zu kaufen, sollte er jetzt kaufen oder skippen. Eine entry order im resting Zustand ist selten sinnvoll - die Situation, die die buy decision ausgelöst hat, ändert sich schneller, als die order resting sein wird.
- Take-profit exits: GTC zum Zielpreis. Sofort nach dem Fill des entry gepostet. Wir lassen den Markt zu uns kommen; wir jagen den bid nicht nach unten. Mit ≥ 5 shares.
- Stop-loss: fallweise. GTC funktioniert für langsame Strategies, bei denen Preisbewegungen begrenzt sind. In schnell laufenden Märkten wird ein GTC stop nicht gefüllt, wenn der Preis daran vorbeischießt; wir ride to resolution in option-D-Form (Gedächtnis: trader-gtc-sell.md).
Das Muster ist konservativ - weniger fills, weniger slippage. Eine aggressivere Variante nutzt FAK entries und FAK exits und akzeptiert partial fills. Wähle eine Variante und bleib konsistent; per trade unterschiedliche Entscheidungen laden zu Verwirrung ein.
Code: jeden order type platzieren
Referenz für order placement in Python mit 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)
Die gleichen Operationen in Node mit @polymarket/clob-client-v2: ersetze OrderType.FOK durch clob.OrderType.GTC usw.; die Methode ist createAndPostOrder. Das negRisk-Flag (Kapitel 11) muss im zweiten Argument für multi-outcome markets gesetzt werden - wenn es fehlt, wird an das falsche exchange contract geroutet.












