Why an order is rejected

An order came back rejected. You corrected the thing the reason named, sent it again, and it was rejected for something else. Then the third attempt went through unchanged from the second.

Nothing moved underneath you arbitrarily. Validation is a sequence of independent checks, the venue reports the first one that fails and stops, and several of the checks are evaluated against state that is moving while you read the message.

Rejection is a state before existence

Worth separating from its neighbours, because the three are often described with the same word.

A rejected order never entered the book and can never fill. A cancelled order was in the book and was withdrawn. An order that was sent and never acknowledged is in neither state — it is unresolved, and treating silence as rejection is how people end up holding two positions where they intended one.

Only the first of those is validation. The rest of this post is about what validation checks, and in what order.

The gates

Venues differ in the details, but the shape is consistent: cheap and static checks first, expensive and stateful checks last, so that most refusals cost the engine almost nothing.

Instrument state. Does this instrument accept this kind of instruction right now? An instrument halted or in an auction may accept limit orders and refuse market orders, or refuse everything. A pre-open window may accept only orders that will not execute. An instrument approaching removal may accept only orders that reduce a position. None of that is about your order; it is about the instrument, and it is the first gate because it disposes of everything at once.

Field legality. Price on a valid increment, quantity on a valid increment, quantity at or above the minimum, and the resulting notional at or above whatever floor the venue applies. These are the discreteness constraints and they are pure arithmetic on the order itself — no market state required, so they are checked early and refused flatly rather than rounded.

Price relative to a reference. A limit price that is legal in isolation can still sit outside the band the venue permits around a reference price. This gate uses moving state, which is what makes it the classic disappearing rejection: the same price is acceptable a minute later because the reference moved.

Flag consistency. Here the order is checked against itself and against the book. A post-only order that would cross on arrival is rejected, because it exists to be refused rather than to trade as a taker. A reduce-only order with nothing left to reduce is rejected for the same reason. A conditional order whose trigger level is already on the satisfied side of its reference may be rejected rather than fired instantly. Combinations of time-in-force and order type that a venue does not support are refused here too.

Account state. Whether the account can support the order at all: available balance or margin, and any cap on position size or on how many orders one account may rest in one instrument. This is last because it is the most expensive check and the most volatile — it depends on positions, unrealised results and the reference prices those are computed against.

Refusals that arrive later

Two things read as rejections and are not part of validation.

Self-trade prevention acts at matching time, not at submission. The order was accepted; the engine then declined to pair it with your own resting order and cancelled one side. The outcome resembles a rejection and the cause is entirely different.

A rejected amendment is worse than a rejected order, because on a venue where an amend is a cancel-replace, the original may already be gone. The rejection then reports a failure to create the replacement while quietly describing a state in which you hold nothing.

Why the reason is only the first reason

A validation chain that stops at the first failure reports one problem per attempt. If an order violates three constraints, the first attempt names one of them, the second attempt names the next, and the third succeeds. The reason string is a fact about the sequence, not a complete description of the order.

The corollary is that rejection reasons are not comparable across attempts. A different reason on the second try usually means progress, not a moving target.

The mechanism

THE MECHANISM — validation, gate by gate

  · You submit an order
                    → checked in a fixed sequence. Only
                      the FIRST failure is reported.

  · Instrument halted, in auction, or
    reduce-only
                    → refused regardless of the order's
                      contents.

  · Price or size off the increment
                    → refused, NOT rounded. Arithmetic
                      on the order alone.

  · Limit price outside the band around
    the reference
                    → refused. Moving state, so the same
                      price may pass moments later.

  · Post-only that would cross, or
    reduce-only with nothing to reduce
                    → refused by design. The flag exists
                      to produce this outcome.

  · Insufficient margin or a position cap
                    → refused last. The most expensive
                      check, and the most volatile.

  · A rejected AMENDMENT
                    → on a cancel-replace venue the
                      original is already gone.

  · Gate order, reason granularity, and
    which conditions reject at all
                    → VENUE-SPECIFIC. Some reject where
                      others silently accept.

Worked example

Illustrative figures throughout, synthetic and round, describing no real venue.

Suppose an instrument with a price increment of 0.5, a minimum quantity of 0.001, a minimum notional of 10, a price band of 2% around a reference of 40,000, and a best ask of 40,000.0 with a best bid of 39,999.5.

Attempt one. A post-only buy for 0.0005 units at 40,000.25. The price is not on a 0.5 increment, so the field-legality gate refuses it and nothing else is examined.

Attempt two. Same order at 40,000.0. Price is now legal, so the next gate runs: quantity 0.0005 is below the 0.001 minimum. Refused, new reason.

Attempt three. 0.001 at 40,000.0. Quantity is legal; notional is 40, above the floor of 10; the price is well inside a band running from 39,200 to 40,800. The flag gate now runs and the order is post-only at 40,000.0 against an ask of 40,000.0 — it would cross. Refused, third reason.

Attempt four. 0.001 at 39,999.5, still post-only. It joins the bid rather than crossing, and it is accepted.

Three rejections, three different reasons, one order that was wrong in three independent ways. Now suppose attempt three had instead been priced at 41,000: the band gate would have refused it before the flag gate ran, so the crossing problem would never have been mentioned — and after a move in the reference, the same 41,000 order would pass that gate and be refused for crossing instead.

The failure mode

Rejection is the least costly thing a venue can do to an order, because a rejected order has no position and no exposure attached to it. The failures worth attention are the ones where a refusal lands in the middle of something.

Three of those. A rejected amendment can leave you with neither the old order nor a new one, which is a worse state than having sent nothing. A rejected leg inside a linked group leaves the group incomplete while presenting as an intact bracket, so the missing leg is discovered when it is needed. And the account-state gate is evaluated last and depends on the same reference prices that move fastest, so it is most likely to bind precisely during the conditions in which an order is being sent urgently — the mechanism has no notion of urgency, and the check either passes or it does not.