mirror of
https://github.com/mihakralj/QuanTAlib.git
synced 2026-07-27 17:27:43 +00:00
61 lines
2.3 KiB
Plaintext
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)
|