Untitled
unknown
plain_text
a year ago
8.3 kB
38
Indexable
//@version=5
//indicator(title='Range PA', overlay=true)
bool range_sv = input.bool(true, title='Plot Range')
bool range_eq_sv = input.bool(true, title='Plot Range 0.5 Line')
bool range_q_sv = input.bool(true, title='Plot Range 0.25 and 0.75 Lines')
bool log_sv = input.bool(true, title='Use Log Scale')
bool r_a_sv = input.bool(true, title='Alert New Range')
bool rt_a_sv = input.bool(true, title='Alert Range test')
var float[] pvh1_price = array.new_float(30, na) // high
var int[] pvh1_time = array.new_int(30, na)
var float[] pvl1_price = array.new_float(30, na) // low
var int[] pvl1_time = array.new_int(30, na)
var float[] pvh2_price = array.new_float(10, na) // higher high
var int[] pvh2_time = array.new_int(10, na)
var float[] pvl2_price = array.new_float(10, na) // lower low
var int[] pvl2_time = array.new_int(10, na)
var line[] range_h_lines = array.new_line() // Range lines
var line[] range_25_lines = array.new_line()
var line[] range_m_lines = array.new_line()
var line[] range_75_lines = array.new_line()
var line[] range_l_lines = array.new_line()
var label range_high_label = na
var label range_low_label = na
var label range_mid_label = na
var float temp_pv_0 = na
var float temp_pv_1 = na
var float temp_pv_2 = na
var int temp_time = na
var float last_range_h = na
var float last_range_l = na
var line range_m = na
var line range_25 = na
var line range_75 = na
var int rh_a_time = 0
var int rl_a_time = 0
bool pvh = high < high[1] and high[1] > high[2]
bool pvl = low > low[1] and low[1] < low[2]
int pv1_time = bar_index[1]
float pv1_high = high[1]
float pv1_low = low[1]
bool new_ph_2nd = false
bool new_pl_2nd = false
string alert = na
if barstate.isconfirmed
if pvh
array.pop(pvh1_price)
array.pop(pvh1_time)
array.unshift(pvh1_price, pv1_high)
array.unshift(pvh1_time, pv1_time)
if array.size(pvh1_price) > 2
temp_pv_0 := array.get(pvh1_price, 0)
temp_pv_1 := array.get(pvh1_price, 1)
temp_pv_2 := array.get(pvh1_price, 2)
if temp_pv_0 < temp_pv_1 and temp_pv_1 > temp_pv_2
array.pop(pvh2_price)
array.pop(pvh2_time)
array.unshift(pvh2_price, temp_pv_1)
array.unshift(pvh2_time, array.get(pvh1_time, 1))
new_ph_2nd := true
if pvl
array.pop(pvl1_price)
array.pop(pvl1_time)
array.unshift(pvl1_price, pv1_low)
array.unshift(pvl1_time, pv1_time)
if array.size(pvl1_price) > 2
temp_pv_0 := array.get(pvl1_price, 0)
temp_pv_1 := array.get(pvl1_price, 1)
temp_pv_2 := array.get(pvl1_price, 2)
if temp_pv_0 > temp_pv_1 and temp_pv_1 < temp_pv_2
array.pop(pvl2_price)
array.pop(pvl2_time)
array.unshift(pvl2_price, temp_pv_1)
array.unshift(pvl2_time, array.get(pvl1_time, 1))
new_pl_2nd := true
if range_sv and (new_ph_2nd or new_pl_2nd) and (array.size(pvh2_price) > 1 and array.size(pvl2_price) > 1) and (array.get(pvh2_price, 0) < array.get(pvh2_price, 1) and array.get(pvl2_price, 0) > array.get(pvl2_price, 1) and array.get(pvh2_price, 0) > array.get(pvl2_price, 1) and array.get(pvl2_price, 0) < array.get(pvh2_price, 1)) and (array.get(pvl2_price, 1) > nz(last_range_h) or na(last_range_l) ? true : (array.get(pvh2_price, 1) < last_range_l))
temp_time := math.min(array.get(pvh2_time, 1), array.get(pvl2_time, 1))
last_range_h := array.get(pvh2_price, 1)
last_range_l := array.get(pvl2_price, 1)
temp_pv_0 := log_sv ? math.exp((math.log(last_range_h) + math.log(last_range_l)) / 2) : (last_range_h + last_range_l) / 2
temp_pv_1 := log_sv ? math.exp((math.log(last_range_h) + math.log(temp_pv_0)) / 2) : (last_range_h + temp_pv_0) / 2
temp_pv_2 := log_sv ? math.exp((math.log(last_range_l) + math.log(temp_pv_0)) / 2) : (last_range_l + temp_pv_0) / 2
array.push(range_h_lines, line.new(x1=temp_time, y1=last_range_h, x2=bar_index, y2=last_range_h, color=color.rgb(205, 29, 240), width=1, extend=extend.right))
array.push(range_l_lines, line.new(x1=temp_time, y1=last_range_l, x2=bar_index, y2=last_range_l, color=color.rgb(205, 29, 240), width=1, extend=extend.right))
if range_eq_sv
array.push(range_m_lines, line.new(x1=temp_time, y1=temp_pv_0, x2=bar_index, y2=temp_pv_0, color=color.rgb(205, 29, 240), width=1, extend=extend.right))
if range_q_sv
array.push(range_25_lines, line.new(x1=temp_time, y1=temp_pv_1, x2=bar_index, y2=temp_pv_1, style=line.style_dashed, color=color.gray, width=1, extend=extend.right))
array.push(range_75_lines, line.new(x1=temp_time, y1=temp_pv_2, x2=bar_index, y2=temp_pv_2, style=line.style_dashed, color=color.gray, width=1, extend=extend.right))
if r_a_sv
alert := alert + 'New Range : ' + str.tostring(last_range_h) + ' - ' + str.tostring(last_range_l) + '. Mean = ' + str.tostring(temp_pv_0) + '\n'
// Remove previous labels if they exist
if na(range_high_label) == false
label.delete(range_high_label)
if na(range_low_label) == false
label.delete(range_low_label)
if na(range_mid_label) == false
label.delete(range_mid_label)
// Create new labels at the end of the lines
range_high_label := label.new(x=temp_time, y=last_range_h, text='Range High', xloc=xloc.bar_index, yloc=yloc.price, style=label.style_none, color=color.rgb(0, 0, 0), textcolor=color.black, textalign=text.align_center)
range_low_label := label.new(x=temp_time, y=last_range_l, text='Range Low', xloc=xloc.bar_index, yloc=yloc.price, style=label.style_none, color=color.rgb(0, 0, 0), textcolor=color.black, textalign=text.align_center)
if range_eq_sv
range_mid_label := label.new(x=temp_time, y=temp_pv_0, text='Range Mid', xloc=xloc.bar_index, yloc=yloc.price, style=label.style_none, color=color.rgb(0, 0, 0), textcolor=color.black, textalign=text.align_center)
if array.size(range_h_lines) > 0
for i = array.size(range_h_lines) - 1 to 0 by 1
range_h = array.get(range_h_lines, i)
top = line.get_y1(range_h)
range_l = array.get(range_l_lines, i)
bottom = line.get_y1(range_l)
temp_time := line.get_x1(range_h)
if array.size(pvh1_price) > 0 and array.get(pvh1_price, 0) > top
if rt_a_sv and close < top
if array.get(pvh1_time, 0) != rh_a_time
rh_a_time := array.get(pvh1_time, 0)
alert := alert + 'Range High Test @ ' + str.tostring(array.get(pvh1_price, 0)) + ' \n'
if array.size(pvl1_price) > 0 and array.get(pvl1_price, 0) < bottom
if rt_a_sv and close > bottom
if array.get(pvl1_time, 0) != rl_a_time
rl_a_time := array.get(pvl1_time, 0)
alert := alert + 'Range Low Test @ ' + str.tostring(array.get(pvl1_price, 0)) + ' \n'
if range_eq_sv
range_m := array.get(range_m_lines, i)
if range_q_sv
range_25 := array.get(range_25_lines, i)
range_75 := array.get(range_75_lines, i)
if array.size(pvh1_price) > 0 and array.size(pvl1_price) > 0 and (array.get(pvh1_price, 0) < bottom or array.get(pvl1_price, 0) > top)
line.delete(range_h)
array.remove(range_h_lines, i)
line.delete(range_l)
array.remove(range_l_lines, i)
if range_eq_sv
line.delete(range_m)
array.remove(range_m_lines, i)
if range_q_sv
line.delete(range_25)
array.remove(range_25_lines, i)
line.delete(range_75)
array.remove(range_75_lines, i)
last_range_h := na
last_range_l := na
alert := not na(alert) ? (alert + 'Current price = ' + str.tostring(close) + '\n') : na
exec = not na(alert) ? true : false
if exec==true
alert(alert, alert.freq_once_per_bar_close)Editor is loading...
Leave a Comment