◆ New — Strategy Validator, Code Fixer & Prop Compliance Checker are live. Try one free →
Home / Strategies / VWAP Bounce Strategy
Mean Reversion / Intraday

VWAP Bounce Strategy

The VWAP bounce strategy is an intraday approach where traders watch for price to pull back toward the Volume-Weighted Average Price (VWAP) and then react in the direction of the prevailing trend. Traders use VWAP as a reference for the session's volume-weighted average traded price and study reactions off it as potential continuation areas rather than guarantees. This page explains the mechanics so you can study and test the idea yourself. It is educational software framing only, not financial advice or a signal service, and nothing here is predictive; trading involves the risk of loss.

How it works

VWAP is the average price of an asset over the trading session, weighted by volume, so it leans toward the price levels where the most volume actually traded. Because the standard session VWAP resets at the start of each trading day, intraday traders often treat it as a "fair value" reference for that day. The VWAP bounce idea assumes that when price drifts away from VWAP and then returns to it during an established trend, the area around VWAP may act as a temporary support (in an uptrend) or resistance (in a downtrend) zone — an assumption to be tested, not a rule. A long "bounce" setup is when price is trading above a rising VWAP, dips back to touch or slightly undercut it, and then shows a sign of resuming upward; that rejection is the trigger traders watch. The mirror image applies for shorts below a falling VWAP. The key word is "watch": VWAP is a descriptive average and does not cause price to bounce, so price can cut straight through it. Traders typically combine the VWAP touch with confirmation (a candle pattern, a momentum filter, or the trend direction itself) to avoid acting on every tap, and they define where the idea is invalidated before entering. Because the session VWAP recalculates from each session's cumulative volume, it is fundamentally an intraday tool; on higher timeframes or across sessions its meaning changes, and a session-anchored VWAP behaves differently from a rolling or event-anchored one.

Entry rules

Exit rules

Risk notes

Pine v6 example

//@version=6
strategy("VWAP Bounce (Educational)", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=10, process_orders_on_close=true)

// --- Inputs ---
atrLen     = input.int(14, "ATR length")
atrStopX   = input.float(1.5, "Stop = ATR x")
atrTargetX = input.float(2.0, "Target = ATR x")
touchTol   = input.float(0.1, "VWAP touch tolerance (%)") / 100.0
sess       = input.session("0930-1545", "Session window")

// --- Core values ---
// ta.vwap anchors to the chart's session on intraday timeframes; use an intraday chart.
vwapValue = ta.vwap(hlc3)
atrValue  = ta.atr(atrLen)

// Session window (regular intraday hours; adjust to your market/exchange)
inSession = not na(time(timeframe.period, sess))

// Trend context relative to a rising/falling VWAP
upTrend   = close > vwapValue and vwapValue > vwapValue[5]
downTrend = close < vwapValue and vwapValue < vwapValue[5]

// Price pulled back to VWAP this bar (low tagged it / poked under for longs)
touchedLong  = low  <= vwapValue * (1 + touchTol)
touchedShort = high >= vwapValue * (1 - touchTol)

// Confirmation: bar closes back on the trend side of VWAP (evaluated on bar close)
longSignal  = upTrend   and touchedLong  and close > vwapValue and close > open and inSession
shortSignal = downTrend and touchedShort and close < vwapValue and close < open and inSession

// --- Entries ---
if longSignal and strategy.position_size == 0
    strategy.entry("Long", strategy.long)
    strategy.exit("L-exit", from_entry="Long", stop=close - atrValue * atrStopX, limit=close + atrValue * atrTargetX)

if shortSignal and strategy.position_size == 0
    strategy.entry("Short", strategy.short)
    strategy.exit("S-exit", from_entry="Short", stop=close + atrValue * atrStopX, limit=close - atrValue * atrTargetX)

// Flatten at session end (intraday)
if not inSession and strategy.position_size != 0
    strategy.close_all("EOD flat")

// --- Plot ---
plot(vwapValue, "VWAP", color=color.orange, linewidth=2)
// Note: illustrative only. Backtest results are hypothetical; past performance does not indicate future results.

Pitfalls

FAQ

What exactly is a VWAP bounce?

It is an intraday setup where price, while trending, pulls back toward the Volume-Weighted Average Price and then shows signs of resuming in the trend direction. Traders watch the VWAP area as a potential continuation zone — not a guarantee — and usually require a confirming candle or filter before acting. Whether price actually bounces is unknown in advance, so a predefined invalidation level is essential.

Which timeframe and markets does the VWAP bounce strategy suit?

Because session-anchored VWAP resets each trading day, the idea is built for intraday timeframes (commonly 1m to 15m) on liquid instruments where volume data is meaningful, such as index futures, large-cap stocks, or major FX pairs (note that spot FX volume is tick-based, which changes VWAP's interpretation). On daily or higher charts the standard session VWAP loses its intraday meaning, so the setup generally does not transfer cleanly.

How do I know if my VWAP bounce code repaints or has look-ahead bias?

Repainting and look-ahead bias usually come from evaluating signals before a bar closes, pulling higher-timeframe data without proper handling, or assuming fills on the same bar a signal forms. The safer pattern is to confirm conditions on closed bars and compare a strategy's live behavior to its backtest. ForexCodes' Strategy Validator was built for exactly this — it turns a plain-English or AI-generated idea into validated Pine Script v6 and flags look-ahead bias, repainting, and intent mismatches before you rely on the results. Try it free to validate your VWAP bounce strategy.

Educational & software only — not financial advice, not a recommendation to trade. Backtests are illustrative; past performance does not predict future results. Trading involves substantial risk of loss.

Catch the bug that compiles.Run auditGet Pro