Order and cancel rejects
Unknown order: Order Cancel Reject with CxlRejReason 102=1
The receiver could not find the order your Order Cancel Request (35=F) or Cancel/Replace Request (35=G) refers to. It answers with an Order Cancel Reject (35=9) with 102=1.
What it means
A cancel or replace identifies the order through OrigClOrdID (41), and optionally OrderID (37). OrigClOrdID must be the ClOrdID (11) of the last accepted request in the order's chain, not always the ClOrdID of the first New Order Single.
CxlRejResponseTo (434) says whether the rejected request was a cancel (1) or a cancel/replace (2). When the order is unknown, the FIX standard asks for OrderID (37) to be set to NONE.
Common causes
- After a successful replace, the next cancel still uses the original ClOrdID instead of the ClOrdID of the replace.
- The order already ended (filled, expired at the end of the day, or canceled) and the venue no longer holds it.
- The order was never accepted: it is still pending or was rejected.
- The request was sent on a different session from the order.
- An ID typo, a case change or trailing spaces added by a system in the middle.
How to fix it
On the side that sent the cancel or replace
- Track the ClOrdID chain: when an Execution Report with 150=5 confirms a replace, the new ClOrdID becomes the one to cancel or replace next.
- Send OrderID (37) as well when you have it; some venues match on OrderID.
- If unsure of the order's state, send an Order Status Request (35=H) before retrying.
On the side that rejected it
- Echo ClOrdID (11) and OrigClOrdID (41), set OrderID (37) to NONE, and put a readable reason in Text (58).
Example
A cancel for an order ID the sell side does not hold.
1. Buy side: Order Cancel Request
8=FIX.4.4|9=133|35=F|49=BUYSIDE|56=SELLSIDE|34=170|52=20261020-11:00:00.000|41=ORD-0999|11=ORD-0999-C1|55=MSFT|54=1|38=1000|60=20261020-11:00:00.000|10=093|
2. Sell side: Order Cancel Reject with 102=1
8=FIX.4.4|9=130|35=9|49=SELLSIDE|56=BUYSIDE|34=1210|52=20261020-11:00:00.003|37=NONE|11=ORD-0999-C1|41=ORD-0999|39=8|434=1|102=1|58=Unknown order|10=067|
SOH (0x01) is shown as |. BodyLength (9) and CheckSum (10) are calculated as if every | were SOH.
Open this example in the parserQuestions
- Which ClOrdID goes in OrigClOrdID after several replaces?
- The ClOrdID of the most recent request that was accepted. Each accepted replace moves the chain forward; rejected requests do not.