Footprint
Accumulated per-candle traded volume for the active symbol, split by aggressor side. Unlike trades (this tick only), this is the running history - the data source for building a volume profile in code.
footprint.buckets
Raw per-candle, per-price buy/sell volume, nested by candle timestamp then price.
- Keys are candle start timestamps in ms, at the 5s base bucket (aggregate up yourself for wider intervals). On tick intervals (e.g.
133t) buckets are already per display candle, keyed by the chart's candle timestamps. - Prices are real prices (e.g.
5000.25), like everywhere else in the API - never scale them. buys/sellsare accumulated executed volume at that price within the candle.
footprint.buckets // { [candleTimestampMs]: { [price]: { buys, sells } } }
interface FootprintLevel { buys: number; sells: number }footprint.candles
Per display-candle { delta, volume }, keyed by the chart's rendered candle timestamps. Prefer it over aggregating buckets yourself when you need per-candle stats aligned with the chart.
delta- buy volume minus sell volume for the candle;volume- total traded volume.- Works for both time intervals (30s, 1m, ...) and tick intervals (133t, ...). Tick-interval candle timestamps are anchored to the replay start and are not multiples of the interval, so flooring bucket keys with
footprint.intervalbreaks there - this map is already grouped correctly. - Feed the keys straight into
panel.cells()/chart.mark()times to align with candle columns. The seeded "Delta Cells" indicator is the reference user.
footprint.candles // { [candleTimestampMs]: { delta, volume } }
interface CandleStats { delta: number; volume: number }footprint.interval
The display interval in ms. Use it to floor buckets keys to display-candle boundaries when aggregating.
When the indicator is enabled on a chart, this is that chart's live interval, so grouping by footprint.interval matches the rendered candles. In the code panel there is no chart binding, so it falls back to the 30s base - define your own candle size explicitly if you need panel runs to match a specific interval.
footprint.increment
The instrument tick size as a real price step (e.g. 0.25 for ES) - one footprint row is one increment tall. Use it to size drawings to a row, e.g. a chart.box spanning price ± increment / 2.
footprint.largeTrades
Reconstructed large trades - venue child fills merged back into their original order quantity - grouped per display candle.
- Keys are candle start timestamps in ms at
footprint.intervalbuckets. - Merges historical data with the live tape, already filtered at the instrument's minimum large-trade size.
sideis"buy"/"sell"/"none"(unknown aggressor).- The seeded Big Trades indicator (Chart Settings → Indicators) draws these as size-scaled
chart.mark()circles - edit it to change the size filter, scaling, or colors.
footprint.largeTrades // { [candleTimestampMs]: LargeTrade[] }
interface LargeTrade { price: number; size: number; side: "buy" | "sell" | "none" }footprint.profile()
Sums the base buckets whose start timestamp falls in [from, to] into a price-keyed volume map. Use it for a per-view, per-candle, or per-N-candle profile.
fromMs/toMsare ms timestamps (inclusive); order does not matter.totalisbuys + sellsat that price across the range.- Pair it with
chart.horizontalBar()to render the profile (see the Chart API).
footprint.profile(fromMs, toMs) // { [price]: { buys, sells, total } }
// Whole loaded range up to now:
const profile = footprint.profile(0, time.getTime())