Polymarket Bot Tutorial · Розділ 10 із 32
Пояснення типів ордерів Polymarket для builder-ів ботів: Fill-or-Kill (FOK), Fill-and-Kill (FAK), Good-til-Cancelled (GTC) та компроміси limit-vs-market. З production-grade правилами ухвалення рішень.
Що охоплює цей розділ
Плутанина з типами ордерів - це найкоштовніша категорія багів для нових builder-ів ботів. Надіслати FOK, коли був потрібен GTC, означає пропущені входи; надіслати GTC, коли був потрібен FOK, означає, що ордери залишаються на книзі й можуть заповнитися за жахливими цінами через кілька годин. Цей розділ - це decision tree та production defaults, які витримали перевірку тисячами ордерів.
- Швидке decision tree
- FOK: коли ви маєте або заповнити, або пропустити
- FAK: коли часткові fills прийнятні
- GTC: коли ви хочете стояти в книзі
- Limit vs market і spread tax
- Наші production defaults (FOK buys, GTC sells)
- Code: розміщення кожного типу ордера
Швидке decision tree
Три запитання визначають кожне розміщення ордера.
- Чи потрібен вам гарантований fill прямо зараз, і взагалі ні, якщо зараз його не можна отримати? → FOK.
- Чи хочете ви отримати якомога більше fill прямо зараз, приймаючи partials, без resting order? → FAK.
- Чи хочете ви стояти в книзі за своєю ціною та чекати, поки ринок прийде до вас? → GTC.
Ось і все. Більшість багів ботів навколо типів ордерів виникають через вибір #1, коли ви хотіли #3 ("buy" перетворюється на "no position, бо spread був надто широкий") або вибір #3, коли ви хотіли #1 ("buy" перетворюється на resting order, який заповнюється через години в неправильний момент).
FOK: коли ви маєте заповнити або пропустити
Fill-or-Kill миттєво виконує весь ордер за запитуваною ціною або кращою. Якщо весь розмір не можна заповнити миттєво, ордер відхиляється, і нічого не відбувається. Жодного resting, жодного partial.
Використовуйте FOK для: news-arbitrage входів (вам потрібно увійти лише за ціною новини, а не за тим, де буде ринок через 30с); take-profit виходів за конкретною ціллю, де partials ускладнили б облік; будь-якого моменту, коли strategy припускає atomic execution.
Компроміс: FOK відхиляється частіше, ніж інші типи ордерів, особливо на illiquid books. Завжди майте fallback path - переоцініть умову стратегії й повторіть спробу, якщо вона все ще валідна, або рухайтеся далі.
FAK: коли часткові fills прийнятні
Fill-and-Kill (також називають "immediate or cancel") виконує зараз стільки, скільки може, а потім скасовує невиконаний залишок. Ви можете отримати повний розмір, частковий fill або нуль.
Використовуйте FAK для: market-buy із конкретною верхньою межею ціни (підняти ask до N центів вище mid); sweep-the-book sells, коли потрібно терміново скоротити інвентар; будь-якої стратегії, де "якась позиція краща за жодної".
Операційно складніше, ніж FOK, бо бот має знати, чи отримав 100%, чи 30%, перш ніж вирішувати наступний крок. Відповідь про fill містить поле filled_size - завжди читайте його.
GTC: коли ви хочете стояти в книзі
Good-til-Cancelled стоїть у книзі за вашою ціною, доки не буде заповнений або ви його не скасуєте. Тайм-ауту немає (інші типи ордерів у v2 API включають GTD із expiry).
Використовуйте GTC для: take-profit sells на +Nc вище входу; stop-loss sells на -Nc нижче входу (з застереженнями - див. нижче); market-making двосторонніх котирувань; будь-якої позиції, де бот готовий чекати кращої ціни.
Жорстке правило: GTC вимагає ≥ 5 shares. Ордери менше ніж на 5 shares відхиляються CLOB із Size (X) lower than the minimum: 5. Бот, який виставляє GTC sell на 4 shares, тихо не встановлює вихід і тягне позицію до resolution. Завжди перевіряйте inventory ≥ 5 перед розміщенням GTC; якщо менше - переходьте на FAK або ride-to-resolve.
Limit vs market і spread tax
Кожен ордер Polymarket технічно є limit order - навіть те, що боти називають "market buy", задає price ceiling. Різниця в тому, чи ця ціна дорівнює best ask (фактично market order, заповниться проти книги), чи нижча за нього (стоятиме в книзі).
Spread tax - це вартість перетину спреду: bid 0.45, ask 0.47, mid 0.46. Round trip, який купує за ask і продає за bid, сплачує 2 cents за share. У стратегії з win-rate 60% і цілями +3c/-4c цей спред у 2c - це різниця між profit і loss.
Maker pattern (ставити GTC на bid або нижче й чекати, поки вас візьмуть) отримує spread замість того, щоб платити його. Ціна - невизначений fill: вас можуть ніколи не взяти. Для угод із високою впевненістю сплачуйте spread. Для пасивного накопичення - працюйте по книзі.
Наші production defaults (FOK buys, GTC sells)
Патерн, до якого сходяться більшість наших production bots:
- Entries: FOK at ask + 0-2 cents. Якщо бот вирішив купувати, він має купити зараз або пропустити. Ставити entry order у resting майже ніколи не варто - ситуація, яка спричинила рішення купувати, змінюється швидше, ніж ордер буде стояти.
- Take-profit exits: GTC at target price. Публікуємо одразу після того, як entry заповнився. Ми даємо ринку прийти до нас; ми не наздоганяємо bid вниз. За умови ≥ 5 shares.
- Stop-loss: case-by-case. GTC працює для повільних стратегій, де зміни ціни обмежені. Для швидких ринків GTC stop не заповниться, якщо ціна проскочить його; тоді ми ride to resolution у форматі option-D (memory: trader-gtc-sell.md).
Цей патерн консервативний - менше fills, менше slippage. Більш агресивний варіант використовує FAK entries і FAK exits, приймаючи partial fills. Оберіть один і дотримуйтеся його послідовно; змішування рішень для кожної угоди створює плутанину.
Code: розміщення кожного типу ордера
Reference order placement in Python with 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)
Ті самі операції в Node з @polymarket/clob-client-v2: замініть OrderType.FOK на clob.OrderType.GTC тощо; метод - createAndPostOrder. Прапорець negRisk (розділ 11) потрібно встановити в другому аргументі для multi-outcome markets - якщо його пропустити, запит піде до неправильного exchange contract.












