Fathom Trades
Size leaves a trace. Isolate aggressive orders above your threshold and see exactly where they hit the market.
Merges consecutive same-side trades into a single aggressive order, as long as the price never moves back and no more than 5 ms separate two trades. The current group is published as provisional once it reaches the minimum volume, then as final when it closes: side change, price moving back, a gap over 5 ms, or a trade with no aggressor side. Thresholds and price mode are view parameters: every subscriber to an instrument shares the same computation.
- Identifier
big-trades- Objects received
group- Calculation
- Recent trades
- Historical cost
- 1 unit per trade
Subscribe
The same params work in real time, on historical data and in exports. Any you leave out take their default value.
{
"t": "subscribe",
"sub": "big-trades",
"instrument": "NQ.front",
"indicator": "big-trades",
"params": {
"minimum": 30,
"maximum": 0,
"priceMode": "last"
},
"mode": "live",
"from": "live"
}Parameters
As soon as a parameter differs from its default, the subscription counts as a custom configuration. A display parameter only filters the results sent: changing it is instant. A calculation parameter may require preparing a new calculation (status warming).
| Parameter | Type | Role | Default | Allowed values | Unit | Description |
|---|---|---|---|---|---|---|
minimum | integer | Display | 30 | 1 to 1,000,000 | contracts | Minimum group volume, in contracts. |
maximum | integer | Display | 0 | 0 to 1,000,000 | contracts | Maximum group volume, in contracts; 0 = unlimited, otherwise at least minimum. |
priceMode | choice | Display | last | last · start · average | — | Price reported in price: the group’s last price, first price, or rounded VWAP. |
Objects received
Each object keeps the same id from one update to the next. Its data is in the data field. Prices are in ticks: multiply them by the instrument’s tick size (GET /v1/instruments) to get points.
group updated continuously
Group of trades; provisional while it keeps growing.
Format of the id: <startNs>:<ordinal>. While it changes, the object is sent with final: false, and each new version fully replaces the previous one. Its last version carries final: true.
| Field | Type | Unit | Present | Description |
|---|---|---|---|---|
end | string | timestamp (ns) | always | ts_event of the last trade. |
first | integer | ticks | always | Price of the first trade. |
last | integer | ticks | always | Price of the last trade. |
price | integer | ticks | always | Price per priceMode: last price, first price, or VWAP rounded to the tick (ties to even). |
side | string · buy | sell | — | always | Aggressor side of the group. |
start | string | timestamp (ns) | always | ts_event of the first trade. |
trades | integer | trades | always | Number of trades in the group. |
volume | integer | contracts | always | Total group volume. |
vwap | number | ticks | always | Volume-weighted average price, in fractional ticks. |
Calculation warm-up
This indicator only depends on recent trades. If nobody is using your parameters yet, you briefly receive a status warming before the snapshot.
Historical data follows the same rules: a query over a past period returns exactly what the real-time stream published.
Example messages
Messages received with the subscription parameters above. Over WebSocket, each message also carries sub and cursor.
{
"t": "upsert",
"id": "1790208267461672923:0",
"final": false,
"ts": "1790208267461672923",
"data": {
"side": "sell",
"volume": 30,
"trades": 14,
"start": "1790208267461672923",
"end": "1790208267461672923",
"first": 122991,
"last": 122979,
"price": 122979,
"vwap": 122984.5
}
}{
"t": "upsert",
"id": "1790208267461672923:0",
"final": true,
"ts": "1790208267468979827",
"data": {
"side": "sell",
"volume": 40,
"trades": 21,
"start": "1790208267461672923",
"end": "1790208267461672923",
"first": 122991,
"last": 122976,
"price": 122976,
"vwap": 122982.775
}
}JSON schemas
To validate or type your data: the JSON schemas of the parameters and of data, also available from GET /v1/indicators. The SDK can generate types from them.
Parameters schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://fathomcharts.com/schemas/big-trades/params.json",
"type": "object",
"additionalProperties": false,
"properties": {
"minimum": {
"type": "integer",
"default": 30,
"minimum": 1,
"maximum": 1000000,
"description": "Minimum group volume, in contracts."
},
"maximum": {
"type": "integer",
"default": 0,
"minimum": 0,
"maximum": 1000000,
"description": "Maximum group volume, in contracts; 0 = unlimited, otherwise at least `minimum`."
},
"priceMode": {
"type": "string",
"default": "last",
"enum": [
"last",
"start",
"average"
],
"description": "Price reported in `price`: the group’s last price, first price, or rounded VWAP."
}
}
}Schema of the data field
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://fathomcharts.com/schemas/big-trades/data.json",
"title": "group",
"type": "object",
"additionalProperties": false,
"required": [
"side",
"volume",
"trades",
"start",
"end",
"first",
"last",
"price",
"vwap"
],
"properties": {
"end": {
"type": "string",
"pattern": "^[0-9]+$",
"description": "`ts_event` of the last trade."
},
"first": {
"type": "integer",
"description": "Price of the first trade."
},
"last": {
"type": "integer",
"description": "Price of the last trade."
},
"price": {
"type": "integer",
"description": "Price per `priceMode`: last price, first price, or VWAP rounded to the tick (ties to even)."
},
"side": {
"type": "string",
"enum": [
"buy",
"sell"
],
"description": "Aggressor side of the group."
},
"start": {
"type": "string",
"pattern": "^[0-9]+$",
"description": "`ts_event` of the first trade."
},
"trades": {
"type": "integer",
"description": "Number of trades in the group."
},
"volume": {
"type": "integer",
"description": "Total group volume."
},
"vwap": {
"type": "number",
"description": "Volume-weighted average price, in fractional ticks."
}
}
}