Tutorial de Bot de Polymarket · Capítulo 10 de 32
Tipos de órdenes de Polymarket explicados para quienes construyen bots: Fill-or-Kill (FOK), Fill-and-Kill (FAK), Good-til-Cancelled (GTC) y las ventajas y desventajas entre limit y market. Con reglas de decisión de nivel producción.
Qué cubre este capítulo
La confusión con los tipos de órdenes es la clase de bug más costosa para los nuevos desarrolladores de bots. Enviar FOK cuando se necesitaba GTC produce entradas perdidas; enviar GTC cuando se necesitaba FOK deja órdenes resting que se ejecutan horas después a precios pésimos. Este capítulo es el árbol de decisión y los valores predeterminados de producción que han resistido miles de órdenes.
- Árbol de decisión rápido
- FOK: cuándo debes llenar o saltar
- FAK: cuándo se aceptan parciales
- GTC: cuándo quieres dejar la orden resting en el libro
- Limit vs market y el spread tax
- Nuestros defaults de producción (FOK buys, GTC sells)
- Código: colocar cada tipo de orden
Árbol de decisión rápido
Tres preguntas deciden cada colocación de orden.
- ¿Necesitas una ejecución garantizada ahora mismo, y de ninguna manera si no la puedes obtener en este momento? → FOK.
- ¿Quieres la mayor ejecución posible ahora mismo, aceptando parciales, sin que la orden quede resting? → FAK.
- ¿Quieres dejar la orden resting en el libro a tu precio y esperar a que alguien venga hacia ti? → GTC.
Eso es todo. La mayoría de los bugs de bots relacionados con tipos de órdenes vienen de elegir #1 cuando querías #3 (un "buy" se convierte en "no position because the spread was too wide") o de elegir #3 cuando querías #1 (un "buy" se convierte en una orden resting que se ejecuta horas después en el momento equivocado).
FOK: cuándo debes llenar o saltar
Fill-or-Kill ejecuta toda la orden al precio solicitado o mejor, de inmediato. Si no se puede llenar el tamaño completo de forma instantánea, la orden se rechaza y no pasa nada. Sin resting, sin parcial.
Usa FOK para: entradas de news arbitrage (solo quieres entrar al precio de la noticia, no al precio que tenga el mercado en 30s); salidas de take-profit en un objetivo específico donde los parciales complicarían la contabilidad; cualquier momento en que la estrategia asuma ejecución atómica.
El trade-off: FOK se rechaza más seguido que otros tipos de orden, especialmente en libros ilíquidos. Siempre ten un camino alternativo: reevalúa la condición de la estrategia e inténtalo otra vez si sigue siendo válida, o sigue adelante.
FAK: cuándo se aceptan parciales
Fill-and-Kill (también llamado "immediate or cancel") ejecuta todo lo que pueda ahora mismo y luego cancela el resto no ejecutado. Puedes recibir el tamaño completo, un parcial o nada.
Usa FAK para: market-buy con un techo de precio específico (levantar el ask hasta N centavos por encima del mid); ventas sweep-the-book cuando reduces inventario con urgencia; cualquier estrategia en la que "alguna posición es mejor que ninguna".
Operativamente es más delicado que FOK porque el bot tiene que saber si obtuvo 100% o 30% antes de decidir el siguiente paso. La respuesta de ejecución incluye un campo filled_size - léelo siempre.
GTC: cuándo quieres dejar la orden resting en el libro
Good-til-Cancelled queda resting en el libro a tu precio hasta que se llena o la cancelas. No tiene timeout (otros tipos de orden en la API v2 incluyen GTD con expiración).
Usa GTC para: salidas de take-profit en +Nc sobre la entrada; stop-loss en -Nc por debajo de la entrada (con salvedades - ver abajo); quotes de market making en ambos lados; cualquier posición en la que el bot esté dispuesto a esperar un mejor precio.
La regla dura: GTC requiere ≥ 5 shares. Órdenes por debajo de 5 shares son rechazadas por el CLOB con Size (X) lower than the minimum: 5. Un bot que publica una venta GTC de 4 shares falla silenciosamente al configurar la salida y arrastra la posición hasta resolución. Siempre verifica que el inventario sea ≥ 5 antes de publicar GTC; si es menor, haz fallback a FAK o ride-to-resolve.
Limit vs market y el spread tax
Toda orden de Polymarket es técnicamente una limit order - incluso lo que los bots llaman "market buy" especifica un techo de precio. La diferencia es si ese precio está en el mejor ask (efectivamente una market order, ejecutará contra el libro) o por debajo de él (quedará resting en el libro).
El spread tax es el costo de cruzar - bid 0.45, ask 0.47, mid 0.46. Un round trip que compra al ask y vende al bid paga 2 centavos por share. En una estrategia con 60% de win-rate y objetivos de +3c/-4c, ese spread de 2c es la diferencia entre ganancia y pérdida.
El patrón maker (publicar GTC en el bid o por debajo, esperar a que te llenen) captura el spread en lugar de pagarlo. El costo es la incertidumbre de ejecución - puede que nunca te llenen. Para trades de alta convicción, paga el spread. Para acumulación pasiva, trabaja el libro.
Nuestros defaults de producción (FOK buys, GTC sells)
El patrón al que convergen la mayoría de nuestros bots de producción:
- Entradas: FOK en ask + 0-2 centavos. Si el bot decidió comprar, debería comprar ahora o saltar. Dejar resting una orden de entrada rara vez vale la pena: la situación que disparó la decisión de compra cambia más rápido de lo que la orden permanecerá resting.
- Salidas de take-profit: GTC al precio objetivo. Se publica inmediatamente después de que la entrada se llena. Dejamos que el mercado venga hacia nosotros; no perseguimos el bid a la baja. Con ≥ 5 shares.
- Stop-loss: caso por caso. GTC funciona para estrategias lentas donde los cambios de precio están acotados. En mercados de movimiento rápido, un stop GTC no se ejecutará si el precio lo atraviesa con fuerza; hacemos ride to resolution en estilo option-D (memoria: trader-gtc-sell.md).
El patrón es conservador - menos ejecuciones, menos slippage. Una variante más agresiva usa entradas FAK y salidas FAK, aceptando parciales. Elige una y mantén consistencia; mezclar decisiones por operación invita a la confusión.
Código: colocar cada tipo de orden
Referencia de colocación de órdenes en Python con 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)
Las mismas operaciones en Node con @polymarket/clob-client-v2: reemplaza OrderType.FOK con clob.OrderType.GTC, etc.; el método es createAndPostOrder. La bandera negRisk (capítulo 11) debe configurarse en el segundo argumento para mercados multi-outcome - si falta, se enruta al contrato de exchange incorrecto.












