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 / sells are accumulated executed volume at that price within the candle.
API
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.interval breaks 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.
API
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.interval buckets.
  • Merges historical data with the live tape, already filtered at the instrument's minimum large-trade size.
  • side is "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.
API
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 / toMs are ms timestamps (inclusive); order does not matter.
  • total is buys + sells at that price across the range.
  • Pair it with chart.horizontalBar() to render the profile (see the Chart API).
API
footprint.profile(fromMs, toMs) // { [price]: { buys, sells, total } }

// Whole loaded range up to now:
const profile = footprint.profile(0, time.getTime())