Tutorial de Bot da Polymarket · Capítulo 10 de 32

Tipos de ordem da Polymarket explicados para builders de bot: Fill-or-Kill (FOK), Fill-and-Kill (FAK), Good-til-Cancelled (GTC) e trade-offs entre limit e market. Com regras de decisão prontas para produção.

O que este capítulo cobre

A confusão com tipos de ordem é, de longe, a classe de bug mais cara para novos builders de bot. Enviar FOK quando era necessário GTC gera entradas perdidas; enviar GTC quando era necessário FOK deixa ordens resting que são executadas a preços péssimos horas depois. Este capítulo traz a árvore de decisão e os defaults de produção que se mantiveram sólidos em milhares de ordens.

  • Árvore de decisão rápida
  • FOK: quando você precisa executar ou desistir
  • FAK: quando parciais são aceitáveis
  • GTC: quando você quer ficar resting no book
  • Limit vs market e o spread tax
  • Nossos defaults de produção (FOK buys, GTC sells)
  • Código: como enviar cada tipo de ordem

Árvore de decisão rápida

Três perguntas decidem todo envio de ordem.

  1. Você precisa de uma execução garantida agora, e de jeito nenhum se não conseguir agora? → FOK.
  2. Você quer o máximo de execução possível agora, aceita parciais, sem ordem resting? → FAK.
  3. Você quer ficar resting no book no seu preço e esperar alguém vir até você? → GTC.

É isso. A maioria dos bugs de bot envolvendo tipos de ordem vem de escolher #1 quando você queria #3 (uma "buy" vira "sem posição porque o spread estava muito largo") ou escolher #3 quando você queria #1 (uma "buy" vira uma ordem resting que executa horas depois no momento errado).

FOK: quando você precisa executar ou desistir

Fill-or-Kill casa a ordem inteira no preço solicitado ou melhor, instantaneamente. Se o tamanho total não puder ser executado instantaneamente, a ordem é rejeitada e nada acontece. Sem resting, sem parcial.

Use FOK para: entradas de news-arbitrage (você só quer entrar pelo preço da notícia, não onde o mercado estará em 30s); saídas de take-profit em um alvo específico onde parciais bagunçariam a contabilidade; qualquer situação em que a estratégia assume execução atômica.

O trade-off: FOK rejeita com mais frequência do que outros tipos de ordem, especialmente em books ilíquidos. Sempre tenha um caminho de fallback - reavalie a condição da estratégia e tente de novo se ainda fizer sentido, ou siga em frente.

FAK: quando parciais são aceitáveis

Fill-and-Kill (também chamado de "immediate or cancel") executa o máximo possível agora e depois cancela o restante não executado. Você pode receber o tamanho total, uma parcial ou zero.

Use FAK para: market-buy com um teto de preço específico (levantar a ask até N cents acima do mid); sells que varrem o book quando é preciso reduzir inventário com urgência; qualquer estratégia em que "alguma posição é melhor do que nenhuma".

Operacionalmente é mais complicado que FOK porque o bot precisa saber se recebeu 100% ou 30% antes de decidir o próximo passo. A resposta da execução inclui o campo filled_size - leia sempre.

GTC: quando você quer ficar resting no book

Good-til-Cancelled fica resting no book no seu preço até executar ou até você cancelar. Sem timeout (outros tipos de ordem na API v2 incluem GTD com expiração).

Use GTC para: sells de take-profit em +Nc acima da entrada; sells de stop-loss em -Nc abaixo da entrada (com ressalvas - veja abaixo); market-making com cotações dos dois lados; qualquer posição em que o bot esteja disposto a esperar um preço melhor.

Regra dura: GTC exige ≥ 5 shares. Ordens abaixo de 5 shares são rejeitadas pela CLOB com Size (X) lower than the minimum: 5. Um bot que posta um GTC sell de 4 shares falha silenciosamente em definir a saída e carrega a posição até a resolução. Sempre verifique inventário ≥ 5 antes de postar GTC; faça fallback para FAK ou ride-to-resolve se for menor.

Limit vs market e o spread tax

Toda ordem da Polymarket é tecnicamente uma limit order - até o que os bots chamam de "market buy" especifica um teto de preço. A distinção é se esse preço está na melhor ask (na prática uma market order, executa contra o book) ou abaixo dela (fica resting no book).

O spread tax é o custo de cruzar - bid 0.45, ask 0.47, mid 0.46. Uma ida e volta que compra na ask e vende na bid paga 2 cents por share. Em uma estratégia com 60% de acerto e alvos de +3c/-4c, esse spread de 2c é a diferença entre lucro e prejuízo.

Padrão maker (poste GTC no bid ou abaixo, espere ser atingido) captura o spread em vez de pagá-lo. O custo é a incerteza de execução - talvez você nunca seja atingido. Para trades de alta convicção, pague o spread. Para acumulação passiva, trabalhe o book.

Nossos defaults de produção (FOK buys, GTC sells)

O padrão para o qual a maioria dos nossos bots de produção converge:

  • Entradas: FOK na ask + 0-2 cents. Se o bot decidiu comprar, ele deve comprar agora ou pular. Deixar uma ordem de entrada resting raramente compensa - a situação que disparou a decisão de compra muda mais rápido do que a ordem vai ficar resting.
  • Saídas de take-profit: GTC no preço-alvo. Postadas imediatamente após a entrada executar. Deixamos o mercado vir até nós; não corremos atrás da bid. Com ≥ 5 shares.
  • Stop-loss: caso a caso. GTC funciona para estratégias lentas, nas quais as mudanças de preço são limitadas. Em mercados de movimento rápido, um stop GTC não vai executar se o preço passar voando por ele; nós seguimos até a resolução em estilo option-D (memória: trader-gtc-sell.md).

O padrão é conservador - menos execuções, menos slippage. Uma variante mais agressiva usa entradas FAK e saídas FAK, aceitando execuções parciais. Escolha um e mantenha consistência; misturar decisões por trade convida à confusão.

Código: como enviar cada tipo de ordem

Referência de envio de ordem em Python com 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)

As mesmas operações em Node com @polymarket/clob-client-v2: substitua OrderType.FOK por clob.OrderType.GTC etc.; o método é createAndPostOrder. A flag negRisk (capítulo 11) deve ser definida no segundo argumento para mercados de múltiplos resultados - se ela estiver ausente, a ordem será roteada para o contrato de exchange errado.

Perguntas frequentes

O que é FOK na Polymarket?
Fill-or-Kill. A ordem precisa executar integralmente e imediatamente ou é cancelada - sem execuções parciais, sem ficar resting no book. Usamos FOK por padrão para buys no nosso trader de produção porque isso elimina a ambiguidade de phantom-fill (a ordem ou é totalmente executada ou desaparece por completo, nunca fica pela metade).
O que é FAK na Polymarket?
Fill-and-Kill (também chamado de IOC, Immediate-or-Cancel). A ordem pega toda a liquidez disponível imediatamente e cancela o restante não executado. Útil quando você aceita execuções parciais, mas nunca quer deixar resting. Mais rápido que FOK em books fragmentados.
O que é GTC na Polymarket?
Good-til-Cancelled. A ordem fica resting no book até executar ou até você cancelá-la. GTC é o que você usa para ser maker (fornecer liquidez), ganhar rebates e evitar taker fees. Usamos GTC para sells na nossa configuração de produção, para capturar o spread nas saídas.
Meu bot deve usar limit orders ou market orders?
Limit orders quase sempre. Market orders pagam a taker fee (0.75% a 1.80%) e o spread; limit orders ganham o maker rebate (20-25% das taker fees). O único bom motivo para usar market order é quando a notícia já saiu e o preço está prestes a se mover além do spread antes que sua limit consiga executar.
A Polymarket suporta stop-loss orders nativamente?
Não. Stop-loss é um conceito do lado do cliente: seu bot observa o preço e, quando a condição de gatilho é atingida, envia uma ordem de sell market ou FAK. A exchange não tem um primitivo nativo de stop, então você precisa implementar a lógica no seu bot.
Quais são os mínimos de ordem?
Market orders: mínimo notional de 1 USD. Limit orders: mínimo de 5 shares. Alguns mercados com pouca liquidez rejeitam ordens muito pequenas - o SDK retorna um código de erro específico que você pode detectar e reajustar o tamanho.