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
- ExecType (150): what happened. A fill is F in FIX 4.4.
- OrdStatus (39): the state of the order now.
- ClOrdID (11), OrigClOrdID (41) and OrderID (37): which order and which request this report belongs to.
- ExecID (17): this report's own ID, used to detect duplicates.
- For fills: LastQty (32) and LastPx (31) for this fill; CumQty (14), LeavesQty (151) and AvgPx (6) for the order so far.
- 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|
| Tag | Field | Value | Meaning |
|---|---|---|---|
| 8 | BeginString | FIX.4.4 | FIX 4.4 |
| 9 | BodyLength | 211 | |
| 35 | MsgType | 8 | Execution Report |
| 49 | SenderCompID | SELLSIDE | |
| 56 | TargetCompID | BUYSIDE | |
| 34 | MsgSeqNum | 21 | |
| 52 | SendingTime | 20261020-09:30:04.118 | |
| 37 | OrderID | OID-9001 | |
| 11 | ClOrdID | ORD-2001 | |
| 17 | ExecID | EXEC-9001-2 | |
| 150 | ExecType | F | Trade |
| 39 | OrdStatus | 1 | Partially filled |
| 55 | Symbol | MSFT | |
| 54 | Side | 1 | Buy |
| 38 | OrderQty | 1000 | |
| 40 | OrdType | 2 | Limit |
| 44 | Price | 187.50 | |
| 32 | LastQty | 400 | |
| 31 | LastPx | 187.50 | |
| 151 | LeavesQty | 600 | |
| 14 | CumQty | 400 | |
| 6 | AvgPx | 187.50 | |
| 60 | TransactTime | 20261020-09:30:04.118 | |
| 10 | CheckSum | 145 |
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
| Event | FIX 4.2 | FIX 4.4 |
|---|---|---|
| Partial fill | 20=0, 150=1, 39=1 | 150=F, 39=1 |
| Fill | 20=0, 150=2, 39=2 | 150=F, 39=2 |
| Replace confirmed | 20=0, 150=5, 39=5 | 150=5, 39=0 or 1 (current state) |
| Trade bust | 20=1 | 150=H |
| Trade correction | 20=2 | 150=G |
| Status response | 20=3 | 150=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.