FIX Execution Report Analysis: ExecType, OrdStatus, Fills and Fill Sizes
Execution analysis counts the Execution Report (35=8) messages in a log by ExecType (150), separates partial fills from full fills using OrdStatus (39), and shows how large the fills are from LastQty (32). It answers how many fills there were, how big they were and which order events the counterparty reported.
Free and in your browser: the log is read and analysed on your computer, nothing is uploaded.
What the analyzer shows
- Execution Reports
- Every Execution Report (35=8) in the log.
- By ExecType
- A count for each ExecType (150) value: 0 New, A Pending New, F Trade, 1 Partial fill and 2 Fill (FIX 4.2 and earlier), 4 Canceled, 5 Replaced, 6 Pending Cancel, E Pending Replace, C Expired, 3 Done for day, 8 Rejected, D Restated, G Trade Correct, H Trade Cancel and others.
- Fills
- Execution Reports with ExecType 1, 2 or F and LastQty (32) above zero.
- Full and partial fills
- A fill is full when the same report carries 39=2 (Filled); any other OrdStatus makes it a partial fill.
- Filled quantity
- The sum of LastQty (32) over all fills.
- Average fill size
- Filled quantity divided by the number of fills.
- Fill-size distribution
- LastQty of every fill on a log scale, with bucket edges at 1, 2.5, 5, 10, 25, 50, 100 and so on, trimmed to the range that has fills.
- Rejected Execution Reports
- Reports with 150=8 or 39=8. They are counted with the rejects and their OrdRejReason (103) is ranked on the reject analysis page.
Example from the demo log
These figures are calculated from the demo trading day that the analyzer loads with See it on the demo log, so they match what you see there. In the analyzer every bar and row opens the FIX messages behind it.
Execution Reports
5,889
35=8
Fills
2,843
1,428 partial
Full fills
1,415
39=2 on the fill
Filled quantity
2.13M
sum of LastQty (32)
Average fill
749.2
LastQty per fill
Rejected reports
14
150=8 or 39=8
Execution Reports by ExecType
ExecType (150) of every Execution Report
- 150=0 New2,023
- 150=F Trade (partial or full fill)1,969
- 150=4 Canceled483
- 150=2 Fill (FIX 4.2)458
- 150=1 Partial fill (FIX 4.2)416
- 150=A Pending new190
- 150=5 Replaced185
- 150=6 Pending cancel68
- 150=C Expired62
- 150=E Pending replace21
- 150=8 Rejected14
Fill sizes
LastQty (32) of every fill, log scale
- 10 to 25240
- 25 to 5094
- 50 to 100147
- 100 to 250873
- 250 to 500329
- 500 to 1K448
- 1K to 2.5K486
- 2.5K to 5K192
- 5K to 10K34
The demo day has 5,889 Execution Reports for 2,041 orders. The most common ExecType values are 150=0 New with 2,023, 150=F Trade (partial or full fill) with 1,969 and 150=4 Canceled with 483.
Both fill styles appear: ExecType F (Trade) on 1,969 reports, and the FIX 4.2 style, ExecType 2 (Fill) on 458 and 1 (Partial fill) on 416, because the demo has a FIX 4.2 session next to FIX 4.4 and FIXT.1.1 sessions.
Of the 2,843 fills, 1,428 are partial and 1,415 complete their order, for a filled quantity of 2.13M. The largest fill-size bucket is 100 to 250 with 873 fills, while the average fill is 749.2: the larger fills pull the average up, so the distribution describes the typical fill better than the average does.
How to read it: what good and bad look like
- Expect one ExecType 0 (New) or A (Pending New) per order, then fills, cancels or replaces. Far more New reports than orders means orders are being restated or re-acknowledged; far fewer means acknowledgements are missing.
- FIX 4.2 and earlier report fills with ExecType 1 (Partial fill) and 2 (Fill). FIX 4.3 and later use F (Trade) and leave partial or full to OrdStatus (39). A log that mixes sessions of different versions shows both.
- Pending states (A, 6 and E) are optional. Some counterparties send them for every request and some never do, so their counts say more about the counterparty than about the orders.
- ExecType G (Trade Correct) and H (Trade Cancel) change fills after the fact. The analyzer counts them under their ExecType but does not subtract them from the fill totals, so reconcile those orders by hand.
- A fill-size distribution with most fills at the smallest sizes means orders are being worked in small pieces: algorithmic slicing, thin books or many small counterparties. One spike at a round size usually means one order size dominates the flow.
- An average fill size far above the typical bucket is pulled up by a few large fills. Use the distribution, not the average, to describe what normal looks like.
- Quantities are as written in LastQty. Contracts, shares and nominal amounts are not converted, so compare fill sizes within one asset class.
Common causes and fixes
When a figure on this page looks wrong, these pages explain the errors most often behind it and how to fix them.
For engines: POST a log to the API
The same statistics are available over HTTP for scripts, monitoring jobs and engines. POST a log as text, gzip or a multipart file and get JSON, an HTML report or a plain-text summary back. The request is processed in memory and not stored.
curl --data-binary @fix.log -H "Content-Type: text/plain" "https://fixparser.zagtrader.com/api/v1/analyze"
Fields in the JSON response for this page:
stats.orders.executionReports: Execution Reports in the logstats.orders.execTypes[]: key, label and count per ExecTypestats.orders.fills, .partialFills, .fullFills: fill countsstats.orders.fillQty: sum of LastQtystats.orders.avgFillSize: average LastQtystats.orders.fillSizes[]: lo, hi, label and count per size bucket
Questions
- What is the difference between ExecType and OrdStatus?
- ExecType (150) says what this Execution Report is about: a new order, a fill, a cancel, a replace. OrdStatus (39) says the state of the order after it. A fill (ExecType F) can leave the order Partially filled (39=1) or Filled (39=2).
- How does the analyzer tell a partial fill from a full fill?
- Every Execution Report with ExecType 1, 2 or F and LastQty (32) above zero is a fill. If that report carries OrdStatus (39) 2 it is a full fill, otherwise a partial fill.
- Why are there ExecType 1 and 2 as well as F?
- ExecType 1 (Partial fill) and 2 (Fill) belong to FIX 4.2 and earlier. From FIX 4.3 the fill is ExecType F (Trade) and the order state is read from OrdStatus. Logs that mix versions show both.
- Are trade corrections and trade cancels taken off the fill totals?
- No. ExecType G (Trade Correct) and H (Trade Cancel) are counted under their ExecType, but the fill count and filled quantity are not adjusted. If they appear, check those orders in the timeline.
- Tag 32 is called LastShares in my FIX version. Is it the same?
- Yes. Tag 32 was named LastShares up to FIX 4.2 and LastQty from FIX 4.3; the meaning, the quantity of this fill, is the same.
Reference
More of what the analyzer measures
- Message rate: Messages per second, peak second and busiest minute, mix by MsgType and category, inbound and outbound.
- Order outcomes: How every order ended: filled, partly filled, cancelled, expired, rejected or open, with fill, reject and cancel rates.
- Trading activity: Volume and traded value per symbol and currency, side, order type, time in force, venues, order-to-trade and cancel-to-fill.
- Order latency: New order to ack, first fill, cancel and replace times, and Test Request to Heartbeat: p50, p90, p99 and max.
- Reject analysis: SessionRejectReason, OrdRejReason, CxlRejReason and BusinessRejectReason ranked, Text (58) grouped, CheckSum and BodyLength errors.
- Session health: Per session: heartbeats, test requests, sequence gaps, resends and gap fills, resets, logons, logouts and the longest silence.
- FIX Log Analyzer: every statistic, how privacy works and how to start