Ud 3 Dy USp 1
Ud 3 Dy USp 1
0)
// https://creativecommons.org/licenses/by/4.0/
// © gu5tavo71 (Gustavo Cardelle)
//@version=5
VERSION                     = 'v6_1_23'// 2023.10.13
strategy(
  'ALGOX',
  shorttitle                =   'ALGOX ' + VERSION,
  overlay                   =   true,
  explicit_plot_zorder      =   true,
  pyramiding                =   0,
  default_qty_type          =   strategy.percent_of_equity,
  default_qty_value         =   10,
  calc_on_every_tick        =   false,
  process_orders_on_close   =   true)
//   Project #827
//   Actual version: @gu5tavo71 for Riccardo (@rikyfx for PineScripters Jobs)
//   This script reuses open source code from another authors:
//   @PineCoders, Built-in Library, and Community Scripts
//   Disclaimer: I am not a financial advisor.
//                For purpose educate only. Use at your own risk.
//END SETTINGS
//FUNCTIONS
    else if swing_type == -1
        if array.get(array, 0) >= array.get(array, 1)
            label_text := 'HL'
        else
            label_text := 'LL'
        label.new(
          bar_index - swing_length,
          array.get(array,0),
          text = label_text,
          style = label.style_label_up,
          textcolor = swing_type_color,
          color = swing_type_color,
          size = size.tiny)
    atr_threshold = atrValue * 2
    okay_to_draw = true
    for i = 0 to array.size(box_array) - 1
        top = box.get_top(array.get(box_array, i))
        bottom = box.get_bottom(array.get(box_array, i))
        poi = (top + bottom) / 2
    if zone_type == 1
        for i = 0 to array.size(box_array) - 1
            level_to_break = box.get_top(array.get(box_array,i))
            // if ta.crossover(close, level_to_break)
            if close >= level_to_break
                copied_box = box.copy(array.get(box_array,i))
                f_array_add_pop(bos_array, copied_box)
                mid = (box.get_top(array.get(box_array,i)) +
box.get_bottom(array.get(box_array,i))) / 2
                box.set_top(array.get(bos_array,0), mid)
                box.set_bottom(array.get(bos_array,0), mid)
                box.set_extend( array.get(bos_array,0), extend.none)
                box.set_right( array.get(bos_array,0), bar_index)
                box.set_text( array.get(bos_array,0), 'BOS' )
                box.set_text_color( array.get(bos_array,0), bos_label_color)
                box.set_text_size( array.get(bos_array,0), size.small)
                box.set_text_halign( array.get(bos_array,0), text.align_center)
                box.set_text_valign( array.get(bos_array,0), text.align_center)
                box.delete(array.get(box_array, i))
                box.delete(array.get(label_array, i))
    if zone_type == -1
        for i = 0 to array.size(box_array) - 1
            level_to_break = box.get_bottom(array.get(box_array,i))
            // if ta.crossunder(close, level_to_break)
            if close <= level_to_break
                copied_box = box.copy(array.get(box_array,i))
                f_array_add_pop(bos_array, copied_box)
                mid = (box.get_top(array.get(box_array,i)) +
box.get_bottom(array.get(box_array,i))) / 2
                box.set_top(array.get(bos_array,0), mid)
                  box.set_bottom(array.get(bos_array,0), mid)
                  box.set_extend( array.get(bos_array,0), extend.none)
                  box.set_right( array.get(bos_array,0), bar_index)
                  box.set_text( array.get(bos_array,0), 'BOS' )
                  box.set_text_color( array.get(bos_array,0), bos_label_color)
                  box.set_text_size( array.get(bos_array,0), size.small)
                  box.set_text_halign( array.get(bos_array,0), text.align_center)
                  box.set_text_valign( array.get(bos_array,0), text.align_center)
                  box.delete(array.get(box_array, i))
                  box.delete(array.get(label_array, i))
     for i = 0 to array.size(box_array) - 1
         box.set_right(array.get(box_array, i), bar_index + 100)
//
//END FUNCTIONS
//
//
//CALCULATIONS
//
stratRes = timeframe.ismonthly ? str.tostring(timeframe.multiplier * intRes,
'###M') :
            timeframe.isweekly   ? str.tostring(timeframe.multiplier * intRes,
'###W') :
            timeframe.isdaily    ? str.tostring(timeframe.multiplier * intRes,
'###D') :
            timeframe.isintraday ? str.tostring(timeframe.multiplier * intRes,
'####') :
            '60'
src       = h ? request.security(ticker.heikinashi(syminfo.tickerid),
            timeframe.period, close, lookahead = barmerge.lookahead_off) : close
//      CALCULATE ATR
atrValue = ta.atr(50)
f_extend_box_endpoint(current_supply_box)
f_extend_box_endpoint(current_demand_box)
// if barstate.islast
    // label.new(x = bar_index + 10, y = close[1], text =
str.tostring( array.size(current_supply_poi) ))
//     label.new(x = bar_index + 20, y = close[1], text =
str.tostring( box.get_bottom( array.get(current_supply_box,   0))))
//     label.new(x = bar_index + 30, y = close[1], text =
str.tostring( box.get_bottom( array.get(current_supply_box,   1))))
//     label.new(x = bar_index + 40, y = close[1], text =
str.tostring( box.get_bottom( array.get(current_supply_box,   2))))
//     label.new(x = bar_index + 50, y = close[1], text =
str.tostring( box.get_bottom( array.get(current_supply_box,   3))))
//     label.new(x = bar_index + 60, y = close[1], text =
str.tostring( box.get_bottom( array.get(current_supply_box,   4))))
//   // Get Components
//   ocAvg       = math.avg(open, close)
//   sma1        = ta.sma(close, 5)
//   sma2        = ta.sma(close, 6)
//   sma3        = ta.sma(close, 7)
//   sma4        = ta.sma(close, 8)
//   sma5        = ta.sma(close, 9)
// sma6          = ta.sma(close, 10)
// sma7          = ta.sma(close, 11)
// sma8          = ta.sma(close, 12)
// sma9          = ta.sma(close, 13)
// sma10         = ta.sma(close, 14)
// sma11         = ta.sma(close, 15)
// sma12         = ta.sma(close, 16)
// sma13         = ta.sma(close, 17)
// sma14         = ta.sma(close, 18)
// sma15         = ta.sma(close, 19)
// sma16         = ta.sma(close, 20)
// psar          = ta.sar(0.02, 0.02, 0.2)
[_, upperKC1,   lowerKC1] = ta.kc(close, 80,   10.5)
[_, upperKC2,   lowerKC2] = ta.kc(close, 80,   9.5)
[_, upperKC3,   lowerKC3] = ta.kc(close, 80,   8)
[_, upperKC4,   lowerKC4] = ta.kc(close, 80,   3)
barsL            =   10
barsR            =   10
pivotHigh        =   fixnan(ta.pivothigh(barsL, barsR)[1])
pivotLow         =   fixnan(ta.pivotlow(barsL, barsR)[1])
source           =   close, period = 150
[s, a, i]        =   lr_slope(source, period)
[upDev, dnDev]   =   lr_dev(source, period, s, a, i)
// // Colors
// green         = #00d9ff, green2     = #00d9ff
// red           = #ff0090, red2       = #ff0090
//   // Plots
//   k1 = plot(ta.ema(upperKC1, 50), "k1", na,                     editable   =   false)
//   k2 = plot(ta.ema(upperKC2, 50), "k2", na,                     editable   =   false)
//   k3 = plot(ta.ema(upperKC3, 50), "k3", na,                     editable   =   false)
//   k4 = plot(ta.ema(upperKC4, 50), "k4", na,                     editable   =   false)
//   k5 = plot(ta.ema(lowerKC4, 50), "k5", na,                     editable   =   false)
//   k6 = plot(ta.ema(lowerKC3, 50), "k6", na,                     editable   =   false)
//   k7 = plot(ta.ema(lowerKC2, 50), "k7", na,                     editable   =   false)
//   k8 = plot(ta.ema(lowerKC1, 50), "k8", na,                     editable   =   false)
//   fill(k1, k2, channelBal ? color.new(red2,     40)   :   na,   editable   =   false)
//   fill(k2, k3, channelBal ? color.new(red2,     65)   :   na,   editable   =   false)
//   fill(k3, k4, channelBal ? color.new(red2,     90)   :   na,   editable   =   false)
//   fill(k5, k6, channelBal ? color.new(green2,   90)   :   na,   editable   =   false)
//   fill(k6, k7, channelBal ? color.new(green2,   65)   :   na,   editable   =   false)
//   fill(k7, k8, channelBal ? color.new(green2,   40)   :   na,   editable   =   false)
//Functions
//Line Style function
get_line_style(style) =>
    out = switch style
        '???' => line.style_solid
        '----' => line.style_dashed
        '    ' => line.style_dotted
float ob = na
           array.unshift(ob_top, top)
           array.unshift(ob_btm, btm)
           array.unshift(ob_avg, avg)
ob := ob_val
               array.remove(ob_top, idx)
               array.remove(ob_btm, idx)
               array.remove(ob_avg, idx)
               array.remove(ob_left, idx)
mitigated
//Global elements
var os = 0
var target_bull = 0.
var target_bear = 0.
/////////////////////////////////////////////
// Create non-repainting security function
rp_security(_symbol, _res, _src) =>
    request.security(_symbol, _res, _src[barstate.isrealtime ? 1 : 0])
// Main Indicator
// Functions
smoothrng(x, t, m) =>
    wper = t * 2 - 1
    avrng = ta.ema(math.abs(x - x[1]), t)
    smoothrng = ta.ema(avrng, wper) * m
rngfilt(x, r) =>
    rngfilt = x
    rngfilt := x > nz(rngfilt[1]) ? x - r < nz(rngfilt[1]) ? nz(rngfilt[1]) : x - r
: x + r > nz(rngfilt[1]) ? nz(rngfilt[1]) : x + r
percWidth(len, perc) => (ta.highest(len) - ta.lowest(len)) * perc / 100
securityNoRep(sym, res, src) => request.security(sym, res, src, barmerge.gaps_off,
barmerge.lookahead_on)
swingPoints(prd) =>
    pivHi = ta.pivothigh(prd, prd)
    pivLo = ta.pivotlow (prd, prd)
    last_pivHi = ta.valuewhen(pivHi, pivHi, 1)
    last_pivLo = ta.valuewhen(pivLo, pivLo, 1)
    hh = pivHi and pivHi > last_pivHi ? pivHi : na
    lh = pivHi and pivHi < last_pivHi ? pivHi : na
    hl = pivLo and pivLo > last_pivLo ? pivLo : na
    ll = pivLo and pivLo < last_pivLo ? pivLo : na
    [hh, lh, hl, ll]
f_chartTfInMinutes() =>
    float _resInMinutes = timeframe.multiplier * (
      timeframe.isseconds ? 1                    :
      timeframe.isminutes ? 1.                   :
      timeframe.isdaily    ? 60. * 24            :
      timeframe.isweekly ? 60. * 24 * 7          :
      timeframe.ismonthly ? 60. * 24 * 30.4375 : na)
f_kc(src, len, sensitivity) =>
    basis = ta.sma(src, len)
    span = ta.atr(len)
    [basis + span * sensitivity, basis - span * sensitivity]
wavetrend(src, chlLen, avgLen) =>
    esa = ta.ema(src, chlLen)
    d = ta.ema(math.abs(src - esa), chlLen)
    ci = (src - esa) / (0.015 * d)
    wt1 = ta.ema(ci, avgLen)
    wt2 = ta.sma(wt1, 3)
    [wt1, wt2]
f_top_fractal(_src) => _src[4] < _src[2] and _src[3] < _src[2] and _src[2] >
_src[1] and _src[2] > _src[0]
f_bot_fractal(_src) => _src[4] > _src[2] and _src[3] > _src[2] and _src[2] <
_src[1] and _src[2] < _src[0]
top_fractal     = f_top_fractal(src)
bot_fractal     = f_bot_fractal(src)
f_fractalize (_src) => top_fractal ? 1 : bot_fractal ? -1 : 0
f_findDivs(src, topLimit, botLimit) =>
    fractalTop = f_fractalize(src) > 0 and src[2] >= topLimit ? src[2] : na
    fractalBot = f_fractalize(src) < 0 and src[2] <= botLimit ? src[2] : na
    highPrev    = ta.valuewhen(fractalTop, src[2], 0)[2]
     highPrice = ta.valuewhen(fractalTop, high[2], 0)[2]
     lowPrev      = ta.valuewhen(fractalBot, src[2], 0)[2]
     lowPrice     = ta.valuewhen(fractalBot, low[2], 0)[2]
     bearSignal = fractalTop and high[1] > highPrice and src[1] < highPrev
     bullSignal = fractalBot and low[1] < lowPrice and src[1] > lowPrev
     [bearSignal, bullSignal]
     // Get user input
enableSR     = input(false           , "SR On/Off", group="SR")
colorSup     = input(#00000000         , "Support Color", group="SR")
colorRes     = input(#00000000         , "Resistance Color", group="SR")
strengthSR = input.int(2             , "S/R Strength", 1, group="SR")
lineStyle = input.string("Dotted", "Line Style", ["Solid", "Dotted", "Dashed"],
group="SR")
lineWidth = input.int(2              , "S/R Line Width", 1, group="SR")
useZones     = input(true            , "Zones On/Off", group="SR")
useHLZones = input(true              , "High Low Zones On/Off", group="SR")
zoneWidth = input.int(2              , "Zone Width %", 0,
    tooltip = "it's calculated using % of the distance between highest/lowest in
last 300 bars", group="SR")
expandSR     = input(true            , "Expand SR")
// Get components
rb           = 10
prd          = 284
ChannelW     = 10
label_loc = 55
style        = lineStyle == "Solid" ? line.style_solid :
               lineStyle == "Dotted" ? line.style_dotted : line.style_dashed
ph           = ta.pivothigh(rb, rb)
pl           = ta.pivotlow (rb, rb)
sr_levels = array.new_float(21, na)
prdhighest = ta.highest(prd)
prdlowest = ta.lowest(prd)
cwidth       = percWidth(prd, ChannelW)
zonePerc     = percWidth(300, zoneWidth)
aas          = array.new_bool(41, true)
u1           = 0.0, u1 := nz(u1[1])
d1           = 0.0, d1 := nz(d1[1])
highestph = 0.0, highestph := highestph[1]
lowestpl     = 0.0, lowestpl := lowestpl[1]
// Get components
rsi       = ta.rsi(close, 28)
//rsiOb     = rsi > 78 and rsi > ta.ema(rsi, 10)
//rsiOs     = rsi < 27 and rsi < ta.ema(rsi, 10)
rsiOb     = rsi > 65 and rsi > ta.ema(rsi, 10)
rsiOs     = rsi < 35 and rsi < ta.ema(rsi, 10)
dHigh     = securityNoRep(syminfo.tickerid, "D", high [1])
dLow      = securityNoRep(syminfo.tickerid, "D", low [1])
dClose    = securityNoRep(syminfo.tickerid, "D", close[1])
ema = ta.ema(close, 144)
emaBull = close > ema
equal_tf(res) => str.tonumber(res) == f_chartTfInMinutes() and not
timeframe.isseconds
higher_tf(res) => str.tonumber(res) > f_chartTfInMinutes() or timeframe.isseconds
too_small_tf(res) => (timeframe.isweekly and res=="1") or (timeframe.ismonthly and
str.tonumber(res) < 10)
securityNoRep1(sym, res, src) =>
    bool bull_ = na
    bull_ := equal_tf(res) ? src : bull_
    bull_ := higher_tf(res) ? request.security(sym, res, src, barmerge.gaps_off,
barmerge.lookahead_on) : bull_
    bull_array = request.security_lower_tf(syminfo.tickerid, higher_tf(res) ?
str.tostring(f_chartTfInMinutes()) + (timeframe.isseconds ? "S" : "") :
too_small_tf(res) ? (timeframe.isweekly ? "3" : "10") : res, src)
    if array.size(bull_array) > 1 and not equal_tf(res) and not higher_tf(res)
        bull_ := array.pop(bull_array)
    array.clear(bull_array)
    bull_
// TF1Bull    = securityNoRep1(syminfo.tickerid, "1"   , emaBull)
// TF3Bull    = securityNoRep1(syminfo.tickerid, "3"   , emaBull)
// TF5Bull    = securityNoRep1(syminfo.tickerid, "5"   , emaBull)
// TF15Bull = securityNoRep1(syminfo.tickerid, "15" , emaBull)
// TF30Bull = securityNoRep1(syminfo.tickerid, "30" , emaBull)
// TF60Bull = securityNoRep1(syminfo.tickerid, "60" , emaBull)
// TF120Bull = securityNoRep1(syminfo.tickerid, "120" , emaBull)
// TF240Bull = securityNoRep1(syminfo.tickerid, "240" , emaBull)
// TF480Bull = securityNoRep1(syminfo.tickerid, "480" , emaBull)
// TFDBull    = securityNoRep1(syminfo.tickerid, "1440", emaBull)
// [wt1, wt2] = wavetrend(close, 5, 10)
// [wtDivBear1, wtDivBull1] = f_findDivs(wt2, 15, -40)
// [wtDivBear2, wtDivBull2] = f_findDivs(wt2, 45, -65)
// wtDivBull = wtDivBull1 or wtDivBull2
// wtDivBear = wtDivBear1 or wtDivBear2
////////////////////////////////////////////////////////
// === BASE FUNCTIONS ===
// Returns MA input selection variant, default to SMA if blank or typo.
variant(type, src, len, offSig, offALMA) =>
    v1     = ta.sma(src, len) // Simple
    v2     = ta.ema(src, len) // Exponential
    v3     = 2 * v2 - ta.ema(v2, len) // Double Exponential
    v4     = 3 * (v2 - ta.ema(v2, len)) + ta.ema(ta.ema(v2, len), len) // Triple
Exponential
    v5     = ta.wma(src, len) // Weighted
    v6     = ta.vwma(src, len) // Volume Weighted
    v7     = 0.0
    sma_1 = ta.sma(src, len) // Smoothed
    v7    := na(v7[1]) ? sma_1 : (v7[1] * (len - 1) + src) / len
    v8     = ta.wma(2 * ta.wma(src, len / 2) - ta.wma(src, len),
math.round(math.sqrt(len))) // Hull
    v9     = ta.linreg(src, len, offSig) // Least Squares
    v10    = ta.alma(src, len, offALMA, offSig) // Arnaud Legoux
    v11    = ta.sma(v1, len) // Triangular (extreme smooth)
    // SuperSmoother filter
    //    2013 John F. Ehlers
    a1     = math.exp(-1.414 * 3.14159 / len)
    b1     = 2 * a1 * math.cos(1.414 * 3.14159 / len)
    c2     = b1
    c3     = -a1 * a1
    c1     = 1 - c2 - c3
    v12    = 0.0
    v12 := c1 * (src + nz(src[1])) / 2 + c2 * nz(v12[1]) + c3 * nz(v12[2])
    type == 'EMA' ? v2 : type == 'DEMA' ? v3 : type == 'TEMA' ? v4 : type ==
'WMA' ? v5 : type == 'VWMA' ? v6 : type == 'SMMA' ? v7 : type == 'HullMA' ? v8 :
type == 'LSMA' ? v9 : type == 'ALMA' ? v10 : type == 'TMA' ? v11 : type == 'SSMA' ?
v12 : v1
// plotcandle(
  // open, high,   low, close,
  // title     =   'plotcandle',
  // color     =   close > open ? color.rgb(120, 9, 139) : color.rgb(69, 155, 225),
  // wickcolor =   close > open ? color.rgb(120, 9, 139) : color.rgb(69, 155, 225))
// if sell
    // //strategy.close("Long" , alert_message = i_alert_txt_exit_long)
    // strategy.entry("Short" , strategy.short, alert_message =
i_alert_txt_entry_short)
    // alert(message = "SHort position")
//#endregion }
// ——————————— <↑↑↑ G_SCRIPT01 ↑↑↑>
//<triggers>
lxTrigger      =   false
sxTrigger      =   false
leTrigger      =   ta.crossover (closeSeriesAlt, openSeriesAlt)
seTrigger      =   ta.crossunder(closeSeriesAlt, openSeriesAlt)
// ——————————— <constant_declarations>
//Tooltip
T_LVL        = '(%) Exit Level'
T_QTY        = '(%) Adjust trade exit volume'
T_MSG        = 'Paste JSON message for your bot'
//Webhook Message
O_LEMSG      = 'Long Entry'
O_LXMSGSL    = 'Long SL'
O_LXMSGTP1   =   'Long TP1'
O_LXMSGTP2   =   'Long TP2'
O_LXMSGTP3   =   'Long TP3'
O_LXMSG      =   'Long Exit'
O_SEMSG      =   'Short Entry'
O_SXMSGSL    =   'Short SL'
O_SXMSGA     =   'Short TP1'
O_SXMSGB     =   'Short TP2'
O_SXMSGC     =   'Short TP3'
O_SXMSGX     =   'Short Exit'
// ——————————— <input>           |          |               |
Line length guide |
i_lxLvlTP1   = input.float       (1,        'Level TP1'     , group
= G_RISK,
     tooltip =                    T_LVL)
i_lxQtyTP1   = input.float       (50,       'Qty   TP1'     , group
= G_RISK,
     tooltip =                    T_QTY)
i_lxLvlTP2   = input.float       (1.5,      'Level TP2'     , group
= G_RISK,
     tooltip =                    T_LVL)
i_lxQtyTP2   = input.float       (30,       'Qty   TP2'     , group
= G_RISK,
     tooltip =                    T_QTY)
i_lxLvlTP3   = input.float       (2,        'Level TP3'     , group
= G_RISK,
     tooltip =                    T_LVL)
i_lxQtyTP3   = input.float       (20,       'Qty   TP3'     , group
= G_RISK,
     tooltip =                    T_QTY)
i_lxLvlSL    = input.float       (0.5,      'Stop Loss'     , group
= G_RISK,
     tooltip =                    T_LVL)
i_sxLvlTP1   = i_lxLvlTP1
i_sxQtyTP1   = i_lxQtyTP1
i_sxLvlTP2   = i_lxLvlTP2
i_sxQtyTP2   = i_lxQtyTP2
i_sxLvlTP3   = i_lxLvlTP3
i_sxQtyTP3   = i_lxQtyTP3
i_sxLvlSL    = i_lxLvlSL
G_DISPLAY    = 'Display'
//<display>
i_alertOn    = input.bool       (true,       'Alert Labels On/Off'         , group
= G_DISPLAY)
i_barColOn   = input.bool       (true,       'Bar Color On/Off'            , group
= G_DISPLAY)
// ——————————— <function_declarations>
// @function        Calculate the Take Profit line, and the crossover or crossunder
f_tp(_condition, _conditionValue, _leTrigger, _seTrigger, _src, _lxLvlTP,
_sxLvlTP)=>
    var float _tpLine = 0.0
    _topLvl     = _src + (_src * (_lxLvlTP / 100))
    _botLvl     = _src - (_src * (_sxLvlTP / 100))
    _tpLine    := _condition[1] != _conditionValue and _leTrigger ? _topLvl :
                  _condition[1] != -_conditionValue and _seTrigger ? _botLvl :
                  nz(_tpLine[1])
    [_tpLine]
// ——————————— <calculations>
//<set initial values>
var float condition = 0.0
var float slLine    = 0.0
var float entryLine = 0.0
switch
    leTrigger   and   condition[1]   <=    0.0   =>   condition     :=    1.0
    seTrigger   and   condition[1]   >=    0.0   =>   condition     :=   -1.0
    tp3Long     and   condition[1]   ==    1.2   =>   condition     :=    1.3
    tp3Short    and   condition[1]   ==   -1.2   =>   condition     :=   -1.3
    tp2Long     and   condition[1]   ==    1.1   =>   condition     :=    1.2
    tp2Short    and   condition[1]   ==   -1.1   =>   condition     :=   -1.2
    tp1Long     and   condition[1]   ==    1.0   =>   condition     :=    1.1
    tp1Short    and   condition[1]   ==   -1.0   =>   condition     :=   -1.1
    slLong      and   condition[1]   >=    1.0   =>   condition     :=    0.0
    slShort     and   condition[1]   <=   -1.0   =>   condition     :=    0.0
    lxTrigger   and   condition[1]   >=    1.0   =>   condition     :=    0.0
    sxTrigger   and   condition[1]   <=   -1.0   =>   condition     :=    0.0
// ——————————— <strategy_calls> {
//<long orders>
if strategy.position_size <= 0 and longE and barstate.isconfirmed
    strategy.entry(
      'Long',
      strategy.long,
      alert_message    = i_leMsg,
      comment          = 'LE')
if strategy.position_size > 0 and condition == 1.0
    strategy.exit(
      id               = 'LXTP1',
      from_entry       = 'Long',
      qty_percent      = i_lxQtyTP1,
      limit            = tp1Line,
      stop             = slLine,
      comment_profit   = 'LXTP1',
      comment_loss     = 'SL',
      alert_profit     = i_lxMsgTP1,
      alert_loss       = i_lxMsgSL)
if strategy.position_size > 0 and condition == 1.1
    strategy.exit(
      id               = 'LXTP2',
      from_entry       = 'Long',
      qty_percent      = i_lxQtyTP2,
      limit            = tp2Line,
      stop             = slLine,
      comment_profit   = 'LXTP2',
      comment_loss     = 'SL',
      alert_profit     = i_lxMsgTP2,
      alert_loss       = i_lxMsgSL)
if strategy.position_size > 0 and condition == 1.2
    strategy.exit(
      id               = 'LXTP3',
      from_entry       = 'Long',
      qty_percent      = i_lxQtyTP3,
      limit            = tp3Line,
      stop             = slLine,
      comment_profit   = 'LXTP3',
      comment_loss     = 'SL',
      alert_profit     = i_lxMsgTP3,
      alert_loss       = i_lxMsgSL)
if longX
    strategy.close(
      'Long',
      alert_message    = i_lxMsg,
      comment          = 'LX')
//<short orders>
if strategy.position_size >= 0 and shortE and barstate.isconfirmed
    strategy.entry(
      'Short',
      strategy.short,
      alert_message    = i_leMsg,
      comment          = 'SE')
if strategy.position_size < 0 and condition == -1.0
    strategy.exit(
      id               = 'SXTP1',
      from_entry       = 'Short',
      qty_percent      = i_sxQtyTP1,
      limit            = tp1Line,
      stop             = slLine,
      comment_profit   = 'SXTP1',
      comment_loss     = 'SL',
      alert_profit     = i_sxMsgTP1,
      alert_loss       = i_sxMsgSL)
if strategy.position_size < 0 and condition == -1.1
    strategy.exit(
      id               = 'SXTP2',
      from_entry       = 'Short',
      qty_percent      = i_sxQtyTP2,
      limit            = tp2Line,
      stop             = slLine,
      comment_profit   = 'SXTP2',
      comment_loss     = 'SL',
      alert_profit     = i_sxMsgTP2,
      alert_loss       = i_sxMsgSL)
if strategy.position_size < 0 and condition == -1.2
    strategy.exit(
      id               = 'SXTP3',
      from_entry       = 'Short',
      qty_percent      = i_sxQtyTP3,
      limit            = tp3Line,
      stop             = slLine,
      comment_profit   = 'SXTP3',
      comment_loss     = 'SL',
      alert_profit     = i_sxMsgTP3,
      alert_loss       = i_sxMsgSL)
if shortX
    strategy.close(
      'Short',
      alert_message    = i_sxMsg,
      comment          = 'SX')
// ——————————— <visuals>
c_tp         = leTrigger or seTrigger   ?   na   :
               condition == 0.0         ?   na   : color.green
c_entry      = leTrigger or seTrigger   ?   na   :
               condition == 0.0         ?   na   : color.blue
c_sl         = leTrigger or seTrigger   ?   na   :
               condition == 0.0         ?   na   : color.red
p_tp1Line    = plot (
  condition == 1.0 or
  condition == -1.0 ? tp1Line : na,
  title      = "TP Line 1",
  color      = c_tp,
  linewidth = 1,
  style      = plot.style_linebr)
p_tp2Line    = plot (
  condition == 1.0 or
  condition == -1.0 or
  condition == 1.1 or
  condition == -1.1 ? tp2Line : na,
  title      = "TP Line 2",
  color      = c_tp,
  linewidth = 1,
  style      = plot.style_linebr)
p_tp3Line    = plot (
  condition == 1.0 or
  condition == -1.0 or
  condition == 1.1 or
  condition == -1.1 or
  condition == 1.2 or
  condition == -1.2 ? tp3Line : na,
  title      = "TP Line 3",
  color      = c_tp,
  linewidth = 1,
  style      = plot.style_linebr)
p_entryLine = plot (
  condition >= 1.0 or
  condition <= -1.0 ? entryLine : na,
  title      = "Entry Line",
  color      = c_entry,
  linewidth = 1,
  style      = plot.style_linebr)
p_slLine     = plot (
  condition == 1.0 or
  condition == -1.0 or
  condition == 1.1 or
  condition == -1.1 or
  condition == 1.2 or
  condition == -1.2 ? slLine : na,
  title      = "SL Line",
  color      = c_sl,
  linewidth = 1,
  style      = plot.style_linebr)
fill(
  p_tp3Line, p_entryLine,
  color      = leTrigger or seTrigger ? na :color.new(color.green, 90))
fill(
  p_entryLine, p_slLine,
  color      = leTrigger or seTrigger ? na :color.new(color.red, 90))
//<alerts labels>
plotshape(
  i_alertOn and longE,
  title      = 'Long',
  text       = 'Long',
  textcolor = color.white,
  color      = color.green,
  style      = shape.labelup,
  size       = size.tiny,
  location   = location.belowbar)
plotshape(
  i_alertOn and shortE,
  title      = 'Short',
  text       = 'Short',
  textcolor = color.white,
  color      = color.red,
  style      = shape.labeldown,
  size       = size.tiny,
  location   = location.abovebar)
plotshape(
  i_alertOn and (longX or shortX) ? close : na,
  title      = 'Close',
  text       = 'Close',
  textcolor = color.white,
  color      = color.gray,
  style      = shape.labelup,
  size       = size.tiny,
  location   = location.absolute)
l_tp         = i_alertOn and (longTP1 or shortTP1) ? close : na
plotshape(
  l_tp,
  title      = "TP1 Cross",
  text       = "TP1",
  textcolor = color.white,
  color      = color.olive,
  style      = shape.labelup,
  size       = size.tiny,
  location   = location.absolute)
plotshape(
  i_alertOn and (longTP2 or shortTP2) ? close : na,
  title      = "TP2 Cross",
  text       = "TP2",
  textcolor = color.white,
  color      = color.olive,
  style      = shape.labelup,
  size       = size.tiny,
  location   = location.absolute)
plotshape(
  i_alertOn and (longTP3 or shortTP3) ? close : na,
  title      = "TP3 Cross",
  text       = "TP3",
  textcolor = color.white,
  color      = color.olive,
  style      = shape.labelup,
  size       = size.tiny,
  location   = location.absolute)
plotshape(
  i_alertOn and (longSL or shortSL) ? close : na,
  title      = "SL Cross",
  text       = "SL",
  textcolor = color.white,
  color      = color.maroon,
  style      = shape.labelup,
  size       = size.tiny,
  location   = location.absolute)
//<debug>
plot(
  na,
  title      = "─── <debug> ───",
  editable   = false,
  display    = display.data_window)
plot(
  condition,
  title      = "condition",
  editable   = false,
  display    = display.data_window)
plot(
  strategy.position_size * 100,
  title      = ".position_size",
  editable   = false,
  display    = display.data_window)
//#endregion }
// ——————————— <↑↑↑ G_RISK ↑↑↑>
line.delete(
  f_qDq(a_slLine,
  line.new(
   entryIndex,
   slLine,
   last_bar_index + l_right,
   slLine,
   style = line.style_solid,
   color = c_sl)))
line.delete(
  f_qDq(a_entryLine,
  line.new(
   entryIndex,
   entryLine,
   last_bar_index + l_right,
   entryLine,
   style = line.style_solid,
   color = color.blue)))
line.delete(
  f_qDq(a_tp3Line,
  line.new(
   entryIndex,
   tp3Line,
   last_bar_index + l_right,
   tp3Line,
   style = line.style_solid,
   color = c_tp)))
line.delete(
  f_qDq(a_tp2Line,
  line.new(
   entryIndex,
   tp2Line,
   last_bar_index + l_right,
   tp2Line,
   style = line.style_solid,
   color = c_tp)))
line.delete(
  f_qDq(a_tp1Line,
  line.new(
   entryIndex,
   tp1Line,
   last_bar_index + l_right,
   tp1Line,
   style = line.style_solid,
   color = c_tp)))
label.delete(
  f_qDq(a_slLabel,
  label.new(
   last_bar_index + l_right,
   slLine,
   'SL: ' + str.tostring(slLine, '##.###'),
   style = label.style_label_left,
   textcolor = color.white,
   color = c_sl)))
label.delete(
  f_qDq(a_entryLabel,
  label.new(
   last_bar_index + l_right,
   entryLine,
   'Entry: ' + str.tostring(entryLine, '##.###'),
   style = label.style_label_left,
   textcolor = color.white,
   color = color.blue)))
label.delete(
  f_qDq(a_tp3label,
  label.new(
   last_bar_index + l_right,
   tp3Line,
   'TP3: ' + str.tostring(tp3Line, '##.###'),
   style = label.style_label_left,
   textcolor = color.white,
   color = c_tp)))
label.delete(
  f_qDq(a_tp2label,
  label.new(
   last_bar_index + l_right,
   tp2Line,
   'TP2: ' + str.tostring(tp2Line, '##.###'),
   style = label.style_label_left,
   textcolor = color.white,
   color = c_tp)))
label.delete(
  f_qDq(a_tp1label,
  label.new(
   last_bar_index + l_right,
   tp1Line,
   'TP1: ' + str.tostring(tp1Line, '##.###'),
   style = label.style_label_left,
   textcolor = color.white,
   color = c_tp)))
//#endregion }
// ——————————— <↑↑↑ G_SCRIPT02 ↑↑↑>
// ——————————— <alerts>
//<any_alert_function_call>
if longE or shortE or longX or shortX
    alert(message = 'Any Alert',    freq   = alert.freq_once_per_bar_close)
if longE
    alert(message = 'Long Entry', freq     = alert.freq_once_per_bar_close)
if shortE
    alert(message = 'Short Entry', freq    = alert.freq_once_per_bar_close)
if longX
    alert(message = 'Long Exit',    freq   = alert.freq_once_per_bar_close)
if shortX
    alert(message = 'Short Exit', freq     = alert.freq_once_per_bar_close)
//#endregion }
// ——————————— <↑↑↑ G_SCRIPT03 ↑↑↑>