Volume, time and resting liquidity at every price of a session, side by side, with three points of control and each row classified.
What the chart shows
A shows where size traded. A TPO profile shows where price spent time. Neither shows where orders were waiting. The composite profile draws all three for each on the same price : , time at price, and the average size resting in the book. It then names each row by how the three readings combine.
Each profile alone misses something; together they explain the session.
Menu
Chart type → → Composite profile
Engine type
composite-profile
Combines
bars (volume, time) + bid / ask per price (optional) + recorded order book (optional)
Works without depth
Yes: volume and time lanes and their classes; the book lane is hatched
One session: three lanes, three POCs, the value-area bracket and the four row classes.
Part
What it is
How to read it
VOL lane
Volume traded at each price.
Long are prices where business was done.
TIME lane
TPO periods that traded at each price.
Long are prices the market kept returning to.
BOOK lane
Mean resting size (bid + ask) over the 's snapshots.
Long are prices where liquidity sat.
VPOC / TPOC / LPOC
with the most volume, time and liquidity.
When they coincide, is ; when they split, the market is unbalanced.
-area bracket
holding 70 % of volume, grown from the VPOC.
The 's accepted range.
Class tints
named by their three readings (see below).
Read structure at a glance; the edge marker stays even with tint off.
Volume, value area and book snapshot count.
"bar spread" means volume came from bar ranges, not real bid / ask.
How a session is built, step by step
1
Split into sessions
Bars are grouped by length starting at starts at.
2
Choose rows
The 's range is divided into about per , rounded to a nice price step.
3
Volume lane
Supplied bid / ask volume per price is summed into the ; without it each bar's volume is spread over its range.
4
Time lane
Bars are grouped into TPO periods; each adds one to every row between its high and low.
5
Book lane
Up to about 600 snapshots recorded during the are averaged per row (bid + ask).
6
Points of control and value area
The row with the most of each reading is its POC. The value area grows from the VPOC two at a time until it holds the set share of volume.
7
Classify rows
Each row's three readings, as shares of their lane maximum, decide its class ( below).
The classification rules, checked top to bottom.
Reading the chart, step by step
1
Find value
Green accepted around the VPOC and TPOC are where both agreed on price. Expect two-way trade when price returns there.
2
Find walls
Blue (heavy book, little traded) are liquidity the never tested. They tend to stop the first approach next session.
3
Find the gaps
Red run-through traded heavily through a thin book; price moved fast there and can move fast again.
4
Find rejection
Orange printed volume in very little time: an excursion the market , often at the extremes.
5
Compare the POCs
VPOC and LPOC far apart means size traded away from where liquidity rested; the market was moving to find the other side.
Setting it up, step by step
1
Select the chart type
Chart type menu → → Composite profile, then open the gear.
2
Set the session
Use the exchange (for example 6.25 h from 9.25 for NSE) or the Daily / 4-hour presets.
3
Match the TPO period
30 min for daily sessions, 5–15 min for short sessions, so each has enough periods.
4
Keep it open for depth
The book lane only while the chart records the order book; the open gains its BOOK lane as you watch.
Common setups
Index futures
Daily sessions, 30-min TPO, 48 , tint across the . today's walls with yesterday's value area.
Crypto 24/7
4-hour sessions, 15-min TPO, structure-only preset to see the of each block.
History review
No depth needed: volume and time lanes show accepted and excursions over months of daily bars.
Limitations
ℹ
Note:The book lane is an average of recorded snapshots. A wall that sat for five minutes of a six-hour shows ; switch to shorter sessions to see short-lived liquidity.
Sessions before depth was recorded have a hatched book lane and no wall or run-through classes.
Without supplied bid / ask volume, volume at price is spread evenly over each bar's range.
Row size changes with each 's range; classes, not row counts, across sessions.
Native Quatick implementation and live demos
The charts below are the real Quatick engine (@quatick/quatick-charts), the same code the trading terminal runs, fed by a deterministic simulated market. Switch between demos, press Run market to stream ticks, order-book snapshots and , to pan and use the wheel to zoom. Show code exactly the calls each makes.
Live demo
One-hour sessions on 15-second bars. The last half hour has recorded depth, so its BOOK lane and LPOC appear, and walls (heavy book, little traded) are marked blue.
Loading the Quatick chart engine…
composite-profile · 0 bars · last — · 0 trades · drag to pan, wheel to zoom
How the engine draws Composite profile
Inputs, computation, renderer and overlay layers of the Composite profile chart type in the native engine.
Stage
What happens
in
bars
Bid / ask per price (optional)
setOrderbookSnapshot(book) (optional)
Split into sessions
Volume, TPO and mean resting size per row
VPOC, TPOC, LPOC and value area
Step 4
Classify
Canvas 2D
Layers
Class tints and markers · Three POC lines · Stats and legend
updates
Closed sessions cached; the open at most twice a second
How data reaches the screen
The calls your code makes, what the engine stores, and when it draws. Redraws are coalesced into one animation frame.
Minimal implementation
The first above, as standalone code:
typescript
import{ Chart }from'@quatick/quatick-charts';const chart =new Chart({
container: document.getElementById('chart')!,
chartType:'composite-profile',
theme:'dark',
renderer:'canvas',
showVolume:false,});const series = chart.addSeries({type:'candlestick'});
chart.setData(series.id, bars);// [{ time, open, high, low, close, volume }] — time in seconds
chart.setChartTypeOptions('composite-profile',{
sessionHours:1,
periodMinutes:5,
rowsPerSession:40});// Real bid / ask volume per price, keyed by bar time
chart.setFootprintData({[bar.time]:[{ price, bid, ask },...]});// Live: every tick updates the forming bar (a new time opens a new bar)
feed.onTick(bar => chart.update(series.id, bar));
feed.onLevels((time, levels)=> chart.updateFootprintBar(time, levels));// Depth and trades
feed.onBook(book => chart.setOrderbookSnapshot(book,{ time: chartSeconds }));// { bids: [[price, size]], asks: [[price, size]] }
feed.onTrades(trades => chart.addTrades(trades));// [{ time, price, size, side: 'buy' | 'sell' }]