Short answer: A reduce-only order is an order the exchange may use only to shrink an open position, never to increase it or flip it to the other side. On Binance USD-M futures a rejection appears as -2022 (ReduceOnly Order is rejected) or -4118 (ReduceOnly Order Failed), as documented on 5 November 2026. The usual causes are a position that has already closed, the wrong side, a size above the position once other open orders count, or Hedge Mode, so the fix is to read the position again rather than to retry.
The flag marks an order as an exit, which matters when the position changes while the order is working. Everything below comes from official pages read on 5 November 2026; the fix flow ran on synthetic positions.
This page explains mechanics and recommends no setting, size or exit, and its examples are hypothetical. Reduce-only flags sit on leveraged products, and leverage can lose the whole margin; see perpetual futures and funding and the liquidation price calculator. Rules depend on your jurisdiction and the platform's terms. Leverage is not available on platforms on the list of Turkey's Capital Markets Board, SPK (Communiqué III-35/B.2, Article 14), and this page is not aimed at Turkish residents. Article 99/A of Capital Markets Law No. 6362 treats activity by foreign crypto-asset platforms directed at Turkish residents as unauthorized.
What does reduce only mean?
It means the order can only bring a position closer to zero: if filling it would add to the position or carry it through zero, the venue refuses, trims or cancels it.
Hypothetical example. You are long 1.0 with a resting sell of 1.0 as an exit, and a stop closes the position first. Without the flag, the resting sell can later fill and open a short of 1.0. With it, the order cannot open anything.
| Venue | Field | Oversized or wrong-side order |
|---|---|---|
| Binance USD-M | reduceOnly on POST /fapi/v1/order and /fapi/v1/algoOrder | FAQ updated 7 April 2026: rejected if on the same side as the position, or opposite but too large and failing the margin check |
| Bybit | reduceOnly, closeOnTrigger | No position: rejected. Too large: "automatically reduced or cancelled", with cancel type CancelByReduceOnly |
| Coinbase Advanced Trade | No request field in the create-order schema | Its failure reasons still list REDUCE_ONLY_INCREASED_POSITION_SIZE; the page does not say how an order becomes reduce-only |
| Hyperliquid | r in the order action | Rejected: Reduce only order would increase position. |
| Kraken | reduce_only | EOrder:Reduce only:No position exists; EOrder:Reduce only:Position is closed means it would flip, so it partly fills and the rest is canceled |
| OKX | reduceOnly (margin, and futures or swaps in net mode) | Size above the position: "the entire order is rejected", with no automatic trim |
Since results differ, a bot cannot assume the working quantity equals what it sent; read the order back.
ReduceOnly order is rejected: error codes and messages
Binance documents about a dozen reduce-only codes, and they split into conflicts you can fix and restrictions you cannot.
| Code | Message | What it means |
|---|---|---|
-2022 | ReduceOnly Order is rejected. | Conflicts with existing open orders; Binance says cancel the existing order and resubmit |
-4118 | ReduceOnly Order Failed. Please check your existing position and open orders | With a same-side open order it would create an opposite position and lack margin; cancel the open order |
-4062 | Invalid or improper reduceOnly value. | The flag does not fit this request; the page says no more |
-2026 | This OrderType is not supported when reduceOnly. | That order type cannot carry the flag |
-5047 | The original order is not a reduce-only order. | reduceOnly=true sent when modifying a normal order |
-4087, -4189 | User can only place reduce only order; Restricted account permission: can only place reduceOnly order on the symbol. | Account limited to reducing |
-4105, -4106, -4107 | Symbol is under position risk control, only reduce-only order is allowed. (-4105; the others name buys or sells) | Symbol limited to reducing |
-4400, -4401 | Futures Trading Quantitative Rules violated, only reduceOnly order is allowed, please try again later. (-4400) | Binance's quantitative rules; -4401 covers large positions and says to reduce the position |
Elsewhere, Bybit returns 110023 (you can only reduce your position on this contract) and 110042 (the same before delivery). OKX returns 51169 (no position in this direction), 51170 (same direction as your position) and 51205 (Reduce Only is not available).
Binance's page explains -2022 and -4118 only in terms of open orders and maps no other cause to a code, and none of this could be provoked without a key: on 5 November 2026 a reduce-only request with a placeholder key got -2015 from the USD-M demo host and retCode 10003 from Bybit's testnet, before any order check. Spot codes are in Binance API error codes, and Bybit signing in the Bybit API Python guide.
Reduce only order failed on Binance: causes and fixes
Each of these four causes needs a fresh read of the position, not a resend.
- No position, or the wrong side. A stop, a liquidation or a person closed it first. Read the position; if it is flat, cancel the stale exits. Never flip the side to make the order pass.
- Size above what is left. OKX states the rule most clearly: the order plus reduce-only orders ahead of it in price-time priority cannot exceed the position. Size from the position minus the exits you are keeping.
- Canceled by a higher-priority order. Binance's FAQ gives the case: with a long of 100, a sell of 50 at 1,000 is canceled when a sell of 60 at 999 arrives, because the new order has the more aggressive price and exceeds the 50 the first order leaves. Treat a cancel you did not request as a reason to read again. The FAQ adds that market and stop-market reduce-only orders with a quantity at or above the position have the highest priority, and gives the message: Reduce-only order failed. Please cancel existing open orders for this symbol and try again. That describes the rule and is not advice on which to use.
- A leftover below the lot step. Round down to the step from
exchangeInfo. A residue smaller than the step cannot be sent as a normal order, so decide in advance who handles it. Size minimums differ:-4164's own message exempts reduce-only orders from the minimum notional.
A rejection means your picture of the account is out of date. Compare it with the venue using position reconciliation. Exits placed as linked pairs are covered in OCO orders.
Reduce only in one-way and hedge mode
The flag's role changes with position mode: in hedge mode the position side says which position an order acts on, and Binance refuses the flag altogether.
| Venue | One-way or net mode | Hedge mode | Close without a size |
|---|---|---|---|
| Binance USD-M | reduceOnly=true | reduceOnly "cannot be sent"; send positionSide LONG or SHORT | closePosition=true on stop-market or take-profit-market algo orders |
| Bybit | positionIdx=0 with reduceOnly=true | positionIdx 1 for the buy side, 2 for the sell side; the page asks for reduceOnly=true when closing | qty="0" with reduceOnly and closeOnTrigger, up to the maximum order size |
| OKX | posSide net with reduceOnly=true | Closing orders apply reduce-only whatever the flag says | closeFraction=1 on algo orders |
On Binance, a mode mismatch can also surface as -4061 (order's position side does not match user's setting). Two documents disagree here: the algo order page says closePosition cannot be used with reduceOnly, while the error list keeps -4138, Reduce only must be true with closePosition equals true. Follow the endpoint page and test it, which needs a key. On Bybit, an order with reduceOnly cannot carry take-profit or stop-loss fields, and one above the maximum order quantity is split into several orders.
User can only place reduce only order: when the venue limits you
This message means the exchange has limited the account or symbol to reducing, which no code change can fix.
Stop sending opening orders, alert the account's owner and read the venue's notice. A limit based on region or account standing is a matter for the platform's terms; do not try to route around it. Binance's Futures Trading Risk Control FAQ, updated 3 July 2026, describes one trigger based on position size and distance to liquidation, lifted within 10 minutes after a cut of at least 30% of the open notional value or with the liquidation price more than 40% from the mark price. Those conditions can change without notice, and the page names no error code. Check the symbol side at startup: USD-M exchangeInfo carries a POSITION_RISK_CONTROL filter, and on 5 November 2026 all 804 trading symbols in production showed positionControlSide NONE. The documents read do not define its other values, so log anything else and stop. Under load, Binance's general information page says close-position, reduce-only and cancel orders are exempt from -1008 throttling, with conditions such as positionSide BOTH for reduce-only.
A tested reduce-only fix flow in Python
Read the position, clear stale exits, size to the lot step and send, then read again at most once if the venue refuses; this runs on a synthetic venue with no network.
from decimal import Decimal as D, ROUND_DOWN
class Rejected(Exception):
pass
class Venue:
"""Synthetic. Binance's messages; which code goes with which cause is illustrative."""
def __init__(self, pos, exits=(), closes_before_send=False):
self.pos, self.exits = D(pos), [D(q) for q in exits]
self.closes_before_send, self.sent = closes_before_send, 0
def read(self):
return self.pos, list(self.exits)
def cancel_exits(self):
self.exits.clear()
def send(self, side, qty):
self.sent += 1
if self.closes_before_send: # a stop closed it after our read
self.pos, self.closes_before_send = D(0), False
if self.pos == 0 or (side == "SELL") == (self.pos < 0): # flat, or adds
raise Rejected("-2022 ReduceOnly Order is rejected.")
if qty + sum(self.exits) > abs(self.pos):
raise Rejected("-4118 ReduceOnly Order Failed.")
return "NEW"
def exit_order(venue, want, step, attempts=2):
"""Read, clear stale exits, size to the lot step, send. Never loop."""
want, step = D(str(want)), D(str(step)) # str(): D(0.3) is 0.2999...
if not (want.is_finite() and step.is_finite() and want > 0 and step > 0):
return "bad size or step: nothing sent, alert"
last = "nothing sent"
for _ in range(attempts):
pos, exits = venue.read()
if pos == 0:
venue.cancel_exits()
return "flat: stale exits canceled, nothing sent"
if exits:
venue.cancel_exits() # no exit rests until the send
units = (min(want, abs(pos)) / step).to_integral_value(ROUND_DOWN)
if units == 0:
return "below the lot step: nothing sent, alert"
side = "SELL" if pos > 0 else "BUY"
try:
return f"{venue.send(side, units * step)} {side} {units * step}"
except Rejected as err:
last = str(err) # state changed: read again once
return f"stopped after {attempts} attempts: {last}, alert"
try:
Venue("1.000", ["0.600"]).send("SELL", D("1.000"))
except Rejected as err:
print("no cancel first:", err)
for name, want, venue in [
("long 1.000, stale exit 0.600", "1.000", Venue("1.000", ["0.600"])),
("flat, stale exit 0.500", "1.000", Venue("0", ["0.500"])),
("long 0.0155, want 0.02", "0.02", Venue("0.0155")),
("short 0.300", "0.300", Venue("-0.300")),
("long 0.0004", "1.000", Venue("0.0004")),
("closes between read and send", "1.000", Venue("0.500", closes_before_send=True)),
]:
print(f"{name}: {exit_order(venue, want, '0.001')} [{venue.sent} sent]")Output on Python 3.11, run 5 November 2026:
no cancel first: -4118 ReduceOnly Order Failed.
long 1.000, stale exit 0.600: NEW SELL 1.000 [1 sent]
flat, stale exit 0.500: flat: stale exits canceled, nothing sent [0 sent]
long 0.0155, want 0.02: NEW SELL 0.015 [1 sent]
short 0.300: NEW BUY 0.300 [1 sent]
long 0.0004: below the lot step: nothing sent, alert [0 sent]
closes between read and send: flat: stale exits canceled, nothing sent [1 sent]In the last line the position closed after the read, and the second read ended the attempt instead of a loop. Between the cancel and the send, no exit rests on the book, so whether to cancel a protective stop is a rule for the owner to write. Retry loops around these rejections are one thing to look for in a trading bot code review; naming a venue here does not mean Fincode integrates it or has built on it.
Frequently asked questions
Why is my reduce only order rejected?
Usually the position has already closed, the order is on the same side as the position, or its size plus other exit orders exceeds the position. Read the position and open orders again before sending anything.
Can I use reduceOnly in Binance hedge mode?
No. Binance's order page says reduceOnly cannot be sent in Hedge Mode, as read on 5 November 2026. Send positionSide LONG or SHORT instead.
Does a reduce only order guarantee the position closes?
No. It limits what the order may do, not whether it fills. A limit exit can stay unfilled, and prices can move past any trigger.
How does reduce only work on Bybit?
Set reduceOnly to true on linear, inverse or option orders. Bybit's help article says an order larger than the position is automatically reduced or cancelled, and that an order with no open position is rejected.
Sources
- Binance USD-M Futures: Error codes (last modified 30 October 2026) (opens in a new tab)
- Binance USD-M Futures: Trade endpoints (New Order, New Algo Order) (opens in a new tab)
- Binance USD-M Futures: General info (-1008 exemptions, last modified 30 October 2026) (opens in a new tab)
- Binance: Summary of Failed Orders in Binance Futures (updated 7 April 2026) (opens in a new tab)
- Binance: Futures Trading Risk Control FAQ (updated 3 July 2026) (opens in a new tab)
- Bybit V5 API: Place Order (reduceOnly, closeOnTrigger, positionIdx) (opens in a new tab)
- Bybit V5 API: Error codes (110023, 110042) (opens in a new tab)
- Bybit Help Center: Reduce-Only Order (last updated 29 June 2026) (opens in a new tab)
- Bybit V5 API: Enums (cancelType) (opens in a new tab)
- Hyperliquid Docs: Error responses (opens in a new tab)
- Kraken Developers: Errors (EOrder:Reduce only variants) (opens in a new tab)
- OKX API v5: Place order (reduceOnly, long/short mode) (opens in a new tab)
- Coinbase Advanced Trade API: Create Order (opens in a new tab)
- Resmî Gazete: SPK Communiqué III-35/B.2, 13 March 2025, no. 32840, Article 14 (Turkish) (opens in a new tab)
- Capital Markets Law No. 6362, consolidated text, Article 99/A (Turkish) (opens in a new tab)
This guide is general information about software and markets, not investment, legal or tax advice. Automated trading can lose money, past or backtested performance does not guarantee future results, and the rules that apply depend on your jurisdiction and your exchange's terms. Sources, checks and corrections: see the editorial policy.