Code:
//@version=5
indicator("KDJ Indicator", shorttitle="KDJ", overlay=false)
// Параметры
length = input.int(9, title="Period", minval=1)
signalSmooth = input.int(3, title="Signal Smoothing", minval=1)
// Вычисление %K
lowestLow = ta.lowest(low, length)
highestHigh = ta.highest(high, length)
rsv = (close - lowestLow) / (highestHigh - lowestLow) * 100
// Вычисление K, D и J
k = ta.sma(rsv, signalSmooth)
d = ta.sma(k, signalSmooth)
j = 3 * k - 2 * d
// Построение линий
plot(k, title="%K", color=color.blue, linewidth=1)
plot(d, title="%D", color=color.red, linewidth=1)
plot(j, title="%J", color=color.green, linewidth=1)
// Горизонтальные уровни
h0 = hline(80, "Overbought", color=color.gray, linestyle=hline.style_dashed)
h1 = hline(20, "Oversold", color=color.gray, linestyle=hline.style_dashed)
fill(h0, h1, color=color.new(color.gray, 90))
// Опционально: сигналы пересечения
// bullish = ta.crossover(k, d)
// bearish = ta.crossunder(k, d)
// plotshape(bullish, title="Buy Signal", location=location.bottom, color=color.green, style=shape.triangleup, size=size.small)
// plotshape(bearish, title="Sell Signal", location=location.top, color=color.red, style=shape.triangledown, size=size.small)