Volume
VWAP Trading Signals: Daily Anchors, Holds and Band Touches
Read daily-anchored VWAP crosses, confirmed holds and band touches. Includes Pine Script v6, reset handling, volume limits and explicit signal definitions.
VWAP Signal Interpretation
Quick-reference guide to 6 signal types you will see on the chart.
| Signal Type | Indicator Condition | Market Meaning | Interpretation limits |
|---|---|---|---|
| VWAP wick recovery | Previous close is above the current VWAP; current low reaches it and confirmed close finishes above it. | Price tests the current volume-weighted reference from above. | No hammer or engulfing pattern is required. VWAP can move during the test bar. |
| VWAP wick rejection | Previous close is below the current VWAP; current high reaches it and confirmed close finishes below it. | Price tests the reference from below. | This does not identify sellers or establish a wider downtrend. |
| Confirmed hold above | A same-day cross above VWAP starts a count; N consecutive confirmed closes remain above their respective VWAP readings. | The marker appears when the count first reaches N. | Equality, a move below or a daily reset cancels the pending sequence. |
| Confirmed hold below | A same-day cross below VWAP is followed by N consecutive confirmed closes below VWAP. | The count includes the crossing bar. | The next bar open is not an additional confirmed close. |
| Upper band touch | The bar high reaches or exceeds the configured upper band at the close. | The observed high lies beyond the selected VWAP dispersion band. | Repeated touches can produce repeated alerts; this is not a short instruction. |
| Lower band touch | The bar low reaches or falls below the lower band at the close. | The observed low lies below the selected band. | Band width supplies no guaranteed reversal probability or coverage percentage. |
VWAP Pine Script Signal Code
Educational indicator example. Review its exact rules and compare its plots with your intended calculation in TradingView. It does not place orders or establish profitability.
Pine Script v6
//@version=6
indicator("Daily VWAP Signal Rules", overlay=true)
src = input.source(hlc3, "VWAP Source")
bandMult = input.float(2.0, "Band Multiplier", minval=0.1, step=0.1)
confirmBars = input.int(2, "Confirmation Closes", minval=1, maxval=5)
showBands = input.bool(true, "Show Bands")
showSignals = input.bool(true, "Show Markers")
if not timeframe.isintraday
runtime.error("Use an intraday chart for this daily-anchored example.")
newDay = timeframe.change("D")
anchor = newDay or barstate.isfirst
[vwapValue, upperBand, lowerBand] = ta.vwap(src, anchor, bandMult)
var bool invalidVolume = false
if anchor
invalidVolume := false
invalidVolume := invalidVolume or na(volume) or volume < 0
ready = barstate.isconfirmed and not anchor and not invalidVolume and not na(vwapValue)
crossUp = ta.crossover(close, vwapValue)
crossDown = ta.crossunder(close, vwapValue)
var int aboveCount = 0
var int belowCount = 0
if barstate.isconfirmed
if anchor or not ready
aboveCount := 0
belowCount := 0
else
aboveCount := close > vwapValue ? (crossUp ? 1 : aboveCount > 0 ? aboveCount + 1 : 0) : 0
belowCount := close < vwapValue ? (crossDown ? 1 : belowCount > 0 ? belowCount + 1 : 0) : 0
holdAbove = ready and aboveCount == confirmBars
holdBelow = ready and belowCount == confirmBars
recover = ready and close[1] > vwapValue and low <= vwapValue and close > vwapValue
reject = ready and close[1] < vwapValue and high >= vwapValue and close < vwapValue
upperTouch = ready and upperBand > lowerBand and high >= upperBand
lowerTouch = ready and upperBand > lowerBand and low <= lowerBand
plot(invalidVolume ? na : vwapValue, "Daily VWAP", color.blue, 2)
plot(showBands and not invalidVolume ? upperBand : na, "Upper Band", color.new(color.red, 50))
plot(showBands and not invalidVolume ? lowerBand : na, "Lower Band", color.new(color.green, 50))
plotshape(showSignals and holdAbove, "Hold Above", shape.triangleup, location.belowbar, color.green, text="HOLD")
plotshape(showSignals and holdBelow, "Hold Below", shape.triangledown, location.abovebar, color.red, text="HOLD")
plotshape(showSignals and recover, "Wick Recovery", shape.diamond, location.belowbar, color.teal)
plotshape(showSignals and reject, "Wick Rejection", shape.diamond, location.abovebar, color.orange)
plotshape(showSignals and upperTouch, "Upper Touch", shape.circle, location.abovebar, color.purple, size=size.tiny)
plotshape(showSignals and lowerTouch, "Lower Touch", shape.circle, location.belowbar, color.purple, size=size.tiny)
alertcondition(holdAbove, "VWAP Hold Above", "Configured consecutive closes above VWAP completed after a cross")
alertcondition(holdBelow, "VWAP Hold Below", "Configured consecutive closes below VWAP completed after a cross")
alertcondition(recover, "VWAP Wick Recovery", "Price tested current VWAP and closed above it")
alertcondition(reject, "VWAP Wick Rejection", "Price tested current VWAP and closed below it")
alertcondition(upperTouch, "VWAP Upper Band Touch", "High reached the configured upper VWAP band")
alertcondition(lowerTouch, "VWAP Lower Band Touch", "Low reached the configured lower VWAP band")Example settings for VWAP
Record the inputs used by the example. These settings are not an optimized trading recommendation.
| Parameter | Default | Description |
|---|---|---|
| VWAP Source | hlc3 | The bar-level price used in the volume-weighted average. HLC3 means (high + low + close) / 3; it does not reveal individual transaction prices. |
| Band Multiplier | 2.0 | Uses the upper and lower bands returned by ta.vwap with this multiplier. It is not a fixed 20-bar average of deviations from changing VWAP values. |
| Confirmation Closes | 2 | Counts the crossing bar as close one, then requires consecutive closes on that side. A marker occurs once at the requested count. |
| Show Bands / Show Markers | true / true | Visual controls only. The six conditions remain available for alerts. |
Turn the condition into an explicit rule
Specify the calculation, confirmation time, entry and exit rules before asking Pineify to draft or revise Pine Script. Review the code and simulate realistic costs before evaluating a strategy.
Explore Pine Script codingRelated Resources
Official calculation and usage references
FAQ
VWAP Signals FAQ
What does this VWAP average?
It sums the selected source multiplied by volume from the daily anchor and divides by cumulative volume. For hypothetical source/volume pairs 100/10 and 104/30, VWAP is 103. This is a bar-source approximation to a transaction average, and it does not reveal which institutions or traders participated.
When does the daily anchor reset?
The script uses timeframe.change("D") on the chart symbol and starts a new calculation at that boundary. Session selection and exchange data affect included bars. This is not a hard-coded New York market open or a universal midnight-UTC rule. The first available historical bar also starts a partial calculation; load sufficient history before evaluating a day.
How does the two-close hold work?
After a valid cross above, the crossing bar counts as one. The next confirmed close above its current VWAP counts as two and produces the default marker. Subsequent closes above do not repeat it. A close equal to or below VWAP cancels the count, and a fresh cross is required. A daily reset clears both counts and produces no first-bar signal.
Do two-standard-deviation bands contain 95% of future prices?
No coverage guarantee follows from the multiplier. Prices are not required to follow a normal distribution, the reference changes through the day, and this is not a forecast interval. The bands describe dispersion in the selected calculation. A touch can occur during either continuation or reversal.
Why is a VWAP line not a moving average of the last N bars?
This example accumulates volume-weighted observations from a daily anchor. A rolling SMA uses an equal-weight fixed window; an EMA applies decaying weights, and a VWMA is itself volume-weighted over a rolling window. VWAP can also use other anchors in other scripts, so not every VWAP resets daily.
What data or timeframe limits apply?
The example requires an intraday chart. It suppresses values and signals for the rest of a day if it encounters missing or negative volume; an all-zero-volume anchor has no usable average. Exchange feeds can report different volume conventions. Changing the chart timeframe also changes the bar-source approximation.
Are the signals confirmed and ready for alerts?
All six conditions wait for the chart bar close. The live line and bands can still move during the open bar. Choose the desired condition in TradingView and use once per bar close; recreate alerts after changing code or inputs. Hiding bands or markers does not disable their conditions.
Does a VWAP touch or hold have a verified win rate?
No. This indicator does not define orders, exits, costs or a backtest. It also has no institutional-flow detector or volume-spike filter. Any comparison between chart intervals or additional filters needs a complete strategy and independent evaluation data.