Polymarket Units, Rounding and Risk
This page covers the units regular Polymarket (platform: polymarket) uses for prices, sizes, money and time, how the live Bot clamps and rounds order prices onto the market's tick, the market's minimum order size, and how each key in the risk block behaves here. For every key and its allowed values, see All Polymarket parameters.
Units, ticks and rounding
| Quantity | Unit | Keys and fields |
|---|---|---|
| Price | Dollars per share, from 0 to 1. 0.62 is 62 cents, or a 62% implied probability. | price_floor, price_ceiling, price, spread, the book fields, strategy thresholds |
| Size | Shares: outcome tokens that pay $1 each if they win. Studio sometimes calls them contracts. | max_position, size, fade_size, position_size |
| Money | Dollars | max_notional, balance (your available collateral), unrealized_pnl, volume (the market's lifetime traded volume) |
| Time | Whole seconds; durations such as "90s", "5m", "6h", "1d" in conditions (whole numbers only: "1.5h" is rejected; write "90m") | loop.interval, cooldown, time_to_expiry |
max_position, loop.interval, max_entries_per_market and rules[].size are whole numbers. A fraction is dropped, so 10.9 acts as 10.
Price ticks and rounding
Every Polymarket market has a tick: 0.1, 0.01, 0.001 or 0.0001. Most use 0.01. Every order the Bot sends is a limit order, and before it goes out the live Bot:
- clamps a buy's price into the allowed band: from the larger of
price_floorand one tick, up to the smaller ofprice_ceilingand 1 minus one tick. A sell is only kept between one tick and 1 minus one tick; - rounds it onto the tick: buys round down, sells round up. Rounding never gives you a worse price, as long as
price_floorandprice_ceilingsit on the tick, but it can make a fill less likely. With a floor between ticks, such as 0.055 on a 0.01 tick, a buy at 0.055 rounds to 0.05, falls below the floor and goes out at 0.06 instead.
How a live order price is clamped and rounded
- Allowed band
- Buy
- Sell
The price bounds don't apply to sells, so an exit can always sell at the bid: with the best bid below price_floor, a sell goes out at that bid. A price_ceiling of 1 still stops a buy at 0.99 on a 1-cent tick.
Order size and the market minimum
Polymarket sets a minimum order size per market, usually 5 shares.
- Custom rules check it. A buy whose size ends up below the minimum after the
max_positionandmax_notionalclamps is skipped, and the Bot logs anentry_sizeblocked decision. - An omitted
sizeon a buy means 1 share. That is below the usual minimum, so the buy is always skipped. Setsizeto at least the market minimum. - Built-in strategies raise their orders to the minimum. A
panic_fadefade_size, anobservation_momentumorder or apre_announcement_driftentry below the minimum is sent at the minimum, andmean_reversionalways buys the minimum. An order is never raised pastmax_position: if the minimum doesn't fit, the entry is skipped with anentry_sizeblocked decision. See Built-in strategies on Polymarket. - Fractional sizes are possible. The
max_notionalclamp divides dollars by price, so the Bot can send an order for, say, 13.33 shares.
Risk keys on Polymarket
| Key | Strategies | Polymarket behavior |
|---|---|---|
max_position | All | Required. Measured as YES + NO shares in the current market. Enforcement differs by strategy; see risk.max_position. |
price_floor, price_ceiling | All | Clamp every live buy price. Sells aren't clamped. Also gate entries for most built-ins. |
max_entries_per_market | Custom only | Counts buy orders from the exchange, per market. Fails closed. |
max_notional | Custom only | Dollar budget per market. Spent money is never released. Resets on each new market in a series. |
max_loss, max_portfolio_positions | None | Rejected on Polymarket. |
risk.max_position
The most shares the Bot may hold in the current market, counting YES and NO together. It counts everything your wallet holds in that market, including shares you bought by hand. How it is enforced depends on the strategy:
| Strategy | How max_position applies |
|---|---|
custom | Each buy is cut to max_position minus position_size. A buy rule whose size is larger than max_position is rejected when you save. |
spread_capture | Stops placing new quotes once holdings reach max_position, and leaves its last quotes resting. Several bid levels together can rest more than max_position. |
mean_reversion | Order size is the market minimum. With max_position below it, entries are skipped. |
observation_momentum | Caps total holdings: each order is cut to what still fits, and none is sent once holdings reach it. |
pre_announcement_drift | Order size is max_position or 5, whichever is smaller, raised to the market minimum. With max_position below the minimum, it doesn't enter. |
panic_fade | Not a holdings cap. The Bot buys fade_size, raised to the market minimum when max_position allows. |
If the Bot cannot read your balance, position_size reads 0 and the custom clamp widens rather than blocks. max_notional and max_entries_per_market fail closed instead: if the Bot cannot read your trade history, it skips the buy.
risk.price_floor and risk.price_ceiling
price_ceiling is required and must be above 0 and at most 1. price_floor is optional (default 0) and must be below the ceiling. Both are dollars per share.
Live, they clamp every buy price, as described in Price ticks and rounding. With the floor at 0, the lowest live buy price is one tick. Sells aren't clamped, so a stop-loss below the floor still sells at the bid.
They also gate entries:
panic_fade,observation_momentumandpre_announcement_driftenter only when the YES price is strictly between the floor and the ceiling.panic_fadealso exits, at the bid, if the price drops below the floor.mean_reversionbuys YES only when the price is above the floor, and buys NO only when the price is below the ceiling.spread_capturehas no price gate. A floor above the market pushes its bid up, which can cross the book and trade at once unlesspost_onlyistrue.- Custom rules are not gated. A custom buy whose midpoint is above the ceiling is sent at the ceiling and may rest.
risk.max_entries_per_market
A hard cap on how many buy orders the Bot places in a market. Set it to 1 for a one-shot strategy. Custom strategies only.
Before each buy, the Bot counts entries already used from the exchange: distinct buy orders in this market's trade history, plus a held position if no buys are recorded yet, plus resting buy orders. If the count has reached the cap, the buy is skipped: Studio reports a max_entries_per_market guardrail and the decision log shows an entry_cap blocked decision. If the exchange history cannot be read, the buy is skipped too.
When this cap is set, it replaces the default guard that skips a custom buy while any order is resting in the market. At 1 the count is exact. Above 1 it is conservative and may stop entries earlier than you expect.
On series_slug and recurring the cap is per market: each new market of the series starts with its full allowance. See Rolling series: what carries over.
risk.max_notional
The total dollars the Bot may commit to buys in the current market. Custom strategies only.
- Spent is the price times size of every buy in this market's trade history, plus the unfilled part of resting buy orders. Fees are not included.
- Sells never free budget. Once spent, it is spent for that market.
- Each buy is cut to the remaining budget divided by the side's midpoint. If the budget is used up, the buy is blocked and Studio reports a
max_notionalguardrail. If the result is below the market minimum, the buy is skipped. If the history cannot be read, the buy is skipped. - On
series_slugandrecurring, the budget resets in every new market. It is not a lifetime spend limit. - When you save, a buy rule is rejected if
size×price_flooris already larger thanmax_notional.
For example, with max_notional: 10 and a midpoint of 0.50, the first buy is capped at 20 shares. After $4 is spent, the next buy is capped at 12 shares. At $10 spent, buys stop in that market.
Deployment risk limits
Regular Polymarket Bots don't read the deployment risk limits (max contracts per order, max open contracts, daily loss and the rest), so the deploy flow doesn't ask for them. The risk block in your strategy is what limits a Polymarket Bot, so set it as if it were the only limit.