#lines_horz_mult_from_close_03
def na = double.nan;
def bn = barnumber();
input price_level = 0;
#hint price_level: Enter a price level, or 0 to follow current price
input line_spacing_type = { default constant, atr };
# hint line_spacing_type: Pick line spacing type, a number or ATR
input line_spacing = 2.0;
input line_qty = 2;
input spacing_factor = 1.0;
def cls = close;
#----------------------
# ATR
def length = 14;
def averageType = AverageType.WILDERS;
def ATR = MovingAverage(averageType, TrueRange(high, close, low), length);
#----------------------
#---------------------
#https://usethinkscript.com/threads/current-price-line-indicator-for-thinkorswim.8793/
# Line At Price
# Mobius
input barsBack = 1000;
def c = if !IsNaN(cls) and IsNaN(cls[-1]) then cls else c[1];
def cline = if isNaN(cls[-barsBack]) then c[-barsBack] else na;
#--------------------
def base = if price_level > 0 then price_level else cline;
def spac;
switch (line_spacing_type) {
case constant:
spac = line_spacing;
case atr:
spac = atr;
}
plot z0 = if isnan(close[1]) then na else base;
plot u1 = if !isnan(close) and line_qty >= 1 then (base + (1 * spac * spacing_factor)) else na;
plot u2 = if !isnan(close) and line_qty >= 2 then (base + (2 * spac * spacing_factor)) else na;
plot u3 = if !isnan(close) and line_qty >= 3 then (base + (3 * spac * spacing_factor)) else na;
plot u4 = if !isnan(close) and line_qty >= 4 then (base + (4 * spac * spacing_factor)) else na;
plot u5 = if !isnan(close) and line_qty >= 5 then (base + (5 * spac * spacing_factor)) else na;
plot u6 = if !isnan(close) and line_qty >= 6 then (base + (6 * spac * spacing_factor)) else na;
plot u7 = if !isnan(close) and line_qty >= 7 then (base + (7 * spac * spacing_factor)) else na;
plot u8 = if !isnan(close) and line_qty >= 8 then (base + (8 * spac * spacing_factor)) else na;
plot w1 = if !isnan(close) and line_qty >= 1 then (base - (1 * spac * spacing_factor)) else na;
plot w2 = if !isnan(close) and line_qty >= 2 then (base - (2 * spac * spacing_factor)) else na;
plot w3 = if !isnan(close) and line_qty >= 3 then (base - (3 * spac * spacing_factor)) else na;
plot w4 = if !isnan(close) and line_qty >= 4 then (base - (4 * spac * spacing_factor)) else na;
plot w5 = if !isnan(close) and line_qty >= 5 then (base - (5 * spac * spacing_factor)) else na;
plot w6 = if !isnan(close) and line_qty >= 6 then (base - (6 * spac * spacing_factor)) else na;
plot w7 = if !isnan(close) and line_qty >= 7 then (base - (7 * spac * spacing_factor)) else na;
plot w8 = if !isnan(close) and line_qty >= 8 then (base - (8 * spac * spacing_factor)) else na;
z0.SetDefaultColor(Color.cyan);
u1.SetDefaultColor(Color.gray);
u2.SetDefaultColor(Color.gray);
u3.SetDefaultColor(Color.gray);
u4.SetDefaultColor(Color.gray);
u5.SetDefaultColor(Color.gray);
u6.SetDefaultColor(Color.gray);
u7.SetDefaultColor(Color.gray);
u8.SetDefaultColor(Color.gray);
w1.SetDefaultColor(Color.gray);
w2.SetDefaultColor(Color.gray);
w3.SetDefaultColor(Color.gray);
w4.SetDefaultColor(Color.gray);
w5.SetDefaultColor(Color.gray);
w6.SetDefaultColor(Color.gray);
w7.SetDefaultColor(Color.gray);
w8.SetDefaultColor(Color.gray);
def xz0 = cls crosses z0;
def xu1 = cls crosses u1;
def xu2 = cls crosses u2;
def xu3 = cls crosses u3;
def xu4 = cls crosses u4;
def xu5 = cls crosses u5;
def xu6 = cls crosses u6;
def xu7 = cls crosses u7;
def xu8 = cls crosses u8;
def xw1 = cls crosses w1;
def xw2 = cls crosses w2;
def xw3 = cls crosses w3;
def xw4 = cls crosses w4;
def xw5 = cls crosses w5;
def xw6 = cls crosses w6;
def xw7 = cls crosses w7;
def xw8 = cls crosses w8;
input alerts = yes;
alert(alerts and xz0, ("crossed " + xz0) ,alert.BAR, sound.DING);
alert(alerts and xu1, ("crossed " + xu1) ,alert.BAR, sound.DING);
alert(alerts and xu2, ("crossed " + xu2) ,alert.BAR, sound.DING);
alert(alerts and xu3, ("crossed " + xu3) ,alert.BAR, sound.DING);
alert(alerts and xu4, ("crossed " + xu4) ,alert.BAR, sound.DING);
alert(alerts and xu5, ("crossed " + xu5) ,alert.BAR, sound.DING);
alert(alerts and xu6, ("crossed " + xu6) ,alert.BAR, sound.DING);
alert(alerts and xu7, ("crossed " + xu7) ,alert.BAR, sound.DING);
alert(alerts and xu8, ("crossed " + xu8) ,alert.BAR, sound.DING);
alert(alerts and xw1, ("crossed " + xw1) ,alert.BAR, sound.DING);
alert(alerts and xw2, ("crossed " + xw2) ,alert.BAR, sound.DING);
alert(alerts and xw3, ("crossed " + xw3) ,alert.BAR, sound.DING);
alert(alerts and xw4, ("crossed " + xw4) ,alert.BAR, sound.DING);
alert(alerts and xw5, ("crossed " + xw4) ,alert.BAR, sound.DING);
alert(alerts and xw6, ("crossed " + xw4) ,alert.BAR, sound.DING);
alert(alerts and xw7, ("crossed " + xw4) ,alert.BAR, sound.DING);
alert(alerts and xw8, ("crossed " + xw4) ,alert.BAR, sound.DING);
#---------------------
addlabel(1, " ", color.black);
addlabel(1, "price level " + price_level, color.yellow);
addlabel(1, "base price " + base, color.yellow);
addlabel(1, "line qty " + line_qty, color.yellow);
addlabel(1, "spacing factor " + spacing_factor, color.yellow);
addlabel(1, "line spacing " + line_spacing * spacing_factor , color.yellow);
input test_lines = no;
addverticalline(test_lines and xz0, z0);
addverticalline(test_lines and xu1, u1);
addverticalline(test_lines and xu2, u2);
addverticalline(test_lines and xu3, u3);
addverticalline(test_lines and xu4, u4);
addverticalline(test_lines and xu5, u5);
addverticalline(test_lines and xu6, u6);
addverticalline(test_lines and xu7, u7);
addverticalline(test_lines and xu8, u8);
addverticalline(test_lines and xw1, w1);
addverticalline(test_lines and xw2, w2);
addverticalline(test_lines and xw3, w3);
addverticalline(test_lines and xw4, w4);
addverticalline(test_lines and xw5, w5);
addverticalline(test_lines and xw6, w6);
addverticalline(test_lines and xw7, w7);
addverticalline(test_lines and xw8, w8);
#