Polymarket Bot Tutorial · Rozdział 10 z 32
Wyjaśnienie typów orderów na Polymarket dla twórców botów: Fill-or-Kill (FOK), Fill-and-Kill (FAK), Good-til-Cancelled (GTC) oraz trade-offy limit-vs-market. Z produkcyjnymi regułami decyzyjnymi.
Co obejmuje ten rozdział
Mylenie typów orderów to zdecydowanie najdroższa klasa bugów dla nowych twórców botów. Wysłanie FOK, gdy potrzebny był GTC, powoduje pominięte wejścia; wysłanie GTC, gdy potrzebny był FOK, zostawia resting orders, które wypełniają się godzinami później po fatalnych cenach. Ten rozdział to decision tree i produkcyjne domyślne ustawienia, które sprawdziły się przy tysiącach zleceń.
To jest rozdział 10 z naszej 32-częściowej serii o budowaniu Polymarket trading bot. Omawiamy temat dogłębnie w sekcjach poniżej. Treść główna każdej sekcji jest pisana i publikowana rozdział po rozdziale; odpowiedzi FAQ i referencje są już kompletne i odzwierciedlają produkcyjne doświadczenie z uruchamiania naszego własnego tradera.
- Szybkie decision tree
- FOK: kiedy musisz wypełnić albo pominąć
- FAK: kiedy partial fills są akceptowalne
- GTC: kiedy chcesz leżeć na booku
- Limit vs market i spread tax
- Nasze production defaults (FOK buys, GTC sells]
- Code: jak składać każdy typ orderu
Szybkie decision tree
Trzy pytania decydują o każdym złożeniu orderu.
- Czy potrzebujesz gwarantowanego filla teraz, a jeśli nie da się go uzyskać teraz, to w ogóle nie chcesz wejścia? → FOK.
- Czy chcesz tyle filla, ile da się uzyskać teraz, akceptujesz partial fills i nie chcesz resting order? → FAK.
- Czy chcesz leżeć na booku po swojej cenie i czekać, aż ktoś przyjdzie do Ciebie? → GTC.
To wszystko. Większość bugów botów wokół typów orderów wynika z wybrania #1, gdy chciałeś #3 (z "buy" robi się "brak pozycji, bo spread był za szeroki") albo z wybrania #3, gdy chciałeś #1 (z "buy" robi się resting order, który wypełnia się godzinami później, w złym momencie).
FOK: kiedy musisz wypełnić albo pominąć
Fill-or-Kill dopasowuje cały order po żądanej cenie lub lepszej, natychmiast. Jeśli pełna wielkość nie może zostać wypełniona od razu, order jest odrzucany i nic się nie dzieje. Bez resting, bez partial.
Używaj FOK do: wejść news-arbitrage (chcesz wejść tylko po cenie z newsa, a nie tam, gdzie rynek będzie za 30 s); wyjść take-profit przy konkretnym celu, gdzie partials utrudniałyby księgowanie; zawsze wtedy, gdy strategia zakłada atomic execution.
Trade-off: FOK odrzuca częściej niż inne typy orderów, zwłaszcza na illiquid books. Zawsze miej fallback path — ponownie oceń warunek strategii i spróbuj jeszcze raz, jeśli nadal jest ważny, albo po prostu przejdź dalej.
FAK: kiedy partials są akceptowalne
Fill-and-Kill (nazywany też "immediate or cancel") dopasowuje teraz tyle, ile może, a następnie anuluje niewypełnioną resztę. Możesz dostać pełną wielkość, partial albo zero.
Używaj FAK do: market-buy z określonym price ceiling (podnieś ask do N centów powyżej mid); sweep-the-book sells, gdy pilnie zmniejszasz inventory; każdej strategii, w której "jakaś pozycja jest lepsza niż żadna".
Operacyjnie jest trudniejszy niż FOK, bo bot musi wiedzieć, czy dostał 100% czy 30%, zanim zdecyduje o następnym kroku. Odpowiedź fill zawiera pole filled_size — zawsze je odczytuj.
GTC: kiedy chcesz leżeć na booku
Good-til-Cancelled leży na booku po Twojej cenie aż do filla albo anulowania. Bez timeoutu (inne typy orderów w API v2 obejmują GTD z expiry).
Używaj GTC do: wyjść take-profit na +Nc powyżej entry; stop-loss sells na -Nc poniżej entry (z zastrzeżeniami — patrz niżej); market-making z ofertami po obu stronach; każdej pozycji, w której bot jest gotów poczekać na lepszą cenę.
Twarda zasada: GTC wymaga ≥ 5 shares. Ordery poniżej 5 shares są odrzucane przez CLOB z komunikatem Size (X) lower than the minimum: 5. Bot, który wystawia 4-share GTC sell, po cichu nie ustawia wyjścia i trzyma pozycję do resolution. Zawsze sprawdzaj inventory ≥ 5 przed wystawieniem GTC; jeśli jest mniejsze, przejdź na FAK albo ride-to-resolve.
Limit vs market i spread tax
Każdy order na Polymarket jest technicznie orderem limit — nawet to, co boty nazywają "market buy", określa price ceiling. Różnica polega na tym, czy ta cena jest przy najlepszym asku (praktycznie market order, wypełni się przeciwko bookowi), czy poniżej niego (będzie leżeć na booku).
Spread tax to koszt crossing — bid 0.45, ask 0.47, mid 0.46. Round trip, który kupuje po ask i sprzedaje po bid, płaci 2 centy na share. Przy strategii z 60% win-rate i celach +3c/-4c te 2c spreadu decydują o tym, czy jest zysk, czy strata.
Maker pattern (wystaw GTC po bid lub niżej i czekaj, aż ktoś Cię trafi) zbiera spread zamiast go płacić. Koszt to niepewny fill — możesz nigdy nie zostać trafiony. Przy transakcjach o wysokiej pewności warto zapłacić spread. Przy pasywnej akumulacji pracuj book.
Nasze production defaults (FOK buys, GTC sells]
Wzorzec, do którego dochodzi większość naszych production botów:
- Entries: FOK przy ask + 0-2 centy. Jeśli bot zdecydował się kupić, powinien kupić teraz albo pominąć. Resting entry order rzadko jest tego wart — sytuacja, która wywołała decyzję o zakupie, zmienia się szybciej niż order będzie leżał.
- Take-profit exits: GTC po cenie docelowej. Wystawiane natychmiast po fillu wejścia. Pozwalamy rynkowi przyjść do nas; nie gonimy bid w dół. Z ≥ 5 shares.
- Stop-loss: case-by-case. GTC działa w wolniejszych strategiach, gdzie zmiany cen są ograniczone. Na szybko poruszających się rynkach GTC stop nie wypełni się, jeśli cena przebije go z dużą prędkością; wtedy ride to resolution w stylu option-D (pamięć: trader-gtc-sell.md).
Ten wzorzec jest zachowawczy — mniej filli, mniej slippage. Bardziej agresywna wersja używa FAK dla wejść i FAK dla wyjść, akceptując partial fills. Wybierz jeden wariant i trzymaj się go konsekwentnie; mieszanie decyzji per-trade prowadzi do chaosu.
Code: jak składać każdy typ orderu
Reference order placement w Python z 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)
Te same operacje w Node z @polymarket/clob-client-v2: zamień OrderType.FOK na clob.OrderType.GTC itd.; metoda to createAndPostOrder. Flaga negRisk (rozdział 11) musi być ustawiona w drugim argumencie dla multi-outcome markets — jej brak kieruje do złego exchange contract.











