OPEN-SOURCE SCRIPT

Kripto Fema ind

55
/ This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at mozilla.org/MPL/2.0/
// © Femayakup


//version=5



indicator(title = "Kripto Fema ind", shorttitle="Kripto Fema ind", overlay=true, format=format.price, precision=2,max_lines_count = 500, max_labels_count = 500, max_bars_back=500)





showEma200 = input(true, title="EMA 200")

showPmax = input(true, title="Pmax")

showLinreg = input(true, title="Linreg")

showMavilim = input(true, title="Mavilim")

showNadaray = input(true, title="Nadaraya Watson")





ma(source, length, type) =>

switch type

"SMA" => ta.sma(source, length)

"EMA" => ta.ema(source, length)

"SMMA (RMA)" => ta.rma(source, length)

"WMA" => ta.wma(source, length)

"VWMA" => ta.vwma(source, length)





//Ema200





timeFrame = input.timeframe(defval = '240',title= 'EMA200 TimeFrame',group = 'EMA200 Settings')

len200 = input.int(200, minval=1, title="Length",group = 'EMA200 Settings')

src200 = input(close, title="Source",group = 'EMA200 Settings')

offset200 = input.int(title="Offset", defval=0, minval=-500, maxval=500,group = 'EMA200 Settings')

out200 = ta.ema(src200, len200)

higherTimeFrame = request.security(syminfo.tickerid,timeFrame,out200[1],barmerge.gaps_on,barmerge.lookahead_on)

ema200Plot = showEma200 ? higherTimeFrame : na

plot(ema200Plot, title="EMA200", offset=offset200)









//Linreq

group1 = "Linreg Settings"

lengthInput = input.int(100, title="Length", minval = 1, maxval = 5000,group = group1)

sourceInput = input.source(close, title="Source")





useUpperDevInput = input.bool(true, title="Upper Deviation", inline = "Upper Deviation", group = group1)

upperMultInput = input.float(2.0, title="", inline = "Upper Deviation", group = group1)

useLowerDevInput = input.bool(true, title="Lower Deviation", inline = "Lower Deviation", group = group1)

lowerMultInput = input.float(2.0, title="", inline = "Lower Deviation", group = group1)



group2 = "Linreg Display Settings"

showPearsonInput = input.bool(true, "Show Pearson's R", group = group2)

extendLeftInput = input.bool(false, "Extend Lines Left", group = group2)

extendRightInput = input.bool(true, "Extend Lines Right", group = group2)

extendStyle = switch

extendLeftInput and extendRightInput => extend.both

extendLeftInput => extend.left

extendRightInput => extend.right

=> extend.none



group3 = "Linreg Color Settings"

colorUpper = input.color(color.new(color.blue, 85), "Linreg Renk", inline = group3, group = group3)

colorLower = input.color(color.new(color.red, 85), "", inline = group3, group = group3)



calcSlope(source, length) =>

max_bars_back(source, 5000)

if not barstate.islast or length <= 1

[float(na), float(na), float(na)]

else

sumX = 0.0

sumY = 0.0

sumXSqr = 0.0

sumXY = 0.0

for i = 0 to length - 1 by 1

val = source

per = i + 1.0

sumX += per

sumY += val

sumXSqr += per * per

sumXY += val * per

slope = (length * sumXY - sumX * sumY) / (length * sumXSqr - sumX * sumX)

average = sumY / length

intercept = average - slope * sumX / length + slope

[slope, average, intercept]



[s, a, i] = calcSlope(sourceInput, lengthInput)

startPrice = i + s * (lengthInput - 1)

endPrice = i

var line baseLine = na

if na(baseLine) and not na(startPrice) and showLinreg

baseLine := line.new(bar_index - lengthInput + 1, startPrice, bar_index, endPrice, width=1, extend=extendStyle, color=color.new(colorLower, 0))

else

line.set_xy1(baseLine, bar_index - lengthInput + 1, startPrice)

line.set_xy2(baseLine, bar_index, endPrice)

na



calcDev(source, length, slope, average, intercept) =>

upDev = 0.0

dnDev = 0.0

stdDevAcc = 0.0

dsxx = 0.0

dsyy = 0.0

dsxy = 0.0

periods = length - 1

daY = intercept + slope * periods / 2

val = intercept

for j = 0 to periods by 1

price = high[j] - val

if price > upDev

upDev := price

price := val - low[j]

if price > dnDev

dnDev := price

price := source[j]

dxt = price - average

dyt = val - daY

price -= val

stdDevAcc += price * price

dsxx += dxt * dxt

dsyy += dyt * dyt

dsxy += dxt * dyt

val += slope

stdDev = math.sqrt(stdDevAcc / (periods == 0 ? 1 : periods))

pearsonR = dsxx == 0 or dsyy == 0 ? 0 : dsxy / math.sqrt(dsxx * dsyy)

[stdDev, pearsonR, upDev, dnDev]



[stdDev, pearsonR, upDev, dnDev] = calcDev(sourceInput, lengthInput, s, a, i)

upperStartPrice = startPrice + (useUpperDevInput ? upperMultInput * stdDev : upDev)

upperEndPrice = endPrice + (useUpperDevInput ? upperMultInput * stdDev : upDev)

var line upper = na

lowerStartPrice = startPrice + (useLowerDevInput ? -lowerMultInput * stdDev : -dnDev)

lowerEndPrice = endPrice + (useLowerDevInput ? -lowerMultInput * stdDev : -dnDev)

var line lower = na

if na(upper) and not na(upperStartPrice) and showLinreg

upper := line.new(bar_index - lengthInput + 1, upperStartPrice, bar_index, upperEndPrice, width=1, extend=extendStyle, color=color.new(colorUpper, 0))

else

line.set_xy1(upper, bar_index - lengthInput + 1, upperStartPrice)

line.set_xy2(upper, bar_index, upperEndPrice)

na

if na(lower) and not na(lowerStartPrice) and showLinreg

lower := line.new(bar_index - lengthInput + 1, lowerStartPrice, bar_index, lowerEndPrice, width=1, extend=extendStyle, color=color.new(colorUpper, 0))

else

line.set_xy1(lower, bar_index - lengthInput + 1, lowerStartPrice)

line.set_xy2(lower, bar_index, lowerEndPrice)

na

showLinregPlotUpper = showLinreg ? upper : na

showLinregPlotLower = showLinreg ? lower : na

showLinregPlotBaseLine = showLinreg ? baseLine : na

linefill.new(showLinregPlotUpper, showLinregPlotBaseLine, color = colorUpper)

linefill.new(showLinregPlotBaseLine, showLinregPlotLower, color = colorLower)



// Pearson's R

var label r = na

label.delete(r[1])

if showPearsonInput and not na(pearsonR) and showLinreg

r := label.new(bar_index - lengthInput + 1, lowerStartPrice, str.tostring(pearsonR, "#.################"), color = color.new(color.white, 100), textcolor=color.new(colorUpper, 0), size=size.normal, style=label.style_label_up)







//Mavilim

group4 = "Mavilim Settings"

mavilimold = input(false, title="Show Previous Version of MavilimW?",group=group4)

fmal=input(3,"First Moving Average length",group = group4)

smal=input(5,"Second Moving Average length",group = group4)

tmal=fmal+smal

Fmal=smal+tmal

Ftmal=tmal+Fmal

Smal=Fmal+Ftmal



M1= ta.wma(close, fmal)

M2= ta.wma(M1, smal)

M3= ta.wma(M2, tmal)

M4= ta.wma(M3, Fmal)

M5= ta.wma(M4, Ftmal)

MAVW= ta.wma(M5, Smal)

col1= MAVW>MAVW[1]

col3= MAVW<MAVW[1]

colorM = col1 ? color.blue : col3 ? color.red : color.yellow



mavwPlot = showMavilim ? MAVW : na

plot(mavwPlot, color=colorM, linewidth=2, title="MAVW")



M12= ta.wma(close, 3)

M22= ta.wma(M12, 5)

M32= ta.wma(M22, 8)

M42= ta.wma(M32, 13)

M52= ta.wma(M42, 21)

MAVW2= ta.wma(M52, 34)





//PMAX



group5 = "PMAX Ayarları"

pmaxsrc = input(hl2, title="Source",group = group5)

Periods = input.int(title="ATR Length", defval=12,group = group5)

Multiplier = input.float(title="ATR Multiplier", step=0.1, defval=4.0,group = group5)

mav = input(title="Moving Average Type", defval="EMA",group = group5)

length =input.int(9, title="Moving Average Length",minval = 1,group = group5)

changeATR= input.bool(title="Change ATR Calculation Method ?", defval=true,group = group5)

Normalize= input.bool(title="Normalize ATR ?", defval=false,group = group5)

showsupport = input.bool(title="Show Moving Average?", defval=true,group = group5)

showsignalsk = input.bool(title="Show Crossing Signals?", defval=true,group = group5)

showsignalsc = input.bool(title="Show Price/Pmax Crossing Signals?", defval=false,group = group5)

highlighting = input.bool(title="Highlighter On/Off ?", defval=false,group = group5)

atr2 = ta.sma(ta.tr, Periods)

atr= changeATR ? ta.atr(Periods) : atr2

valpha=2/(length+1)

vud1=pmaxsrc>pmaxsrc[1] ? pmaxsrc-pmaxsrc[1] : 0

vdd1=pmaxsrc<pmaxsrc[1] ? pmaxsrc[1]-pmaxsrc : 0

vUD=math.sum(vud1,9)

vDD=math.sum(vdd1,9)

vCMO=nz((vUD-vDD)/(vUD+vDD))

VAR=0.0

VAR:=nz(valpha*math.abs(vCMO)*pmaxsrc)+(1-valpha*math.abs(vCMO))*nz(VAR[1])

wwalpha = 1/ length

WWMA = 0.0

WWMA := wwalpha*pmaxsrc + (1-wwalpha)*nz(WWMA[1])

zxLag = length/2==math.round(length/2) ? length/2 : (length - 1) / 2

zxEMAData = (pmaxsrc + (pmaxsrc - pmaxsrc[zxLag]))

ZLEMA = ta.ema(zxEMAData, length)

lrc = ta.linreg(pmaxsrc, length, 0)

lrc1 = ta.linreg(pmaxsrc,length,1)

lrs = (lrc-lrc1)

TSF = ta.linreg(pmaxsrc, length, 0)+lrs

getMA(pmaxsrc, length) =>

ma = 0.0

if mav == "SMA"

ma := ta.sma(pmaxsrc, length)

ma



if mav == "EMA"

ma := ta.ema(pmaxsrc, length)

ma



if mav == "WMA"

ma := ta.wma(pmaxsrc, length)

ma



if mav == "TMA"

ma := ta.sma(ta.sma(pmaxsrc, math.ceil(length / 2)), math.floor(length / 2) + 1)

ma



if mav == "VAR"

ma := VAR

ma



if mav == "WWMA"

ma := WWMA

ma



if mav == "ZLEMA"

ma := ZLEMA

ma



if mav == "TSF"

ma := TSF

ma

ma



MAvg=getMA(pmaxsrc, length)

longStop = Normalize ? MAvg - Multiplier*atr/close : MAvg - Multiplier*atr

longStopPrev = nz(longStop[1], longStop)

longStop := MAvg > longStopPrev ? math.max(longStop, longStopPrev) : longStop

shortStop = Normalize ? MAvg + Multiplier*atr/close : MAvg + Multiplier*atr

shortStopPrev = nz(shortStop[1], shortStop)

shortStop := MAvg < shortStopPrev ? math.min(shortStop, shortStopPrev) : shortStop

dir = 1

dir := nz(dir[1], dir)

dir := dir == -1 and MAvg > shortStopPrev ? 1 : dir == 1 and MAvg < longStopPrev ? -1 : dir

PMax = dir==1 ? longStop: shortStop

plot(showsupport ? MAvg : na, color=#fbff04, linewidth=2, title="EMA9")

pALL=plot(PMax, color=color.new(color.red, transp = 0), linewidth=2, title="PMax")

alertcondition(ta.cross(MAvg, PMax), title="Cross Alert", message="PMax - Moving Avg Crossing!")

alertcondition(ta.crossover(MAvg, PMax), title="Crossover Alarm", message="Moving Avg BUY SIGNAL!")

alertcondition(ta.crossunder(MAvg, PMax), title="Crossunder Alarm", message="Moving Avg SELL SIGNAL!")

alertcondition(ta.cross(pmaxsrc, PMax), title="Price Cross Alert", message="PMax - Price Crossing!")

alertcondition(ta.crossover(pmaxsrc, PMax), title="Price Crossover Alarm", message="PRICE OVER PMax - BUY SIGNAL!")

alertcondition(ta.crossunder(pmaxsrc, PMax), title="Price Crossunder Alarm", message="PRICE UNDER PMax - SELL SIGNAL!")

buySignalk = ta.crossover(MAvg, PMax)

plotshape(buySignalk and showsignalsk ? PMax*0.995 : na, title="Buy", text="Buy", location=location.absolute, style=shape.labelup, size=size.tiny, color=color.new(color.green, transp = 0), textcolor=color.white)

sellSignallk = ta.crossunder(MAvg, PMax)

plotshape(sellSignallk and showsignalsk ? PMax*1.005 : na, title="Sell", text="Sell", location=location.absolute, style=shape.labeldown, size=size.tiny, color=color.new(color.red, transp = 0), textcolor=color.white)

// buySignalc = ta.crossover(pmaxsrc, PMax)

// plotshape(buySignalc and showsignalsc ? PMax*0.995 : na, title="Buy", text="Buy", location=location.absolute, style=shape.labelup, size=size.tiny, color=#0F18BF, textcolor=color.white)

// sellSignallc = ta.crossunder(pmaxsrc, PMax)

// plotshape(sellSignallc and showsignalsc ? PMax*1.005 : na, title="Sell", text="Sell", location=location.absolute, style=shape.labeldown, size=size.tiny, color=#0F18BF, textcolor=color.white)

// mPlot = plot(ohlc4, title="", style=plot.style_circles, linewidth=0,display=display.none)

longFillColor = highlighting ? (MAvg>PMax ? color.new(color.green, transp = 90) : na) : na

shortFillColor = highlighting ? (MAvg<PMax ? color.new(color.red, transp = 90) : na) : na

// fill(mPlot, pALL, title="UpTrend Highligter", color=longFillColor)

// fill(mPlot, pALL, title="DownTrend Highligter", color=shortFillColor)









group6 = "NADARAYA WATSON Settings"

//------------------------------------------------------------------------------

//Settings

//-----------------------------------------------------------------------------{

h = input.float(8.,'Bandwidth', minval = 0,group = group6)

mult = input.float(3., minval = 0,group = group6)

src = input(close, 'Source',group = group6)



repaint = input(true, 'Repainting Smoothing', tooltip = 'Repainting is an effect where the indicators historical output is subject to change over time. Disabling repainting will cause the indicator to output the endpoints of the calculations',group = group6)



//Style

upCss = input.color(color.teal, 'Colors', inline = 'inline1', group = group6)

dnCss = input.color(color.red, '', inline = 'inline1', group = group6)



//-----------------------------------------------------------------------------}

//Functions

//-----------------------------------------------------------------------------{

//Gaussian window

gauss(x, h) => math.exp(-(math.pow(x, 2)/(h * h * 2)))



//-----------------------------------------------------------------------------}

//Append lines

//-----------------------------------------------------------------------------{

n = bar_index



var ln = array.new_line(0)



if barstate.isfirst and repaint

for i = 0 to 499

array.push(ln,line.new(na,na,na,na))



//-----------------------------------------------------------------------------}

//End point method

//-----------------------------------------------------------------------------{

var coefs = array.new_float(0)

var den = 0.



if barstate.isfirst and not repaint

for i = 0 to 499

w = gauss(i, h)

coefs.push(w)



den := coefs.sum()



out = 0.

if not repaint

for i = 0 to 499

out += src * coefs.get(i)

out /= den

mae = ta.sma(math.abs(src - out), 499) * mult



upperN = out + mae

lowerN = out - mae



//-----------------------------------------------------------------------------}

//Compute and display NWE

//-----------------------------------------------------------------------------{

float y2 = na

float y1 = na



nwe = array.new<float>(0)

if barstate.islast and repaint

sae = 0.

//Compute and set NWE point

for i = 0 to math.min(499,n - 1)

sum = 0.

sumw = 0.

//Compute weighted mean

for j = 0 to math.min(499,n - 1)

w = gauss(i - j, h)

sum += src[j] * w

sumw += w



y2 := sum / sumw

sae += math.abs(src - y2)

nwe.push(y2)



sae := sae / math.min(499,n - 1) * mult

for i = 0 to math.min(499,n - 1)

if i%2 and showNadaray

line.new(n-i+1, y1 + sae, n-i, nwe.get(i) + sae, color = upCss)

line.new(n-i+1, y1 - sae, n-i, nwe.get(i) - sae, color = dnCss)



if src > nwe.get(i) + sae and src[i+1] < nwe.get(i) + sae and showNadaray

label.new(n-i, src, '▼', color = color(na), style = label.style_label_down, textcolor = dnCss, textalign = text.align_center)

if src < nwe.get(i) - sae and src[i+1] > nwe.get(i) - sae and showNadaray

label.new(n-i, src, '▲', color = color(na), style = label.style_label_up, textcolor = upCss, textalign = text.align_center)



y1 := nwe.get(i)



//-----------------------------------------------------------------------------}

//Dashboard

//-----------------------------------------------------------------------------{

var tb = table.new(position.top_right, 1, 1

, bgcolor = #1e222d

, border_color = #373a46

, border_width = 1

, frame_color = #373a46

, frame_width = 1)



if repaint

tb.cell(0, 0, 'Repainting Mode Enabled', text_color = color.white, text_size = size.small)



//-----------------------------------------------------------------------------}

//Plot

//-----------------------------------------------------------------------------}

// plot(repaint ? na : out + mae, 'Upper', upCss)

// plot(repaint ? na : out - mae, 'Lower', dnCss)



//Crossing Arrows

// plotshape(ta.crossunder(close, out - mae) ? low : na, "Crossunder", shape.labelup, location.absolute, color(na), 0 , text = '▲', textcolor = upCss, size = size.tiny)

// plotshape(ta.crossover(close, out + mae) ? high : na, "Crossover", shape.labeldown, location.absolute, color(na), 0 , text = '▼', textcolor = dnCss, size = size.tiny)



//-----------------------------------------------------------------------------}



//////////////////////////////////////////////////////////////////////////////////

enableD = input (true, "DIVERGANCE ON/OFF" , group="INDICATORS ON/OFF")

//DIVERGANCE

prd1 = input.int (defval=5 , title='PIVOT PERIOD' , minval=1, maxval=50 , group="DIVERGANCE")

source = input.string(defval='HIGH/LOW' , title='SOURCE FOR PIVOT POINTS' , options=['CLOSE', 'HIGH/LOW'] , group="DIVERGANCE")

searchdiv = input.string(defval='REGULAR/HIDDEN', title='DIVERGANCE TYPE' , options=['REGULAR', 'HIDDEN', 'REGULAR/HIDDEN'], group="DIVERGANCE")

showindis = input.string(defval='FULL' , title='SHOW INDICATORS NAME' , options=['FULL', 'FIRST LETTER', "DON'T SHOW"] , group="DIVERGANCE")

showlimit = input.int(1 , title='MINIMUM NUMBER OF DIVERGANCES', minval=1, maxval=11 , group="DIVERGANCE")

maxpp = input.int (defval=20 , title='MAXIMUM PIVOT POINTS TO CHECK', minval=1, maxval=20 , group="DIVERGANCE")

maxbars = input.int (defval=200 , title='MAXIMUM BARS TO CHECK' , minval=30, maxval=200 , group="DIVERGANCE")

showlast = input (defval=false , title='SHOW ONLY LAST DIVERGANCE' , group="DIVERGANCE")

dontconfirm = input (defval=false , title="DON'T WAIT FOR CONFORMATION" , group="DIVERGANCE")

showlines = input (defval=false , title='SHOW DIVERGANCE LINES' , group="DIVERGANCE")

showpivot = input (defval=false , title='SHOW PIVOT POINTS' , group="DIVERGANCE")

calcmacd = input (defval=true , title='MACD' , group="DIVERGANCE")

calcmacda = input (defval=true , title='MACD HISTOGRAM' , group="DIVERGANCE")

calcrsi = input (defval=true , title='RSI' , group="DIVERGANCE")

calcstoc = input (defval=true , title='STOCHASTIC' , group="DIVERGANCE")

calccci = input (defval=true , title='CCI' , group="DIVERGANCE")

calcmom = input (defval=true , title='MOMENTUM' , group="DIVERGANCE")

calcobv = input (defval=true , title='OBV' , group="DIVERGANCE")

calcvwmacd = input (true , title='VWMACD' , group="DIVERGANCE")

calccmf = input (true , title='CHAIKIN MONEY FLOW' , group="DIVERGANCE")

calcmfi = input (true , title='MONEY FLOW INDEX' , group="DIVERGANCE")

calcext = input (false , title='CHECK EXTERNAL INDICATOR' , group="DIVERGANCE")

externalindi = input (defval=close , title='EXTERNAL INDICATOR' , group="DIVERGANCE")

pos_reg_div_col = input (defval=#ffffff , title='POSITIVE REGULAR DIVERGANCE' , group="DIVERGANCE")

neg_reg_div_col = input (defval=#00def6 , title='NEGATIVE REGULAR DIVERGANCE' , group="DIVERGANCE")

pos_hid_div_col = input (defval=#00ff0a , title='POSITIVE HIDDEN DIVERGANCE' , group="DIVERGANCE")

neg_hid_div_col = input (defval=#ff0015 , title='NEGATIVE HIDDEN DIVERGANCE' , group="DIVERGANCE")

reg_div_l_style_ = input.string(defval='SOLID' , title='REGULAR DIVERGANCE LINESTYLE' , options=['SOLID', 'DASHED', 'DOTTED'] , group="DIVERGANCE")

hid_div_l_style_ = input.string(defval='SOLID' , title='HIDDEN DIVERGANCE LINESTYLE' , options=['SOLID', 'DASHED', 'DOTTED'] , group="DIVERGANCE")

reg_div_l_width = input.int (defval=2 , title='REGULAR DIVERGANCE LINEWIDTH' , minval=1, maxval=5 , group="DIVERGANCE")

hid_div_l_width = input.int (defval=2 , title='HIDDEN DIVERGANCE LINEWIDTH' , minval=1, maxval=5 , group="DIVERGANCE")

showmas = input.bool (defval=false , title='SHOW MOVING AVERAGES (50 & 200)', inline='MA' , group="DIVERGANCE")

cma1col = input.color (defval=#ffffff , title='' , inline='MA' , group="DIVERGANCE")

cma2col = input.color (defval=#00def6 , title='' , inline='MA' , group="DIVERGANCE")



//PLOTS

plot(showmas ? ta.sma(close, 50) : na, color=showmas ? cma1col : na)

plot(showmas ? ta.sma(close, 200) : na, color=showmas ? cma2col : na)



var reg_div_l_style = reg_div_l_style_ == 'SOLID' ? line.style_solid : reg_div_l_style_ == 'DASHED' ? line.style_dashed : line.style_dotted

var hid_div_l_style = hid_div_l_style_ == 'SOLID' ? line.style_solid : hid_div_l_style_ == 'DASHED' ? line.style_dashed : line.style_dotted

rsi = ta.rsi(close, 14)

[macd, signal, deltamacd] = ta.macd(close, 12, 26, 9)

moment = ta.mom(close, 10)

cci = ta.cci(close, 10)

Obv = ta.obv

stk = ta.sma(ta.stoch(close, high, low, 14), 3)

maFast = ta.vwma(close, 12)

maSlow = ta.vwma(close, 26)

vwmacd = maFast - maSlow

Cmfm = (close - low - (high - close)) / (high - low)

Cmfv = Cmfm * volume

cmf = ta.sma(Cmfv, 21) / ta.sma(volume, 21)

Mfi = ta.mfi(close, 14)



var indicators_name = array.new_string(11)

var div_colors = array.new_color(4)

if barstate.isfirst and enableD

array.set(indicators_name, 0, showindis == "DON'T SHOW" ? '' : '')

array.set(indicators_name, 1, showindis == "DON'T SHOW" ? '' : '')

array.set(indicators_name, 2, showindis == "DON'T SHOW" ? '' : '')

array.set(indicators_name, 3, showindis == "DON'T SHOW" ? '' : '')

array.set(indicators_name, 4, showindis == "DON'T SHOW" ? '' : '')

array.set(indicators_name, 5, showindis == "DON'T SHOW" ? '' : '')

array.set(indicators_name, 6, showindis == "DON'T SHOW" ? '' : '')

array.set(indicators_name, 7, showindis == "DON'T SHOW" ? '' : '')

array.set(indicators_name, 8, showindis == "DON'T SHOW" ? '' : '')

array.set(indicators_name, 9, showindis == "DON'T SHOW" ? '' : '')

array.set(indicators_name, 10, showindis == "DON'T SHOW" ? '' : '')

array.set(div_colors, 0, pos_reg_div_col)

array.set(div_colors, 1, neg_reg_div_col)

array.set(div_colors, 2, pos_hid_div_col)

array.set(div_colors, 3, neg_hid_div_col)



float ph1 = ta.pivothigh(source == 'CLOSE' ? close : high, prd1, prd1)

float pl1 = ta.pivotlow(source == 'CLOSE' ? close : low, prd1, prd1)

plotshape(ph1 and showpivot, text='H', style=shape.labeldown, color=color.new(color.white, 100), textcolor=#00def6, location=location.abovebar, offset=-prd1)

plotshape(pl1 and showpivot, text='L', style=shape.labelup, color=color.new(color.white, 100), textcolor=#ffffff, location=location.belowbar, offset=-prd1)



var int maxarraysize = 20

var ph_positions = array.new_int(maxarraysize, 0)

var pl_positions = array.new_int(maxarraysize, 0)

var ph_vals = array.new_float(maxarraysize, 0.)

var pl_vals = array.new_float(maxarraysize, 0.)

if ph1

array.unshift(ph_positions, bar_index)

array.unshift(ph_vals, ph1)

if array.size(ph_positions) > maxarraysize

array.pop(ph_positions)

array.pop(ph_vals)

if pl1

array.unshift(pl_positions, bar_index)

array.unshift(pl_vals, pl1)

if array.size(pl_positions) > maxarraysize

array.pop(pl_positions)

array.pop(pl_vals)



positive_regular_positive_hidden_divergence(src, cond) =>

divlen = 0

prsc = source == 'CLOSE' ? close : low

if dontconfirm or src > src[1] or close > close[1]

startpoint = dontconfirm ? 0 : 1

for x = 0 to maxpp - 1 by 1

len = bar_index - array.get(pl_positions, x) + prd1

if array.get(pl_positions, x) == 0 or len > maxbars

break

if len > 5 and (cond == 1 and src[startpoint] > src[len] and prsc[startpoint] < nz(array.get(pl_vals, x)) or cond == 2 and src[startpoint] < src[len] and prsc[startpoint] > nz(array.get(pl_vals, x)))

slope1 = (src[startpoint] - src[len]) / (len - startpoint)

virtual_line1 = src[startpoint] - slope1

slope2 = (close[startpoint] - close[len]) / (len - startpoint)

virtual_line2 = close[startpoint] - slope2

arrived = true

for y = 1 + startpoint to len - 1 by 1

if src[y] < virtual_line1 or nz(close[y]) < virtual_line2

arrived := false

break

virtual_line1 -= slope1

virtual_line2 -= slope2

virtual_line2

if arrived

divlen := len

break

divlen



negative_regular_negative_hidden_divergence(src, cond) =>

divlen = 0

prsc = source == 'CLOSE' ? close : high

if dontconfirm or src < src[1] or close < close[1]

startpoint = dontconfirm ? 0 : 1

for x = 0 to maxpp - 1 by 1

len = bar_index - array.get(ph_positions, x) + prd1

if array.get(ph_positions, x) == 0 or len > maxbars

break

if len > 5 and (cond == 1 and src[startpoint] < src[len] and prsc[startpoint] > nz(array.get(ph_vals, x)) or cond == 2 and src[startpoint] > src[len] and prsc[startpoint] < nz(array.get(ph_vals, x)))

slope1 = (src[startpoint] - src[len]) / (len - startpoint)

virtual_line1 = src[startpoint] - slope1

slope2 = (close[startpoint] - nz(close[len])) / (len - startpoint)

virtual_line2 = close[startpoint] - slope2

arrived = true

for y = 1 + startpoint to len - 1 by 1

if src[y] > virtual_line1 or nz(close[y]) > virtual_line2

arrived := false

break

virtual_line1 -= slope1

virtual_line2 -= slope2

virtual_line2

if arrived

divlen := len

break

divlen



//CALCULATIONS

calculate_divs(cond, indicator_1) =>

divs = array.new_int(4, 0)

array.set(divs, 0, cond and (searchdiv == 'REGULAR' or searchdiv == 'REGULAR/HIDDEN') ? positive_regular_positive_hidden_divergence(indicator_1, 1) : 0)

array.set(divs, 1, cond and (searchdiv == 'REGULAR' or searchdiv == 'REGULAR/HIDDEN') ? negative_regular_negative_hidden_divergence(indicator_1, 1) : 0)

array.set(divs, 2, cond and (searchdiv == 'HIDDEN' or searchdiv == 'REGULAR/HIDDEN') ? positive_regular_positive_hidden_divergence(indicator_1, 2) : 0)

array.set(divs, 3, cond and (searchdiv == 'HIDDEN' or searchdiv == 'REGULAR/HIDDEN') ? negative_regular_negative_hidden_divergence(indicator_1, 2) : 0)

divs



var all_divergences = array.new_int(44)

array_set_divs(div_pointer, index) =>

for x = 0 to 3 by 1

array.set(all_divergences, index * 4 + x, array.get(div_pointer, x))



array_set_divs(calculate_divs(calcmacd , macd) , 0)

array_set_divs(calculate_divs(calcmacda , deltamacd) , 1)

array_set_divs(calculate_divs(calcrsi , rsi) , 2)

array_set_divs(calculate_divs(calcstoc , stk) , 3)

array_set_divs(calculate_divs(calccci , cci) , 4)

array_set_divs(calculate_divs(calcmom , moment) , 5)

array_set_divs(calculate_divs(calcobv , Obv) , 6)

array_set_divs(calculate_divs(calcvwmacd, vwmacd) , 7)

array_set_divs(calculate_divs(calccmf , cmf) , 8)

array_set_divs(calculate_divs(calcmfi , Mfi) , 9)

array_set_divs(calculate_divs(calcext , externalindi), 10)



total_div = 0

for x = 0 to array.size(all_divergences) - 1 by 1

total_div += math.round(math.sign(array.get(all_divergences, x)))

total_div

if total_div < showlimit

array.fill(all_divergences, 0)



var pos_div_lines = array.new_line(0)

var neg_div_lines = array.new_line(0)

var pos_div_labels = array.new_label(0)

var neg_div_labels = array.new_label(0)



delete_old_pos_div_lines() =>

if array.size(pos_div_lines) > 0

for j = 0 to array.size(pos_div_lines) - 1 by 1

line.delete(array.get(pos_div_lines, j))

array.clear(pos_div_lines)

delete_old_neg_div_lines() =>

if array.size(neg_div_lines) > 0

for j = 0 to array.size(neg_div_lines) - 1 by 1

line.delete(array.get(neg_div_lines, j))

array.clear(neg_div_lines)

delete_old_pos_div_labels() =>

if array.size(pos_div_labels) > 0

for j = 0 to array.size(pos_div_labels) - 1 by 1

label.delete(array.get(pos_div_labels, j))

array.clear(pos_div_labels)

delete_old_neg_div_labels() =>

if array.size(neg_div_labels) > 0

for j = 0 to array.size(neg_div_labels) - 1 by 1

label.delete(array.get(neg_div_labels, j))

array.clear(neg_div_labels)

delete_last_pos_div_lines_label(n) =>

if n > 0 and array.size(pos_div_lines) >= n

asz = array.size(pos_div_lines)

for j = 1 to n by 1

line.delete(array.get(pos_div_lines, asz - j))

array.pop(pos_div_lines)

if array.size(pos_div_labels) > 0

label.delete(array.get(pos_div_labels, array.size(pos_div_labels) - 1))

array.pop(pos_div_labels)

delete_last_neg_div_lines_label(n) =>

if n > 0 and array.size(neg_div_lines) >= n

asz = array.size(neg_div_lines)

for j = 1 to n by 1

line.delete(array.get(neg_div_lines, asz - j))

array.pop(neg_div_lines)

if array.size(neg_div_labels) > 0

label.delete(array.get(neg_div_labels, array.size(neg_div_labels) - 1))

array.pop(neg_div_labels)



pos_reg_div_detected = false

neg_reg_div_detected = false

pos_hid_div_detected = false

neg_hid_div_detected = false



var last_pos_div_lines = 0

var last_neg_div_lines = 0

var remove_last_pos_divs = false

var remove_last_neg_divs = false

if pl1

remove_last_pos_divs := false

last_pos_div_lines := 0

last_pos_div_lines

if ph1

remove_last_neg_divs := false

last_neg_div_lines := 0

last_neg_div_lines



divergence_text_top = ''

divergence_text_bottom = ''

distances = array.new_int(0)

dnumdiv_top = 0

dnumdiv_bottom = 0

top_label_col = color.white

bottom_label_col = color.white

old_pos_divs_can_be_removed = true

old_neg_divs_can_be_removed = true

startpoint = dontconfirm ? 0 : 1



for x = 0 to 10 by 1

div_type = -1

for y = 0 to 3 by 1

if array.get(all_divergences, x * 4 + y) > 0

div_type := y

if y % 2 == 1

dnumdiv_top += 1

top_label_col := array.get(div_colors, y)

top_label_col

if y % 2 == 0

dnumdiv_bottom += 1

bottom_label_col := array.get(div_colors, y)

bottom_label_col

if not array.includes(distances, array.get(all_divergences, x * 4 + y))

array.push(distances, array.get(all_divergences, x * 4 + y))

new_line = showlines ? line.new(x1=bar_index - array.get(all_divergences, x * 4 + y), y1=source == 'CLOSE' ? close[array.get(all_divergences, x * 4 + y)] : y % 2 == 0 ? low[array.get(all_divergences, x * 4 + y)] : high[array.get(all_divergences, x * 4 + y)], x2=bar_index - startpoint, y2=source == 'CLOSE' ? close[startpoint] : y % 2 == 0 ? low[startpoint] : high[startpoint], color=array.get(div_colors, y), style=y < 2 ? reg_div_l_style : hid_div_l_style, width=y < 2 ? reg_div_l_width : hid_div_l_width) : na

if y % 2 == 0

if old_pos_divs_can_be_removed

old_pos_divs_can_be_removed := false

if not showlast and remove_last_pos_divs

delete_last_pos_div_lines_label(last_pos_div_lines)

last_pos_div_lines := 0

last_pos_div_lines

if showlast

delete_old_pos_div_lines()

array.push(pos_div_lines, new_line)

last_pos_div_lines += 1

remove_last_pos_divs := true

remove_last_pos_divs

if y % 2 == 1

if old_neg_divs_can_be_removed

old_neg_divs_can_be_removed := false

if not showlast and remove_last_neg_divs

delete_last_neg_div_lines_label(last_neg_div_lines)

last_neg_div_lines := 0

last_neg_div_lines

if showlast

delete_old_neg_div_lines()

array.push(neg_div_lines, new_line)

last_neg_div_lines += 1

remove_last_neg_divs := true

remove_last_neg_divs

if y == 0

pos_reg_div_detected := true

pos_reg_div_detected

if y == 1

neg_reg_div_detected := true

neg_reg_div_detected

if y == 2

pos_hid_div_detected := true

pos_hid_div_detected

if y == 3

neg_hid_div_detected := true

neg_hid_div_detected

if div_type >= 0

divergence_text_top += (div_type % 2 == 1 ? showindis != "DON'T SHOW" ? array.get(indicators_name, x) + '\n' : '' : '')

divergence_text_bottom += (div_type % 2 == 0 ? showindis != "DON'T SHOW" ? array.get(indicators_name, x) + '\n' : '' : '')

divergence_text_bottom

if showindis != "DON'T SHOW"

if dnumdiv_top > 0

divergence_text_top += str.tostring(dnumdiv_top)

divergence_text_top

if dnumdiv_bottom > 0

divergence_text_bottom += str.tostring(dnumdiv_bottom)

divergence_text_bottom

if divergence_text_top != ''

if showlast

delete_old_neg_div_labels()

array.push(neg_div_labels, label.new(x=bar_index, y=math.max(high, high[1]), color=top_label_col, style=label.style_diamond, size = size.auto))

if divergence_text_bottom != ''

if showlast

delete_old_pos_div_labels()

array.push(pos_div_labels, label.new(x=bar_index, y=math.min(low, low[1]), color=bottom_label_col, style=label.style_diamond, size = size.auto))




// POSITION AND SIZE
PosTable = input.string(defval="Bottom Right", title="Position", options=["Top Right", "Middle Right", "Bottom Right", "Top Center", "Middle Center", "Bottom Center", "Top Left", "Middle Left", "Bottom Left"], group="Table Location & Size", inline="1")
SizTable = input.string(defval="Auto", title="Size", options=["Auto", "Huge", "Large", "Normal", "Small", "Tiny"], group="Table Location & Size", inline="1")

Pos1Table = PosTable == "Top Right" ? position.top_right : PosTable == "Middle Right" ? position.middle_right : PosTable == "Bottom Right" ? position.bottom_right : PosTable == "Top Center" ? position.top_center : PosTable == "Middle Center" ? position.middle_center : PosTable == "Bottom Center" ? position.bottom_center : PosTable == "Top Left" ? position.top_left : PosTable == "Middle Left" ? position.middle_left : position.bottom_left
Siz1Table = SizTable == "Auto" ? size.auto : SizTable == "Huge" ? size.huge : SizTable == "Large" ? size.large : SizTable == "Normal" ? size.normal : SizTable == "Small" ? size.small : size.tiny


tbl = table.new(Pos1Table, 21, 16, border_width = 1, border_color = color.gray, frame_color = color.gray, frame_width = 1)

// Kullanıcı tarafından belirlenecek yeşil ve kırmızı zaman dilimi sayısı
greenThreshold = input.int(5, minval=1, maxval=10, title="Yeşil Zaman Dilimi Sayısı", group="Alarm Ayarları")
redThreshold = input.int(5, minval=1, maxval=10, title="Kırmızı Zaman Dilimi Sayısı", group="Alarm Ayarları")


// TIMEFRAMES OPTIONS
box01 = input.bool(true, "TF[01]", inline = "01", group="Select Timeframe")
tf01 = input.timeframe("1", "", inline = "01", group="Select Timeframe")

box02 = input.bool(false, "TF[02]", inline = "02", group="Select Timeframe")
tf02 = input.timeframe("3", "", inline = "02", group="Select Timeframe")

box03 = input.bool(true, "TF[03]", inline = "03", group="Select Timeframe")
tf03 = input.timeframe("5", "", inline = "03", group="Select Timeframe")

box04 = input.bool(true, "TF[04]", inline = "04", group="Select Timeframe")
tf04 = input.timeframe("15", "", inline = "04", group="Select Timeframe")

box05 = input.bool(false, "TF[05]", inline = "05", group="Select Timeframe")
tf05 = input.timeframe("30", "", inline = "05", group="Select Timeframe")

box06 = input.bool(true, "TF[06]", inline = "01", group="Select Timeframe")
tf06 = input.timeframe("60", "", inline = "01", group="Select Timeframe")

box07 = input.bool(false, "TF[07]", inline = "02", group="Select Timeframe")
tf07 = input.timeframe("120", "", inline = "02", group="Select Timeframe")

box08 = input.bool(false, "TF[08]", inline = "03", group="Select Timeframe")
tf08 = input.timeframe("180", "", inline = "03", group="Select Timeframe")

box09 = input.bool(true, "TF[09]", inline = "04", group="Select Timeframe")
tf09 = input.timeframe("240", "", inline = "04", group="Select Timeframe")

box10 = input.bool(false, "TF[10]", inline = "05", group="Select Timeframe")
tf10 = input.timeframe("D", "", inline = "05", group="Select Timeframe")


// indicator('Tillson FEMA', overlay=true)

length1 = input(1, 'FEMA Length')
a1 = input(0.7, 'Volume Factor')

e1 = ta.ema((high + low + 2 * close) / 4, length1)
e2 = ta.ema(e1, length1)
e3 = ta.ema(e2, length1)
e4 = ta.ema(e3, length1)
e5 = ta.ema(e4, length1)
e6 = ta.ema(e5, length1)
c1 = -a1 * a1 * a1
c2 = 3 * a1 * a1 + 3 * a1 * a1 * a1
c3 = -6 * a1 * a1 - 3 * a1 - 3 * a1 * a1 * a1
c4 = 1 + 3 * a1 + a1 * a1 * a1 + 3 * a1 * a1
FEMA = c1 * e6 + c2 * e5 + c3 * e4 + c4 * e3

tablocol1 = FEMA > FEMA[1]
tablocol3 = FEMA < FEMA[1]
color_1 = col1 ? color.rgb(149, 219, 35): col3 ? color.rgb(238, 11, 11) : color.yellow
plot(FEMA, color=color_1, linewidth=3, title='FEMA')
tilson1 = FEMA
tilson1a =FEMA[1]




// DEFINITION OF VALUES
symbol = ticker.modify(syminfo.tickerid, syminfo.session)
tfArr = array.new<string>(na)
tilson1Arr = array.new<float>(na)
tilson1aArr = array.new<float>(na)


// DEFINITIONS OF RSI & CCI FUNCTIONS APPENDED IN THE TIMEFRAME OPTIONS
cciNcciFun(tf, flg) =>
[tilson_, tilson1a_] = request.security(symbol, tf, [tilson1, tilson1a])


if flg and (barstate.isrealtime ? true : timeframe.in_seconds(timeframe.period) <= timeframe.in_seconds(tf))
array.push(tfArr, na(tf) ? timeframe.period : tf)
array.push(tilson1Arr, tilson_)
array.push(tilson1aArr, tilson1a_)




cciNcciFun(tf01, box01), cciNcciFun(tf02, box02), cciNcciFun(tf03, box03), cciNcciFun(tf04, box04),
cciNcciFun(tf05, box05), cciNcciFun(tf06, box06), cciNcciFun(tf07, box07), cciNcciFun(tf08, box08),
cciNcciFun(tf09, box09), cciNcciFun(tf10, box10)


// TABLE AND CELLS CONFIG
// Post Timeframe in format
tfTxt(x)=>
out = x
if not str.contains(x, "S") and not str.contains(x, "M") and
not str.contains(x, "W") and not str.contains(x, "D")
if str.tonumber(x)%60 == 0
out := str.tostring(str.tonumber(x)/60)+"H"
else
out := x + "m"
out

if barstate.islast
table.clear(tbl, 0, 0, 20, 15)

// TITLES
table.cell(tbl, 0, 0, "⏱", text_color=color.white, text_size=Siz1Table, bgcolor=#000000)
table.cell(tbl, 1, 0, "FEMA("+str.tostring(length1)+")", text_color=#FFFFFF, text_size=Siz1Table, bgcolor=#000000)




j = 1
greenCounter = 0 // Yeşil zaman dilimlerini saymak için bir sayaç
redCounter = 0
if array.size(tilson1Arr) > 0
for i = 0 to array.size(tilson1Arr) - 1
if not na(array.get(tilson1Arr, i))

//config values in the cells
TF_VALUE = array.get(tfArr,i)
tilson1VALUE = array.get(tilson1Arr, i)
tilson1aVALUE = array.get(tilson1aArr, i)



SIGNAL1 = tilson1VALUE >= tilson1aVALUE ? "▲" : tilson1VALUE <= tilson1aVALUE ? "▼" : na


// Yeşil oklar ve arka planı ayarla
greenArrowColor1 = SIGNAL1 == "▲" ? color.rgb(0, 255, 0) : color.rgb(255, 0, 0)
greenBgColor1 = SIGNAL1 == "▲" ? color.rgb(25, 70, 22) : color.rgb(93, 22, 22)



allGreen = tilson1VALUE >= tilson1aVALUE
allRed = tilson1VALUE <= tilson1aVALUE

// Determine background color for time text
timeBgColor = allGreen ? #194616 : (allRed ? #5D1616 : #000000)
txtColor = allGreen ? #00FF00 : (allRed ? #FF4500 : color.white)

if allGreen
greenCounter := greenCounter + 1
redCounter := 0
else if allRed
redCounter := redCounter + 1
greenCounter := 0
else
redCounter := 0
greenCounter := 0

// Dinamik pair değerini oluşturma
pair = "USDT_" + syminfo.basecurrency + "USDT"

// Bot ID için kullanıcı girişi
bot_id = input.int(12387976, title="Bot ID", minval=0,group ='3Comas Message', inline = '1') // Varsayılan değeri 12387976 olan bir tamsayı girişi alır
// E-posta tokenı için kullanıcı girişi
email_token = input("cd4111d4-549a-4759-a082-e8f45c91fa47", title="Email Token",group ='3Comas Message', inline = '1')
// USER INPUT FOR DELAY
delay_seconds = input.int(0, title="Delay Seconds", minval=0, maxval=86400,group ='3Comas Message', inline = '1')

// Dinamik mesajın oluşturulması
message = '{ "message_type": "bot", "bot_id": ' + str.tostring(bot_id) + ', "email_token": "' + email_token + '", "delay_seconds": ' + str.tostring(delay_seconds) + ', "pair": "' + pair + '"}'

// Kullanıcının belirlediği yeşil veya kırmızı zaman dilimi sayısına ulaşıldığında alarmı tetikle
if greenCounter >= greenThreshold
alert(message, alert.freq_once_per_bar_close)
// if redCounter >= redThreshold
// alert(message, alert.freq_once_per_bar_close)

// Kullanıcının belirlediği yeşil veya kırmızı zaman dilimi sayısına ulaşıldığında alarmı tetikle
// if greenCounter >= greenThreshold
// alert("Yeşil zaman dilimi sayısı " + str.tostring(greenThreshold) + " adede ulaştı", alert.freq_once_per_bar_close)
// if redCounter >= redThreshold
// alert("Kırmızı zaman dilimi sayısı " + str.tostring(redThreshold) + " adede ulaştı", alert.freq_once_per_bar_close)


table.cell(tbl, 0, j, tfTxt(TF_VALUE), text_color=txtColor, text_halign=text.align_left, text_size=Siz1Table, bgcolor=timeBgColor)
table.cell(tbl, 1, j, str.tostring(tilson1VALUE, "#.#######")+SIGNAL1, text_color=greenArrowColor1, text_halign=text.align_right, text_size=Siz1Table, bgcolor=greenBgColor1)



j += 1




prd = input.int(defval=10, title='Pivot Period', minval=4, maxval=30, group='Setup')
ppsrc = input.string(defval='High/Low', title='Source', options=['High/Low', 'Close/Open'], group='Setup')
maxnumpp = input.int(defval=20, title=' Maximum Number of Pivot', minval=5, maxval=100, group='Setup')
ChannelW = input.int(defval=10, title='Maximum Channel Width %', minval=1, group='Setup')
maxnumsr = input.int(defval=5, title=' Maximum Number of S/R', minval=1, maxval=10, group='Setup')
min_strength = input.int(defval=2, title=' Minimum Strength', minval=1, maxval=10, group='Setup')
labelloc = input.int(defval=20, title='Label Location', group='Colors', tooltip='Positive numbers reference future bars, negative numbers reference histical bars')
linestyle = input.string(defval='Dashed', title='Line Style', options=['Solid', 'Dotted', 'Dashed'], group='Colors')
linewidth = input.int(defval=2, title='Line Width', minval=1, maxval=4, group='Colors')
resistancecolor = input.color(defval=color.red, title='Resistance Color', group='Colors')
supportcolor = input.color(defval=color.lime, title='Support Color', group='Colors')
showpp = input(false, title='Show Point Points')

float src1 = ppsrc == 'High/Low' ? high : math.max(close, open)
float src2 = ppsrc == 'High/Low' ? low : math.min(close, open)
float ph = ta.pivothigh(src1, prd, prd)
float pl = ta.pivotlow(src2, prd, prd)

plotshape(ph and showpp, text='H', style=shape.labeldown, color=na, textcolor=color.new(color.red, 0), location=location.abovebar, offset=-prd)
plotshape(pl and showpp, text='L', style=shape.labelup, color=na, textcolor=color.new(color.lime, 0), location=location.belowbar, offset=-prd)

Lstyle = linestyle == 'Dashed' ? line.style_dashed : linestyle == 'Solid' ? line.style_solid : line.style_dotted

//calculate maximum S/R channel zone width
prdhighest = ta.highest(300)
prdlowest = ta.lowest(300)
cwidth = (prdhighest - prdlowest) * ChannelW / 100

var pivotvals = array.new_float(0)

if ph or pl
array.unshift(pivotvals, ph ? ph : pl)
if array.size(pivotvals) > maxnumpp // limit the array size
array.pop(pivotvals)

get_sr_vals(ind) =>
float lo = array.get(pivotvals, ind)
float hi = lo
int numpp = 0
for y = 0 to array.size(pivotvals) - 1 by 1
float cpp = array.get(pivotvals, y)
float wdth = cpp <= lo ? hi - cpp : cpp - lo
if wdth <= cwidth // fits the max channel width?
if cpp <= hi
lo := math.min(lo, cpp)
else
hi := math.max(hi, cpp)

numpp += 1
numpp
[hi, lo, numpp]

var sr_up_level = array.new_float(0)
var sr_dn_level = array.new_float(0)
sr_strength = array.new_float(0)

find_loc(strength) =>
ret = array.size(sr_strength)
for i = ret > 0 ? array.size(sr_strength) - 1 : na to 0 by 1
if strength <= array.get(sr_strength, i)
break
ret := i
ret
ret

check_sr(hi, lo, strength) =>
ret = true
for i = 0 to array.size(sr_up_level) > 0 ? array.size(sr_up_level) - 1 : na by 1
//included?
if array.get(sr_up_level, i) >= lo and array.get(sr_up_level, i) <= hi or array.get(sr_dn_level, i) >= lo and array.get(sr_dn_level, i) <= hi
if strength >= array.get(sr_strength, i)
array.remove(sr_strength, i)
array.remove(sr_up_level, i)
array.remove(sr_dn_level, i)
ret
else
ret := false
ret
break
ret

var sr_lines = array.new_line(11, na)
var sr_labels = array.new_label(11, na)

for x = 1 to 10 by 1
rate = 100 * (label.get_y(array.get(sr_labels, x)) - close) / close
label.set_text(array.get(sr_labels, x), text=str.tostring(label.get_y(array.get(sr_labels, x))) + '(' + str.tostring(rate, '#.##') + '%)')
label.set_x(array.get(sr_labels, x), x=bar_index + labelloc)
label.set_color(array.get(sr_labels, x), color=label.get_y(array.get(sr_labels, x)) >= close ? color.red : color.lime)
label.set_textcolor(array.get(sr_labels, x), textcolor=label.get_y(array.get(sr_labels, x)) >= close ? color.white : color.black)
label.set_style(array.get(sr_labels, x), style=label.get_y(array.get(sr_labels, x)) >= close ? label.style_label_down : label.style_label_up)
line.set_color(array.get(sr_lines, x), color=line.get_y1(array.get(sr_lines, x)) >= close ? resistancecolor : supportcolor)

if ph or pl
//because of new calculation, remove old S/R levels
array.clear(sr_up_level)
array.clear(sr_dn_level)
array.clear(sr_strength)
//find S/R zones
for x = 0 to array.size(pivotvals) - 1 by 1
[hi, lo, strength] = get_sr_vals(x)
if check_sr(hi, lo, strength)
loc = find_loc(strength)
// if strength is in first maxnumsr sr then insert it to the arrays
if loc < maxnumsr and strength >= min_strength
array.insert(sr_strength, loc, strength)
array.insert(sr_up_level, loc, hi)
array.insert(sr_dn_level, loc, lo)
// keep size of the arrays = 5
if array.size(sr_strength) > maxnumsr
array.pop(sr_strength)
array.pop(sr_up_level)
array.pop(sr_dn_level)

for x = 1 to 10 by 1
line.delete(array.get(sr_lines, x))
label.delete(array.get(sr_labels, x))

for x = 0 to array.size(sr_up_level) > 0 ? array.size(sr_up_level) - 1 : na by 1
float mid = math.round_to_mintick((array.get(sr_up_level, x) + array.get(sr_dn_level, x)) / 2)
rate = 100 * (mid - close) / close
array.set(sr_labels, x + 1, label.new(x=bar_index + labelloc, y=mid, text=str.tostring(mid) + '(' + str.tostring(rate, '#.##') + '%)', color=mid >= close ? color.red : color.lime, textcolor=mid >= close ? color.white : color.black, style=mid >= close ? label.style_label_down : label.style_label_up))

array.set(sr_lines, x + 1, line.new(x1=bar_index, y1=mid, x2=bar_index - 1, y2=mid, extend=extend.both, color=mid >= close ? resistancecolor : supportcolor, style=Lstyle, width=linewidth))

f_crossed_over() =>
ret = false
for x = 0 to array.size(sr_up_level) > 0 ? array.size(sr_up_level) - 1 : na by 1
float mid = math.round_to_mintick((array.get(sr_up_level, x) + array.get(sr_dn_level, x)) / 2)
if close[1] <= mid and close > mid
ret := true
ret
ret

f_crossed_under() =>
ret = false
for x = 0 to array.size(sr_up_level) > 0 ? array.size(sr_up_level) - 1 : na by 1
float mid = math.round_to_mintick((array.get(sr_up_level, x) + array.get(sr_dn_level, x)) / 2)
if close[1] >= mid and close < mid
ret := true
ret
ret

alertcondition(f_crossed_over(), title='Resistance Broken', message='Resistance Broken')
alertcondition(f_crossed_under(), title='Support Broken', message='Support Broken')

면책사항

해당 정보와 게시물은 금융, 투자, 트레이딩 또는 기타 유형의 조언이나 권장 사항으로 간주되지 않으며, 트레이딩뷰에서 제공하거나 보증하는 것이 아닙니다. 자세한 내용은 이용 약관을 참조하세요.