Order types explained
Every order type is a trade between two guarantees: certainty of execution and certainty of price. You can have one. Choosing an order type is choosing which one you are giving up.
That framing resolves most of the confusion, including the one that gets people hurt — a stop-limit order that does not execute.
The two base types
Market order — executes now, at whatever the book offers.
- Guarantees: execution.
- Does not guarantee: price. In a thin or fast book you walk levels, which is slippage.
- Always a taker, so the higher fee.
Limit order — executes only at your price or better.
- Guarantees: price (or better).
- Does not guarantee: execution. Price may never reach you, or may trade through without filling your whole size.
- A maker if it rests, a taker if priced to execute immediately — see maker vs taker fees.
Everything else is a conditional wrapper around one of these two.
The conditional types
Stop (stop-market) — when price touches the trigger, submit a market order.
- Guarantees: execution once triggered.
- Does not guarantee: price. Gaps fill at the first available price after the trigger, which can be far away.
Stop-limit — when price touches the trigger, submit a limit order at your specified limit price.
- Guarantees: price once triggered.
- Does not guarantee: execution.
This is the one that hurts. A stop-limit used as a protective stop can trigger in a fast move, place its limit order, and never fill — because price has already gone through the limit. You are left in a position you decided to exit, having watched the mechanism work exactly as specified.
For a protective stop, the guarantee you want is execution, not price. Use a stop-market and accept the slippage. The whole point of the stop is getting out.
Take-profit variants mirror these on the profitable side, where the trade-off is less severe — not filling a take-profit leaves you in a winning position rather than a losing one.
Trailing stop — a stop whose trigger follows price at a fixed distance or percentage. Locks in gains automatically at the cost of being taken out by ordinary retracements, and it lowers average win in R, which shows up in expectancy rather than in win rate.
The modifier flags
These change behaviour rather than type, and two of them are genuinely important.
Post-only — reject the order if it would execute immediately as a taker. Guarantees maker treatment, or nothing. Useful when the fee difference is the point; be aware the rejection is a real outcome you must handle.
Reduce-only — the order may only decrease an existing position, never open or flip one.
Reduce-only is the most underused flag in retail trading. It makes a closing order structurally incapable of opening a new position in the other direction. Combined with an approval step, it removes an entire class of catastrophic error — a size or side mistake on an exit that accidentally establishes a fresh position.
Time in force controls how long an unfilled order survives:
| Flag | Behaviour |
|---|---|
| GTC (good till cancelled) | Rests until filled or cancelled |
| IOC (immediate or cancel) | Fill what you can now, cancel the rest |
| FOK (fill or kill) | Fill entirely now, or cancel entirely |
| GTD / day | Expires at a set time or session end |
IOC and FOK are the ones that matter for automation, because they bound how long an order can sit in an unknown state. A GTC order submitted during a network problem may be resting somewhere you cannot see — which is why reconciliation matters more than retry logic.
Choosing, in one table
| You want | Use | You give up |
|---|---|---|
| In, now, at any price | Market | Price |
| In, at this price or not at all | Limit | Execution |
| Out, now, whatever it costs | Stop-market | Price |
| Out, but only at an acceptable price | Stop-limit | Execution — dangerous for stops |
| Maker fees or nothing | Limit + post-only | Immediate execution |
| Close without risk of flipping | Reduce-only | Nothing. Use it |
Two things that are not order types
A mental stop is not a stop. An intention to exit is not an instruction the exchange holds. It requires you to be present, attentive and disciplined at the worst moment, and it cannot be evaluated by code before an order goes out.
A “stop loss” set wider than your liquidation price is not a stop. The exchange closes you first, at a worse price, and your loss is the margin rather than the amount you sized for. See the leverage and stop-loss table.
For automated and AI-assisted setups
Two order-type details deserve attention when a model is drafting:
Order type is a parameter, and parameters get confused. A stop submitted as a limit looks entirely plausible in a tool-call log and reports success. It sits there not protecting you. This is high on the list in how LLM tool calls go wrong on orders.
Reduce-only should be the default on every closing order. It costs nothing and removes the worst version of a parameter error.
FAQ
What is the difference between a stop and a stop-limit?
A stop triggers a market order, guaranteeing execution but not price. A stop-limit triggers a limit order, guaranteeing price but not execution. For a protective stop you want execution — a stop-limit can trigger in a fast move and never fill, leaving you in a position you decided to exit.
Should I use limit or market orders?
Limit when the price matters more than the timing, and you can accept not being filled. Market when being in or out matters more than a few basis points — especially on exits. Limit orders also earn the lower maker fee, at the cost of adverse selection: you get filled when price comes to your level and keeps going.
What does reduce-only do?
It restricts an order to decreasing an existing position, so it cannot open a new one or flip your direction. On a closing order this is close to free insurance against a size or side error, and it is the flag most worth adopting as a default habit.
What is the difference between IOC and FOK?
IOC fills whatever is available immediately and cancels the remainder, so partial fills are expected. FOK fills the entire quantity immediately or cancels everything, so you either get all of it or none. Both bound how long an order can sit in an unknown state, which matters more in automation than it does by hand.