FIX version mismatches
OrdStatus 39=5 (Replaced) is not valid in FIX 4.4
In FIX 4.2 a replace confirmation carried 39=5 and 150=5. FIX 4.4 dropped Replaced from OrdStatus: ExecType 150=5 says the replace happened and OrdStatus gives the order's current state. A FIX 4.4 receiver that validates values rejects 39=5 with 373=5.
What it means
From FIX 4.3 on, ExecType describes the event and OrdStatus describes the order. A replace is an event, so it lives in ExecType (150); after it, the order is New, Partially filled or Filled, and that goes in OrdStatus (39).
FIX 4.4 made the same split for fills: 150=1 and 150=2 are gone and every fill is 150=F (Trade), with 39=1 or 39=2 showing whether the order is partly or fully filled.
FIX 4.3 removed ExecTransType (20). Its job moved into ExecType: 150=H (Trade Cancel), 150=G (Trade Correct) and 150=I (Order Status).
Common causes
- A sell-side engine that started on FIX 4.2 and was moved to FIX 4.4 without changing its execution codes.
- One enum table shared between sessions of different versions.
- A test harness or simulator that only speaks FIX 4.2 semantics.
How to fix it
On the sell side (sending Execution Reports)
- On FIX 4.4 sessions send 150=5 with 39 set to the order's state after the replace.
- Send fills as 150=F, and trade busts and corrections as 150=H and 150=G, without tag 20.
On the buy side (receiving them)
- Read the event from 150 and the order state from 39, and never infer one from the other.
- If you must accept FIX 4.2-style reports from one counterparty, map them in a session-specific adapter rather than loosening validation for everyone.
Example
The same replace confirmation in FIX 4.2 and in FIX 4.4.
1. FIX 4.2: 20=0, 150=5, 39=5
8=FIX.4.2|9=178|35=8|49=SELLSIDE|56=BUYSIDE|34=1400|52=20261020-11:20:00.000|37=OID-779100|11=ORD-1040-R1|41=ORD-1040|17=EXEC-1400|20=0|150=5|39=5|55=MSFT|54=1|38=800|44=187.40|151=800|14=0|6=0|10=167|
2. FIX 4.4: 150=5, 39=0
8=FIX.4.4|9=173|35=8|49=SELLSIDE|56=BUYSIDE|34=1400|52=20261020-11:20:00.000|37=OID-779100|11=ORD-1040-R1|41=ORD-1040|17=EXEC-1400|150=5|39=0|55=MSFT|54=1|38=800|44=187.40|151=800|14=0|6=0|10=207|
SOH (0x01) is shown as |. BodyLength (9) and CheckSum (10) are calculated as if every | were SOH.
Open this example in the parserQuestions
- What OrdStatus do I send after a replace in FIX 4.4?
- The order's state after the replace: 0 if nothing has filled, 1 if partly filled, 2 if the new quantity is already fully filled.
- Is 150=F valid in FIX 4.2?
- No. Trade (F) was added to ExecType in FIX 4.3. A FIX 4.2 session reports fills with 150=1 or 150=2.