ZagTrader

How to Read a FIX Execution Report

The Execution Report (35=8) is the message a trading system reads most. It reports every change to an order: acknowledgement, fill, cancel, replace, reject, expiry and status. Reading it in a fixed order avoids most booking errors.

Read it in this order

  1. ExecType (150): what happened. A fill is F in FIX 4.4.
  2. OrdStatus (39): the state of the order now.
  3. ClOrdID (11), OrigClOrdID (41) and OrderID (37): which order and which request this report belongs to.
  4. ExecID (17): this report's own ID, used to detect duplicates.
  5. For fills: LastQty (32) and LastPx (31) for this fill; CumQty (14), LeavesQty (151) and AvgPx (6) for the order so far.
  6. For rejects: OrdRejReason (103) and Text (58).

A partial fill, field by field

A FIX 4.4 Execution Report for a partial fill of 400 out of 1,000.

8=FIX.4.4|9=211|35=8|49=SELLSIDE|56=BUYSIDE|34=21|52=20261020-09:30:04.118|37=OID-9001|11=ORD-2001|17=EXEC-9001-2|150=F|39=1|55=MSFT|54=1|38=1000|40=2|44=187.50|32=400|31=187.50|151=600|14=400|6=187.50|60=20261020-09:30:04.118|10=145|
TagFieldValue
8BeginStringFIX.4.4
9BodyLength211
35MsgType8
49SenderCompIDSELLSIDE
56TargetCompIDBUYSIDE
34MsgSeqNum21
52SendingTime20261020-09:30:04.118
37OrderIDOID-9001
11ClOrdIDORD-2001
17ExecIDEXEC-9001-2
150ExecTypeF
39OrdStatus1
55SymbolMSFT
54Side1
38OrderQty1000
40OrdType2
44Price187.50
32LastQty400
31LastPx187.50
151LeavesQty600
14CumQty400
6AvgPx187.50
60TransactTime20261020-09:30:04.118
10CheckSum145
Open this message in the parser

Booking fills safely

  • Book a fill only from a report with 150=F (FIX 4.4 and later) or 150=1 / 150=2 (FIX 4.2). Status reports (150=I) repeat the order state without a new fill.
  • Take the fill from LastQty (32) and LastPx (31), not from the change in CumQty.
  • Book each ExecID (17) once. Replayed reports (43=Y) and resent reports (97=Y) can bring the same fill twice.
  • A trade bust (150=H) or correction (150=G) points at the original fill through ExecRefID (19).
  • After each fill, check that your own total matches CumQty (14).

FIX 4.2 and FIX 4.4 side by side

EventFIX 4.2FIX 4.4
Partial fill20=0, 150=1, 39=1150=F, 39=1
Fill20=0, 150=2, 39=2150=F, 39=2
Replace confirmed20=0, 150=5, 39=5150=5, 39=0 or 1 (current state)
Trade bust20=1150=H
Trade correction20=2150=G
Status response20=3150=I

Questions

Which fields of an Execution Report are required?
In FIX 4.4: OrderID (37), ExecID (17), ExecType (150), OrdStatus (39), Side (54), LeavesQty (151), CumQty (14) and AvgPx (6), plus the instrument. FIX 4.2 also requires ExecTransType (20).
Why do I get an Execution Report with 39=1 but no fill?
It is probably a status report (150=I) or a pending or replace event on a partly filled order. Only 150=F (or 1 and 2 in FIX 4.2) carries a new fill.

Reference

Related errors

More guides