A sharp move on thin volume and a sharp move on heavy, two-sided trading look the same on a classic momentum oscillator. They are not the same: the first is fragile and often reverses, the second has real participation behind it.
The Participation-Adjusted Momentum oscillator by TradeDots (TD-PAM) starts from a standardised rate of change and scales it by the quality of the participation behind each bar. Strong readings only stay strong when volume, the location of the close and the efficiency of the fills confirm them. Every bar is also classified into one of five states, shown by colour.
Raw momentum is the 14-bar rate of change turned into a z-score over the last 100 bars: how many standard deviations today’s change is above or below its recent average. This makes the readings comparable across instruments and timeframes.
Participation combines two things:
Participation is the volume percentile multiplied by that alignment, from 0 to 1.
Range efficiency measures how much the bar travelled per unit of volume. A wide bar on little volume means thin fills; a narrow range on heavy volume means thick, absorbed trading. It is ranked against the last 100 bars and inverted, so thicker fills score higher.
The quality blend is 0.4 x participation + 0.4 x range efficiency + 0.2, and the adjusted momentum is the raw z-score multiplied by it. A move with poor participation is shrunk; a move with strong participation keeps most of its size.
The first 113 bars are a warm-up while the z-score window fills; nothing is drawn before that.
//---------------------------------------------------------------
// PRC_Participation Momentum
// version = 0
// 06.11.2026
// Iván González @ www.prorealcode.com
// Author: TradeDots
// Sharing ProRealTime knowledge
//--------------------------------------------------------------------//
// Participation-Adjusted Momentum (TD-PAM)
// Momentum is more trustworthy when participation confirms it. The
// standardised ROC is weighted by the volume percentile, the position
// of the close in the bar and the range-per-volume efficiency.
// States: green = strong bull, red = strong bear, orange = momentum
// without volume, blue = quiet accumulation, grey = noisy.
//--------------------------------------------------------------------//
defparam drawonlastbaronly = true
// ===================== INPUTS =====================
// --- Core settings ---
momoLen = 14 // ROC length
normLen = 100 // percentile / z-score lookback
strongZ = 1.0 // strong momentum: |z| at or above this level
quietMaxZ = 0.5 // quiet accumulation: |z| at or below this level
quietVolMin = 60 // quiet accumulation: minimum volume percentile
// --- Visual settings ---
showZero = 1 // 1 = solid zero line, 0 = dotted
showBands = 1 // 1 = show the +1 / -1 sigma bands
showRaw = 0 // 1 = show the raw momentum (z-score) line
showDash = 1 // 1 = show the dashboard
dashPos = 2 // 1 = top left, 2 = top right, 3 = bottom left, 4 = bottom right
panelSize = 3 // 1 = tiny, 2 = small, 3 = normal, 4 = large
// Colours (bull, bear, thin, quiet, noisy)
buR = 156
buG = 255
buB = 135
beR = 249
beG = 57
beB = 106
thR = 255
thG = 102
thB = 51
quR = 0
quG = 119
quB = 182
noR = 120
noG = 123
noB = 134
// ===================== CORE COMPUTATIONS =====================
// Raw momentum: rate of change standardised as a z-score over normLen bars
IF barindex >= momoLen THEN
rocV = 100 * (close - close[momoLen]) / close[momoLen]
ELSE
rocV = 0
ENDIF
warmZ = momoLen + normLen - 1
IF barindex >= warmZ THEN
mZ = average[normLen](rocV)
sZ = std[normLen](rocV)
IF sZ = 0 THEN
rawMomo = 0
ELSE
rawMomo = (rocV - mZ) / sZ
ENDIF
zOk = 1
ELSE
rawMomo = 0
zOk = 0
ENDIF
// Close location in the bar (0..100)
barRng = high - low
IF barRng = 0 THEN
clv = 50
ELSE
clv = (close - low) / barRng * 100
ENDIF
// Range per unit of volume: a wide bar on little volume = thin fills
rangePerVol = barRng / max(volume, 1)
// Every bar stores its volume and range per volume (pure assignment: same value on every tick)
$volA[barindex] = volume
$rpvA[barindex] = rangePerVol
// Percentile ranks (0..100): share of the previous normLen values lower than or equal to the current one
IF barindex >= normLen THEN
cntV = 0
cntR = 0
FOR k = 1 TO normLen DO
jb = barindex - k
IF $volA[jb] <= volume THEN
cntV = cntV + 1
ENDIF
IF $rpvA[jb] <= rangePerVol THEN
cntR = cntR + 1
ENDIF
NEXT
volPct = cntV * 100 / normLen
rangeEffPct = cntR * 100 / normLen
ELSE
// no rank yet: the volume percentile defaults to 50
volPct = 50
rangeEffPct = 50
ENDIF
rangeEffScore = (100 - rangeEffPct) / 100
// Participation = volume percentile x close location aligned with the direction
IF rawMomo > 0 THEN
dirNow = 1
participation = (volPct / 100) * (clv / 100)
ELSIF rawMomo < 0 THEN
dirNow = 0 - 1
participation = (volPct / 100) * ((100 - clv) / 100)
ELSE
dirNow = 0
participation = (volPct / 100) * 0.5
ENDIF
// Adjusted momentum
qualityBlend = 0.4 * participation + 0.4 * rangeEffScore + 0.2
adjMomo = rawMomo * qualityBlend
// ===================== STATE CLASSIFICATION =====================
strongBull = 0
strongBear = 0
thinMomo = 0
quietAccum = 0
IF zOk = 1 THEN
IF rawMomo >= strongZ AND participation >= 0.55 THEN
strongBull = 1
ENDIF
IF rawMomo <= 0 - strongZ AND participation >= 0.55 THEN
strongBear = 1
ENDIF
IF abs(rawMomo) >= strongZ AND participation < 0.35 THEN
thinMomo = 1
ENDIF
IF abs(rawMomo) <= quietMaxZ AND volPct >= quietVolMin THEN
quietAccum = 1
ENDIF
ENDIF
// stateCode: 1 = Strong Bull, 2 = Strong Bear, 3 = Thin, 4 = Quiet Accumulation, 0 = Noisy
IF strongBull = 1 THEN
stateCode = 1
sR = buR
sG = buG
sB = buB
sA = 255
ELSIF strongBear = 1 THEN
stateCode = 2
sR = beR
sG = beG
sB = beB
sA = 255
ELSIF thinMomo = 1 THEN
stateCode = 3
sR = thR
sG = thG
sB = thB
sA = 255
ELSIF quietAccum = 1 THEN
stateCode = 4
sR = quR
sG = quG
sB = quB
sA = 255
ELSE
stateCode = 0
sR = noR
sG = noG
sB = noB
sA = 128
ENDIF
histA = round(sA * 0.75)
// Alert feeds: 1 on the bar where a state starts
alBull = (strongBull = 1 AND strongBull[1] = 0)
alBear = (strongBear = 1 AND strongBear[1] = 0)
alQuiet = (quietAccum = 1 AND quietAccum[1] = 0)
alThin = (thinMomo = 1 AND thinMomo[1] = 0)
// ===================== VISUALS =====================
IF barindex < warmZ THEN
adjPlot = undefined
rawPlot = undefined
ELSE
adjPlot = adjMomo
rawPlot = rawMomo
ENDIF
IF showRaw = 1 THEN
rawA = 128
ELSE
rawA = 0
ENDIF
IF showZero = 1 THEN
zeroSolA = 102
zeroDotA = 0
ELSE
zeroSolA = 0
zeroDotA = 102
ENDIF
IF showBands = 1 THEN
bandA = 77
ELSE
bandA = 0
ENDIF
lvMinus = 0 - 1
// ===================== DASHBOARD =====================
IF islastbarupdate AND showDash = 1 THEN
// Values shown in the dashboard
rawR = round(rawMomo * 100) / 100
adjR = round(adjMomo * 100) / 100
volR = round(volPct)
parR = round(participation * 100) / 100
effR = round(rangeEffScore * 100) / 100
qbR = round(qualityBlend * 100) / 100
// Cell colours: state, gradients from bear to bull over -2..+2, threshold cells
IF stateCode = 1 THEN
c0R = buR
c0G = buG
c0B = buB
c0A = 217
ELSIF stateCode = 2 THEN
c0R = beR
c0G = beG
c0B = beB
c0A = 217
ELSIF stateCode = 3 THEN
c0R = thR
c0G = thG
c0B = thB
c0A = 191
ELSIF stateCode = 4 THEN
c0R = quR
c0G = quG
c0B = quB
c0A = 179
ELSE
c0R = noR
c0G = noG
c0B = noB
c0A = 64
ENDIF
t1 = max(0, min(1, (rawMomo + 2) / 4))
c1R = beR + (buR - beR) * t1
c1G = beG + (buG - beG) * t1
c1B = beB + (buB - beB) * t1
t2 = max(0, min(1, (adjMomo + 2) / 4))
c2R = beR + (buR - beR) * t2
c2G = beG + (buG - beG) * t2
c2B = beB + (buB - beB) * t2
IF volPct >= 70 THEN
c3R = buR
c3G = buG
c3B = buB
c3A = 191
ELSIF volPct >= 40 THEN
c3R = thR
c3G = thG
c3B = thB
c3A = 179
ELSE
c3R = beR
c3G = beG
c3B = beB
c3A = 179
ENDIF
IF participation >= 0.5 THEN
c4R = buR
c4G = buG
c4B = buB
c4A = 191
ELSE
c4R = thR
c4G = thG
c4B = thB
c4A = 179
ENDIF
IF rangeEffScore >= 0.5 THEN
c5R = buR
c5G = buG
c5B = buB
c5A = 191
ELSE
c5R = beR
c5G = beG
c5B = beB
c5A = 179
ENDIF
IF qualityBlend >= 0.6 THEN
c6R = buR
c6G = buG
c6B = buB
c6A = 191
ELSE
c6R = thR
c6G = thG
c6B = thB
c6A = 179
ENDIF
// Text geometry: a monospaced font, so every character is chW pixels wide
IF panelSize = 1 THEN
pz = 8
ELSIF panelSize = 2 THEN
pz = 9
ELSIF panelSize = 4 THEN
pz = 14
ELSE
pz = 11
ENDIF
chW = pz * 0.62
rowH = pz + 8
padX = 8
padY = 4
// Two columns: names (22 characters at most) and values (24), the values in a coloured cell
pW = 49 * chW + 2 * padX
pH = 7 * rowH + 2 * padY
// The dashboard sits in its corner, clear of the price scale on the right and, on the left, of the
// panel's legend (top) and of the platform's mark (bottom)
IF dashPos = 1 THEN
pL = 10
pT = 0 - 40
ELSIF dashPos = 3 THEN
pL = 10
pT = 40 + pH
ELSIF dashPos = 4 THEN
pL = 0 - 85 - pW
pT = 12 + pH
ELSE
pL = 0 - 85 - pW
pT = 0 - 12
ENDIF
cL = pL + padX + 23 * chW
cR = pL + pW - padX
xVal = (cL + cR) / 2
yR0 = pT - padY - rowH * 0.5
yR1 = pT - padY - rowH * 1.5
yR2 = pT - padY - rowH * 2.5
yR3 = pT - padY - rowH * 3.5
yR4 = pT - padY - rowH * 4.5
yR5 = pT - padY - rowH * 5.5
yR6 = pT - padY - rowH * 6.5
yT0 = pT - padY - 1
yT1 = pT - padY - rowH - 1
yT2 = pT - padY - rowH * 2 - 1
yT3 = pT - padY - rowH * 3 - 1
yT4 = pT - padY - rowH * 4 - 1
yT5 = pT - padY - rowH * 5 - 1
yT6 = pT - padY - rowH * 6 - 1
yHd = pT - padY - rowH
// Names aligned left: each one centred on half its own length
xN0 = pL + padX + 22 * chW / 2
xN1 = pL + padX + 12 * chW / 2
xN2 = pL + padX + 13 * chW / 2
xN3 = pL + padX + 10 * chW / 2
xN4 = pL + padX + 13 * chW / 2
xN5 = pL + padX + 16 * chW / 2
xN6 = pL + padX + 13 * chW / 2
IF dashPos = 1 THEN
DRAWRECTANGLE(pL, pT, pL + pW, pT - pH) ANCHOR(TOPLEFT, XSHIFT, YSHIFT) COLOURED(120, 123, 134, 128) FILLCOLOR(120, 123, 134, 38)
DRAWRECTANGLE(pL, pT, pL + pW, yHd - padY) ANCHOR(TOPLEFT, XSHIFT, YSHIFT) COLOURED(120, 123, 134, 128) FILLCOLOR(120, 123, 134, 64)
DRAWRECTANGLE(cL, yT0, cR, yT0 - rowH + 2) ANCHOR(TOPLEFT, XSHIFT, YSHIFT) COLOURED(c0R, c0G, c0B, 0) FILLCOLOR(c0R, c0G, c0B, c0A)
DRAWRECTANGLE(cL, yT1, cR, yT1 - rowH + 2) ANCHOR(TOPLEFT, XSHIFT, YSHIFT) COLOURED(c1R, c1G, c1B, 0) FILLCOLOR(c1R, c1G, c1B, 217)
DRAWRECTANGLE(cL, yT2, cR, yT2 - rowH + 2) ANCHOR(TOPLEFT, XSHIFT, YSHIFT) COLOURED(c2R, c2G, c2B, 0) FILLCOLOR(c2R, c2G, c2B, 217)
DRAWRECTANGLE(cL, yT3, cR, yT3 - rowH + 2) ANCHOR(TOPLEFT, XSHIFT, YSHIFT) COLOURED(c3R, c3G, c3B, 0) FILLCOLOR(c3R, c3G, c3B, c3A)
DRAWRECTANGLE(cL, yT4, cR, yT4 - rowH + 2) ANCHOR(TOPLEFT, XSHIFT, YSHIFT) COLOURED(c4R, c4G, c4B, 0) FILLCOLOR(c4R, c4G, c4B, c4A)
DRAWRECTANGLE(cL, yT5, cR, yT5 - rowH + 2) ANCHOR(TOPLEFT, XSHIFT, YSHIFT) COLOURED(c5R, c5G, c5B, 0) FILLCOLOR(c5R, c5G, c5B, c5A)
DRAWRECTANGLE(cL, yT6, cR, yT6 - rowH + 2) ANCHOR(TOPLEFT, XSHIFT, YSHIFT) COLOURED(c6R, c6G, c6B, 0) FILLCOLOR(c6R, c6G, c6B, c6A)
DRAWTEXT("TD-PAM - Participation", xN0, yR0, monospaced, bold, pz) ANCHOR(TOPLEFT, XSHIFT, YSHIFT) COLOURED(0, 0, 0, 255)
IF stateCode = 1 THEN
DRAWTEXT("Strong Bull", xVal, yR0, monospaced, bold, pz) ANCHOR(TOPLEFT, XSHIFT, YSHIFT) COLOURED(32, 70, 52, 255)
ELSIF stateCode = 2 THEN
DRAWTEXT("Strong Bear", xVal, yR0, monospaced, bold, pz) ANCHOR(TOPLEFT, XSHIFT, YSHIFT) COLOURED(27, 27, 27, 255)
ELSIF stateCode = 3 THEN
DRAWTEXT("Thin (low participation)", xVal, yR0, monospaced, bold, pz) ANCHOR(TOPLEFT, XSHIFT, YSHIFT) COLOURED(27, 27, 27, 255)
ELSIF stateCode = 4 THEN
DRAWTEXT("Quiet Accumulation", xVal, yR0, monospaced, bold, pz) ANCHOR(TOPLEFT, XSHIFT, YSHIFT) COLOURED(27, 27, 27, 255)
ELSE
DRAWTEXT("Noisy / Low Quality", xVal, yR0, monospaced, bold, pz) ANCHOR(TOPLEFT, XSHIFT, YSHIFT) COLOURED(27, 27, 27, 255)
ENDIF
DRAWTEXT("Raw Momo (z)", xN1, yR1, monospaced, standard, pz) ANCHOR(TOPLEFT, XSHIFT, YSHIFT) COLOURED(100, 106, 120, 255)
DRAWTEXT("#rawR#", xVal, yR1, monospaced, standard, pz) ANCHOR(TOPLEFT, XSHIFT, YSHIFT) COLOURED(27, 27, 27, 255)
DRAWTEXT("Adjusted Momo", xN2, yR2, monospaced, standard, pz) ANCHOR(TOPLEFT, XSHIFT, YSHIFT) COLOURED(100, 106, 120, 255)
DRAWTEXT("#adjR#", xVal, yR2, monospaced, standard, pz) ANCHOR(TOPLEFT, XSHIFT, YSHIFT) COLOURED(27, 27, 27, 255)
DRAWTEXT("Volume Pct", xN3, yR3, monospaced, standard, pz) ANCHOR(TOPLEFT, XSHIFT, YSHIFT) COLOURED(100, 106, 120, 255)
DRAWTEXT("#volR#%", xVal, yR3, monospaced, standard, pz) ANCHOR(TOPLEFT, XSHIFT, YSHIFT) COLOURED(27, 27, 27, 255)
DRAWTEXT("Participation", xN4, yR4, monospaced, standard, pz) ANCHOR(TOPLEFT, XSHIFT, YSHIFT) COLOURED(100, 106, 120, 255)
DRAWTEXT("#parR#", xVal, yR4, monospaced, standard, pz) ANCHOR(TOPLEFT, XSHIFT, YSHIFT) COLOURED(27, 27, 27, 255)
DRAWTEXT("Range Efficiency", xN5, yR5, monospaced, standard, pz) ANCHOR(TOPLEFT, XSHIFT, YSHIFT) COLOURED(100, 106, 120, 255)
DRAWTEXT("#effR#", xVal, yR5, monospaced, standard, pz) ANCHOR(TOPLEFT, XSHIFT, YSHIFT) COLOURED(27, 27, 27, 255)
DRAWTEXT("Quality Blend", xN6, yR6, monospaced, standard, pz) ANCHOR(TOPLEFT, XSHIFT, YSHIFT) COLOURED(100, 106, 120, 255)
DRAWTEXT("#qbR#", xVal, yR6, monospaced, standard, pz) ANCHOR(TOPLEFT, XSHIFT, YSHIFT) COLOURED(27, 27, 27, 255)
ENDIF
IF dashPos = 2 THEN
DRAWRECTANGLE(pL, pT, pL + pW, pT - pH) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) COLOURED(120, 123, 134, 128) FILLCOLOR(120, 123, 134, 38)
DRAWRECTANGLE(pL, pT, pL + pW, yHd - padY) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) COLOURED(120, 123, 134, 128) FILLCOLOR(120, 123, 134, 64)
DRAWRECTANGLE(cL, yT0, cR, yT0 - rowH + 2) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) COLOURED(c0R, c0G, c0B, 0) FILLCOLOR(c0R, c0G, c0B, c0A)
DRAWRECTANGLE(cL, yT1, cR, yT1 - rowH + 2) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) COLOURED(c1R, c1G, c1B, 0) FILLCOLOR(c1R, c1G, c1B, 217)
DRAWRECTANGLE(cL, yT2, cR, yT2 - rowH + 2) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) COLOURED(c2R, c2G, c2B, 0) FILLCOLOR(c2R, c2G, c2B, 217)
DRAWRECTANGLE(cL, yT3, cR, yT3 - rowH + 2) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) COLOURED(c3R, c3G, c3B, 0) FILLCOLOR(c3R, c3G, c3B, c3A)
DRAWRECTANGLE(cL, yT4, cR, yT4 - rowH + 2) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) COLOURED(c4R, c4G, c4B, 0) FILLCOLOR(c4R, c4G, c4B, c4A)
DRAWRECTANGLE(cL, yT5, cR, yT5 - rowH + 2) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) COLOURED(c5R, c5G, c5B, 0) FILLCOLOR(c5R, c5G, c5B, c5A)
DRAWRECTANGLE(cL, yT6, cR, yT6 - rowH + 2) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) COLOURED(c6R, c6G, c6B, 0) FILLCOLOR(c6R, c6G, c6B, c6A)
DRAWTEXT("TD-PAM - Participation", xN0, yR0, monospaced, bold, pz) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) COLOURED(0, 0, 0, 255)
IF stateCode = 1 THEN
DRAWTEXT("Strong Bull", xVal, yR0, monospaced, bold, pz) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) COLOURED(32, 70, 52, 255)
ELSIF stateCode = 2 THEN
DRAWTEXT("Strong Bear", xVal, yR0, monospaced, bold, pz) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) COLOURED(27, 27, 27, 255)
ELSIF stateCode = 3 THEN
DRAWTEXT("Thin (low participation)", xVal, yR0, monospaced, bold, pz) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) COLOURED(27, 27, 27, 255)
ELSIF stateCode = 4 THEN
DRAWTEXT("Quiet Accumulation", xVal, yR0, monospaced, bold, pz) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) COLOURED(27, 27, 27, 255)
ELSE
DRAWTEXT("Noisy / Low Quality", xVal, yR0, monospaced, bold, pz) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) COLOURED(27, 27, 27, 255)
ENDIF
DRAWTEXT("Raw Momo (z)", xN1, yR1, monospaced, standard, pz) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) COLOURED(100, 106, 120, 255)
DRAWTEXT("#rawR#", xVal, yR1, monospaced, standard, pz) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) COLOURED(27, 27, 27, 255)
DRAWTEXT("Adjusted Momo", xN2, yR2, monospaced, standard, pz) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) COLOURED(100, 106, 120, 255)
DRAWTEXT("#adjR#", xVal, yR2, monospaced, standard, pz) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) COLOURED(27, 27, 27, 255)
DRAWTEXT("Volume Pct", xN3, yR3, monospaced, standard, pz) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) COLOURED(100, 106, 120, 255)
DRAWTEXT("#volR#%", xVal, yR3, monospaced, standard, pz) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) COLOURED(27, 27, 27, 255)
DRAWTEXT("Participation", xN4, yR4, monospaced, standard, pz) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) COLOURED(100, 106, 120, 255)
DRAWTEXT("#parR#", xVal, yR4, monospaced, standard, pz) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) COLOURED(27, 27, 27, 255)
DRAWTEXT("Range Efficiency", xN5, yR5, monospaced, standard, pz) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) COLOURED(100, 106, 120, 255)
DRAWTEXT("#effR#", xVal, yR5, monospaced, standard, pz) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) COLOURED(27, 27, 27, 255)
DRAWTEXT("Quality Blend", xN6, yR6, monospaced, standard, pz) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) COLOURED(100, 106, 120, 255)
DRAWTEXT("#qbR#", xVal, yR6, monospaced, standard, pz) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) COLOURED(27, 27, 27, 255)
ENDIF
IF dashPos = 3 THEN
DRAWRECTANGLE(pL, pT, pL + pW, pT - pH) ANCHOR(BOTTOMLEFT, XSHIFT, YSHIFT) COLOURED(120, 123, 134, 128) FILLCOLOR(120, 123, 134, 38)
DRAWRECTANGLE(pL, pT, pL + pW, yHd - padY) ANCHOR(BOTTOMLEFT, XSHIFT, YSHIFT) COLOURED(120, 123, 134, 128) FILLCOLOR(120, 123, 134, 64)
DRAWRECTANGLE(cL, yT0, cR, yT0 - rowH + 2) ANCHOR(BOTTOMLEFT, XSHIFT, YSHIFT) COLOURED(c0R, c0G, c0B, 0) FILLCOLOR(c0R, c0G, c0B, c0A)
DRAWRECTANGLE(cL, yT1, cR, yT1 - rowH + 2) ANCHOR(BOTTOMLEFT, XSHIFT, YSHIFT) COLOURED(c1R, c1G, c1B, 0) FILLCOLOR(c1R, c1G, c1B, 217)
DRAWRECTANGLE(cL, yT2, cR, yT2 - rowH + 2) ANCHOR(BOTTOMLEFT, XSHIFT, YSHIFT) COLOURED(c2R, c2G, c2B, 0) FILLCOLOR(c2R, c2G, c2B, 217)
DRAWRECTANGLE(cL, yT3, cR, yT3 - rowH + 2) ANCHOR(BOTTOMLEFT, XSHIFT, YSHIFT) COLOURED(c3R, c3G, c3B, 0) FILLCOLOR(c3R, c3G, c3B, c3A)
DRAWRECTANGLE(cL, yT4, cR, yT4 - rowH + 2) ANCHOR(BOTTOMLEFT, XSHIFT, YSHIFT) COLOURED(c4R, c4G, c4B, 0) FILLCOLOR(c4R, c4G, c4B, c4A)
DRAWRECTANGLE(cL, yT5, cR, yT5 - rowH + 2) ANCHOR(BOTTOMLEFT, XSHIFT, YSHIFT) COLOURED(c5R, c5G, c5B, 0) FILLCOLOR(c5R, c5G, c5B, c5A)
DRAWRECTANGLE(cL, yT6, cR, yT6 - rowH + 2) ANCHOR(BOTTOMLEFT, XSHIFT, YSHIFT) COLOURED(c6R, c6G, c6B, 0) FILLCOLOR(c6R, c6G, c6B, c6A)
DRAWTEXT("TD-PAM - Participation", xN0, yR0, monospaced, bold, pz) ANCHOR(BOTTOMLEFT, XSHIFT, YSHIFT) COLOURED(0, 0, 0, 255)
IF stateCode = 1 THEN
DRAWTEXT("Strong Bull", xVal, yR0, monospaced, bold, pz) ANCHOR(BOTTOMLEFT, XSHIFT, YSHIFT) COLOURED(32, 70, 52, 255)
ELSIF stateCode = 2 THEN
DRAWTEXT("Strong Bear", xVal, yR0, monospaced, bold, pz) ANCHOR(BOTTOMLEFT, XSHIFT, YSHIFT) COLOURED(27, 27, 27, 255)
ELSIF stateCode = 3 THEN
DRAWTEXT("Thin (low participation)", xVal, yR0, monospaced, bold, pz) ANCHOR(BOTTOMLEFT, XSHIFT, YSHIFT) COLOURED(27, 27, 27, 255)
ELSIF stateCode = 4 THEN
DRAWTEXT("Quiet Accumulation", xVal, yR0, monospaced, bold, pz) ANCHOR(BOTTOMLEFT, XSHIFT, YSHIFT) COLOURED(27, 27, 27, 255)
ELSE
DRAWTEXT("Noisy / Low Quality", xVal, yR0, monospaced, bold, pz) ANCHOR(BOTTOMLEFT, XSHIFT, YSHIFT) COLOURED(27, 27, 27, 255)
ENDIF
DRAWTEXT("Raw Momo (z)", xN1, yR1, monospaced, standard, pz) ANCHOR(BOTTOMLEFT, XSHIFT, YSHIFT) COLOURED(100, 106, 120, 255)
DRAWTEXT("#rawR#", xVal, yR1, monospaced, standard, pz) ANCHOR(BOTTOMLEFT, XSHIFT, YSHIFT) COLOURED(27, 27, 27, 255)
DRAWTEXT("Adjusted Momo", xN2, yR2, monospaced, standard, pz) ANCHOR(BOTTOMLEFT, XSHIFT, YSHIFT) COLOURED(100, 106, 120, 255)
DRAWTEXT("#adjR#", xVal, yR2, monospaced, standard, pz) ANCHOR(BOTTOMLEFT, XSHIFT, YSHIFT) COLOURED(27, 27, 27, 255)
DRAWTEXT("Volume Pct", xN3, yR3, monospaced, standard, pz) ANCHOR(BOTTOMLEFT, XSHIFT, YSHIFT) COLOURED(100, 106, 120, 255)
DRAWTEXT("#volR#%", xVal, yR3, monospaced, standard, pz) ANCHOR(BOTTOMLEFT, XSHIFT, YSHIFT) COLOURED(27, 27, 27, 255)
DRAWTEXT("Participation", xN4, yR4, monospaced, standard, pz) ANCHOR(BOTTOMLEFT, XSHIFT, YSHIFT) COLOURED(100, 106, 120, 255)
DRAWTEXT("#parR#", xVal, yR4, monospaced, standard, pz) ANCHOR(BOTTOMLEFT, XSHIFT, YSHIFT) COLOURED(27, 27, 27, 255)
DRAWTEXT("Range Efficiency", xN5, yR5, monospaced, standard, pz) ANCHOR(BOTTOMLEFT, XSHIFT, YSHIFT) COLOURED(100, 106, 120, 255)
DRAWTEXT("#effR#", xVal, yR5, monospaced, standard, pz) ANCHOR(BOTTOMLEFT, XSHIFT, YSHIFT) COLOURED(27, 27, 27, 255)
DRAWTEXT("Quality Blend", xN6, yR6, monospaced, standard, pz) ANCHOR(BOTTOMLEFT, XSHIFT, YSHIFT) COLOURED(100, 106, 120, 255)
DRAWTEXT("#qbR#", xVal, yR6, monospaced, standard, pz) ANCHOR(BOTTOMLEFT, XSHIFT, YSHIFT) COLOURED(27, 27, 27, 255)
ENDIF
IF dashPos = 4 THEN
DRAWRECTANGLE(pL, pT, pL + pW, pT - pH) ANCHOR(BOTTOMRIGHT, XSHIFT, YSHIFT) COLOURED(120, 123, 134, 128) FILLCOLOR(120, 123, 134, 38)
DRAWRECTANGLE(pL, pT, pL + pW, yHd - padY) ANCHOR(BOTTOMRIGHT, XSHIFT, YSHIFT) COLOURED(120, 123, 134, 128) FILLCOLOR(120, 123, 134, 64)
DRAWRECTANGLE(cL, yT0, cR, yT0 - rowH + 2) ANCHOR(BOTTOMRIGHT, XSHIFT, YSHIFT) COLOURED(c0R, c0G, c0B, 0) FILLCOLOR(c0R, c0G, c0B, c0A)
DRAWRECTANGLE(cL, yT1, cR, yT1 - rowH + 2) ANCHOR(BOTTOMRIGHT, XSHIFT, YSHIFT) COLOURED(c1R, c1G, c1B, 0) FILLCOLOR(c1R, c1G, c1B, 217)
DRAWRECTANGLE(cL, yT2, cR, yT2 - rowH + 2) ANCHOR(BOTTOMRIGHT, XSHIFT, YSHIFT) COLOURED(c2R, c2G, c2B, 0) FILLCOLOR(c2R, c2G, c2B, 217)
DRAWRECTANGLE(cL, yT3, cR, yT3 - rowH + 2) ANCHOR(BOTTOMRIGHT, XSHIFT, YSHIFT) COLOURED(c3R, c3G, c3B, 0) FILLCOLOR(c3R, c3G, c3B, c3A)
DRAWRECTANGLE(cL, yT4, cR, yT4 - rowH + 2) ANCHOR(BOTTOMRIGHT, XSHIFT, YSHIFT) COLOURED(c4R, c4G, c4B, 0) FILLCOLOR(c4R, c4G, c4B, c4A)
DRAWRECTANGLE(cL, yT5, cR, yT5 - rowH + 2) ANCHOR(BOTTOMRIGHT, XSHIFT, YSHIFT) COLOURED(c5R, c5G, c5B, 0) FILLCOLOR(c5R, c5G, c5B, c5A)
DRAWRECTANGLE(cL, yT6, cR, yT6 - rowH + 2) ANCHOR(BOTTOMRIGHT, XSHIFT, YSHIFT) COLOURED(c6R, c6G, c6B, 0) FILLCOLOR(c6R, c6G, c6B, c6A)
DRAWTEXT("TD-PAM - Participation", xN0, yR0, monospaced, bold, pz) ANCHOR(BOTTOMRIGHT, XSHIFT, YSHIFT) COLOURED(0, 0, 0, 255)
IF stateCode = 1 THEN
DRAWTEXT("Strong Bull", xVal, yR0, monospaced, bold, pz) ANCHOR(BOTTOMRIGHT, XSHIFT, YSHIFT) COLOURED(32, 70, 52, 255)
ELSIF stateCode = 2 THEN
DRAWTEXT("Strong Bear", xVal, yR0, monospaced, bold, pz) ANCHOR(BOTTOMRIGHT, XSHIFT, YSHIFT) COLOURED(27, 27, 27, 255)
ELSIF stateCode = 3 THEN
DRAWTEXT("Thin (low participation)", xVal, yR0, monospaced, bold, pz) ANCHOR(BOTTOMRIGHT, XSHIFT, YSHIFT) COLOURED(27, 27, 27, 255)
ELSIF stateCode = 4 THEN
DRAWTEXT("Quiet Accumulation", xVal, yR0, monospaced, bold, pz) ANCHOR(BOTTOMRIGHT, XSHIFT, YSHIFT) COLOURED(27, 27, 27, 255)
ELSE
DRAWTEXT("Noisy / Low Quality", xVal, yR0, monospaced, bold, pz) ANCHOR(BOTTOMRIGHT, XSHIFT, YSHIFT) COLOURED(27, 27, 27, 255)
ENDIF
DRAWTEXT("Raw Momo (z)", xN1, yR1, monospaced, standard, pz) ANCHOR(BOTTOMRIGHT, XSHIFT, YSHIFT) COLOURED(100, 106, 120, 255)
DRAWTEXT("#rawR#", xVal, yR1, monospaced, standard, pz) ANCHOR(BOTTOMRIGHT, XSHIFT, YSHIFT) COLOURED(27, 27, 27, 255)
DRAWTEXT("Adjusted Momo", xN2, yR2, monospaced, standard, pz) ANCHOR(BOTTOMRIGHT, XSHIFT, YSHIFT) COLOURED(100, 106, 120, 255)
DRAWTEXT("#adjR#", xVal, yR2, monospaced, standard, pz) ANCHOR(BOTTOMRIGHT, XSHIFT, YSHIFT) COLOURED(27, 27, 27, 255)
DRAWTEXT("Volume Pct", xN3, yR3, monospaced, standard, pz) ANCHOR(BOTTOMRIGHT, XSHIFT, YSHIFT) COLOURED(100, 106, 120, 255)
DRAWTEXT("#volR#%", xVal, yR3, monospaced, standard, pz) ANCHOR(BOTTOMRIGHT, XSHIFT, YSHIFT) COLOURED(27, 27, 27, 255)
DRAWTEXT("Participation", xN4, yR4, monospaced, standard, pz) ANCHOR(BOTTOMRIGHT, XSHIFT, YSHIFT) COLOURED(100, 106, 120, 255)
DRAWTEXT("#parR#", xVal, yR4, monospaced, standard, pz) ANCHOR(BOTTOMRIGHT, XSHIFT, YSHIFT) COLOURED(27, 27, 27, 255)
DRAWTEXT("Range Efficiency", xN5, yR5, monospaced, standard, pz) ANCHOR(BOTTOMRIGHT, XSHIFT, YSHIFT) COLOURED(100, 106, 120, 255)
DRAWTEXT("#effR#", xVal, yR5, monospaced, standard, pz) ANCHOR(BOTTOMRIGHT, XSHIFT, YSHIFT) COLOURED(27, 27, 27, 255)
DRAWTEXT("Quality Blend", xN6, yR6, monospaced, standard, pz) ANCHOR(BOTTOMRIGHT, XSHIFT, YSHIFT) COLOURED(100, 106, 120, 255)
DRAWTEXT("#qbR#", xVal, yR6, monospaced, standard, pz) ANCHOR(BOTTOMRIGHT, XSHIFT, YSHIFT) COLOURED(27, 27, 27, 255)
ENDIF
ENDIF
RETURN adjPlot COLOURED(sR, sG, sB, histA) STYLE(histogram) AS "Adjusted Momentum", adjPlot COLOURED(sR, sG, sB, sA) STYLE(line, 1) AS "Adjusted Momentum (line)", rawPlot COLOURED(120, 123, 134, rawA) STYLE(line, 1) AS "Raw Momentum (z)", 0 COLOURED(120, 123, 134, zeroSolA) STYLE(line, 1) AS "Zero", 0 COLOURED(120, 123, 134, zeroDotA) STYLE(dottedline, 1) AS "Zero (dotted)", 1 COLOURED(buR, buG, buB, bandA) STYLE(dottedline2, 1) AS "+1 Sigma", lvMinus COLOURED(beR, beG, beB, bandA) STYLE(dottedline2, 1) AS "-1 Sigma", participation COLOURED(120, 123, 134, 0) AS "Participation", dirNow COLOURED(120, 123, 134, 0) AS "Direction", alBull COLOURED(buR, buG, buB, 0) AS "Alert Strong Bull", alBear COLOURED(beR, beG, beB, 0) AS "Alert Strong Bear", alQuiet COLOURED(quR, quG, quB, 0) AS "Alert Quiet Accumulation", alThin COLOURED(thR, thG, thB, 0) AS "Alert Momentum Without Volume"