Skip to main content

VWAP Explained

TL;DR

VWAP (Volume Weighted Average Price) is the average price of an instrument over a session, weighted by volume traded at each price. It's the benchmark institutions use to measure their own execution, which makes it one of the most important intraday levels on a futures chart. Price above VWAP = bulls are winning the session; below = bears are. Resets every trading day.

What VWAP actually is

At its core: take every trade during the session, multiply each trade's price by its volume, sum those values, and divide by total volume. The result is the "true" average price — weighted so that a trade of 1,000 contracts at $5,000 influences the average 1,000× more than a trade of 1 contract.

VWAP = Σ (Price × Volume) / Σ Volume

Why it matters: a pension fund executing a billion-dollar ES order measures their fill quality against VWAP. Beating VWAP = good execution. Missing it = bad. This makes VWAP the most-watched intraday level on index futures.

Three ways traders use VWAP

1. Trend filter. Above VWAP, only take longs. Below, only shorts. Simple, brutal, effective.

2. Mean reversion. Price extends 2+ standard deviations from VWAP → fade back toward VWAP. Works best in range days (no economic release, no news).

3. Rejection / acceptance. Price tests VWAP and rejects → trend continuation in the original direction. Price breaks through VWAP and holds the other side → regime change.

Anchored VWAP

Regular VWAP resets every session. Anchored VWAP (AVWAP) starts from a user-chosen anchor point — a major high, a news bar, an earnings print. Every subsequent bar's volume-weighted average references that anchor.

Popular anchors for ES / NQ:

  • Year's high / low
  • Last Fed announcement
  • Major earnings bar
  • Prior session high/low

Anchored VWAP often acts as unexpectedly precise support or resistance weeks after the anchor. Add it to your chart once and watch.

VWAP in Pine Script (v6)

//@version=6
indicator("Session VWAP + Bands + Alerts", overlay=true)

// Session-reset VWAP with standard deviation bands
var float sumPV = na
var float sumV = na
var float sumPPV = na

newSession = session.isfirstbar
if newSession
sumPV := 0.0
sumV := 0.0
sumPPV := 0.0

typical = hlc3
v = volume
sumPV := nz(sumPV) + typical * v
sumV := nz(sumV) + v
sumPPV := nz(sumPPV) + typical * typical * v

vwap = sumV > 0 ? sumPV / sumV : na
variance = sumV > 0 ? (sumPPV / sumV) - (vwap * vwap) : na
sd = variance > 0 ? math.sqrt(variance) : 0.0
upper = vwap + sd
lower = vwap - sd

plot(vwap, color=color.orange, linewidth=2, title="VWAP")
plot(upper, color=color.new(color.blue, 50), title="+1σ")
plot(lower, color=color.new(color.blue, 50), title="−1σ")

if ta.crossover(close, vwap)
alert("Price crossed above VWAP on " + syminfo.ticker, alert.freq_once_per_bar_close)
if ta.crossunder(close, vwap)
alert("Price crossed below VWAP on " + syminfo.ticker, alert.freq_once_per_bar_close)

TradingView also ships a free built-in VWAP indicator that handles sessions correctly — for most traders, the built-in is fine. The Pine Script above is useful when you want to customize alert logic.

VWAP reversion strategy outline

  1. Regime filter — non-event day (no FOMC, no CPI, no NFP within ±1 hour).
  2. Setup — price extends 2 SDs from VWAP.
  3. Trigger — rejection candle (pin bar, engulfing).
  4. Stop — 1 ATR beyond the rejection high/low.
  5. Target — VWAP itself.

Works best on ES and NQ during mid-morning chop (10:00–11:30 ET) and early afternoon (13:30–14:30 ET). Avoid the open and the close.

Common mistakes

  • Using VWAP on weekly/daily charts. VWAP is an intraday tool. On daily charts, it represents a single day's VWAP — not useful for swing trading unless you're using an anchored VWAP.
  • Ignoring volume. VWAP depends on volume data. Using it on illiquid instruments (thin overnight session, off-hours futures) gives garbage readings.
  • Fading VWAP on trend days. On strong directional days, price leaves VWAP and never comes back. ADX above 25 is a hint to skip reversion setups.

How to automate VWAP alerts with CrossTrade

Build the Pine Script as a strategy() script. Pair it with this CrossTrade payload:

key=YOUR-SECRET-KEY;
command=place;
account=Sim101;
instrument=ES 03-26;
action={{strategy.order.action}};
qty={{strategy.order.contracts}};
order_type=market;
tif=day;
sync_strategy=true;
market_position={{strategy.market_position}};
prev_market_position={{strategy.prev_market_position}};

Frequently Asked Questions

What does VWAP mean in trading?

VWAP stands for Volume Weighted Average Price — the average price of an instrument during a session, weighted by the volume traded at each price. It's the institutional benchmark for intraday execution quality.

Does VWAP reset daily?

Standard VWAP resets at the start of each trading session. Anchored VWAP (AVWAP) starts from a user-selected bar and does not reset. Most charting platforms let you toggle between the two.

Why do institutions care about VWAP?

Large orders have to be sliced and executed over hours to avoid moving the market. VWAP is the fair 'average' price during that execution window, so funds measure their own fills against VWAP — and manage toward it.

Can I use VWAP for swing trading?

Regular session VWAP, no — it resets daily. Anchored VWAP from a major pivot (yearly high, earnings bar, FOMC) can work as a swing trading reference level, sometimes acting as support or resistance months after the anchor.