Imported from previous forum
Let’s say trader A of institution XYZ posts a resting Sell order for 1000 shares at $4.
Trader B of the same institution posts a resting Buy order for 500 shares at $3.90.
Trader B then sends an OrderCancelReplaceRequest message to the exchange changing the price to $4. These traders cannot trade with each other and the rule of the exchange is that the newest order be canceled.
Is it sufficient in this case to set the OrdStatus to 4 in the OrderCancelReject message or must/should an additional ExecutionReport be sent to trader B?
Hi Robert,
Based on example “D3 – Cancel request issued for a zero-filled order” from page 209 (211 of 283) of FIX.4.2 pdf spec Appendix D Order State Change Matrices, the following is my view.
In the above example, step 3 (shaded row) has a Cancel Request(Y,X). For this discussion, I am replacing it with a CancelReplace Request(Y,X) for non-quantity change.
In step 4 italicized, Cancel Reject(Y,X) is sent by Sell side with Order Status 39 = New 0.
If your eXchange sends an OrderCancelReject with OrderStatus 39 = Cancelled 4, it would be a violation of the spec as per the Matrix example above and also confuse the Buy side Trader B’s system because when Cancel / CancelReplace is rejected, it is expecting the OrderStatus of the original order would be New on the eXchange’s order book.
I would recommend you send a OrderCancelReject with OrderStatus = New immediately followed by an Unsolicited Cancel Execution Report.
This way the FIXProtocol’s Order state change matrix is not violated and the eXchange rule would also be honored.
Regards,
K. Mahesh
Let’s say trader A of institution XYZ posts a resting Sell order for 1000 shares at $4.
Trader B of the same institution posts a resting Buy order for 500 shares at $3.90.
Trader B then sends an OrderCancelReplaceRequest message to the exchange changing the price to $4. These traders cannot trade with each other and the rule of the exchange is that the newest order be canceled.
Is it sufficient in this case to set the OrdStatus to 4 in the OrderCancelReject message or must/should an additional ExecutionReport be sent to trader B?
Robert,
your description seems incomplete. You are implying that trader B’s request to change the price of his order to $4 is rejected. Wouldn’t it also make sense to accept that change first and then send an unsolicited cancel to trader B based on the fact that his order NOW violates the exchange rules? Otherwise the order entity does not carry the price causing the violation, only the last modification request message does.
The rejection of a request always implies that the order was left unchanged. This would not hold true in your case as the status changes from “New” to “Cancelled”. Furthermore, unsolicited cancellations (or modification) of orders should come with an ExecType of D=Restated. OrdStatus alone does not provide the full picture.
A Gap Analysis currently in review by the Global Technical Committee proposes the addition of an order event group to optionally allow to send multiple different event types within a single ExecutionReport. This would allow you to first respond to the request and then restate the order as cancelled all in one message. I guess this is the motivation for you to suggest the change of OrdStatus to “Cancelled” as part of the OrderCancelReject message. The reject event should stand on its own and always represent the fact that the overall state at the exchange is the same as if the request had never been sent.
Another example for the usage of this new order event group is the entry, (partial) fill and replenishment of a reserve order in a single matching transaction.
Regards,
Hanno.
Let’s say trader A of institution XYZ posts a resting Sell order for 1000 shares at $4.
Trader B of the same institution posts a resting Buy order for 500 shares at $3.90.
Trader B then sends an OrderCancelReplaceRequest message to the exchange changing the price to $4. These traders cannot trade with each other and the rule of the exchange is that the newest order be canceled.
Is it sufficient in this case to set the OrdStatus to 4 in the OrderCancelReject message or must/should an additional ExecutionReport be sent to trader B?