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.
- 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.
- 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.
- 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.












