// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © LonesomeTheBlue //@version=5 indicator('Donchian Trend', overlay=true) dlen = input.int(defval=20, title='Donchian Channel Period', minval=10) lwidth = input.int(defval=3, title='Line Width', minval=1, maxval=4) dchannel(len) => float hh = ta.highest(len) float ll = ta.lowest(len) int trend = 0 trend := close > hh[1] ? 1 : close < ll[1] ? -1 : nz(trend[1]) [hh, ll, trend] dchanneltr(len) => float hh = ta.highest(len) float ll = ta.lowest(len) int trend = 0 trend := close >= hh[1] ? 1 : close <= ll[1] ? -1 : nz(trend[1]) trend [upper, lower, maintrend] = dchannel(dlen) tt = maintrend == 1 ? 10 : -10 [u1, l1, t1] = dchannel(dlen - 1) tt -= (math.sign(dchanneltr(dlen - 1)) != math.sign(maintrend) ? int(math.sign(maintrend)) : 0) tt -= (math.sign(dchanneltr(dlen - 2)) != math.sign(maintrend) ? int(math.sign(maintrend)) : 0) tt -= (math.sign(dchanneltr(dlen - 3)) != math.sign(maintrend) ? int(math.sign(maintrend)) : 0) tt -= (math.sign(dchanneltr(dlen - 4)) != math.sign(maintrend) ? int(math.sign(maintrend)) : 0) tt -= (math.sign(dchanneltr(dlen - 5)) != math.sign(maintrend) ? int(math.sign(maintrend)) : 0) tt -= (math.sign(dchanneltr(dlen - 6)) != math.sign(maintrend) ? int(math.sign(maintrend)) : 0) tt -= (math.sign(dchanneltr(dlen - 7)) != math.sign(maintrend) ? int(math.sign(maintrend)) : 0) tt -= (math.sign(dchanneltr(dlen - 8)) != math.sign(maintrend) ? int(math.sign(maintrend)) : 0) tt -= (math.sign(dchanneltr(dlen - 9)) != math.sign(maintrend) ? int(math.sign(maintrend)) : 0) getcolor(trend) => _ret = trend >= 10.0 ? #00FF00ff : trend >= 9.0 ? #00FF00e5 : trend >= 8.0 ? #00FF00cc : trend >= 7.0 ? #00FF00b2 : trend >= 6.0 ? #00FF0099 : trend >= 5.0 ? #00FF007f : trend >= 4.0 ? #00FF0066 : trend >= 3.0 ? #00FF004c : trend >= 2.0 ? #00FF0033 : trend >= 1.0 ? #00FF0019 : trend == 0.0 ? color.new(color.white, 100) : trend >= -1.0 ? #FF000019 : trend >= -2.0 ? #FF000033 : trend >= -3.0 ? #FF00004c : trend >= -4.0 ? #FF000066 : trend >= -5.0 ? #FF00007f : trend >= -6.0 ? #FF000099 : trend >= -7.0 ? #FF0000b2 : trend >= -8.0 ? #FF0000cc : trend >= -9.0 ? #FF0000e5 : #FF0000ff _ret tline = maintrend == 1 ? lower : upper tcol = maintrend == 1 and nz(maintrend[1]) == 1 or maintrend == -1 and nz(maintrend[1]) == -1 ? getcolor(tt) : na plot(tline, color=tcol, linewidth=lwidth) plotchar(maintrend == 1 and tt > 2 and (tt < 10 or low == lower) ? lower : na, char='↑', color=color.new(color.green, 0), location=location.absolute, size=size.small) plotchar(maintrend == -1 and tt < -2 and (tt > -10 or high == upper) ? upper : na, char='↓', color=color.new(color.olive, 0), location=location.absolute, size=size.small) plot(close)