Files

61 lines
2.3 KiB
Plaintext

// Licensed under the Apache License, Version 2.0
// © mihakralj
//@version=6
indicator("Gann High-Low Activator", "GHLA", overlay=true)
//@function Calculates Gann High-Low Activator using SMA of Highs/Lows with trend-state switching
//@param period Lookback period for SMA calculation (Krausz default: 3)
//@returns Tuple [activator, trend] where trend is 1 (bullish) or -1 (bearish)
//@optimized O(period) SMA via ta.sma built-in; O(1) state transition with hysteresis
ghla(simple int period) =>
if period <= 0
runtime.error("Period must be greater than 0")
// Step 1: Compute SMA of Highs and SMA of Lows over N periods
float smaHigh = ta.sma(high, period)
float smaLow = ta.sma(low, period)
// Step 2: Determine trend state with hysteresis
// Close > SMA(High) => bullish (+1)
// Close < SMA(Low) => bearish (-1)
// Between the two SMAs => retain previous state
var int trend = 0
if trend == 0
// Seed: classify first bar
trend := close >= smaHigh ? 1 : close <= smaLow ? -1 : 1
if close > smaHigh
trend := 1
else if close < smaLow
trend := -1
// else: trend retains previous value (hysteresis zone)
// Step 3: Select activator line based on trend state
// Bullish: activator = SMA(Low) — trailing support below price
// Bearish: activator = SMA(High) — trailing resistance above price
float activator = trend == 1 ? smaLow : smaHigh
[activator, trend]
// ---------- Main loop ----------
// Inputs
i_period = input.int(3, "Period", minval=1, maxval=100, tooltip="SMA lookback period (Krausz default: 3)")
// Calculation
[ghla_line, ghla_trend] = ghla(i_period)
// Colors
color bullish_color = color.new(color.green, 0)
color bearish_color = color.new(color.red, 0)
color line_color = ghla_trend == 1 ? bullish_color : bearish_color
// Plot
plot(ghla_line, "GHLA", color=line_color, linewidth=2, style=plot.style_line)
// Optional: Plot buy/sell signals when trend flips
bool trend_changed = ghla_trend != nz(ghla_trend[1])
plotshape(trend_changed and ghla_trend == 1, "Buy Signal", shape.labelup, location.belowbar, color=bullish_color, text="BUY", textcolor=color.white, size=size.small)
plotshape(trend_changed and ghla_trend == -1, "Sell Signal", shape.labeldown, location.abovebar, color=bearish_color, text="SELL", textcolor=color.white, size=size.small)