ProRSI
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/

// © ParkF



//@version=5

indicator('ProRSI', overlay=false, max_bars_back=1500)



// rsi divergence

// input

rsig = 'RSI'

rb = input(2, 'How many Right Bars for Pivots', group=rsig)

lb = input(15, 'How many Left Bars for Pivots', group=rsig)

sph = input(close, 'Pivot source for Bear Divs', group=rsig)

spl = input(close, 'Pivots Source for Bull Divs', group=rsig)

len = input.int(14, ' RSI Length', minval=1, group=rsig)

lvl = input.int(5, 'Lookback Level for Divs', options=[1, 2, 3, 4, 5], group=rsig)



// pivot

ph = ta.pivothigh(sph, lb, rb)

pl = ta.pivotlow(spl, lb, rb)



hi0 = ta.valuewhen(ph, sph[rb], 0)

hi1 = ta.valuewhen(ph, sph[rb], 1)

hi2 = ta.valuewhen(ph, sph[rb], 2)

hi3 = ta.valuewhen(ph, sph[rb], 3)

hi4 = ta.valuewhen(ph, sph[rb], 4)

hi5 = ta.valuewhen(ph, sph[rb], 5)



lo0 = ta.valuewhen(pl, spl[rb], 0)

lo1 = ta.valuewhen(pl, spl[rb], 1)

lo2 = ta.valuewhen(pl, spl[rb], 2)

lo3 = ta.valuewhen(pl, spl[rb], 3)

lo4 = ta.valuewhen(pl, spl[rb], 4)

lo5 = ta.valuewhen(pl, spl[rb], 5)



lox0 = ta.valuewhen(pl, bar_index[rb], 0)

lox1 = ta.valuewhen(pl, bar_index[rb], 1)

lox2 = ta.valuewhen(pl, bar_index[rb], 2)

lox3 = ta.valuewhen(pl, bar_index[rb], 3)

lox4 = ta.valuewhen(pl, bar_index[rb], 4)

lox5 = ta.valuewhen(pl, bar_index[rb], 5)



hix0 = ta.valuewhen(ph, bar_index[rb], 0)

hix1 = ta.valuewhen(ph, bar_index[rb], 1)

hix2 = ta.valuewhen(ph, bar_index[rb], 2)

hix3 = ta.valuewhen(ph, bar_index[rb], 3)

hix4 = ta.valuewhen(ph, bar_index[rb], 4)

hix5 = ta.valuewhen(ph, bar_index[rb], 5)



rsi = ta.rsi(close, len)



rh0 = ta.valuewhen(ph, rsi[rb], 0)

rh1 = ta.valuewhen(ph, rsi[rb], 1)

rh2 = ta.valuewhen(ph, rsi[rb], 2)

rh3 = ta.valuewhen(ph, rsi[rb], 3)

rh4 = ta.valuewhen(ph, rsi[rb], 4)

rh5 = ta.valuewhen(ph, rsi[rb], 5)



rl0 = ta.valuewhen(pl, rsi[rb], 0)

rl1 = ta.valuewhen(pl, rsi[rb], 1)

rl2 = ta.valuewhen(pl, rsi[rb], 2)

rl3 = ta.valuewhen(pl, rsi[rb], 3)

rl4 = ta.valuewhen(pl, rsi[rb], 4)

rl5 = ta.valuewhen(pl, rsi[rb], 5)



// bull & bear divergence logic

bull_div_1= lo0<lo1

     and rl1<rl0

bull_div_2= lo0<lo1 and lo0<lo2

     and rl2<rl0 and rl2<rl1 and lvl>=2

bull_div_3= lo0<lo1 and lo0<lo2 and lo0<lo3

     and rl3<rl0 and rl3<rl1 and rl3<rl2 and lvl>=3

bull_div_4= lo0<lo1 and lo0<lo2 and lo0<lo3 and lo0<lo4

     and rl4<rl0 and rl4<rl1 and rl4<rl2 and rl4<rl3 and lvl>=4

bull_div_5= lo0<lo1 and lo0<lo2 and lo0<lo3 and lo0<lo4 and lo0<lo5

      and rl5<rl0 and rl5<rl1 and rl5<rl2 and rl5<rl3 and rl5<rl4 and lvl>=5



bear_div_1= hi0>hi1

     and rh1>rh0

bear_div_2= hi0>hi1 and hi0>hi2

     and rh2>rh0 and rh2>rh1 and lvl>=2

bear_div_3= hi0>hi1 and hi0>hi2 and hi0>hi3

     and rh3>rh0 and rh3>rh1 and rh3>rh2 and lvl>=3

bear_div_4= hi0>hi1 and hi0>hi2 and hi0>hi3 and hi0>hi4

     and rh4>rh0 and rh4>rh1 and rh4>rh2 and rh4>rh3 and lvl>=4

bear_div_5= hi0>hi1 and hi0>hi2 and hi0>hi3 and hi0>hi4 and hi0>hi5

     and rh5>rh0 and rh5>rh1 and rh5>rh2 and rh5>rh3 and rh5>rh4 and lvl>=5



new_bull1= bull_div_1 and not bull_div_1[1]

new_bull2= bull_div_2 and not bull_div_2[1]

new_bull3= bull_div_3 and not bull_div_3[1]

new_bull4= bull_div_4 and not bull_div_4[1]

new_bull5= bull_div_5 and not bull_div_5[1]



new_bear1= bear_div_1 and not bear_div_1[1]

new_bear2= bear_div_2 and not bear_div_2[1]

new_bear3= bear_div_3 and not bear_div_3[1]

new_bear4= bear_div_4 and not bear_div_4[1]

new_bear5= bear_div_5 and not bear_div_5[1]



recall(x) =>

    ta.barssince(not na(x))



// bull divergence line plot

rbull1 = line(na)

rbull1 := new_bull1 and not new_bull2 and not new_bull3 and not new_bull4 and not new_bull5 ? line.new(lox0, rl0, lox1, rl1, color=#ff9800, width=2) : na

rbull2 = line(na)

rbull2 := new_bull2 and not new_bull3 and not new_bull4 and not new_bull5 ? line.new(lox0, rl0, lox2, rl2, color=#ff9800, width=2) : na

rbull3 = line(na)

rbull3 := new_bull3 and not new_bull4 and not new_bull5 ? line.new(lox0, rl0, lox3, rl3, color=#ff9800, width=2) : na

rbull4 = line(na)

rbull4 := new_bull4 and not new_bull5 ? line.new(lox0, rl0, lox4, rl4, color=#ff9800, width=2) : na

rbull5 = line(na)

rbull5 := new_bull5 ? line.new(lox0, rl0, lox5, rl5, color=#ff9800, width=2) : na



xbull21 = ta.valuewhen(recall(rbull2) == 0, bar_index, 0) - ta.valuewhen(recall(rbull1) == 0, bar_index, 0)

xbull31 = ta.valuewhen(recall(rbull3) == 0, bar_index, 0) - ta.valuewhen(recall(rbull1) == 0, bar_index, 0)

xbull41 = ta.valuewhen(recall(rbull4) == 0, bar_index, 0) - ta.valuewhen(recall(rbull1) == 0, bar_index, 0)

xbull51 = ta.valuewhen(recall(rbull5) == 0, bar_index, 0) - ta.valuewhen(recall(rbull1) == 0, bar_index, 0)

xbull32 = ta.valuewhen(recall(rbull3) == 0, bar_index, 0) - ta.valuewhen(recall(rbull2) == 0, bar_index, 0)

xbull42 = ta.valuewhen(recall(rbull4) == 0, bar_index, 0) - ta.valuewhen(recall(rbull2) == 0, bar_index, 0)

xbull52 = ta.valuewhen(recall(rbull5) == 0, bar_index, 0) - ta.valuewhen(recall(rbull2) == 0, bar_index, 0)

xbull43 = ta.valuewhen(recall(rbull4) == 0, bar_index, 0) - ta.valuewhen(recall(rbull3) == 0, bar_index, 0)

xbull53 = ta.valuewhen(recall(rbull5) == 0, bar_index, 0) - ta.valuewhen(recall(rbull3) == 0, bar_index, 0)

xbull54 = ta.valuewhen(recall(rbull5) == 0, bar_index, 0) - ta.valuewhen(recall(rbull4) == 0, bar_index, 0)



if new_bull2 and lo2 == ta.valuewhen(new_bull1, lo1, 0) and xbull21 >= 0

    line.delete(rbull1[xbull21])

if new_bull3 and lo3 == ta.valuewhen(new_bull1, lo1, 0) and xbull31 >= 0

    line.delete(rbull1[xbull31])

if new_bull4 and lo4 == ta.valuewhen(new_bull1, lo1, 0) and xbull41 >= 0

    line.delete(rbull1[xbull41])

if new_bull5 and lo5 == ta.valuewhen(new_bull1, lo1, 0) and xbull51 >= 0

    line.delete(rbull1[xbull51])

if new_bull3 and lo3 == ta.valuewhen(new_bull2, lo2, 0) and xbull32 >= 0

    line.delete(rbull2[xbull32])

if new_bull4 and lo4 == ta.valuewhen(new_bull2, lo2, 0) and xbull42 >= 0

    line.delete(rbull2[xbull42])

if new_bull5 and lo5 == ta.valuewhen(new_bull2, lo2, 0) and xbull52 >= 0

    line.delete(rbull2[xbull52])

if new_bull4 and lo4 == ta.valuewhen(new_bull3, lo3, 0) and xbull43 >= 0

    line.delete(rbull3[xbull43])

if new_bull5 and lo5 == ta.valuewhen(new_bull3, lo3, 0) and xbull53 >= 0

    line.delete(rbull3[xbull53])

if new_bull5 and lo5 == ta.valuewhen(new_bull4, lo4, 0) and xbull54 >= 0

    line.delete(rbull4[xbull54])



// bear divergence line plot

rbear1 = line(na)

rbear1 := new_bear1 and not new_bear2 and not new_bear3 and not new_bear4 and not new_bear5 ? line.new(hix0, rh0, hix1, rh1, color=#ff9800, width=2) : na

rbear2 = line(na)

rbear2 := new_bear2 and not new_bear3 and not new_bear4 and not new_bear5 ? line.new(hix0, rh0, hix2, rh2, color=#ff9800, width=2) : na

rbear3 = line(na)

rbear3 := new_bear3 and not new_bear4 and not new_bear5 ? line.new(hix0, rh0, hix3, rh3, color=#ff9800, width=2) : na

rbear4 = line(na)

rbear4 := new_bear4 and not new_bear5 ? line.new(hix0, rh0, hix4, rh4, color=#ff9800, width=2) : na

rbear5 = line(na)

rbear5 := new_bear5 ? line.new(hix0, rh0, hix5, rh5, color=#ff9800, width=2) : na



xbear21 = ta.valuewhen(recall(rbear2) == 0, bar_index, 0) - ta.valuewhen(recall(rbear1) == 0, bar_index, 0)

xbear31 = ta.valuewhen(recall(rbear3) == 0, bar_index, 0) - ta.valuewhen(recall(rbear1) == 0, bar_index, 0)

xbear41 = ta.valuewhen(recall(rbear4) == 0, bar_index, 0) - ta.valuewhen(recall(rbear1) == 0, bar_index, 0)

xbear51 = ta.valuewhen(recall(rbear5) == 0, bar_index, 0) - ta.valuewhen(recall(rbear1) == 0, bar_index, 0)

xbear32 = ta.valuewhen(recall(rbear3) == 0, bar_index, 0) - ta.valuewhen(recall(rbear2) == 0, bar_index, 0)

xbear42 = ta.valuewhen(recall(rbear4) == 0, bar_index, 0) - ta.valuewhen(recall(rbear2) == 0, bar_index, 0)

xbear52 = ta.valuewhen(recall(rbear5) == 0, bar_index, 0) - ta.valuewhen(recall(rbear2) == 0, bar_index, 0)

xbear43 = ta.valuewhen(recall(rbear4) == 0, bar_index, 0) - ta.valuewhen(recall(rbear3) == 0, bar_index, 0)

xbear53 = ta.valuewhen(recall(rbear5) == 0, bar_index, 0) - ta.valuewhen(recall(rbear3) == 0, bar_index, 0)

xbear54 = ta.valuewhen(recall(rbear5) == 0, bar_index, 0) - ta.valuewhen(recall(rbear4) == 0, bar_index, 0)



if new_bear2 and hi2 == ta.valuewhen(new_bear1, hi1, 0) and xbear21 >= 0

    line.delete(rbear1[xbear21])

if new_bear3 and hi3 == ta.valuewhen(new_bear1, hi1, 0) and xbear31 >= 0

    line.delete(rbear1[xbear31])

if new_bear4 and hi4 == ta.valuewhen(new_bear1, hi1, 0) and xbear41 >= 0

    line.delete(rbear1[xbear41])

if new_bear5 and hi5 == ta.valuewhen(new_bear1, hi1, 0) and xbear51 >= 0

    line.delete(rbear1[xbear51])

if new_bear3 and hi3 == ta.valuewhen(new_bear2, hi2, 0) and xbear32 >= 0

    line.delete(rbear2[xbear32])

if new_bear4 and hi4 == ta.valuewhen(new_bear2, hi2, 0) and xbear42 >= 0

    line.delete(rbear2[xbear42])

if new_bear5 and hi5 == ta.valuewhen(new_bear2, hi2, 0) and xbear52 >= 0

    line.delete(rbear2[xbear52])

if new_bear4 and hi4 == ta.valuewhen(new_bear3, hi3, 0) and xbear43 >= 0

    line.delete(rbear3[xbear43])

if new_bear5 and hi5 == ta.valuewhen(new_bear3, hi3, 0) and xbear53 >= 0

    line.delete(rbear3[xbear53])

if new_bear5 and hi5 == ta.valuewhen(new_bear4, hi4, 0) and xbear54 >= 0

    line.delete(rbear4[xbear54])



plotshape(title='bull_div_1', series=new_bull1 ? 13 : na, style=shape.triangleup, color=#089981, location=location.absolute, size=size.tiny, offset=-2)

plotshape(title='bull_div_2', series=new_bull2 ? 13 : na, style=shape.triangleup, color=#089981, location=location.absolute, size=size.tiny, offset=-2)

plotshape(title='bull_div_3', series=new_bull3 ? 13 : na, style=shape.triangleup, color=#089981, location=location.absolute, size=size.tiny, offset=-2)

plotshape(title='bull_div_4', series=new_bull4 ? 13 : na, style=shape.triangleup, color=#089981, location=location.absolute, size=size.tiny, offset=-2)

plotshape(title='bull_div_5', series=new_bull5 ? 13 : na, style=shape.triangleup, color=#089981, location=location.absolute, size=size.tiny, offset=-2)

plotshape(title='bear_div_1', series=new_bear1 ? 87 : na, style=shape.triangledown, color=#f23645, location=location.absolute, size=size.tiny, offset=-2)

plotshape(title='bear_div_2', series=new_bear2 ? 87 : na, style=shape.triangledown, color=#f23645, location=location.absolute, size=size.tiny, offset=-2)

plotshape(title='bear_div_3', series=new_bear3 ? 87 : na, style=shape.triangledown, color=#f23645, location=location.absolute, size=size.tiny, offset=-2)

plotshape(title='bear_div_4', series=new_bear4 ? 87 : na, style=shape.triangledown, color=#f23645, location=location.absolute, size=size.tiny, offset=-2)

plotshape(title='bear_div_5', series=new_bear5 ? 87 : na, style=shape.triangledown, color=#f23645, location=location.absolute, size=size.tiny, offset=-2)





// rsi candle (with wick)

// rsi configuration

rsrc = close

ad = true



// rsi function

pine_rsi(rsrc, len) =>

    u = math.max(rsrc - rsrc[1], 0)

    d = math.max(rsrc[1] - rsrc, 0)

    rs = ta.rma(u, len) / ta.rma(d, len)

    res = 100 - 100 / (1 + rs)

    res

pine_rma(rsrc, length) =>

    b = 1 / length

    sum = 0.0

    sum := na(sum[1]) ? ta.sma(rsrc, length) : b * rsrc + (1 - b) * nz(sum[1])

u = math.max(rsrc - rsrc[1], 0)

d = math.max(rsrc[1] - rsrc, 0)

b = 1 / len

ruh = b * math.max(high - close[1], 0) + (1 - b) * ta.rma(u, len)[1]

rdh = (1 - b) * ta.rma(d, len)[1]

rul = (1 - b) * ta.rma(u, len)[1]

rdl = b * math.max(close[1] - low, 0) + (1 - b) * ta.rma(d, len)[1]

function(rsi, len) =>

    f = -math.pow(math.abs(math.abs(rsi - 50) - 50), 1 + math.pow(len / 14, 0.618) - 1) / math.pow(50, math.pow(len / 14, 0.618) - 1) + 50

    rsiadvanced = if rsi > 50

        f + 50

    else

        -f + 50

    rsiadvanced

rsiha = 100 - 100 / (1 + ruh / rdh)

rsila = 100 - 100 / (1 + rul / rdl)

rsia = ta.rsi(rsrc, len)

rsih = if ad

    function(rsiha, len)

else

    rsiha

rsil = if ad

    function(rsila, len)

else

    rsila



// rsi bought & sold zone

plot_bands = true



reb = hline(plot_bands ? 70 : na, 'Extreme Bought', color.new(#b2b5be, 50), linewidth=4, linestyle=hline.style_solid)

rmb = hline(plot_bands ? 50 : na, 'Middle Line', color.new(#fbc02d, 80), linewidth=4, linestyle=hline.style_solid)

res = hline(plot_bands ? 30 : na, 'Extreme Sold', color.new(#b2b5be, 50), linewidth=4, linestyle=hline.style_solid)



// candle

plotcandle(rsi[1], rsih, rsil, rsi, 'RSI_Candle', color=ta.change(rsi) > 0 ? #ffffff : #000000, wickcolor=#000000, bordercolor=#2a2e39)

plot(rsi, 'RSI_Line', color= ta.change(rsi) > 0 ? color.black : color.black, display=display.none, linewidth=2)





// linear regression

// input

lrg = 'Linear Regression'

linreg1 = input(true, 'Longterm Linear Regression On / Off', group=lrg)

periodTrend = input.int(100, 'Longterm Linear Regression Period', minval=4, group=lrg)

linreg2 = input(true, 'Shorterm Linear Regression On / Off', group=lrg)

periodTrend2 = input.int(25, 'Shorterm Linear Regression Period', minval=4, group=lrg)

deviationsAmnt = input.float(2, 'Deviation', minval=0.1, step=0.1, group=lrg)

estimatorType = input.string('Unbiased', 'Estimator', options=['Biased', 'Unbiased'], group=lrg)

var extendType = input.string('Right', 'Extend', options=['Right', 'Segment'], group=lrg) == 'Right' ? extend.right : extend.none



// drawline configuration

drawLine(X1, Y1, X2, Y2, ExtendType, Color, LineStyle) =>

    var line Line = na

    Line := linreg1 ? line.new(X1, Y1, X2, Y2, xloc.bar_index, ExtendType, Color, LineStyle, width=2) : na

    line.delete(Line[1])

drawLine2(X1, Y1, X2, Y2, ExtendType, Color, LineStyle) =>

    var line Line = na

    Line := linreg2 ? line.new(X1, Y1, X2, Y2, xloc.bar_index, ExtendType, Color, LineStyle, width=2) : na

    line.delete(Line[1])



rsdcr2(PeriodMinusOne, Deviations, Estimate) =>

    var period = PeriodMinusOne + 1

    var devDenominator = Estimate == 'Unbiased' ? PeriodMinusOne : period

    Ex = 0.0

    Ex2 = 0.0

    Exy = 0.0

    Ey = 0.0

    for i = 0 to PeriodMinusOne by 1

        closeI = nz(rsi[i])

        Ex := Ex + i

        Ex2 := Ex2 + i * i

        Exy := Exy + closeI * i

        Ey := Ey + closeI

        Ey

    ExEx = Ex * Ex

    slope = Ex2 == ExEx ? 0.0 : (period * Exy - Ex * Ey) / (period * Ex2 - ExEx)

    linearRegression = (Ey - slope * Ex) / period

    intercept = linearRegression + bar_index * slope

    deviation = 0.0

    for i = 0 to PeriodMinusOne by 1

        deviation := deviation + math.pow(nz(rsi[i]) - (intercept - bar_index[i] * slope), 2.0)

        deviation

    deviation := Deviations * math.sqrt(deviation / devDenominator)

    correlate = ta.correlation(rsi, bar_index, period)

    r2 = math.pow(correlate, 2.0)

    [linearRegression, slope, deviation, correlate, r2]



periodMinusOne = periodTrend - 1

[linReg, slope, deviation, correlate, r2] = rsdcr2(periodMinusOne, deviationsAmnt, estimatorType)

endPointBar = bar_index - periodTrend + 1

endPointY = linReg + slope * periodMinusOne

endPointBar2 = bar_index - periodTrend2 + 1



// drawline plot

drawLine(endPointBar, endPointY + deviation, bar_index, linReg + deviation, extendType, #e91e63, line.style_solid)

drawLine(endPointBar, endPointY, bar_index, linReg, extendType, #e91e63, line.style_dotted)

drawLine(endPointBar, endPointY - deviation, bar_index, linReg - deviation, extendType, #e91e63, line.style_solid)

drawLine2(endPointBar2, endPointY + deviation, bar_index, linReg + deviation, extendType, color.blue, line.style_solid)

drawLine2(endPointBar2, endPointY, bar_index, linReg, extendType, color.blue, line.style_dotted)

drawLine2(endPointBar2, endPointY - deviation, bar_index, linReg - deviation, extendType, color.blue, line.style_solid)







// trendline

// input

trlg = 'Trend Lines'

o = rsi[1]

h = rsih

l = rsil

c = rsi

log_chart = input(true, title='Use Log Chart', group=trlg)

a_Color_Type = input.string(defval='Monochrome', title='Use Trendlines Color Scheme', options=['Colored', 'Monochrome'], group=trlg)



a_Show_Primary = input(true, title='Primary Trendlines On / Off', group=trlg)

a_len = input(30, title='Primary Lookback Length', group=trlg)

a_Extensions = input.string(title='Primary Trendlines Extensions', defval='  50', options=["Infinate", "  25", "  50", "  75", " 100", " 150", " 200", " 300", " 400", " 500", " 750", "1000"], group=trlg)

a_width = input.int(2, title='Primary Line Width', minval=0, maxval=10, group=trlg)

a_Show_Breaks = 'n/a'

a_trendline_nr = 0

a_Rising_Upper_Falling_Lower = false



b_Show_Secondary = input(true, title='Secondary Trendlines On / Off', group=trlg)

b_len = input(15, title='Secondary Lookback Length', group=trlg)

b_Extensions = input.string(title='Secondary Trendlines Extensions', defval='  25', options=["Infinate", "  25", "  50", "  75", " 100", " 150", " 200", " 300", " 400", " 500", " 750", "1000"], group=trlg)

b_width = input.int(1, title='Secondary Line Width', minval=0, maxval=10, group=trlg)

b_Show_Breaks = 'n/a'

b_trendline_nr = 0

b_Rising_Upper_Falling_Lower = false



a_bar_time = time - time[1]

b_bar_time = time - time[1]



//primary trendline

// trendline extension

a_Extension_Multiplier=

 a_Extensions=="  25"?  1 :

 a_Extensions=="  50"?  2 :

 a_Extensions=="  75"?  3 :

 a_Extensions==" 100"?  4 :

 a_Extensions==" 150"?  6 :

 a_Extensions==" 200"?  8 :

 a_Extensions==" 300"? 12 :

 a_Extensions==" 400"? 16 :

 a_Extensions==" 500"? 20 :

 a_Extensions==" 750"? 30 :

 a_Extensions=="1000"? 40 :

 a_Extensions=="Infinate"? 0 : na

 

// trendline function

a_f_trendline(a__input_function, a__delay, a__only_up, a__extend) =>

    var int a_Ax = 1

    var int a_Bx = 1

    var float a_By = 0

    var float a_slope = 0

    a_Ay = fixnan(a__input_function)

    if ta.change(a_Ay) != 0

        a_Ax := time[a__delay]

        a_By := a_Ay[1]

        a_Bx := a_Ax[1]

        a_slope := log_chart ? (math.log(a_Ay) - math.log(a_By)) / (a_Ax - a_Bx) : (a_Ay - a_By) / (a_Ax - a_Bx)

        a_slope

    else

        a_Ax := a_Ax[1]

        a_Bx := a_Bx[1]

        a_By := a_By[1]

        a_By

    // draw trendline

    var line a_trendline = na

    var int a_Axbis = 0

    var float a_Aybis = 0

    var bool a__xtend = true

    a_extension_time = a_Extension_Multiplier * a_bar_time * 25

    a_Axbis := a_Ax + a_extension_time

    a_Aybis := log_chart ? a_Ay * math.exp(a_extension_time * a_slope) : a_Ay + a_extension_time * a_slope

    if a_Extension_Multiplier != 0

        a__xtend := false

        a__xtend

    if ta.change(a_Ay) != 0



        a_line_color_Rising_Falling = a_slope * time < 0 ? a__only_up ? a_Rising_Upper_Falling_Lower ? a_Color_Type == 'Colored' ? color.gray : color.teal : na : a_Color_Type == 'Colored' ? #cf0a83 : color.teal : a__only_up ? a_Color_Type == 'Colored' ? #027521 : color.teal : a_Rising_Upper_Falling_Lower ? a_Color_Type == 'Colored' ? color.gray : color.teal : na

        a_line_color_Not_Rising_Falling = a_slope * time < 0 ? a__only_up ? na : a_Color_Type == 'Colored' ? #cf0a83 : color.teal : a__only_up ? a_Color_Type == 'Colored' ? #027521 : color.teal : na



        a_line_color = a_Show_Primary and not a_Rising_Upper_Falling_Lower ? a_line_color_Not_Rising_Falling : a_Show_Primary and a_Rising_Upper_Falling_Lower ? a_line_color_Rising_Falling : na



        if not na(a_line_color)

            a_trendline = line.new(a_Bx, a_By, a_Axbis, a_Aybis, xloc.bar_time, extend=a__xtend ? extend.right : extend.none, color=a_line_color, style=line.style_solid, width=a_width)

            a_trendline

    [a_Bx, a_By, a_Axbis, a_Aybis, a_slope]



// calc pivot points 

a_high_point = ta.pivothigh(c > o ? c : o, a_len, a_len / 2)

a_low_point = ta.pivotlow(c > o ? o : c, a_len, a_len / 2)



// call trendline function

[a_phx1, a_phy1, a_phx2, a_phy2, a_slope_high] = a_f_trendline(a_high_point, a_len / 2, false, true)

[a_plx1, a_ply1, a_plx2, a_ply2, a_slope_low] = a_f_trendline(a_low_point, a_len / 2, true, true)



// secondary trendline

// trendline extension

b_Extension_Multiplier=

 b_Extensions=="  25"?  1 :

 b_Extensions=="  50"?  2 :

 b_Extensions=="  75"?  3 :

 b_Extensions==" 100"?  4 :

 b_Extensions==" 150"?  6 :

 b_Extensions==" 200"?  8 :

 b_Extensions==" 300"? 12 :

 b_Extensions==" 400"? 16 :

 b_Extensions==" 500"? 20 :

 b_Extensions==" 750"? 30 :

 b_Extensions=="1000"? 40 :

 b_Extensions=="Infinate"? 0 : na

 

// trendline function

b_f_trendline(b__input_function, b__delay, b__only_up, b__extend) =>

    var int b_Ax = 1

    var int b_Bx = 1

    var float b_By = 0

    var float b_slope = 0

    b_Ay = fixnan(b__input_function)

    if ta.change(b_Ay) != 0

        b_Ax := time[b__delay]

        b_By := b_Ay[1]

        b_Bx := b_Ax[1]

        b_slope := log_chart ? (math.log(b_Ay) - math.log(b_By)) / (b_Ax - b_Bx) : (b_Ay - b_By) / (b_Ax - b_Bx)

        b_slope

    else

        b_Ax := b_Ax[1]

        b_Bx := b_Bx[1]

        b_By := b_By[1]

        b_By

    // draw trendlines

    var line b_trendline = na

    var int b_Axbis = 0

    var float b_Aybis = 0

    var bool b__xtend = true

    b_extension_time = b_Extension_Multiplier * b_bar_time * 25

    b_Axbis := b_Ax + b_extension_time

    b_Aybis := log_chart ? b_Ay * math.exp(b_extension_time * b_slope) : b_Ay + b_extension_time * b_slope

    if b_Extension_Multiplier != 0

        b__xtend := false

        b__xtend

    if ta.change(b_Ay) != 0



        b_line_color_Rising_Falling = b_slope * time < 0 ? b__only_up ? b_Rising_Upper_Falling_Lower ? a_Color_Type == 'Colored' ? color.gray : color.teal : na : a_Color_Type == 'Colored' ? color.red : color.teal : b__only_up ? a_Color_Type == 'Colored' ? color.green : color.teal : b_Rising_Upper_Falling_Lower ? a_Color_Type == 'Colored' ? color.gray : color.teal : na

        b_line_color_Not_Rising_Falling = b_slope * time < 0 ? b__only_up ? na : a_Color_Type == 'Colored' ? color.red : color.teal : b__only_up ? a_Color_Type == 'Colored' ? color.green : color.teal : na



        b_line_color = b_Show_Secondary and not b_Rising_Upper_Falling_Lower ? b_line_color_Not_Rising_Falling : b_Show_Secondary and b_Rising_Upper_Falling_Lower ? b_line_color_Rising_Falling : na



        if not na(b_line_color)

            b_trendline = line.new(b_Bx, b_By, b_Axbis, b_Aybis, xloc.bar_time, extend=b__xtend ? extend.right : extend.none, color=b_line_color, style=line.style_dashed, width=b_width)

            b_trendline

    [b_Bx, b_By, b_Axbis, b_Aybis, b_slope]



// calc pivot points

b_high_point = ta.pivothigh(c > o ? c : o, b_len, b_len / 2)

b_low_point = ta.pivotlow(c > o ? o : c, b_len, b_len / 2)



// call trendline function

[b_phx1, b_phy1, b_phx2, b_phy2, b_slope_high] = b_f_trendline(b_high_point, b_len / 2, false, true)

[b_plx1, b_ply1, b_plx2, b_ply2, b_slope_low] = b_f_trendline(b_low_point, b_len / 2, true, true)



// plot

b_color_high = b_slope_high * time < 0 ? color.green : na

b_color_low = b_slope_low * time > 0 ? color.red : na