Polymarket Limit Orders vs Market Orders
A Polymarket limit order is not simply a slower version of a market order. For automated trading, the distinction determines whether your bot controls execution price, crosses the spread, provides liquidity, or accepts whatever liquidity is currently available.
Polymarket uses a Central Limit Order Book (CLOB). Importantly, its documentation states that all orders are technically limit orders; what users call a market order is effectively an order configured to execute immediately against available resting liquidity.
For a trading bot, that distinction is critical. This article shows how to reason about both execution styles, how they map to Polymarket's current API model, and how to design an execution layer that does not blindly cross the book.
What You'll Learn
- When to use a Polymarket limit order
- How marketable orders differ from resting orders
- GTC, GTD, FOK and FAK execution
- Maker/taker implications
- Python implementation patterns
- Slippage, partial fills and adverse selection
- Production monitoring and testing
Limit Order vs Market Order
Consider a YES token with:
Best bid: $0.61
Best ask: $0.64
A limit buy at $0.62 does not cross the spread. It can rest at $0.62.
A buy configured to execute immediately instead consumes available asks beginning at the best available price.
The trade-off is straightforward:
| Execution | Primary control | Main risk |
|---|---|---|
| Resting limit | Price | No fill |
| Marketable order | Execution | Slippage |
| FOK | Complete fill | Rejection |
| FAK | Partial execution | Incomplete position |
Polymarket explicitly notes that limit orders can partially fill and remain open until filled or cancelled.
The important CLOB insight
Do not build your bot around the assumption that "market order" means a completely different exchange primitive.
Polymarket's order lifecycle documentation says a market order is essentially a limit order priced to execute immediately against resting orders.
That means your execution engine should think in terms of price aggressiveness and fill policy, not merely two labels.
Order Types That Matter
Polymarket currently documents:
- GTC: remains open until filled or cancelled.
- GTD: remains active until its expiration.
- FOK: Fill Or Kill; the complete order must fill immediately.
- FAK: Fill And Kill; available liquidity is consumed and the remainder is cancelled.
- Post-only: must rest on the book rather than immediately match.
For algorithmic trading, FAK is particularly useful when partial execution is acceptable but leaving stale quantity resting on the book is undesirable.
Architecture
flowchart LR
A[Strategy Signal] --> B[Execution Engine]
B --> C[Read Order Book]
C --> D{Execution Decision}
D -->|Price sensitive| E[Limit Order]
D -->|Immediate exposure| F[Marketable Order]
E --> G[CLOB]
F --> G
G --> H[Matched Fills]
H --> I[Position / Order State]
I --> B
The execution engine should be separate from the strategy. A signal should say what exposure is desired; the execution layer should decide how aggressively to acquire it.
Python Implementation
Polymarket's current official Python SDK is polymarket-client, which is still in beta. Polymarket recommends the unified Python SDK for new projects; the older py-clob-client repository is archived.
For developers working directly with the documented CLOB concepts, the core limit-order logic looks like this:
from decimal import Decimal
def choose_limit_price(
best_bid: Decimal,
best_ask: Decimal,
max_price: Decimal,
) -> Decimal | None:
"""
Example execution policy:
never pay more than max_price and avoid blindly crossing.
"""
candidate = min(best_bid, max_price)
if candidate <= 0:
return None
return candidate
This is intentionally separate from authentication and order submission. Your strategy should not contain private-key handling, signing, retry logic, or order-state reconciliation.
For production systems, obtain the current book, validate the market's tick size, calculate a valid order price, create the signed order, and submit it through the current SDK/API flow.
Polymarket's SDK tooling validates prices against the market tick size, so hard-coding a universal price increment is unsafe.
A Better Execution Decision
Suppose your model estimates a fair probability of 0.68.
The book is:
Bid: 0.64
Ask: 0.67
A naïve bot immediately buys at the ask.
A better execution engine can evaluate:
fair_value = 0.68
best_ask = 0.67
If the expected edge remains positive after spread, fees where applicable, and estimated slippage, aggressive execution may make sense.
But if the ask moves to 0.70, the same signal should not automatically become a market buy.
The key abstraction is:
expected_edge = fair_value - execution_price
Then incorporate execution uncertainty:
risk_adjusted_edge = (
expected_edge
- estimated_slippage
- adverse_selection_cost
)
These are model inputs, not guaranteed profits.
Production Considerations
1. Never assume displayed price equals execution price
Polymarket documents that the displayed price can represent the midpoint between bid and ask. A trader buying pays the ask, while a seller receives the bid.
Your bot should therefore work from the order book rather than treating the displayed market price as executable.
2. Handle partial fills
A GTC order may be partially matched. Your state machine should track:
submitted
→ live
→ partially filled
→ filled
and also cancellation/rejection states.
The CLOB API exposes order information including original size, matched size, price and status.
3. Respect API limits
Do not implement a tight polling loop that repeatedly requests the same book without a reason.
Current CLOB documentation publishes separate burst and sustained limits for trading endpoints, including order submission and cancellation.
Use exponential backoff for transient failures and maintain local order state.
4. Separate order intent from order submission
A robust architecture looks like:
Signal
↓
Position target
↓
Execution policy
↓
Price + size + order type
↓
Risk checks
↓
Signer
↓
CLOB
↓
Reconciliation
This makes it possible to change from passive limits to FAK execution without rewriting your strategy.
Failure Modes
The most common mistakes are:
- Confusing midpoint with executable price.
- Assuming every limit order will fill.
- Ignoring partial fills.
- Hard-coding tick sizes.
- Retrying an uncertain submission without checking order state.
- Leaving stale GTC orders active after the strategy has changed.
- Treating market execution as having zero slippage.
The last point matters especially in thin books. Polymarket notes that large orders can materially affect execution depending on available liquidity.
Performance and Observability
Measure execution quality rather than simply counting successful API responses.
Useful metrics include:
- requested price
- submitted price
- average fill price
- filled quantity
- time from decision to submission
- cancellation rate
- partial-fill rate
- estimated slippage
- book depth at decision time
- rejected-order count
A useful execution log might be:
signal_id=abc123
token_id=...
side=BUY
target_size=100
limit_price=0.64
avg_fill=0.645
filled=100
order_type=FAK
This gives your research system data it can later use to improve execution policies.
Security
Never embed a private key, API secret, seed phrase or builder credential in source code.
Use environment variables or a secrets manager. Restrict permissions, keep production credentials out of notebooks, and never log signed payloads or secrets.
Polymarket's official SDK repository also recommends environment-based credential handling in its integration-testing workflow.
Testing Strategy
Before allowing real orders:
- Unit-test price and size calculations.
- Test tick-size rounding.
- Simulate empty and shallow books.
- Test partial fills.
- Test rejected orders.
- Test cancellation races.
- Test restart/reconciliation behavior.
- Run credentialed integration tests only when explicitly intended.
The official Python SDK distinguishes integration tests from metered tests that may mutate live state or spend funds.
Practical Rule
A useful default policy for a quantitative bot is:
Use a limit order when price matters more than immediate execution. Use an aggressive/marketable order when obtaining the position matters more than preserving your entry price.
Then let the execution engine decide how much liquidity to consume.
Do not make "market vs limit" a strategy-level boolean. Make it a consequence of current spread, depth, fair value, urgency, inventory and risk limits.
Advanced Improvements
Once the basic execution layer works, add:
- dynamic aggression based on fair value
- order-book depth estimation
- stale-order detection
- cancellation/repricing policies
- position-aware execution
- maximum spread thresholds
- fill-probability models
- execution-quality attribution
- WebSocket-driven market data rather than unnecessary polling
The goal is not simply faster order placement. It is better decisions about when not to cross the spread.
FAQ
Is a Polymarket limit order better than a market order?
Neither is universally better. A limit order provides price control but can remain unfilled. Aggressive execution prioritizes immediacy and can consume liquidity at multiple prices.
Are Polymarket market orders really market orders?
Polymarket's documentation describes them as limit orders configured to execute immediately against resting liquidity.
Can Polymarket limit orders partially fill?
Yes. Limit orders can receive partial fills as counterparties match portions of the order.
What is FAK?
Fill And Kill executes whatever quantity is immediately available and cancels the remainder. FOK instead requires the entire order to fill immediately.
Should a trading bot always use limit orders?
No. Passive orders introduce non-fill risk. For time-sensitive strategies, an aggressive execution policy may be appropriate when the expected edge justifies crossing available liquidity.
Conclusion
The important distinction between a Polymarket limit order and a market order is not simply "wait versus execute now."
It is price control versus execution certainty.
A serious trading bot should therefore treat order placement as its own engineering subsystem. Read the book, estimate executable price, validate tick size and size constraints, select an appropriate order type, submit safely, and reconcile actual fills against intended exposure.
That architecture is far more robust than putting BUY or SELL directly inside a strategy function.
Trading-risk disclaimer: This article is educational and describes software and execution concepts, not financial advice. Automated prediction-market trading involves execution risk, liquidity risk, model risk, adverse selection and potential loss of capital.
Related Articles / Internal Topic Cluster
Building a Polymarket Trading Bot in Python
Anchor: Polymarket trading bot in Python
Why: foundational bot architecture.How Polymarket CLOB V2 Works
Anchor: Polymarket CLOB V2 architecture
Why: explains the matching and settlement layer.Polymarket Order Book Analysis in Python
Anchor: Polymarket order book analysis
Why: natural prerequisite for execution decisions.Polymarket Market Making Strategy
Anchor: Polymarket market making
Why: expands the passive-liquidity side of limit-order execution.Polymarket Trading Bot Risk Management
Anchor: Polymarket bot risk management
Why: connects execution with position sizing and exposure controls.Polymarket Crypto Up/Down Trading Bots
Anchor: Polymarket Crypto Up/Down bots
Why: applies execution concepts to short-duration markets.
Useful Resources
- Polymarket — official trading platform.
- Polymarket Documentation — primary technical reference.
- Prices & Orderbook documentation — best reference for bids, asks, spreads and order behavior.
- Order Lifecycle documentation — explains GTC, GTD, FOK, FAK and post-only behavior.
- Official Polymarket Python SDK — current Python SDK for developers; currently beta.
- Polymarket Python CLOB tutorial on YouTube — practical third-party walkthrough for CLOB interaction.
- DEV: Open-source Polymarket market maker architecture — useful community perspective on automated liquidity provision.
- Medium: How Polymarket Orders Actually Get Executed — third-party CLOB execution explanation; useful as supplementary material, not an authoritative specification.
About the Author
Soulcrancerdev
I write about Polymarket trading bots, prediction-market infrastructure, algorithmic trading, Python automation, Web3 development, and quantitative strategies.
Contact:
X: https://x.com/soulcrancerdev
Telegram: https://t.me/soulcrancerdev
Top comments (0)