// Indicator: 2nd-degree polynomial trend curve
// Author: Iván González
// date: 02-04-2025
// version: 0
// Purpose: Fit a parabola over the last X periods
defparam drawonlastbaronly = true
once sample = 200 // Number of bars to fit the curve
// Initialize summations
sumX = 0
sumX2 = 0
sumX3 = 0
sumX4 = 0
sumY = 0
sumXY = 0
sumX2Y = 0
// Calculate necessary summations for least squares method
FOR i = 0 TO sample - 1 DO
x = i
y = close[i]
sumX = sumX + x
sumX2 = sumX2 + x * x
sumX3 = sumX3 + x * x * x
sumX4 = sumX4 + x * x * x * x
sumY = sumY + y
sumXY = sumXY + x * y
sumX2Y = sumX2Y + x * x * y
NEXT
// Denominator of the coefficient formulas
denom = (sample * sumX2 * sumX4 + 2 * sumX * sumX2 * sumX3 - POW(sumX2, 3) - sample * POW(sumX3, 2) - POW(sumX, 2) * sumX4)
// Calculate polynomial coefficients if denominator is valid
IF denom <> 0 THEN
a = (sample * sumX2 * sumX2Y + sumX * sumX3 * sumY + sumX2 * sumX * sumXY - POW(sumX2, 2) * sumY - sample * sumX3 * sumXY - POW(sumX, 2) * sumX2Y) / denom
b = (sample * sumX4 * sumXY + sumX * sumX2 * sumX2Y + sumX2 * sumX3 * sumY - POW(sumX2, 2) * sumXY - sumX * sumX4 * sumY - sample * sumX3 * sumX2Y) / denom
c = (sumY - b * sumX - a * sumX2) / sample
ENDIF
// Draw the fitted polynomial curve on the chart
IF islastbarupdate THEN
FOR i = sample DOWNTO 1 DO
x1 = i
x2 = i - 1
y1 = a * x1 * x1 + b * x1 + c
y2 = a * x2 * x2 + b * x2 + c
drawsegment(barindex - x1, y1, barindex - x2, y2) coloured("orange") style(line,2)
NEXT
ENDIF
// Return the most recent value of the polynomial trend (x = 0)
xNow = 0
polyTrendNow = a * xNow * xNow + b * xNow + c
RETURN polyTrendNow AS "Polynomial Curve"