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

Три запитання визначають кожне розміщення ордера.

  1. Чи потрібен вам гарантований fill прямо зараз, і взагалі ні, якщо зараз його не можна отримати? → FOK.
  2. Чи хочете ви отримати якомога більше fill прямо зараз, приймаючи partials, без resting order? → FAK.
  3. Чи хочете ви стояти в книзі за своєю ціною та чекати, поки ринок прийде до вас? → 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.

Поширені запитання

Що таке FOK на Polymarket?
Fill-or-Kill. Ордер має заповнитися повністю негайно або буде скасований - без partial fills, без resting on the book. Ми використовуємо FOK за замовчуванням для buys у нашому production trader, бо це усуває неоднозначність phantom-fill (ордер або повністю заповнений, або повністю зник, ніколи наполовину завислий).
Що таке FAK на Polymarket?
Fill-and-Kill (також називають IOC, Immediate-or-Cancel). Ордер забирає всю доступну liquidity негайно й скасовує невиконаний залишок. Корисно, коли ви приймаєте partial fills, але ніколи не хочете rest. Швидше за FOK у fragmented order books.
Що таке GTC на Polymarket?
Good-til-Cancelled. Ордер стоїть у книзі, доки не буде заповнений або ви його не скасуєте. GTC - це те, що ви використовуєте, щоб бути maker-ом (надавати liquidity), заробляти rebates і уникати taker fees. Ми використовуємо GTC для sells у нашому production setup, щоб отримувати spread на виходах.
Чи має мій бот використовувати limit orders чи market orders?
Переважно limit orders. Market orders сплачують taker fee (0.75% to 1.80%) і spread; limit orders отримують maker rebate (20-25% від taker fees). Єдина хороша причина використовувати market order - коли новина вже вийшла і ціна ось-ось піде далі за spread до того, як ваш limit встигне заповнитися.
Чи підтримує Polymarket stop-loss orders нативно?
Ні. Stop-loss - це client-side концепція: ваш бот стежить за ціною, і коли спрацьовує умова тригера, розміщує market або FAK sell order. У біржі немає нативного stop primitive, тож логіку потрібно будувати в боті.
Які мінімальні розміри ордерів?
Market orders: мінімум 1 USD notional. Limit orders: мінімум 5 shares. Деякі thin markets відхиляють дуже маленькі ордери - SDK повертає конкретний error code, який можна виявити й скоригувати розмір.