Polymarket Bot Tutorial · Chương 10/32

Giải thích các loại order của Polymarket dành cho bot builder: Fill-or-Kill (FOK), Fill-and-Kill (FAK), Good-til-Cancelled (GTC), và đánh đổi giữa limit vs market. Kèm các decision rules chuẩn production.

Chương này bao gồm gì

Nhầm lẫn về order type là nhóm bug tốn kém nhất đối với các bot builder mới. Gửi FOK khi cần GTC sẽ dẫn đến bỏ lỡ entry; gửi GTC khi cần FOK sẽ để lại resting order và có thể khớp ở mức giá tệ vài giờ sau đó. Chương này là decision tree và các default chuẩn production đã hoạt động tốt qua hàng nghìn order.

  • Decision tree nhanh
  • FOK: khi bạn phải khớp hoặc bỏ qua
  • FAK: khi partials chấp nhận được
  • GTC: khi bạn muốn rest trên order book
  • Limit vs market và spread tax
  • Default production của chúng tôi (FOK buys, GTC sells)
  • Code: đặt từng loại order

Decision tree nhanh

Ba câu hỏi quyết định mọi lần đặt order.

  1. Bạn có cần khớp được ngay bây giờ, và nếu không thể thì không khớp luôn? → FOK.
  2. Bạn muốn khớp được càng nhiều càng tốt ngay bây giờ, chấp nhận partial, và không để lại resting order? → FAK.
  3. Bạn muốn rest trên book ở mức giá của mình và chờ ai đó đến khớp với bạn? → GTC.

Chỉ có vậy. Phần lớn bug của bot liên quan đến order type đều xuất phát từ việc chọn #1 khi bạn thực ra muốn #3 (một lệnh "buy" biến thành "không có position vì spread quá rộng") hoặc chọn #3 khi bạn thực ra muốn #1 (một lệnh "buy" biến thành resting order và khớp vài giờ sau vào thời điểm không phù hợp).

FOK: khi bạn phải khớp hoặc bỏ qua

Fill-or-Kill khớp toàn bộ order ở mức giá yêu cầu hoặc tốt hơn, ngay lập tức. Nếu không thể khớp đủ toàn bộ size ngay, order sẽ bị từ chối và không có gì xảy ra. Không resting, không partial.

Dùng FOK cho: entry kiểu news-arbitrage (bạn chỉ muốn vào ở mức giá lúc tin ra, không phải mức giá của thị trường sau 30 giây); exit take-profit tại một mục tiêu cụ thể nơi partials sẽ làm rối sổ sách; bất kỳ lúc nào chiến lược giả định việc thực thi là atomic.

Đánh đổi: FOK bị từ chối thường xuyên hơn các loại order khác, đặc biệt trên các book kém thanh khoản. Luôn có phương án fallback - đánh giá lại điều kiện chiến lược và thử lại nếu vẫn còn hợp lệ, hoặc bỏ qua và chuyển sang cơ hội khác.

FAK: khi partials chấp nhận được

Fill-and-Kill (còn gọi là "immediate or cancel") khớp được bao nhiêu thì khớp ngay bấy nhiêu, rồi hủy phần còn lại chưa khớp. Bạn có thể nhận đủ size, một phần, hoặc không gì cả.

Dùng FAK cho: market-buy với một trần giá cụ thể (đẩy ask lên tối đa N cents so với mid); sweep-the-book sells khi cần giảm inventory khẩn cấp; bất kỳ chiến lược nào mà "có position còn hơn không".

Về vận hành, loại này khó hơn FOK vì bot phải biết mình khớp được 100% hay 30% trước khi quyết định bước tiếp theo. Phản hồi khớp bao gồm field filled_size - luôn đọc nó.

GTC: khi bạn muốn rest trên order book

Good-til-Cancelled sẽ rest trên book ở mức giá của bạn cho đến khi khớp hoặc bạn hủy. Không có timeout (các order type khác trong v2 API có GTD với thời hạn hết hạn).

Dùng GTC cho: lệnh sell take-profit tại +Nc so với entry; lệnh sell stop-loss tại -Nc so với entry (có lưu ý - xem bên dưới); market-making với quote hai chiều; bất kỳ vị thế nào mà bot sẵn sàng chờ giá tốt hơn.

Quy tắc cứng: GTC yêu cầu ≥ 5 shares. Order dưới 5 shares sẽ bị CLOB từ chối với thông báo Size (X) lower than the minimum: 5. Một bot đặt lệnh GTC sell 4 shares sẽ âm thầm không thiết lập được exit và phải ôm vị thế đến khi resolution. Luôn kiểm tra inventory ≥ 5 trước khi đặt GTC; nếu nhỏ hơn thì fallback sang FAK hoặc ride-to-resolve.

Limit vs market và spread tax

Về mặt kỹ thuật, mọi order trên Polymarket đều là limit order - ngay cả thứ bot gọi là "market buy" cũng chỉ định một price ceiling. Điểm khác nhau là mức giá đó có ở best ask hay không (về thực chất là market order, sẽ khớp với book) hoặc thấp hơn (sẽ rest trên book).

Spread tax là chi phí khi cross spread - bid 0.45, ask 0.47, mid 0.46. Một vòng mua ở ask rồi bán ở bid sẽ trả 2 cents mỗi share. Với chiến lược win-rate 60% và target +3c/-4c, chênh 2c này là ranh giới giữa có lãi và thua lỗ.

Mẫu maker (đặt GTC ở bid hoặc thấp hơn, chờ được hit) sẽ thu spread thay vì trả nó. Đổi lại là không chắc chắn được khớp - bạn có thể không bao giờ được hit. Với giao dịch conviction cao, hãy trả spread. Với tích lũy thụ động, hãy work the book.

Default production của chúng tôi (FOK buys, GTC sells)

Mẫu mà hầu hết bot production của chúng tôi hội tụ về:

  • Entries: FOK tại ask + 0-2 cents. Nếu bot đã quyết định mua, thì nên mua ngay hoặc bỏ qua. Để entry order ở trạng thái resting hiếm khi đáng giá - tình huống kích hoạt quyết định mua thường thay đổi nhanh hơn thời gian order rest.
  • Take-profit exits: GTC tại giá mục tiêu. Đặt ngay sau khi entry khớp. Chúng tôi để thị trường đến với mình; không chase bid xuống. Với ≥ 5 shares.
  • Stop-loss: tùy trường hợp. GTC phù hợp cho chiến lược chậm, nơi biến động giá có giới hạn. Với thị trường biến động nhanh, một GTC stop sẽ không khớp nếu giá lao qua nó; chúng tôi ride to resolution theo kiểu option-D (ghi nhớ: trader-gtc-sell.md).

Mẫu này mang tính thận trọng - ít fill hơn, slippage thấp hơn. Một biến thể quyết liệt hơn dùng FAK cho cả entry và exit, chấp nhận partial fills. Hãy chọn một cách và giữ nhất quán; trộn lẫn quyết định theo từng trade sẽ dễ gây nhầm lẫn.

Code: đặt từng loại order

Tham chiếu đặt order trong Python với 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)

Các thao tác tương tự trong Node với @polymarket/clob-client-v2: thay OrderType.FOK bằng clob.OrderType.GTC v.v.; method là createAndPostOrder. Cờ negRisk (chương 11) phải được set trong đối số thứ hai cho các thị trường multi-outcome - thiếu nó sẽ route sang nhầm exchange contract.

Câu hỏi thường gặp

FOK trên Polymarket là gì?
Fill-or-Kill. Order phải được khớp toàn bộ ngay lập tức hoặc sẽ bị hủy - không có partial fills, không rest trên book. Chúng tôi dùng FOK mặc định cho các lệnh buy trong trader production của mình vì nó loại bỏ sự mơ hồ của phantom-fill (order либо được khớp hoàn toàn hoặc biến mất hoàn toàn, không bao giờ bị kẹt nửa chừng).
FAK trên Polymarket là gì?
Fill-and-Kill (còn gọi là IOC, Immediate-or-Cancel). Order lấy bất kỳ thanh khoản nào có sẵn ngay lập tức và hủy phần còn lại chưa khớp. Hữu ích khi bạn chấp nhận partial fills nhưng không bao giờ muốn rest. Nhanh hơn FOK trong các order book bị phân mảnh.
GTC trên Polymarket là gì?
Good-til-Cancelled. Order rest trên book cho đến khi khớp hoặc bạn hủy. GTC là thứ bạn dùng để làm maker (cung cấp thanh khoản), nhận rebates và tránh taker fees. Chúng tôi dùng GTC cho lệnh sell trong thiết lập production để thu spread khi thoát vị thế.
Bot của tôi nên dùng limit order hay market order?
Hầu như luôn là limit order. Market order trả taker fee (0.75% đến 1.80%) và spread; limit order nhận maker rebate (20-25% của taker fees). Lý do hợp lý duy nhất để dùng market order là khi tin tức vừa xuất hiện và giá có thể di chuyển vượt qua spread trước khi limit order của bạn kịp khớp.
Polymarket có hỗ trợ stop-loss native không?
Không. Stop-loss là khái niệm phía client: bot của bạn theo dõi giá, và khi điều kiện kích hoạt được đáp ứng, nó đặt một lệnh sell market hoặc FAK. Sàn không có primitive stop native, nên bạn phải tự xây logic này trong bot.
Minimum order là bao nhiêu?
Market order: minimum notional 1 USD. Limit order: tối thiểu 5 shares. Một số thị trường thanh khoản mỏng sẽ từ chối các order rất nhỏ - SDK sẽ trả về một mã lỗi cụ thể mà bạn có thể phát hiện và điều chỉnh lại kích thước.