//---------------------------------------------
//PRC_Gradient Trend Filter by ChartPrime
//version = 0
//17.10.2025
//Iván González @ www.prorealcode.com
//Sharing ProRealTime knowledge
//---------------------------------------------
// --- User Inputs ---
//---------------------------------------------
// Source is hardcoded to 'close' price
length = 25
// Period for the color gradient range
gradientLength = 100
//---------------------------------------------
// --- Appearance ---
//---------------------------------------------
// Positive Color (Green)
color1R = 34
color1G = 200
color1B = 120
// Negative Color (Red)
color2R = 200
color2G = 34
color2B = 78
// Signal Diamond Color (Orange)
signalColorR = 255
signalColorG = 165
signalColorB = 0
//---------------------------------------------
// --- Indicator Calculations ---
//---------------------------------------------
// 1. Calculate the base line
nf1 = ExponentialAverage[length](close)
nf2 = ExponentialAverage[length](nf1)
base = ExponentialAverage[length](nf2)
// 2. Calculate the val for bands
valSource = high - low
valNf1 = ExponentialAverage[length](valSource)
valNf2 = ExponentialAverage[length](valNf1)
val = ExponentialAverage[length](valNf2)
// 3. Calculate the bands based on Fibonacci ratios
upper3 = base + val * 0.618 * 2.5
upper2 = base + val * 0.382 * 2
upper1 = base + val * 0.236 * 1.5
lower1 = base - val * 0.236 * 1.5
lower2 = base - val * 0.382 * 2
lower3 = base - val * 0.618 * 2.5
// 4. Calculate the trend difference to determine direction
diff = base - base[2]
// 5. Generate Signals on crossover/crossunder
signalUp = diff CROSSES OVER 0
signalDn = diff CROSSES UNDER 0
//---------------------------------------------
// --- Visualization ---
//---------------------------------------------
// Draw signal diamonds
IF signalUp THEN
drawtext("▲",barindex[1], base[1]) COLOURED(signalColorR, signalColorG, signalColorB)
ENDIF
IF signalDn THEN
drawtext("▼",barindex[1], base[1]) COLOURED(signalColorR, signalColorG, signalColorB)
ENDIF
// Split the base line into two variables for dynamic coloring
baseUp = undefined
IF diff >= 0 THEN
baseUp = base
r=color1R
g=color1G
b=color1B
else
baseDown = base
r=color2R
g=color2G
b=color2B
ENDIF
//---------------------------------------------
// --- Gradient Color Calculation ---
//---------------------------------------------
// Find the min and max of 'diff' over the last 'gradientLength' bars
lowestDiff = lowest[gradientLength](diff)
highestDiff = highest[gradientLength](diff)
irange = highestDiff - lowestDiff
factor = 0.5 // Default to a neutral color if range is zero
IF irange > 0 THEN
// Normalize the current diff value to a 0-1 range
factor = (diff - lowestDiff) / irange
ENDIF
// Interpolate each RGB component based on the factor
// factor = 0 -> color2 (Red)
// factor = 1 -> color1 (Green)
red = round(color2R + factor * (color1R - color2R))
green = round(color2G + factor * (color1G - color2G))
blue = round(color2B + factor * (color1B - color2B))
alpha=45
colorbetween(upper1,lower1,red,green,blue,alpha)
colorbetween(upper2,lower2,red,green,blue,alpha)
colorbetween(upper3,lower3,red,green,blue,alpha)
//---------------------------------------------
RETURN base COLOURED(r, g, b) STYLE(line, 2) AS "Trend", upper3 AS "Upper Band 3"COLOURED(red,green,blue,alpha), upper2 AS "Upper Band 2"COLOURED(red,green,blue,alpha), upper1 AS "Upper Band 1"COLOURED(red,green,blue,alpha), lower1 AS "Lower Band 1"COLOURED(red,green,blue,alpha), lower2 AS "Lower Band 2"COLOURED(red,green,blue,alpha), lower3 AS "Lower Band 3"COLOURED(red,green,blue,alpha)