Files
QuanTAlib/lib/numerics/slope/slope.pine
T
Miha Kralj 86fe32a682 SIMD Refactor: Merge simd-dev into dev (#55)
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Co-authored-by: aider (openrouter/anthropic/claude-sonnet-4) <aider@aider.chat>
Co-authored-by: Warp <agent@warp.dev>
2026-01-18 19:02:03 -08:00

63 lines
2.0 KiB
Plaintext

// The MIT License (MIT)
// © mihakralj
//@version=6
indicator("Slope, Linear Regression (SLOPE)", "SLOPE", overlay=false, precision=8)
//@function Calculates slope (linear regression)
//@doc https://github.com/mihakralj/pinescript/blob/main/indicators/numerics/slope.md
//@param src Source series to calculate slope from
//@param len Lookback period for calculation
//@returns Slope value properly calculated
slope(series float src, simple int len) =>
if len <= 1
runtime.error("Length must be greater than 1")
var float sumX = 0.0
var float sumY = 0.0
var float sumXY = 0.0
var float sumX2 = 0.0
var int validCount = 0
var array<float> x_values = array.new_float(len)
var array<float> y_values = array.new_float(len)
var int head = 0
var int internal_time_counter = 0
if internal_time_counter >= len
float oldX = array.get(x_values, head)
float oldY = array.get(y_values, head)
if not na(oldY)
sumX := sumX - oldX
sumY := sumY - oldY
sumXY := sumXY - oldX * oldY
sumX2 := sumX2 - oldX * oldX
validCount := validCount - 1
float currentX = internal_time_counter
float currentY = src
array.set(x_values, head, currentX)
array.set(y_values, head, currentY)
if not na(currentY)
sumX := sumX + currentX
sumY := sumY + currentY
sumXY := sumXY + currentX * currentY
sumX2 := sumX2 + currentX * currentX
validCount := validCount + 1
head := (head + 1) % len
internal_time_counter := internal_time_counter + 1
float calculatedSlope = na
if validCount >= 2
float n = validCount
float divisor = n * sumX2 - sumX * sumX
if divisor != 0.0
calculatedSlope := (n * sumXY - sumX * sumY) / divisor
calculatedSlope
// ---------- Main loop ----------
// Inputs
i_period = input.int(14, "Period", minval=2)
i_source = input.source(close, "Source")
// Calculation
s = slope(i_source, i_period)
// Plot
plot(s, "Slope", color=color.yellow, linewidth=2)