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.
- Você precisa de uma execução garantida agora, e de jeito nenhum se não conseguir agora? → FOK.
- Você quer o máximo de execução possível agora, aceita parciais, sem ordem resting? → FAK.
- 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.












