mirror of
https://github.com/mihakralj/QuanTAlib.git
synced 2026-08-23 21:18:04 +00:00
fix(docs): correct .md documentation across errors, dynamics, filters, forecasts, momentum, numerics, oscillators, reversals, statistics, trends, volatility, volume
Deep review of all indicator categories verified .md headers against .cs WarmupPeriod, parameters, inputs, and outputs. Fixes include warmup corrections, parameter documentation, output type accuracy, and Pine Script alignment.
This commit is contained in:
+17
-100
@@ -1,112 +1,29 @@
|
||||
// Licensed under the Apache License, Version 2.0
|
||||
// © mihakralj
|
||||
//@version=6
|
||||
indicator("Acceleration, Slope of Slope (JERK)", "JERK", overlay=false, precision=8)
|
||||
indicator("Third Derivative / Jerk (JERK)", "JERK", overlay=false, precision=8)
|
||||
|
||||
//@function Calculates jerk (slope of slope of slope)
|
||||
//@param src Source series to calculate slope from
|
||||
//@param len Lookback period for calculation
|
||||
//@returns jerk
|
||||
jerk(series float src, simple int len1) =>
|
||||
if len1 <= 1
|
||||
runtime.error("Length 1 for first slope calculation must be greater than 1")
|
||||
var float sumX1 = 0.0, var float sumY1 = 0.0, var float sumXY1 = 0.0, var float sumX21 = 0.0
|
||||
var int validCount1 = 0
|
||||
var array<float> x_values1 = array.new_float(len1)
|
||||
var array<float> y_values1 = array.new_float(len1)
|
||||
var int head1 = 0
|
||||
var int internal_time_counter1 = 0
|
||||
if internal_time_counter1 >= len1
|
||||
float oldX1 = array.get(x_values1, head1)
|
||||
float oldY1 = array.get(y_values1, head1)
|
||||
if not na(oldY1)
|
||||
sumX1 := sumX1 - oldX1, sumY1 := sumY1 - oldY1
|
||||
sumXY1 := sumXY1 - oldX1 * oldY1, sumX21 := sumX21 - oldX1 * oldX1
|
||||
validCount1 := validCount1 - 1
|
||||
float currentX1 = internal_time_counter1
|
||||
float currentY1 = src
|
||||
array.set(x_values1, head1, currentX1)
|
||||
array.set(y_values1, head1, currentY1)
|
||||
if not na(currentY1)
|
||||
sumX1 := sumX1 + currentX1, sumY1 := sumY1 + currentY1
|
||||
sumXY1 := sumXY1 + currentX1 * currentY1, sumX21 := sumX21 + currentX1 * currentX1
|
||||
validCount1 := validCount1 + 1
|
||||
head1 := (head1 + 1) % len1
|
||||
internal_time_counter1 := internal_time_counter1 + 1
|
||||
float current_slope1 = na
|
||||
if validCount1 >= 2
|
||||
float n1 = validCount1
|
||||
float divisor1 = n1 * sumX21 - sumX1 * sumX1
|
||||
if divisor1 != 0.0
|
||||
current_slope1 := (n1 * sumXY1 - sumX1 * sumY1) / divisor1
|
||||
var float sumX2 = 0.0, var float sumY2 = 0.0, var float sumXY2 = 0.0, var float sumX22 = 0.0
|
||||
var int validCount2 = 0
|
||||
var array<float> x_values2 = array.new_float(len1)
|
||||
var array<float> y_values2 = array.new_float(len1)
|
||||
var int head2 = 0
|
||||
var int internal_time_counter2 = 0
|
||||
if internal_time_counter2 >= len1
|
||||
float oldX2 = array.get(x_values2, head2)
|
||||
float oldY2 = array.get(y_values2, head2)
|
||||
if not na(oldY2)
|
||||
sumX2 := sumX2 - oldX2, sumY2 := sumY2 - oldY2
|
||||
sumXY2 := sumXY2 - oldX2 * oldY2, sumX22 := sumX22 - oldX2 * oldX2
|
||||
validCount2 := validCount2 - 1
|
||||
float currentX2 = internal_time_counter2
|
||||
float currentY2 = current_slope1
|
||||
array.set(x_values2, head2, currentX2)
|
||||
array.set(y_values2, head2, currentY2)
|
||||
if not na(currentY2)
|
||||
sumX2 := sumX2 + currentX2, sumY2 := sumY2 + currentY2
|
||||
sumXY2 := sumXY2 + currentX2 * currentY2, sumX22 := sumX22 + currentX2 * currentX2
|
||||
validCount2 := validCount2 + 1
|
||||
head2 := (head2 + 1) % len1
|
||||
internal_time_counter2 := internal_time_counter2 + 1
|
||||
float current_accel = na
|
||||
if validCount2 >= 2
|
||||
float n2 = validCount2
|
||||
float divisor2 = n2 * sumX22 - sumX2 * sumX2
|
||||
if divisor2 != 0.0
|
||||
current_accel := (n2 * sumXY2 - sumX2 * sumY2) / divisor2
|
||||
var float sumX3 = 0.0, var float sumY3 = 0.0, var float sumXY3 = 0.0, var float sumX23 = 0.0
|
||||
var int validCount3 = 0
|
||||
var array<float> x_values3 = array.new_float(len1)
|
||||
var array<float> y_values3 = array.new_float(len1)
|
||||
var int head3 = 0
|
||||
var int internal_time_counter3 = 0
|
||||
if internal_time_counter3 >= len1
|
||||
float oldX3 = array.get(x_values3, head3)
|
||||
float oldY3 = array.get(y_values3, head3)
|
||||
if not na(oldY3)
|
||||
sumX3 := sumX3 - oldX3, sumY3 := sumY3 - oldY3
|
||||
sumXY3 := sumXY3 - oldX3 * oldY3, sumX23 := sumX23 - oldX3 * oldX3
|
||||
validCount3 := validCount3 - 1
|
||||
float currentX3 = internal_time_counter3
|
||||
float currentY3 = current_accel
|
||||
array.set(x_values3, head3, currentX3)
|
||||
array.set(y_values3, head3, currentY3)
|
||||
if not na(currentY3)
|
||||
sumX3 := sumX3 + currentX3, sumY3 := sumY3 + currentY3
|
||||
sumXY3 := sumXY3 + currentX3 * currentY3, sumX23 := sumX23 + currentX3 * currentX3
|
||||
validCount3 := validCount3 + 1
|
||||
head3 := (head3 + 1) % len1
|
||||
internal_time_counter3 := internal_time_counter3 + 1
|
||||
float calculatedjerk = na
|
||||
if validCount3 >= 2
|
||||
float n3 = validCount3
|
||||
float divisor3 = n3 * sumX23 - sumX3 * sumX3
|
||||
if divisor3 != 0.0
|
||||
calculatedjerk := (n3 * sumXY3 - sumX3 * sumY3) / divisor3
|
||||
calculatedjerk
|
||||
//@function Calculates the third finite difference (jerk): Jerk = V[t] - 3*V[t-1] + 3*V[t-2] - V[t-3]
|
||||
//@param src Source series
|
||||
//@returns Third difference. Returns 0.0 until 4 bars are available.
|
||||
//@optimized Uses direct history access and binomial coefficients [1,-3,3,-1].
|
||||
jerk(series float src) =>
|
||||
float v0 = src
|
||||
float v1 = src[1]
|
||||
float v2 = src[2]
|
||||
float v3 = src[3]
|
||||
if na(v1) or na(v2) or na(v3)
|
||||
0.0
|
||||
else
|
||||
v0 - 3.0 * v1 + 3.0 * v2 - v3
|
||||
|
||||
// ---------- Main loop ----------
|
||||
// ---------- Main loop ----------
|
||||
|
||||
// Inputs
|
||||
i_period = input.int(14, "Period", minval=2)
|
||||
i_source = input.source(close, "Source")
|
||||
|
||||
// Calculation
|
||||
a = jerk(i_source, i_period)
|
||||
j = jerk(i_source)
|
||||
|
||||
// Plot
|
||||
plot(a, "jerk", color=color.yellow, linewidth=2)
|
||||
plot(j, "Jerk", color=color.yellow, linewidth=2)
|
||||
|
||||
Reference in New Issue
Block a user