//@version=5
indicator("Nas Rivera", overlay=true, precision=0, explicit_plot_zorder=true,
max_labels_count=500 , max_bars_back = 500)
// Get user input
sensitivity = input.float(4, "Sensitivity (0.5 - 10)", 0.5, 10, step=0.1)
emaEnergy = input.bool(false, title="Show EMA Ribbon")
enCloud = input.bool(true, 'Enable Trend Ribbon', group='Cloud')
ShowTEX = input.bool(true, "Show Take Profit Signals")
levels = input.bool(false, "Show TP/SL Levels", group = "Risk Management")
lvlLines = input.bool(false, "Show Lines", group = "Risk Management")
linesStyle = input.string("SOLID", "", ["SOLID", "DASHED", "DOTTED"], group = "Risk
Management")
atrRisk = input.int(1, "Risk %", 1, group = "Risk Management")
atrLen = input.int(14, "ATR Length", 1, group = "Risk Management")
lvlDecimals = input.int(2, "Decimals", 1, 8, group = "Risk Management")
maType = input.string('McGinley', 'Filter', options=['EMA', 'DEMA', 'TEMA', 'WMA',
'VWMA', 'SMA', 'SMMA', 'HMA', 'LSMA', 'Kijun', 'McGinley', 'RMA'])
PipsMinSepPercent = input(60, 'Filter Strength')
// Colors
green = color.new(#2BBC4D, 0)
red = color.new(#C51D0B, 0)
green2 = color.new(#00DD00, 0)
red2 = color.new(#DD0000, 0)
bullcolorr = color.rgb(0, 255, 8)
bearcolorr = color.rgb(255, 0, 0)
// Keltner Channel function
keltner_channel(src, length) =>
    ma = ta.sma(src, length)
    rangec = high - low
    upper = ma + rangec
    lower = ma - rangec
    [upper, lower]
// Supertrend function
supertrend(_src, factor, atrLen, kel_length) =>
    [upperKeltner, lowerKeltner] = keltner_channel(_src, kel_length)
    rangec = upperKeltner - lowerKeltner
    upperBand = _src + factor * rangec
    lowerBand = _src - factor * rangec
    prevLowerBand = nz(lowerBand[1])
    prevUpperBand = nz(upperBand[1])
    lowerBand := lowerBand > prevLowerBand or close[1] < prevLowerBand ?
lowerBand : prevLowerBand
    upperBand := upperBand < prevUpperBand or close[1] > prevUpperBand ?
upperBand : prevUpperBand
    int direction = na
    float superTrend = na
    prevSuperTrend = superTrend[1]
    if na(rangec[1])
         direction := 1
    else if prevSuperTrend == prevUpperBand
         direction := close > upperBand ? -1 : 1
    else
         direction := close < lowerBand ? 1 : -1
    superTrend := direction == -1 ? lowerBand : upperBand
    [superTrend, direction]
[supertrend, direction] = supertrend(close, sensitivity, 11, 10)
bull = ta.crossover(close, supertrend)
bear = ta.crossunder(close, supertrend)
y1 = low - (ta.atr(30) * 2)
y2 = high + (ta.atr(30) * 2)
// Moving Average function
ma(type, src, len) =>
    float result = 0
    if type == 'SMA'
        result := ta.sma(src, len)
    else if type == 'EMA'
        result := ta.ema(src, len)
    else if type == 'DEMA'
        e = ta.ema(src, len)
        result := 2 * e - ta.ema(e, len)
    else if type == 'TEMA'
        e = ta.ema(src, len)
        result := 3 * (e - ta.ema(e, len)) + ta.ema(ta.ema(e, len), len)
    else if type == 'WMA'
        result := ta.wma(src, len)
    else if type == 'VWMA'
        result := ta.vwma(src, len)
    else if type == 'SMMA'
        w = ta.wma(src, len)
        sma_prev = ta.sma(src, len)
        sma_value = na(w[1]) ? sma_prev : (w[1] * (len - 1) + src) / len
        result := sma_value
    else if type == 'RMA'
        result := ta.rma(src, len)
    else if type == 'HMA'
        result := ta.wma(2 * ta.wma(src, len / 2) - ta.wma(src, len),
math.round(math.sqrt(len)))
    else if type == 'LSMA'
        result := ta.linreg(src, len, 0)
    else if type == 'Kijun'
        kijun = math.avg(ta.lowest(len), ta.highest(len))
        result := kijun
    else if type == 'McGinley'
        mg = 0.0
        ema_value = ta.ema(src, len)
        mg := na(mg[1]) ? ema_value : mg[1] + (src - mg[1]) / (len * math.pow(src /
mg[1], 4))
        result := mg
    result
// Braid Filter
ma01 = ma(maType, close, 3)
ma02 = ma(maType, open, 7)
ma03 = ma(maType, close, 20)
max = math.max(math.max(ma01, ma02), ma03)
min = math.min(math.min(ma01, ma02), ma03)
dif = max - min
filter = ta.atr(14) * PipsMinSepPercent / 100
BraidColor = ma01 > ma02 and dif > filter ? color.green : ma02 > ma01 and dif >
filter ? color.red : color.gray
// EMAs
ema1 = ta.ema(high, 9)
ema2 = ta.ema(high, 12)
ema3 = ta.ema(high, 15)
ema4 = ta.ema(high, 18)
ema5 = ta.ema(high, 21)
ema6 = ta.ema(high, 24)
ema7 = ta.ema(high, 27)
ema8 = ta.ema(high, 30)
ema9 = ta.ema(high, 33)
ema10 = ta.ema(high, 36)
ema11 = ta.ema(high, 39)
ema12 = ta.ema(high, 42)
ema13 = ta.ema(high, 45)
ema14 = ta.ema(high, 48)
ema15 = ta.ema(high, 51)
emaEnergyColor(ma) =>
    emaEnergy ? (close >= ma ? green : red) : color.new(na, 0)
// Buy and Sell signals
buy = (bull and ma01 > ma02 and dif > filter)
sell = (bear and ma02 > ma01 and dif > filter)
if (buy)
    label.new(bar_index, y1, "BUY", xloc.bar_index, yloc.price, green,
label.style_label_up, color.white, size.normal)
if (sell)
    label.new(bar_index, y2, "SELL", xloc.bar_index, yloc.price, red,
label.style_label_down, color.white, size.normal)
// Alert conditions
alertcondition(buy or sell, title="BUY or SELL Signal", message="BUY or SELL Signal
Triggered")
// Additional plots from NAS Ultimate Algo
sma4 = ta.sma(close, 8)
sma5 = ta.sma(close, 9)
sma9 = ta.sma(close, 13)
candle = ta.sma(close, 21)
reach = ta.sma(close, 34)
candlep = plot(enCloud ? candle : na, color=color.new(color.white, 100))
reachp = plot(enCloud ? reach : na, color=color.new(color.white, 100))
fill(reachp, candlep, color= candle > reach ? color.new(#00CC00, 75) :
color.new(#CC0000, 75))
// Trend Catcher Indicator
ema100 = ta.ema(close, 10)
ema200 = ta.ema(close, 20)
crossover_condition = ta.crossover(ema100, ema200)
crossunder_condition = ta.crossunder(ema100, ema200)
trendCatcher = crossover_condition ? 1 : crossunder_condition ? -1 : 0
trendColor = trendCatcher == 1 ? color.rgb(90, 23, 102) : na
barcolor(trendColor)
barcolor(color = close > supertrend ? color.rgb(102, 255, 0) : color.rgb(255, 0,
0))
// Take Profit Signals
rsiLengthInput = 22
rsiSourceInput = close
maTypeInput = ta.sma(close, 14)
up66 = ta.rma(math.max(ta.change(rsiSourceInput), 0), rsiLengthInput)
downw = ta.rma(-math.min(ta.change(rsiSourceInput), 0), rsiLengthInput)
rsi66 = downw == 0 ? 100 : up66 == 0 ? 0 : 100 - (100 / (1 + up66 / downw))
rsiMA = maTypeInput
long1 = ta.crossover(rsi66, 30)
long2 = ta.crossover(rsi66, 20)
long3 = ta.crossover(rsi66, 15)
short1 = ta.crossunder(rsi66, 70)
short2 = ta.crossunder(rsi66, 80)
short3 = ta.crossunder(rsi66, 85)
plotshape(long1 and ShowTEX, "GO LONG 1", style=shape.circle,
location=location.belowbar, size=size.tiny, color=color.new(bullcolorr,   60),
text="Sell TP", textcolor=bullcolorr, editable=false)
plotshape(long2 and ShowTEX, "GO LONG 2", style=shape.circle,
location=location.belowbar, size=size.tiny, color=color.new(bullcolorr,   50),
text="Sell TP", textcolor=bullcolorr, editable=false)
plotshape(long3 and ShowTEX, "GO LONG 3", style=shape.circle,
location=location.belowbar, size=size.tiny, color=color.new(bullcolorr,   10),
text="Sell TP", textcolor=bullcolorr, editable=false)
plotshape(short1 and ShowTEX, "GO SHORT 1", style=shape.circle,
location=location.abovebar, size=size.tiny, color=color.new(bearcolorr,   60),
text="Buy TP", textcolor=bearcolorr, editable=false)
plotshape(short2 and ShowTEX, "GO SHORT 2", style=shape.circle,
location=location.abovebar, size=size.tiny, color=color.new(bearcolorr,   50),
text="Buy TP", textcolor=bearcolorr, editable=false)
plotshape(short3 and ShowTEX, "GO SHORT 3", style=shape.circle,
location=location.abovebar, size=size.tiny, color=color.new(bearcolorr,   10),
text="Buy TP", textcolor=bearcolorr, editable=false)
alertcondition(long1 or short1, 'Trend Exhausted - 1', 'Trend Exhausted | Strength
- 1')
alertcondition(long2 or short2, 'Trend Exhausted - 2', 'Trend Exhausted | Strength
- 2')
alertcondition(long3 or short3, 'Trend Exhausted - 3', 'Trend Exhausted | Strength
- 3')
// High Lows
y1B = low - ta.atr(30)
y2B = high + ta.atr(30)
// Stop loss and take profit levels
decimals = lvlDecimals == 1 ? "#.#" : lvlDecimals == 2 ? "#.##" : lvlDecimals ==
3 ? "#.###" : lvlDecimals == 4 ? "#.####" : lvlDecimals == 5 ? "#.#####" :
lvlDecimals == 6 ? "#.######" : lvlDecimals == 7 ? "#.#######" : "#.########"
trigger2 = bull ? 1 : 0
countBull = ta.barssince(bull)
countBear = ta.barssince(bear)
trigger = nz(countBull, bar_index) < nz(countBear, bar_index) ? 1 : 0
atrBand = ta.atr(atrLen) * atrRisk
atrStop = trigger == 1 ? low - atrBand : high + atrBand
lastTrade(src) => ta.valuewhen(bull or bear, src, 0)
entry = levels ? label.new(time, close, "ENTRY " + str.tostring(lastTrade(close),
decimals), xloc.bar_time, yloc.price, color.rgb(0, 255, 251),
label.style_label_left, color.white, size.normal) : na
label.set_x(entry, label.get_x(entry) + math.round(ta.change(time) * lvlDecimals))
label.set_y(entry, lastTrade(close))
label.delete(entry[1])
stop_y = lastTrade(atrStop)
stop = levels ? label.new(time, close, "SL " + str.tostring(stop_y, decimals),
xloc.bar_time, yloc.price, red2, label.style_label_left, color.white,
size.normal) : na
label.set_x(stop, label.get_x(stop) + math.round(ta.change(time) * lvlDecimals))
label.set_y(stop, stop_y)
label.delete(stop[1])
tp1Rl_y = (lastTrade(close) - lastTrade(atrStop)) * 1 + lastTrade(close)
tp1Rl = levels ? label.new(time, close, "1:1 TP " + str.tostring(tp1Rl_y,
decimals), xloc.bar_time, yloc.price, green2, label.style_label_left, color.white,
size.normal) : na
label.set_x(tp1Rl, label.get_x(tp1Rl) + math.round(ta.change(time) * lvlDecimals))
label.set_y(tp1Rl, tp1Rl_y)
label.delete(tp1Rl[1])
tp2RL_y = (lastTrade(close) - lastTrade(atrStop)) * 2 + lastTrade(close)
tp2RL = levels ? label.new(time, close, "2:1 TP " + str.tostring(tp2RL_y,
decimals), xloc.bar_time, yloc.price, green2, label.style_label_left, color.white,
size.normal) : na
label.set_x(tp2RL, label.get_x(tp2RL) + math.round(ta.change(time) * lvlDecimals))
label.set_y(tp2RL, tp2RL_y)
label.delete(tp2RL[1])
tp3RL_y = (lastTrade(close) - lastTrade(atrStop)) * 3 + lastTrade(close)
tp3RL = levels ? label.new(time, close, "3:1 TP " + str.tostring(tp3RL_y,
decimals), xloc.bar_time, yloc.price, green2, label.style_label_left, color.white,
size.normal) : na
label.set_x(tp3RL, label.get_x(tp3RL) + math.round(ta.change(time) * lvlDecimals))
label.set_y(tp3RL, tp3RL_y)
label.delete(tp3RL[1])
style = linesStyle == "SOLID" ? line.style_solid : linesStyle == "DASHED" ?
line.style_dashed : line.style_dotted
lineEntry = levels and lvlLines ? line.new(bar_index - (trigger == 0 ? countBull :
countBear), lastTrade(close), bar_index + lvlDecimals, lastTrade(close),
xloc.bar_index, extend.none, color.rgb(0, 255, 251), style, 2) : na,
line.delete(lineEntry[1])
lineStop = levels and lvlLines ? line.new(bar_index - (trigger == 0 ? countBull :
countBear), stop_y, bar_index + lvlDecimals, stop_y, xloc.bar_index, extend.none,
red2, style, 2) : na, line.delete(lineStop[1])
lineTp1Rl = levels and lvlLines ? line.new(bar_index - (trigger == 0 ? countBull :
countBear), tp1Rl_y, bar_index + lvlDecimals, tp1Rl_y, xloc.bar_index, extend.none,
green2, style, 2) : na, line.delete(lineTp1Rl[1])
lineTp2RL = levels and lvlLines ? line.new(bar_index - (trigger == 0 ? countBull :
countBear), tp2RL_y, bar_index + lvlDecimals, tp2RL_y, xloc.bar_index, extend.none,
green2, style, 2) : na, line.delete(lineTp2RL[1])
lineTp3RL = levels and lvlLines ? line.new(bar_index - (trigger == 0 ? countBull :
countBear), tp3RL_y, bar_index + lvlDecimals, tp3RL_y, xloc.bar_index, extend.none,
green2, style, 2) : na, line.delete(lineTp3RL[1])
alertcondition(bull, title='Buy Signal', message="BUY")
alertcondition(bear, title='Sell Signal', message="SELL")
currentPrice = request.security(syminfo.tickerid, "15", close)
takeprofitValueL = input.float(title="TakeProfit Long ( ? 1.03 = 1.7%)",
defval=1.06, minval=1.03, maxval=1.15, group = 'LONG % SHORT')
takeprofitValueS = input.float(title="TakeProfit Short ( ? 0.96 = 1.7%)",
defval=0.93, minval=0.9, maxval=0.97, group = 'LONG % SHORT')
// Define los valores para las celdas
valorCelda1 = currentPrice * 0.987// ? SL 1.7%
valorCelda3 = currentPrice * takeprofitValueL // ? TP 5.93% == 1.06
valorCelda2 = currentPrice
valorCelda4 = currentPrice * 1.012 // ? SL 1.7%
valorCelda5 = currentPrice * takeprofitValueS // ? TP 7.1% == 0.93
// Dibuja un cuadro en la parte superior izquierda del gráfico
var box_x = ta.highest(high, 20)
var int box_y = int(ta.highest(high[20], 20))
var int box_width = 150
var int box_height = 80
var myTable3 = table.new(position = position.top_right, columns = 4, rows = 4,
bgcolor = color.white, border_width = 1, frame_color = color.black, frame_width =
2, border_color = color.black)
//table.cell(table_id = myTable3, column = 0, row = 0, text = "TP 3%", text_size =
size.small, text_color = color.black, bgcolor = color.yellow)
//table.cell(table_id = myTable3, column = 0, row = 1, text = "LONG", text_size =
size.small, text_color = color.black, bgcolor = color.white)
//table.cell(table_id = myTable3, column = 0, row = 2, text = "SL 1.7%", text_size
= size.small, text_color = color.black, bgcolor = color.blue)
//table.cell(table_id = myTable3, column = 1, row = 0, text =
str.tostring(valorCelda3), text_size = size.small, text_color = color.black,
bgcolor = color.yellow)
//table.cell(table_id = myTable3, column = 1, row = 1, text =
str.tostring(valorCelda2), text_size = size.small, text_color = color.black,
bgcolor = color.white)
//table.cell(table_id = myTable3, column = 1, row = 2, text =
str.tostring(valorCelda1), text_size = size.small, text_color = color.black,
bgcolor = color.blue)
var myTable4 = table.new(position = position.bottom_right, columns = 4, rows = 4,
bgcolor = color.white, border_width = 1, frame_color = color.black, frame_width =
2, border_color = color.black)
//table.cell(table_id = myTable4, column = 0, row = 0, text = "SL 1.7%", text_size
= size.small, text_color = color.black, bgcolor = color.red)
//table.cell(table_id = myTable4, column = 0, row = 1, text = "SHORT", text_size =
size.small, text_color = color.black, bgcolor = color.white)
//table.cell(table_id = myTable4, column = 0, row = 2, text = "TP 3%", text_size =
size.small, text_color = color.black, bgcolor = color.lime)
//table.cell(table_id = myTable4, column = 1, row = 0, text =
str.tostring(valorCelda4), text_size = size.small, text_color = color.black,
bgcolor = color.red)
//table.cell(table_id = myTable4, column = 1, row = 1, text =
str.tostring(valorCelda2), text_size = size.small, text_color = color.black,
bgcolor = color.white)
//table.cell(table_id = myTable4, column = 1, row = 2, text =
str.tostring(valorCelda5), text_size = size.small, text_color = color.black,
bgcolor = color.lime)
show_TPSL_LONG   = input.bool(false,'Enable Auto TP and SL in
Long',inline='inline1', group = 'LONG % SHORT')
show_TPSL_SHORT = input.bool(false,'Enable Auto TP and SL in
Short',inline='inline1', group = 'LONG % SHORT')
if show_TPSL_LONG
    // Variables para las líneas horizontales
    var line1 = line.new(x1=bar_index, y1=valorCelda1, x2=bar_index[1],
y2=valorCelda1, color=color.blue, width=1, extend = extend.left)
    var line3 = line.new(x1=bar_index, y1=valorCelda3, x2=bar_index[1],
y2=valorCelda3, color=color.yellow, width=1, extend = extend.left)
    var labelSL_LONG = label.new(x=na, y=na, text="SL", color=color.blue,
textcolor=color.white,style=label.style_label_up)
    var labelTP_LONG = label.new(x=na, y=na, text="TP", color=color.yellow,
textcolor=color.black,style=label.style_label_down)
    // Actualiza el valor de las líneas
    line.set_xy1(line1, bar_index, valorCelda1)
    line.set_xy2(line1, bar_index[1], valorCelda1)
    line.set_xy1(line3, bar_index, valorCelda3)
    line.set_xy2(line3, bar_index[1], valorCelda3)
    label.set_xy(labelSL_LONG, x=bar_index[1], y=valorCelda1)
    label.set_xy(labelTP_LONG, x=bar_index[1], y=valorCelda3)
    label.set_text(labelSL_LONG, text="SL: " + str.tostring(valorCelda1))
    label.set_text(labelTP_LONG, text="TP: " + str.tostring(valorCelda3))
if show_TPSL_SHORT
    // Variables para las líneas horizontales
    var line4 = line.new(x1=bar_index, y1=valorCelda4, x2=bar_index[1],
y2=valorCelda4, color=color.red, width=1, extend = extend.left)
    var line5 = line.new(x1=bar_index, y1=valorCelda5, x2=bar_index[1],
y2=valorCelda5, color=color.green, width=1, extend = extend.left)
    var labelSL_SHORT = label.new(x=na, y=na, text="SL", color=color.red,
textcolor=color.white,style=label.style_label_down)
    var labelTP_SHORT = label.new(x=na, y=na, text="TP", color=color.green,
textcolor=color.white,style=label.style_label_up)
    // Actualiza el valor de las líneas
    line.set_xy1(line4, bar_index, valorCelda4)
    line.set_xy2(line4, bar_index[1], valorCelda4)
    line.set_xy1(line5, bar_index, valorCelda5)
    line.set_xy2(line5, bar_index[1], valorCelda5)
    label.set_xy(labelSL_SHORT, x=bar_index[1], y=valorCelda4)
    label.set_xy(labelTP_SHORT, x=bar_index[1], y=valorCelda5)
    label.set_text(labelSL_SHORT, text="SL: " + str.tostring(valorCelda4))
    label.set_text(labelTP_SHORT, text="TP: " + str.tostring(valorCelda5))
var myTable = table.new(position = position.bottom_center, columns = 4, rows = 2,
bgcolor = color.white, border_width = 1, frame_color = color.black, frame_width =
2, border_color = color.black)
table.cell(table_id = myTable, column = 0, row = 0, text = "EMA20", text_size =
size.small, text_color = color.black, bgcolor = color.orange)
table.cell(table_id = myTable, column = 1, row = 0, text = "EMA50 ?", text_size =
size.small, text_color = color.black, bgcolor = color.lime)
//table.cell(table_id = myTable, column = 2, row = 0, text = "EMA100", text_size =
size.small, text_color = color.black, bgcolor = color.blue)
table.cell(table_id = myTable, column = 3, row = 0, text = "EMA200", text_size =
size.small, text_color = color.black, bgcolor = color.fuchsia)
table.cell(table_id = myTable, column = 0, row = 1, text = "EMA20", text_size =
size.small, text_color = color.black, bgcolor = color.orange)
table.cell(table_id = myTable, column = 1, row = 1, text = "EMA50 ?", text_size =
size.small, text_color = color.black, bgcolor = color.red)
//table.cell(table_id = myTable, column = 2, row = 1, text = "EMA100", text_size =
size.small, text_color = color.black, bgcolor = color.blue)
table.cell(table_id = myTable, column = 3, row = 1, text = "EMA200", text_size =
size.small, text_color = color.black, bgcolor = color.fuchsia)
//============ Directional Projection (EMA50) ================================//
showema50 = input(defval = true, title="Directional Projection EMA50", group =
'EMA')
ema02 = ta.ema(close, 50)
direction2 = ta.rising(ema02, 2) ? +1 : ta.falling(ema02, 2) ? -1 : 0
plot_color2 = direction2 > 0 ? color.lime: direction2 < 0 ? color.rgb(247, 34, 34)
: na
plot(showema50 and ema02 ? ema02 : na, style=plot.style_line, linewidth=1, color =
plot_color2)
//============ EMA 20/100/200/ ================================//
//showema100 = input(defval = false, title="Show EMA100", group = 'EMA')
showema200 = input(defval = true, title="Show EMA200", group = 'EMA')
//ema100 = ta.ema(close, 100)
//plot(showema100 and ema100 ? ema100 : na, color = showema100 and ema100 ?
color.blue : na, linewidth = 2)
plot(showema200 and ema200 ? ema200 : na, color = showema200 and ema200 ?
color.fuchsia : na, linewidth = 2)
//====================colour bar=====================//
mysignal = ta.ema(close, 12) - ta.ema(close, 26)
barcolor(mysignal[0] > mysignal[1] ? color.green : color.red)
//====================    BREAKS AND TRENDLINES   =====================//
length = 24
n = bar_index
k       = 1.6
method = 'Atr'
show    = input(true,'Show Only Confirmed Breakouts', group = 'BREAKS AND
TRENDLINES')
upper = 0.,lower = 0.
slope_ph = 0.,slope_pl = 0.
src = close
ph = ta.pivothigh(length,length)
pl = ta.pivotlow(length,length)
slope = switch method
     'Atr'      => ta.atr(length)/length*k
    'Stdev'     => ta.stdev(src,length)/length*k
    'Linreg'    => math.abs(ta.sma(src*bar_index,length)-
ta.sma(src,length)*ta.sma(bar_index,length))/ta.variance(n,length)/2*k
slope_ph := ph ? slope : slope_ph[1]
slope_pl := pl ? slope : slope_pl[1]
upper := ph ? ph : upper[1] - slope_ph
lower := pl ? pl : lower[1] + slope_pl
single_upper = 0
single_lower = 0
single_upper := src[length] > upper ? 0 : ph ? 1 : single_upper[1]
single_lower := src[length] < lower ? 0 : pl ? 1 : single_lower[1]
upper_breakout = single_upper[1] and src[length] > upper and (show ? src >
src[length] : 1)
lower_breakout = single_lower[1] and src[length] < lower and (show ? src <
src[length] : 1)
plotshape(upper_breakout ? low[length] : na,"Upper
Break",shape.labelup,location.absolute,#26a69a,-length,text="Buy
OK",textcolor=color.white,size=size.tiny)
plotshape(lower_breakout ? high[length] : na,"Lower
Break",shape.labeldown,location.absolute,#ef5350,-length,text="Sell
OK",textcolor=color.white,size=size.tiny)
var line up_l = na
var line dn_l = na
var label recent_up_break = na
var label recent_dn_break = na
if ph[1]
    line.delete(up_l[1])
    label.delete(recent_up_break[1])
    up_l := line.new(n-length-1,ph[1],n-length,upper,color=#26a69a,
      extend=extend.right,style=line.style_dashed)
if pl[1]
    line.delete(dn_l[1])
    label.delete(recent_dn_break[1])
    dn_l := line.new(n-length-1,pl[1],n-length,lower,color=#ef5350,
      extend=extend.right,style=line.style_dashed)
if ta.crossover(src,upper-slope_ph*length)
    label.delete(recent_up_break[1])
    recent_up_break := label.new(n,low,'Buy
Now',color=#26a69a,textcolor=color.white,style=label.style_label_up,size=size.small
)
if ta.crossunder(src,lower+slope_pl*length)
    label.delete(recent_dn_break[1])
    recent_dn_break := label.new(n,high,'Sell
Now',color=#ef5350,textcolor=color.white,style=label.style_label_down,size=size.sma
ll)
plot(upper,'Upper',color = ph ? na : #26a69a,offset=-length)
plot(lower,'Lower',color = pl ? na : #ef5350,offset=-length)
alerta1 = ta.crossover(src,upper-slope_ph*length)
alerta2 = ta.crossunder(src,lower+slope_pl*length)
Mensaje = 'El Precio ha roto la linea de tendencia'
if alerta1
    alert(Mensaje+" Superior.",alert.freq_once_per_bar)
else if alerta2
    alert(Mensaje+" Inferior.",alert.freq_once_per_bar)
//============ 'PIVOT POINTS') ===============//
length2 = 50
//n = bar_index
show_reg   = input.bool(true,'Regular Pivots',inline='inline1', group = 'PIVOT
POINTS')
reg_ph_css = input.color(#ef5350,'High',inline='inline1', group = 'PIVOT POINTS')
reg_pl_css = input.color(#26a69a,'Low',inline='inline1', group = 'PIVOT POINTS')
show_miss   = input.bool(true,'Missed Pivots',inline='inline2', group = 'PIVOT
POINTS')
miss_ph_css = input.color(#ef5350,'High',inline='inline2', group = 'PIVOT POINTS')
miss_pl_css = input.color(#26a69a,'Low',inline='inline2', group = 'PIVOT POINTS')
label_css = input.color(color.white,'Text Label Color', group = 'PIVOT POINTS')
var line zigzag = na
var line ghost_level = na
var max_x1 = 0,var min_x1 = 0
var follow_max = 0.,var follow_max_x1 = 0
var follow_min = 0.,var follow_min_x1 = 0
var os = 0,var py1 = 0.,var px1 = 0
ph2 = ta.pivothigh(length2,length2)
pl2 = ta.pivotlow(length2,length2)
max := math.max(high[length2],max)
min := math.min(low[length2],min)
follow_max := math.max(high[length2],follow_max)
follow_min := math.min(low[length2],follow_min)
if max > max[1]
    max_x1 := n-length2
    follow_min := low[length2]
if min < min[1]
    min_x1 := n-length2
    follow_max := high[length2]
if follow_min < follow_min[1]
    follow_min_x1 := n-length2
if follow_max > follow_max[1]
    follow_max_x1 := n-length2
line.set_x2(ghost_level[1],n)
if ph2
    if show_miss
        if os[1] == 1
label.new(min_x1,min,'??',color=miss_pl_css,style=label.style_label_up,size=size.sm
all,
              tooltip=str.tostring(min,'#.####'))
            zigzag :=
line.new(px1,py1,min_x1,min,color=miss_ph_css,style=line.style_dashed)
            px1 := min_x1,py1 := min
            line.set_x2(ghost_level[1],px1)
            ghost_level :=
line.new(px1,py1,px1,py1,color=color.new(reg_pl_css,50),width=2)
        else if ph2 < max
label.new(max_x1,max,'??',color=miss_ph_css,style=label.style_label_down,size=size.
small,
              tooltip=str.tostring(max,'#.####'))
label.new(follow_min_x1,follow_min,'??',color=miss_pl_css,style=label.style_label_u
p,size=size.small,
                   tooltip=str.tostring(min,'#.####'))
            zigzag :=
line.new(px1,py1,max_x1,max,color=miss_pl_css,style=line.style_dashed)
            px1 := max_x1,py1 := max
            line.set_x2(ghost_level[1],px1)
            ghost_level :=
line.new(px1,py1,px1,py1,color=color.new(reg_ph_css,50),width=2)
            zigzag :=
line.new(px1,py1,follow_min_x1,follow_min,color=miss_ph_css,style=line.style_dashed
)
            px1 := follow_min_x1,py1 := follow_min
            line.set_x2(ghost_level,px1)
            ghost_level :=
line.new(px1,py1,px1,py1,color=color.new(reg_pl_css,50),width=2)
    if show_reg
        label.new(n-
length2,ph2,'?',textcolor=label_css,color=reg_ph_css,style=label.style_label_down,s
ize=size.small,
          tooltip=str.tostring(ph2,'#.####'))
        zigzag := line.new(px1,py1,n-length2,ph2,color=miss_pl_css,style=ph2 < max
or os[1] == 1 ? line.style_dashed : line.style_solid)
    py1 := ph2,px1 := n-length2,os := 1,max := ph2,min := ph2
if pl2
    if show_miss
        if os[1] == 0
label.new(max_x1,max,'??',color=miss_ph_css,style=label.style_label_down,size=size.
small,
              tooltip=str.tostring(max,'#.####'))
            zigzag :=
line.new(px1,py1,max_x1,max,color=miss_pl_css,style=line.style_dashed)
            px1 := max_x1,py1 := max
            line.set_x2(ghost_level[1],px1)
            ghost_level :=
line.new(px1,py1,px1,py1,color=color.new(reg_ph_css,50),width=2)
        else if pl2 > min
label.new(follow_max_x1,follow_max,'??',color=miss_ph_css,style=label.style_label_d
own,size=size.small,
              tooltip=str.tostring(max,'#.####'))
label.new(min_x1,min,'??',color=miss_pl_css,style=label.style_label_up,size=size.sm
all,
                   tooltip=str.tostring(min,'#.####'))
             zigzag :=
line.new(px1,py1,min_x1,min,color=miss_ph_css,style=line.style_dashed)
             px1 := min_x1,py1 := min
             line.set_x2(ghost_level[1],px1)
             ghost_level :=
line.new(px1,py1,px1,py1,color=color.new(reg_pl_css,50),width=2)
             zigzag :=
line.new(px1,py1,follow_max_x1,follow_max,color=miss_pl_css,style=line.style_dashed
)
             px1 := follow_max_x1,py1 := follow_max
             line.set_x2(ghost_level,px1)
             ghost_level :=
line.new(px1,py1,px1,py1,color=color.new(reg_ph_css,50),width=2)
     if show_reg
         label.new(n-
length2,pl2,'?',textcolor=label_css,color=reg_pl_css,style=label.style_label_up,siz
e=size.small,
           tooltip=str.tostring(pl2,'#.####'))
         zigzag := line.new(px1,py1,n-length2,pl2,color=miss_ph_css,style=pl2 > min
or os[1] == 0 ? line.style_dashed : line.style_solid)
    py1 := pl2,px1 := n-length2,os := 0,max := pl2,min := pl2
var label lbl = na
if barstate.islast
    x = 0,y = 0.
    prices = array.new_float(0)
    prices_x = array.new_int(0)
    for i = 0 to n-px1-1
         array.push(prices,os==1?low[i]:high[i])
         array.push(prices_x,n-i)
    label.delete(lbl[1])
    if os == 1
         y := array.min(prices)
         x := array.get(prices_x,array.indexof(prices,y))
         if show_miss
             lbl :=
label.new(x,y,'??',color=miss_pl_css,style=label.style_label_up,size=size.small,
tooltip=str.tostring(y,'#.####'))
    else
         y := array.max(prices)
         x := array.get(prices_x,array.indexof(prices,y))
         if show_miss
             lbl :=
label.new(x,y,'??',color=miss_ph_css,style=label.style_label_down,size=size.small,
tooltip=str.tostring(y,'#.####'))
    if show_miss
         line.delete(line.new(px1,py1,x,y,color=os == 1 ? miss_ph_css :
miss_pl_css,style=line.style_dashed)[1])
    line.delete(line.new(x,y,n,y,color = color.new(os == 1 ? miss_ph_css :
miss_pl_css,50),width=2)[1])
//==========    MEGA TREND LINES    ===========
prd = 2 //min 1 max 50
Factor=3
Pd=10
showlabel = input(defval = true, title="Show Buy/Sell Labels", group = 'MEGA TREND
LINES')
showpivot = input(defval = false, title="Show Pivot Points", group = 'MEGA TREND
LINES')
showcl = input(defval = false, title="Show PP Center Line", group = 'MEGA TREND
LINES')
// get Pivot High/Low
float ph22 = ta.pivothigh(prd, prd)
float pl22 = ta.pivotlow(prd, prd)
// drawl Pivot Points if "showpivot" is enabled
// calculate the Center line using pivot points
var float center = na
float lastpp = ph22 ? ph22 : pl22 ? pl22 : na
if lastpp
    if na(center)
         center := lastpp
    else
         //weighted calculation
         center := (center * 2 + lastpp) / 3
// upper/lower bands calculation
Up = center - (Factor * ta.atr(Pd))
Dn = center + (Factor * ta.atr(Pd))
// get the trend
float TUp = na
float TDown = na
Trend = 0
TUp := close[1] > TUp[1] ? math.max(Up, TUp[1]) : Up
TDown := close[1] < TDown[1] ? math.min(Dn, TDown[1]) : Dn
Trend := close > TDown[1] ? 1: close < TUp[1]? -1: nz(Trend[1], 1)
Trailingsl = Trend == 1 ? TUp : TDown
// plot the trend
linecolor = Trend == 1 and nz(Trend[1]) == 1 ? color.lime : Trend == -1 and
nz(Trend[1]) == -1 ? color.red : na
plot(showlabel and Trailingsl ? Trailingsl : na, color = linecolor , linewidth =
2, title = "PP SuperTrend")
plot(showcl ? center : na, color = showcl ? center < hl2 ? color.blue : color.red :
na)
// check and plot the signals
bsignal = Trend == 1 and Trend[1] == -1
ssignal = Trend == -1 and Trend[1] == 1
plotshape(bsignal and showlabel ? Trailingsl : na, title="Buy", text="Close Short
Order\nGo to Long Now", location = location.absolute, style = shape.labelup, size =
size.tiny, color = color.lime, textcolor = color.black)
plotshape(ssignal and showlabel ? Trailingsl : na, title="Sell", text="Close Long
Order\nGo to Short Now", location = location.absolute, style = shape.labeldown,
size = size.tiny, color = color.red, textcolor = color.white)
alerta3 = bsignal
alerta4 = ssignal
Mensaje2 = 'Cierre la posicion y abra una en'
if alerta3
    alert(Mensaje2+" Long.",alert.freq_all)
else if alerta4
    alert(Mensaje2+" Short.",alert.freq_all)
//============ Golden Cross Indicator 50/200 ===============//
showGoldeCross = input(defval = true, title="Show Golden Cross", group = 'GOLDEN
CROSS')
short = ta.ema(close, 50)
long = ta.ema(close, 200)
directionc = ta.rising(long, 2) ? +1 : ta.falling(long, 2) ? -1 : 0
tendenup=ta.crossover(short, long)
tendendown=ta.crossunder(short, long)
//============ Support/Resistance ===============//
//get S/R levels using Pivot Points
showsr = input(defval = false, title="Show Support/Resistance", group = 'SUPPORT
AND RESISTANCE')
float resistance = na
float support = na
support := pl22 ? pl22 : support[1]
resistance := ph22 ? ph22 : resistance[1]
// if enabled then show S/R levels
plot(showsr and support ? support : na, color = showsr and support ? color.lime :
na, style = plot.style_circles, linewidth = 1, offset = 0)
plot(showsr and resistance ? resistance : na, color = showsr and resistance ?
color.red : na, style = plot.style_circles, linewidth = 1, offset = 0)
//============ Fair Value Gaps ===============//
//-----------------------------------------------------------------------------{
bullCss           = input.color(color.teal, 'FVG Level'              , inline =
'bull', group = 'FAIR VALUE GAPS')
bullAreaCss       = input.color(color.new(color.teal, 50), 'Area'    , inline =
'bull', group = 'FAIR VALUE GAPS')
bullMitigatedCss = input.color(color.new(color.teal, 80), 'Mitigated', inline =
'bull', group = 'FAIR VALUE GAPS')
bearCss           = input.color(color.red, 'FVG Level'               , inline =
'bear', group = 'FAIR VALUE GAPS')
bearAreaCss       = input.color(color.new(color.red, 50), 'Area'     , inline =
'bear', group = 'FAIR VALUE GAPS')
bearMitigatedCss = input.color(color.new(color.red, 80), 'Mitigated' , inline =
'bear', group = 'FAIR VALUE GAPS')
//UDT's
type fvg
    float top
    float btm
    bool mitigated
    bool isnew
    bool isbull
    line lvl
    box    area
type session_range
    line max
    line min
//Methods
//Method for setting fair value gaps
method set_fvg(fvg id, offset, bg_css, l_css)=>
    avg = math.avg(id.top, id.btm)
    area = box.new(n - offset, id.top, n, id.btm, na, bgcolor = bg_css)
    avg_l = line.new(n - offset, avg, n, avg, color = l_css, style =
line.style_dashed)
    id.lvl := avg_l
    id.area := area
//Method for setting session range maximum/minimum
method set_range(session_range id)=>
    max = math.max(high, id.max.get_y2())
    min = math.min(low, id.min.get_y2())
    id.max.set_xy2(n, max)
    id.max.set_y1(max)
    id.min.set_xy2(n, min)
    id.min.set_y1(min)
//Variables
var chartCss = color.new(chart.fg_color, 50)
var fvg sfvg = fvg.new(na, na, na, true, na)
var session_range sesr = na
var box area = na
var line avg = na
bull_fvg = low > high[2] and close[1] > high[2]
bear_fvg = high < low[2] and close[1] < low[2]
//Alert conditions
bull_isnew      = false
bear_isnew      = false
bull_mitigated = false
bear_mitigated = false
within_bull_fvg = false
within_bear_fvg = false
//New session
dtf = timeframe.change('D')
//On new session
if dtf
    //Set delimiter
    line.new(n, high + syminfo.mintick
       , n, low - syminfo.mintick
       , color = chartCss
       , style = line.style_dashed
       , extend = extend.both)
    //Set new range
    sesr := session_range.new(
       line.new(n, high, n, high, color = chartCss)
       , line.new(n, low, n, low, color = chartCss))
    sfvg.isnew := true
    //Set prior session fvg right coordinates
    if not na(sfvg.lvl)
         sfvg.lvl.set_x2(n-2)
         sfvg.area.set_right(n-2)
//Set range
else if not na(sesr)
    sesr.set_range()
    //Set range lines color
    sesr.max.set_color(sfvg.isbull ? bullCss : bearCss)
    sesr.min.set_color(sfvg.isbull ? bullCss : bearCss)
//Set FVG
//New session bullish fvg
if bull_fvg and sfvg.isnew
    sfvg := fvg.new(low, high[2], false, false, true)
    sfvg.set_fvg(2, bullAreaCss, bullCss)
    bull_isnew := true
//New session bearish fvg
else if bear_fvg and sfvg.isnew
    sfvg := fvg.new(low[2], high, false, false, false)
    sfvg.set_fvg(2, bearAreaCss, bearCss)
    bear_isnew := true
//Change object transparencies if mitigated
if not sfvg.mitigated
    //If session fvg is bullish
    if sfvg.isbull and close < sfvg.btm
         sfvg.set_fvg(1, bullMitigatedCss, bullCss)
         sfvg.mitigated := true
         bull_mitigated := true
    //If session fvg is bearish
    else if not sfvg.isbull and close > sfvg.top
         sfvg.set_fvg(1, bearMitigatedCss, bearCss)
         sfvg.mitigated := true
         bear_mitigated := true
//Set fvg right coordinates to current bar
if not sfvg.isnew
    sfvg.lvl.set_x2(n)
    sfvg.area.set_right(n)
//-----------------------------------------------------------------------------}
// áreas de oferta y demanda
//------------------------------------------------------------------------------
per = input.float(10., 'Threshold %', minval = 0, maxval = 100)
div = input.int(50, 'Resolution'     , minval = 2, maxval = 500)
tf = input.timeframe('', 'Intrabar TF')
//Colors
showSupply = input(true ,'Supply         ', inline = 'supply', group = 'SUPPLY AND
DEMAND')
supplyCss = input(#2157f3, ''           , inline = 'supply', group = 'SUPPLY AND
DEMAND')
supplyArea = input(true ,'Area'           , inline = 'supply', group = 'SUPPLY AND
DEMAND')
supplyAvg = input(true ,'Average'         , inline = 'supply', group = 'SUPPLY AND
DEMAND')
supplyWavg = input(true ,'Weighted'       , inline = 'supply', group = 'SUPPLY AND
DEMAND')
showEqui    = input(true ,'Equilibrium'   , inline = 'equi' , group = 'SUPPLY AND
DEMAND')
equiCss     = input(color.gray, ''      , inline = 'equi' , group = 'SUPPLY AND
DEMAND')
equiAvg     = input(true ,'Average'       , inline = 'equi' , group = 'SUPPLY AND
DEMAND')
equiWavg    = input(true ,'Weighted'      , inline = 'equi' , group = 'SUPPLY AND
DEMAND')
showDemand = input(true ,'Demand     '    , inline = 'demand', group = 'SUPPLY AND
DEMAND')
demandCss = input(#ff5d00, ''           , inline = 'demand', group = 'SUPPLY AND
DEMAND')
demandArea = input(true ,'Area'           , inline = 'demand', group = 'SUPPLY AND
DEMAND')
demandAvg = input(true ,'Average'         , inline = 'demand', group = 'SUPPLY AND
DEMAND')
demandWavg = input(true ,'Weighted'       , inline = 'demand', group = 'SUPPLY AND
DEMAND')
//UDT's
type bin
    float lvl
    float prev
    float sum
    float prev_sum
    float csum
    float avg
    bool isreached
type area
    box bx
    line avg
    line wavg
//Functions
get_hlv()=> [high, low, volume]
method set_area(area id, x1, top, btm, avg, wavg, showArea, showAvg, showWavg)=>
    if showArea
         id.bx.set_lefttop(x1, top)
         id.bx.set_rightbottom(n, btm)
    if showAvg
         id.avg.set_xy1(x1, avg)
         id.avg.set_xy2(n, avg)
    if showWavg
        id.wavg.set_xy1(x1, wavg)
        id.wavg.set_xy2(n, wavg)
//Main variables
var x1   = 0
var csum = 0.
//Intrabar data
[h, l, v] = request.security_lower_tf(syminfo.tickerid, tf, get_hlv())
//Init on left bar
if time == chart.left_visible_bar_time
    max := high
    min := low
    csum := volume
    x1 := n
else //Accumulate
    max := math.max(high, max)
    min := math.min(low, min)
    csum += volume
//Set zones
var supply_area = area.new(
  box.new(na, na, na, na, na, bgcolor = color.new(supplyCss, 90),text = "::: Supply
:::",text_color=color.white)
  , line.new(na, na, na, na, color = supplyCss)
  , line.new(na, na, na, na, color = supplyCss, style = line.style_dashed))
var demand_area = area.new(
  box.new(na, na, na, na, na, bgcolor = color.new(demandCss, 90),text = "::: Demand
:::",text_color=color.white)
  , line.new(na, na, na, na, color = demandCss)
  , line.new(na, na, na, na, color = demandCss, style = line.style_dashed))
var equi = line.new(na, na, na, na, color = equiCss)
var wequi = line.new(na, na, na, na, color = equiCss, style = line.style_dashed)
var float supply_wavg = na
var float demand_wavg = na
if time == chart.right_visible_bar_time
    r = (max - min) / div
    supply = bin.new(max, max, 0, 0, 0, 0, false)
    demand = bin.new(min, min, 0, 0, 0, 0, false)
    //Loop trough intervals
    for i = 0 to div-1
        supply.lvl -= r
        demand.lvl += r
        //Accumulated volume column
        if not supply.isreached and showSupply and supplyArea
             box.new(x1, supply.prev, x1 + int(supply.sum / csum * (n - x1)),
supply.lvl, na
               , bgcolor = color.new(supplyCss, 50))
        if not demand.isreached and showDemand and demandArea
             box.new(x1, demand.lvl, x1 + int(demand.sum / csum * (n - x1)),
demand.prev, na
               , bgcolor = color.new(demandCss, 50))
        //Loop trough bars
        for j = 0 to (n - x1)-1
             //Loop trough intrabars
             for k = 0 to (v[j]).size()-1
                 //Accumulate if within upper internal
                 supply.sum      += (h[j]).get(k) > supply.lvl and (h[j]).get(k) <
supply.prev ? (v[j]).get(k) : 0
                 supply.avg      += supply.lvl * (supply.sum - supply.prev_sum)
                 supply.csum     += supply.sum - supply.prev_sum
                 supply.prev_sum := supply.sum
                //Accumulate if within lower interval
                demand.sum      += (l[j]).get(k) < demand.lvl and (l[j]).get(k) >
demand.prev ? (v[j]).get(k) : 0
                demand.avg      += demand.lvl * (demand.sum - demand.prev_sum)
                demand.csum     += demand.sum - demand.prev_sum
                demand.prev_sum := demand.sum
            //Test if supply accumulated volume exceed threshold and set box
            if supply.sum / csum * 100 > per and not supply.isreached
                avg = math.avg(max, supply.lvl)
                supply_wavg := supply.avg / supply.csum
                //Set Box/Level coordinates
                if showSupply
                    supply_area.set_area(x1, max, supply.lvl, avg, supply_wavg,
supplyArea, supplyAvg, supplyWavg)
                supply.isreached := true
            //Test if demand accumulated volume exceed threshold and set box
            if demand.sum / csum * 100 > per and not demand.isreached and
showDemand
                avg = math.avg(min, demand.lvl)
                demand_wavg := demand.avg / demand.csum
                //Set Box/Level coordinates
                if showDemand
                    demand_area.set_area(x1, demand.lvl, min, avg, demand_wavg,
demandArea, demandAvg, demandWavg)
                demand.isreached := true
            if supply.isreached and demand.isreached
                break
        if supply.isreached and demand.isreached and showEqui
            //Set equilibrium
            if equiAvg
                avg = math.avg(max, min)
                equi.set_xy1(x1, avg)
                equi.set_xy2(n, avg)
            //Set weighted equilibrium
            if equiWavg
                wavg = math.avg(supply_wavg, demand_wavg)
                wequi.set_xy1(x1, wavg)
                wequi.set_xy2(n, wavg)
            break
        supply.prev := supply.lvl
        demand.prev := demand.lvl
//============================= SCALPING PULLBACK TOOL
=================================================//
HiLoLen         = 34
fastEMAlength   = 12
mediumEMAlength = 200
slowEMAlength   = 600
ShowFastEMA     = input(true, title="Show FastEMA", group = "SCALPING PULLBACK
TOOL")
ShowFractals    = input(true, title="Show Fractals", group = "SCALPING PULLBACK
TOOL")
ShowBuySell     = input(true, title="Show Buy/Sell Alert Arrows", group = "SCALPING
PULLBACK TOOL")
filterBW        = false
ShowBarColor    = true
Lookback           = 3
DelayArrow         = false
Delay              = DelayArrow ? 1 : 0
ShowTrendBGcolor= true
UseHAcandles       = true
haClose = UseHAcandles ? request.security(ticker.heikinashi(syminfo.tickerid),
timeframe.period, close) : close
haOpen = UseHAcandles ? request.security(ticker.heikinashi(syminfo.tickerid),
timeframe.period, open) : open
haHigh = UseHAcandles ? request.security(ticker.heikinashi(syminfo.tickerid),
timeframe.period, high) : high
haLow     = UseHAcandles ? request.security(ticker.heikinashi(syminfo.tickerid),
timeframe.period, low) : low
isRegularFractal(mode) =>
     ret = mode == 1 ? high[4] < high[3] and high[3] < high[2] and high[2] > high[1]
and
         high[1] > high[0] : mode == -1 ?
         low[4] > low[3] and low[3] > low[2] and low[2] < low[1] and low[1] <
low[0] :
         false
     ret
isBWFractal(mode) =>
     ret = mode == 1 ? high[4] < high[2] and high[3] <= high[2] and high[2] >=
high[1] and
         high[2] > high[0] : mode == -1 ?
         low[4] > low[2] and low[3] >= low[2] and low[2] <= low[1] and low[2] <
low[0] :
         false
     ret
fastEMA        = ta.ema(haClose, fastEMAlength)
mediumEMA      = ta.ema(haClose, mediumEMAlength)
slowEMA        = ta.ema(haClose, slowEMAlength)
pacC           = ta.ema(haClose, HiLoLen)
pacL           = ta.ema(haLow, HiLoLen)
pacU           = ta.ema(haHigh, HiLoLen)
TrendDirection = fastEMA > mediumEMA and pacL > mediumEMA ? 1 : fastEMA < mediumEMA
and pacU < mediumEMA ? -1 : 0
filteredtopf = filterBW ? isRegularFractal(1) : isBWFractal(1)
filteredbotf = filterBW ? isRegularFractal(-1) : isBWFractal(-1)
valuewhen_H0 = ta.valuewhen(filteredtopf == true, high[2], 0)
valuewhen_H1 = ta.valuewhen(filteredtopf == true, high[2], 1)
valuewhen_H2 = ta.valuewhen(filteredtopf == true, high[2], 2)
higherhigh = filteredtopf == false ? false :
    valuewhen_H1 < valuewhen_H0 and valuewhen_H2 < valuewhen_H0
lowerhigh = filteredtopf == false ? false :
    valuewhen_H1 > valuewhen_H0 and valuewhen_H2 > valuewhen_H0
valuewhen_L0 = ta.valuewhen(filteredbotf == true, low[2], 0)
valuewhen_L1 = ta.valuewhen(filteredbotf == true, low[2], 1)
valuewhen_L2 = ta.valuewhen(filteredbotf == true, low[2], 2)
higherlow = filteredbotf == false ? false :
    valuewhen_L1 < valuewhen_L0 and valuewhen_L2 < valuewhen_L0
lowerlow = filteredbotf == false ? false :
    valuewhen_L1 > valuewhen_L0 and valuewhen_L2 > valuewhen_L0
TradeDirection = 0
TradeDirection := nz(TradeDirection[1])
pacExitU = haOpen < pacU and haClose > pacU and
ta.barssince(haClose<pacC)<=Lookback
pacExitL = haOpen > pacL and haClose < pacL and
ta.barssince(haClose>pacC)<=Lookback
Buy = TrendDirection == 1 and pacExitU
Sell = TrendDirection == -1 and pacExitL
TradeDirection := TradeDirection == 1 and haClose<pacC ? 0 :
   TradeDirection == -1 and haClose>pacC ? 0 :
   TradeDirection == 0 and Buy ? 1 :
   TradeDirection == 0 and Sell ? -1 : TradeDirection
// Show buy/sell arrows and Draw the EMA ribbon and fractals
plotarrow(ShowBuySell and nz(TradeDirection[1+Delay]) == 0 and
TradeDirection[Delay] != 0 ? TradeDirection[Delay] : na, offset=-Delay,
colorup=color.green, colordown=color.red, transp=20, minheight=20, maxheight=50,
title="Buy/Sell Arrow")
//------------------------------------------------------------------------------
// Settings
//-----------------------------------------------------------------------------{
clGR   = 'Liquidation Price Calculator'
lmTT = 'Presents liquidations on the price chart by measuring the highest leverage
value of longs and shorts that have been potentially liquidated on the last chart
bar.\n\n' +
         'Liquidations meter allows traders to\n -gauge the momentum of the bar,\n
-identify the strength of the bulls and bears, and\n -identify probable
reversal/exhaustion points\n\n' +
         'Here with liquidations, we refer to the process of forcibly closing a
trader\'s position in the market'
lmSH = input.bool(true, 'Liquidations Meter', group = 'Liquidations Meter',
tooltip = lmTT)
refPS = input.string("open", "Base Price", options = ["open", "close", "oc2",
"hl2", "ooc3", "occ3", "hlc3", "ohlc4", "hlcc4"], group = 'Liquidations Meter')
clTT = 'The liquidation price calculator is useful for leverage trading traders
who want to know how much risk they can take for each trade.\n\n' +
         'This tool uses a formula to calculate the liquidation price based on the
entry price + leverage ratio.\n\n' +
         'Other factors such as leveraged fees, position size, and other interest
payments have been excluded since they are variables that don’t directly affect the
level of liquidation of a leveraged position.\n\n' +
         'This calculator also assumes that traders are using an isolated margin
for one single position and does not take into consideration the additional margin
they might have in their account.'
clSH = input.bool(true, 'Liquidation Price Calculator', group = clGR, tooltip =
clTT)
epTT = 'Defines the entry price.\nIf the entry price is set to 0, then the
selected \'Base Price\' value is assumed as entry price\n\n' +
         'Tip: Before entering a trade, setting base price to \'close\' and entry
price to remain at 0 will allow the traders to easily evaluate the risk and reward
situation of any given setup'
clEP = input.float(0., 'Entry Price', group = clGR, tooltip = epTT)
lrTT = 'Leverage allows traders to borrow funds in order to enter a position
larger than their own funds permit\n\n' +
         'the higher the leverage ratio the higher the risk.\n\nIt is important to
be aware that when the leverage ratio is increased, the liquidation price moves
closer to the entry price, meaning a higher risk trader\'s position will have'
clLR = input.float(10., 'Leverage', minval = 0, group = clGR, tooltip = lrTT)
lpSH = input.bool(true, 'Show Calculated Liquidation Prices on the Chart', group =
clGR)
dbTT = 'The bar statistics option enables measuring and presenting trading
activity, volatility, and probable liquidations for the last chart bar'
dbSH = input.bool(true, 'Show Bar Statistics', group = 'Dashboard', tooltip =
dbTT)
lcLS = input.string('Small', 'Liquidations Meter Text Size', options = ['Tiny',
'Small', 'Normal'], group = 'Others')
lcOF = input.int(3, 'Liquidations Meter Offset', minval = 0, group = 'Others')
clPS = input.string('Bottom', 'Dashboard/Calculator Placement', options=['Top',
'Middle', 'Bottom'], group = 'Others')
lcDS = input.string('Small', 'Dashboard/Calculator Text Size', options = ['Tiny',
'Small', 'Normal'], group = 'Others')
//-----------------------------------------------------------------------------}
// User Defined Types
//-----------------------------------------------------------------------------{
//   @type              bar properties with their values
//
//   @field   o         (float)   open price of the bar
//   @field   h         (float)   high price of the bar
//   @field   l         (float)   low price of the bar
//   @field   i         (int)     index of the bar
type bar
    float     o   =   open
    float     h   =   high
    float     l   =   low
    float     c   =   close
    float     v   =   volume
    int       i   =   bar_index
//-----------------------------------------------------------------------------}
// Variables
//-----------------------------------------------------------------------------{
bar b = bar.new()
var   label lbL = na, label.delete(lbL[1])
var   label lbS = na, label.delete(lbS[1])
var   line lnL = na, line.delete(lnL[1])
var   line lnS = na, line.delete(lnS[1])
var aLQ = array.new_box()
var aCL = array.new_box()
vST = ''
//-----------------------------------------------------------------------------}
// Functions/methods
//-----------------------------------------------------------------------------{
// @function               converts simple text to formated text
//
// @param _s               [string] simple string
//
// @returns                enumarated text size value
f_gSZ(_s) =>
    switch _s
        'Tiny' => size.tiny
        'Small' => size.small
        => size.normal
//   @function             compares the source value with the reference value
//
//   @param   _s           [float] source
//   @param   _r           [float] reference
//   @param   _m           [float] multiplier
//
//   @returns              [string] result of the comparison
f_gST(_s, _r,      _m) =>
    if _s
        isS =      _s >= 4.669 * _r * _m
        isH =      _s >= 1.618 * _r * _m
        isL =      _s <= 0.618 * _r * _m
          isS ? 'Very High' : isH ? 'High' : isL ? 'Low' : 'Average'
// @function               converts simple text to source
//
// @param _s               [string] simple string
//
// @returns                [float] source series
f_gSRC(_s) =>
    switch _s
        "open"       =>   open
        "close"      =>   close
        "oc2"        =>   math.avg(open, close)
        "hl2"        =>   hl2
        "ooc3"       =>   math.avg(open, open , close)
        "occ3"       =>   math.avg(open, close, close)
        "hlc3"       =>   hlc3
        "ohlc4"      =>   ohlc4
        "hlcc4"      =>   hlcc4
//-----------------------------------------------------------------------------}
// Calculations
//-----------------------------------------------------------------------------{
nzV = nz(b.v)
vDB = f_gST(nzV, ta.sma(nzV, 13), 1.1)
vST += '\n\nLast Bar Statistics:\n Trading activity : ' + vDB
aDB = f_gST(b.h - b.l, ta.atr(13), 0.9)
vST += '\n Volatility : ' + aDB
LQ   = nzV / (b.o / (b.o - b.l)) + nzV / (math.avg(b.o, b.c) / (b.h - math.avg(b.o,
b.c)))
lDB = f_gST(LQ, ta.sma(LQ, 89), 1.9)
vST += '\n Liquidations : ' + lDB
lSZ = f_gSZ(lcLS)
refP = f_gSRC(refPS)
if lmSH and barstate.islast
    if aLQ.size() > 0
        for i = 1 to aLQ.size()
            box.delete(aLQ.shift())
    off = lpSH ? 7 : 0
    if (refP - b.l) > 0
        aLQ.push(box.new(b.i + lcOF + off, refP, b.i + lcOF + off + 2, refP * (1 -
1. / 100), border_color = color(na), bgcolor = color.new(color.teal, 89), text =
'100x', text_color = chart.fg_color, text_valign = text.align_bottom))
    if (b.h - refP) > 0
        aLQ.push(box.new(b.i + lcOF + off, refP, b.i + lcOF + off + 2, refP * (1 +
1. / 100), border_color = color(na), bgcolor = color.new(color.red, 89), text =
'100x', text_color = chart.fg_color, text_valign = text.align_top))
    lev   = array.from(100, 50, 25, 10, 5, 3, 2, 1)
    trans = array.from( 89, 76, 63, 50, 37, 24, 11, 1)
    for i = 1 to 7
        if (refP - b.l) > 0 and refP / (refP - b.l) < lev.get(i - 1)
            aLQ.push(box.new(b.i + lcOF + off, refP * (1 - 1. / lev.get(i - 1)),
b.i + lcOF + off + 2, refP * (1 - 1. / lev.get(i)), border_color = color(na),
             bgcolor = color.new(color.teal, trans.get(i)), text =
str.tostring(lev.get(i)) + 'x', text_color = chart.fg_color, text_valign =
text.align_bottom))
        if (b.h - refP) > 0 and refP / (b.h - refP) < lev.get(i - 1)
            aLQ.push(box.new(b.i + lcOF + off, refP * (1 + 1. / lev.get(i - 1)),
b.i + lcOF + off + 2, refP * (1 + 1. / lev.get(i)), border_color = color(na),
             bgcolor = color.new(color.red, trans.get(i)), text =
str.tostring(lev.get(i)) + 'x', text_color = chart.fg_color, text_valign =
text.align_top))
    if refP / (refP - b.l) <= 100 and (refP - b.l) > 0
        lbL := label.new(b.i + lcOF + off + 1, b.l, '? ' + str.tostring(refP /
(refP - b.l), '#.#') + 'x Longs Liquidated' ,
                     color = color(na), textcolor = chart.fg_color, size = lSZ,
style = label.style_label_left,
                     tooltip = 'The highest leverage of\n probable liquidated longs
: ' + str.tostring(refP / (refP - b.l), '#.##') + 'x\nEstimantion based on\n
reference price : ' + str.tostring(refP, format.mintick) + vST)
        lnL := line.new(b.i + lcOF + off, b.l, b.i + lcOF + off + 2, b.l, color =
chart.fg_color, style = line.style_dotted)
    if refP / (b.h - refP) <= 100 and (b.h - refP) > 0
        lbS := label.new(b.i + lcOF + off + 1, b.h, '? ' + str.tostring(refP / (b.h
- refP), '#.#') + 'x Shorts Liquidated',
                     color = color(na), textcolor = chart.fg_color, size = lSZ,
style = label.style_label_left,
                     tooltip = 'The highest leverage of\n probable liquidated
shorts : ' + str.tostring(refP / (b.h - refP), '#.##') + 'x\nEstimantion based on\n
reference price : ' + str.tostring(refP, format.mintick) + vST)
        lnS := line.new(b.i + lcOF + off, b.h, b.i + lcOF + off + 2, b.h, color =
chart.fg_color, style = line.style_dotted)
tPOS = switch   clPS
    'Top'       => position.top_right
    'Middle'    => position.middle_right
    'Bottom'    => position.bottom_right
tSZ = f_gSZ(lcDS)
refP := clEP == 0 ? refP : clEP
var table calc = table.new(tPOS, 3, 18, bgcolor = #1e222d, border_color = #515359,
border_width = 1, frame_color = #373a46, frame_width = 1)
if barstate.islast
    if dbSH
        table.cell(calc, 0, 0, "BAR STATISTICS\n", text_color = color.white,
text_size = tSZ, bgcolor = #2962FF)
        table.merge_cells(calc, 0, 0, 2, 0)
        table.cell(calc, 0, 2, "Volatility", text_color = color.white, text_size =
tSZ, text_halign = text.align_left)
        table.merge_cells(calc, 0, 2, 1, 2)
        table.cell(calc, 2, 2, aDB, text_color = color.white, text_size = tSZ)
        if nzV > 0
            table.cell(calc, 0, 1, "Activity", text_color = color.white, text_size
= tSZ, text_halign = text.align_left)
            table.merge_cells(calc, 0, 1, 1, 1)
            table.cell(calc, 2, 1, vDB, text_color = color.white, text_size = tSZ)
            table.cell(calc, 0, 3, "Liquidations", text_color = color.white,
text_size = tSZ, text_halign = text.align_left)
            table.merge_cells(calc, 0, 3, 1, 3)
            table.cell(calc, 2, 3, lDB + ' !', text_color = color.white, text_size
= tSZ,
             tooltip = 'The highest leverage of\n probable liquidated shorts : ' +
(refP / (b.h - refP) > 100 ? '>100' : str.tostring(refP / (b.h - refP), '#.##')) +
                   'x\n probable liquidated longs : ' + (refP / (refP - b.l) > 100
? '>100' : str.tostring(refP / (refP - b.l), '#.##')) +
                   'x\n\nEstimantion based on\n reference price : ' +
str.tostring(refP, format.mintick))
    if clSH
        table.cell(calc, 0, 4, "CALCULATOR\n", text_color = color.white, text_size
= tSZ, bgcolor = #2962FF)
        table.merge_cells(calc, 0, 4, 2, 4)
         table.cell(calc, 0, 5, "Entry Price ", text_color = color.white, text_size
= tSZ)
         table.merge_cells(calc, 0, 5, 1, 5)
         table.cell(calc, 2, 5, "Leverage", text_color = color.white, text_size =
tSZ)
         table.cell(calc, 0, 6, str.tostring(refP, format.mintick), text_color =
color.white, text_size = tSZ)
        table.merge_cells(calc, 0, 6, 1, 6)
        table.cell(calc, 2, 6, str.tostring(clLR), text_color = color.white,
text_size = tSZ)
        tip = 'Liquidation price is the distance from trader\'s entry price to the
price where trader\'s leveraged position gets liquidated due to a loss.\n\n' +
              'If a trader wants to enter a $1.000 trade with ' +
str.tostring(clLR) + 'x leverage, then $' + str.tostring(1000/clLR, '#.##') +
              ' is the initial margin (the amount of money coming from the traders
pocket) and the remaining $' + str.tostring(1000 - 1000/clLR, '#.##') + ' are
borrowed funds\n\n' +
              'When a trader\'s account falls below the required margin level,
exchanges or brokerage platforms cannot allow a trader to lose borrowed funds and
therefore the trader\'s positions will be forcibly closed as soon as position
losses reach the initial margin.\n\n' +
              'The liquidation prices presented below are approximate values of
both long and short liquidation prices. It is important to note that the exchanges
will taken into consideration the trader\'s open positions when calculating the
liquidation price. Unrealized PNL and maintenance margin of the trader\'s open
position will affect the calculation of liquidation price'
        table.cell(calc, 0, 14, 'Liquidation Prices !', text_color = color.white,
text_size = tSZ, tooltip = tip)
        table.merge_cells(calc, 0, 14, 2, 14)
        table.cell(calc, 0, 15, "¦", text_color = color.teal, text_size = tSZ)
        table.cell(calc, 1, 15, "Longs", text_color = color.white, text_size = tSZ,
text_halign = text.align_left)
        table.cell(calc, 2, 15, '? ' + str.tostring(refP * (1 - 1. / clLR),
format.mintick) + ' (?%' + str.tostring(100. / clLR, '#.##') + ')',
         text_color = color.white, text_size = tSZ)
        table.cell(calc, 0, 16, "¦", text_color = color.red, text_size = tSZ)
        table.cell(calc, 1, 16, "Shorts", text_color = color.white, text_size =
tSZ, text_halign = text.align_left)
        table.cell(calc, 2, 16, '? ' + str.tostring(refP * (1 + 1. / clLR),
format.mintick) + ' (?%' + str.tostring(100. / clLR, '#.##') + ')',
         text_color = color.white, text_size = tSZ)
    if lpSH
        if aCL.size() > 0
            for i = 1 to aCL.size()
                box.delete(aCL.shift())
        lLP = refP * (1 - 1. / clLR)
        sLP = refP * (1 + 1. / clLR)
        aCL.push(box.new(b.i, lLP, b.i + lcOF + 6, lLP, border_color = color.teal,
             text = 'Long Liquidation Price Level\n' + (b.l < lLP ? 'trade
liquidated' : '%' + str.tostring((math.abs(lLP / b.c - 1) * 100), '#.##') + ' (' +
str.tostring(b.c - lLP, format.mintick) + ') to liquidation'),
             text_size = size.small, text_halign = text.align_right, text_valign =
text.align_top, text_color = color.teal))
        aCL.push(box.new(b.i + 2, refP, b.i + lcOF + 4, refP, border_color =
color.gray))
        aCL.push(box.new(b.i, sLP, b.i + lcOF + 6, sLP, border_color = color.red,
             text = 'Short Liquidation Price Level\n' + (b.h > sLP ? 'trade
liquidated' : '%' + str.tostring((math.abs(sLP / b.c - 1) * 100), '#.##') + ' (' +
str.tostring(sLP - b.c, format.mintick) + ') to liquidation'),
             text_size = size.small, text_halign = text.align_right, text_valign =
text.align_bottom, text_color = color.red))
//-----------------------------------------------------------------------------}
//============================= CREDITOS
=================================================//
credit = input.text_area(title="", defval="VIP Trading Signal Generator es un
conjunto de las mejores herramientas que permiten al operador determinar posibles
entradas en Long y Short aumentando la efectividad al operar en un 95%.\nSiga
siempre las instrucciones que le fueron dadas y recuerde siempre operar con
cuidado!\n\nCreado por CSBender_\nUltima verificacion: 03-Nov-2023.", group =
'Informacion General')
//============================= CREDITOS ====================================//