[LazyBear] SQZ Momentum + 1st Gray Cross Signals ━ whvntr
//This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
//@version=5
// ─© whvntr Tyler Ray 
indicator(title='[LazyBear] SQZ Momentum + 1st Gray Cross Signals', shorttitle='SQZ_MULT ━ whvntr'
     , overlay= true)
// With all due credit @ user LazyBear & John F. Carter's book: Chapter 11 of "Mastering the Trade". 
//             LazyBear wrote: "Mr.Carter suggests waiting till the first gray after a black cross, 
//      ✓      and taking a position in the direction of the momentum (for ex., if momentum value 
//             is above zero, go long). Exit the position when the momentum changes 
//             (increase or decrease --- signified by a color change)."
// I have done just that. Now at each "first gray after a black cross", there are now Bearish and 
// Bullish signals.. The signals only appear in the direction of the momentum.


color INVS = #00000000 


//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
// ╸>   ╸ ╸>   ╸ ╸ ╸> ─© whvntr
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
var a_t_b = true
var not_a_t_b = not a_t_b
var a_t_l = true
var not_a_t_l = not a_t_l
var s_b = true
var s_b_1 = true
var s_b_2 = true 
var s_b_3 = true 
var not_s_b = not s_b
var not_s_b_1 = not s_b_1
var not_s_b_2 = not s_b_2
var not_s_b_3 = not s_b_3
// ╸>   ╸ ╸>   ╸ ╸ ╸>
var s_l = true
var s_l_1 = true
var s_l_2 = true 
var s_l_3 = true 
var not_s_l = not s_l
var not_s_l_1 = not s_l_1
var not_s_l_2 = not s_l_2
var not_s_l_3 = not s_l_3
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
// ╸>   ╸ ╸>   ╸ ╸ ╸> ─© whvntr
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$


//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
// ℹ️ Multiple Sources ─© whvntr
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
changeSource = input.source(title='ℹ️'
     , defval = close
     , group = "Alternate Source")  
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
// ℹ️ Multiple Sources ─© whvntr
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$


//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
// 🗓️ Multiple Timeframes ─© whvntr
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
keepFrame = input.bool(defval = true
     , title = ''
     , group = '☑ Chart Timeframe ‎ 
     ‎ ✗☐ To Use Multi')
keepFrameFor = keepFrame ? timeframe.period : timeframe.period 
changetframeBear = input.timeframe (title='📕'
     , defval='60'
     , group = "Multiple Timeframes"
     , inline = 'Timeframes'
     , tooltip = '🐼 Bearish Timeframes')
changetframeBull = input.timeframe(title='📗'
     , defval='60'
     , inline = 'Timeframes'
     , group = 'Multiple Timeframes'
     , tooltip = '🐼 ‎ & ‎ 🐂')   
alt_period_bear =  keepFrame ? keepFrameFor : changetframeBear  
alt_period_bull =  keepFrame ? keepFrameFor : changetframeBull  
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
// 🗓️ Multiple Timeframes ─© whvntr
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$  


//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
// ╍╍ Lengths ─ LazyBear ©
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ 
length = input(20
     , title ='┅', group = 'Bollinger Bands Length'
     , tooltip = 'Bollinger Bands consist of a middle 
     band (which is a moving average) and an upper and 
     lower band. These upper and lower bands are set 
     above and below the moving average by a certain 
     number of standard deviations of price, thus 
     incorporating volatility')
mult = input(2.0
     , title = '×', group = 'Bollinger Bands MultFactor')
lengthKC = input(20
     , title = '┅', group = 'Keltner Channel Length'
     , tooltip = "Keltner Channels are volatility-based 
     bands that are placed on either side of an asset's 
     price and can aid in determining the direction of 
     a trend. The Keltner channel uses the average-true 
     range (ATR) or volatility, with breaks above or 
     below the top and bottom barriers signaling a 
     continuation")
multKC = input(1.5
     , title ='×', group ='Keltner Channel MultFactor')
trueRange = input.bool(true
     , title = ''
     , group = '☑ True Range (Keltner Channel)'
     , tooltip = 'Average-true range (ATR) with breaks 
     above or below the top and bottom barriers signaling 
     a continuation')
kc__tr =  trueRange ? true : na  
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
// ╍╍ Lengths ─ LazyBear ©
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ 


//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
// 🎨 CSS Menu ─© whvntr 
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ 
sqz_exit_arrow_css = input.color(#b2283483,'⬇‎ 
     ‎ '
     , group = 'Arrows & Highlights'
     , inline = 'exit_arrow')
sqz_take_arrow_css = input.color(#008000ae,'⬆‎
     ‎ '
     , group = 'Arrows & Highlights'
     , inline = 'take_arrow') 
bg_bear_css = input.color(color.rgb(181
      , 181, 181, 87),'‎
     ‎ '
     , group = 'Arrows & Highlights'
     , inline = 'exit_arrow')
bg_bull_css = input.color(color.rgb(181
     , 181, 181, 87),'‎
     ‎ '
     , group = 'Arrows & Highlights'
     , inline = 'take_arrow')
sqz_exit_dot_css = input(#ff0000ae,'•'
     , group = 'Dots & Arrow Length'
     , inline = 'exit_dot')
sqz_take_dot_css = input(#00ff00b2,'•'
     , group = 'Dots & Arrow Length'
     , inline = 'take_dot')
sqz_pos_mom_css = input(#00ff00b2,'⌟'
     , group = "Positive Momentum")
sqz_pos_mom_rev_css = input(#008000ae,'⌞'
     , group = "Positive Momentum Reversing")
sqz_neg_mom_css = input(#ff0000ae,'⌝'
     , group = "Negative Momentum")
sqz_neg_mom_rev_css = input(#800000a7,'⌜'
     , group = "Negative Momentum Reversing")
sqz_no_css = input(#0023a1,'∅'
     , group = "No Squeeze")
sqz_ON_css = input(color.rgb(0, 0, 0),'⏳'
     , group = "Squeeze Entered (Preparing)"
     , tooltip = '"Black crosses on the midline show 
     that the market just entered a squeeze 
     (Bollinger Bands are within Keltner Channel). 
     This signifies low volatility, market preparing 
     itself for an explosive move (up or down)"')
sqz_released_css = input(color.gray,'🌋'
     , tooltip = '"Gray crosses signify 
     "Squeeze release""' 
     , group = "Squeeze Release (Released)") 
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
// 🎨 CSS Menu ─© whvntr 
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ 


//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
// 🎳 Bollinger Bands ─ LazyBear ©
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
basis = ta.sma(changeSource, length)
dev = multKC * ta.stdev(changeSource, length)
upperBB = basis + dev
lowerBB = basis - dev
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
// 🎳 Bollinger Bands ─ LazyBear ©
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$


//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
// ☶ Keltner Channel ─ LazyBear ©
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
ma = ta.sma(changeSource, lengthKC)
range_1 = kc__tr ? ta.tr : high - low
rangema = ta.sma(range_1, lengthKC)
upperKC = ma + rangema * multKC
lowerKC = ma - rangema * multKC
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
// ☶ Keltner Channel ─ LazyBear ©
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$


//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
// 🍋 Squeeze Indication ─ LazyBear ©
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
sqzOn = lowerBB > lowerKC and upperBB < upperKC
sqzOff = lowerBB < lowerKC and upperBB > upperKC
noSqz = sqzOn == false and sqzOff == false
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
// 🍋 Squeeze Indication ─ LazyBear ©
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$


//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
// 📊 Histogram ─ LazyBear ©
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
val = ta.linreg(changeSource - math.avg(math.avg(ta.highest(high, 
      lengthKC), ta.lowest(low, lengthKC)), ta.sma(close, 
      lengthKC)), lengthKC, 0)
iff_1 = val > nz(val[1]) ? sqz_pos_mom_css : sqz_pos_mom_rev_css 
iff_2 = val < nz(val[1]) ? sqz_neg_mom_css : sqz_neg_mom_rev_css
bcolor = val > 0 ? iff_1 : iff_2
scolor = noSqz ? sqz_no_css : sqzOn ? sqz_ON_css : 
           sqz_released_css
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
// 📊 Histogram ─ LazyBear ©
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$


//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
// 💡 Show/Hide Signal Groups ─© whvntr  
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
plot_hist = input.bool(true
     , group = '☑ LazyBear Histogram'
     , tooltip = 'LazyBear Histogram'
     , title = '')
plot_cross = input.bool(true
     , group ='☑ LazyBear Crosses'
     , tooltip = 'LazyBear Crosses'
     , title = '')
zero_line = 0
plot(plot_hist ? val : na, color = bcolor
     , title = 'Use Condition: SQZ_MULT..'
     , style=plot.style_histogram, linewidth=4, offset = 0
     , editable = false)
plot(plot_cross ? zero_line : na, color=scolor
     , title = 'Use Condition: SQZ_MULT..'
     , style=plot.style_cross,linewidth=2 ,offset = 0
     , editable = false)
show_neg_mom = input.bool(true, ''
      , group = '☑ Show Bearish'
      , tooltip = 'Show bearish signals ─ For a multi-source 
      histogram, hide signal groups and move indicator 
      to a new pane')
hide_neg_mom =  show_neg_mom ? true : na  
show_pos_mom = input.bool(true, ''
      , group = '☑ Show Bullish'
      , tooltip = 'Show bullish signals ─ For a multi-source 
      histogram, hide signal groups and move indicator 
      to a new pane')
hide_pos_mom =  show_pos_mom ? true : na 

show_bg_exit = input.bool(false
      , title = '‎ 𝘚𝘩𝘰𝘳𝘵𝘴'
      , group = 'Arrows & Highlights'
      , inline = 'exit_arrow')
hide_bg_exit =  show_bg_exit ? true : na  

show_bg_take = input.bool(false
      , title = '‎ 𝘓𝘰𝘯𝘨𝘴'
      , group = 'Arrows & Highlights'
      , inline = 'take_arrow')
hide_bg_take =  show_bg_take ? true : na 
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
// 💡 Show/Hide Signal Groups ─© whvntr  
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$


non_repainting = barstate.isconfirmed == true


//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
// ✛ First Gray EXIT Position ─© whvntr  
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
pos = val > nz(val[1])
not_pos = not pos
exit_pos = scolor == sqz_released_css
bear_sqz = request.security(syminfo.tickerid
     , alt_period_bear
     , exit_pos[0] and not exit_pos[1] and not_pos and 
     hide_neg_mom and non_repainting) 
bear_sqz_bg = request.security(syminfo.tickerid
     , alt_period_bear
     , exit_pos[0] and not exit_pos[1] and not_pos 
     and non_repainting) 
bear_sqz_alert = request.security(syminfo.tickerid
     , alt_period_bear
     , exit_pos[0] and not exit_pos[1] and not_pos 
     and non_repainting) 
bear_arw_pick = bear_sqz[0] and not bear_sqz[1]
bear_bg_pick = bear_sqz_bg[0] and not bear_sqz_bg[1]
bear_alert = bear_sqz_alert[0] and not bear_sqz_alert[1]
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
// ✛ First Gray EXIT Position ─© whvntr  
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$


//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
// 🎯 Arrow Length Feature EXIT Position ─© whvntr  
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
string one_len_bear = '╸'
string two_len_bear = '╸ ╸'
string three_len_bear = '╸ ╸ ╸'
arrow_style_bear = input.string(defval = '╸ ╸ ╸'
      , title = '‎ ‎ '
      , inline = 'exit_dot'
      , options = [one_len_bear, two_len_bear, three_len_bear]
      , group = 'Dots & Arrow Length'  
      , tooltip = 'Adjust the length of the arrows')
var get_1_bear =  arrow_style_bear == one_len_bear
var get_2_bear = arrow_style_bear == two_len_bear
var get_3_bear = arrow_style_bear == three_len_bear
if arrow_style_bear == one_len_bear
    not_s_b_1 := true
if arrow_style_bear == two_len_bear
    not_s_b_2 := true
if arrow_style_bear == three_len_bear
    not_s_b_3 := true 
plotchar(bear_arw_pick and not_s_b_1 
     , title = 'Use Condition: SQZ_MULT..'
     , text = '|\nv'
     , textcolor = sqz_exit_arrow_css
     , location=location.abovebar
     , offset=0, color = sqz_exit_dot_css
     , char = '•'
     , size=size.tiny, editable = false)
plotchar(bear_arw_pick and not_s_b_2
     , title = 'Use Condition: SQZ_MULT..'
     , text = '|\n|\nv'
     , textcolor = sqz_exit_arrow_css
     , location=location.abovebar
     , offset=0, color = sqz_exit_dot_css
     , char = '•'
     , size=size.tiny, editable = false)
plotchar(bear_arw_pick and not_s_b_3
     , title = 'Use Condition: SQZ_MULT..'
     , text = '|\n|\n|\nv'
     , textcolor = sqz_exit_arrow_css
     , location=location.abovebar
     , offset=0, color = sqz_exit_dot_css
     , char = '•'
     , size=size.tiny, editable = false)
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
// 🎯 Arrow Length Feature EXIT Position ─© whvntr  
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$


//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
// ✛ First Gray TAKE Position ─© whvntr
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
neg = val < nz(val[1])
not_neg = not neg
take_pos = scolor == sqz_released_css
bull_sqz = request.security(syminfo.tickerid
     , alt_period_bull
     , take_pos[0] and not take_pos[1] and not_neg and
     hide_pos_mom and non_repainting) 
bull_sqz_bg = request.security(syminfo.tickerid
     , alt_period_bull
     , take_pos[0] and not take_pos[1] and not_neg 
     and non_repainting) 
bull_sqz_alert = request.security(syminfo.tickerid
     , alt_period_bull
     , take_pos[0] and not take_pos[1] and not_neg 
     and non_repainting) 
bull_arw_pick = bull_sqz[0] and not bull_sqz[1]
bull_bg_pick = bull_sqz_bg[0] and not bull_sqz_bg[1]
bull_alert = bull_sqz_alert[0] and not bull_sqz_alert[1]
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
// ✛ First Gray TAKE Position ─© whvntr  
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$


//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
// 🎯 Arrow Length Feature TAKE Position ─© whvntr  
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
string one_len_bull = '╸'
string two_len_bull = '╸ ╸'
string three_len_bull = '╸ ╸ ╸'
arrow_style_bull = input.string(defval = '╸ ╸ ╸'
  , title = '‎ ‎ '
  , inline = 'take_dot'
  , options = [one_len_bull, two_len_bull, three_len_bull]
  , group = 'Dots & Arrow Length'
  , tooltip = 'Adjust the length of the arrows')
var get_1_bull =  arrow_style_bull == one_len_bull
var get_2_bull = arrow_style_bull == two_len_bull
var get_3_bull = arrow_style_bull == three_len_bull
if arrow_style_bull == one_len_bull
    not_s_l_1 := true
if arrow_style_bull == two_len_bull
    not_s_l_2 := true
if arrow_style_bull == three_len_bull
    not_s_l_3 := true 
plotchar(bull_arw_pick and not_s_l_1
     , title = 'Use Condition: SQZ_MULT..'
     , text = 'ʌ\n|'
     , textcolor = sqz_take_arrow_css
     , location=location.belowbar
     , offset=0, color = sqz_take_dot_css
     , char = '•'
     , size=size.tiny, editable = false)
plotchar(bull_arw_pick and not_s_l_2
     , title = 'Use Condition: SQZ_MULT..'
     , text = 'ʌ\n|\n|'
     , textcolor = sqz_take_arrow_css
     , location=location.belowbar
     , offset=0, color = sqz_take_dot_css
     , char = '•'
     , size=size.tiny, editable = false)
plotchar(bull_arw_pick and not_s_l_3
     , title = 'Use Condition: SQZ_MULT..'
     , text = 'ʌ\n|\n|\n|'
     , textcolor = sqz_take_arrow_css
     , location=location.belowbar
     , offset=0, color = sqz_take_dot_css
     , char = '•'
     , size=size.tiny, editable = false)
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
// 🎯 Arrow Length Feature TAKE Position ─© whvntr  
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$


//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
//  ║ Highlight ─© whvntr  
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
bg_bear = bear_bg_pick
bgcolor(bg_bear and hide_bg_exit ? bg_bear_css 
      : INVS
      , title = '𝘚𝘩𝘰𝘳𝘵𝘴'
      , editable = false)
bg_bull = bull_bg_pick
bgcolor(bg_bull and hide_bg_take ? bg_bull_css 
      : INVS
      , title = '𝘓𝘰𝘯𝘨𝘴'
      , editable = false)
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
//  ║ Highlight ─© whvntr  
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$


//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
//  🌙 Alerts ─© whvntr  
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
if bear_alert == true and close[1] == bear_alert
    alert("➖ 𝙂𝙤 𝙎𝙝𝙤𝙧𝙩",  alert.freq_once_per_bar_close)
alertcondition(bear_alert
      , title= "➖ 𝑺𝒉𝒐𝒓𝒕𝒔"
      , message = '➖ SQZ_MULT ━ whvntr')
  
if bull_alert == true and close[1] == bull_alert
    alert("➕ 𝙂𝙤 𝙇𝙤𝙣𝙜",  alert.freq_once_per_bar_close)
alertcondition(bull_alert
      , title= "➕ 𝑳𝒐𝒏𝒈𝒔"
      , message = '➕ SQZ_MULT ━ whvntr')
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
//  🌙 Alerts ─© whvntr  
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$