TraderJoe Tick
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// @thebearfib
//
//@version=5
indicator('TheTraderJoe Tick', 'TTJ TICK', 
  overlay = true, 
  max_labels_count = 500)

[h, l, c, o, firstbar_check, lastbar_check] = request.security('USI:TICK', timeframe.period, [high, low, close,open,  session.isfirstbar, session.islastbar])
//
// ————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
// —————————————————————————————————  Defaults   ——————————————————————————————————————————————————————————————————————————
// ————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
//
var string  d_ticker         = 'USI:TICK'

var int     d_L1             = 600
var int     d_L2             = 800
var int     d_L3             = 1000
var int     d_L4             = 1200

var color   d_colorHi4       = color.rgb(0, 255, 8, 40)
var color   d_colorHi3       = color.rgb(0, 255, 8, 80)
var color   d_colorHi2       = color.rgb(255, 166, 0, 60)
var color   d_colorHi1       = color.rgb(255, 255, 0, 60)
var color   d_colorZero      = color.rgb(114, 118, 120)
var color   d_colorLo1       = color.rgb(255, 255, 0, 60)
var color   d_colorLo2       = color.rgb(255, 166, 0, 60)
var color   d_colorLo3       = color.rgb(255, 0, 0, 80)
var color   d_colorLo4       = color.rgb(255, 0, 0, 40)
//
// ————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
// —————————————————————————————————  Inputs for TICK Chart    ————————————————————————————————————————————————————————————
// ————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
//
var string  i_ticker         = input.symbol(d_ticker,     'Ticker',                     group='symbol',     inline='ti')

var Hi_levels = "Aligned"
var bool    i_showTickHi     = input.bool(true,           'Positive Tick',              group='Hi_levels',      inline='5')
var int     i_tickHi1        = input.int(d_L1,            '',                minval=0,  group='Hi_levels',      inline='4')
var int     i_tickHi2        = input.int(d_L2,            '',                minval=0,  group='Hi_levels',      inline='3')
var int     i_tickHi3        = input.int(d_L3,            '',                minval=0,  group='Hi_levels',      inline='2')
var int     i_tickHi4        = input.int(d_L4,            '',                minval=0,  group ='Hi_levels',     inline='1')

var color   i_colorHi1       = input.color(d_colorHi1,     '',                          group ='Hi_levels',     inline='1')
var color   i_colorHi2       = input.color(d_colorHi2,     '',                          group ='Hi_levels',     inline='2')
var color   i_colorHi3       = input.color(d_colorHi3,     '',                          group ='Hi_levels',     inline='3')
var color   i_colorHi4       = input.color(d_colorHi4,     '',                          group ='Hi_levels',     inline='4') 

var ZeroLevel = "Aligned"
var color   i_colorZero      = input.color(d_colorZero,   '',                           group='ZeroLevel',     inline='1')
var bool    i_showZero       = input.bool(true,           'Zero',                       group='ZeroLevel',     inline='1')

var Lo_levels = "Aligned"
var bool    i_showTickLo     = input.bool(true,           'Negative',                   group='Lo_levels',     inline='5')
var int     i_tickLo1        = input.int(-d_L1,           '',                maxval=0,  group='Lo_levels',     inline='4')
var int     i_tickLo2        = input.int(-d_L2,           '',                maxval=0,  group='Lo_levels',     inline='3')
var int     i_tickLo3        = input.int(-d_L3,           '',                maxval=0,  group='Lo_levels',     inline='2')
var int     i_tickLo4        = input.int(-d_L4,           '',                maxval=0,  group='Lo_levels',     inline='1')

var color   i_colorLo1       = input.color(d_colorLo1,     '',                          group='Lo_levels',     inline='1')
var color   i_colorLo2       = input.color(d_colorLo2,     '',                          group='Lo_levels',     inline='2')
var color   i_colorLo3       = input.color(d_colorLo3,     '',                          group='Lo_levels',     inline='3')
var color   i_colorLo4       = input.color(d_colorLo4,     '',                          group='Lo_levels',     inline='4')
//
// ————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
// —————————————————————————————————  Functions     ———————————————————————————————————————————————————————————————————————
// ————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
//
f_showLevel(_show, _level) => _show ? _level ? _level : na : na // Hide level when value is zero.
//
// ————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
// —————————————————————————————————  Horizontal Plot Levels    ———————————————————————————————————————————————————————————
// ————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
//
var int     tickhi1 = f_showLevel(i_showTickHi, i_tickHi1)
var int     tickhi2 = f_showLevel(i_showTickHi, i_tickHi2)
var int     tickhi3 = f_showLevel(i_showTickHi, i_tickHi3)
var int     tickhi4 = f_showLevel(i_showTickHi, i_tickHi4)
var int     zero    = i_showZero ? 0 : na
var int     ticklo1 = f_showLevel(i_showTickLo, i_tickLo1)
var int     ticklo2 = f_showLevel(i_showTickLo, i_tickLo2)
var int     ticklo3 = f_showLevel(i_showTickLo, i_tickLo3)
var int     ticklo4 = f_showLevel(i_showTickLo, i_tickLo4)

hline(tickhi4, 'High4', i_colorHi4)
hline(tickhi3, 'High3', i_colorHi3, linewidth = 3, linestyle=hline.style_solid)
hline(tickhi2, 'High2', i_colorHi2)
hline(tickhi1, 'High1', i_colorHi1, display = display.none)

hline(zero,    'Zero',  i_colorZero, linewidth = 1, linestyle=hline.style_dashed)

hline(ticklo1, 'Low1',  i_colorLo1, display = display.none)
hline(ticklo2, 'Low2',  i_colorLo2)
hline(ticklo3, 'Low3',  i_colorLo3, linewidth  = 3, linestyle=hline.style_solid)
hline(ticklo4, 'Low4',  i_colorLo4)
//
// ————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
// —————————————————————————————————  Tick Above/ Below Close bar    ——————————————————————————————————————————————————————
// ————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
//

bool _tcA =  c < 0
bool _tcB =  c > 0

color _ZT1 =  _tcA ?  color.rgb(255, 0, 0,  60) : na
color _ZT2 =  _tcB ?  color.rgb(47, 255, 0, 60) : na

_labcol = switch 
    c < 0 => color.rgb(255, 0, 0,  60)
    c > 0 => color.rgb(47, 255, 0, 60)
    => color.white

bool ShowLab = input.bool(true, 'Show Tick Closes Above 0 Triangles')

if ShowLab
    lbl = label.new(bar_index, -1200)
    if _tcA
        label.set_text (lbl, "△")
        label.set_color(lbl, color.rgb(255, 0, 0, 48))
        label.set_style(lbl, label.style_text_outline)
        label.set_size (lbl, size.tiny)
    else 
        label.delete(lbl)

if  ShowLab 
    lbl2 = label.new(bar_index, 1200)
    if _tcB
        label.set_text (lbl2, "▽")
        label.set_color(lbl2, color.rgb(98, 255, 0, 49))
        label.set_style(lbl2, label.style_text_outline)
        label.set_size (lbl2, size.tiny)
    else 
        label.delete(lbl2)

p1=plot(c, title='EMA Tick', color=_ZT2, linewidth = 3, display = display.none)
p2=plot(c, title='EMA Tick', color=_ZT1, linewidth = 3, display = display.none)

_lab = label.new(bar_index, na, 'Price ' + str.tostring(close), color=_labcol, textcolor=color.white, style=label.style_label_down, yloc=yloc.abovebar)

label.delete(_lab[1])
//
// ————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
// ————————————————————————————————— Inputs  ——————————————————————————————————————————————————————————————————————————————
// ————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
//

//
// ————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
// —————————————————————————————————  VOL   ———————————————————————————————————————————————————————————————————————————————
// ————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
//
showExch       = input.bool(defval = true, title = "Show Exchanges")
showRatio      = input.bool(defval = true, title = "Show VOLD Ratio") 

format_text(str) =>
    str + '\n'

t                    = ticker.new(syminfo.prefix, syminfo.ticker, session.regular)
realS (t) => request.security(t, timeframe.period, close)

NYSEuvol             = realS ("USI:UVOL")
NYSEdvol             = realS ("USI:DVOL")
NASDAQuvol           = realS ("USI:UVOLQ")
NASDAQdvol           = realS ("USI:DVOLQ")

NYSEratio            = (NYSEuvol >= NYSEdvol)     ? (NYSEuvol/NYSEdvol)     : -(NYSEdvol/NYSEuvol)
NASDAQratio          = (NASDAQuvol >= NASDAQdvol) ? (NASDAQuvol/NASDAQdvol) : -(NASDAQdvol/NASDAQuvol)

final_nasdaqvold     = format_text( str.tostring(math.round(NASDAQratio, 2)) + ":1")
final_nysevold       = format_text( str.tostring(math.round(NYSEratio,   2)) + ":1")
//
// ————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
// —————————————————————————————————  ADD   ———————————————————————————————————————————————————————————————————————————————
// ————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
//
showADD     = input.bool(defval = true, title = "𝚂𝚑𝚘𝚠 ADV/DECL")

_addny      = request.security('USI:ADD',  '1', close)
_addnq      = request.security('USI:ADDQ', '1', close)

//
// ————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
// —————————————————————————————————  Tick   ——————————————————————————————————————————————————————————————————————————————
// ————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
//
showHLtick     = input.bool(defval = true,          title = "Show High/Low Tick of Session") 
nySession      = input.session(defval='0630-1300',  title='New York Session') //set for PST 

isInSession(session) =>
    barSessionTime = time(timeframe.period, session)
    inSession = not na(barSessionTime)
    inSession

var float nySessionHigh         = na
var float nySessionLow          = na
var float nySessionOpen         = na
var float nySessionClose        = na
var bool isNYSessionStart       = false
isInNYSession                   = isInSession(nySession)
if (isInNYSession)
    
    if (not isInNYSession[1])
        nySessionHigh       := h
        nySessionLow        := l
        isNYSessionStart    := true
		nySessionOpen       := o
    else
        nySessionHigh       := math.max(h, nySessionHigh[1])
        nySessionLow        := math.min(l, nySessionLow[1])

		nySessionClose := c
//
// ————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
// —————————————————————————————————  Colors  ——————————————————————————————————————————————————————————————————————————
// ————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
//
_colors1 = switch 
    _addnq >  1500 => color.rgb(0, 255, 8)
    _addnq < -1500 => color.rgb(255, 0, 0) 
    => color.white

_colors2 = switch 
    _addny >  1500 => color.rgb(0, 255, 8)
    _addny < -1500 => color.rgb(255, 0, 0)  
    => color.white

_colors3 = switch 
    nySessionHigh >  1000 => color.rgb(0, 255, 8)
    nySessionHigh < -1000 => color.rgb(255, 0, 0) 
    => color.white

_colors4 = switch 
    nySessionLow >  1000 => color.rgb(0, 255, 8)
    nySessionLow < -1000 => color.rgb(255, 0, 0)  
    => color.white

riskON1 = switch 
    NASDAQratio >=  3 => color.rgb(0, 255, 8)
    NASDAQratio <= -3 => color.rgb(255, 0, 0)
    => color.white

riskON2 = switch 
    NYSEratio >=  3 =>  color.rgb(0, 255, 8)
    NYSEratio <= -3 =>  color.rgb(255, 0, 0)
    => color.white
//
// ————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
// ————————————————————————————————— Inputs  ——————————————————————————————————————————————————————————————————————————————
// ————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
//
_fontSize1  = input.string("Normal","🗚 - Font Size", options = [ "Auto", "Tiny", "Small", "Normal", "Large", "Huge"])
  
_fontSize   = switch _fontSize1
    
    "Normal"    => size.normal
    "Auto"      => size.auto
    "Tiny"      => size.tiny
    "Small"     => size.small
    "Large"     => size.large
    "Huge"      => size.huge


positionGo = input.string("Top Right", " Market Conditions - Table Position", 
  options = ["Top Right", "Top Center", "Top Left", "Middle Right", "Middle Center", "Middle Left", "Bottom Right", "Bottom Center", "Bottom Left"])

tableposGo = switch positionGo
    
    "Top Right"     => position.top_right
    "Top Center"    => position.top_center
    "Top Left"      => position.top_left
    "Middle Right"  => position.middle_right
    "Middle Center" => position.middle_center
    "Middle Left"   => position.middle_left
    "Bottom Right"  => position.bottom_right
    "Bottom Center" => position.bottom_center
    "Bottom Left"   => position.bottom_left
//
//barstate.islast 
//barstate.islastconfirmedhistory
//last_bar_index
if last_bar_index 

    var table Display3 = table.new(tableposGo, 99, 99,
      bgcolor = color.rgb(54, 58, 69, 100), 
      frame_width = 1, frame_color = color.rgb(255, 255, 255, 100))
    if showExch
        table.cell(Display3, 1, 1,'NASDAQ -', bgcolor=color.rgb(255, 255, 255, 100),       text_halign=text.align_right, text_color=color.gray, text_size=_fontSize, text_font_family = font.family_monospace)
        table.cell(Display3, 1, 2,'NYSE -',   bgcolor=color.rgb(255, 255, 255, 100),       text_halign=text.align_right, text_color=color.gray, text_size=_fontSize, text_font_family = font.family_monospace)

    if showRatio  
        table.cell(Display3, 2, 1,'$ᴠᴏʟᴅ:',bgcolor=color.rgb(255, 255, 255, 100),         text_halign=text.align_right, text_color=color.gray, text_size=_fontSize, text_font_family = font.family_monospace)
        table.cell(Display3, 3, 1,final_nasdaqvold, bgcolor=color.rgb(255, 255, 255, 100),text_halign=text.align_right, text_color=riskON1, text_size=_fontSize, text_font_family = font.family_monospace)

        table.cell(Display3, 2, 2,'$ᴠᴏʟᴅ:',   bgcolor=color.rgb(255, 255, 255, 100),      text_halign=text.align_right, text_color=color.gray, text_size=_fontSize, text_font_family = font.family_monospace)
        table.cell(Display3, 3, 2,final_nysevold,   bgcolor=color.rgb(255, 255, 255, 100),text_halign=text.align_right, text_color= riskON2, text_size=_fontSize, text_font_family = font.family_monospace)

    if showADD 
        table.cell(Display3, 5, 2, "$ᴀᴅᴅ:",text_halign = text.align_left,text_color = color.gray,text_size = _fontSize)
        table.cell(Display3, 6, 2, str.tostring(_addny,'#,###') ,text_halign = text.align_right,text_color =_colors2, text_size = _fontSize,  text_font_family=font.family_monospace)

        table.cell(Display3, 5, 1, '$ᴀᴅᴅǫ:',text_halign = text.align_left,text_color = color.gray,text_size = _fontSize)
        table.cell(Display3, 6, 1, str.tostring(_addnq, '#,###'),text_halign = text.align_right,text_color =_colors1 ,text_size = _fontSize,text_font_family=font.family_monospace)

    if showHLtick
        table.cell(Display3, 7, 1, 'ᴛɪᴄᴋ ᴅᴀʏ/ʜɪɢʜ:',text_halign = text.align_left,text_color = color.gray,text_size = _fontSize)
        table.cell(Display3, 8, 1, str.tostring(nySessionHigh, '#,####'),text_halign = text.align_right,text_color =_colors3 ,text_size = _fontSize,text_font_family=font.family_monospace)

        table.cell(Display3, 7, 2, 'ᴛɪᴄᴋ ᴅᴀʏ/ʟᴏᴡ:',text_halign = text.align_left,text_color = color.gray,text_size = _fontSize)
        table.cell(Display3, 8, 2, str.tostring(nySessionLow, '#,###'),text_halign = text.align_right,text_color =_colors4 ,text_size = _fontSize,text_font_family=font.family_monospace)



