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.

  1. Apakah Anda butuh guaranteed fill sekarang juga, dan sama sekali tidak jika tidak bisa mendapatkannya sekarang? → FOK.
  2. Apakah Anda ingin fill sebanyak mungkin yang bisa didapat sekarang, menerima partial, tanpa resting order? → FAK.
  3. 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.

Pertanyaan yang sering diajukan

Apa itu FOK di Polymarket?
Fill-or-Kill. Order harus terisi penuh secara langsung atau dibatalkan - tidak ada partial fill, tidak ada resting di book. Kami menggunakan FOK secara default untuk buy di production trader kami karena ini menghilangkan ambiguitas phantom-fill (order entah terisi penuh atau hilang sepenuhnya, tidak pernah setengah nyangkut).
Apa itu FAK di Polymarket?
Fill-and-Kill (juga disebut IOC, Immediate-or-Cancel). Order mengambil liquidity yang tersedia segera dan membatalkan sisa yang belum terisi. Berguna ketika Anda menerima partial fill tetapi tidak pernah ingin rest. Lebih cepat daripada FOK di order book yang terfragmentasi.
Apa itu GTC di Polymarket?
Good-til-Cancelled. Order rest di book sampai terisi atau Anda membatalkannya. GTC adalah yang Anda gunakan untuk menjadi maker (menyediakan liquidity), mendapatkan rebate, dan menghindari taker fee. Kami menggunakan GTC untuk sell dalam setup production kami sehingga kami menangkap spread saat exit.
Haruskah bot saya menggunakan limit order atau market order?
Hampir selalu limit order. Market order membayar taker fee (0.75% hingga 1.80%) dan spread; limit order mendapatkan maker rebate (20-25% dari taker fee). Satu-satunya alasan bagus untuk menggunakan market order adalah ketika news sudah terjadi dan harga akan bergerak melewati spread sebelum limit Anda sempat fill.
Apakah Polymarket mendukung stop-loss order secara native?
Tidak. Stop-loss adalah konsep di sisi client: bot Anda memantau harga, dan ketika kondisi trigger terpenuhi, bot menempatkan sell order market atau FAK. Exchange tidak punya primitive stop native, jadi Anda harus membangun logikanya di bot Anda.
Apa minimum order-nya?
Market order: minimum notional 1 USD. Limit order: minimum 5 shares. Beberapa market yang tipis menolak order yang sangat kecil - SDK mengembalikan specific error code yang bisa Anda deteksi dan sesuaikan ukuran ulang.