Qualcosa del genere
//----------------------------------
// PRC_Volume Order Blocks by BigBeluga
//----------------------------------
DEFPARAM DRAWONLASTBARONLY = TRUE
//DEFPARAM CALCULATEONLASTBARS = 500
//----------------------------------
// INPUTS
//----------------------------------
length1 = 5
length2 = length1 + 13
midL = 1 // 1=true, 0=false.
trendShadow = 1 // 1=true, 0=false.
showLastN = 100
showbroken = 1 // 1=true, 0=false.
// highlight origin candle
highlightCandle = 1 // 1=true, 0=false.
hlColorR = 255
hlColorG = 255
hlColorB = 0
// shadow color
col1R = 38
col1G = 186
col1B = 159
col2R = 102
col2G = 38
col2B = 186
// block color
bullColorR = 38
bullColorG = 186
bullColorB = 159
bearColorR = 102
bearColorG = 38
bearColorB = 186
//----------------------------------
// EMA CALCULATION
//----------------------------------
ema1 = exponentialaverage[length1](close)
ema2 = exponentialaverage[length2](close)
crossUp = (ema1 crosses over ema2)
crossDn = (ema1 crosses under ema2)
//----------------------------------
// Shadow
//----------------------------------
difff = ema2 - ema1
IF difff > 0 THEN
colorShadowR = col2R
colorShadowG = col2G
colorShadowB = col2B
ELSE
colorShadowR = col1R
colorShadowG = col1G
colorShadowB = col1B
ENDIF
IF trendShadow THEN
colorbetween(ema1, ema2, colorShadowR, colorShadowG, colorShadowB, 30)
ENDIF
//----------------------------------
// ATR calculation
//----------------------------------
atrPeriod = 200
myAtr = averagetruerange[atrPeriod](close)
atr = myAtr * 3
atr1 = myAtr * 2
//----------------------------------
//--- Bullish blocks detection
//----------------------------------
ONCE b = 0
IF crossUp THEN
myLowest = lowest[length2](low)
myLowestIndex = 0
vol = 0
src = 0
i = 0
FOR i = 1 TO length2 DO
IF low[i] = myLowest THEN
myLowestIndex = barindex[i]
src = min(open[i], close[i])
// Store origin candle High and Low for highlight
$bullOriginHigh[b] = high[i]
$bullOriginLow[b] = low[i]
$bullOriginOpen[b] = open[i]
$bullOriginClose[b] = close[i]
BREAK
ENDIF
NEXT
IF myLowestIndex > 0 THEN
FOR k = 0 TO myLowestIndex DO
vol = vol + volume[k]
NEXT
// ATR
IF (src - myLowest) < (atr1 * 0.5) THEN
src = myLowest + atr1 * 0.5
ENDIF
// store block
$bullIndex[b] = myLowestIndex
$bullUpper[b] = src
$bullLower[b] = myLowest
$bullMid[b] = (src + myLowest) / 2
$bullVol[b] = vol
$bullIsActive[b] = 1
$bullValid[b] = 1
b = b + 1
ENDIF
ENDIF
//----------------------------------
//--- Bearish blocks detection
//----------------------------------
ONCE z = 0
IF crossDn THEN
myHighest = highest[length2](high)
myHighestIndex = 0
vol = 0
src = 0
i = 0
FOR i = length2 DOWNTO 1 DO
IF high[i] = myHighest THEN
myHighestIndex = barindex[i]
src = max(open[i], close[i])
// Store origin candle High and Low for highlight
$bearOriginHigh[z] = high[i]
$bearOriginLow[z] = low[i]
BREAK
ENDIF
NEXT
FOR k = 0 TO myHighestIndex DO
vol = vol + volume[k]
NEXT
// ATR
IF (myHighest - src) < (atr1 * 0.5) THEN
src = myHighest - atr1 * 0.5
ENDIF
// Store block
$bearIndex[z] = myHighestIndex
$bearUpper[z] = myHighest
$bearLower[z] = src
$bearMid[z] = (src + myHighest) / 2
$bearVol[z] = vol
$bearIsActive[z] = 1
$bearValid[z] = 1
z = z + 1
ENDIF
//----------------------------------
// PLOT
//----------------------------------
IF islastbarupdate THEN
// --- 1. BULLISH BLOCKS (Invalidation) ---
IF b > 0 THEN
FOR i = 0 TO b - 1 DO
IF $bullIsActive[i] = 1 THEN
FOR j = barindex - $bullIndex[i] DOWNTO 0 DO
// A. Crossunder
IF close[j] < $bullLower[i] THEN
$bullIsActive[i] = 0
$bullIndexEnd[i] = barindex[j]
BREAK
ENDIF
// B. Overlap
IF i > 0 AND $bullIsActive[max(0,i-1)] = 1 THEN
dist = abs($bullMid[i] - $bullMid[i-1])
IF dist < atr[j] THEN
$bullIsActive[i-1] = 0
$bullValid[i-1] = 0
ENDIF
ENDIF
NEXT
ENDIF
NEXT
ENDIF
// --- 2. BEARISH BLOCKS (Invalidation) ---
IF z > 0 THEN
FOR i = 0 TO z - 1 DO
IF $bearIsActive[i] = 1 THEN
FOR j = barindex - $bearIndex[i] DOWNTO 0 DO
// A. Crossover
IF close[j] > $bearUpper[i] THEN
$bearIsActive[i] = 0
$bearIndexEnd[i] = barindex[j]
BREAK
ENDIF
// B. Overlap
IF i > 0 AND $bearIsActive[max(0,i-1)] = 1 THEN
dist = abs($bearMid[i] - $bearMid[i-1])
IF dist < atr[j] THEN
$bearIsActive[i-1] = 0
$bearValid[i-1] = 0
ENDIF
ENDIF
NEXT
ENDIF
NEXT
ENDIF
// --- 3. BULLISH BLOCKS ---
IF b > 0 THEN
startIndex = max(0, b - showLastN)
FOR i = startIndex TO b - 1 DO
IF $bullIsActive[i] = 1 THEN
IF highlightCandle = 1 THEN
DRAWSEGMENT($bullIndex[i], $bullOriginHigh[i], $bullIndex[i], $bullOriginLow[i]) COLOURED(hlColorR, hlColorG, hlColorB, 255) STYLE(LINE, 5)
ENDIF
DRAWRECTANGLE($bullIndex[i], $bullLower[i], barindex, $bullUpper[i]) COLOURED(bullColorR, bullColorG, bullColorB) FILLCOLOR(bullColorR, bullColorG, bullColorB, 80)
IF midL THEN
DRAWSEGMENT($bullIndex[i], $bullMid[i], barindex, $bullMid[i]) COLOURED(bullColorR, bullColorG, bullColorB) STYLE(dottedline)
ENDIF
bullvol = $bullVol[i]
DRAWTEXT("#bullvol#", barindex + 5, $bullMid[i])
ELSIF $bullValid[i] = 1 AND showbroken THEN
IF highlightCandle = 1 THEN
DRAWSEGMENT($bullIndex[i], $bullOriginHigh[i], $bullIndex[i], $bullOriginLow[i]) COLOURED(hlColorR, hlColorG, hlColorB, 255) STYLE(LINE, 5)
ENDIF
DRAWRECTANGLE($bullIndex[i], $bullLower[i], $bullIndexEnd[i], $bullUpper[i]) COLOURED(bullColorR, bullColorG, bullColorB, 80) FILLCOLOR(bullColorR, bullColorG, bullColorB, 40)
ENDIF
NEXT
ENDIF
// --- 4. BEARISH BLOCKS ---
IF z > 0 THEN
startIndex = max(0, z - showLastN)
FOR i = startIndex TO z - 1 DO
IF $bearIsActive[i] = 1 THEN
IF highlightCandle = 1 THEN
DRAWSEGMENT($bearIndex[i], $bearOriginHigh[i], $bearIndex[i], $bearOriginLow[i]) COLOURED(hlColorR, hlColorG, hlColorB, 255) STYLE(LINE, 5)
ENDIF
DRAWRECTANGLE($bearIndex[i], $bearLower[i], barindex, $bearUpper[i]) COLOURED(bearColorR, bearColorG, bearColorB) FILLCOLOR(bearColorR, bearColorG, bearColorB, 80)
IF midL THEN
DRAWSEGMENT($bearIndex[i], $bearMid[i], barindex, $bearMid[i]) COLOURED(bearColorR, bearColorG, bearColorB) STYLE(dottedline)
ENDIF
bearvol = $bearVol[i]
DRAWTEXT("#bearvol#", barindex + 5, $bearMid[i])
ELSIF $bearValid[i] = 1 AND showbroken THEN
IF highlightCandle = 1 THEN
DRAWSEGMENT($bearIndex[i], $bearOriginHigh[i], $bearIndex[i], $bearOriginLow[i]) COLOURED(hlColorR, hlColorG, hlColorB, 255) STYLE(LINE, 5)
ENDIF
DRAWRECTANGLE($bearIndex[i], $bearLower[i], $bearIndexEnd[i], $bearUpper[i]) COLOURED(bearColorR, bearColorG, bearColorB, 80) FILLCOLOR(bearColorR, bearColorG, bearColorB, 40)
ENDIF
NEXT
ENDIF
ENDIF
//----------------------------------
RETURN ema1 AS "EMA fast", ema2 AS "EMA slow"