All postsTP/SL

How to set take-profit and stop-loss on Polymarket

Polymarket has limit orders and FAK fills — that's it. Here's how to add the take-profit and stop-loss primitive every other market has had for decades.

UnusualBetsMay 15, 20268 min read

The order types Polymarket gives you

Polymarket runs a central limit order book (CLOB) on Polygon. The API surface exposes two order types: a limit order that sits on the book until filled or cancelled, and a fill-and-kill (FAK) order that either fills immediately at the price you specified or instantly returns whatever it couldn't fill. That's the whole toolkit. There is no native stop-loss, no take-profit, no trailing stop, no OCO ("one cancels other"), no time-in-force beyond GTC and FAK.

For prediction markets that resolve in five minutes or five months, this is a problem. The book trades 24/7. Headlines drop while you sleep. A YES share at $0.42 can settle at $0.00 if the event doesn't happen. Without a stop-loss you have to manually be there when the price moves against you — or eat the move.

What "TP/SL" actually means in this context

A take-profit is a conditional order: "if the market trades at or above $X, sell my position." A stop-loss is the mirror: "if the market trades at or below $Y, sell my position." Together they form a bracket: you arm the bracket when you open the position, and exactly one of the two legs eventually fires (or the bracket is cancelled because you closed manually, or the market resolved while the bracket was live).

The bracket gives you two things that Polymarket doesn't:

  1. A pre-committed exit at a price you chose ahead of time. No second-guessing in the moment, no anchoring to your entry, no "let me wait for it to come back to break-even" loop.
  2. A worker that actually watches the book. You don't have to be online. You don't have to refresh. You don't have to set a phone alarm for 4am.

Why the simple version doesn't work

The naive way to build TP/SL on Polymarket is: poll the REST /markets/<id> endpoint every 30 seconds, compare to the trigger, and place a market order when the price crosses. That's also the way you get destroyed by an intra-minute spike.

Polymarket's mid-price can move 200 bps inside a single block on a thin book. A REST-poll TP triggered at the top of the minute might be late by 20 seconds. By the time you submit, the bid has moved past your trigger and you sell at 2¢ worse than the price you saw — sometimes a lot worse. Multiply this across a few months of brackets and you've handed back most of the win.

The right version sits on the WebSocket book channel that Polymarket exposes. Every tick is pushed to you in real time. The instant a print clears your trigger, your worker submits the market order. Round-trip latency from print to filed order is under a second. That's the table stakes.

What can go wrong (and what UnusualBets does about it)

There are three failure modes specific to Polymarket TP/SL.

1. Thin liquidity at the trigger. If your stop is at $0.40 and the book above $0.40 is empty, your market order can fill 5¢ below. UnusualBets shows you the implied slippage at bracket creation, and we use a slippage floor on every fill so we don't sell into a vacuum. If the floor isn't met, we record no_liquidity_in_budget and try again on the next tick.

2. Eventually-consistent fills. Polymarket sometimes returns a "submitted" response to your order and then settles it on-chain several minutes later. The naive client gives up after the immediate response and declares the fill failed — even though it filled. We poll the order for 15 seconds after submission, then sweep your wallet's on-chain trade history for the matching SELL. We've seen settles arrive 4 minutes after acknowledgment. We catch them.

3. The market resolves before the worker can fill. Common on short markets ("Bitcoin Up or Down — 5-min window"). The price crosses your stop at 0:04:55, you submit at 0:04:55.2, the market resolves at 0:05:00, your order returns "market closed". Polymarket auto-redeems your CONDITIONAL shares to USDC at the resolution payout. UnusualBets explicitly detects this case and sends you a postmortem message: "We missed your stop-loss ($0.40) by 38¢. The price crossed your trigger but the market closed before our worker could fill." Not a great outcome, but at least you know exactly what happened.

How to set one

Open the dashboard at app.unusualbets.com, find a market you hold (or want to enter), and click Set TP/SL. Two things matter:

  • Your trigger prices. Drag the lines on the chart or type the numbers directly. We show the implied P&L at each trigger relative to your current entry.
  • Whether you want Telegram alerts. If yes, link your Telegram once and we'll DM you every time a leg fires — including filled size, average fill price, and a one-tap link back to the bracket detail.

That's the whole flow. Two minutes from "I have a Polymarket position" to "I can close the laptop." The next time the order book moves in your sleep, you'll either be richer or you'll be capped at the stop you chose. Either way, you knew the outcome before you walked away.


Stop watching the book.

Set a TP and SL on your next Polymarket position. The whole thing takes two minutes.