The VWAP is the volume-weighted fair price of a period: the level where, on average, the volume of that period changed hands. Anchored to the start of each month, it becomes a reference that swing traders can use on daily and weekly charts: price far below it is cheap compared with the month’s fair value, price far above it is rich.
The VWAP & Volume-Spike Suite by RichmondHillCM combines that monthly VWAP and its standard-deviation bands with a second, independent signal: bars where volume is clearly above its average. Each volume spike is marked with an up or down triangle according to its direction, and a summary table keeps the key levels and the current state of the market in one place.
Monthly anchored VWAP. On the first bar of each month the indicator starts three running sums: volume, price × volume and price² × volume, using the typical price (high + low + close) / 3. The VWAP is price × volume divided by volume, and the standard deviation comes from the volume-weighted variance (average of price² minus VWAP²). The bands sit at VWAP ± k standard deviations; the table also shows the ±1, ±2 and ±3 sigma levels.
Volume spike. A bar is a spike when its volume is above its 28-bar simple average multiplied by the threshold (1.7 by default). Bars with no volume never give a spike.
Direction. The spike becomes bullish or bearish according to the chosen definition:
On a weekly chart each month holds 4 or 5 bars of VWAP data, which is the setting the author recommends. On intraday charts the VWAP covers the whole month, so it moves slowly and works as a higher-level reference.
The VWAP and the bands are drawn as continuous lines. If you prefer them as steps, choose the “Stair” style for each line in the indicator properties.
//---------------------------------------------------------------
// PRC_VWAP Volume Spike
// version = 0
// 28.10.2026
// Iván González @ www.prorealcode.com
// Author: RichmondHillCM
// Sharing ProRealTime knowledge
//--------------------------------------------------------------------//
DEFPARAM DRAWONLASTBARONLY = true
// ===================== INPUTS: MONTHLY VWAP + BANDS =====================
showVwap = 1 // 1 = show the monthly VWAP
showBands = 1 // 1 = show the sigma bands
vwapMult = 1.0 // band width (sigma multiplier, min 0.1)
fillBands = 1 // 1 = shade the band zone
showVwapLbl = 1 // 1 = label the VWAP and the bands on the last bar
// ===================== INPUTS: VOLUME SPIKE =====================
showTriangles = 1 // 1 = show the up/down volume-spike triangles
volumeMaLength = 28 // volume moving average length
volumeThreshold = 1.7 // spike threshold (x average volume, min 1)
dirMode = 0 // direction: 0 = close vs VWAP, 1 = candle (close vs open), 2 = close vs prior close
showSpikeText = 1 // 1 = label the triangles (VOL up / VOL down)
confirmOnClose = 0 // 1 = only signal on closed bars (no intrabar repaint)
// ===================== INPUTS: SUMMARY TABLE =====================
showTable = 1 // 1 = show the summary table
tblVert = 0 // table position: 0 = top right, 1 = bottom right
vwapSrc = typicalprice // VWAP source: (high + low + close) / 3
// ===================== VOLUME SPIKE =====================
volMa = average[volumeMaLength](volume)
maOk = 0
IF barindex >= volumeMaLength - 1 THEN
maOk = 1
ENDIF
volSpike = 0
IF volume > 0 AND maOk = 1 AND volume > volMa * volumeThreshold THEN
volSpike = 1
ENDIF
vrOk = 0
IF maOk = 1 AND volMa <> 0 THEN
vrOk = 1
volRatio = volume / volMa
ENDIF
// ===================== ANCHORED MONTHLY VWAP + SIGMA BANDS =====================
// the sums restart on the first bar of each month
newMonth = 0
IF barindex = 0 THEN
newMonth = 1
ELSIF openmonth <> openmonth[1] OR openyear <> openyear[1] THEN
newMonth = 1
ENDIF
IF newMonth = 1 THEN
sumV = volume
sumPV = vwapSrc * volume
sumPPV = vwapSrc * vwapSrc * volume
ELSE
sumV = sumV + volume
sumPV = sumPV + vwapSrc * volume
sumPPV = sumPPV + vwapSrc * vwapSrc * volume
ENDIF
// with no volume in the month so far the VWAP does not exist: lines hidden
vOk = 0
IF sumV > 0 THEN
vOk = 1
vwapV = sumPV / sumV
variance = sumPPV / sumV - vwapV * vwapV
IF variance < 0 THEN
variance = 0
ENDIF
sigma = sqrt(variance)
ELSIF barindex = 0 THEN
vwapV = vwapSrc
sigma = 0
ENDIF
vwapUp1 = vwapV + sigma
vwapUp2 = vwapV + 2 * sigma
vwapUp3 = vwapV + 3 * sigma
vwapLo1 = vwapV - sigma
vwapLo2 = vwapV - 2 * sigma
vwapLo3 = vwapV - 3 * sigma
vwapUpper = vwapV + vwapMult * sigma
vwapLower = vwapV - vwapMult * sigma
// ===================== SIGNALS =====================
dirUp = 0
dirDn = 0
IF dirMode = 0 THEN
IF vOk = 1 AND close > vwapV THEN
dirUp = 1
ENDIF
IF vOk = 1 AND close < vwapV THEN
dirDn = 1
ENDIF
ELSIF dirMode = 1 THEN
IF close > open THEN
dirUp = 1
ENDIF
IF close < open THEN
dirDn = 1
ENDIF
ELSE
IF close > close[1] THEN
dirUp = 1
ENDIF
IF close < close[1] THEN
dirDn = 1
ENDIF
ENDIF
// the live bar is the only one that is not closed yet
barOk = 1
IF confirmOnClose = 1 AND islastbarupdate THEN
barOk = 0
ENDIF
spikeUp = 0
spikeDn = 0
IF volSpike = 1 AND dirUp = 1 AND barOk = 1 THEN
spikeUp = 1
ENDIF
IF volSpike = 1 AND dirDn = 1 AND barOk = 1 THEN
spikeDn = 1
ENDIF
// ===================== STATISTICS =====================
once cntUp = 0
once cntDn = 0
cntUp = cntUp + spikeUp
cntDn = cntDn + spikeDn
// 0 = no VWAP, 1 = above upper, 2 = below lower, 3 = upper half, 4 = lower half
IF vOk = 0 THEN
vwapZone = 0
ELSIF close > vwapUpper THEN
vwapZone = 1
ELSIF close < vwapLower THEN
vwapZone = 2
ELSIF close > vwapV THEN
vwapZone = 3
ELSE
vwapZone = 4
ENDIF
// ===================== SPIKE MARKS =====================
// stored with a pure assignment indexed by a scalar counter (the counter
// rewinds between ticks, so a spike that disappears on the live bar leaves
// nothing behind) and redrawn on the last bar
IF barindex >= 14 THEN
sigOff = averagetruerange[14](close)
ELSE
sigOff = high - low
ENDIF
once nSig = 0
IF showTriangles = 1 AND spikeUp = 1 THEN
$sgX[nSig] = barindex
$sgY1[nSig] = low - 0.5 * sigOff
$sgY2[nSig] = low - 1.3 * sigOff
$sgD[nSig] = 1
nSig = nSig + 1
ENDIF
IF showTriangles = 1 AND spikeDn = 1 THEN
$sgX[nSig] = barindex
$sgY1[nSig] = high + 0.5 * sigOff
$sgY2[nSig] = high + 1.3 * sigOff
$sgD[nSig] = -1
nSig = nSig + 1
ENDIF
// ===================== LINE VISIBILITY =====================
IF showVwap = 1 AND vOk = 1 THEN
vwapA = 255
ELSE
vwapA = 0
ENDIF
IF showBands = 1 AND vOk = 1 THEN
bandA = 153
ELSE
bandA = 0
ENDIF
IF fillBands = 1 AND showBands = 1 AND vOk = 1 THEN
fillA = 20
ELSE
fillA = 0
ENDIF
COLORBETWEEN(vwapUpper, vwapLower, 8, 153, 129, fillA)
IF islastbarupdate THEN
// ---------- triangles, and the text labels of the most recent spikes ----------
// the original keeps its 500 most recent labels (three of them are the curve names)
nCurve = 0
IF showVwapLbl = 1 AND vOk = 1 THEN
nCurve = showVwap + 2 * showBands
ENDIF
firstLbl = nSig - (500 - nCurve)
IF nSig > 0 THEN
FOR k = 0 TO nSig - 1 DO
sx = $sgX[k]
sy1 = $sgY1[k]
sy2 = $sgY2[k]
IF $sgD[k] = 1 THEN
DRAWTEXT("▲", sx, sy1, dialog, bold, 14) COLOURED(0, 230, 118, 255)
IF showSpikeText = 1 AND k >= firstLbl THEN
DRAWTEXT("VOL▲", sx, sy2, dialog, bold, 9) COLOURED(0, 230, 118, 255)
ENDIF
ELSE
DRAWTEXT("▼", sx, sy1, dialog, bold, 14) COLOURED(242, 54, 69, 255)
IF showSpikeText = 1 AND k >= firstLbl THEN
DRAWTEXT("VOL▼", sx, sy2, dialog, bold, 9) COLOURED(242, 54, 69, 255)
ENDIF
ENDIF
NEXT
ENDIF
// ---------- curve names at the right edge ----------
IF showVwapLbl = 1 AND vOk = 1 THEN
lx = barindex + 8
IF showVwap = 1 THEN
DRAWTEXT("Monthly VWAP", lx, vwapV, dialog, bold, 11) COLOURED(8, 153, 129, 255)
ENDIF
IF showBands = 1 THEN
DRAWTEXT("VWAP +σ", lx, vwapUpper, dialog, bold, 11) COLOURED(8, 153, 129, 255)
DRAWTEXT("VWAP −σ (buy)", lx, vwapLower, dialog, bold, 11) COLOURED(8, 153, 129, 255)
ENDIF
ENDIF
// ---------- summary table ----------
IF showTable = 1 THEN
// prices as the chart shows them
tk = ticksize
IF tk <= 0 THEN
tk = 0.01
ENDIF
pU3 = round(vwapUp3 / tk) * tk
pU2 = round(vwapUp2 / tk) * tk
pU1 = round(vwapUp1 / tk) * tk
pVw = round(vwapV / tk) * tk
pL1 = round(vwapLo1 / tk) * tk
pL2 = round(vwapLo2 / tk) * tk
pL3 = round(vwapLo3 / tk) * tk
vrT = round(volRatio * 100) / 100
// chart timeframe as text
tfSec = GetTimeFrame
tfS = tfSec
tfM = round(tfSec / 60)
tfD = round(tfSec / 86400)
tfW = round(tfSec / 604800)
// value colours
IF vwapZone = 2 THEN
zR = 76
zG = 175
zB = 80
ELSIF vwapZone = 1 THEN
zR = 242
zG = 54
zB = 69
ELSE
zR = 255
zG = 255
zB = 255
ENDIF
IF volSpike = 1 THEN
rR = 255
rG = 152
rB = 0
ELSE
rR = 255
rG = 255
rB = 255
ENDIF
// geometry: monospaced bold, every character is chW pixels wide
pz = 11
chW = pz * 0.62
rowH = pz + 8
padX = 6
col0W = 19 * chW + 2 * padX
col1W = 15 * chW + 2 * padX
pW = col0W + col1W
pH = 13 * rowH
pL = 0 - 85 - pW
xC0 = pL + col0W / 2
xC1 = pL + col0W + col1W / 2
IF tblVert = 1 THEN
pT = 12 + pH
ELSE
pT = 0 - 12
ENDIF
y0 = pT - rowH * 0.5
y1 = pT - rowH * 1.5
y2 = pT - rowH * 2.5
y3 = pT - rowH * 3.5
y4 = pT - rowH * 4.5
y5 = pT - rowH * 5.5
y6 = pT - rowH * 6.5
y7 = pT - rowH * 7.5
y8 = pT - rowH * 8.5
y9 = pT - rowH * 9.5
y10 = pT - rowH * 10.5
y11 = pT - rowH * 11.5
y12 = pT - rowH * 12.5
IF tblVert = 1 THEN
// panel background (opaque: a transparent dark table turns grey on a light chart),
// label column and blue header row
DRAWRECTANGLE(pL, pT, pL + pW, pT - pH) ANCHOR(BOTTOMRIGHT, XSHIFT, YSHIFT) COLOURED(80, 84, 96, 255) FILLCOLOR(54, 58, 69, 255)
DRAWRECTANGLE(pL, pT - rowH, pL + col0W, pT - pH) ANCHOR(BOTTOMRIGHT, XSHIFT, YSHIFT) COLOURED(80, 84, 96, 255) FILLCOLOR(77, 81, 92, 255)
DRAWRECTANGLE(pL, pT, pL + pW, pT - rowH) ANCHOR(BOTTOMRIGHT, XSHIFT, YSHIFT) COLOURED(41, 98, 255, 255) FILLCOLOR(41, 98, 255, 255)
DRAWTEXT("VWAP + VOL SPIKE", xC0, y0, monospaced, bold, pz) ANCHOR(BOTTOMRIGHT, XSHIFT, YSHIFT) COLOURED(255, 255, 255, 255)
IF tfSec < 60 THEN
DRAWTEXT("#tfS#S", xC1, y0, monospaced, bold, pz) ANCHOR(BOTTOMRIGHT, XSHIFT, YSHIFT) COLOURED(255, 255, 255, 255)
ELSIF tfSec < 86400 THEN
DRAWTEXT("#tfM#", xC1, y0, monospaced, bold, pz) ANCHOR(BOTTOMRIGHT, XSHIFT, YSHIFT) COLOURED(255, 255, 255, 255)
ELSIF tfSec < 604800 THEN
DRAWTEXT("#tfD#D", xC1, y0, monospaced, bold, pz) ANCHOR(BOTTOMRIGHT, XSHIFT, YSHIFT) COLOURED(255, 255, 255, 255)
ELSIF tfSec < 2419200 THEN
DRAWTEXT("#tfW#W", xC1, y0, monospaced, bold, pz) ANCHOR(BOTTOMRIGHT, XSHIFT, YSHIFT) COLOURED(255, 255, 255, 255)
ELSE
DRAWTEXT("1M", xC1, y0, monospaced, bold, pz) ANCHOR(BOTTOMRIGHT, XSHIFT, YSHIFT) COLOURED(255, 255, 255, 255)
ENDIF
DRAWTEXT("VWAP +3σ", xC0, y1, monospaced, bold, pz) ANCHOR(BOTTOMRIGHT, XSHIFT, YSHIFT) COLOURED(255, 255, 255, 255)
DRAWTEXT("VWAP +2σ", xC0, y2, monospaced, bold, pz) ANCHOR(BOTTOMRIGHT, XSHIFT, YSHIFT) COLOURED(255, 255, 255, 255)
DRAWTEXT("VWAP +1σ", xC0, y3, monospaced, bold, pz) ANCHOR(BOTTOMRIGHT, XSHIFT, YSHIFT) COLOURED(255, 255, 255, 255)
DRAWTEXT("Monthly VWAP", xC0, y4, monospaced, bold, pz) ANCHOR(BOTTOMRIGHT, XSHIFT, YSHIFT) COLOURED(255, 255, 255, 255)
DRAWTEXT("VWAP −1σ", xC0, y5, monospaced, bold, pz) ANCHOR(BOTTOMRIGHT, XSHIFT, YSHIFT) COLOURED(255, 255, 255, 255)
DRAWTEXT("VWAP −2σ", xC0, y6, monospaced, bold, pz) ANCHOR(BOTTOMRIGHT, XSHIFT, YSHIFT) COLOURED(255, 255, 255, 255)
DRAWTEXT("VWAP −3σ (buy)", xC0, y7, monospaced, bold, pz) ANCHOR(BOTTOMRIGHT, XSHIFT, YSHIFT) COLOURED(255, 255, 255, 255)
DRAWTEXT("VWAP Zone", xC0, y8, monospaced, bold, pz) ANCHOR(BOTTOMRIGHT, XSHIFT, YSHIFT) COLOURED(255, 255, 255, 255)
DRAWTEXT("Vol vs Avg", xC0, y9, monospaced, bold, pz) ANCHOR(BOTTOMRIGHT, XSHIFT, YSHIFT) COLOURED(255, 255, 255, 255)
DRAWTEXT("Spike Now", xC0, y10, monospaced, bold, pz) ANCHOR(BOTTOMRIGHT, XSHIFT, YSHIFT) COLOURED(255, 255, 255, 255)
DRAWTEXT("Up ▲ / Down ▼", xC0, y11, monospaced, bold, pz) ANCHOR(BOTTOMRIGHT, XSHIFT, YSHIFT) COLOURED(255, 255, 255, 255)
DRAWTEXT("richmondhillcm.com", xC0, y12, monospaced, bold, 9) ANCHOR(BOTTOMRIGHT, XSHIFT, YSHIFT) COLOURED(160, 163, 172, 255)
DRAWTEXT("RichmondHillCM", xC1, y12, monospaced, bold, 9) ANCHOR(BOTTOMRIGHT, XSHIFT, YSHIFT) COLOURED(160, 163, 172, 255)
IF vOk = 1 THEN
DRAWTEXT("#pU3#", xC1, y1, monospaced, bold, pz) ANCHOR(BOTTOMRIGHT, XSHIFT, YSHIFT) COLOURED(242, 54, 69, 255)
DRAWTEXT("#pU2#", xC1, y2, monospaced, bold, pz) ANCHOR(BOTTOMRIGHT, XSHIFT, YSHIFT) COLOURED(242, 54, 69, 255)
DRAWTEXT("#pU1#", xC1, y3, monospaced, bold, pz) ANCHOR(BOTTOMRIGHT, XSHIFT, YSHIFT) COLOURED(242, 54, 69, 255)
DRAWTEXT("#pVw#", xC1, y4, monospaced, bold, pz) ANCHOR(BOTTOMRIGHT, XSHIFT, YSHIFT) COLOURED(0, 188, 212, 255)
DRAWTEXT("#pL1#", xC1, y5, monospaced, bold, pz) ANCHOR(BOTTOMRIGHT, XSHIFT, YSHIFT) COLOURED(76, 175, 80, 255)
DRAWTEXT("#pL2#", xC1, y6, monospaced, bold, pz) ANCHOR(BOTTOMRIGHT, XSHIFT, YSHIFT) COLOURED(76, 175, 80, 255)
DRAWTEXT("#pL3#", xC1, y7, monospaced, bold, pz) ANCHOR(BOTTOMRIGHT, XSHIFT, YSHIFT) COLOURED(76, 175, 80, 255)
ELSE
DRAWTEXT("—", xC1, y1, monospaced, bold, pz) ANCHOR(BOTTOMRIGHT, XSHIFT, YSHIFT) COLOURED(242, 54, 69, 255)
DRAWTEXT("—", xC1, y2, monospaced, bold, pz) ANCHOR(BOTTOMRIGHT, XSHIFT, YSHIFT) COLOURED(242, 54, 69, 255)
DRAWTEXT("—", xC1, y3, monospaced, bold, pz) ANCHOR(BOTTOMRIGHT, XSHIFT, YSHIFT) COLOURED(242, 54, 69, 255)
DRAWTEXT("—", xC1, y4, monospaced, bold, pz) ANCHOR(BOTTOMRIGHT, XSHIFT, YSHIFT) COLOURED(0, 188, 212, 255)
DRAWTEXT("—", xC1, y5, monospaced, bold, pz) ANCHOR(BOTTOMRIGHT, XSHIFT, YSHIFT) COLOURED(76, 175, 80, 255)
DRAWTEXT("—", xC1, y6, monospaced, bold, pz) ANCHOR(BOTTOMRIGHT, XSHIFT, YSHIFT) COLOURED(76, 175, 80, 255)
DRAWTEXT("—", xC1, y7, monospaced, bold, pz) ANCHOR(BOTTOMRIGHT, XSHIFT, YSHIFT) COLOURED(76, 175, 80, 255)
ENDIF
IF vwapZone = 0 THEN
DRAWTEXT("—", xC1, y8, monospaced, bold, pz) ANCHOR(BOTTOMRIGHT, XSHIFT, YSHIFT) COLOURED(zR, zG, zB, 255)
ELSIF vwapZone = 1 THEN
DRAWTEXT("Above Upper", xC1, y8, monospaced, bold, pz) ANCHOR(BOTTOMRIGHT, XSHIFT, YSHIFT) COLOURED(zR, zG, zB, 255)
ELSIF vwapZone = 2 THEN
DRAWTEXT("Below Lower", xC1, y8, monospaced, bold, pz) ANCHOR(BOTTOMRIGHT, XSHIFT, YSHIFT) COLOURED(zR, zG, zB, 255)
ELSIF vwapZone = 3 THEN
DRAWTEXT("Upper Half", xC1, y8, monospaced, bold, pz) ANCHOR(BOTTOMRIGHT, XSHIFT, YSHIFT) COLOURED(zR, zG, zB, 255)
ELSE
DRAWTEXT("Lower Half", xC1, y8, monospaced, bold, pz) ANCHOR(BOTTOMRIGHT, XSHIFT, YSHIFT) COLOURED(zR, zG, zB, 255)
ENDIF
IF vrOk = 1 THEN
DRAWTEXT("#vrT#x", xC1, y9, monospaced, bold, pz) ANCHOR(BOTTOMRIGHT, XSHIFT, YSHIFT) COLOURED(rR, rG, rB, 255)
ELSE
DRAWTEXT("—", xC1, y9, monospaced, bold, pz) ANCHOR(BOTTOMRIGHT, XSHIFT, YSHIFT) COLOURED(rR, rG, rB, 255)
ENDIF
IF spikeUp = 1 THEN
DRAWTEXT("BULLISH ▲", xC1, y10, monospaced, bold, pz) ANCHOR(BOTTOMRIGHT, XSHIFT, YSHIFT) COLOURED(76, 175, 80, 255)
ELSIF spikeDn = 1 THEN
DRAWTEXT("BEARISH ▼", xC1, y10, monospaced, bold, pz) ANCHOR(BOTTOMRIGHT, XSHIFT, YSHIFT) COLOURED(242, 54, 69, 255)
ELSIF volSpike = 1 THEN
DRAWTEXT("SPIKE", xC1, y10, monospaced, bold, pz) ANCHOR(BOTTOMRIGHT, XSHIFT, YSHIFT) COLOURED(255, 152, 0, 255)
ELSE
DRAWTEXT("None", xC1, y10, monospaced, bold, pz) ANCHOR(BOTTOMRIGHT, XSHIFT, YSHIFT) COLOURED(160, 163, 172, 255)
ENDIF
DRAWTEXT("#cntUp#/ #cntDn#", xC1, y11, monospaced, bold, pz) ANCHOR(BOTTOMRIGHT, XSHIFT, YSHIFT) COLOURED(255, 255, 255, 255)
ELSE
// panel background (opaque: a transparent dark table turns grey on a light chart),
// label column and blue header row
DRAWRECTANGLE(pL, pT, pL + pW, pT - pH) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) COLOURED(80, 84, 96, 255) FILLCOLOR(54, 58, 69, 255)
DRAWRECTANGLE(pL, pT - rowH, pL + col0W, pT - pH) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) COLOURED(80, 84, 96, 255) FILLCOLOR(77, 81, 92, 255)
DRAWRECTANGLE(pL, pT, pL + pW, pT - rowH) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) COLOURED(41, 98, 255, 255) FILLCOLOR(41, 98, 255, 255)
DRAWTEXT("VWAP + VOL SPIKE", xC0, y0, monospaced, bold, pz) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) COLOURED(255, 255, 255, 255)
IF tfSec < 60 THEN
DRAWTEXT("#tfS#S", xC1, y0, monospaced, bold, pz) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) COLOURED(255, 255, 255, 255)
ELSIF tfSec < 86400 THEN
DRAWTEXT("#tfM#", xC1, y0, monospaced, bold, pz) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) COLOURED(255, 255, 255, 255)
ELSIF tfSec < 604800 THEN
DRAWTEXT("#tfD#D", xC1, y0, monospaced, bold, pz) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) COLOURED(255, 255, 255, 255)
ELSIF tfSec < 2419200 THEN
DRAWTEXT("#tfW#W", xC1, y0, monospaced, bold, pz) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) COLOURED(255, 255, 255, 255)
ELSE
DRAWTEXT("1M", xC1, y0, monospaced, bold, pz) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) COLOURED(255, 255, 255, 255)
ENDIF
DRAWTEXT("VWAP +3σ", xC0, y1, monospaced, bold, pz) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) COLOURED(255, 255, 255, 255)
DRAWTEXT("VWAP +2σ", xC0, y2, monospaced, bold, pz) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) COLOURED(255, 255, 255, 255)
DRAWTEXT("VWAP +1σ", xC0, y3, monospaced, bold, pz) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) COLOURED(255, 255, 255, 255)
DRAWTEXT("Monthly VWAP", xC0, y4, monospaced, bold, pz) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) COLOURED(255, 255, 255, 255)
DRAWTEXT("VWAP −1σ", xC0, y5, monospaced, bold, pz) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) COLOURED(255, 255, 255, 255)
DRAWTEXT("VWAP −2σ", xC0, y6, monospaced, bold, pz) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) COLOURED(255, 255, 255, 255)
DRAWTEXT("VWAP −3σ (buy)", xC0, y7, monospaced, bold, pz) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) COLOURED(255, 255, 255, 255)
DRAWTEXT("VWAP Zone", xC0, y8, monospaced, bold, pz) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) COLOURED(255, 255, 255, 255)
DRAWTEXT("Vol vs Avg", xC0, y9, monospaced, bold, pz) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) COLOURED(255, 255, 255, 255)
DRAWTEXT("Spike Now", xC0, y10, monospaced, bold, pz) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) COLOURED(255, 255, 255, 255)
DRAWTEXT("Up ▲ / Down ▼", xC0, y11, monospaced, bold, pz) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) COLOURED(255, 255, 255, 255)
DRAWTEXT("richmondhillcm.com", xC0, y12, monospaced, bold, 9) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) COLOURED(160, 163, 172, 255)
DRAWTEXT("RichmondHillCM", xC1, y12, monospaced, bold, 9) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) COLOURED(160, 163, 172, 255)
IF vOk = 1 THEN
DRAWTEXT("#pU3#", xC1, y1, monospaced, bold, pz) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) COLOURED(242, 54, 69, 255)
DRAWTEXT("#pU2#", xC1, y2, monospaced, bold, pz) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) COLOURED(242, 54, 69, 255)
DRAWTEXT("#pU1#", xC1, y3, monospaced, bold, pz) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) COLOURED(242, 54, 69, 255)
DRAWTEXT("#pVw#", xC1, y4, monospaced, bold, pz) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) COLOURED(0, 188, 212, 255)
DRAWTEXT("#pL1#", xC1, y5, monospaced, bold, pz) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) COLOURED(76, 175, 80, 255)
DRAWTEXT("#pL2#", xC1, y6, monospaced, bold, pz) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) COLOURED(76, 175, 80, 255)
DRAWTEXT("#pL3#", xC1, y7, monospaced, bold, pz) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) COLOURED(76, 175, 80, 255)
ELSE
DRAWTEXT("—", xC1, y1, monospaced, bold, pz) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) COLOURED(242, 54, 69, 255)
DRAWTEXT("—", xC1, y2, monospaced, bold, pz) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) COLOURED(242, 54, 69, 255)
DRAWTEXT("—", xC1, y3, monospaced, bold, pz) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) COLOURED(242, 54, 69, 255)
DRAWTEXT("—", xC1, y4, monospaced, bold, pz) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) COLOURED(0, 188, 212, 255)
DRAWTEXT("—", xC1, y5, monospaced, bold, pz) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) COLOURED(76, 175, 80, 255)
DRAWTEXT("—", xC1, y6, monospaced, bold, pz) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) COLOURED(76, 175, 80, 255)
DRAWTEXT("—", xC1, y7, monospaced, bold, pz) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) COLOURED(76, 175, 80, 255)
ENDIF
IF vwapZone = 0 THEN
DRAWTEXT("—", xC1, y8, monospaced, bold, pz) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) COLOURED(zR, zG, zB, 255)
ELSIF vwapZone = 1 THEN
DRAWTEXT("Above Upper", xC1, y8, monospaced, bold, pz) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) COLOURED(zR, zG, zB, 255)
ELSIF vwapZone = 2 THEN
DRAWTEXT("Below Lower", xC1, y8, monospaced, bold, pz) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) COLOURED(zR, zG, zB, 255)
ELSIF vwapZone = 3 THEN
DRAWTEXT("Upper Half", xC1, y8, monospaced, bold, pz) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) COLOURED(zR, zG, zB, 255)
ELSE
DRAWTEXT("Lower Half", xC1, y8, monospaced, bold, pz) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) COLOURED(zR, zG, zB, 255)
ENDIF
IF vrOk = 1 THEN
DRAWTEXT("#vrT#x", xC1, y9, monospaced, bold, pz) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) COLOURED(rR, rG, rB, 255)
ELSE
DRAWTEXT("—", xC1, y9, monospaced, bold, pz) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) COLOURED(rR, rG, rB, 255)
ENDIF
IF spikeUp = 1 THEN
DRAWTEXT("BULLISH ▲", xC1, y10, monospaced, bold, pz) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) COLOURED(76, 175, 80, 255)
ELSIF spikeDn = 1 THEN
DRAWTEXT("BEARISH ▼", xC1, y10, monospaced, bold, pz) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) COLOURED(242, 54, 69, 255)
ELSIF volSpike = 1 THEN
DRAWTEXT("SPIKE", xC1, y10, monospaced, bold, pz) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) COLOURED(255, 152, 0, 255)
ELSE
DRAWTEXT("None", xC1, y10, monospaced, bold, pz) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) COLOURED(160, 163, 172, 255)
ENDIF
DRAWTEXT("#cntUp#/ #cntDn#", xC1, y11, monospaced, bold, pz) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) COLOURED(255, 255, 255, 255)
ENDIF
ENDIF
ENDIF
RETURN vwapV COLOURED(8, 153, 129, vwapA) STYLE(line, 2) AS "Monthly VWAP", vwapUpper COLOURED(8, 153, 129, bandA) STYLE(line, 1) AS "VWAP Upper", vwapLower COLOURED(8, 153, 129, bandA) STYLE(line, 1) AS "VWAP Lower"
Original author: RichmondHillCM, published open source.