//@version=6
indicator('Ardhouse Oscillator', 'ARDOS', overlay = true, max_lines_count = 500,
max_labels_count = 500)
// INPUTS
――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――
――――――――――――――――――――――{
int length = [Link](20, minval=1, title="Filter Length")
bool disp_lvl = [Link](true, "Levels")
color up_color = [Link](#55ffda, "", inline = "color")
color dn_color = [Link](#8c5bff, "", inline = "color")
var buy_line = line(na)
var sell_line = line(na)
// }
// CALCULATION
S――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――
――――――――――――{
float sma1 = [Link](close, 25)
float sma_n1 = ((close - sma1) - [Link](close - sma1, 25)) / [Link](close - sma1,
25)
float area = [Link](high-low, 100)
// Two-pole smooth filter function
f_two_pole_filter(source, length) =>
var float smooth1 = na
var float smooth2 = na
alpha = 2.0 / (length + 1)
if na(smooth1)
smooth1 := source
else
smooth1 := (1 - alpha) * smooth1 + alpha * source
if na(smooth2)
smooth2 := smooth1
else
smooth2 := (1 - alpha) * smooth2 + alpha * smooth1
// Oscillator
two_p = f_two_pole_filter(sma_n1, length)
two_pp = two_p[4]
// Colors
color buy_col1 = color.from_gradient(two_p, -1, 0.5, up_color, na)
color buy_col2 = color.from_gradient(two_p, -1, 0.5, [Link](up_color, 50), na)
color sell_col1 = color.from_gradient(two_p, -0.5, 1, na, dn_color)
color sell_col2 = color.from_gradient(two_p, -0.5, 1, na, [Link](dn_color, 50))
color color = two_p > two_pp
? color.from_gradient(two_p, -1,1, up_color, [Link](up_color,
0))
: color.from_gradient(two_p, -1,1,[Link](dn_color, 0),
dn_color)
// Signals
bool buy = [Link](two_p, two_pp) and two_p < 0 and [Link]
bool sell = [Link](two_p, two_pp) and two_p > 0 and [Link]
// }
// PLOT
――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――
――――――――――――――――――――――――――{
if buy //and two_p < -0.5
sell_line := line(na)
if disp_lvl
buy_line := [Link](
bar_index-1
, low[1] - area
, bar_index
, low[1] - area
, force_overlay = true
, color = buy_col1
, style = line.style_dashed
)
[Link](bar_index-1, low[1] - area
, color = buy_col1, style = label.style_label_up, force_overlay =
true, size = [Link])
if [Link](low, buy_line.get_y1()) and [Link]
[Link](
bar_index-1
, buy_line.get_y1()
, color = [Link](up_color, 100)
, style = label.style_label_center
, force_overlay = true
, size = [Link]
, text = "✖"
, textcolor = up_color
)
buy_line := line(na)
if sell //and two_p > 0.5
buy_line := line(na)
if disp_lvl
sell_line := [Link](
bar_index-1
, high[1] + area
, bar_index
, high[1] + area
, force_overlay = true
, color = sell_col1
, style = line.style_dashed
)
[Link](bar_index-1, high[1] + area
, color = sell_col1, style = label.style_label_down, force_overlay =
true, size = [Link])
if [Link](high, sell_line.get_y1()) and [Link]
[Link](
bar_index-1
, sell_line.get_y1()
, color = [Link](dn_color, 100)
, style = label.style_label_center
, force_overlay = true
, size = [Link]
, text = "✖"
, textcolor = dn_color
)
sell_line := line(na)
switch
not na(buy_line) => buy_line. set_x2(bar_index)
not na(sell_line) => sell_line.set_x2(bar_index)
plotshape(buy ? two_p[1] : na, "Buy", [Link], [Link], buy_col2, -
1, size = [Link])
plotshape(buy ? two_p[1] : na, "Buy", [Link], [Link], buy_col1, -
1, size = [Link])
plotshape(sell ? two_p[1] : na, "Sell", [Link], [Link], sell_col2,
-1, size = [Link])
plotshape(sell ? two_p[1] : na, "Sell", [Link], [Link], sell_col1,
-1, size = [Link])
p11 = plot(1, color = [Link](chart.fg_color, 80))
plot(0.5, color = [Link](chart.fg_color, 50))
p00 = plot(0, color = [Link](bar_index % 2 == 0 ? chart.fg_color : na, 0))
plot(-0.5, color = [Link](chart.fg_color, 50))
p_1 = plot(-1, color = [Link](chart.fg_color, 80))
fill(p11, p00, 2, -1, [Link](chart.fg_color, 80), na)
fill(p_1, p00, 1, -2, na, [Link](chart.fg_color, 80))
p1 = plot(two_p, color = color, linewidth = 1)
p2 = plot(two_pp, display = [Link])
fill(p1, p2, two_p, two_pp, color, na)
// }
p_overbought = plot(0.5, color = na) // Level Overbought
p_oversold = plot(-0.5, color = na) // Level Oversold
// Warna hijau di Overbought
fill(p1, p_overbought, two_p > 0.5 ? [Link]([Link], 50) : na, na)
// Warna merah di Oversold
fill(p1, p_oversold, two_p < -0.5 ? [Link]([Link], 50) : na, na)