Opening range glow
The first half hour of the New York session as a gradient rectangle projected to the right, and a filled arrow on the first close that breaks out of it.
//@xfscript 1
indicator("Opening Range Glow")
let range_window: string = "0930-1000"
let cash_window: string = "0930-1600"
let project: int = input.int(60, "project", "Bars to project", 5, 400, 5)
let glow: color = input.color("#3B82F666", "glow", "Range colour")
let up_color: color = input.color("#22C55E", "upColor", "Break up")
let down_color: color = input.color("#EF4444", "downColor", "Break down")
let in_range: bool = session.in(range_window, "America/New_York")
let in_cash: bool = session.in(cash_window, "America/New_York")
let range_started: bool = in_range && !(bar_index > 0 && in_range[1])
let range_ended: bool = !in_range && bar_index > 0 && in_range[1]
let unit: float = nz(ta.atr(14), high - low)
var range_high: float = nan
var range_low: float = nan
var range_bars: float = 0
var broken: bool = false
if range_started {
range_high := high
range_low := low
range_bars := 0
broken := false
}
if in_range {
range_high := math.max(range_high, high)
range_low := math.min(range_low, low)
range_bars += 1
}
let fade: color = color.new(glow, 100)
if range_ended {
plot.rect(-range_bars - 0.5, project, range_high, range_low, glow, glow, 1, fade, "vertical")
}
let break_up: bool = in_cash && !in_range && !broken && close > range_high
let break_down: bool = in_cash && !in_range && !broken && close < range_low
let below: float = low - unit * 0.2
let above: float = high + unit * 0.2
if break_up {
plot.polygon(up_color, 0, below, 0.45, below - unit * 0.6, 0.15, below - unit * 0.6, 0.15, below - unit * 1.4, -0.15, below - unit * 1.4, -0.15, below - unit * 0.6, -0.45, below - unit * 0.6)
broken := true
}
if break_down {
plot.polygon(down_color, 0, above, 0.45, above + unit * 0.6, 0.15, above + unit * 0.6, 0.15, above + unit * 1.4, -0.15, above + unit * 1.4, -0.15, above + unit * 0.6, -0.45, above + unit * 0.6)
broken := true
}