Refactor indicators to include "Ehlers" in names and descriptions for clarity

- Updated the name and description of the Hilbert Trendline (HTIT) to "Ehlers Hilbert Transform Instantaneous Trend (HTIT)".
- Changed the name and description of the MESA Adaptive Moving Average (MAMA) to "Ehlers MESA Adaptive Moving Average".
- Modified the Center of Gravity (CG) indicator to "Ehlers Center of Gravity (CG)".
- Renamed the Detrended Synthetic Price (DSP) to "Ehlers Detrended Synthetic Price (DSP)".
- Updated the Autocorrelation Periodogram (EACP) to "Ehlers Autocorrelation Periodogram (EACP)".
- Changed the Homodyne Discriminator (HOMOD) to "Ehlers Homodyne Discriminator (HOMOD)".
- Updated the Hilbert Transform Dominant Cycle Period and Phase indicators to include "Ehlers" in their names.
- Renamed the Hilbert Transform Phasor Components to "Ehlers Hilbert Transform Phasor Components (HT_PHASOR)".
- Updated the SineWave indicator to "Ehlers Hilbert Transform SineWave (HT_SINE)".
- Changed the Phasor Analysis indicator to "Ehlers Hilbert Transform Phasor Components (HT_PHASOR)".
- Updated the SSF-Based Detrended Synthetic Price to "Ehlers SSF Detrended Synthetic Price (SSFDSP)".
- Renamed the Ultimate Channel to "Ehlers Ultimate Channel (UCHANNEL)".
- Added new indicators: Moving Average Variable Period (MAVP), Ehlers Predictive Moving Average (PMA), Ehlers Reverse EMA (REVERSEEMA), and Ehlers Trendflex Indicator (TRENDFLEX).
- Updated various SVG badges to reflect changes in classes, comments, source files, lines of code, methods, and public types.
This commit is contained in:
Miha Kralj
2026-02-18 19:08:15 -08:00
parent 24e86d762a
commit 3dd05f23e4
144 changed files with 3468 additions and 788 deletions
+10 -10
View File
@@ -8,34 +8,34 @@ Signal processing filters adapted for financial time series. These are not indic
| Indicator | Full Name | Description |
| :--- | :--- | :--- |
| [AGC](agc/Agc.md) | Automatic Gain Control | Ehlers. Amplitude normalization via exponential peak tracking. |
| [ALAGUERRE](alaguerre/ALaguerre.md) | Adaptive Laguerre Filter | Ehlers. Variable-alpha Laguerre from tracking-error normalization. |
| [AGC](agc/Agc.md) | Ehlers Automatic Gain Control | Ehlers. Amplitude normalization via exponential peak tracking. |
| [ALAGUERRE](alaguerre/ALaguerre.md) | Ehlers Adaptive Laguerre Filter | Ehlers. Variable-alpha Laguerre from tracking-error normalization. |
| [BAXTERKING](baxterking/BaxterKing.md) | Baxter-King Band-Pass Filter | Symmetric FIR band-pass. Ideal for business cycle extraction. |
| [CFITZ](cfitz/Cfitz.md) | Christiano-Fitzgerald Filter | Asymmetric full-sample band-pass. Optimal under random-walk assumption. |
| [EDCF](edcf/Edcf.md) | Ehlers Distance Coefficient Filter | Nonlinear FIR. Distance-weighted smoothing adapts to local structure. |
| [BESSEL](bessel/Bessel.md) | Bessel Filter | Maximally flat group delay. Best phase response. Minimal overshoot. |
| [BILATERAL](bilateral/Bilateral.md) | Bilateral Filter | Edge-preserving smoothing. Adapts to local gradients. |
| [BPF](bpf/Bpf.md) | BandPass Filter | 2nd-order IIR. Cascade of HP + LP. Extracts specific frequency band. |
| [BUTTER](butter/Butter.md) | Butterworth Filter | Maximally flat frequency response. Classic IIR filter. |
| [BUTTER](butter/Butter.md) | Ehlers Butterworth Filter | Maximally flat frequency response. Classic IIR filter. |
| [CHEBY1](cheby1/Cheby1.md) | Chebyshev Type I | Steeper roll-off with passband ripple. Sharper cutoff than Butterworth. |
| [CHEBY2](cheby2/Cheby2.md) | Chebyshev Type II | Equiripple stopband, monotonic passband. Better stopband rejection. |
| [ELLIPTIC](elliptic/Elliptic.md) | Elliptic Filter | Equiripple both bands. Sharpest transition for given order. |
| [GAUSS](gauss/Gauss.md) | Gaussian Filter | Bell-curve weighted smoothing. No overshoot. |
| [HANN](hann/Hann.md) | Hann Filter | Hann window smoothing. Good spectral leakage control. |
| [HP](hp/Hp.md) | Hodrick-Prescott | Causal trend/cycle decomposition. Regularization parameter λ controls smoothness. |
| [HPF](hpf/Hpf.md) | High Pass Filter | Attenuates below cutoff. Isolates fast components. |
| [HPF](hpf/Hpf.md) | Ehlers Highpass Filter | Attenuates below cutoff. Isolates fast components. |
| [KALMAN](kalman/Kalman.md) | Kalman Filter | Recursive state estimation. Optimal under Gaussian assumptions. |
| [LAGUERRE](laguerre/Laguerre.md) | Laguerre Filter | Ehlers. 4-element all-pass cascade. γ-controlled smoothing. |
| [LAGUERRE](laguerre/Laguerre.md) | Ehlers Laguerre Filter | Ehlers. 4-element all-pass cascade. γ-controlled smoothing. |
| [LMS](lms/Lms.md) | Least Mean Squares | Widrow-Hoff adaptive FIR. NLMS weight update. O(order) per bar. |
| [RLS](rls/Rls.md) | Recursive Least Squares | Inverse correlation matrix. Faster convergence than LMS. O(order²) per bar. |
| [LOESS](loess/Loess.md) | LOESS Smoothing | Local polynomial regression. Robust to outliers. |
| [NOTCH](notch/Notch.md) | Notch Filter | Band-stop. Removes specific frequency (e.g., 60 Hz noise). |
| [ONEEURO](oneeuro/OneEuro.md) | One Euro Filter | Speed-adaptive low-pass. Adaptive cutoff from signal derivative. |
| [ROOFING](roofing/Roofing.md) | Roofing Filter | Ehlers. HP + SS cascade. Bandpass for cycle extraction. |
| [ROOFING](roofing/Roofing.md) | Ehlers Roofing Filter | Ehlers. HP + SS cascade. Bandpass for cycle extraction. |
| [SGF](sgf/Sgf.md) | Savitzky-Golay | Polynomial smoothing. Preserves higher moments (derivatives). |
| [SPBF](spbf/Spbf.md) | Super Passband Filter | Ehlers. Wide-band bandpass via differenced EMAs with RMS envelope. |
| [SSF](ssf/Ssf.md) | Super Smoother | Ehlers. 2-pole Butterworth variant. Standard cycle pre-filter. |
| [USF](usf/Usf.md) | Ultra Smoother | Ehlers. 3-pole variant. More smoothing than SSF. |
| [VOSS](voss/Voss.md) | Voss Predictive Filter | Ehlers. BPF + negative group delay predictor. Anticipatory cycle extraction. |
| [SPBF](spbf/Spbf.md) | Ehlers Super Passband Filter | Ehlers. Wide-band bandpass via differenced EMAs with RMS envelope. |
| [SSF](ssf/Ssf.md) | Ehlers Super Smoother Filter | Ehlers. 2-pole Butterworth variant. Standard cycle pre-filter. |
| [USF](usf/Usf.md) | Ehlers Ultimate Smoother Filter | Ehlers. 3-pole variant. More smoothing than SSF. |
| [VOSS](voss/Voss.md) | Ehlers Voss Predictive Filter | Ehlers. BPF + negative group delay predictor. Anticipatory cycle extraction. |
| [WAVELET](wavelet/Wavelet.md) | Wavelet Denoising Filter | A trous Haar decomposition + MAD soft thresholding. Edge-preserving. |
| [WIENER](wiener/Wiener.md) | Wiener Filter | Optimal linear filter. Minimizes MSE given signal/noise spectra. |
+1 -1
View File
@@ -12,7 +12,7 @@ public class AgcIndicatorTests
Assert.Equal(0.991, indicator.Decay);
Assert.Equal(SourceType.Close, indicator.Source);
Assert.True(indicator.ShowColdValues);
Assert.Equal("AGC - Automatic Gain Control", indicator.Name);
Assert.Equal("AGC - Ehlers Automatic Gain Control", indicator.Name);
Assert.True(indicator.SeparateWindow);
Assert.True(indicator.OnBackGround);
}
+2 -2
View File
@@ -31,8 +31,8 @@ public sealed class AgcIndicator : Indicator, IWatchlistIndicator
{
OnBackGround = true;
SeparateWindow = true;
Name = "AGC - Automatic Gain Control";
Description = "Ehlers AGC: amplitude normalization via exponential peak tracking, applied after Roofing filter";
Name = "AGC - Ehlers Automatic Gain Control";
Description = "Ehlers Automatic Gain Control: amplitude normalization via exponential peak tracking, applied after Roofing filter";
_series = new LineSeries(name: $"AGC {Decay:F3}", color: Color.Blue, width: 2, style: LineStyle.Solid);
AddLineSeries(_series);
}
+1 -1
View File
@@ -1,4 +1,4 @@
# AGC: Automatic Gain Control
# AGC: Ehlers Automatic Gain Control
> "The purpose of the AGC is to normalize the amplitude of any indicator to unity." — John F. Ehlers, TASC January 2015
+1 -1
View File
@@ -2,7 +2,7 @@
// © mihakralj
//@version=6
// Indicator algorithm (C) 2015 John F. Ehlers
indicator("Automatic Gain Control (AGC)", "AGC", overlay=false)
indicator("Ehlers Automatic Gain Control (AGC)", "AGC", overlay=false)
//@function Ehlers Automatic Gain Control — amplitude normalization via exponential peak tracking
//@param source Series to normalize (must oscillate around zero — use a filter output, not raw price)
@@ -13,7 +13,7 @@ public class ALaguerreIndicatorTests
Assert.Equal(5, indicator.MedianLength);
Assert.Equal(SourceType.Close, indicator.Source);
Assert.True(indicator.ShowColdValues);
Assert.Equal("ALAGUERRE - Adaptive Laguerre Filter (Ehlers)", indicator.Name);
Assert.Equal("ALAGUERRE - Ehlers Adaptive Laguerre Filter", indicator.Name);
Assert.False(indicator.SeparateWindow);
Assert.True(indicator.OnBackGround);
}
+2 -2
View File
@@ -34,8 +34,8 @@ public class ALaguerreIndicator : Indicator, IWatchlistIndicator
OnBackGround = true;
SeparateWindow = false;
SourceName = Source.ToString();
Name = "ALAGUERRE - Adaptive Laguerre Filter (Ehlers)";
Description = "Adaptive variant of Laguerre Filter with variable alpha from tracking-error normalization and median smoothing";
Name = "ALAGUERRE - Ehlers Adaptive Laguerre Filter";
Description = "Ehlers Adaptive Laguerre Filter: variable alpha from tracking-error normalization and median smoothing";
Series = new LineSeries(name: $"ALaguerre {Length},{MedianLength}", color: IndicatorExtensions.Averages, width: 2, style: LineStyle.Solid);
AddLineSeries(Series);
}
+1 -1
View File
@@ -1,4 +1,4 @@
# ALAGUERRE: Adaptive Laguerre Filter
# ALAGUERRE: Ehlers Adaptive Laguerre Filter
> "The best filter is one that knows when to listen closely and when to smooth aggressively." -- John F. Ehlers (paraphrased)
+1 -1
View File
@@ -2,7 +2,7 @@
// © mihakralj
//@version=6
// Indicator algorithm (C) 2004 John F. Ehlers
indicator("Adaptive Laguerre Filter (ALAGUERRE)", "ALAGUERRE", overlay=true)
indicator("Ehlers Adaptive Laguerre Filter (ALAGUERRE)", "ALAGUERRE", overlay=true)
//@function Calculates Adaptive Laguerre Filter with variable alpha from tracking error
//@param source Series to calculate Adaptive Laguerre filter from
+1 -1
View File
@@ -12,7 +12,7 @@ public class ButterIndicatorTests
Assert.Equal(14, indicator.Period);
Assert.True(indicator.ShowColdValues);
Assert.Equal("BUTTER - Butterworth Filter", indicator.Name);
Assert.Equal("BUTTER - Ehlers Butterworth Filter", indicator.Name);
Assert.False(indicator.SeparateWindow);
Assert.Equal(SourceType.Close, indicator.Source);
}
+2 -2
View File
@@ -32,8 +32,8 @@ public class ButterIndicator : Indicator, IWatchlistIndicator
OnBackGround = true;
SeparateWindow = false;
SourceName = Source.ToString();
Name = "BUTTER - Butterworth Filter";
Description = "A 2nd-order low-pass filter with maximally flat frequency response in the passband.";
Name = "BUTTER - Ehlers Butterworth Filter";
Description = "Ehlers Butterworth Filter: 2nd-order low-pass filter with maximally flat frequency response in the passband.";
_series = new LineSeries(name: $"BUTTER {Period}", color: IndicatorExtensions.Averages, width: 2, style: LineStyle.Solid);
AddLineSeries(_series);
}
+1 -1
View File
@@ -1,4 +1,4 @@
# BUTTER: Butterworth Filter
# BUTTER: Ehlers Butterworth Filter
> "Maximally flat frequency response in the passband."
+1 -1
View File
@@ -1,7 +1,7 @@
// The MIT License (MIT)
// © mihakralj
//@version=6
indicator("Butterworth 2nd Order Filter (BUTTER)", "BUTTER", overlay=true)
indicator("Ehlers Butterworth Filter (BUTTER)", "BUTTER", overlay=true)
//@function Calculates 2nd Order Butterworth Lowpass Filter
//@param src Series to calculate Butterworth filter from
+1 -1
View File
@@ -1,4 +1,4 @@
# EDCF Ehlers Distance Coefficient Filter
# EDCF: Ehlers Distance Coefficient Filter
## Overview
+1 -1
View File
@@ -12,7 +12,7 @@ public class HpfIndicatorTests
Assert.Equal(40, indicator.Length);
Assert.Equal(SourceType.Close, indicator.Source);
Assert.True(indicator.ShowColdValues);
Assert.Equal("HPF - Highpass Filter (2-Pole)", indicator.Name);
Assert.Equal("HPF - Ehlers Highpass Filter", indicator.Name);
Assert.False(indicator.SeparateWindow);
Assert.True(indicator.OnBackGround);
}
+2 -2
View File
@@ -30,8 +30,8 @@ public class HpfIndicator : Indicator, IWatchlistIndicator
{
OnBackGround = true;
SeparateWindow = false;
Name = "HPF - Highpass Filter (2-Pole)";
Description = "2-Pole Infinite Impulse Response (IIR) highpass filter.";
Name = "HPF - Ehlers Highpass Filter";
Description = "Ehlers Highpass Filter: 2-pole IIR highpass filter for cycle isolation and detrending.";
_series = new LineSeries(name: $"HPF {Length}", color: IndicatorExtensions.Statistics, width: 2, style: LineStyle.Solid);
AddLineSeries(_series);
}
+1 -1
View File
@@ -1,4 +1,4 @@
# HPF - Highpass Filter (2-Pole)
# HPF: Ehlers Highpass Filter
> "Noise is just signal you haven't figured out how to filter yet. Or maybe, it's the only signal that matters."
+1 -1
View File
@@ -1,7 +1,7 @@
// The MIT License (MIT)
// © mihakralj
//@version=6
indicator("Highpass Filter (2-Pole) (HPF)", "HPF", overlay=true)
indicator("Ehlers Highpass Filter (HPF)", "HPF", overlay=true)
//@function Calculates 2-Pole Highpass Filter
//@param src Series to calculate HPF from
@@ -12,7 +12,7 @@ public class LaguerreIndicatorTests
Assert.Equal(0.8, indicator.Gamma);
Assert.Equal(SourceType.Close, indicator.Source);
Assert.True(indicator.ShowColdValues);
Assert.Equal("LAGUERRE - Laguerre Filter (Ehlers)", indicator.Name);
Assert.Equal("LAGUERRE - Ehlers Laguerre Filter", indicator.Name);
Assert.False(indicator.SeparateWindow);
Assert.True(indicator.OnBackGround);
}
+2 -2
View File
@@ -31,8 +31,8 @@ public class LaguerreIndicator : Indicator, IWatchlistIndicator
OnBackGround = true;
SeparateWindow = false;
SourceName = Source.ToString();
Name = "LAGUERRE - Laguerre Filter (Ehlers)";
Description = "Four-element IIR filter with cascaded all-pass sections and gamma damping factor";
Name = "LAGUERRE - Ehlers Laguerre Filter";
Description = "Ehlers Laguerre Filter: four-element IIR filter with cascaded all-pass sections and gamma damping factor";
Series = new LineSeries(name: $"Laguerre {Gamma:F2}", color: IndicatorExtensions.Averages, width: 2, style: LineStyle.Solid);
AddLineSeries(Series);
}
+1 -1
View File
@@ -1,4 +1,4 @@
# LAGUERRE: Laguerre Filter
# LAGUERRE: Ehlers Laguerre Filter
> "The problem with conventional filters is that they use unit delays. All-pass filters replace unit delays with frequency-dependent delays, and that changes everything." — John F. Ehlers
+1 -1
View File
@@ -2,7 +2,7 @@
// © mihakralj
//@version=6
// Indicator algorithm (C) 2004 John F. Ehlers
indicator("Laguerre Filter (LAGUERRE)", "LAGUERRE", overlay=true)
indicator("Ehlers Laguerre Filter (LAGUERRE)", "LAGUERRE", overlay=true)
//@function Calculates Laguerre Filter using 4 cascaded all-pass IIR elements
//@param source Series to calculate Laguerre filter from
+1 -1
View File
@@ -2,7 +2,7 @@
// © mihakralj
//@version=6
// Indicator algorithm (C) 2004-2024 John F. Ehlers
indicator("Roofing Filter (ROOFING)", "ROOFING", overlay=false)
indicator("Ehlers Roofing Filter (ROOFING)", "ROOFING", overlay=false)
//@function Calculates Ehlers Roofing Filter (2-pole HPF → Super Smoother composite)
//@param source Series to calculate Roofing Filter from
+1 -1
View File
@@ -2,7 +2,7 @@
// © mihakralj
//@version=6
// Indicator algorithm (C) 2016 John F. Ehlers
indicator("Super Passband Filter (SPBF)", "SPBF", overlay=false)
indicator("Ehlers Super Passband Filter (SPBF)", "SPBF", overlay=false)
//@function Ehlers Super Passband Filter — wide-band bandpass via differenced z-transformed EMAs
//@param source Series to filter
+1 -1
View File
@@ -12,7 +12,7 @@ public class SsfIndicatorTests
Assert.Equal(10, indicator.Period);
Assert.Equal(SourceType.Close, indicator.Source);
Assert.True(indicator.ShowColdValues);
Assert.Equal("SSF - Super Smooth Filter", indicator.Name);
Assert.Equal("SSF - Ehlers Super Smoother Filter", indicator.Name);
Assert.False(indicator.SeparateWindow);
Assert.True(indicator.OnBackGround);
}
+2 -2
View File
@@ -30,8 +30,8 @@ public sealed class SsfIndicator : Indicator, IWatchlistIndicator
{
OnBackGround = true;
SeparateWindow = false;
Name = "SSF - Super Smooth Filter";
Description = "Ehlers Super Smooth Filter";
Name = "SSF - Ehlers Super Smoother Filter";
Description = "Ehlers Super Smoother Filter: 2-pole Butterworth lowpass with maximally flat passband response";
_series = new LineSeries(name: $"SSF {Period}", color: IndicatorExtensions.Averages, width: 2, style: LineStyle.Solid);
AddLineSeries(_series);
}
+1 -1
View File
@@ -1,4 +1,4 @@
# SSF: Ehlers Super Smooth Filter
# SSF: Ehlers Super Smoother Filter
> "Noise is the enemy of the trend follower. The Super Smooth Filter is the silencer."
+1 -1
View File
@@ -2,7 +2,7 @@
// © mihakralj
//@version=6
// Indicator algorithm (C) 2004-2024 John F. Ehlers
indicator("Supersmooth Filter (SSF)", "SSF", overlay=true)
indicator("Ehlers Super Smoother Filter (SSF)", "SSF", overlay=true)
//@function Calculates Supersmooth Lowpass Filter
//@param source Series to calculate SSF from
+1 -1
View File
@@ -12,7 +12,7 @@ public class UsfIndicatorTests
Assert.Equal(20, indicator.Period);
Assert.Equal(SourceType.Close, indicator.Source);
Assert.True(indicator.ShowColdValues);
Assert.Equal("USF - Ultimate Smoother Filter", indicator.Name);
Assert.Equal("USF - Ehlers Ultimate Smoother Filter", indicator.Name);
Assert.False(indicator.SeparateWindow);
Assert.True(indicator.OnBackGround);
}
+2 -2
View File
@@ -30,8 +30,8 @@ public sealed class UsfIndicator : Indicator, IWatchlistIndicator
{
OnBackGround = true;
SeparateWindow = false;
Name = "USF - Ultimate Smoother Filter";
Description = "Ehlers Ultimate Smoother Filter";
Name = "USF - Ehlers Ultimate Smoother Filter";
Description = "Ehlers Ultimate Smoother Filter: zero-lag smoothing via high-pass subtraction from Super Smoother";
_series = new LineSeries(name: $"USF {Period}", color: IndicatorExtensions.Averages, width: 2, style: LineStyle.Solid);
AddLineSeries(_series);
}
+1 -1
View File
@@ -1,4 +1,4 @@
# Usf: Ehlers Ultimate Smoother Filter
# USF: Ehlers Ultimate Smoother Filter
> "The Ultimate Smoother achieves superior smoothing by subtracting high-frequency components using a high-pass filter, resulting in zero lag in the passband."
+1 -1
View File
@@ -1,7 +1,7 @@
// The MIT License (MIT)
// © mihakralj
//@version=6
indicator("Ultrasmooth Filter (USF)", "USF", overlay=true)
indicator("Ehlers Ultimate Smoother Filter (USF)", "USF", overlay=true)
//@function Calculates Ultrasmooth Filter
//@param src Series to calculate USF from
+1 -1
View File
@@ -1,7 +1,7 @@
// The MIT License (MIT)
// © mihakralj
//@version=6
indicator("Voss Predictive Filter (VOSS)", "VOSS", overlay=false)
indicator("Ehlers Voss Predictive Filter (VOSS)", "VOSS", overlay=false)
//@function Ehlers Voss Predictive Filter — negative group delay bandpass predictor
//@param source Series to filter