VAP (Volume at Price)
Volume at Price — per-price-level traded volume data, the underlying tick-level input to volume profile and footprint visualizations. Sierra Chart exposes VAP arrays to ACSIL via `c_VAPContainer`.
What it is
VAP stands for Volume at Price — the per-price-level breakdown of traded volume inside a single bar or across a window of bars. Where a chart's basic volume reading tells you "this bar traded N contracts in total", VAP tells you exactly how that N was distributed across each price the bar touched: how much at the high, how much at the low, how much at every tick in between.
Internally, VAP is a structure indexed by price increment. For each bar, Sierra Chart maintains a container of (price, ask_volume, bid_volume, total_volume, trade_count) cells — one cell per price level that traded inside that bar. This per-bar VAP data is what footprint charts read to render their in-bar grids, what volume profiles aggregate to build their session histograms, and what delta-by-price studies use to highlight imbalances at specific levels.
VAP is the raw tick-level building block that all higher-level order-flow visualizations depend on. Without VAP, a chart can only show the total volume of each bar; with VAP, it can show how that volume was distributed across price.
Why it matters
For traders, VAP is the data that turns a candlestick into an order-flow object. Two bars with identical OHLC and identical total volume can have completely different VAP signatures — one might have all its volume concentrated at the close (suggesting late-bar aggression), the other might have it spread evenly (suggesting balanced two-way trading). Footprint charts make this visible bar-by-bar.
For ACSIL developers, VAP is the only practical way to compute per-price-level metrics — delta at the high, ask-volume concentration, single prints, absorption signals — without storing your own tick history. Sierra Chart already aggregates it as the data feed runs, so studies just read the structure.
How it's used in ACSIL code
Sierra Chart exposes VAP to ACSIL through the c_VAPContainer interface. Each bar has its own VAP container, accessible via sc.VolumeAtPriceForBars. From the container you can iterate per-price cells: get the number of cells with GetSizeAtBarIndex, then read each cell to extract its price level and the bid/ask volume at that level.
A typical use is to walk every VAP cell of the current bar and compute a custom metric — say, "what fraction of this bar's volume traded above the midpoint at the ask?". Once you have the metric, you write it to a subgraph and the platform renders it like any other study output.
Common patterns / pitfalls
- VAP is per-bar — the container holds the breakdown for one bar, not the whole chart. To compute a multi-bar profile, aggregate across bars yourself.
- Use
GetSizeAtBarIndexfor the cell count — there is noGetNumberOfPricesAtBarIndex; that name is a common ACSIL confusion. - Cell indices are not price-ordered — VAP cells are stored in insertion order, not price order. If you need them sorted by price, sort them yourself.
- Persistence depends on settings — Sierra Chart can be configured to drop VAP for old bars to save memory. Studies that need historical VAP should verify it's still loaded.
- VAP requires bid/ask data — VAP is only populated when the data feed provides per-trade bid/ask information. Some non-futures instruments expose only total volume, leaving ask/bid columns empty.
Related SCS studies
CVD Filled Area, Delta Candle Color, Single Print and Gap, and Zero Print Zones all consume VAP data internally to compute their per-bar or per-level signals. Numbers Bars — Sierra Chart's native footprint chart type — is the most direct visual rendering of raw VAP.
See also
About the volume profile & tpo category
Vertical-axis distribution of traded volume across price levels, plus TPO / market profile derivatives.
Browse the full glossary