Atualizado
ml_dsp Ehlers DSP smoothing toolkit

ml_dsp is a small, dependency-free library of digital-signal-processing filters for Pine v6, built around John Ehlers' filter designs. It exists to solve one recurring problem: EMA and SMA reject noise only by adding lag, so a smoother oscillator or score line always turns late. The filters here reject the same bar-to-bar noise with far less phase delay, so smoothed lines keep their timing.
Everything is exported for reuse via import, and every function takes a series float source and a simple int length, so they slot in wherever you currently call ta.ema(src, len) or ta.sma(src, len).
What's inside
superSmoother(src, period) — Ehlers' 2-pole SuperSmoother low-pass. A direct replacement for ta.ema with substantially less lag for comparable smoothing. Good general-purpose smoother for price, oscillators, and score lines.
ultimateSmoother(src, period) — Ehlers' UltimateSmoother (all-pass minus high-pass). Near-zero lag in the passband — the best default when you want to de-jitter an oscillator or signal line without pushing its turns later. This is the smoother most oscillators should use in place of a display EMA.
highPass(src, period) — Ehlers' 2-pole high-pass filter. Removes the slow trend and leaves the cyclic component — a detrender / cycle extractor for building oscillators, or for isolating short-term deviation from a drifting series.
hann(src, length) — Hann-window FIR smoother. A cosine-tapered moving average with a clean frequency response and minimal ringing; a smooth alternative to SMA when you want gentle, artefact-free smoothing.
rms(src, length) — root-mean-square amplitude of a series over a window. The natural amplitude scale for normalization.
rmsNorm(src, length) — the source divided by its own RMS, giving an approximately unit-amplitude series. A robust alternative to min/max or fixed-range scaling when you need a portable amplitude across symbols and regimes.
How to use
Import the library, then call the filter you need:
//version=6
indicator("Example — UltimateSmoother RSI", overlay = false)
import Market_Logic_India/ml_dsp/1 as dsp
length = input.int(14, "RSI length")
smooth = input.int(6, "Smoothing")
raw = ta.rsi(close, length)
smooth_rsi = dsp.ultimateSmoother(raw, smooth) // lag-minimal vs ta.ema(raw, smooth)
plot(raw, "RSI", color = color.new(color.gray, 60))
plot(smooth_rsi, "UltimateSmoother", color = color.new(#2ecc9b, 0))
Swap ultimateSmoother for superSmoother or hann depending on how aggressive you want the smoothing, or use highPass to detrend and rmsNorm to put a series onto a portable amplitude scale.
Notes
Non-repainting: all filters use only closed historical bars (src, src[1], src[2], and their own feedback). No request.*, no future references. The last bar updates intrabar like any indicator, and settles on close.
Warm-up: the recursive filters (SuperSmoother, UltimateSmoother, High-Pass) seed on the first few bars and converge within a handful of bars; treat the very start of history as warm-up.
Types: pass a simple int length (a plain input or constant), not a series int.
Concept credits
The SuperSmoother, UltimateSmoother, and 2-pole High-Pass filter designs are the work of John F. Ehlers (see his books and articles on cycle analysis and DSP for trading). The Hann-window smoother and RMS normalization are standard signal-processing techniques. This library is an original Pine v6 implementation of those public techniques, packaged for reuse; it is not affiliated with, nor endorsed by, the originators.
License
Mozilla Public License 2.0 — as required for TradingView libraries (open source). You are free to import and build on it.
Everything is exported for reuse via import, and every function takes a series float source and a simple int length, so they slot in wherever you currently call ta.ema(src, len) or ta.sma(src, len).
What's inside
superSmoother(src, period) — Ehlers' 2-pole SuperSmoother low-pass. A direct replacement for ta.ema with substantially less lag for comparable smoothing. Good general-purpose smoother for price, oscillators, and score lines.
ultimateSmoother(src, period) — Ehlers' UltimateSmoother (all-pass minus high-pass). Near-zero lag in the passband — the best default when you want to de-jitter an oscillator or signal line without pushing its turns later. This is the smoother most oscillators should use in place of a display EMA.
highPass(src, period) — Ehlers' 2-pole high-pass filter. Removes the slow trend and leaves the cyclic component — a detrender / cycle extractor for building oscillators, or for isolating short-term deviation from a drifting series.
hann(src, length) — Hann-window FIR smoother. A cosine-tapered moving average with a clean frequency response and minimal ringing; a smooth alternative to SMA when you want gentle, artefact-free smoothing.
rms(src, length) — root-mean-square amplitude of a series over a window. The natural amplitude scale for normalization.
rmsNorm(src, length) — the source divided by its own RMS, giving an approximately unit-amplitude series. A robust alternative to min/max or fixed-range scaling when you need a portable amplitude across symbols and regimes.
How to use
Import the library, then call the filter you need:
//version=6
indicator("Example — UltimateSmoother RSI", overlay = false)
import Market_Logic_India/ml_dsp/1 as dsp
length = input.int(14, "RSI length")
smooth = input.int(6, "Smoothing")
raw = ta.rsi(close, length)
smooth_rsi = dsp.ultimateSmoother(raw, smooth) // lag-minimal vs ta.ema(raw, smooth)
plot(raw, "RSI", color = color.new(color.gray, 60))
plot(smooth_rsi, "UltimateSmoother", color = color.new(#2ecc9b, 0))
Swap ultimateSmoother for superSmoother or hann depending on how aggressive you want the smoothing, or use highPass to detrend and rmsNorm to put a series onto a portable amplitude scale.
Notes
Non-repainting: all filters use only closed historical bars (src, src[1], src[2], and their own feedback). No request.*, no future references. The last bar updates intrabar like any indicator, and settles on close.
Warm-up: the recursive filters (SuperSmoother, UltimateSmoother, High-Pass) seed on the first few bars and converge within a handful of bars; treat the very start of history as warm-up.
Types: pass a simple int length (a plain input or constant), not a series int.
Concept credits
The SuperSmoother, UltimateSmoother, and 2-pole High-Pass filter designs are the work of John F. Ehlers (see his books and articles on cycle analysis and DSP for trading). The Hann-window smoother and RMS normalization are standard signal-processing techniques. This library is an original Pine v6 implementation of those public techniques, packaged for reuse; it is not affiliated with, nor endorsed by, the originators.
License
Mozilla Public License 2.0 — as required for TradingView libraries (open source). You are free to import and build on it.
Notas de Lançamento
v2Added:
olsBeta(y, x, len)
Parameters:
y (float)
x (float)
len (simple int)
olsAlpha(y, x, len)
Parameters:
y (float)
x (float)
len (simple int)
olsR2(y, x, len)
Parameters:
y (float)
x (float)
len (simple int)
olsResid(y, x, len)
Parameters:
y (float)
x (float)
len (simple int)
olsResidZ(y, x, len)
Parameters:
y (float)
x (float)
len (simple int)
Notas de Lançamento
v3 update noteAdds a regression & KDE toolkit for profiles and fair-value: logReg (log-regression fair value — correct for %-scaled NIFTY), polyReg (degree 1–4 curved fair value via normal equations), binomialSmooth (discrete-Gaussian FIR), epanechnikov (KDE kernel), silvermanBW (Silverman auto-bandwidth). All v1/v2 functions unchanged; import bumps to /3.
v3
Added:
logReg(src, len)
Parameters:
src (float)
len (simple int)
polyReg(src, len, degree)
Parameters:
src (float)
len (simple int)
degree (simple int)
binomialSmooth(src, length)
Parameters:
src (float)
length (simple int)
epanechnikov(u)
Parameters:
u (float)
silvermanBW(sd, n)
Parameters:
sd (float)
n (simple int)
Aviso legal
As informações e publicações não se destinam a ser, e não constituem, conselhos ou recomendações financeiras, de investimento, comerciais ou de outro tipo fornecidos ou endossados pela TradingView. Leia mais nos Termos de Uso.
Aviso legal
As informações e publicações não se destinam a ser, e não constituem, conselhos ou recomendações financeiras, de investimento, comerciais ou de outro tipo fornecidos ou endossados pela TradingView. Leia mais nos Termos de Uso.