Files
Miha Kralj 6f0a339c9b fix: resolve build and test errors
- Sar.Quantower.Tests.cs: add missing opening quote on string literal (line 48)
- Exports.cs: rename Correlation.Batch → Correl.Batch (CS0103)
- Ad.Validation.Tests.cs: fix Ooples OutputValues key "Ad" → "Adl"
2026-03-16 12:45:13 -07:00

78 lines
2.7 KiB
Plaintext

// Licensed under the Apache License, Version 2.0
// © mihakralj
//@version=6
indicator("Parabolic SAR", "SAR", overlay=true)
//@function Calculates Parabolic Stop And Reverse (SAR)
//@param af_start Initial acceleration factor (Wilder's original: 0.02)
//@param af_increment Acceleration factor increment per new extreme (Wilder's original: 0.02)
//@param af_max Maximum acceleration factor (Wilder's original: 0.20)
//@returns SAR value (stop level for current trend)
//@optimized Minimal state variables, O(1) per bar
sar(simple float af_start=0.02, simple float af_increment=0.02, simple float af_max=0.20) =>
if af_start <= 0 or af_start > af_max
runtime.error("Start AF must be > 0 and <= Max AF")
if af_increment <= 0
runtime.error("AF increment must be > 0")
if af_max <= af_start
runtime.error("Max AF must be > Start AF")
var bool is_long = true
var float sar = low
var float ep = high
var float af = af_start
if bar_index == 0
is_long := close > open
sar := is_long ? low : high
ep := is_long ? high : low
af := af_start
else
float new_sar = sar + af * (ep - sar)
bool reverse = false
if is_long
new_sar := math.min(new_sar, low[1])
if bar_index > 1
new_sar := math.min(new_sar, low[2])
if low < new_sar
reverse := true
is_long := false
new_sar := ep
ep := low
af := af_start
else
if high > ep
ep := high
af := math.min(af + af_increment, af_max)
else
new_sar := math.max(new_sar, high[1])
if bar_index > 1
new_sar := math.max(new_sar, high[2])
if high > new_sar
reverse := true
is_long := true
new_sar := ep
ep := high
af := af_start
else
if low < ep
ep := low
af := math.min(af + af_increment, af_max)
sar := new_sar
sar
// ---------- Main loop ----------
// Inputs
i_af_start = input.float(0.02, "Start AF", minval=0.001, maxval=1.0, step=0.001)
i_af_increment = input.float(0.02, "AF Increment", minval=0.001, maxval=1.0, step=0.001)
i_af_max = input.float(0.20, "Max AF", minval=0.001, maxval=1.0, step=0.01)
// Calculation
sar = sar(i_af_start, i_af_increment, i_af_max)
psar_above = sar > close ? sar : na
psar_below = sar < close ? sar : na
// Plot
plot(psar_above, "SAR Above", color=color.red, style=plot.style_linebr, linewidth=2)
plot(psar_below, "SAR Below", color=color.green, style=plot.style_linebr, linewidth=2)