Files
Miha Kralj 35a6702b06 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.
2026-03-10 18:38:23 -07:00

66 lines
2.3 KiB
Plaintext

// Licensed under the Apache License, Version 2.0
// © mihakralj
//@version=6
indicator("Zero-Lag Triple EMA (ZLTEMA)", "ZLTEMA", overlay=true)
//@function Calculates ZLTEMA using zero-lag price and triple exponential smoothing with compensator
//@param source Series to calculate ZLTEMA from
//@param period Smoothing period
//@param alpha Optional smoothing factor (overrides period if provided)
//@returns ZLTEMA value with zero-lag effect applied
//@optimized Uses lag compensation buffer and exponential warmup compensator on all three EMA stages for O(1) complexity
zltema(series float source, simple int period=0, simple float alpha=0) =>
float a = alpha > 0 ? alpha : 2.0 / (period + 1)
float beta = 1.0 - a
simple int lag = math.max(1, math.round((period - 1) / 2))
var bool warmup = true
var float e = 1.0
var float ema1_raw = 0.0
var float ema2_raw = 0.0
var float ema3_raw = 0.0
var float ema1 = na
var float ema2 = na
var float ema3 = na
var priceBuffer = array.new<float>(lag + 1, na)
if not na(source)
if na(ema1)
ema1 := source
ema2 := source
ema3 := source
array.fill(priceBuffer, source)
array.shift(priceBuffer)
array.push(priceBuffer, source)
float laggedPrice = nz(array.get(priceBuffer, 0), source)
float signal = 2 * source - laggedPrice
ema1_raw := a * (signal - ema1_raw) + ema1_raw
if warmup
e *= beta
float c = 1.0 / (1.0 - e)
ema1 := c * ema1_raw
ema2_raw := a * (ema1 - ema2_raw) + ema2_raw
ema2 := c * ema2_raw
ema3_raw := a * (ema2 - ema3_raw) + ema3_raw
ema3 := c * ema3_raw
warmup := e > 1e-10
else
ema1 := ema1_raw
ema2_raw := a * (ema1 - ema2_raw) + ema2_raw
ema2 := ema2_raw
ema3_raw := a * (ema2 - ema3_raw) + ema3_raw
ema3 := ema3_raw
3 * ema1 - 3 * ema2 + ema3
else
na
// ---------- Main loop ----------
// Inputs
i_period = input.int(10, "Period", minval=1)
i_source = input.source(close, "Source")
// Calculation
zltema_value = zltema(i_source, i_period)
// Plot
plot(zltema_value, "ZLTEMA", color=color.yellow, linewidth=2)