FIX Trading Activity: Volume, Traded Value, Venues and Order-to-Trade Ratio
Trading activity is what the order flow in a FIX log traded: filled quantity and traded value per symbol, with value calculated as LastQty (32) × LastPx (31) and kept separate for each Currency (15). The analyzer also breaks new orders down by side, order type and time in force, lists venues from ExDestination (100) and LastMkt (30), and calculates the order-to-trade and cancel-to-fill ratios.
Free and in your browser: the log is read and analysed on your computer, nothing is uploaded.
What the analyzer shows
- Symbol
- Symbol (55), or SecurityID (48) with SecurityIDSource (22) when the order has no Symbol. A fill without a symbol is credited to the symbol of its order, found through ClOrdID.
- Orders per symbol
- New orders (New Order Single (35=D) and New Order Multileg (35=AB)) for the symbol, plus orders inside a New Order List (35=E).
- Filled quantity
- The sum of LastQty (32) over fills: Execution Reports with ExecType 1, 2 or F and LastQty above zero.
- Buy and sell quantity
- Filled quantity split by Side (54) on the fill: 1 (Buy) and 3 (Buy minus) are buys, every other side is a sell.
- Traded value
- LastQty (32) × LastPx (31) for each fill, summed per Currency (15). Values in different currencies are never added together; fills without a Currency are kept apart as "no currency".
- Side, order type and time in force
- Counts of new orders by Side (54), OrdType (40) and TimeInForce (59). An order without TimeInForce is listed as not set; FIX treats it as a Day order.
- Venues
- Orders and fills by ExDestination (100), taken from the order, and fills by LastMkt (30), the market where the fill happened, as reported on the Execution Report.
- Order-to-trade ratio
- New orders (35=D, AB and list orders) plus replace requests (35=G, AC) plus cancel requests (35=F), divided by the number of fills.
- Cancel-to-fill ratio
- Cancel requests (Order Cancel Request (35=F)) divided by the number of fills.
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.
Filled quantity
2.13M
2,843 fills
Symbols traded
17
18 with orders
Order-to-trade
0.91
order messages per fill
Cancel-to-fill
0.13
cancels per fill
Venues
6
ExDestination and LastMkt
Top symbols
Filled quantity (LastQty 32) and traded value (LastQty x LastPx) per currency
| Symbol | Orders | Fills | Filled qty | Buy | Sell | Traded value |
|---|---|---|---|---|---|---|
| NVDA | 177 | 246 | 260.5K | 146.5K | 114K | 35.82M USD |
| AAPL | 147 | 218 | 216.1K | 108.2K | 107.9K | 49.41M USD |
| JPM | 155 | 211 | 207.9K | 116.6K | 91.3K | 44.76M USD |
| AMZN | 137 | 205 | 203.9K | 119.6K | 84.3K | 38.22M USD |
| KO | 125 | 170 | 183.4K | 78.4K | 105K | 12.98M (no currency) |
| XOM | 129 | 195 | 178K | 95.3K | 82.7K | 21.2M USD |
| MSFT | 134 | 170 | 151K | 77.4K | 73.6K | 65.36M USD |
| BAC | 118 | 148 | 145.8K | 77.1K | 68.7K | 6.06M (no currency) |
By currency
Currency (15) on the fills
| Currency | Fills | Quantity | Value |
|---|---|---|---|
| USD | 1,245 | 1.22M | 254.76M |
| no currency | 874 | 845.6K | 170.05M |
| EUR | 724 | 67.1K | 26.04M |
Side
Side (54) of new orders
- Buy1,037
- Sell922
- Sell short81
- Not set1
Order type and time in force
OrdType (40) and TimeInForce (59)
- Limit1,687
- Market354
- Day1,613
- Immediate or cancel198
- Not set (Day by default)150
- Good till cancel79
- At crossing1
ExDestination (100)
Orders sent to each destination
- XNAS397
- XNYS243
- XPAR203
- XETR203
- XAMS114
LastMkt (30)
Fills reported on each market
- XNAS754
- XNYS254
- ARCX237
In the demo day 2,843 fills traded a quantity of 2.13M across 17 symbols. Traded value is 254.76M USD, 170.05M (no currency) and 26.04M EUR. Each currency is kept apart, and the 874 fills with no Currency (15) are shown on their own rather than added to any currency.
The order-to-trade ratio is 0.91: 2,586 order messages (2,041 new orders, 185 replaces and 360 cancels) for 2,843 fills. The cancel-to-fill ratio is 0.13: 360 cancel requests for 2,843 fills.
APPL has 2 orders and no fills, the pattern a mistyped or unknown symbol leaves; the matching rejects are on the reject analysis page.
Orders went to 5 destinations by ExDestination (100) and fills were reported on 3 markets by LastMkt (30).
How to read it: what good and bad look like
- Never add traded value across currencies. The analyzer keeps each Currency (15) separate; fills with no currency are shown apart so you can decide what they are.
- Traded value is LastQty × LastPx as written. It does not apply contract multipliers for futures and options or price conventions such as bonds quoted in percent of par, so use it as a size indicator within one asset class.
- A symbol with orders and no fills is worth checking. A mistyped or unknown symbol shows up exactly this way, usually with a matching reject.
- An order-to-trade ratio near 1 means most order messages lead to a fill. A high ratio means many orders, replaces or cancels per fill, typical of passive or market-making strategies, and a figure venues watch.
- Venues often set a maximum ratio of orders to trades and act when a member exceeds it; in the EU, MiFID II requires trading venues to have such a limit. Each venue uses its own definition (which messages count, by number or by volume), so compare with the venue's formula, not only with this figure.
- A cancel-to-fill ratio that rises sharply in one part of the day shows orders being pulled faster than they trade, for example when prices move quickly.
- If ExDestination (100) and LastMkt (30) disagree, the order was routed on: sent to one destination and filled on another market. That is normal for smart order routing and brokers with several venues.
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.trading.symbols[]: symbol, orders, fills, filledQty, buyQty, sellQty, value per currencystats.trading.currencies[]: ccy, fills, qty, valuestats.trading.sides, .ordTypes, .timeInForce: counts of new ordersstats.trading.exDestinations[], .lastMarkets[]: venue, orders, fills, qtystats.orders.orderToTradeRatio: order messages per fillstats.orders.cancelToFillRatio: cancel requests per fill
Questions
- How is the order-to-trade ratio calculated from a FIX log?
- The analyzer adds the new orders (35=D, AB and orders in a New Order List), replace requests (35=G, AC) and cancel requests (35=F), and divides by the number of fills (Execution Reports with ExecType 1, 2 or F and LastQty above zero).
- Is this the same ratio a venue uses?
- Not necessarily. Venues define their own ratio: which messages count, whether it is by number or by volume, and over what period. Use this figure to watch your flow and the venue's formula to check compliance with its limit.
- How is traded value calculated?
- For every fill, LastQty (32) × LastPx (31), summed per Currency (15). Values in different currencies are kept apart, and fills without a Currency are shown as no currency rather than assumed to be in any one currency.
- What is the difference between ExDestination and LastMkt?
- ExDestination (100) is where the order was sent, set on the order. LastMkt (30) is the market where a fill took place, set by the executing party on the Execution Report. They differ when a broker or router fills the order on another market.
- Why do some fills have no symbol?
- Some counterparties leave Symbol (55) off Execution Reports. The analyzer then credits the fill to the symbol of its order, found through ClOrdID (11). If the order is not in the log, the fill counts in the totals but not under a symbol.
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.
- Execution analysis: Execution Reports by ExecType (150), partial and full fills, and the fill-size distribution from LastQty (32).
- 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