Binance OCO, OTO and Trailing Stops: Building a Protective Exit

Most traders spend their attention on the entry and leave the exit to a single stop order that sits at a price the market has already left behind. Binance publishes four order lists that let an exit be built rather than guessed: OCO, OTO, OTOCO and OPO. This guide reads the rules off Binance's own Spot API documentation and the capability flags its public endpoint returns for a live pair.

CoinSoso EditorialPublished Article #00025Updated

Cover artwork: CoinSoso · AI-generated, not a photograph of a real venue, product or market capture.

Key takeaways

  • An OCO pair is two orders with one shared quantity; when one triggers the other is cancelled.
  • An OTO holds a second order off the book until the first one is fully filled.
  • OTOs that pay for themselves are order lists too: OTOCO adds an OCO pair behind the fill, and OPO sizes the second leg from the proceeds.
  • A trailing stop is a stop order whose trigger moves with the market, set in basis points rather than in price.
  • Every one of these lists consumes more than one slot of the pair's open-order allowance, and Binance documents the price rules that reject a badly laid out pair.

The exit is an order, not an intention

A stop order is a single instruction with a single failure mode: price reaches the stop, the stop becomes a market order, the market order fills at whatever the book offers. That is a reasonable tool, and it is the one most people use. It is also the reason so many exits are worse than the plan that produced them.

A market can move against a position in two very different ways, and the two need different answers. It can fall through a level that invalidates the reason for holding. Or it can rise to a level where the position should be taken. A single stop order handles the first and ignores the second. Two independent orders handle both, except that nothing stops both of them from being live at once, which is how a trader ends up selling twice.

Binance’s order lists exist to express the coordination explicitly. There are four of them in the Spot API, and they are documented in enough detail to reason about before you place one.

The layout of a sell-side OCO pair around the last traded price last traded price above order · LIMIT_MAKER or TAKE_PROFIT_LIMIT · price must sit above the last trade below order · STOP_LOSS or STOP_LOSS_LIMIT · stopPrice must sit below it one quantity, two orders: activation of either cancels the other
Figure 1The sell-side OCO layout as Binance documents it. The pair brackets the last traded price, and the ordering of the two legs is a rule rather than a preference: a pair whose legs sit on the wrong side of the market is rejected at placement.

The four order lists, and what each one is for

List Orders What it expresses Endpoint
OCO 2 Take profit and stop loss at the same time, one of which must cancel the other POST /api/v3/orderList/oco
OTO 2 A second order that only arms once the first is fully filled POST /api/v3/orderList/oto
OTOCO 3 A working order that arms an OCO pair when it fills POST /api/v3/orderList/otoco
OPO 2 An OTO whose second leg is sized from the proceeds of the first POST /api/v3/orderList/opo

Every one of these is gated per symbol. exchangeInfo returns ocoAllowed, otoAllowed and opoAllowed per pair, and on BTCUSDT all three read true on 2026-10-18. A pair that reports the flag as false will not accept the corresponding list, and the correct thing to do is check the flag rather than assume the feature is universal.

OCO: two orders, one quantity

An OCO pair is described by Binance as an above order and a below order sharing a single quantity parameter. The composition is not free-form:

  • one leg must be LIMIT_MAKER, TAKE_PROFIT or TAKE_PROFIT_LIMIT;
  • the other must be STOP_LOSS or STOP_LOSS_LIMIT;
  • and the two must sit on the correct sides of the last traded price.

For a sell-side OCO the documented rules are that a LIMIT_MAKER or TAKE_PROFIT_LIMIT leg has its price above the last trade, while the stop leg has its stopPrice below it. For a TAKE_PROFIT leg the comparison uses the stop price rather than a limit price. On a buy-side OCO the relationships invert: the take-profit style leg sits below the market and the stop leg above it.

The reason for the rule is mechanical. If the pair were allowed to be sent with the legs reversed, one trigger would already be satisfied when the request arrived, and the pair would either fill immediately at the wrong side or be rejected. Binance chooses rejection. That is why a badly laid out OCO looks like a formatting error but is actually a logic error: the intent itself was contradictory.

Also worth knowing before you size one: the two legs share a single quantity, so an OCO cannot express “sell half at the target and the other half at the stop”. It expresses one exit quantity with two possible triggers.

OTO: an order that waits for a fill

An OTO is a pair in which the first order is called the working order and the second the pending order. The working order must be a LIMIT or LIMIT_MAKER order. Only the working order goes on the book initially; the pending order is placed on the book only when the working order is fully filled.

Three consequences follow directly from that sentence.

  1. The pending order cannot protect a position that does not exist. If the working order is a buy and never fills, the pending order never arms. You cannot leak a stop loss into the book for a position you do not hold.
  2. Partial fills do not arm it. “Fully filled” is the documented condition, so an order that is 90% filled leaves the second leg off the book.
  3. Cancelling either leg cancels the other. Binance documents that if either the working or the pending order is cancelled individually, the other is cancelled or expired.

There is one timing wrinkle worth knowing because it breaks naive polling. If the working order is filled immediately at placement, the placement response shows the working order as FILLED while the pending order still appears as PENDING_NEW. The pending order’s real status has to be queried again. A bot that reads the first response and assumes the exit is live will be wrong about half a second after it is most needed.

OTOCO and OPO: the versions that actually do what people want

An OTOCO is an OTO whose pending side is an OCO pair. It is three orders: a working order, a pending above order and a pending below order. The working order behaves exactly as in an OTO, and the two pending orders follow the OCO rules, which means the whole structure reads as “buy here, and if that fills, take profit above or stop out below, whichever comes first”. Binance documents that an OTOCO adds three orders to the open-order filters.

An OPO is the interesting one. Binance describes it as a special behaviour of OTO and OTOCO in which the received amount from the working order becomes the quantity of the pending order. The only balance requirement at placement is the working order’s, and the proceeds are locked for use by the pending order rather than being available to trade or withdraw. Two details follow from the documentation:

  • the pending order’s quantity is evaluated against the symbol’s filters after the working order fills, and any locked quantity that the filters will not accept is unlocked and returned;
  • only working orders on the buy side with pending orders on the sell side are accepted.

That second restriction makes the OPO a round-trip tool rather than a general-purpose one. It is also the reason it is useful: the sell leg is sized from what was actually received, net of the commission deducted, rather than from a quantity you calculated in advance and hoped would fit the step size.

Order list states from placement to completion EXEC_STARTED EXECUTING
  <rect x="210" y="40" width="150" height="46" rx="4" fill="none" stroke="var(--bronze)" />
  <text x="285" y="60" text-anchor="middle" fill="var(--bronze)" font-size="10">working order fills</text>
  <text x="285" y="76" text-anchor="middle" fill="var(--fg-muted)" font-size="10">pending leg: PENDING_NEW</text>
  <line x1="360" y1="63" x2="430" y2="63" stroke="var(--border-strong)" />
  <path d="M424 59 L430 63 L424 67" fill="none" stroke="var(--border-strong)" />

  <rect x="430" y="40" width="130" height="46" rx="4" fill="none" stroke="var(--accent)" />
  <text x="495" y="68" text-anchor="middle" fill="var(--accent)">ALL_DONE</text>
  <text x="495" y="84" text-anchor="middle" fill="var(--fg-muted)" font-size="10">no longer active</text>

  <rect x="210" y="150" width="150" height="46" rx="4" fill="none" stroke="var(--fg-muted)" stroke-dasharray="5 4" />
  <text x="285" y="170" text-anchor="middle" fill="var(--fg-muted)" font-size="10">working order cancelled</text>
  <text x="285" y="186" text-anchor="middle" fill="var(--fg-muted)" font-size="10">pending leg cancelled too</text>
  <line x1="285" y1="150" x2="285" y2="92" stroke="var(--fg-muted)" stroke-dasharray="5 4" />
  <path d="M281 98 L285 92 L289 98" fill="none" stroke="var(--fg-muted)" />
</g>
Figure 2The two ways an OTO ends. Binance documents four list statuses — EXEC_STARTED, UPDATED, ALL_DONE and RESPONSE — and two list order statuses, EXECUTING and ALL_DONE. A cancelled working order terminates the whole list, which is the property that makes the structure safe and the one that surprises anyone who expected the pending leg to survive.

Trailing stops: the trigger that moves

A trailing stop is not a separate order type in the Spot API. It is a contingent order — STOP_LOSS, STOP_LOSS_LIMIT, TAKE_PROFIT or TAKE_PROFIT_LIMIT — that carries an extra trailingDelta parameter. Binance documents the parameter in BIPS, where 1 BIP is 0.01%, 10 is 0.1%, 100 is 1% and 1,000 is 10%.

The direction is the part worth memorising, because it is not symmetric:

  • a buy trailing order benefits from falling prices and triggers after a price increase of the delta, measured from the lowest trade since submission;
  • a sell trailing order benefits from rising prices and triggers after a price decrease of the delta, measured from the highest trade since submission.

So a sell STOP_LOSS with trailingDelta of 100 is a stop that trails the high by 1%. It ratchets up as the market rises and never moves down. That is what “trailing” means, and it is why the order cannot be used as a fixed floor: there is no floor, only a distance.

The stopPrice parameter is optional for a trailing order. If you provide it, the order waits for that level before it starts tracking; if you omit it, tracking begins from the next trade. The delta must fall inside the pair’s TRAILING_DELTA filter, which on BTCUSDT read minTrailingAboveDelta 10 and maxTrailingAboveDelta 2000 on 2026-10-18 — a range of 0.1% to 20%.

Trailing stops also compose with OCO. Binance documents that in an OCO the trailing condition may sit in the contingent leg, and that when the trailing condition triggers, the limit leg is cancelled. That is the clean way to run “take profit here, or trail out if it reverses”.

The limits nobody counts

Three caps decide whether a clever structure can be placed at all, and they are all visible in the same exchangeInfo response:

Filter Meaning Value on BTCUSDT, 2026-10-18
MAX_NUM_ORDERS open orders the account may hold on the pair 200
MAX_NUM_ORDER_LISTS open order lists on the pair 20
MAX_NUM_ORDER_AMENDS times a single order may be amended 10

The first one is where the leg counting matters. An OCO consumes two slots, an OTO two, and an OTOCO three — because the venue counts orders, not intentions. An account running a grid of OTOCO lists reaches the 200-order ceiling faster than its author counted, and the rejection that follows looks like a venue fault until the arithmetic is done.

The amendment cap is the second quiet limit. If you manage a resting order by repeatedly amending it rather than cancelling and replacing it, the order will eventually stop accepting changes. That is not a bug in the order list; it is a per-order counter, and it applies to the orders inside a list as well.

A checklist for placing one

  1. Confirm the pair allows the list. Read ocoAllowed, otoAllowed or opoAllowed from exchangeInfo for the exact symbol.
  2. Confirm the pair is trading and inside its filters. Tick size, step size and minimum notional all apply to every leg of a list, and they apply at placement. The filters article covers how to read them off the same endpoint.
  3. Lay the legs out on the correct side of the market. For a sell-side OCO, take profit above and stop below; for a buy-side OCO, the reverse.
  4. Decide whether the exit should exist before the position does. If it should not, use an OTO or OTOCO. If it should, use a plain OCO now.
  5. Count the slots. Every leg consumes an open-order slot on that pair.
  6. Read the status, not the placement response. PENDING_NEW on a leg that just filled its working order is expected; ALL_DONE is the state that means the list is finished.

Order lists change what a fee costs, too, because whether a leg rests or crosses decides maker or taker on each side. The maker and taker explainer covers that split, the trading fee calculator prices a round trip, and the time-in-force guide explains what happens to a leg that is not filled immediately. The Binance profile collects the venue-level facts, and the Binance vs OKX comparison covers how the two venues structure the same problem differently.

Risk note. The feature descriptions, price rules and status names in this article are taken from Binance’s Spot API documentation as read on 2026-10-18, and the numeric filter values are a snapshot of what exchangeInfo returned for BTCUSDT on the same day. Binance can change either without notice. An order list that is placed correctly can still lose money: a stop order guarantees a trigger, not a price, and in a thin market the fill can be far from the level that triggered it. Nothing here is investment advice.

Sources

How this was researched. Written from primary documentation and the exchange or protocol's own published material, with sources listed at the end of the article.

Primary sources for the factual claims on this page. A date appears only where a human has actually read the source; where it is missing, the check is still outstanding.

  1. Binance Spot API — New Order list - OCO(read 2026-10-18)
  2. Binance Spot API — New Order list - OTO / OTOCO / OPO(read 2026-10-18)
  3. Binance Spot API — Spot Trailing Stop order FAQ(read 2026-10-18)
  4. Binance Spot API — One Pays the Other (OPO)(read 2026-10-18)
  5. Binance Spot API — exchangeInfo (symbol capability flags and filters, BTCUSDT)(read 2026-10-18)

Frequently asked questions

Does an OCO order double my position if both legs fill?

No. An OCO is one quantity expressed as two orders, and when one leg triggers the other is cancelled immediately. Binance's documentation describes the pair as an above order and a below order on a shared quantity, which is why you send one quantity parameter rather than one per leg.

What happens to my bid if the OCO is on the buy side?

The price ordering reverses. On a sell OCO the take-profit style leg sits above the market and the stop leg below it; on a buy OCO the take-profit style leg sits below the market and the stop leg above it. Sending the pair with the legs swapped is rejected, because the trigger would already be met when the order arrives.

Can I set a trailing stop and a fixed stop at the same time?

You can hold both as separate orders, but they do not coordinate. If you want them to coordinate, put the trailing stop in the contingent leg of an OCO: Binance documents that when the trailing condition triggers, the limit leg of the pair is cancelled. Two independent stops can both fire and leave you with a position you did not intend.

Why does the API show PENDING_NEW for a leg I just placed?

PENDING_NEW is the documented state of an order that is waiting for the working order of its list to be fully filled. In an OTO or OTOCO the second leg is not on the book yet, so it cannot be NEW. Binance also warns that if the working order fills immediately, the placement response can still show the pending leg as PENDING_NEW and needs a fresh query.

Do these orders count against my open-order limit?

Yes, and they count per leg. Binance documents that an OCO adds two orders to the MAX_NUM_ORDERS filter, an OTO also two, and an OTOCO three. On BTCUSDT on 2026-10-18 that filter read 200, and the separate MAX_NUM_ORDER_LISTS filter read 20.

Where to go next

Independent research. Each card shows the platform’s invite code, and its Create Account button is a referral link that may earn us a commission at no extra cost to you. Whether an account can be opened is decided by the platform at sign-up.

Binance

One of the largest global exchanges by traded volume, with a very broad product range.

20% Trading Fee Rebate

Use invite code con888 when signing up to enjoy trading fee benefits.

Download Android App

Download from the exchange's official download service. Verify the source and follow the on-screen installation instructions.

Do not install an APK from an unknown source, or one that has been modified or cannot be checked.

Read review →

OKX

A large global exchange offering spot, derivatives and a self-custody wallet.

20% Trading Fee Rebate

Enter invite code con888 when signing up to check available trading fee benefits.

Download Android App

Download from the exchange's official download service. Verify the source and follow the on-screen installation instructions.

Do not install an APK from an unknown source, or one that has been modified or cannot be checked.

Read review →