Polymarket Bot Tutorial · Bab 10 dari 32
Penjelasan jenis order Polymarket untuk pembuat bot: Fill-or-Kill (FOK), Fill-and-Kill (FAK), Good-til-Cancelled (GTC), dan trade-off limit-vs-market. Dengan decision rules berstandar production.
Apa yang dibahas dalam bab ini
Kebingungan soal jenis order adalah kelas bug paling mahal bagi pembuat bot baru. Mengirim FOK saat yang dibutuhkan GTC akan menghasilkan entry yang terlewat; mengirim GTC saat yang dibutuhkan FOK akan meninggalkan resting order yang terisi dengan harga buruk beberapa jam kemudian. Bab ini adalah decision tree dan default production yang sudah teruji di ribuan order.
- Quick decision tree
- FOK: kapan Anda harus fill atau skip
- FAK: kapan partial diperbolehkan
- GTC: kapan Anda ingin rest di book
- Limit vs market dan spread tax
- Default production kami (FOK buys, GTC sells)
- Code: place masing-masing jenis order
Quick decision tree
Tiga pertanyaan menentukan setiap placement order.
- Apakah Anda butuh guaranteed fill sekarang juga, dan sama sekali tidak jika tidak bisa mendapatkannya sekarang? → FOK.
- Apakah Anda ingin fill sebanyak mungkin yang bisa didapat sekarang, menerima partial, tanpa resting order? → FAK.
- Apakah Anda ingin rest di book pada harga Anda dan menunggu seseorang datang kepada Anda? → GTC.
Itu saja. Sebagian besar bug bot seputar jenis order berasal dari memilih #1 saat Anda sebenarnya butuh #3 (sebuah "buy" berubah menjadi "tidak ada posisi karena spread terlalu lebar") atau memilih #3 saat Anda sebenarnya butuh #1 (sebuah "buy" berubah menjadi resting order yang terisi beberapa jam kemudian pada saat yang salah).
FOK: ketika Anda harus fill atau skip
Fill-or-Kill mencocokkan seluruh order pada harga yang diminta atau lebih baik, secara instan. Jika seluruh ukuran tidak bisa terisi seketika, order ditolak dan tidak ada yang terjadi. Tidak ada resting, tidak ada partial.
Gunakan FOK untuk: entry news-arbitrage (Anda hanya ingin masuk pada harga news, bukan pada posisi market 30 detik kemudian); take-profit exit pada target spesifik ketika partial akan mengaburkan bookkeeping; kapan pun strategi mengasumsikan eksekusi atomic.
Trade-off-nya: FOK lebih sering ditolak daripada jenis order lain, terutama pada book yang illiquid. Selalu punya fallback path - evaluasi ulang kondisi strategi dan coba lagi jika masih valid, atau lanjutkan.
FAK: ketika partial diperbolehkan
Fill-and-Kill (juga disebut "immediate or cancel") mencocokkan sebanyak mungkin yang bisa didapat sekarang, lalu membatalkan sisa yang belum terisi. Anda bisa mendapatkan seluruh ukuran, partial, atau nol.
Gunakan FAK untuk: market-buy dengan batas harga tertentu (angkat ask hingga N cent di atas mid); sweep-the-book sell saat mengurangi inventory secara mendesak; strategi apa pun di mana "sebagian posisi lebih baik daripada tidak sama sekali."
Secara operasional lebih rumit daripada FOK karena bot harus tahu apakah ia mendapatkan 100% atau 30% sebelum memutuskan langkah berikutnya. Respons fill mencakup field filled_size - selalu baca itu.
GTC: ketika Anda ingin rest di book
Good-til-Cancelled rest di book pada harga Anda sampai terisi atau Anda membatalkannya. Tidak ada timeout (jenis order lain di API v2 mencakup GTD dengan expiry).
Gunakan GTC untuk: take-profit sell pada +Nc di atas entry; stop-loss sell pada -Nc di bawah entry (dengan catatan - lihat di bawah); market-making dua sisi; posisi apa pun di mana bot bersedia menunggu harga yang lebih baik.
Aturan tegasnya: GTC memerlukan ≥ 5 shares. Order di bawah 5 shares akan ditolak oleh CLOB dengan Size (X) lower than the minimum: 5. Bot yang memposting GTC sell 4 shares akan gagal secara diam-diam untuk menetapkan exit dan akan membawa posisi sampai resolution. Selalu cek inventory ≥ 5 sebelum memposting GTC; fallback ke FAK atau ride-to-resolve jika lebih kecil.
Limit vs market dan spread tax
Setiap order Polymarket secara teknis adalah limit order - bahkan yang disebut bot sebagai "market buy" tetap menentukan batas harga. Perbedaannya adalah apakah harga itu berada di best ask (secara efektif market order, akan fill melawan book) atau di bawahnya (akan rest di book).
Spread tax adalah biaya untuk crossing - bid 0.45, ask 0.47, mid 0.46. Round trip yang membeli di ask dan menjual di bid membayar 2 cent per share. Pada strategi dengan win-rate 60% dan target +3c/-4c, spread 2c itu bisa menjadi perbedaan antara profit dan loss.
Pola maker (post GTC di bid atau di bawahnya, tunggu sampai dihit) mengumpulkan spread alih-alih membayarnya. Biayanya adalah fill yang tidak pasti - Anda mungkin tidak pernah dihit. Untuk trade dengan keyakinan tinggi, bayarlah spread. Untuk akumulasi pasif, kerjakan book.
Default production kami (FOK buys, GTC sells)
Pola yang paling sering menjadi acuan bot production kami:
- Entry: FOK di ask + 0-2 cent. Jika bot memutuskan untuk buy, seharusnya buy sekarang atau skip. Menaruh entry order untuk rest jarang sepadan - situasi yang memicu keputusan buy berubah lebih cepat daripada order akan rest.
- Take-profit exit: GTC pada target price. Diposting segera setelah entry terisi. Kami membiarkan market datang kepada kami; kami tidak mengejar bid turun. Dengan ≥ 5 shares.
- Stop-loss: case-by-case. GTC bekerja untuk strategi lambat di mana perubahan harga terbatas. Untuk market yang bergerak cepat, stop GTC tidak akan fill jika harga melaju melewatinya; kami ride to resolution dalam gaya option-D (memory: trader-gtc-sell.md).
Pola ini konservatif - fill lebih sedikit, slippage lebih kecil. Varian yang lebih agresif menggunakan FAK untuk entry dan FAK untuk exit, menerima partial fill. Pilih satu dan tetap konsisten; mencampur keputusan per trade akan memicu kebingungan.
Code: place masing-masing jenis order
Referensi placement order dalam Python dengan 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)
Operasi yang sama di Node dengan @polymarket/clob-client-v2: ganti OrderType.FOK dengan clob.OrderType.GTC dan seterusnya; method-nya adalah createAndPostOrder. Flag negRisk (bab 11) harus diset di argumen kedua untuk multi-outcome markets - jika tidak, order akan diarahkan ke exchange contract yang salah.












