ZagTrader

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. 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. 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 parser

Questions

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.

Reference

Related errors

All FIX errors · FIX guides