ZagTrader

Order and cancel rejects

Too late to cancel: Order Cancel Reject with CxlRejReason 102=0

The order reached a state where it can no longer be canceled or replaced, usually because it filled while the request was in flight. The receiver answers with an Order Cancel Reject (35=9) with 102=0.

What it means

A cancel is a request, not an instruction. Between the moment you send it and the moment the venue processes it, the order can trade. When it fills completely first, the cancel arrives too late.

The fill and the cancel reject can arrive in either order on your side. OrdStatus (39) in the Order Cancel Reject gives the order's state after the request, which tells you what happened.

Common causes

  • The order filled in the time the cancel took to arrive.
  • The order already expired or was canceled by the venue at the end of the session.
  • The market is in a phase that does not accept cancels or changes, such as the last minutes before an auction.

How to fix it

On the side that sent the cancel

  • Treat it as a normal outcome, not an error. Take the order's state from the Execution Reports, which are the record of what traded.
  • Do not retry the cancel in a loop; if OrdStatus (39) says 2 (Filled), there is nothing left to cancel.

On the side that rejected it

  • Set OrdStatus (39) to the order's real state, and send any fills before the cancel reject so the counterparty sees them first.

Example

A fill and a cancel cross on the wire. The fill arrives, then the cancel reject.

  1. 1. Buy side: Order Cancel Request

    8=FIX.4.4|9=132|35=F|49=BUYSIDE|56=SELLSIDE|34=180|52=20261020-11:05:00.000|41=ORD-1020|11=ORD-1020-C1|55=MSFT|54=1|38=500|60=20261020-11:05:00.000|10=011|
  2. 2. Sell side: Execution Report, filled

    8=FIX.4.4|9=170|35=8|49=SELLSIDE|56=BUYSIDE|34=1220|52=20261020-11:05:00.001|37=OID-779001|11=ORD-1020|17=EXEC-1220|150=F|39=2|55=MSFT|54=1|38=500|32=500|31=187.52|151=0|14=500|6=187.52|10=237|
  3. 3. Sell side: Order Cancel Reject with 102=0

    8=FIX.4.4|9=141|35=9|49=SELLSIDE|56=BUYSIDE|34=1221|52=20261020-11:05:00.002|37=OID-779001|11=ORD-1020-C1|41=ORD-1020|39=2|434=1|102=0|58=Too late to cancel|10=122|

SOH (0x01) is shown as |. BodyLength (9) and CheckSum (10) are calculated as if every | were SOH.

Open this example in the parser

Questions

The cancel was rejected but I got no fill. What now?
Check OrdStatus (39) in the reject. If it is Filled, the fill report is on its way or was missed; send an Order Status Request (35=H) or check for a sequence gap.

Reference

Related errors

All FIX errors · FIX guides