Polymarket Bot Tutorial · Hoofdstuk 10 van 32

Polymarket order types uitgelegd voor bot-builders: Fill-or-Kill (FOK), Fill-and-Kill (FAK), Good-til-Cancelled (GTC) en limit-vs-market trade-offs. Met production-grade beslisregels.

Wat dit hoofdstuk behandelt

Order-type verwarring is de enkele duurste klasse bugs voor nieuwe bot-builders. FOK sturen wanneer GTC nodig was produceert gemiste entries; GTC sturen wanneer FOK nodig was laat resting orders die uren later vullen op vreselijke prijzen. Dit hoofdstuk is de beslis-tree en de production-defaults die hebben standgehouden over duizenden orders.

Dit is hoofdstuk 10 van onze 32-delige serie over het bouwen van een Polymarket trading bot. We behandelen het onderwerp in detail in de secties hieronder. De body content voor elke sectie wordt geschreven en hoofdstuk-per-hoofdstuk uitgerold; FAQ-antwoorden en referenties zijn al compleet en weerspiegelen production-ervaring van het draaien van onze eigen trader.

  • Snelle beslis-tree
  • FOK: wanneer je moet vullen of skippen
  • FAK: wanneer partials acceptabel zijn
  • GTC: wanneer je wilt rusten op het book
  • Limit vs market en de spread tax
  • Onze production defaults (FOK buys, GTC sells)
  • Code: plaats elk order type

Snelle beslis-tree

Drie vragen bepalen elke order-plaatsing.

  1. Heb je een gegarandeerde fill nu nodig, en helemaal niet als je hem nu niet kunt krijgen? → FOK.
  2. Wil je zoveel fill als je kunt krijgen nu, accepteer partials, geen resting order? → FAK.
  3. Wil je op het book rusten op jouw prijs en wachten tot iemand naar je toe komt? → GTC.

Dat is het. De meeste bot-bugs rond order types komen van #1 kiezen wanneer je #3 wilde (een "buy" wordt "geen positie omdat de spread te breed was") of #3 kiezen wanneer je #1 wilde (een "buy" wordt een resting order die uren later vult op het verkeerde moment).

FOK: wanneer je moet vullen of skippen

Fill-or-Kill matched de hele order op de gevraagde prijs of beter, direct. Als de volledige size niet direct kan worden gevuld, wordt de order rejected en gebeurt er niets. Geen resting, geen partial.

Gebruik FOK voor: news-arbitrage entries (je wilt alleen in op de news-prijs, niet op waar de markt 30s later is); take-profit exits op een specifiek doel waar partials de boekhouding zouden vertroebelen; elke keer dat de strategie atomische executie aanneemt.

De trade-off: FOK weigert vaker dan andere order types, vooral op illiquide books. Heb altijd een fallback path — herevalueer de strategy-conditie en retry als nog geldig, of ga door.

FAK: wanneer partials acceptabel zijn

Fill-and-Kill (ook "immediate or cancel" genoemd) matched zoveel als het nu kan, dan annuleert de ongevulde rest. Je kunt de volledige size krijgen, een partial of nul.

Gebruik FAK voor: market-buy met een specifiek prijsplafond (lift de ask tot N cent boven mid); sweep-the-book sells bij het urgent verminderen van inventory; elke strategie waar "wat positie beter is dan geen".

Operationeel lastiger dan FOK omdat de bot moet weten of hij 100% of 30% kreeg voordat hij de volgende stap beslist. De fill-respons bevat een filled_size veld — lees het altijd.

GTC: wanneer je wilt rusten op het book

Good-til-Cancelled rust op het book op jouw prijs totdat het vult of je annuleert. Geen timeout (andere order types in de v2 API zijn onder andere GTD met een expiry).

Gebruik GTC voor: take-profit sells op +Nc boven entry; stop-loss sells op -Nc onder entry (met caveats — zie hieronder); market-making tweezijdige quotes; elke positie waar de bot bereid is te wachten op een betere prijs.

De harde regel: GTC vereist ≥ 5 shares. Orders onder 5 shares worden afgewezen door de CLOB met Size (X) lower than the minimum: 5. Een bot die een 4-share GTC sell post faalt stil aan het zetten van de exit en rijdt de positie tot resolution. Check altijd inventory ≥ 5 voor het posten van GTC; val terug op FAK of ride-to-resolve als kleiner.

Limit vs market en de spread tax

Elke Polymarket order is technisch een limit order — zelfs wat bots een "market buy" noemen specificeert een prijsplafond. Het onderscheid is of die prijs op de best ask is (in feite een market order, vult tegen het book) of eronder (rust op het book).

De spread tax is de kost van crossing — bid 0,45, ask 0,47, mid 0,46. Een round trip die ask koopt en bid verkoopt betaalt 2 cent per share. Op een 60% win-rate strategie met +3c/-4c targets is die 2c spread het verschil tussen winst en verlies.

Maker-patroon (post GTC op de bid of eronder, wacht om geraakt te worden) vangt de spread in plaats van te betalen. De kost is onzekere fill — je wordt misschien nooit geraakt. Voor high-conviction trades, betaal de spread. Voor passieve accumulatie, werk het book.

Onze production defaults (FOK buys, GTC sells)

Het patroon waar de meeste van onze productie-bots op convergeren:

  • Entries: FOK op ask + 0-2 cent. Als de bot besloot te kopen, moet hij nu kopen of skippen. Een entry-order rusten is zelden de moeite waard — de situatie die de buy-beslissing triggerde verandert sneller dan de order rust.
  • Take-profit exits: GTC op doel-prijs. Direct gepost na entry-fill. We laten de markt naar ons komen; we jagen de bid niet omlaag. Met ≥ 5 shares.
  • Stop-loss: case-by-case. GTC werkt voor trage strategieën waar prijsveranderingen begrensd zijn. Voor snel-bewegende markten zal een GTC stop niet vullen als de prijs er doorheen vliegt; we rijden tot resolution in optie-D stijl (memory: trader-gtc-sell.md).

Het patroon is conservatief — minder fills, minder slippage. Een agressievere variant gebruikt FAK entries en FAK exits, accepteert partial fills. Kies één en blijf consistent; per-trade beslissingen mixen nodigt verwarring uit.

Code: plaats elk order type

Referentie order-plaatsing in Python met 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)

Zelfde operaties in Node met @polymarket/clob-client-v2: vervang OrderType.FOK door clob.OrderType.GTC etc.; de methode is createAndPostOrder. De negRisk flag (hoofdstuk 11) moet worden gezet in het tweede argument voor multi-outcome markten — het missen ervan routeert naar het verkeerde exchange contract.

Veelgestelde vragen

Wat is FOK op Polymarket?
Fill-or-Kill. De order moet direct volledig vullen of wordt geannuleerd — geen partial fills, geen rust op het book. We gebruiken FOK by default voor buys in onze productie trader omdat het phantom-fill ambiguïteit elimineert (de order is óf volledig gevuld óf volledig weg, nooit half vast).
Wat is FAK op Polymarket?
Fill-and-Kill (ook IOC, Immediate-or-Cancel genoemd). De order neemt welke liquiditeit ook direct beschikbaar is en annuleert de ongevulde rest. Nuttig wanneer je partial fills accepteert maar nooit rust wilt. Sneller dan FOK in gefragmenteerde order books.
Wat is GTC op Polymarket?
Good-til-Cancelled. De order rust op het book totdat gevuld of jij annuleert. GTC is wat je gebruikt om maker te zijn (liquiditeit leveren), rebates te verdienen en taker fees te vermijden. We gebruiken GTC voor sells in onze productie-setup zodat we de spread vangen op exits.
Moet mijn bot limit orders of market orders gebruiken?
Bijna altijd limit orders. Market orders betalen de taker fee (0,75% tot 1,80%) en de spread; limit orders verdienen de maker rebate (20-25% van taker fees). De enige goede reden om een market order te gebruiken is wanneer nieuws heeft toegeslagen en de prijs op het punt staat voorbij de spread te bewegen voordat je limit kan vullen.
Ondersteunt Polymarket stop-loss orders native?
Nee. Stop-loss is een client-side concept: je bot kijkt naar de prijs en wanneer de trigger-conditie wordt voldaan, plaatst een market of FAK sell order. De exchange heeft geen native stop-primitief, dus je moet de logica in je bot bouwen.
Wat zijn de order minimums?
Market orders: 1 USD minimum notional. Limit orders: 5 shares minimum. Sommige dunne markten weigeren zeer kleine orders — de SDK geeft een specifieke foutcode terug die je kunt detecteren en tegen re-sizen.