Fathom Profile
POC, value area, VWAP and standard deviation of the session or of each bar.
What the indicator shows
- POC: the most traded price.
- Value area (VAH / VAL): the range around the POC holding
valueAreaPercent% of volume, 70% by default. - VWAP and standard deviation: the volume-weighted average price, and how spread out prices are around it.
How to use it
- Inside the value area, the market accepts price; outside it, the market rejects it or looks for a new balance.
- With
scope: session, follow the POC as it migrates: it shows which way the market is building value. - With
scope: bar, see where each bar traded.
How it is computed
scope: "session"measures the session’s profile, accumulated from the open up to this bar, to follow how the session’s values shift;scope: "bar"measures each bar’s alone, to see where each bar traded.- The POC is the highest-volume price. On a tie within a bar, the footprint rule applies: the lowest of the tied prices at or above the open, otherwise the highest of those below it. With
scope: "session", a price only replaces the POC when it strictly exceeds it. - The value area is built tick by tick from the POC: at each step, it extends to the busier neighboring price, above or below, downward on a tie (a price with no volume counts as 0), until it holds
valueAreaPercent% of the volume; it extends by at least one tick. - The standard deviation is the volume-weighted standard deviation of prices, with a Bessel correction on volume: √(Σ v·(p − VWAP)² / (V − 1)), where V is the profile’s total volume.
When it updates
- One final point per finished
timeframe-second bar, sent when it closes, whoseidis the start of the bar. - Reset at every session open, at 6:00 pm New York time (full session, not only the RTH session). The computation, and the replay over history, start from the start of the trading week (
origin: week); the week’s last bar gets its values on the first trade of the Sunday reopen.
- Identifier
session-profile- Objects received
values- Historical cost
- 1 compute unit per trade
Subscribe
The same params work in real time, on historical data and in exports. Parameters you omit take their default values.
{
"t": "subscribe",
"sub": "session-profile",
"instrument": "NQ.front",
"indicator": "session-profile",
"params": {
"scope": "session",
"timeframe": 300,
"valueAreaPercent": 70
},
"mode": "live",
"from": "live"
}Parameters
As soon as a parameter differs from its default, the subscription counts as a custom configuration. To change a parameter, open a new subscription.
| Parameter | Type | Default | Allowed values | Unit | Description |
|---|---|---|---|---|---|
scope | choice | session | session · bar | — | Which volume profile is measured: the session’s, accumulated from the open up to this bar (session), or this bar’s alone (bar). Each value is a separate stream: open two subscriptions to get both. |
timeframe | integer | 300 | 1 · 5 · 10 · 15 · 30 · 60 · 120 · 180 · 300 · 600 · 900 · 1800 · 3600 | — | Bar duration in seconds: from 1 second (1) to 1 hour (3600). |
valueAreaPercent | integer | 70 | 1 to 100 | % | Share of the volume contained in the value area. |
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.
values sent final
Values at the close of the bar.
id format: <barStartNs>. Each object is sent once, final (final: true).
| Field | Type | Unit | Present | Description |
|---|---|---|---|---|
poc | integer | ticks | always | POC of the profile (the session’s up to this bar, or this bar’s alone, per scope). |
sd | number | ticks | always | Volume-weighted standard deviation of prices, with a Bessel correction on volume (√(Σ v·(p − VWAP)² / (V − 1)), V = total volume), to draw bands around the VWAP (vwap ± n × sd). |
vah | integer | ticks | always | Value area high (VAH). |
val | integer | ticks | always | Value area low (VAL). |
vwap | number | ticks | always | VWAP of the profile (session or bar, per scope). |
Example messages
Messages as the WebSocket sends them to the subscription above, taken from a real NQ session. Historical data returns the same objects, with the same cursor, without the sub field.
{
"sub": "session-profile",
"cursor": "20720.0.0",
"t": "upsert",
"id": "1790207700000000000",
"final": true,
"ts": "1790208000058746563",
"data": {
"poc": 123076,
"vah": 123177,
"val": 122990,
"vwap": 123131.51652638057,
"sd": 63.49728844602092
}
}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/session-profile/params.json",
"type": "object",
"additionalProperties": false,
"properties": {
"scope": {
"description": "Which volume profile is measured: the session’s, accumulated from the open up to this bar (`session`), or this bar’s alone (`bar`). Each value is a separate stream: open two subscriptions to get both.",
"type": "string",
"default": "session",
"enum": [
"session",
"bar"
]
},
"timeframe": {
"description": "Bar duration in seconds: from 1 second (`1`) to 1 hour (`3600`).",
"type": "integer",
"default": 300,
"enum": [
1,
5,
10,
15,
30,
60,
120,
180,
300,
600,
900,
1800,
3600
]
},
"valueAreaPercent": {
"description": "Share of the volume contained in the value area.",
"type": "integer",
"default": 70,
"minimum": 1,
"maximum": 100
}
}
}data field schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://fathomcharts.com/schemas/session-profile/data.json",
"title": "values",
"type": "object",
"additionalProperties": false,
"properties": {
"poc": {
"description": "POC of the profile (the session’s up to this bar, or this bar’s alone, per `scope`).",
"type": "integer"
},
"sd": {
"description": "Volume-weighted standard deviation of prices, with a Bessel correction on volume (√(Σ v·(p − VWAP)² / (V − 1)), V = total volume), to draw bands around the VWAP (`vwap` ± n × `sd`).",
"type": "number"
},
"vah": {
"description": "Value area high (VAH).",
"type": "integer"
},
"val": {
"description": "Value area low (VAL).",
"type": "integer"
},
"vwap": {
"description": "VWAP of the profile (session or bar, per `scope`).",
"type": "number"
}
},
"required": [
"poc",
"vah",
"val",
"vwap",
"sd"
]
}