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
-77
View File
@@ -1,77 +0,0 @@
---
# Codacy Configuration File
# Documentation: https://docs.codacy.com/repositories-configure/codacy-configuration-file/
# Exclude patterns - files and directories to ignore
exclude_paths:
# All dot-directories (config, IDE, tools, rules)
- ".*/**"
# Root-level config files
- "*.md"
- "*.yml"
- "*.yaml"
# NDepend analysis output
- "ndepend/**"
# Build/IDE artifacts
- "bin/**"
- "obj/**"
- "BenchmarkDotNet.Artifacts/**"
- "ilspy/**"
# Performance benchmarks
- "perf/**"
# Test files
- "**/*.Tests.cs"
- "**/*Tests.cs"
- "**/*.Validation.Tests.cs"
- "**/Mocks/**"
# Quantower adapters
- "**/*.Quantower.Tests.cs"
- "**/*.Quantower.cs"
- "quantower/**"
# Documentation
- "docs/**"
- "**/*.md"
# Non-source files
- "**/*.dib"
- "**/*.csv"
- "**/*.xml"
- "**/*.json"
- "**/*.yml"
- "**/*.yaml"
- "**/*.sln"
- "**/*.csproj"
- "**/*.ndproj"
- "**/*.user"
- "**/*.suo"
- "**/*.cache"
- "**/*.lock"
- "**/*.props"
- "**/*.targets"
# Binaries
- "**/*.dll"
- "**/*.pdb"
- "**/*.nupkg"
- "**/*.snupkg"
- "**/*.so"
- "**/*.dylib"
- "**/*.exe"
# Data/media files
- "**/*.db"
- "**/*.sqlite"
- "**/*.log"
- "**/*.png"
- "**/*.jpg"
- "**/*.jpeg"
- "**/*.gif"
- "**/*.ico"
- "**/*.svg"
-149
View File
@@ -1,149 +0,0 @@
#!/usr/bin/env bash
set -e +o pipefail
# Set up paths first
bin_name="codacy-cli-v2"
# Determine OS-specific paths
os_name=$(uname)
arch=$(uname -m)
case "$arch" in
"x86_64")
arch="amd64"
;;
"x86")
arch="386"
;;
"aarch64"|"arm64")
arch="arm64"
;;
esac
if [ -z "$CODACY_CLI_V2_TMP_FOLDER" ]; then
if [ "$(uname)" = "Linux" ]; then
CODACY_CLI_V2_TMP_FOLDER="$HOME/.cache/codacy/codacy-cli-v2"
elif [ "$(uname)" = "Darwin" ]; then
CODACY_CLI_V2_TMP_FOLDER="$HOME/Library/Caches/Codacy/codacy-cli-v2"
else
CODACY_CLI_V2_TMP_FOLDER=".codacy-cli-v2"
fi
fi
version_file="$CODACY_CLI_V2_TMP_FOLDER/version.yaml"
get_version_from_yaml() {
if [ -f "$version_file" ]; then
local version=$(grep -o 'version: *"[^"]*"' "$version_file" | cut -d'"' -f2)
if [ -n "$version" ]; then
echo "$version"
return 0
fi
fi
return 1
}
get_latest_version() {
local response
if [ -n "$GH_TOKEN" ]; then
response=$(curl -Lq --header "Authorization: Bearer $GH_TOKEN" "https://api.github.com/repos/codacy/codacy-cli-v2/releases/latest" 2>/dev/null)
else
response=$(curl -Lq "https://api.github.com/repos/codacy/codacy-cli-v2/releases/latest" 2>/dev/null)
fi
handle_rate_limit "$response"
local version=$(echo "$response" | grep -m 1 tag_name | cut -d'"' -f4)
echo "$version"
}
handle_rate_limit() {
local response="$1"
if echo "$response" | grep -q "API rate limit exceeded"; then
fatal "Error: GitHub API rate limit exceeded. Please try again later"
fi
}
download_file() {
local url="$1"
echo "Downloading from URL: ${url}"
if command -v curl > /dev/null 2>&1; then
curl -# -LS "$url" -O
elif command -v wget > /dev/null 2>&1; then
wget "$url"
else
fatal "Error: Could not find curl or wget, please install one."
fi
}
download() {
local url="$1"
local output_folder="$2"
( cd "$output_folder" && download_file "$url" )
}
download_cli() {
# OS name lower case
suffix=$(echo "$os_name" | tr '[:upper:]' '[:lower:]')
local bin_folder="$1"
local bin_path="$2"
local version="$3"
if [ ! -f "$bin_path" ]; then
echo "📥 Downloading CLI version $version..."
remote_file="codacy-cli-v2_${version}_${suffix}_${arch}.tar.gz"
url="https://github.com/codacy/codacy-cli-v2/releases/download/${version}/${remote_file}"
download "$url" "$bin_folder"
tar xzfv "${bin_folder}/${remote_file}" -C "${bin_folder}"
fi
}
# Warn if CODACY_CLI_V2_VERSION is set and update is requested
if [ -n "$CODACY_CLI_V2_VERSION" ] && [ "$1" = "update" ]; then
echo "⚠️ Warning: Performing update with forced version $CODACY_CLI_V2_VERSION"
echo " Unset CODACY_CLI_V2_VERSION to use the latest version"
fi
# Ensure version.yaml exists and is up to date
if [ ! -f "$version_file" ] || [ "$1" = "update" ]; then
echo "️ Fetching latest version..."
version=$(get_latest_version)
mkdir -p "$CODACY_CLI_V2_TMP_FOLDER"
echo "version: \"$version\"" > "$version_file"
fi
# Set the version to use
if [ -n "$CODACY_CLI_V2_VERSION" ]; then
version="$CODACY_CLI_V2_VERSION"
else
version=$(get_version_from_yaml)
fi
# Set up version-specific paths
bin_folder="${CODACY_CLI_V2_TMP_FOLDER}/${version}"
mkdir -p "$bin_folder"
bin_path="$bin_folder"/"$bin_name"
# Download the tool if not already installed
download_cli "$bin_folder" "$bin_path" "$version"
chmod +x "$bin_path"
run_command="$bin_path"
if [ -z "$run_command" ]; then
fatal "Codacy cli v2 binary could not be found."
fi
if [ "$#" -eq 1 ] && [ "$1" = "download" ]; then
echo "Codacy cli v2 download succeeded"
else
eval "$run_command $*"
fi
Binary file not shown.
-66
View File
@@ -1,66 +0,0 @@
# yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json
# CodeRabbit Configuration - Batch 2: Test files only
# To use: rename to .coderabbit.yaml (backup current config first)
#
# Test files breakdown (actual counts):
# - Unit tests (*.Tests.cs excluding Validation): 296 files
# - Validation tests (*.Validation.Tests.cs): 130 files
#
# Both batches fit under 300 limit:
# - Batch 2a: Unit tests only (296 files) - THIS CONFIG
# - Batch 2b: Validation tests (130 files) - see .coderabbit.batch2b-validation.yaml
language: en-US
reviews:
request_changes_workflow: false
high_level_summary: true
high_level_summary_placeholder: "@coderabbitai summary"
auto_title_placeholder: "@coderabbitai"
review_status: true
collapse_walkthrough: false
path_instructions: []
tools:
ast-grep:
essential_rules: true
rule_dirs:
- .coderabbit/ast-grep-rules
path_filters:
# ============================================
# BATCH 2: Test files only (426 total)
# Split into 2a (unit) and 2b (validation) if needed
# ============================================
# INCLUDE: Unit test files only (Batch 2a - 296 files)
- "lib/**/*.Tests.cs"
- "quantower/**/*.Tests.cs"
# EXCLUDE: Validation tests (Batch 2b)
- "!**/*.Validation.Tests.cs"
# EXCLUDE: Build artifacts
- "!**/obj/**"
- "!**/bin/**"
- "!**/Debug/**"
- "!**/Release/**"
# EXCLUDE: Non-code files
- "!**/*.md"
- "!**/*.pine"
- "!**/*.json"
- "!**/*.yaml"
- "!**/*.yml"
chat:
auto_reply: true
# ==============================================
# BATCH 2b: Validation tests
# ==============================================
# If you need to review validation tests separately:
# path_filters:
# - "lib/**/*.Validation.Tests.cs"
# - "!**/obj/**"
# - "!**/bin/**"
# ==============================================
-45
View File
@@ -1,45 +0,0 @@
# yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json
# CodeRabbit Configuration - Batch 2b: Validation test files only
# To use: rename to .coderabbit.yaml (backup current config first)
#
# Validation tests: 130 files (well under 300 limit)
language: en-US
reviews:
request_changes_workflow: false
high_level_summary: true
high_level_summary_placeholder: "@coderabbitai summary"
auto_title_placeholder: "@coderabbitai"
review_status: true
collapse_walkthrough: false
path_instructions: []
tools:
ast-grep:
essential_rules: true
rule_dirs:
- .coderabbit/ast-grep-rules
path_filters:
# ============================================
# BATCH 2b: Validation test files only (130 files)
# ============================================
# INCLUDE: Validation test files
- "lib/**/*.Validation.Tests.cs"
# EXCLUDE: Build artifacts
- "!**/obj/**"
- "!**/bin/**"
- "!**/Debug/**"
- "!**/Release/**"
# EXCLUDE: Non-code files
- "!**/*.md"
- "!**/*.pine"
- "!**/*.json"
- "!**/*.yaml"
- "!**/*.yml"
chat:
auto_reply: true
-33
View File
@@ -1,33 +0,0 @@
# yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json
# CodeRabbit Configuration - QuanTAlib
#
# Reviews ONLY implementation .cs files (~196 files)
# Auto-detects new indicators
language: en-US
reviews:
request_changes_workflow: false
high_level_summary: true
high_level_summary_placeholder: "@coderabbitai summary"
auto_title_placeholder: "@coderabbitai"
review_status: true
collapse_walkthrough: false
path_filters:
# INCLUDE: Only .cs files in lib/
- "lib/**/*.cs"
# EXCLUDE: Test files
- "!**/*.Tests.cs"
- "!**/*.Validation.Tests.cs"
# EXCLUDE: Quantower adapters
- "!**/*.Quantower.cs"
# EXCLUDE: Build artifacts
- "!**/obj/**"
- "!**/bin/**"
chat:
auto_reply: true
@@ -1,11 +0,0 @@
# QuanTAlib: Enforce DateTime.UtcNow over DateTime.Now
# DCT rule: always use DateTime.UtcNow (never DateTime.Now)
id: no-datetime-now
language: csharp
severity: error
message: "Use DateTime.UtcNow instead of DateTime.Now - QuanTAlib requires UTC timestamps for consistency"
note: "DateTime.Now includes local timezone which causes issues in distributed trading systems"
rule:
pattern: DateTime.Now
fix: DateTime.UtcNow
@@ -1,10 +0,0 @@
# QuanTAlib: Forbid System.Random in tests - use GBM helper instead
# DCT rule: Tests MUST use GBM helper, never System.Random
id: no-random-in-tests
language: csharp
severity: error
message: "Use GBM helper instead of System.Random in tests - ensures reproducible test data"
note: "GBM (Geometric Brownian Motion) provides consistent, realistic price data for indicator testing"
rule:
pattern: new Random($$$)
@@ -1,13 +0,0 @@
# QuanTAlib: Require nameof() in ArgumentException
# DCT rule: ArgumentException + nameof(param) for proper analyzer support
id: require-nameof-in-exceptions
language: csharp
severity: warning
message: "Use nameof(parameter) instead of string literal in ArgumentException for refactoring safety"
note: "MA0015-friendly: nameof() ensures parameter name stays in sync during refactoring"
rule:
any:
- pattern: throw new ArgumentException($MSG, "$PARAM")
- pattern: throw new ArgumentNullException("$PARAM")
- pattern: throw new ArgumentOutOfRangeException("$PARAM")
@@ -1,12 +0,0 @@
# QuanTAlib: Suggest FMA for multiply-add patterns
# DCT rule: Math.FusedMultiplyAdd(a, b, c) for a*b+c patterns in hot paths
id: suggest-fma-multiply-add
language: csharp
severity: hint
message: "Consider Math.FusedMultiplyAdd(a, b, c) for better precision and performance in hot paths"
note: "FMA provides single-rounding semantics and can be faster on modern CPUs. Use for EMA smoothing, IIR filters, weighted sums."
rule:
any:
- pattern: $A * $B + $C
- pattern: $A + $B * $C
@@ -1,37 +0,0 @@
# QuanTAlib: Warn about LINQ in potential hot paths
# DCT rule 1: Hot paths allocation-free (no heap alloc); GC pressure enemy
id: warn-linq-methods
language: csharp
severity: warning
message: "LINQ method detected - verify this is not in a hot path (Update/Calculate). LINQ allocates and causes GC pressure."
note: "DCT rule 1: Hot paths must be allocation-free. Replace LINQ with for loops or Span operations in performance-critical code."
rule:
any:
- pattern: $EXPR.Where($$$)
- pattern: $EXPR.Select($$$)
- pattern: $EXPR.OrderBy($$$)
- pattern: $EXPR.OrderByDescending($$$)
- pattern: $EXPR.GroupBy($$$)
- pattern: $EXPR.ToList()
- pattern: $EXPR.ToArray()
- pattern: $EXPR.ToDictionary($$$)
- pattern: $EXPR.First($$$)
- pattern: $EXPR.FirstOrDefault($$$)
- pattern: $EXPR.Last($$$)
- pattern: $EXPR.LastOrDefault($$$)
- pattern: $EXPR.Single($$$)
- pattern: $EXPR.SingleOrDefault($$$)
- pattern: $EXPR.Any($$$)
- pattern: $EXPR.All($$$)
- pattern: $EXPR.Count($$$)
- pattern: $EXPR.Sum($$$)
- pattern: $EXPR.Average($$$)
- pattern: $EXPR.Min($$$)
- pattern: $EXPR.Max($$$)
- pattern: $EXPR.Aggregate($$$)
- pattern: $EXPR.Distinct($$$)
- pattern: $EXPR.Skip($$$)
- pattern: $EXPR.Take($$$)
- pattern: $EXPR.Zip($$$)
- pattern: $EXPR.Concat($$$)
-18
View File
@@ -1,18 +0,0 @@
version = 1
[[analyzers]]
name = "csharp"
enabled = true
exclude = ["CS-R1131", "CS-R1140"]
[[analyzers]]
name = "test-coverage"
enabled = true
[[analyzers]]
name = "secrets"
enabled = true
[[transformers]]
name = "dotnet-format"
enabled = true
+15 -1
View File
@@ -63,4 +63,18 @@ docfx/
.roo/ .roo/
# Internal planning docs (not shipped) # Internal planning docs (not shipped)
plans/ plans/
# Codacy
.codacy/
.codacy.yml
# CodeRabbit AI reviewer
.coderabbit/
.coderabbit*.yaml
# DeepSource AI analysis
.deepsource.toml
# SonarLint IDE plugin
.sonarlint/
-30
View File
@@ -1,30 +0,0 @@
{
"mcpServers": {
"dotnet-semantic-mcp": {
"command": "dotnet-semantic-mcp",
"args": [],
"cwd": "${workspaceFolder}",
"alwaysAllow": [
"map",
"scan_list",
"symbol",
"metrics",
"hierarchy",
"deps",
"attrs",
"diff",
"prepare_change",
"code_security",
"nuget_vulnerabilities",
"refs",
"search",
"explore",
"__unlock_csharp_analysis__",
"diag",
"source",
"understand"
],
"disabled": false
}
}
}
-13
View File
@@ -1,13 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<AnalysisInput>
<Settings>
</Settings>
<Rules>
<!-- Cognitive Complexity: disabled for indicator state machines with necessary branching -->
<Rule>
<Key>csharpsquid:S3776</Key>
<Parameters>
</Parameters>
</Rule>
</Rules>
</AnalysisInput>
-5
View File
@@ -1,5 +0,0 @@
{
"sonarCloudOrganization": "mihakralj-quantalib",
"projectKey": "mihakralj_QuanTAlib",
"region": "EU"
}
-17
View File
@@ -1,17 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<RuleSet Name="QuanTAlib SonarLint Rules" Description="Custom rule suppressions for QuanTAlib high-performance indicators" ToolsVersion="17.0">
<Rules AnalyzerId="SonarAnalyzer.CSharp" RuleNamespace="SonarAnalyzer.CSharp">
<!-- S3776: Cognitive Complexity - disabled for state machine patterns in indicators -->
<Rule Id="S3776" Action="None" />
<!-- S107: Methods should not have too many parameters - SIMD methods require multiple params -->
<Rule Id="S107" Action="None" />
<!-- S1144: Unused private types or members should be removed -->
<Rule Id="S1144" Action="None" />
<!-- S2245: Random should not be used for security purposes -->
<Rule Id="S2245" Action="None" />
<!-- S3604: Remove member initializer - null! is intentional -->
<Rule Id="S3604" Action="None" />
<!-- S1244: Floating point equality - exact-zero div guards and tie detection are intentional in quantitative indicators -->
<Rule Id="S1244" Action="None" />
</Rules>
</RuleSet>
+4 -4
View File
@@ -7,7 +7,7 @@
[![Nuget](https://img.shields.io/nuget/dt/QuanTAlib?style=flat-square)](https://www.nuget.org/packages/QuanTAlib/) [![Nuget](https://img.shields.io/nuget/dt/QuanTAlib?style=flat-square)](https://www.nuget.org/packages/QuanTAlib/)
[![.NET](https://img.shields.io/badge/.NET-8.0%20|%2010.0-blue?style=flat-square)](https://dotnet.microsoft.com/en-us/download/dotnet) [![.NET](https://img.shields.io/badge/.NET-8.0%20|%2010.0-blue?style=flat-square)](https://dotnet.microsoft.com/en-us/download/dotnet)
[![Indicators](https://img.shields.io/badge/%23%20Indicators-284-blue?style=flat-square)](lib/_index.md) [![Indicators](https://img.shields.io/badge/%23%20Indicators-298-blue?style=flat-square)](lib/_index.md)
[![Classes](ndepend/badges/classes.svg)](ndepend/ndependout/ndependreport.html) [![Classes](ndepend/badges/classes.svg)](ndepend/ndependout/ndependreport.html)
[![Files](ndepend/badges/files.svg)](ndepend/ndependout/ndependreport.html) [![Files](ndepend/badges/files.svg)](ndepend/ndependout/ndependreport.html)
[![Methods](ndepend/badges/methods.svg)](ndepend/ndependout/ndependreport.html) [![Methods](ndepend/badges/methods.svg)](ndepend/ndependout/ndependreport.html)
@@ -37,8 +37,8 @@ TA libraries face a fundamental choice: accept approximations for simplicity OR
| -------- | :---: | ---------------- | ------------------------- | | -------- | :---: | ---------------- | ------------------------- |
| [**Trends (FIR)**](lib/trends_FIR/_index.md) | 17 | Finite Impulse Response moving averages | SMA, WMA, HMA, ALMA, TRIMA, LSMA, EPMA | | [**Trends (FIR)**](lib/trends_FIR/_index.md) | 17 | Finite Impulse Response moving averages | SMA, WMA, HMA, ALMA, TRIMA, LSMA, EPMA |
| [**Trends (IIR)**](lib/trends_IIR/_index.md) | 23 | Infinite Impulse Response moving averages | EMA, DEMA, TEMA, T3, JMA, KAMA, VIDYA | | [**Trends (IIR)**](lib/trends_IIR/_index.md) | 23 | Infinite Impulse Response moving averages | EMA, DEMA, TEMA, T3, JMA, KAMA, VIDYA |
| [**Filters**](lib/filters/_index.md) | 18 | Signal processing and noise reduction filters | Bessel, Butterworth, Gaussian, Savitzky-Golay, Ehlers Super Smoother | | [**Filters**](lib/filters/_index.md) | 31 | Signal processing and noise reduction filters | Bessel, Butterworth, Gaussian, Savitzky-Golay, Ehlers Super Smoother |
| [**Oscillators**](lib/oscillators/_index.md) | 19 | Indicators that fluctuate around a center line | RSI, MACD, Stochastic, AO, APO, CCI, Ultimate Oscillator | | [**Oscillators**](lib/oscillators/_index.md) | 20 | Indicators that fluctuate around a center line | RSI, MACD, Stochastic, AO, APO, CCI, Ultimate Oscillator |
| [**Dynamics**](lib/dynamics/_index.md) | 18 | Trend strength and direction indicators | ADX, Aroon, SuperTrend, Vortex, Chop, Ichimoku | | [**Dynamics**](lib/dynamics/_index.md) | 18 | Trend strength and direction indicators | ADX, Aroon, SuperTrend, Vortex, Chop, Ichimoku |
| [**Momentum**](lib/momentum/_index.md) | 16 | Speed and magnitude of price changes | Momentum, ROC, Velocity, RSX, Qstick, KDJ | | [**Momentum**](lib/momentum/_index.md) | 16 | Speed and magnitude of price changes | Momentum, ROC, Velocity, RSX, Qstick, KDJ |
| [**Volatility**](lib/volatility/_index.md) | 26 | Size and variability of price movements | ATR, Bollinger Band Width, Historical Volatility, True Range | | [**Volatility**](lib/volatility/_index.md) | 26 | Size and variability of price movements | ATR, Bollinger Band Width, Historical Volatility, True Range |
@@ -51,7 +51,7 @@ TA libraries face a fundamental choice: accept approximations for simplicity OR
| [**Errors**](lib/errors/_index.md) | 26 | Error metrics and loss functions | RMSE, MAE, MAPE, SMAPE, MASE, R-Squared | | [**Errors**](lib/errors/_index.md) | 26 | Error metrics and loss functions | RMSE, MAE, MAPE, SMAPE, MASE, R-Squared |
| [**Numerics**](lib/numerics/_index.md) | 15 | Mathematical transformations | Log, Exp, Sqrt, Tanh, ReLU, Sigmoid | | [**Numerics**](lib/numerics/_index.md) | 15 | Mathematical transformations | Log, Exp, Sqrt, Tanh, ReLU, Sigmoid |
**[Browse all 284 indicators →](lib/_index.md)** **[Browse all 298 indicators →](lib/_index.md)**
## Quick Start ## Quick Start
+25 -23
View File
@@ -31,15 +31,16 @@
* **Trends (IIR)** * **Trends (IIR)**
* [Overview](/lib/trends_IIR/_index.md) * [Overview](/lib/trends_IIR/_index.md)
* [DECYCLER - Ehlers Decycler](/lib/trends_IIR/decycler/Decycler.md)
* [DEMA - Double Exponential MA](/lib/trends_IIR/dema/Dema.md) * [DEMA - Double Exponential MA](/lib/trends_IIR/dema/Dema.md)
* [DSMA - Deviation-Scaled MA](/lib/trends_IIR/dsma/Dsma.md) * [DSMA - Deviation-Scaled MA](/lib/trends_IIR/dsma/Dsma.md)
* [EMA - Exponential MA](/lib/trends_IIR/ema/Ema.md) * [EMA - Exponential MA](/lib/trends_IIR/ema/Ema.md)
* [FRAMA - Fractal Adaptive MA](/lib/trends_IIR/frama/Frama.md) * [FRAMA - Ehlers Fractal Adaptive MA](/lib/trends_IIR/frama/Frama.md)
* [HEMA - Hull Exponential MA](/lib/trends_IIR/hema/Hema.md) * [HEMA - Hull Exponential MA](/lib/trends_IIR/hema/Hema.md)
* [HTIT - Hilbert Transform Instant Trendline](/lib/trends_IIR/htit/Htit.md) * [HTIT - Ehlers Hilbert Transform Instant Trendline](/lib/trends_IIR/htit/Htit.md)
* [JMA - Jurik MA](/lib/trends_IIR/jma/Jma.md) * [JMA - Jurik MA](/lib/trends_IIR/jma/Jma.md)
* [KAMA - Kaufman Adaptive MA](/lib/trends_IIR/kama/Kama.md) * [KAMA - Kaufman Adaptive MA](/lib/trends_IIR/kama/Kama.md)
* [MAMA - MESA Adaptive MA](/lib/trends_IIR/mama/Mama.md) * [MAMA - Ehlers MESA Adaptive MA](/lib/trends_IIR/mama/Mama.md)
* [MGDI - McGinley Dynamic](/lib/trends_IIR/mgdi/Mgdi.md) * [MGDI - McGinley Dynamic](/lib/trends_IIR/mgdi/Mgdi.md)
* [MMA - Modified MA](/lib/trends_IIR/mma/Mma.md) * [MMA - Modified MA](/lib/trends_IIR/mma/Mma.md)
* [QEMA - Quadruple Exponential MA](/lib/trends_IIR/qema/Qema.md) * [QEMA - Quadruple Exponential MA](/lib/trends_IIR/qema/Qema.md)
@@ -57,33 +58,33 @@
* **Filters** * **Filters**
* [Overview](/lib/filters/_index.md) * [Overview](/lib/filters/_index.md)
* [AGC - Automatic Gain Control](/lib/filters/agc/Agc.md) * [AGC - Ehlers Automatic Gain Control](/lib/filters/agc/Agc.md)
* [ALAGUERRE - Adaptive Laguerre Filter](/lib/filters/alaguerre/ALaguerre.md) * [ALAGUERRE - Ehlers Adaptive Laguerre Filter](/lib/filters/alaguerre/ALaguerre.md)
* [BAXTERKING - Baxter-King Band-Pass Filter](/lib/filters/baxterking/BaxterKing.md) * [BAXTERKING - Baxter-King Band-Pass Filter](/lib/filters/baxterking/BaxterKing.md)
* [CFITZ - Christiano-Fitzgerald Filter](/lib/filters/cfitz/Cfitz.md) * [CFITZ - Christiano-Fitzgerald Filter](/lib/filters/cfitz/Cfitz.md)
* [EDCF - Ehlers Distance Coefficient Filter](/lib/filters/edcf/Edcf.md) * [EDCF - Ehlers Distance Coefficient Filter](/lib/filters/edcf/Edcf.md)
* [BESSEL - Bessel Filter](/lib/filters/bessel/Bessel.md) * [BESSEL - Bessel Filter](/lib/filters/bessel/Bessel.md)
* [BILATERAL - Bilateral Filter](/lib/filters/bilateral/Bilateral.md) * [BILATERAL - Bilateral Filter](/lib/filters/bilateral/Bilateral.md)
* [BPF - Bandpass Filter](/lib/filters/bpf/Bpf.md) * [BPF - Bandpass Filter](/lib/filters/bpf/Bpf.md)
* [BUTTER - Butterworth Filter](/lib/filters/butter/Butter.md) * [BUTTER - Ehlers Butterworth Filter](/lib/filters/butter/Butter.md)
* [CHEBY1 - Chebyshev Type I](/lib/filters/cheby1/Cheby1.md) * [CHEBY1 - Chebyshev Type I](/lib/filters/cheby1/Cheby1.md)
* [CHEBY2 - Chebyshev Type II](/lib/filters/cheby2/Cheby2.md) * [CHEBY2 - Chebyshev Type II](/lib/filters/cheby2/Cheby2.md)
* [ELLIPTIC - Elliptic Filter](/lib/filters/elliptic/Elliptic.md) * [ELLIPTIC - Elliptic Filter](/lib/filters/elliptic/Elliptic.md)
* [GAUSS - Gaussian Filter](/lib/filters/gauss/Gauss.md) * [GAUSS - Gaussian Filter](/lib/filters/gauss/Gauss.md)
* [HANN - Hann Filter](/lib/filters/hann/Hann.md) * [HANN - Hann Filter](/lib/filters/hann/Hann.md)
* [HP - Hodrick-Prescott Filter](/lib/filters/hp/Hp.md) * [HP - Hodrick-Prescott Filter](/lib/filters/hp/Hp.md)
* [HPF - High Pass Filter](/lib/filters/hpf/Hpf.md) * [HPF - Ehlers Highpass Filter](/lib/filters/hpf/Hpf.md)
* [KALMAN - Kalman Filter](/lib/filters/kalman/Kalman.md) * [KALMAN - Kalman Filter](/lib/filters/kalman/Kalman.md)
* [LAGUERRE - Laguerre Filter](/lib/filters/laguerre/Laguerre.md) * [LAGUERRE - Ehlers Laguerre Filter](/lib/filters/laguerre/Laguerre.md)
* [LMS - Least Mean Squares](/lib/filters/lms/Lms.md) * [LMS - Least Mean Squares](/lib/filters/lms/Lms.md)
* [RLS - Recursive Least Squares](/lib/filters/rls/Rls.md) * [RLS - Recursive Least Squares](/lib/filters/rls/Rls.md)
* [LOESS - LOESS Smoothing](/lib/filters/loess/Loess.md) * [LOESS - LOESS Smoothing](/lib/filters/loess/Loess.md)
* [NOTCH - Notch Filter](/lib/filters/notch/Notch.md) * [NOTCH - Notch Filter](/lib/filters/notch/Notch.md)
* [ONEEURO - One Euro Filter](/lib/filters/oneeuro/OneEuro.md) * [ONEEURO - One Euro Filter](/lib/filters/oneeuro/OneEuro.md)
* [ROOFING - Roofing Filter](/lib/filters/roofing/Roofing.md) * [ROOFING - Ehlers Roofing Filter](/lib/filters/roofing/Roofing.md)
* [SGF - Savitzky-Golay Filter](/lib/filters/sgf/Sgf.md) * [SGF - Savitzky-Golay Filter](/lib/filters/sgf/Sgf.md)
* [SPBF - Ehlers Super Passband Filter](/lib/filters/spbf/Spbf.md) * [SPBF - Ehlers Super Passband Filter](/lib/filters/spbf/Spbf.md)
* [SSF - Ehlers Super Smooth Filter](/lib/filters/ssf/Ssf.md) * [SSF - Ehlers Super Smoother Filter](/lib/filters/ssf/Ssf.md)
* [USF - Ehlers Ultimate Smoother Filter](/lib/filters/usf/Usf.md) * [USF - Ehlers Ultimate Smoother Filter](/lib/filters/usf/Usf.md)
* [VOSS - Ehlers Voss Predictive Filter](/lib/filters/voss/Voss.md) * [VOSS - Ehlers Voss Predictive Filter](/lib/filters/voss/Voss.md)
* [WAVELET - Wavelet Denoising Filter](/lib/filters/wavelet/Wavelet.md) * [WAVELET - Wavelet Denoising Filter](/lib/filters/wavelet/Wavelet.md)
@@ -100,7 +101,7 @@
* [CHOP - Choppiness Index](/lib/dynamics/chop/Chop.md) * [CHOP - Choppiness Index](/lib/dynamics/chop/Chop.md)
* [DMX - Jurik Directional Movement Index](/lib/dynamics/dmx/Dmx.md) * [DMX - Jurik Directional Movement Index](/lib/dynamics/dmx/Dmx.md)
* [DX - Directional Movement Index](/lib/dynamics/dx/Dx.md) * [DX - Directional Movement Index](/lib/dynamics/dx/Dx.md)
* [HT_TRENDMODE - Hilbert Transform Trend Mode](/lib/dynamics/ht_trendmode/HtTrendmode.md) * [HT_TRENDMODE - Ehlers Hilbert Transform Trend vs Cycle Mode](/lib/dynamics/ht_trendmode/HtTrendmode.md)
* [ICHIMOKU - Ichimoku Cloud](/lib/dynamics/ichimoku/Ichimoku.md) * [ICHIMOKU - Ichimoku Cloud](/lib/dynamics/ichimoku/Ichimoku.md)
* [IMI - Intraday Momentum Index](/lib/dynamics/imi/Imi.md) * [IMI - Intraday Momentum Index](/lib/dynamics/imi/Imi.md)
* [IMPULSE - Elder Impulse System](/lib/dynamics/impulse/Impulse.md) * [IMPULSE - Elder Impulse System](/lib/dynamics/impulse/Impulse.md)
@@ -118,8 +119,9 @@
* [BBB - Bollinger %B](/lib/oscillators/bbb/Bbb.md) * [BBB - Bollinger %B](/lib/oscillators/bbb/Bbb.md)
* [BBS - Bollinger Band Squeeze](/lib/oscillators/bbs/Bbs.md) * [BBS - Bollinger Band Squeeze](/lib/oscillators/bbs/Bbs.md)
* [CFO - Chande Forecast Oscillator](/lib/oscillators/cfo/Cfo.md) * [CFO - Chande Forecast Oscillator](/lib/oscillators/cfo/Cfo.md)
* [DECO - Ehlers Decycler Oscillator](/lib/oscillators/deco/Deco.md)
* [DPO - Detrended Price Oscillator](/lib/oscillators/dpo/Dpo.md) * [DPO - Detrended Price Oscillator](/lib/oscillators/dpo/Dpo.md)
* [FISHER - Fisher Transform](/lib/oscillators/fisher/Fisher.md) * [FISHER - Ehlers Fisher Transform](/lib/oscillators/fisher/Fisher.md)
* [INERTIA - Inertia](/lib/oscillators/inertia/Inertia.md) * [INERTIA - Inertia](/lib/oscillators/inertia/Inertia.md)
* [KDJ - KDJ Indicator](/lib/oscillators/kdj/Kdj.md) * [KDJ - KDJ Indicator](/lib/oscillators/kdj/Kdj.md)
* [PGO - Pretty Good Oscillator](/lib/oscillators/pgo/Pgo.md) * [PGO - Pretty Good Oscillator](/lib/oscillators/pgo/Pgo.md)
@@ -231,8 +233,8 @@
* [STARCHANNEL - Stoller Average Range Channel](/lib/channels/starchannel/Starchannel.md) * [STARCHANNEL - Stoller Average Range Channel](/lib/channels/starchannel/Starchannel.md)
* [STBANDS - Super Trend Bands](/lib/channels/stbands/Stbands.md) * [STBANDS - Super Trend Bands](/lib/channels/stbands/Stbands.md)
* [TTM_LRC - TTM Linear Regression Channel](/lib/channels/ttm_lrc/TtmLrc.md) * [TTM_LRC - TTM Linear Regression Channel](/lib/channels/ttm_lrc/TtmLrc.md)
* [UBANDS - Ultimate Bands](/lib/channels/ubands/Ubands.md) * [UBANDS - Ehlers Ultimate Bands](/lib/channels/ubands/Ubands.md)
* [UCHANNEL - Ultimate Channel](/lib/channels/uchannel/Uchannel.md) * [UCHANNEL - Ehlers Ultimate Channel](/lib/channels/uchannel/Uchannel.md)
* [VWAPBANDS - VWAP Bands](/lib/channels/vwapbands/Vwapbands.md) * [VWAPBANDS - VWAP Bands](/lib/channels/vwapbands/Vwapbands.md)
* [VWAPSD - VWAP with Standard Deviation Bands](/lib/channels/vwapsd/Vwapsd.md) * [VWAPSD - VWAP with Standard Deviation Bands](/lib/channels/vwapsd/Vwapsd.md)
@@ -322,19 +324,19 @@
* **Cycles** * **Cycles**
* [Overview](/lib/cycles/_index.md) * [Overview](/lib/cycles/_index.md)
* [CG - Center of Gravity](/lib/cycles/cg/Cg.md) * [CG - Ehlers Center of Gravity](/lib/cycles/cg/Cg.md)
* [DSP - Detrended Synthetic Price](/lib/cycles/dsp/Dsp.md) * [DSP - Ehlers Detrended Synthetic Price](/lib/cycles/dsp/Dsp.md)
* [EACP - Ehlers Autocorrelation Periodogram](/lib/cycles/eacp/Eacp.md) * [EACP - Ehlers Autocorrelation Periodogram](/lib/cycles/eacp/Eacp.md)
* [EBSW - Ehlers Even Better Sinewave](/lib/cycles/ebsw/Ebsw.md) * [EBSW - Ehlers Even Better Sinewave](/lib/cycles/ebsw/Ebsw.md)
* [HOMOD - Homodyne Discriminator](/lib/cycles/homod/Homod.md) * [HOMOD - Ehlers Homodyne Discriminator](/lib/cycles/homod/Homod.md)
* [HT_DCPERIOD - Hilbert Transform Dominant Cycle Period](/lib/cycles/ht_dcperiod/HtDcperiod.md) * [HT_DCPERIOD - Ehlers Hilbert Transform Dominant Cycle Period](/lib/cycles/ht_dcperiod/HtDcperiod.md)
* [HT_DCPHASE - Hilbert Transform Dominant Cycle Phase](/lib/cycles/ht_dcphase/HtDcphase.md) * [HT_DCPHASE - Ehlers Hilbert Transform Dominant Cycle Phase](/lib/cycles/ht_dcphase/HtDcphase.md)
* [HT_PHASOR - Hilbert Transform Phasor](/lib/cycles/ht_phasor/HtPhasor.md) * [HT_PHASOR - Ehlers Hilbert Transform Phasor Components](/lib/cycles/ht_phasor/HtPhasor.md)
* [HT_SINE - Hilbert Transform SineWave](/lib/cycles/ht_sine/HtSine.md) * [HT_SINE - Ehlers Hilbert Transform SineWave](/lib/cycles/ht_sine/HtSine.md)
* [LUNAR - Lunar Phase](/lib/cycles/lunar/Lunar.md) * [LUNAR - Lunar Phase](/lib/cycles/lunar/Lunar.md)
* [SINE - Sine Wave](/lib/cycles/sine/Sine.md) * [SINE - Ehlers Sine Wave](/lib/cycles/sine/Sine.md)
* [SOLAR - Solar Activity Cycle](/lib/cycles/solar/Solar.md) * [SOLAR - Solar Activity Cycle](/lib/cycles/solar/Solar.md)
* [SSFDSP - SSF-Based Detrended Synthetic Price](/lib/cycles/ssfdsp/Ssfdsp.md) * [SSFDSP - Ehlers SSF Detrended Synthetic Price](/lib/cycles/ssfdsp/Ssfdsp.md)
* [STC - Schaff Trend Cycle](/lib/cycles/stc/Stc.md) * [STC - Schaff Trend Cycle](/lib/cycles/stc/Stc.md)
* **Reversals** * **Reversals**
+30 -28
View File
@@ -62,15 +62,16 @@ Infinite Impulse Response filters. Output depends on current input and past outp
| Indicator | Full Name | Notes | | Indicator | Full Name | Notes |
| :-------- | :-------- | :---- | | :-------- | :-------- | :---- |
| [**DECYCLER**](../lib/trends_IIR/decycler/Decycler.md) | Ehlers Decycler | Complementary HP filter subtracting high-frequency noise |
| [**DEMA**](../lib/trends_IIR/dema/Dema.md) | Double Exponential MA | EMA of EMA with lag compensation | | [**DEMA**](../lib/trends_IIR/dema/Dema.md) | Double Exponential MA | EMA of EMA with lag compensation |
| [**DSMA**](../lib/trends_IIR/dsma/Dsma.md) | Deviation-Scaled MA | Volatility-adaptive smoothing | | [**DSMA**](../lib/trends_IIR/dsma/Dsma.md) | Deviation-Scaled MA | Volatility-adaptive smoothing |
| [**EMA**](../lib/trends_IIR/ema/Ema.md) | Exponential MA | The fundamental IIR filter | | [**EMA**](../lib/trends_IIR/ema/Ema.md) | Exponential MA | The fundamental IIR filter |
| [**FRAMA**](../lib/trends_IIR/frama/Frama.md) | Fractal Adaptive MA | Dimension-based adaptation | | [**FRAMA**](../lib/trends_IIR/frama/Frama.md) | Ehlers Fractal Adaptive MA | Dimension-based adaptation |
| [**HEMA**](../lib/trends_IIR/hema/Hema.md) | Hull Exponential MA | Hull concept with EMA | | [**HEMA**](../lib/trends_IIR/hema/Hema.md) | Hull Exponential MA | Hull concept with EMA |
| [**HTIT**](../lib/trends_IIR/htit/Htit.md) | Hilbert Instantaneous Trend | Dominant cycle extraction | | [**HTIT**](../lib/trends_IIR/htit/Htit.md) | Ehlers Hilbert Instantaneous Trend | Dominant cycle extraction |
| [**JMA**](../lib/trends_IIR/jma/Jma.md) | Jurik MA | Adaptive, low-lag, proprietary algorithm | | [**JMA**](../lib/trends_IIR/jma/Jma.md) | Jurik MA | Adaptive, low-lag, proprietary algorithm |
| [**KAMA**](../lib/trends_IIR/kama/Kama.md) | Kaufman Adaptive MA | Efficiency ratio adaptation | | [**KAMA**](../lib/trends_IIR/kama/Kama.md) | Kaufman Adaptive MA | Efficiency ratio adaptation |
| [**MAMA**](../lib/trends_IIR/mama/Mama.md) | MESA Adaptive MA | Homodyne discriminator based | | [**MAMA**](../lib/trends_IIR/mama/Mama.md) | Ehlers MESA Adaptive MA | Homodyne discriminator based |
| [**MGDI**](../lib/trends_IIR/mgdi/Mgdi.md) | McGinley Dynamic | Market-speed tracking | | [**MGDI**](../lib/trends_IIR/mgdi/Mgdi.md) | McGinley Dynamic | Market-speed tracking |
| [**MMA**](../lib/trends_IIR/mma/Mma.md) | Modified MA | Smoothed EMA variant | | [**MMA**](../lib/trends_IIR/mma/Mma.md) | Modified MA | Smoothed EMA variant |
| [**QEMA**](../lib/trends_IIR/qema/Qema.md) | Quad Exponential MA | Four-stage exponential | | [**QEMA**](../lib/trends_IIR/qema/Qema.md) | Quad Exponential MA | Four-stage exponential |
@@ -92,14 +93,14 @@ Signal processing filters adapted for financial time series. Designed to separat
| Indicator | Full Name | Notes | | Indicator | Full Name | Notes |
| :-------- | :-------- | :---- | | :-------- | :-------- | :---- |
| [**AGC**](../lib/filters/agc/Agc.md) | Automatic Gain Control | Ehlers amplitude normalization via peak tracking | | [**AGC**](../lib/filters/agc/Agc.md) | Ehlers Automatic Gain Control | Ehlers amplitude normalization via peak tracking |
| [**ALAGUERRE**](../lib/filters/alaguerre/ALaguerre.md) | Adaptive Laguerre Filter | Ehlers variable-alpha from tracking error | | [**ALAGUERRE**](../lib/filters/alaguerre/ALaguerre.md) | Ehlers Adaptive Laguerre Filter | Ehlers variable-alpha from tracking error |
| [**BAXTERKING**](../lib/filters/baxterking/BaxterKing.md) | Baxter-King Band-Pass Filter | Symmetric FIR band-pass for cycle extraction | | [**BAXTERKING**](../lib/filters/baxterking/BaxterKing.md) | Baxter-King Band-Pass Filter | Symmetric FIR band-pass for cycle extraction |
| [**CFITZ**](../lib/filters/cfitz/Cfitz.md) | Christiano-Fitzgerald Filter | Asymmetric full-sample band-pass, random-walk optimal | | [**CFITZ**](../lib/filters/cfitz/Cfitz.md) | Christiano-Fitzgerald Filter | Asymmetric full-sample band-pass, random-walk optimal |
| [**BESSEL**](../lib/filters/bessel/Bessel.md) | Bessel Filter | Maximally flat group delay | | [**BESSEL**](../lib/filters/bessel/Bessel.md) | Bessel Filter | Maximally flat group delay |
| [**BILATERAL**](../lib/filters/bilateral/Bilateral.md) | Bilateral Filter | Edge-preserving smoothing | | [**BILATERAL**](../lib/filters/bilateral/Bilateral.md) | Bilateral Filter | Edge-preserving smoothing |
| [**BPF**](../lib/filters/bpf/Bpf.md) | BandPass Filter | Frequency band isolation | | [**BPF**](../lib/filters/bpf/Bpf.md) | BandPass Filter | Frequency band isolation |
| [**BUTTER**](../lib/filters/butter/Butter.md) | Butterworth Filter | Maximally flat passband | | [**BUTTER**](../lib/filters/butter/Butter.md) | Ehlers Butterworth Filter | Maximally flat passband |
| [**CHEBY1**](../lib/filters/cheby1/Cheby1.md) | Chebyshev Type I | Steeper rolloff with passband ripple | | [**CHEBY1**](../lib/filters/cheby1/Cheby1.md) | Chebyshev Type I | Steeper rolloff with passband ripple |
| [**CHEBY2**](../lib/filters/cheby2/Cheby2.md) | Chebyshev Type II | Steeper rolloff with stopband ripple | | [**CHEBY2**](../lib/filters/cheby2/Cheby2.md) | Chebyshev Type II | Steeper rolloff with stopband ripple |
| [**EDCF**](../lib/filters/edcf/Edcf.md) | Ehlers Distance Coefficient Filter | Nonlinear FIR, distance-weighted smoothing | | [**EDCF**](../lib/filters/edcf/Edcf.md) | Ehlers Distance Coefficient Filter | Nonlinear FIR, distance-weighted smoothing |
@@ -107,20 +108,20 @@ Signal processing filters adapted for financial time series. Designed to separat
| [**GAUSS**](../lib/filters/gauss/Gauss.md) | Gaussian Filter | No overshoot, smooth response | | [**GAUSS**](../lib/filters/gauss/Gauss.md) | Gaussian Filter | No overshoot, smooth response |
| [**HANN**](../lib/filters/hann/Hann.md) | Hann Filter | Raised cosine window filter | | [**HANN**](../lib/filters/hann/Hann.md) | Hann Filter | Raised cosine window filter |
| [**HP**](../lib/filters/hp/Hp.md) | Hodrick-Prescott Filter | Trend-cycle decomposition | | [**HP**](../lib/filters/hp/Hp.md) | Hodrick-Prescott Filter | Trend-cycle decomposition |
| [**HPF**](../lib/filters/hpf/Hpf.md) | High Pass Filter | Ehlers high-pass design | | [**HPF**](../lib/filters/hpf/Hpf.md) | Ehlers Highpass Filter | Ehlers high-pass design |
| [**KALMAN**](../lib/filters/kalman/Kalman.md) | Kalman Filter | Optimal recursive estimation | | [**KALMAN**](../lib/filters/kalman/Kalman.md) | Kalman Filter | Optimal recursive estimation |
| [**LAGUERRE**](../lib/filters/laguerre/Laguerre.md) | Laguerre Filter | Ehlers 4-element all-pass cascade | | [**LAGUERRE**](../lib/filters/laguerre/Laguerre.md) | Ehlers Laguerre Filter | Ehlers 4-element all-pass cascade |
| [**LMS**](../lib/filters/lms/Lms.md) | Least Mean Squares | Widrow-Hoff adaptive FIR filter | | [**LMS**](../lib/filters/lms/Lms.md) | Least Mean Squares | Widrow-Hoff adaptive FIR filter |
| [**RLS**](../lib/filters/rls/Rls.md) | Recursive Least Squares | Faster convergence than LMS | | [**RLS**](../lib/filters/rls/Rls.md) | Recursive Least Squares | Faster convergence than LMS |
| [**LOESS**](../lib/filters/loess/Loess.md) | LOESS Smoothing | Local polynomial regression | | [**LOESS**](../lib/filters/loess/Loess.md) | LOESS Smoothing | Local polynomial regression |
| [**NOTCH**](../lib/filters/notch/Notch.md) | Notch Filter | Single frequency rejection | | [**NOTCH**](../lib/filters/notch/Notch.md) | Notch Filter | Single frequency rejection |
| [**ONEEURO**](../lib/filters/oneeuro/OneEuro.md) | One Euro Filter | Speed-adaptive low-pass, adaptive cutoff | | [**ONEEURO**](../lib/filters/oneeuro/OneEuro.md) | One Euro Filter | Speed-adaptive low-pass, adaptive cutoff |
| [**ROOFING**](../lib/filters/roofing/Roofing.md) | Roofing Filter | Ehlers HP + SS bandpass cascade | | [**ROOFING**](../lib/filters/roofing/Roofing.md) | Ehlers Roofing Filter | Ehlers HP + SS bandpass cascade |
| [**SGF**](../lib/filters/sgf/Sgf.md) | Savitzky-Golay Filter | Polynomial least-squares fitting | | [**SGF**](../lib/filters/sgf/Sgf.md) | Savitzky-Golay Filter | Polynomial least-squares fitting |
| [**SPBF**](../lib/filters/spbf/Spbf.md) | Super Passband Filter | Ehlers wide-band bandpass with RMS envelope | | [**SPBF**](../lib/filters/spbf/Spbf.md) | Ehlers Super Passband Filter | Ehlers wide-band bandpass with RMS envelope |
| [**SSF**](../lib/filters/ssf/Ssf.md) | Super Smooth Filter | Ehlers two-pole design | | [**SSF**](../lib/filters/ssf/Ssf.md) | Ehlers Super Smoother Filter | Ehlers two-pole design |
| [**USF**](../lib/filters/usf/Usf.md) | Ultimate Smoother | Ehlers high-fidelity filter | | [**USF**](../lib/filters/usf/Usf.md) | Ehlers Ultimate Smoother | Ehlers high-fidelity filter |
| [**VOSS**](../lib/filters/voss/Voss.md) | Voss Predictive Filter | Ehlers BPF + negative group delay predictor | | [**VOSS**](../lib/filters/voss/Voss.md) | Ehlers Voss Predictive Filter | Ehlers BPF + negative group delay predictor |
| [**WAVELET**](../lib/filters/wavelet/Wavelet.md) | Wavelet Denoising Filter | A trous Haar + MAD soft thresholding | | [**WAVELET**](../lib/filters/wavelet/Wavelet.md) | Wavelet Denoising Filter | A trous Haar + MAD soft thresholding |
| [**WIENER**](../lib/filters/wiener/Wiener.md) | Wiener Filter | Minimum mean-square error denoising | | [**WIENER**](../lib/filters/wiener/Wiener.md) | Wiener Filter | Minimum mean-square error denoising |
@@ -136,8 +137,9 @@ Bounded indicators that oscillate around a centerline or between fixed extremes.
| [**BBB**](../lib/oscillators/bbb/Bbb.md) | Bollinger %B | Position within Bollinger Bands | | [**BBB**](../lib/oscillators/bbb/Bbb.md) | Bollinger %B | Position within Bollinger Bands |
| [**BBS**](../lib/oscillators/bbs/Bbs.md) | Bollinger Band Squeeze | BB inside KC squeeze detection | | [**BBS**](../lib/oscillators/bbs/Bbs.md) | Bollinger Band Squeeze | BB inside KC squeeze detection |
| [**CFO**](../lib/oscillators/cfo/Cfo.md) | Chande Forecast Oscillator | Forecast error percentage | | [**CFO**](../lib/oscillators/cfo/Cfo.md) | Chande Forecast Oscillator | Forecast error percentage |
| [**DECO**](../lib/oscillators/deco/Deco.md) | Ehlers Decycler Oscillator | Dual HP bandpass cycle isolation |
| [**DPO**](../lib/oscillators/dpo/Dpo.md) | Detrended Price Oscillator | Displaced SMA trend removal | | [**DPO**](../lib/oscillators/dpo/Dpo.md) | Detrended Price Oscillator | Displaced SMA trend removal |
| [**FISHER**](../lib/oscillators/fisher/Fisher.md) | Fisher Transform | Gaussian-normalized price reversal | | [**FISHER**](../lib/oscillators/fisher/Fisher.md) | Ehlers Fisher Transform | Gaussian-normalized price reversal |
| [**INERTIA**](../lib/oscillators/inertia/Inertia.md) | Inertia | Linear regression residual | | [**INERTIA**](../lib/oscillators/inertia/Inertia.md) | Inertia | Linear regression residual |
| [**KDJ**](../lib/oscillators/kdj/Kdj.md) | KDJ Indicator | Enhanced Stochastic (J = 3K 2D) | | [**KDJ**](../lib/oscillators/kdj/Kdj.md) | KDJ Indicator | Enhanced Stochastic (J = 3K 2D) |
| [**PGO**](../lib/oscillators/pgo/Pgo.md) | Pretty Good Oscillator | ATR-normalized SMA displacement | | [**PGO**](../lib/oscillators/pgo/Pgo.md) | Pretty Good Oscillator | ATR-normalized SMA displacement |
@@ -165,7 +167,7 @@ Indicators measuring trend strength, regime, and directional movement quality.
| [**CHOP**](../lib/dynamics/chop/Chop.md) | Choppiness Index | ATR sum vs range; trending vs choppy | | [**CHOP**](../lib/dynamics/chop/Chop.md) | Choppiness Index | ATR sum vs range; trending vs choppy |
| [**DMX**](../lib/dynamics/dmx/Dmx.md) | Jurik DMX | Enhanced directional movement | | [**DMX**](../lib/dynamics/dmx/Dmx.md) | Jurik DMX | Enhanced directional movement |
| [**DX**](../lib/dynamics/dx/Dx.md) | Directional Movement Index | Raw directional strength | | [**DX**](../lib/dynamics/dx/Dx.md) | Directional Movement Index | Raw directional strength |
| [**HT_TRENDMODE**](../lib/dynamics/ht_trendmode/HtTrendmode.md) | Hilbert Transform Trend Mode | Cycle vs trend regime detection | | [**HT_TRENDMODE**](../lib/dynamics/ht_trendmode/HtTrendmode.md) | Ehlers Hilbert Transform Trend vs Cycle Mode | Cycle vs trend regime detection |
| [**ICHIMOKU**](../lib/dynamics/ichimoku/Ichimoku.md) | Ichimoku Cloud | Multi-component trend system | | [**ICHIMOKU**](../lib/dynamics/ichimoku/Ichimoku.md) | Ichimoku Cloud | Multi-component trend system |
| [**IMI**](../lib/dynamics/imi/Imi.md) | Intraday Momentum Index | Candlestick-based momentum | | [**IMI**](../lib/dynamics/imi/Imi.md) | Intraday Momentum Index | Candlestick-based momentum |
| [**IMPULSE**](../lib/dynamics/impulse/Impulse.md) | Elder Impulse System | EMA + MACD-H trend/momentum fusion | | [**IMPULSE**](../lib/dynamics/impulse/Impulse.md) | Elder Impulse System | EMA + MACD-H trend/momentum fusion |
@@ -289,8 +291,8 @@ Price envelope and boundary indicators for breakout and mean-reversion strategie
| [**STARCHANNEL**](../lib/channels/starchannel/starchannel.md) | Stoller Average Range Channel | SMA with ATR bands | | [**STARCHANNEL**](../lib/channels/starchannel/starchannel.md) | Stoller Average Range Channel | SMA with ATR bands |
| [**STBANDS**](../lib/channels/stbands/Stbands.md) | Super Trend Bands | ATR-based SuperTrend envelope | | [**STBANDS**](../lib/channels/stbands/Stbands.md) | Super Trend Bands | ATR-based SuperTrend envelope |
| [**TTM_LRC**](../lib/channels/ttm_lrc/TtmLrc.md) | TTM Linear Regression Channel | John Carter's regression channel | | [**TTM_LRC**](../lib/channels/ttm_lrc/TtmLrc.md) | TTM Linear Regression Channel | John Carter's regression channel |
| [**UBANDS**](../lib/channels/ubands/Ubands.md) | Ultimate Bands | Ehlers bandpass-based bands | | [**UBANDS**](../lib/channels/ubands/Ubands.md) | Ehlers Ultimate Bands | Ehlers bandpass-based bands |
| [**UCHANNEL**](../lib/channels/uchannel/Uchannel.md) | Ultimate Channel | Ehlers smoothed channel | | [**UCHANNEL**](../lib/channels/uchannel/Uchannel.md) | Ehlers Ultimate Channel | Ehlers smoothed channel |
| [**VWAPBANDS**](../lib/channels/vwapbands/Vwapbands.md) | VWAP Bands | VWAP with StdDev bands | | [**VWAPBANDS**](../lib/channels/vwapbands/Vwapbands.md) | VWAP Bands | VWAP with StdDev bands |
| [**VWAPSD**](../lib/channels/vwapsd/Vwapsd.md) | VWAP StdDev Bands | VWAP with standard deviation envelopes | | [**VWAPSD**](../lib/channels/vwapsd/Vwapsd.md) | VWAP StdDev Bands | VWAP with standard deviation envelopes |
@@ -345,19 +347,19 @@ Periodic pattern detection and dominant frequency extraction. Markets exhibit cy
| Indicator | Full Name | Notes | | Indicator | Full Name | Notes |
| :-------- | :-------- | :---- | | :-------- | :-------- | :---- |
| [**CG**](../lib/cycles/cg/Cg.md) | Center of Gravity | Ehlers cycle measurement | | [**CG**](../lib/cycles/cg/Cg.md) | Ehlers Center of Gravity | Ehlers cycle measurement |
| [**DSP**](../lib/cycles/dsp/Dsp.md) | Detrended Synthetic Price | Cycle-isolated price component | | [**DSP**](../lib/cycles/dsp/Dsp.md) | Ehlers Detrended Synthetic Price | Cycle-isolated price component |
| [**EACP**](../lib/cycles/eacp/Eacp.md) | Autocorrelation Periodogram | Ehlers dominant cycle detection | | [**EACP**](../lib/cycles/eacp/Eacp.md) | Ehlers Autocorrelation Periodogram | Ehlers dominant cycle detection |
| [**EBSW**](../lib/cycles/ebsw/Ebsw.md) | Even Better Sinewave | Ehlers improved cycle indicator | | [**EBSW**](../lib/cycles/ebsw/Ebsw.md) | Ehlers Even Better Sinewave | Ehlers improved cycle indicator |
| [**HOMOD**](../lib/cycles/homod/Homod.md) | Homodyne Discriminator | Dominant cycle period tracking | | [**HOMOD**](../lib/cycles/homod/Homod.md) | Ehlers Homodyne Discriminator | Dominant cycle period tracking |
| [**HT_DCPERIOD**](../lib/cycles/ht_dcperiod/HtDcperiod.md) | HT Dominant Cycle Period | Hilbert Transform period estimation | | [**HT_DCPERIOD**](../lib/cycles/ht_dcperiod/HtDcperiod.md) | Ehlers HT Dominant Cycle Period | Hilbert Transform period estimation |
| [**HT_DCPHASE**](../lib/cycles/ht_dcphase/HtDcphase.md) | HT Dominant Cycle Phase | Hilbert Transform phase angle | | [**HT_DCPHASE**](../lib/cycles/ht_dcphase/HtDcphase.md) | Ehlers HT Dominant Cycle Phase | Hilbert Transform phase angle |
| [**HT_PHASOR**](../lib/cycles/ht_phasor/HtPhasor.md) | HT Phasor Components | In-phase and quadrature components | | [**HT_PHASOR**](../lib/cycles/ht_phasor/HtPhasor.md) | Ehlers HT Phasor Components | In-phase and quadrature components |
| [**HT_SINE**](../lib/cycles/ht_sine/HtSine.md) | HT SineWave | Dominant cycle phase with lead signal | | [**HT_SINE**](../lib/cycles/ht_sine/HtSine.md) | Ehlers HT SineWave | Dominant cycle phase with lead signal |
| [**LUNAR**](../lib/cycles/lunar/Lunar.md) | Lunar Phase | Moon phase cycle | | [**LUNAR**](../lib/cycles/lunar/Lunar.md) | Lunar Phase | Moon phase cycle |
| [**SINE**](../lib/cycles/sine/Sine.md) | Sine Wave | Periodic sine oscillation | | [**SINE**](../lib/cycles/sine/Sine.md) | Ehlers Sine Wave | Periodic sine oscillation |
| [**SOLAR**](../lib/cycles/solar/Solar.md) | Solar Activity Cycle | Solar activity periodicity | | [**SOLAR**](../lib/cycles/solar/Solar.md) | Solar Activity Cycle | Solar activity periodicity |
| [**SSFDSP**](../lib/cycles/ssfdsp/Ssfdsp.md) | SSF Detrended Synthetic Price | Dual Super Smoother oscillator | | [**SSFDSP**](../lib/cycles/ssfdsp/Ssfdsp.md) | Ehlers SSF Detrended Synthetic Price | Dual Super Smoother oscillator |
| [**STC**](../lib/cycles/stc/Stc.md) | Schaff Trend Cycle | MACD-based cycle oscillator | | [**STC**](../lib/cycles/stc/Stc.md) | Schaff Trend Cycle | MACD-based cycle oscillator |
### Numerics ### Numerics
+20 -19
View File
@@ -47,8 +47,8 @@ No external reference exists. Implementation verified through unit tests, edge c
| **Aroon Oscillator** | [AroonOsc](../lib/momentum/aroonosc/AroonOsc.md) | ✔️ | ✔️ | ✔️ | - | | **Aroon Oscillator** | [AroonOsc](../lib/momentum/aroonosc/AroonOsc.md) | ✔️ | ✔️ | ✔️ | - |
| **ATR Bands** | Atrbands | ✔️ | - | ✔️ | ❔ | | **ATR Bands** | Atrbands | ✔️ | - | ✔️ | ❔ |
| **Adaptive FIR Moving Average** | [Afirma](../lib/forecasts/afirma/Afirma.md) | - | - | - | - | | **Adaptive FIR Moving Average** | [Afirma](../lib/forecasts/afirma/Afirma.md) | - | - | - | - |
| **Adaptive Laguerre Filter** | [ALaguerre](../lib/filters/alaguerre/ALaguerre.md) | - | - | - | - | | **Ehlers Adaptive Laguerre Filter** | [ALaguerre](../lib/filters/alaguerre/ALaguerre.md) | - | - | - | - |
| **Automatic Gain Control** | [Agc](../lib/filters/agc/Agc.md) | - | - | - | - | | **Ehlers Automatic Gain Control** | [Agc](../lib/filters/agc/Agc.md) | - | - | - | - |
| **Average Daily Range** | [Adr](../lib/volatility/adr/Adr.md) | - | - | - | - | | **Average Daily Range** | [Adr](../lib/volatility/adr/Adr.md) | - | - | - | - |
| **Average Directional Index** | [Adx](../lib/momentum/adx/adx.md) | ✔️ | ✔️ | ✔️ | ✔️ | | **Average Directional Index** | [Adx](../lib/momentum/adx/adx.md) | ✔️ | ✔️ | ✔️ | ✔️ |
| **Average Directional Movement Rating** | [Adxr](../lib/momentum/adxr/Adxr.md) | ✔️ | ✔️ | - | - | | **Average Directional Movement Rating** | [Adxr](../lib/momentum/adxr/Adxr.md) | ✔️ | ✔️ | - | - |
@@ -72,7 +72,7 @@ No external reference exists. Implementation verified through unit tests, edge c
| **Bollinger Band Width Normalized** | Bbwn | - | - | - | - | | **Bollinger Band Width Normalized** | Bbwn | - | - | - | - |
| **Bollinger Band Width Percentile** | Bbwp | - | - | - | - | | **Bollinger Band Width Percentile** | Bbwp | - | - | - | - |
| **Bollinger Bands** | Bbands | ✔️ | ✔️ | ✔️ | ❔ | | **Bollinger Bands** | Bbands | ✔️ | ✔️ | ✔️ | ❔ |
| **Butterworth Filter** | [Butter](../lib/trends/butter/Butter.md) | - | - | - | ✔️ | | **Ehlers Butterworth Filter** | [Butter](../lib/trends/butter/Butter.md) | - | - | - | ✔️ |
| **Camarilla Pivot Points** | [Pivotcam](../lib/reversals/pivotcam/Pivotcam.md) | - | - | - | ❔ | | **Camarilla Pivot Points** | [Pivotcam](../lib/reversals/pivotcam/Pivotcam.md) | - | - | - | ❔ |
| **Chandelier Exit** | [Chandelier](../lib/reversals/chandelier/Chandelier.md) | - | - | ✔️ | - | | **Chandelier Exit** | [Chandelier](../lib/reversals/chandelier/Chandelier.md) | - | - | ✔️ | - |
| **Chande Kroll Stop** | [Ckstop](../lib/reversals/ckstop/Ckstop.md) | - | - | - | - | | **Chande Kroll Stop** | [Ckstop](../lib/reversals/ckstop/Ckstop.md) | - | - | - | - |
@@ -92,9 +92,10 @@ No external reference exists. Implementation verified through unit tests, edge c
| **Correlation** | Correlation | - | - | ✔️ | - | | **Correlation** | Correlation | - | - | ✔️ | - |
| **Cumulative Moving Average** | [Cma](../lib/statistics/cma/Cma.md) | - | - | - | - | | **Cumulative Moving Average** | [Cma](../lib/statistics/cma/Cma.md) | - | - | - | - |
| **Decay Min-Max Channel** | [Decaychannel](../lib/channels/decaychannel/decaychannel.md) | - | - | - | - | | **Decay Min-Max Channel** | [Decaychannel](../lib/channels/decaychannel/decaychannel.md) | - | - | - | - |
| **Ehlers Decycler** | [Decycler](../lib/trends_IIR/decycler/Decycler.md) | - | - | - | - |
| **DeMark Pivot Points** | [Pivotdem](../lib/reversals/pivotdem/Pivotdem.md) | - | - | - | ❔ | | **DeMark Pivot Points** | [Pivotdem](../lib/reversals/pivotdem/Pivotdem.md) | - | - | - | ❔ |
| **Detrended Price Oscillator** | [Dpo](../lib/oscillators/dpo/Dpo.md) | - | ⚠️ | - | ❔ | | **Detrended Price Oscillator** | [Dpo](../lib/oscillators/dpo/Dpo.md) | - | ⚠️ | - | ❔ |
| **Detrended Synthetic Price** | Dsp | - | - | - | ❔ | | **Ehlers Detrended Synthetic Price** | Dsp | - | - | - | ❔ |
| **Deviation-Scaled MA** | Dsma | - | - | - | ❔ | | **Deviation-Scaled MA** | Dsma | - | - | - | ❔ |
| **Directional Movement Index** | Dx | ✔️ | ✔️ | ✔️ | ✔️ | | **Directional Movement Index** | Dx | ✔️ | ✔️ | ✔️ | ✔️ |
| **Directional Movement Index (Jurik)** | [Dmx](../lib/momentum/dmx/dmx.md) | - | - | - | - | | **Directional Movement Index (Jurik)** | [Dmx](../lib/momentum/dmx/dmx.md) | - | - | - | - |
@@ -121,7 +122,7 @@ No external reference exists. Implementation verified through unit tests, edge c
| **Exponential Weighted MA Volatility** | [Ewma](../lib/volatility/ewma/Ewma.md) | - | - | - | ❔ | | **Exponential Weighted MA Volatility** | [Ewma](../lib/volatility/ewma/Ewma.md) | - | - | - | ❔ |
| **Extended Traditional Pivots** | [Pivotext](../lib/reversals/pivotext/Pivotext.md) | - | - | - | - | | **Extended Traditional Pivots** | [Pivotext](../lib/reversals/pivotext/Pivotext.md) | - | - | - | - |
| **Fibonacci Pivot Points** | Pivotfib | - | - | - | ❔ | | **Fibonacci Pivot Points** | Pivotfib | - | - | - | ❔ |
| **Fisher Transform** | [Fisher](../lib/oscillators/fisher/Fisher.md) | - | ❔ | ❔ | ❔ | | **Ehlers Fisher Transform** | [Fisher](../lib/oscillators/fisher/Fisher.md) | - | ❔ | ❔ | ❔ |
| **Force Index** | [Efi](../lib/volume/efi/Efi.md) | - | - | ✔️ | ✔️ | | **Force Index** | [Efi](../lib/volume/efi/Efi.md) | - | - | ✔️ | ✔️ |
| **Fractal Chaos Bands** | [Fcb](../lib/channels/fcb/fcb.md) | - | - | ✔️ | ❔ | | **Fractal Chaos Bands** | [Fcb](../lib/channels/fcb/fcb.md) | - | - | ✔️ | ❔ |
| **Garman-Klass Volatility** | [Gkv](../lib/volatility/gkv/Gkv.md) | - | - | - | - | | **Garman-Klass Volatility** | [Gkv](../lib/volatility/gkv/Gkv.md) | - | - | - | - |
@@ -135,16 +136,16 @@ No external reference exists. Implementation verified through unit tests, edge c
| **Hanning Window MA** | Hanma | - | - | - | ❔ | | **Hanning Window MA** | Hanma | - | - | - | ❔ |
| **High-Low Volatility (Parkinson)** | [Hlv](../lib/volatility/hlv/Hlv.md) | - | - | - | - | | **High-Low Volatility (Parkinson)** | [Hlv](../lib/volatility/hlv/Hlv.md) | - | - | - | - |
| **Highest value** | [Highest](../lib/numerics/highest/Highest.md) | ✔️ | ✔️ | - | - | | **Highest value** | [Highest](../lib/numerics/highest/Highest.md) | ✔️ | ✔️ | - | - |
| **Hilbert Transform Dominant Cycle Period** | [HtDcPeriod](../lib/cycles/ht_dcperiod/ht_dcperiod.md) | ✔️ | - | - | - | | **Ehlers Hilbert Transform Dominant Cycle Period** | [HtDcPeriod](../lib/cycles/ht_dcperiod/ht_dcperiod.md) | ✔️ | - | - | - |
| **Hilbert Transform Dominant Cycle Phase** | [HtDcPhase](../lib/cycles/ht_dcphase/ht_dcphase.md) | ✔️ | - | - | - | | **Ehlers Hilbert Transform Dominant Cycle Phase** | [HtDcPhase](../lib/cycles/ht_dcphase/ht_dcphase.md) | ✔️ | - | - | - |
| **Hilbert Transform Instantaneous Trend** | [Htit](../lib/trends/htit/htit.md) | ✔️ | - | ✔️ | ✔️ | | **Ehlers Hilbert Transform Instantaneous Trend** | [Htit](../lib/trends/htit/htit.md) | ✔️ | - | ✔️ | ✔️ |
| **Hilbert Transform Phasor** | [HtPhasor](../lib/cycles/ht_phasor/ht_phasor.md) | ✔️ | - | - | - | | **Ehlers Hilbert Transform Phasor Components** | [HtPhasor](../lib/cycles/ht_phasor/ht_phasor.md) | ✔️ | - | - | - |
| **Hilbert Transform Sine Wave** | [HtSine](../lib/cycles/ht_sine/ht_sine.md) | ✔️ | - | - | - | | **Ehlers Hilbert Transform SineWave** | [HtSine](../lib/cycles/ht_sine/ht_sine.md) | ✔️ | - | - | - |
| **Hilbert Transform Trend Mode** | Ht_trendmode | ✔️ | - | - | - | | **Ehlers Hilbert Transform Trend vs Cycle Mode** | Ht_trendmode | ✔️ | - | - | - |
| **Historical Volatility (Close-to-Close)** | [Hv](../lib/volatility/hv/Hv.md) | - | - | - | - | | **Historical Volatility (Close-to-Close)** | [Hv](../lib/volatility/hv/Hv.md) | - | - | - | - |
| **Hodrick-Prescott Filter** | [Hp](../lib/filters/hp/Hp.md) | - | - | - | - | | **Hodrick-Prescott Filter** | [Hp](../lib/filters/hp/Hp.md) | - | - | - | - |
| **Holt Weighted MA** | Hwma | - | - | - | ❔ | | **Holt Weighted MA** | Hwma | - | - | - | ❔ |
| **Homodyne Discriminator Dominant Cycle** | [Homod](../lib/cycles/homod/homod.md) | - | - | - | ❔ | | **Ehlers Homodyne Discriminator** | [Homod](../lib/cycles/homod/homod.md) | - | - | - | ❔ |
| **Huber Loss** | Huber | - | - | - | - | | **Huber Loss** | Huber | - | - | - | - |
| **Hull Exponential MA** | [Hema](../lib/trends_IIR/hema/Hema.md) | - | - | - | - | | **Hull Exponential MA** | [Hema](../lib/trends_IIR/hema/Hema.md) | - | - | - | - |
| **Hull Moving Average** | [Hma](../lib/trends/hma/hma.md) | - | ✔️ | ✔️ | [⚠️](../lib/trends/hma/hma.md#external-library-discrepancies) | | **Hull Moving Average** | [Hma](../lib/trends/hma/hma.md) | - | ✔️ | ✔️ | [⚠️](../lib/trends/hma/hma.md#external-library-discrepancies) |
@@ -167,7 +168,7 @@ No external reference exists. Implementation verified through unit tests, edge c
| **Kendall Rank Correlation** | [Kendall](../lib/statistics/kendall/Kendall.md) | - | - | - | - | | **Kendall Rank Correlation** | [Kendall](../lib/statistics/kendall/Kendall.md) | - | - | - | - |
| **Klinger Volume Oscillator** | [Kvo](../lib/volume/kvo/Kvo.md) | - | ✔️ | ✔️ | ❔ | | **Klinger Volume Oscillator** | [Kvo](../lib/volume/kvo/Kvo.md) | - | ✔️ | ✔️ | ❔ |
| **Kurtosis** | [Kurtosis](../lib/statistics/kurtosis/Kurtosis.md) | - | - | - | [✔️](../lib/statistics/kurtosis/Kurtosis.md#validation) | | **Kurtosis** | [Kurtosis](../lib/statistics/kurtosis/Kurtosis.md) | - | - | - | [✔️](../lib/statistics/kurtosis/Kurtosis.md#validation) |
| **Laguerre Filter** | [Laguerre](../lib/filters/laguerre/Laguerre.md) | - | - | - | - | | **Ehlers Laguerre Filter** | [Laguerre](../lib/filters/laguerre/Laguerre.md) | - | - | - | - |
| **Least Mean Squares** | [Lms](../lib/filters/lms/Lms.md) | - | - | - | - | | **Least Mean Squares** | [Lms](../lib/filters/lms/Lms.md) | - | - | - | - |
| **Recursive Least Squares** | [Rls](../lib/filters/rls/Rls.md) | - | - | - | - | | **Recursive Least Squares** | [Rls](../lib/filters/rls/Rls.md) | - | - | - | - |
| **Least Squares Moving Average** | [Lsma](../lib/trends/lsma/lsma.md) | - | - | ✔️ | ❔ | | **Least Squares Moving Average** | [Lsma](../lib/trends/lsma/lsma.md) | - | - | ✔️ | ❔ |
@@ -191,7 +192,7 @@ No external reference exists. Implementation verified through unit tests, edge c
| **Mean Percentage Error** | Mpe | - | - | - | - | | **Mean Percentage Error** | Mpe | - | - | - | - |
| **Mean Squared Error** | Mse | - | - | - | - | | **Mean Squared Error** | Mse | - | - | - | - |
| **Mean Squared Logarithmic Error** | Msle | - | - | - | - | | **Mean Squared Logarithmic Error** | Msle | - | - | - | - |
| **MESA Adaptive Moving Average** | [Mama](../lib/trends/mama/mama.md) | - | - | ✔️ | ✔️ | | **Ehlers MESA Adaptive Moving Average** | [Mama](../lib/trends/mama/mama.md) | - | - | ✔️ | ✔️ |
| **Midpoint** | [Midpoint](../lib/numerics/midpoint/Midpoint.md) | ✔️ | - | - | - | | **Midpoint** | [Midpoint](../lib/numerics/midpoint/Midpoint.md) | ✔️ | - | - | - |
| **Min-Max Channel** | [Mmchannel](../lib/channels/mmchannel/mmchannel.md) | - | - | ✔️ | - | | **Min-Max Channel** | [Mmchannel](../lib/channels/mmchannel/mmchannel.md) | - | - | ✔️ | - |
| **Min-Max Scaling (Normalization)** | [Normalize](../lib/numerics/normalize/Normalize.md) | - | - | - | - | | **Min-Max Scaling (Normalization)** | [Normalize](../lib/numerics/normalize/Normalize.md) | - | - | - | - |
@@ -248,7 +249,7 @@ No external reference exists. Implementation verified through unit tests, edge c
| **Relative Volatility Index** | [Rvi](../lib/volatility/rvi/Rvi.md) | - | - | - | ❔ | | **Relative Volatility Index** | [Rvi](../lib/volatility/rvi/Rvi.md) | - | - | - | ❔ |
| **Renko** | - | - | - | ✔️ | - | | **Renko** | - | - | - | ✔️ | - |
| **Rogers-Satchell Volatility** | Rsv | - | - | - | - | | **Rogers-Satchell Volatility** | Rsv | - | - | - | - |
| **Roofing Filter** | [Roofing](../lib/filters/roofing/Roofing.md) | - | - | - | ✔️ | | **Ehlers Roofing Filter** | [Roofing](../lib/filters/roofing/Roofing.md) | - | - | - | ✔️ |
| **Root Mean Squared Error** | Rmse | - | - | - | - | | **Root Mean Squared Error** | Rmse | - | - | - | - |
| **Root Mean Squared Logarithmic Error** | Rmsle | - | - | - | - | | **Root Mean Squared Logarithmic Error** | Rmsle | - | - | - | - |
| **R-Squared** | [RSquared](../lib/statistics/linreg/LinReg.md) | - | - | ✔️ | ❔ | | **R-Squared** | [RSquared](../lib/statistics/linreg/LinReg.md) | - | - | ✔️ | ❔ |
@@ -260,7 +261,7 @@ No external reference exists. Implementation verified through unit tests, edge c
| **Smoothed Moving Average** | [Rma](../lib/trends/rma/rma.md) | - | - | ✔️ | ✔️ | | **Smoothed Moving Average** | [Rma](../lib/trends/rma/rma.md) | - | - | ✔️ | ✔️ |
| **Solar Activity Cycle** | Solar | - | - | - | - | | **Solar Activity Cycle** | Solar | - | - | - | - |
| **Spearman Rank Correlation** | Spearman | - | - | - | ❔ | | **Spearman Rank Correlation** | Spearman | - | - | - | ❔ |
| **Super Passband Filter** | [Spbf](../lib/filters/spbf/Spbf.md) | - | - | - | - | | **Ehlers Super Passband Filter** | [Spbf](../lib/filters/spbf/Spbf.md) | - | - | - | - |
| **Square Root Transformation** | [Sqrttrans](../lib/numerics/sqrttrans/Sqrttrans.md) | - | - | - | - | | **Square Root Transformation** | [Sqrttrans](../lib/numerics/sqrttrans/Sqrttrans.md) | - | - | - | - |
| **Standard Deviation Channel** | [Sdchannel](../lib/channels/sdchannel/sdchannel.md) | - | - | - | ❔ | | **Standard Deviation Channel** | [Sdchannel](../lib/channels/sdchannel/sdchannel.md) | - | - | - | ❔ |
| **Standardization (Z-score)** | Standardize | - | - | - | ❔ | | **Standardization (Z-score)** | Standardize | - | - | - | ❔ |
@@ -289,8 +290,8 @@ No external reference exists. Implementation verified through unit tests, edge c
| **TTM Wave** | [TtmWave](../lib/oscillators/ttm_wave/TtmWave.md) | - | - | - | - | | **TTM Wave** | [TtmWave](../lib/oscillators/ttm_wave/TtmWave.md) | - | - | - | - |
| **Two-Argument Arctangent** | Atan2 | - | - | - | - | | **Two-Argument Arctangent** | Atan2 | - | - | - | - |
| **Ulcer Index** | Ui | - | - | - | ❔ | | **Ulcer Index** | Ui | - | - | - | ❔ |
| **Ultimate Bands (Ehlers)** | [Ubands](../lib/channels/ubands/Ubands.md) | - | - | - | - | | **Ehlers Ultimate Bands** | [Ubands](../lib/channels/ubands/Ubands.md) | - | - | - | - |
| **Ultimate Channel** | [Uchannel](../lib/channels/uchannel/Uchannel.md) | - | - | - | - | | **Ehlers Ultimate Channel** | [Uchannel](../lib/channels/uchannel/Uchannel.md) | - | - | - | - |
| **Ultimate Oscillator** | [Ultosc](../lib/momentum/ultosc/Ultosc.md) | ✔️ | ✔️ | ✔️ | ✔️ | | **Ultimate Oscillator** | [Ultosc](../lib/momentum/ultosc/Ultosc.md) | ✔️ | ✔️ | ✔️ | ✔️ |
| **Variable Index Dynamic Average** | [Vidya](../lib/trends/vidya/vidya.md) | - | - | - | ❔ | | **Variable Index Dynamic Average** | [Vidya](../lib/trends/vidya/vidya.md) | - | - | - | ❔ |
| **Velocity (Jurik)** | [Vel](../lib/momentum/vel/vel.md) | - | - | - | - | | **Velocity (Jurik)** | [Vel](../lib/momentum/vel/vel.md) | - | - | - | - |
@@ -305,7 +306,7 @@ No external reference exists. Implementation verified through unit tests, edge c
| **Volume Weighted Average Price** | [Vwap](../lib/volume/vwap/Vwap.md) | - | - | - | - | | **Volume Weighted Average Price** | [Vwap](../lib/volume/vwap/Vwap.md) | - | - | - | - |
| **Volume Weighted Moving Average** | [Vwma](../lib/volume/vwma/Vwma.md) | - | - | ✔️ | - | | **Volume Weighted Moving Average** | [Vwma](../lib/volume/vwma/Vwma.md) | - | - | ✔️ | - |
| **Vortex Indicator** | Vortex | - | - | ✔️ | ❔ | | **Vortex Indicator** | Vortex | - | - | ✔️ | ❔ |
| **Voss Predictive Filter** | [Voss](../lib/filters/voss/Voss.md) | - | - | - | ✔️ | | **Ehlers Voss Predictive Filter** | [Voss](../lib/filters/voss/Voss.md) | - | - | - | ✔️ |
| **VWAP Bands** | [Vwapbands](../lib/channels/vwapbands/Vwapbands.md) | - | - | - | - | | **VWAP Bands** | [Vwapbands](../lib/channels/vwapbands/Vwapbands.md) | - | - | - | - |
| **VWAP with Standard Deviation Bands** | [Vwapsd](../lib/channels/vwapsd/Vwapsd.md) | - | - | - | - | | **VWAP with Standard Deviation Bands** | [Vwapsd](../lib/channels/vwapsd/Vwapsd.md) | - | - | - | - |
| **Wavelet Denoising Filter** | [Wavelet](../lib/filters/wavelet/Wavelet.md) | - | - | - | - | | **Wavelet Denoising Filter** | [Wavelet](../lib/filters/wavelet/Wavelet.md) | - | - | - | - |
+34 -32
View File
@@ -5,9 +5,9 @@
| Category | Count | Description | | Category | Count | Description |
| :--- | :---: | :--- | | :--- | :---: | :--- |
| [Trends (FIR)](trends_FIR/_index.md) | 17 | Finite Impulse Response moving averages | | [Trends (FIR)](trends_FIR/_index.md) | 17 | Finite Impulse Response moving averages |
| [Trends (IIR)](trends_IIR/_index.md) | 23 | Infinite Impulse Response moving averages | | [Trends (IIR)](trends_IIR/_index.md) | 24 | Infinite Impulse Response moving averages |
| [Filters](filters/_index.md) | 26 | Signal processing filters | | [Filters](filters/_index.md) | 31 | Signal processing filters |
| [Oscillators](oscillators/_index.md) | 19 | Indicators that fluctuate around a center line | | [Oscillators](oscillators/_index.md) | 20 | Indicators that fluctuate around a center line |
| [Dynamics](dynamics/_index.md) | 18 | Trend strength and direction indicators | | [Dynamics](dynamics/_index.md) | 18 | Trend strength and direction indicators |
| [Momentum](momentum/_index.md) | 16 | Momentum-based indicators | | [Momentum](momentum/_index.md) | 16 | Momentum-based indicators |
| [Volatility](volatility/_index.md) | 26 | Volatility estimators and indicators | | [Volatility](volatility/_index.md) | 26 | Volatility estimators and indicators |
@@ -19,7 +19,7 @@
| [Forecasts](forecasts/_index.md) | 1 | Predictive indicators | | [Forecasts](forecasts/_index.md) | 1 | Predictive indicators |
| [Errors](errors/_index.md) | 26 | Error metrics and loss functions | | [Errors](errors/_index.md) | 26 | Error metrics and loss functions |
| [Numerics](numerics/_index.md) | 15 | Mathematical transformations | | [Numerics](numerics/_index.md) | 15 | Mathematical transformations |
| **Total** | **292** | | | **Total** | **299** | |
## All Indicators ## All Indicators
@@ -36,8 +36,8 @@
| [ADX](dynamics/adx/Adx.md) | Average Directional Index | Dynamics | | [ADX](dynamics/adx/Adx.md) | Average Directional Index | Dynamics |
| [ADXR](dynamics/adxr/Adxr.md) | Average Directional Movement Rating | Dynamics | | [ADXR](dynamics/adxr/Adxr.md) | Average Directional Movement Rating | Dynamics |
| [AFIRMA](forecasts/afirma/Afirma.md) | Adaptive FIR Moving Average | Forecasts | | [AFIRMA](forecasts/afirma/Afirma.md) | Adaptive FIR Moving Average | Forecasts |
| [AGC](filters/agc/Agc.md) | Automatic Gain Control | Filters | | [AGC](filters/agc/Agc.md) | Ehlers Automatic Gain Control | Filters |
| [ALAGUERRE](filters/alaguerre/ALaguerre.md) | Adaptive Laguerre Filter | Filters | | [ALAGUERRE](filters/alaguerre/ALaguerre.md) | Ehlers Adaptive Laguerre Filter | Filters |
| [ALLIGATOR](dynamics/alligator/Alligator.md) | Williams Alligator | Dynamics | | [ALLIGATOR](dynamics/alligator/Alligator.md) | Williams Alligator | Dynamics |
| [ALMA](trends_FIR/alma/Alma.md) | Arnaud Legoux MA | Trends (FIR) | | [ALMA](trends_FIR/alma/Alma.md) | Arnaud Legoux MA | Trends (FIR) |
| [AMAT](dynamics/amat/Amat.md) | Archer Moving Averages Trends | Dynamics | | [AMAT](dynamics/amat/Amat.md) | Archer Moving Averages Trends | Dynamics |
@@ -71,13 +71,13 @@
| [BOP](momentum/bop/Bop.md) | Balance of Power | Momentum | | [BOP](momentum/bop/Bop.md) | Balance of Power | Momentum |
| [BPF](filters/bpf/Bpf.md) | BandPass Filter | Filters | | [BPF](filters/bpf/Bpf.md) | BandPass Filter | Filters |
| BRAR | BRAR | Oscillators | | BRAR | BRAR | Oscillators |
| [BUTTER](filters/butter/Butter.md) | Butterworth Filter | Filters | | [BUTTER](filters/butter/Butter.md) | Ehlers Butterworth Filter | Filters |
| [BWMA](trends_FIR/bwma/Bwma.md) | Bessel-Weighted MA | Trends (FIR) | | [BWMA](trends_FIR/bwma/Bwma.md) | Bessel-Weighted MA | Trends (FIR) |
| [CCI](momentum/cci/Cci.md) | Commodity Channel Index | Momentum | | [CCI](momentum/cci/Cci.md) | Commodity Channel Index | Momentum |
| [CCV](volatility/ccv/Ccv.md) | Close-to-Close Volatility | Volatility | | [CCV](volatility/ccv/Ccv.md) | Close-to-Close Volatility | Volatility |
| [CFB](momentum/cfb/Cfb.md) | Composite Fractal Behavior | Momentum | | [CFB](momentum/cfb/Cfb.md) | Composite Fractal Behavior | Momentum |
| [CFO](oscillators/cfo/Cfo.md) | Chande Forecast Oscillator | Oscillators | | [CFO](oscillators/cfo/Cfo.md) | Chande Forecast Oscillator | Oscillators |
| [CG](cycles/cg/Cg.md) | Center of Gravity | Cycles | | [CG](cycles/cg/Cg.md) | Ehlers Center of Gravity | Cycles |
| [CHANDELIER](reversals/chandelier/Chandelier.md) | Chandelier Exit | Reversals | | [CHANDELIER](reversals/chandelier/Chandelier.md) | Chandelier Exit | Reversals |
| [CHANGE](numerics/change/Change.md) | Percentage Change | Numerics | | [CHANGE](numerics/change/Change.md) | Percentage Change | Numerics |
| [CHEBY1](filters/cheby1/Cheby1.md) | Chebyshev Type I | Filters | | [CHEBY1](filters/cheby1/Cheby1.md) | Chebyshev Type I | Filters |
@@ -99,17 +99,19 @@
| CWT | Continuous Wavelet Transform | Numerics | | CWT | Continuous Wavelet Transform | Numerics |
| [DCHANNEL](channels/dchannel/Dchannel.md) | Donchian Channels | Channels | | [DCHANNEL](channels/dchannel/Dchannel.md) | Donchian Channels | Channels |
| [DECAYCHANNEL](channels/decaychannel/decaychannel.md) | Decay Min-Max Channel | Channels | | [DECAYCHANNEL](channels/decaychannel/decaychannel.md) | Decay Min-Max Channel | Channels |
| [DECO](oscillators/deco/Deco.md) | Ehlers Decycler Oscillator | Oscillators |
| [DECYCLER](trends_IIR/decycler/Decycler.md) | Ehlers Decycler | Trends (IIR) |
| [DEMA](trends_IIR/dema/Dema.md) | Double Exponential MA | Trends (IIR) | | [DEMA](trends_IIR/dema/Dema.md) | Double Exponential MA | Trends (IIR) |
| [DMX](dynamics/dmx/Dmx.md) | Jurik Directional Movement Index | Dynamics | | [DMX](dynamics/dmx/Dmx.md) | Jurik Directional Movement Index | Dynamics |
| DOSC | Derivative Oscillator | Oscillators | | DOSC | Derivative Oscillator | Oscillators |
| [DPO](oscillators/dpo/Dpo.md) | Detrended Price Oscillator | Oscillators | | [DPO](oscillators/dpo/Dpo.md) | Detrended Price Oscillator | Oscillators |
| [DSMA](trends_IIR/dsma/Dsma.md) | Deviation-Scaled MA | Trends (IIR) | | [DSMA](trends_IIR/dsma/Dsma.md) | Deviation-Scaled MA | Trends (IIR) |
| [DSP](cycles/dsp/Dsp.md) | Detrended Synthetic Price | Cycles | | [DSP](cycles/dsp/Dsp.md) | Ehlers Detrended Synthetic Price | Cycles |
| [DWMA](trends_FIR/dwma/Dwma.md) | Double Weighted MA | Trends (FIR) | | [DWMA](trends_FIR/dwma/Dwma.md) | Double Weighted MA | Trends (FIR) |
| DWT | Discrete Wavelet Transform | Numerics | | DWT | Discrete Wavelet Transform | Numerics |
| [DX](dynamics/dx/Dx.md) | Directional Movement Index | Dynamics | | [DX](dynamics/dx/Dx.md) | Directional Movement Index | Dynamics |
| [EACP](cycles/eacp/Eacp.md) | Autocorrelation Periodogram | Cycles | | [EACP](cycles/eacp/Eacp.md) | Ehlers Autocorrelation Periodogram | Cycles |
| [EBSW](cycles/ebsw/Ebsw.md) | Even Better Sinewave | Cycles | | [EBSW](cycles/ebsw/Ebsw.md) | Ehlers Even Better Sinewave | Cycles |
| [EDCF](filters/edcf/Edcf.md) | Ehlers Distance Coefficient Filter | Filters | | [EDCF](filters/edcf/Edcf.md) | Ehlers Distance Coefficient Filter | Filters |
| [EFI](volume/efi/Efi.md) | Elder's Force Index | Volume | | [EFI](volume/efi/Efi.md) | Elder's Force Index | Volume |
| [ELLIPTIC](filters/elliptic/Elliptic.md) | Elliptic Filter | Filters | | [ELLIPTIC](filters/elliptic/Elliptic.md) | Elliptic Filter | Filters |
@@ -123,11 +125,11 @@
| [EXPTRANS](numerics/exptrans/Exptrans.md) | Exponential Transform | Numerics | | [EXPTRANS](numerics/exptrans/Exptrans.md) | Exponential Transform | Numerics |
| FDIST | F-Distribution | Numerics | | FDIST | F-Distribution | Numerics |
| FFT | Fast Fourier Transform | Numerics | | FFT | Fast Fourier Transform | Numerics |
| [FISHER](oscillators/fisher/Fisher.md) | Fisher Transform | Oscillators | | [FISHER](oscillators/fisher/Fisher.md) | Ehlers Fisher Transform | Oscillators |
| FOSC | Forecast Oscillator | Oscillators | | FOSC | Forecast Oscillator | Oscillators |
| [FRACTALS](reversals/fractals/Fractals.md) | Williams Fractals | Reversals | | [FRACTALS](reversals/fractals/Fractals.md) | Williams Fractals | Reversals |
| [FCB](channels/fcb/fcb.md) | Fractal Chaos Bands | Channels | | [FCB](channels/fcb/fcb.md) | Fractal Chaos Bands | Channels |
| [FRAMA](trends_IIR/frama/Frama.md) | Fractal Adaptive MA | Trends (IIR) | | [FRAMA](trends_IIR/frama/Frama.md) | Ehlers Fractal Adaptive MA | Trends (IIR) |
| GAMMADIST | Gamma Distribution | Numerics | | GAMMADIST | Gamma Distribution | Numerics |
| [GAUSS](filters/gauss/Gauss.md) | Gaussian Filter | Filters | | [GAUSS](filters/gauss/Gauss.md) | Gaussian Filter | Filters |
| [GEOMEAN](statistics/geomean/Geomean.md) | Geometric Mean | Statistics | | [GEOMEAN](statistics/geomean/Geomean.md) | Geometric Mean | Statistics |
@@ -142,15 +144,15 @@
| [HIGHEST](numerics/highest/Highest.md) | Rolling Maximum | Numerics | | [HIGHEST](numerics/highest/Highest.md) | Rolling Maximum | Numerics |
| [HLV](volatility/hlv/Hlv.md) | High-Low Volatility | Volatility | | [HLV](volatility/hlv/Hlv.md) | High-Low Volatility | Volatility |
| [HMA](trends_FIR/hma/Hma.md) | Hull MA | Trends (FIR) | | [HMA](trends_FIR/hma/Hma.md) | Hull MA | Trends (FIR) |
| [HOMOD](cycles/homod/Homod.md) | Homodyne Discriminator | Cycles | | [HOMOD](cycles/homod/Homod.md) | Ehlers Homodyne Discriminator | Cycles |
| [HP](filters/hp/Hp.md) | Hodrick-Prescott | Filters | | [HP](filters/hp/Hp.md) | Hodrick-Prescott | Filters |
| [HPF](filters/hpf/Hpf.md) | High Pass Filter | Filters | | [HPF](filters/hpf/Hpf.md) | Ehlers Highpass Filter | Filters |
| [HTIT](trends_IIR/htit/Htit.md) | Hilbert Transform Instantaneous Trend | Trends (IIR) | | [HTIT](trends_IIR/htit/Htit.md) | Ehlers Hilbert Transform Instantaneous Trend | Trends (IIR) |
| [HT_DCPERIOD](cycles/ht_dcperiod/Ht_dcperiod.md) | HT Dominant Cycle Period | Cycles | | [HT_DCPERIOD](cycles/ht_dcperiod/Ht_dcperiod.md) | Ehlers HT Dominant Cycle Period | Cycles |
| [HT_DCPHASE](cycles/ht_dcphase/Ht_dcphase.md) | HT Dominant Cycle Phase | Cycles | | [HT_DCPHASE](cycles/ht_dcphase/Ht_dcphase.md) | Ehlers HT Dominant Cycle Phase | Cycles |
| [HT_PHASOR](cycles/ht_phasor/Ht_phasor.md) | HT Phasor Components | Cycles | | [HT_PHASOR](cycles/ht_phasor/Ht_phasor.md) | Ehlers HT Phasor Components | Cycles |
| [HT_SINE](cycles/ht_sine/Ht_sine.md) | HT SineWave | Cycles | | [HT_SINE](cycles/ht_sine/Ht_sine.md) | Ehlers HT SineWave | Cycles |
| [HT_TRENDMODE](dynamics/ht_trendmode/Ht_trendmode.md) | HT Trend vs Cycle | Dynamics | | [HT_TRENDMODE](dynamics/ht_trendmode/Ht_trendmode.md) | Ehlers HT Trend vs Cycle | Dynamics |
| [HUBER](errors/huber/Huber.md) | Huber Loss | Errors | | [HUBER](errors/huber/Huber.md) | Huber Loss | Errors |
| [HURST](statistics/hurst/Hurst.md) | Hurst Exponent | Statistics | | [HURST](statistics/hurst/Hurst.md) | Hurst Exponent | Statistics |
| [HV](volatility/hv/Hv.md) | Historical Volatility | Volatility | | [HV](volatility/hv/Hv.md) | Historical Volatility | Volatility |
@@ -169,7 +171,7 @@
| [JVOLTY](volatility/jvolty/Jvolty.md) | Jurik Volatility | Volatility | | [JVOLTY](volatility/jvolty/Jvolty.md) | Jurik Volatility | Volatility |
| [JVOLTYN](volatility/jvoltyn/Jvoltyn.md) | Jurik Volatility Normalized | Volatility | | [JVOLTYN](volatility/jvoltyn/Jvoltyn.md) | Jurik Volatility Normalized | Volatility |
| [KALMAN](filters/kalman/Kalman.md) | Kalman Filter | Filters | | [KALMAN](filters/kalman/Kalman.md) | Kalman Filter | Filters |
| [LAGUERRE](filters/laguerre/Laguerre.md) | Laguerre Filter | Filters | | [LAGUERRE](filters/laguerre/Laguerre.md) | Ehlers Laguerre Filter | Filters |
| [LMS](filters/lms/Lms.md) | Least Mean Squares Adaptive Filter | Filters | | [LMS](filters/lms/Lms.md) | Least Mean Squares Adaptive Filter | Filters |
| [RLS](filters/rls/Rls.md) | Recursive Least Squares Adaptive Filter | Filters | | [RLS](filters/rls/Rls.md) | Recursive Least Squares Adaptive Filter | Filters |
| [KAMA](trends_IIR/kama/Kama.md) | Kaufman Adaptive MA | Trends (IIR) | | [KAMA](trends_IIR/kama/Kama.md) | Kaufman Adaptive MA | Trends (IIR) |
@@ -194,7 +196,7 @@
| [MACD](momentum/macd/Macd.md) | Moving Average Convergence Divergence | Momentum | | [MACD](momentum/macd/Macd.md) | Moving Average Convergence Divergence | Momentum |
| [MAE](errors/mae/Mae.md) | Mean Absolute Error | Errors | | [MAE](errors/mae/Mae.md) | Mean Absolute Error | Errors |
| [MAENV](channels/maenv/maenv.md) | Moving Average Envelope | Channels | | [MAENV](channels/maenv/maenv.md) | Moving Average Envelope | Channels |
| [MAMA](trends_IIR/mama/Mama.md) | MESA Adaptive MA | Trends (IIR) | | [MAMA](trends_IIR/mama/Mama.md) | Ehlers MESA Adaptive MA | Trends (IIR) |
| [MAPD](errors/mapd/Mapd.md) | Mean Absolute % Deviation | Errors | | [MAPD](errors/mapd/Mapd.md) | Mean Absolute % Deviation | Errors |
| [MAPE](errors/mape/Mape.md) | Mean Absolute % Error | Errors | | [MAPE](errors/mape/Mape.md) | Mean Absolute % Error | Errors |
| [MASE](errors/mase/Mase.md) | Mean Absolute Scaled Error | Errors | | [MASE](errors/mase/Mase.md) | Mean Absolute Scaled Error | Errors |
@@ -263,7 +265,7 @@
| [ROC](momentum/roc/Roc.md) | Rate of Change | Momentum | | [ROC](momentum/roc/Roc.md) | Rate of Change | Momentum |
| [ROCP](momentum/rocp/Rocp.md) | Rate of Change Percentage | Momentum | | [ROCP](momentum/rocp/Rocp.md) | Rate of Change Percentage | Momentum |
| [ROCR](momentum/rocr/Rocr.md) | Rate of Change Ratio | Momentum | | [ROCR](momentum/rocr/Rocr.md) | Rate of Change Ratio | Momentum |
| [ROOFING](filters/roofing/Roofing.md) | Roofing Filter | Filters | | [ROOFING](filters/roofing/Roofing.md) | Ehlers Roofing Filter | Filters |
| [RSE](errors/rse/Rse.md) | Relative Squared Error | Errors | | [RSE](errors/rse/Rse.md) | Relative Squared Error | Errors |
| [RSI](momentum/rsi/Rsi.md) | Relative Strength Index | Momentum | | [RSI](momentum/rsi/Rsi.md) | Relative Strength Index | Momentum |
| [RSQUARED](errors/rsquared/Rsquared.md) | R² (Coefficient of Determination) | Errors | | [RSQUARED](errors/rsquared/Rsquared.md) | R² (Coefficient of Determination) | Errors |
@@ -276,7 +278,7 @@
| [SGF](filters/sgf/Sgf.md) | Savitzky-Golay Filter | Filters | | [SGF](filters/sgf/Sgf.md) | Savitzky-Golay Filter | Filters |
| [SGMA](trends_FIR/sgma/Sgma.md) | Savitzky-Golay MA | Trends (FIR) | | [SGMA](trends_FIR/sgma/Sgma.md) | Savitzky-Golay MA | Trends (FIR) |
| [SIGMOID](numerics/sigmoid/Sigmoid.md) | Logistic Function | Numerics | | [SIGMOID](numerics/sigmoid/Sigmoid.md) | Logistic Function | Numerics |
| [SINE](cycles/sine/Sine.md) | Sine Wave | Cycles | | [SINE](cycles/sine/Sine.md) | Ehlers Sine Wave | Cycles |
| [SINEMA](trends_FIR/sinema/Sinema.md) | Sine-Weighted MA | Trends (FIR) | | [SINEMA](trends_FIR/sinema/Sinema.md) | Sine-Weighted MA | Trends (FIR) |
| [SKEW](statistics/skew/Skew.md) | Skewness | Statistics | | [SKEW](statistics/skew/Skew.md) | Skewness | Statistics |
| [SLOPE](numerics/slope/Slope.md) | Rate of Change | Numerics | | [SLOPE](numerics/slope/Slope.md) | Rate of Change | Numerics |
@@ -284,12 +286,12 @@
| [SMAPE](errors/smape/Smape.md) | Symmetric MAPE | Errors | | [SMAPE](errors/smape/Smape.md) | Symmetric MAPE | Errors |
| [SMI](oscillators/smi/Smi.md) | Stochastic Momentum Index | Oscillators | | [SMI](oscillators/smi/Smi.md) | Stochastic Momentum Index | Oscillators |
| [SOLAR](cycles/solar/Solar.md) | Solar Activity Cycle | Cycles | | [SOLAR](cycles/solar/Solar.md) | Solar Activity Cycle | Cycles |
| [SPBF](filters/spbf/Spbf.md) | Super Passband Filter | Filters | | [SPBF](filters/spbf/Spbf.md) | Ehlers Super Passband Filter | Filters |
| [SPEARMAN](statistics/spearman/Spearman.md) | Spearman Rank Correlation | Statistics | | [SPEARMAN](statistics/spearman/Spearman.md) | Spearman Rank Correlation | Statistics |
| SQUEEZE | Squeeze | Oscillators | | SQUEEZE | Squeeze | Oscillators |
| [SQRTTRANS](numerics/sqrttrans/Sqrttrans.md) | Square Root Transform | Numerics | | [SQRTTRANS](numerics/sqrttrans/Sqrttrans.md) | Square Root Transform | Numerics |
| [SSF](filters/ssf/Ssf.md) | Super Smoother | Filters | | [SSF](filters/ssf/Ssf.md) | Ehlers Super Smoother | Filters |
| [SSFDSP](cycles/ssfdsp/Ssfdsp.md) | SSF Detrended Synthetic Price | Cycles | | [SSFDSP](cycles/ssfdsp/Ssfdsp.md) | Ehlers SSF Detrended Synthetic Price | Cycles |
| [STANDARDIZE](numerics/standardize/Standardize.md) | Z-Score Normalization | Numerics | | [STANDARDIZE](numerics/standardize/Standardize.md) | Z-Score Normalization | Numerics |
| [STARCHANNEL](channels/starchannel/Starchannel.md) | Stoller Average Range Channel | Channels | | [STARCHANNEL](channels/starchannel/Starchannel.md) | Stoller Average Range Channel | Channels |
| [STBANDS](channels/stbands/Stbands.md) | Super Trend Bands | Channels | | [STBANDS](channels/stbands/Stbands.md) | Super Trend Bands | Channels |
@@ -320,11 +322,11 @@
| [TUKEY](errors/tukey/Tukey.md) | Tukey Biweight Loss | Errors | | [TUKEY](errors/tukey/Tukey.md) | Tukey Biweight Loss | Errors |
| [TVI](volume/tvi/Tvi.md) | Trade Volume Index | Volume | | [TVI](volume/tvi/Tvi.md) | Trade Volume Index | Volume |
| [TWAP](volume/twap/Twap.md) | Time Weighted Average Price | Volume | | [TWAP](volume/twap/Twap.md) | Time Weighted Average Price | Volume |
| [UBANDS](channels/ubands/Ubands.md) | Ultimate Bands | Channels | | [UBANDS](channels/ubands/Ubands.md) | Ehlers Ultimate Bands | Channels |
| [UCHANNEL](channels/uchannel/Uchannel.md) | Ultimate Channel | Channels | | [UCHANNEL](channels/uchannel/Uchannel.md) | Ehlers Ultimate Channel | Channels |
| [UI](volatility/ui/Ui.md) | Ulcer Index | Volatility | | [UI](volatility/ui/Ui.md) | Ulcer Index | Volatility |
| [ULTOSC](oscillators/ultosc/Ultosc.md) | Ultimate Oscillator | Oscillators | | [ULTOSC](oscillators/ultosc/Ultosc.md) | Ultimate Oscillator | Oscillators |
| [USF](filters/usf/Usf.md) | Ultra Smoother | Filters | | [USF](filters/usf/Usf.md) | Ehlers Ultimate Smoother | Filters |
| [VA](volume/va/Va.md) | Volume Accumulation | Volume | | [VA](volume/va/Va.md) | Volume Accumulation | Volume |
| [VAMA](trends_IIR/vama/Vama.md) | Volatility Adjusted MA | Trends (IIR) | | [VAMA](trends_IIR/vama/Vama.md) | Volatility Adjusted MA | Trends (IIR) |
| [VARIANCE](statistics/variance/Variance.md) | Variance | Statistics | | [VARIANCE](statistics/variance/Variance.md) | Variance | Statistics |
@@ -333,7 +335,7 @@
| [VIDYA](trends_IIR/vidya/Vidya.md) | Variable Index Dynamic Average | Trends (IIR) | | [VIDYA](trends_IIR/vidya/Vidya.md) | Variable Index Dynamic Average | Trends (IIR) |
| [VO](volume/vo/Vo.md) | Volume Oscillator | Volume | | [VO](volume/vo/Vo.md) | Volume Oscillator | Volume |
| [VORTEX](dynamics/vortex/Vortex.md) | Vortex Indicator | Dynamics | | [VORTEX](dynamics/vortex/Vortex.md) | Vortex Indicator | Dynamics |
| [VOSS](filters/voss/Voss.md) | Voss Predictive Filter | Filters | | [VOSS](filters/voss/Voss.md) | Ehlers Voss Predictive Filter | Filters |
| [VOV](volatility/vov/Vov.md) | Volatility of Volatility | Volatility | | [VOV](volatility/vov/Vov.md) | Volatility of Volatility | Volatility |
| [VR](volatility/vr/Vr.md) | Volatility Ratio | Volatility | | [VR](volatility/vr/Vr.md) | Volatility Ratio | Volatility |
| [VROC](volume/vroc/Vroc.md) | Volume Rate of Change | Volume | | [VROC](volume/vroc/Vroc.md) | Volume Rate of Change | Volume |
+1 -1
View File
@@ -2,7 +2,7 @@
// © mihakralj // © mihakralj
//@version=6 //@version=6
// Ultimate Channel logic based on work by John F. Ehlers (c) 2024 // Ultimate Channel logic based on work by John F. Ehlers (c) 2024
indicator("Ultimate Channel (UCHANNEL)", "UCHANNEL", overlay=true) indicator("Ehlers Ultimate Channel (UCHANNEL)", "UCHANNEL", overlay=true)
//@function Calculates Ultimate Channel //@function Calculates Ultimate Channel
//@param src Source series for the centerline (typically close) //@param src Source series for the centerline (typically close)
+11 -11
View File
@@ -8,17 +8,17 @@ Cycle analysis identifies repeating patterns in price data. John Ehlers pioneere
| Indicator | Full Name | Description | | Indicator | Full Name | Description |
| :--- | :--- | :--- | | :--- | :--- | :--- |
| [CG](cg/Cg.md) | Center of Gravity | Ehlers. Weighted sum position. Minimal lag cycle indicator. | | [CG](cg/Cg.md) | Ehlers Center of Gravity | Ehlers. Weighted sum position. Minimal lag cycle indicator. |
| [DSP](dsp/Dsp.md) | Detrended Synthetic Price | Removes trend to reveal underlying cycles. | | [DSP](dsp/Dsp.md) | Ehlers Detrended Synthetic Price | Removes trend to reveal underlying cycles. |
| [EACP](eacp/Eacp.md) | Autocorrelation Periodogram | Ehlers. Spectral analysis via autocorrelation. Detects dominant period. | | [EACP](eacp/Eacp.md) | Ehlers Autocorrelation Periodogram | Ehlers. Spectral analysis via autocorrelation. Detects dominant period. |
| [EBSW](ebsw/Ebsw.md) | Even Better Sinewave | Ehlers. Improved sinewave extraction. Reduces false signals. | | [EBSW](ebsw/Ebsw.md) | Ehlers Even Better Sinewave | Ehlers. Improved sinewave extraction. Reduces false signals. |
| [HOMOD](homod/Homod.md) | Homodyne Discriminator | Dominant cycle detection via homodyne technique. | | [HOMOD](homod/Homod.md) | Ehlers Homodyne Discriminator | Dominant cycle detection via homodyne technique. |
| [HT_DCPERIOD](ht_dcperiod/Ht_dcperiod.md) | Hilbert Transform Dominant Cycle Period | Ehlers Hilbert Transform. Measures current cycle length. | | [HT_DCPERIOD](ht_dcperiod/Ht_dcperiod.md) | Ehlers Hilbert Transform Dominant Cycle Period | Ehlers Hilbert Transform. Measures current cycle length. |
| [HT_DCPHASE](ht_dcphase/Ht_dcphase.md) | Hilbert Transform Dominant Cycle Phase | Ehlers Hilbert Transform. Measures current position in cycle. | | [HT_DCPHASE](ht_dcphase/Ht_dcphase.md) | Ehlers Hilbert Transform Dominant Cycle Phase | Ehlers Hilbert Transform. Measures current position in cycle. |
| [HT_PHASOR](ht_phasor/HtPhasor.md) | Hilbert Transform Phasor Components | Ehlers. In-phase and quadrature components. | | [HT_PHASOR](ht_phasor/HtPhasor.md) | Ehlers Hilbert Transform Phasor Components | Ehlers. In-phase and quadrature components. |
| [HT_SINE](ht_sine/HtSine.md) | Hilbert Transform SineWave | Ehlers Hilbert Transform. Sine and lead sine for cycle timing. | | [HT_SINE](ht_sine/HtSine.md) | Ehlers Hilbert Transform SineWave | Ehlers Hilbert Transform. Sine and lead sine for cycle timing. |
| [LUNAR](lunar/Lunar.md) | Lunar Phase | 29.5-day lunar cycle. Studied for market correlations. | | [LUNAR](lunar/Lunar.md) | Lunar Phase | 29.5-day lunar cycle. Studied for market correlations. |
| [SINE](sine/Sine.md) | Sine Wave | Ehlers. Basic sinewave indicator for cycle mode. | | [SINE](sine/Sine.md) | Ehlers Sine Wave | Ehlers. Basic sinewave indicator for cycle mode. |
| [SOLAR](solar/Solar.md) | Solar Activity Cycle | ~11-year sunspot cycle. Long-term research indicator. | | [SOLAR](solar/Solar.md) | Solar Activity Cycle | ~11-year sunspot cycle. Long-term research indicator. |
| [SSFDSP](ssfdsp/Ssfdsp.md) | SSF Detrended Synthetic Price | Super Smoother Filter based DSP. Cleaner cycle extraction. | | [SSFDSP](ssfdsp/Ssfdsp.md) | Ehlers SSF Detrended Synthetic Price | Super Smoother Filter based DSP. Cleaner cycle extraction. |
| [STC](stc/Stc.md) | Schaff Trend Cycle | MACD + double Stochastic smoothing. Fast cycle oscillator (0-100). | | [STC](stc/Stc.md) | Schaff Trend Cycle | MACD + double Stochastic smoothing. Fast cycle oscillator (0-100). |
+1 -1
View File
@@ -12,7 +12,7 @@ public class CgIndicatorTests
Assert.Equal(10, indicator.Period); Assert.Equal(10, indicator.Period);
Assert.Equal(SourceType.Close, indicator.Source); Assert.Equal(SourceType.Close, indicator.Source);
Assert.True(indicator.ShowColdValues); Assert.True(indicator.ShowColdValues);
Assert.Equal("CG - Center of Gravity", indicator.Name); Assert.Equal("CG - Ehlers Center of Gravity", indicator.Name);
Assert.True(indicator.SeparateWindow); Assert.True(indicator.SeparateWindow);
Assert.True(indicator.OnBackGround); Assert.True(indicator.OnBackGround);
} }
+1 -1
View File
@@ -31,7 +31,7 @@ public sealed class CgIndicator : Indicator, IWatchlistIndicator
{ {
OnBackGround = true; OnBackGround = true;
SeparateWindow = true; SeparateWindow = true;
Name = "CG - Center of Gravity"; Name = "CG - Ehlers Center of Gravity";
Description = "Ehlers' Center of Gravity oscillator identifies potential turning points using weighted center of mass"; Description = "Ehlers' Center of Gravity oscillator identifies potential turning points using weighted center of mass";
_series = new LineSeries(name: "CG", color: IndicatorExtensions.Oscillators, width: 2, style: LineStyle.Solid); _series = new LineSeries(name: "CG", color: IndicatorExtensions.Oscillators, width: 2, style: LineStyle.Solid);
+1 -1
View File
@@ -1,4 +1,4 @@
# CG: Center of Gravity # CG: Ehlers Center of Gravity
> "The market's center of mass reveals where momentum shifts before price does." > "The market's center of mass reveals where momentum shifts before price does."
+1 -1
View File
@@ -1,7 +1,7 @@
// The MIT License (MIT) // The MIT License (MIT)
// © mihakralj // © mihakralj
//@version=6 //@version=6
indicator("Center of Gravity (CG)", "CG", overlay=false) indicator("Ehlers Center of Gravity (CG)", "CG", overlay=false)
//@function Calculates Ehlers' Center of Gravity indicator //@function Calculates Ehlers' Center of Gravity indicator
//@param src Series to calculate Center of Gravity from //@param src Series to calculate Center of Gravity from
+1 -1
View File
@@ -12,7 +12,7 @@ public class DspIndicatorTests
Assert.Equal(40, indicator.Period); Assert.Equal(40, indicator.Period);
Assert.Equal(SourceType.Close, indicator.Source); Assert.Equal(SourceType.Close, indicator.Source);
Assert.True(indicator.ShowColdValues); Assert.True(indicator.ShowColdValues);
Assert.Equal("DSP - Detrended Synthetic Price", indicator.Name); Assert.Equal("DSP - Ehlers Detrended Synthetic Price", indicator.Name);
Assert.True(indicator.SeparateWindow); Assert.True(indicator.SeparateWindow);
Assert.True(indicator.OnBackGround); Assert.True(indicator.OnBackGround);
} }
+1 -1
View File
@@ -31,7 +31,7 @@ public sealed class DspIndicator : Indicator, IWatchlistIndicator
{ {
OnBackGround = true; OnBackGround = true;
SeparateWindow = true; SeparateWindow = true;
Name = "DSP - Detrended Synthetic Price"; Name = "DSP - Ehlers Detrended Synthetic Price";
Description = "Ehlers' Detrended Synthetic Price oscillator removes trend using dual EMA smoothing"; Description = "Ehlers' Detrended Synthetic Price oscillator removes trend using dual EMA smoothing";
_series = new LineSeries(name: "DSP", color: IndicatorExtensions.Oscillators, width: 2, style: LineStyle.Solid); _series = new LineSeries(name: "DSP", color: IndicatorExtensions.Oscillators, width: 2, style: LineStyle.Solid);
+1 -1
View File
@@ -1,4 +1,4 @@
# DSP: Detrended Synthetic Price # DSP: Ehlers Detrended Synthetic Price
> "Remove the trend, reveal the cycles." > "Remove the trend, reveal the cycles."
+1 -1
View File
@@ -1,7 +1,7 @@
// The MIT License (MIT) // The MIT License (MIT)
// © mihakralj // © mihakralj
//@version=6 //@version=6
indicator("Detrended Synthetic Price (DSP)", "DSP", overlay=false) indicator("Ehlers Detrended Synthetic Price (DSP)", "DSP", overlay=false)
//@function Calculates Detrended Synthetic Price using Ehlers dual-EMA algorithm //@function Calculates Detrended Synthetic Price using Ehlers dual-EMA algorithm
//@param source Series to detrend //@param source Series to detrend
+1 -1
View File
@@ -1,7 +1,7 @@
// The MIT License (MIT) // The MIT License (MIT)
// © mihakralj // © mihakralj
//@version=6 //@version=6
indicator("EACP: Ehlers Autocorrelation Periodogram","EACP",overlay=false) indicator("Ehlers Autocorrelation Periodogram (EACP)","EACP",overlay=false)
//@function Autocorrelation periodogram dominant cycle estimator //@function Autocorrelation periodogram dominant cycle estimator
//@param source Price input series //@param source Price input series
//@param minPeriod Minimum period to evaluate //@param minPeriod Minimum period to evaluate
+1 -1
View File
@@ -13,7 +13,7 @@ public class EbswIndicatorTests
Assert.Equal(10, indicator.SsfLength); Assert.Equal(10, indicator.SsfLength);
Assert.Equal(SourceType.Close, indicator.Source); Assert.Equal(SourceType.Close, indicator.Source);
Assert.True(indicator.ShowColdValues); Assert.True(indicator.ShowColdValues);
Assert.Equal("EBSW - Even Better Sinewave", indicator.Name); Assert.Equal("EBSW - Ehlers Even Better Sinewave", indicator.Name);
Assert.True(indicator.SeparateWindow); Assert.True(indicator.SeparateWindow);
Assert.True(indicator.OnBackGround); Assert.True(indicator.OnBackGround);
} }
+1 -1
View File
@@ -36,7 +36,7 @@ public sealed class EbswIndicator : Indicator, IWatchlistIndicator
{ {
OnBackGround = true; OnBackGround = true;
SeparateWindow = true; SeparateWindow = true;
Name = "EBSW - Even Better Sinewave"; Name = "EBSW - Ehlers Even Better Sinewave";
Description = "Ehlers' Even Better Sinewave oscillator with high-pass filter, super-smoother, and automatic gain control"; Description = "Ehlers' Even Better Sinewave oscillator with high-pass filter, super-smoother, and automatic gain control";
_series = new LineSeries(name: "EBSW", color: IndicatorExtensions.Oscillators, width: 2, style: LineStyle.Solid); _series = new LineSeries(name: "EBSW", color: IndicatorExtensions.Oscillators, width: 2, style: LineStyle.Solid);
+1 -1
View File
@@ -13,7 +13,7 @@ public class HomodIndicatorTests
Assert.Equal(50.0, indicator.MaxPeriod); Assert.Equal(50.0, indicator.MaxPeriod);
Assert.Equal(SourceType.Close, indicator.Source); Assert.Equal(SourceType.Close, indicator.Source);
Assert.True(indicator.ShowColdValues); Assert.True(indicator.ShowColdValues);
Assert.Equal("HOMOD - Homodyne Discriminator", indicator.Name); Assert.Equal("HOMOD - Ehlers Homodyne Discriminator", indicator.Name);
Assert.True(indicator.SeparateWindow); Assert.True(indicator.SeparateWindow);
Assert.True(indicator.OnBackGround); Assert.True(indicator.OnBackGround);
} }
+1 -1
View File
@@ -33,7 +33,7 @@ public sealed class HomodIndicator : Indicator, IWatchlistIndicator
{ {
OnBackGround = true; OnBackGround = true;
SeparateWindow = true; SeparateWindow = true;
Name = "HOMOD - Homodyne Discriminator"; Name = "HOMOD - Ehlers Homodyne Discriminator";
Description = "Ehlers' Homodyne Discriminator estimates the dominant cycle period using homodyne multiplication and phase angle measurement"; Description = "Ehlers' Homodyne Discriminator estimates the dominant cycle period using homodyne multiplication and phase angle measurement";
_cycleSeries = new LineSeries(name: "Cycle", color: IndicatorExtensions.Oscillators, width: 2, style: LineStyle.Solid); _cycleSeries = new LineSeries(name: "Cycle", color: IndicatorExtensions.Oscillators, width: 2, style: LineStyle.Solid);
+1 -1
View File
@@ -1,4 +1,4 @@
# HOMOD: Homodyne Discriminator # HOMOD: Ehlers Homodyne Discriminator
> "The homodyne discriminator reveals instantaneous frequency by multiplying a signal with its delayed self — the phase rotation between samples directly encodes the cycle period." > "The homodyne discriminator reveals instantaneous frequency by multiplying a signal with its delayed self — the phase rotation between samples directly encodes the cycle period."
+1 -1
View File
@@ -1,7 +1,7 @@
// The MIT License (MIT) // The MIT License (MIT)
// © mihakralj // © mihakralj
//@version=6 //@version=6
indicator("HOMOD: Homodyne Discriminator Dominant Cycle","HOMOD",overlay=false) indicator("Ehlers Homodyne Discriminator (HOMOD)","HOMOD",overlay=false)
//@function Quadrant-aware angle calculation using stable atan2 //@function Quadrant-aware angle calculation using stable atan2
//@param y Imaginary component //@param y Imaginary component
@@ -27,7 +27,7 @@ public sealed class HtDcperiodIndicator : Indicator, IWatchlistIndicator
{ {
OnBackGround = true; OnBackGround = true;
SeparateWindow = true; SeparateWindow = true;
Name = "HT_DCPERIOD - Hilbert Transform Dominant Cycle Period"; Name = "HT_DCPERIOD - Ehlers Hilbert Transform Dominant Cycle Period";
Description = "Hilbert Transform Dominant Cycle Period indicator measuring the dominant cycle period in price data"; Description = "Hilbert Transform Dominant Cycle Period indicator measuring the dominant cycle period in price data";
_periodSeries = new LineSeries(name: "DCPeriod", color: IndicatorExtensions.Oscillators, width: 2, style: LineStyle.Solid); _periodSeries = new LineSeries(name: "DCPeriod", color: IndicatorExtensions.Oscillators, width: 2, style: LineStyle.Solid);
+1 -1
View File
@@ -1,4 +1,4 @@
# HT_DCPERIOD: Hilbert Transform - Dominant Cycle Period # HT_DCPERIOD: Ehlers Hilbert Transform Dominant Cycle Period
> "Knowing the cycle period is the master key—it calibrates other indicators to the market's current rhythm." > "Knowing the cycle period is the master key—it calibrates other indicators to the market's current rhythm."
+1 -1
View File
@@ -1,7 +1,7 @@
// The MIT License (MIT) // The MIT License (MIT)
// © mihakralj // © mihakralj
//@version=6 //@version=6
indicator("HT_DCPERIOD: Hilbert Transform Dominant Cycle Period", "HT_DCPERIOD", overlay=false) indicator("Ehlers Hilbert Transform Dominant Cycle Period (HT_DCPERIOD)", "HT_DCPERIOD", overlay=false)
//@function Numerically stable atan2 implementation for quadrant-aware angle calculation //@function Numerically stable atan2 implementation for quadrant-aware angle calculation
//@param y Y-coordinate (imaginary/quadrature component) //@param y Y-coordinate (imaginary/quadrature component)
@@ -11,7 +11,7 @@ public class HtDcphaseIndicatorTests
Assert.Equal(SourceType.Close, indicator.Source); Assert.Equal(SourceType.Close, indicator.Source);
Assert.True(indicator.ShowColdValues); Assert.True(indicator.ShowColdValues);
Assert.Equal("HT_DCPHASE - Hilbert Transform Dominant Cycle Phase", indicator.Name); Assert.Equal("HT_DCPHASE - Ehlers Hilbert Transform Dominant Cycle Phase", indicator.Name);
Assert.True(indicator.SeparateWindow); Assert.True(indicator.SeparateWindow);
Assert.True(indicator.OnBackGround); Assert.True(indicator.OnBackGround);
} }
+1 -1
View File
@@ -28,7 +28,7 @@ public sealed class HtDcphaseIndicator : Indicator, IWatchlistIndicator
{ {
OnBackGround = true; OnBackGround = true;
SeparateWindow = true; SeparateWindow = true;
Name = "HT_DCPHASE - Hilbert Transform Dominant Cycle Phase"; Name = "HT_DCPHASE - Ehlers Hilbert Transform Dominant Cycle Phase";
Description = "Hilbert Transform Dominant Cycle Phase indicator measuring the phase angle of the dominant cycle in price data (degrees, -45 to 315)"; Description = "Hilbert Transform Dominant Cycle Phase indicator measuring the phase angle of the dominant cycle in price data (degrees, -45 to 315)";
_phaseSeries = new LineSeries(name: "DCPhase", color: IndicatorExtensions.Oscillators, width: 2, style: LineStyle.Solid); _phaseSeries = new LineSeries(name: "DCPhase", color: IndicatorExtensions.Oscillators, width: 2, style: LineStyle.Solid);
+1 -1
View File
@@ -1,4 +1,4 @@
# HT_DCPHASE: Hilbert Transform - Dominant Cycle Phase # HT_DCPHASE: Ehlers Hilbert Transform Dominant Cycle Phase
> "The phase advances through a full 360-degree cycle as the dominant cycle completes; rapid phase changes indicate turning points." > "The phase advances through a full 360-degree cycle as the dominant cycle completes; rapid phase changes indicate turning points."
+1 -1
View File
@@ -1,7 +1,7 @@
// The MIT License (MIT) // The MIT License (MIT)
// © mihakralj // © mihakralj
//@version=6 //@version=6
indicator("HT_DCPHASE: Hilbert Transform Dominant Cycle Phase", "HT_DCPHASE", overlay=false) indicator("Ehlers Hilbert Transform Dominant Cycle Phase (HT_DCPHASE)", "HT_DCPHASE", overlay=false)
//@function Numerically stable atan2 implementation for quadrant-aware angle calculation //@function Numerically stable atan2 implementation for quadrant-aware angle calculation
//@param y Y-coordinate (imaginary/quadrature component) //@param y Y-coordinate (imaginary/quadrature component)
@@ -11,7 +11,7 @@ public class HtPhasorIndicatorTests
Assert.Equal(SourceType.Close, indicator.Source); Assert.Equal(SourceType.Close, indicator.Source);
Assert.True(indicator.ShowColdValues); Assert.True(indicator.ShowColdValues);
Assert.Equal("HT_PHASOR - Hilbert Transform Phasor", indicator.Name); Assert.Equal("HT_PHASOR - Ehlers Hilbert Transform Phasor Components", indicator.Name);
Assert.True(indicator.SeparateWindow); Assert.True(indicator.SeparateWindow);
Assert.True(indicator.OnBackGround); Assert.True(indicator.OnBackGround);
} }
+1 -1
View File
@@ -29,7 +29,7 @@ public sealed class HtPhasorIndicator : Indicator, IWatchlistIndicator
{ {
OnBackGround = true; OnBackGround = true;
SeparateWindow = true; SeparateWindow = true;
Name = "HT_PHASOR - Hilbert Transform Phasor"; Name = "HT_PHASOR - Ehlers Hilbert Transform Phasor Components";
Description = "Hilbert Transform Phasor components (InPhase, Quadrature) for cycle analysis"; Description = "Hilbert Transform Phasor components (InPhase, Quadrature) for cycle analysis";
_inPhaseSeries = new LineSeries(name: "InPhase", color: IndicatorExtensions.Oscillators, width: 2, style: LineStyle.Solid); _inPhaseSeries = new LineSeries(name: "InPhase", color: IndicatorExtensions.Oscillators, width: 2, style: LineStyle.Solid);
+1 -1
View File
@@ -1,4 +1,4 @@
# HT_PHASOR: Hilbert Transform - Phasor Components # HT_PHASOR: Ehlers Hilbert Transform Phasor Components
> "Phasors let us measure a cycle's position and strength; trading becomes geometry over time." > "Phasors let us measure a cycle's position and strength; trading becomes geometry over time."
+1 -1
View File
@@ -1,7 +1,7 @@
// The MIT License (MIT) // The MIT License (MIT)
// © mihakralj // © mihakralj
//@version=6 //@version=6
indicator("Ehlers Phasor Analysis (PHASOR)", shorttitle="PHASOR", overlay=false) indicator("Ehlers Hilbert Transform Phasor Components (HT_PHASOR)", shorttitle="HT_PHASOR", overlay=false)
//@function Calculates the Ehlers Phasor Angle, Derived Period, and Trend State. //@function Calculates the Ehlers Phasor Angle, Derived Period, and Trend State.
//@param src The source series to analyze. //@param src The source series to analyze.
+1 -1
View File
@@ -11,7 +11,7 @@ public class HtSineIndicatorTests
Assert.Equal(SourceType.Close, indicator.Source); Assert.Equal(SourceType.Close, indicator.Source);
Assert.True(indicator.ShowColdValues); Assert.True(indicator.ShowColdValues);
Assert.Equal("HT_SINE - Hilbert Transform SineWave", indicator.Name); Assert.Equal("HT_SINE - Ehlers Hilbert Transform SineWave", indicator.Name);
Assert.True(indicator.SeparateWindow); Assert.True(indicator.SeparateWindow);
Assert.True(indicator.OnBackGround); Assert.True(indicator.OnBackGround);
} }
+1 -1
View File
@@ -29,7 +29,7 @@ public sealed class HtSineIndicator : Indicator, IWatchlistIndicator
{ {
OnBackGround = true; OnBackGround = true;
SeparateWindow = true; SeparateWindow = true;
Name = "HT_SINE - Hilbert Transform SineWave"; Name = "HT_SINE - Ehlers Hilbert Transform SineWave";
Description = "Hilbert Transform SineWave indicator showing Sine and LeadSine for cycle timing"; Description = "Hilbert Transform SineWave indicator showing Sine and LeadSine for cycle timing";
_sineSeries = new LineSeries(name: "Sine", color: IndicatorExtensions.Oscillators, width: 2, style: LineStyle.Solid); _sineSeries = new LineSeries(name: "Sine", color: IndicatorExtensions.Oscillators, width: 2, style: LineStyle.Solid);
+1 -1
View File
@@ -1,4 +1,4 @@
# HT_SINE: Hilbert Transform SineWave # HT_SINE: Ehlers Hilbert Transform SineWave
> "The Hilbert Transform gives us the phase of the dominant cycle—knowing when to buy and sell becomes a matter of trigonometry." > "The Hilbert Transform gives us the phase of the dominant cycle—knowing when to buy and sell becomes a matter of trigonometry."
+1 -1
View File
@@ -1,7 +1,7 @@
// The MIT License (MIT) // The MIT License (MIT)
// © mihakralj // © mihakralj
//@version=6 //@version=6
indicator("HT_SINE: Hilbert Transform - SineWave", "HT_SINE", overlay=false) indicator("Ehlers Hilbert Transform SineWave (HT_SINE)", "HT_SINE", overlay=false)
//@function Numerically stable atan2 implementation for quadrant-aware angle calculation //@function Numerically stable atan2 implementation for quadrant-aware angle calculation
//@param y Y-coordinate (imaginary/quadrature component) //@param y Y-coordinate (imaginary/quadrature component)
+1 -1
View File
@@ -12,7 +12,7 @@ public class SsfdspIndicatorTests
Assert.Equal(20, indicator.Period); Assert.Equal(20, indicator.Period);
Assert.Equal(SourceType.Close, indicator.Source); Assert.Equal(SourceType.Close, indicator.Source);
Assert.True(indicator.ShowColdValues); Assert.True(indicator.ShowColdValues);
Assert.Equal("SSFDSP - SSF Detrended Synthetic Price", indicator.Name); Assert.Equal("SSFDSP - Ehlers SSF Detrended Synthetic Price", indicator.Name);
Assert.True(indicator.SeparateWindow); Assert.True(indicator.SeparateWindow);
Assert.True(indicator.OnBackGround); Assert.True(indicator.OnBackGround);
} }
+1 -1
View File
@@ -31,7 +31,7 @@ public sealed class SsfdspIndicator : Indicator, IWatchlistIndicator
{ {
OnBackGround = true; OnBackGround = true;
SeparateWindow = true; SeparateWindow = true;
Name = "SSFDSP - SSF Detrended Synthetic Price"; Name = "SSFDSP - Ehlers SSF Detrended Synthetic Price";
Description = "Ehlers' Super Smooth Filter based Detrended Synthetic Price oscillator for cycle extraction"; Description = "Ehlers' Super Smooth Filter based Detrended Synthetic Price oscillator for cycle extraction";
_series = new LineSeries(name: "SSFDSP", color: IndicatorExtensions.Oscillators, width: 2, style: LineStyle.Solid); _series = new LineSeries(name: "SSFDSP", color: IndicatorExtensions.Oscillators, width: 2, style: LineStyle.Solid);
+1 -1
View File
@@ -1,4 +1,4 @@
# SSFDSP: SSF-Based Detrended Synthetic Price # SSFDSP: Ehlers SSF Detrended Synthetic Price
> "The Super-Smoother filter provides Butterworth-quality noise rejection—combine two of them and you isolate cycles with surgical precision." > "The Super-Smoother filter provides Butterworth-quality noise rejection—combine two of them and you isolate cycles with surgical precision."
+1 -1
View File
@@ -1,7 +1,7 @@
// The MIT License (MIT) // The MIT License (MIT)
// © mihakralj // © mihakralj
//@version=6 //@version=6
indicator("SSF-Based Detrended Synthetic Price", "SSF-DSP", overlay=false) indicator("Ehlers SSF Detrended Synthetic Price (SSFDSP)", "SSF-DSP", overlay=false)
//@function Calculates SSF-based Detrended Synthetic Price using dual Super Smooth Filters //@function Calculates SSF-based Detrended Synthetic Price using dual Super Smooth Filters
//@param source Series to detrend //@param source Series to detrend
+1 -1
View File
@@ -17,7 +17,7 @@ Dynamics indicators measure trend strength, speed, and direction. Unlike momentu
| [CHOP](chop/Chop.md) | Choppiness Index | Trendiness measure. High values = choppy. Low = trending. | | [CHOP](chop/Chop.md) | Choppiness Index | Trendiness measure. High values = choppy. Low = trending. |
| [DMX](dmx/Dmx.md) | Jurik DMX | Smoothed bipolar DMI using Jurik smoothing. Low noise. | | [DMX](dmx/Dmx.md) | Jurik DMX | Smoothed bipolar DMI using Jurik smoothing. Low noise. |
| [DX](dx/Dx.md) | Directional Movement Index | Raw directional strength. Unsmoothed ADX component. | | [DX](dx/Dx.md) | Directional Movement Index | Raw directional strength. Unsmoothed ADX component. |
| [HT_TRENDMODE](ht_trendmode/Ht_trendmode.md) | HT Trend vs Cycle | Ehlers Hilbert Transform. Binary trend/cycle mode detection. | | [HT_TRENDMODE](ht_trendmode/Ht_trendmode.md) | Ehlers Hilbert Transform Trend vs Cycle Mode | Ehlers Hilbert Transform. Binary trend/cycle mode detection. |
| [ICHIMOKU](ichimoku/Ichimoku.md) | Ichimoku Cloud | Five-line system. Cloud defines support/resistance zones. | | [ICHIMOKU](ichimoku/Ichimoku.md) | Ichimoku Cloud | Five-line system. Cloud defines support/resistance zones. |
| [IMI](imi/Imi.md) | Intraday Momentum Index | RSI variant using open-close range. Intraday overbought/oversold. | | [IMI](imi/Imi.md) | Intraday Momentum Index | RSI variant using open-close range. Intraday overbought/oversold. |
| [IMPULSE](impulse/Impulse.md) | Elder Impulse System | EMA + MACD histogram alignment. Color-coded trend/momentum filter. | | [IMPULSE](impulse/Impulse.md) | Elder Impulse System | EMA + MACD histogram alignment. Color-coded trend/momentum filter. |
@@ -12,7 +12,7 @@ public class HtTrendmodeIndicatorTests
Assert.Equal(SourceType.Close, indicator.SourceInput); Assert.Equal(SourceType.Close, indicator.SourceInput);
Assert.True(indicator.ShowColdValues); Assert.True(indicator.ShowColdValues);
Assert.Equal("HT_TRENDMODE - Hilbert Transform Trend Mode", indicator.Name); Assert.Equal("HT_TRENDMODE - Ehlers Hilbert Transform Trend vs Cycle Mode", indicator.Name);
Assert.True(indicator.SeparateWindow); Assert.True(indicator.SeparateWindow);
Assert.True(indicator.OnBackGround); Assert.True(indicator.OnBackGround);
} }
@@ -26,8 +26,8 @@ public sealed class HtTrendmodeIndicator : Indicator, IWatchlistIndicator
{ {
OnBackGround = true; OnBackGround = true;
SeparateWindow = true; SeparateWindow = true;
Name = "HT_TRENDMODE - Hilbert Transform Trend Mode"; Name = "HT_TRENDMODE - Ehlers Hilbert Transform Trend vs Cycle Mode";
Description = "Determines if market is trending (1) or cycling (0)"; Description = "Ehlers Hilbert Transform — determines if market is trending (1) or cycling (0)";
_trendModeSeries = new LineSeries(name: "TrendMode", color: Color.Blue, width: 3, style: LineStyle.Solid); _trendModeSeries = new LineSeries(name: "TrendMode", color: Color.Blue, width: 3, style: LineStyle.Solid);
AddLineSeries(_trendModeSeries); AddLineSeries(_trendModeSeries);
+1 -1
View File
@@ -1,4 +1,4 @@
# HT_TRENDMODE: Hilbert Transform Trend Mode # HT_TRENDMODE: Ehlers Hilbert Transform Trend vs Cycle Mode
## Historical Context ## Historical Context
+1 -1
View File
@@ -1,7 +1,7 @@
// The MIT License (MIT) // The MIT License (MIT)
// © mihakralj // © mihakralj
//@version=6 //@version=6
indicator("HT_TRENDMODE: Hilbert Transform Trend Mode (TA-Lib)", "HT_TRENDMODE", overlay=false) indicator("Ehlers Hilbert Transform Trend vs Cycle Mode (HT_TRENDMODE)", "HT_TRENDMODE", overlay=false)
//@function Determines if market is in trend mode (1) or cycle mode (0) using TA-Lib's Ehlers algorithm //@function Determines if market is in trend mode (1) or cycle mode (0) using TA-Lib's Ehlers algorithm
//@param source Series to analyze for trend/cycle state //@param source Series to analyze for trend/cycle state
+10 -10
View File
@@ -8,34 +8,34 @@ Signal processing filters adapted for financial time series. These are not indic
| Indicator | Full Name | Description | | Indicator | Full Name | Description |
| :--- | :--- | :--- | | :--- | :--- | :--- |
| [AGC](agc/Agc.md) | Automatic Gain Control | Ehlers. Amplitude normalization via exponential peak tracking. | | [AGC](agc/Agc.md) | Ehlers 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. | | [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. | | [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. | | [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. | | [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. | | [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. | | [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. | | [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. | | [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. | | [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. | | [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. | | [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. | | [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. | | [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. | | [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. | | [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. | | [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. | | [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). | | [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. | | [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). | | [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. | | [SPBF](spbf/Spbf.md) | Ehlers 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. | | [SSF](ssf/Ssf.md) | Ehlers Super Smoother Filter | Ehlers. 2-pole Butterworth variant. Standard cycle pre-filter. |
| [USF](usf/Usf.md) | Ultra Smoother | Ehlers. 3-pole variant. More smoothing than SSF. | | [USF](usf/Usf.md) | Ehlers Ultimate Smoother Filter | Ehlers. 3-pole variant. More smoothing than SSF. |
| [VOSS](voss/Voss.md) | Voss Predictive Filter | Ehlers. BPF + negative group delay predictor. Anticipatory cycle extraction. | | [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. | | [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. | | [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(0.991, indicator.Decay);
Assert.Equal(SourceType.Close, indicator.Source); Assert.Equal(SourceType.Close, indicator.Source);
Assert.True(indicator.ShowColdValues); 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.SeparateWindow);
Assert.True(indicator.OnBackGround); Assert.True(indicator.OnBackGround);
} }
+2 -2
View File
@@ -31,8 +31,8 @@ public sealed class AgcIndicator : Indicator, IWatchlistIndicator
{ {
OnBackGround = true; OnBackGround = true;
SeparateWindow = true; SeparateWindow = true;
Name = "AGC - Automatic Gain Control"; Name = "AGC - Ehlers Automatic Gain Control";
Description = "Ehlers AGC: amplitude normalization via exponential peak tracking, applied after Roofing filter"; 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); _series = new LineSeries(name: $"AGC {Decay:F3}", color: Color.Blue, width: 2, style: LineStyle.Solid);
AddLineSeries(_series); 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 > "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 // © mihakralj
//@version=6 //@version=6
// Indicator algorithm (C) 2015 John F. Ehlers // 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 //@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) //@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(5, indicator.MedianLength);
Assert.Equal(SourceType.Close, indicator.Source); Assert.Equal(SourceType.Close, indicator.Source);
Assert.True(indicator.ShowColdValues); 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.False(indicator.SeparateWindow);
Assert.True(indicator.OnBackGround); Assert.True(indicator.OnBackGround);
} }
+2 -2
View File
@@ -34,8 +34,8 @@ public class ALaguerreIndicator : Indicator, IWatchlistIndicator
OnBackGround = true; OnBackGround = true;
SeparateWindow = false; SeparateWindow = false;
SourceName = Source.ToString(); SourceName = Source.ToString();
Name = "ALAGUERRE - Adaptive Laguerre Filter (Ehlers)"; Name = "ALAGUERRE - Ehlers Adaptive Laguerre Filter";
Description = "Adaptive variant of Laguerre Filter with variable alpha from tracking-error normalization and median smoothing"; 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); Series = new LineSeries(name: $"ALaguerre {Length},{MedianLength}", color: IndicatorExtensions.Averages, width: 2, style: LineStyle.Solid);
AddLineSeries(Series); 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) > "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 // © mihakralj
//@version=6 //@version=6
// Indicator algorithm (C) 2004 John F. Ehlers // 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 //@function Calculates Adaptive Laguerre Filter with variable alpha from tracking error
//@param source Series to calculate Adaptive Laguerre filter from //@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.Equal(14, indicator.Period);
Assert.True(indicator.ShowColdValues); Assert.True(indicator.ShowColdValues);
Assert.Equal("BUTTER - Butterworth Filter", indicator.Name); Assert.Equal("BUTTER - Ehlers Butterworth Filter", indicator.Name);
Assert.False(indicator.SeparateWindow); Assert.False(indicator.SeparateWindow);
Assert.Equal(SourceType.Close, indicator.Source); Assert.Equal(SourceType.Close, indicator.Source);
} }
+2 -2
View File
@@ -32,8 +32,8 @@ public class ButterIndicator : Indicator, IWatchlistIndicator
OnBackGround = true; OnBackGround = true;
SeparateWindow = false; SeparateWindow = false;
SourceName = Source.ToString(); SourceName = Source.ToString();
Name = "BUTTER - Butterworth Filter"; Name = "BUTTER - Ehlers Butterworth Filter";
Description = "A 2nd-order low-pass filter with maximally flat frequency response in the passband."; 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); _series = new LineSeries(name: $"BUTTER {Period}", color: IndicatorExtensions.Averages, width: 2, style: LineStyle.Solid);
AddLineSeries(_series); AddLineSeries(_series);
} }
+1 -1
View File
@@ -1,4 +1,4 @@
# BUTTER: Butterworth Filter # BUTTER: Ehlers Butterworth Filter
> "Maximally flat frequency response in the passband." > "Maximally flat frequency response in the passband."
+1 -1
View File
@@ -1,7 +1,7 @@
// The MIT License (MIT) // The MIT License (MIT)
// © mihakralj // © mihakralj
//@version=6 //@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 //@function Calculates 2nd Order Butterworth Lowpass Filter
//@param src Series to calculate Butterworth filter from //@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 ## Overview
+1 -1
View File
@@ -12,7 +12,7 @@ public class HpfIndicatorTests
Assert.Equal(40, indicator.Length); Assert.Equal(40, indicator.Length);
Assert.Equal(SourceType.Close, indicator.Source); Assert.Equal(SourceType.Close, indicator.Source);
Assert.True(indicator.ShowColdValues); 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.False(indicator.SeparateWindow);
Assert.True(indicator.OnBackGround); Assert.True(indicator.OnBackGround);
} }
+2 -2
View File
@@ -30,8 +30,8 @@ public class HpfIndicator : Indicator, IWatchlistIndicator
{ {
OnBackGround = true; OnBackGround = true;
SeparateWindow = false; SeparateWindow = false;
Name = "HPF - Highpass Filter (2-Pole)"; Name = "HPF - Ehlers Highpass Filter";
Description = "2-Pole Infinite Impulse Response (IIR) 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); _series = new LineSeries(name: $"HPF {Length}", color: IndicatorExtensions.Statistics, width: 2, style: LineStyle.Solid);
AddLineSeries(_series); 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." > "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) // The MIT License (MIT)
// © mihakralj // © mihakralj
//@version=6 //@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 //@function Calculates 2-Pole Highpass Filter
//@param src Series to calculate HPF from //@param src Series to calculate HPF from
@@ -12,7 +12,7 @@ public class LaguerreIndicatorTests
Assert.Equal(0.8, indicator.Gamma); Assert.Equal(0.8, indicator.Gamma);
Assert.Equal(SourceType.Close, indicator.Source); Assert.Equal(SourceType.Close, indicator.Source);
Assert.True(indicator.ShowColdValues); 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.False(indicator.SeparateWindow);
Assert.True(indicator.OnBackGround); Assert.True(indicator.OnBackGround);
} }
+2 -2
View File
@@ -31,8 +31,8 @@ public class LaguerreIndicator : Indicator, IWatchlistIndicator
OnBackGround = true; OnBackGround = true;
SeparateWindow = false; SeparateWindow = false;
SourceName = Source.ToString(); SourceName = Source.ToString();
Name = "LAGUERRE - Laguerre Filter (Ehlers)"; Name = "LAGUERRE - Ehlers Laguerre Filter";
Description = "Four-element IIR filter with cascaded all-pass sections and gamma damping factor"; 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); Series = new LineSeries(name: $"Laguerre {Gamma:F2}", color: IndicatorExtensions.Averages, width: 2, style: LineStyle.Solid);
AddLineSeries(Series); 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 > "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 // © mihakralj
//@version=6 //@version=6
// Indicator algorithm (C) 2004 John F. Ehlers // 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 //@function Calculates Laguerre Filter using 4 cascaded all-pass IIR elements
//@param source Series to calculate Laguerre filter from //@param source Series to calculate Laguerre filter from
+1 -1
View File
@@ -2,7 +2,7 @@
// © mihakralj // © mihakralj
//@version=6 //@version=6
// Indicator algorithm (C) 2004-2024 John F. Ehlers // 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) //@function Calculates Ehlers Roofing Filter (2-pole HPF → Super Smoother composite)
//@param source Series to calculate Roofing Filter from //@param source Series to calculate Roofing Filter from
+1 -1
View File
@@ -2,7 +2,7 @@
// © mihakralj // © mihakralj
//@version=6 //@version=6
// Indicator algorithm (C) 2016 John F. Ehlers // 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 //@function Ehlers Super Passband Filter — wide-band bandpass via differenced z-transformed EMAs
//@param source Series to filter //@param source Series to filter
+1 -1
View File
@@ -12,7 +12,7 @@ public class SsfIndicatorTests
Assert.Equal(10, indicator.Period); Assert.Equal(10, indicator.Period);
Assert.Equal(SourceType.Close, indicator.Source); Assert.Equal(SourceType.Close, indicator.Source);
Assert.True(indicator.ShowColdValues); 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.False(indicator.SeparateWindow);
Assert.True(indicator.OnBackGround); Assert.True(indicator.OnBackGround);
} }
+2 -2
View File
@@ -30,8 +30,8 @@ public sealed class SsfIndicator : Indicator, IWatchlistIndicator
{ {
OnBackGround = true; OnBackGround = true;
SeparateWindow = false; SeparateWindow = false;
Name = "SSF - Super Smooth Filter"; Name = "SSF - Ehlers Super Smoother Filter";
Description = "Ehlers Super Smooth 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); _series = new LineSeries(name: $"SSF {Period}", color: IndicatorExtensions.Averages, width: 2, style: LineStyle.Solid);
AddLineSeries(_series); 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." > "Noise is the enemy of the trend follower. The Super Smooth Filter is the silencer."
+1 -1
View File
@@ -2,7 +2,7 @@
// © mihakralj // © mihakralj
//@version=6 //@version=6
// Indicator algorithm (C) 2004-2024 John F. Ehlers // 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 //@function Calculates Supersmooth Lowpass Filter
//@param source Series to calculate SSF from //@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(20, indicator.Period);
Assert.Equal(SourceType.Close, indicator.Source); Assert.Equal(SourceType.Close, indicator.Source);
Assert.True(indicator.ShowColdValues); 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.False(indicator.SeparateWindow);
Assert.True(indicator.OnBackGround); Assert.True(indicator.OnBackGround);
} }
+2 -2
View File
@@ -30,8 +30,8 @@ public sealed class UsfIndicator : Indicator, IWatchlistIndicator
{ {
OnBackGround = true; OnBackGround = true;
SeparateWindow = false; SeparateWindow = false;
Name = "USF - Ultimate Smoother Filter"; Name = "USF - Ehlers Ultimate Smoother Filter";
Description = "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); _series = new LineSeries(name: $"USF {Period}", color: IndicatorExtensions.Averages, width: 2, style: LineStyle.Solid);
AddLineSeries(_series); 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." > "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) // The MIT License (MIT)
// © mihakralj // © mihakralj
//@version=6 //@version=6
indicator("Ultrasmooth Filter (USF)", "USF", overlay=true) indicator("Ehlers Ultimate Smoother Filter (USF)", "USF", overlay=true)
//@function Calculates Ultrasmooth Filter //@function Calculates Ultrasmooth Filter
//@param src Series to calculate USF from //@param src Series to calculate USF from
+1 -1
View File
@@ -1,7 +1,7 @@
// The MIT License (MIT) // The MIT License (MIT)
// © mihakralj // © mihakralj
//@version=6 //@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 //@function Ehlers Voss Predictive Filter — negative group delay bandpass predictor
//@param source Series to filter //@param source Series to filter
+2 -1
View File
@@ -12,8 +12,9 @@ Oscillators fluctuate above and below a centerline or within bounded ranges. Use
| [BBB](bbb/Bbb.md) | Bollinger %B | Position within Bollinger Bands. 0=lower band, 1=upper band. | | [BBB](bbb/Bbb.md) | Bollinger %B | Position within Bollinger Bands. 0=lower band, 1=upper band. |
| [BBS](bbs/Bbs.md) | Bollinger Band Squeeze | BB width < KC width indicates consolidation. Breakout imminent. | | [BBS](bbs/Bbs.md) | Bollinger Band Squeeze | BB width < KC width indicates consolidation. Breakout imminent. |
| [CFO](cfo/Cfo.md) | Chande Forecast Oscillator | Percentage difference between price and linear regression forecast. | | [CFO](cfo/Cfo.md) | Chande Forecast Oscillator | Percentage difference between price and linear regression forecast. |
| [DECO](deco/Deco.md) | Ehlers Decycler Oscillator | Dual HP bandpass isolating intermediate-frequency market cycles. |
| [DPO](dpo/Dpo.md) | Detrended Price Oscillator | Removes trend via displaced SMA. Reveals cycles. | | [DPO](dpo/Dpo.md) | Detrended Price Oscillator | Removes trend via displaced SMA. Reveals cycles. |
| [FISHER](fisher/Fisher.md) | Fisher Transform | Converts prices to Gaussian distribution. Sharp reversals. | | [FISHER](fisher/Fisher.md) | Ehlers Fisher Transform | Converts prices to Gaussian distribution. Sharp reversals. |
| [INERTIA](inertia/Inertia.md) | Inertia | Linear regression residual. Raw deviation from trend forecast. | | [INERTIA](inertia/Inertia.md) | Inertia | Linear regression residual. Raw deviation from trend forecast. |
| [KDJ](kdj/Kdj.md) | KDJ Indicator | Enhanced Stochastic. J = 3K - 2D provides leading signal. | | [KDJ](kdj/Kdj.md) | KDJ Indicator | Enhanced Stochastic. J = 3K - 2D provides leading signal. |
| [PGO](pgo/Pgo.md) | Pretty Good Oscillator | Distance from SMA normalized by ATR. Units: ATR multiples. | | [PGO](pgo/Pgo.md) | Pretty Good Oscillator | Distance from SMA normalized by ATR. Units: ATR multiples. |
@@ -0,0 +1,142 @@
using TradingPlatform.BusinessLayer;
namespace QuanTAlib.Tests;
public sealed class DecoIndicatorTests
{
[Fact]
public void DecoIndicator_Constructor_SetsDefaults()
{
var indicator = new DecoIndicator();
Assert.Equal(30, indicator.ShortPeriod);
Assert.Equal(60, indicator.LongPeriod);
Assert.Equal(SourceType.Close, indicator.Source);
Assert.True(indicator.ShowColdValues);
Assert.Equal("DECO - Ehlers Decycler Oscillator", indicator.Name);
Assert.True(indicator.SeparateWindow);
Assert.True(indicator.OnBackGround);
}
[Fact]
public void DecoIndicator_MinHistoryDepths_EqualsZero()
{
var indicator = new DecoIndicator { ShortPeriod = 10, LongPeriod = 20 };
Assert.Equal(0, DecoIndicator.MinHistoryDepths);
IWatchlistIndicator watchlistIndicator = indicator;
Assert.Equal(0, watchlistIndicator.MinHistoryDepths);
}
[Fact]
public void DecoIndicator_ShortName_IncludesParameters()
{
var indicator = new DecoIndicator { ShortPeriod = 10, LongPeriod = 30 };
indicator.Initialize();
Assert.Contains("DECO", indicator.ShortName, StringComparison.Ordinal);
Assert.Contains("10", indicator.ShortName, StringComparison.Ordinal);
Assert.Contains("30", indicator.ShortName, StringComparison.Ordinal);
}
[Fact]
public void DecoIndicator_SourceCodeLink_IsValid()
{
var indicator = new DecoIndicator();
Assert.Contains("github.com", indicator.SourceCodeLink, StringComparison.Ordinal);
Assert.Contains("Deco.Quantower.cs", indicator.SourceCodeLink, StringComparison.Ordinal);
}
[Fact]
public void DecoIndicator_Initialize_CreatesInternalDeco()
{
var indicator = new DecoIndicator { ShortPeriod = 5, LongPeriod = 10 };
indicator.Initialize();
Assert.Single(indicator.LinesSeries);
}
[Fact]
public void DecoIndicator_ProcessUpdate_HistoricalBar_ComputesValue()
{
var indicator = new DecoIndicator { ShortPeriod = 5, LongPeriod = 10 };
indicator.Initialize();
var now = DateTime.UtcNow;
for (int i = 0; i < 20; i++)
{
indicator.HistoricalData.AddBar(now.AddMinutes(i), 100 + i, 110 + i, 90 + i, 105 + i);
var args = new UpdateArgs(UpdateReason.HistoricalBar);
indicator.ProcessUpdate(args);
}
double value = indicator.LinesSeries[0].GetValue(0);
Assert.True(double.IsFinite(value));
}
[Fact]
public void DecoIndicator_ProcessUpdate_NewBar_ComputesValue()
{
var indicator = new DecoIndicator { ShortPeriod = 5, LongPeriod = 10 };
indicator.Initialize();
var now = DateTime.UtcNow;
for (int i = 0; i < 20; i++)
{
indicator.HistoricalData.AddBar(now.AddMinutes(i), 100 + i, 110 + i, 90 + i, 105 + i);
var args = new UpdateArgs(UpdateReason.HistoricalBar);
indicator.ProcessUpdate(args);
}
// Add a new bar
indicator.HistoricalData.AddBar(now.AddMinutes(20), 120, 130, 110, 125);
var newArgs = new UpdateArgs(UpdateReason.NewBar);
indicator.ProcessUpdate(newArgs);
double value = indicator.LinesSeries[0].GetValue(0);
Assert.True(double.IsFinite(value));
}
[Fact]
public void DecoIndicator_ProcessUpdate_DifferentSources()
{
foreach (SourceType source in new[] { SourceType.Close, SourceType.Open, SourceType.High, SourceType.Low })
{
var indicator = new DecoIndicator { ShortPeriod = 5, LongPeriod = 10, Source = source };
indicator.Initialize();
var now = DateTime.UtcNow;
for (int i = 0; i < 15; i++)
{
indicator.HistoricalData.AddBar(now.AddMinutes(i), 100 + i, 110 + i, 90 + i, 105 + i);
var args = new UpdateArgs(UpdateReason.HistoricalBar);
indicator.ProcessUpdate(args);
}
double value = indicator.LinesSeries[0].GetValue(0);
Assert.True(double.IsFinite(value), $"Source {source} produced non-finite value");
}
}
[Fact]
public void DecoIndicator_Reinitialize_ResetsState()
{
var indicator = new DecoIndicator { ShortPeriod = 5, LongPeriod = 10 };
indicator.Initialize();
var now = DateTime.UtcNow;
for (int i = 0; i < 15; i++)
{
indicator.HistoricalData.AddBar(now.AddMinutes(i), 100 + i, 110 + i, 90 + i, 105 + i);
var args = new UpdateArgs(UpdateReason.HistoricalBar);
indicator.ProcessUpdate(args);
}
// Re-initialize should reset
indicator.Initialize();
Assert.Single(indicator.LinesSeries);
}
}
+66
View File
@@ -0,0 +1,66 @@
using System.Drawing;
using System.Runtime.CompilerServices;
using TradingPlatform.BusinessLayer;
namespace QuanTAlib;
[SkipLocalsInit]
public sealed class DecoIndicator : Indicator, IWatchlistIndicator
{
[InputParameter("Short Period", sortIndex: 1, 1, 1000, 1, 0)]
public int ShortPeriod { get; set; } = 30;
[InputParameter("Long Period", sortIndex: 2, 2, 2000, 1, 0)]
public int LongPeriod { get; set; } = 60;
[IndicatorExtensions.DataSourceInput(sortIndex: 3)]
public SourceType Source { get; set; } = SourceType.Close;
[InputParameter("Show cold values", sortIndex: 21)]
public bool ShowColdValues { get; set; } = true;
private Deco _deco = null!;
private readonly LineSeries _series;
public static int MinHistoryDepths => 0;
int IWatchlistIndicator.MinHistoryDepths => MinHistoryDepths;
public override string ShortName => $"DECO ({ShortPeriod},{LongPeriod})";
public override string SourceCodeLink => "https://github.com/mihakralj/QuanTAlib/blob/main/lib/oscillators/deco/Deco.Quantower.cs";
public DecoIndicator()
{
OnBackGround = true;
SeparateWindow = true;
Name = "DECO - Ehlers Decycler Oscillator";
Description = "Ehlers' Decycler Oscillator isolates intermediate cycles via dual HP filters";
_series = new LineSeries("DECO", Color.Yellow, 2, LineStyle.Solid);
AddLineSeries(_series);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
protected override void OnInit()
{
_deco = new Deco(ShortPeriod, LongPeriod);
base.OnInit();
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
protected override void OnUpdate(UpdateArgs args)
{
var priceSelector = Source.GetPriceSelector();
var item = HistoricalData[0, SeekOriginHistory.End];
double price = priceSelector(item);
TValue input = new(item.TimeLeft, price);
TValue result = _deco.Update(input, args.IsNewBar());
if (!_deco.IsHot && !ShowColdValues)
{
return;
}
_series.SetValue(result.Value);
}
}
+391
View File
@@ -0,0 +1,391 @@
namespace QuanTAlib;
public class DecoTests
{
private const double Tolerance = 1e-10;
// ── A) Constructor validation ──
[Fact]
public void Constructor_DefaultParameters_SetsCorrectly()
{
var deco = new Deco();
Assert.Equal("Deco(30,60)", deco.Name);
Assert.Equal(30, deco.ShortPeriod);
Assert.Equal(60, deco.LongPeriod);
Assert.Equal(60, deco.WarmupPeriod);
}
[Fact]
public void Constructor_CustomParameters_SetsCorrectly()
{
var deco = new Deco(shortPeriod: 10, longPeriod: 40);
Assert.Equal("Deco(10,40)", deco.Name);
Assert.Equal(10, deco.ShortPeriod);
Assert.Equal(40, deco.LongPeriod);
}
[Fact]
public void Constructor_ZeroShortPeriod_Throws()
{
var ex = Assert.Throws<ArgumentException>(() => new Deco(shortPeriod: 0));
Assert.Equal("shortPeriod", ex.ParamName);
}
[Fact]
public void Constructor_NegativeShortPeriod_Throws()
{
var ex = Assert.Throws<ArgumentException>(() => new Deco(shortPeriod: -1));
Assert.Equal("shortPeriod", ex.ParamName);
}
[Fact]
public void Constructor_LongNotGreaterThanShort_Throws()
{
var ex = Assert.Throws<ArgumentException>(() => new Deco(shortPeriod: 30, longPeriod: 30));
Assert.Equal("longPeriod", ex.ParamName);
}
[Fact]
public void Constructor_LongLessThanShort_Throws()
{
var ex = Assert.Throws<ArgumentException>(() => new Deco(shortPeriod: 30, longPeriod: 20));
Assert.Equal("longPeriod", ex.ParamName);
}
// ── B) Basic calculation ──
[Fact]
public void Update_ReturnsFiniteValue()
{
var deco = new Deco(5, 10);
TValue result = default;
for (int i = 0; i < 20; i++)
{
result = deco.Update(new TValue(DateTime.UtcNow.AddSeconds(i), 100.0 + i));
}
Assert.True(double.IsFinite(result.Value));
}
[Fact]
public void Update_Last_MatchesReturnValue()
{
var deco = new Deco(5, 10);
var result = deco.Update(new TValue(DateTime.UtcNow, 100.0));
Assert.Equal(result.Value, deco.Last.Value);
}
[Fact]
public void Update_Name_AccessibleAfterUpdate()
{
var deco = new Deco(5, 10);
_ = deco.Update(new TValue(DateTime.UtcNow, 100.0));
Assert.Contains("Deco", deco.Name, StringComparison.Ordinal);
}
[Fact]
public void Update_FirstTwoBars_ReturnZero()
{
var deco = new Deco(5, 10);
var r0 = deco.Update(new TValue(DateTime.UtcNow, 100.0));
var r1 = deco.Update(new TValue(DateTime.UtcNow.AddSeconds(1), 101.0));
Assert.Equal(0.0, r0.Value);
Assert.Equal(0.0, r1.Value);
}
// ── C) State + bar correction ──
[Fact]
public void Update_IsNew_True_AdvancesState()
{
var deco = new Deco(5, 10);
var r1 = deco.Update(new TValue(DateTime.UtcNow, 100.0), isNew: true);
var r2 = deco.Update(new TValue(DateTime.UtcNow.AddSeconds(1), 101.0), isNew: true);
Assert.True(double.IsFinite(r1.Value));
Assert.True(double.IsFinite(r2.Value));
}
[Fact]
public void Update_IsNew_False_RewritesLastBar()
{
var deco = new Deco(5, 10);
for (int i = 0; i < 10; i++)
{
deco.Update(new TValue(DateTime.UtcNow.AddSeconds(i), 100.0 + i), isNew: true);
}
var before = deco.Update(new TValue(DateTime.UtcNow.AddSeconds(10), 120.0), isNew: true);
var correction = deco.Update(new TValue(DateTime.UtcNow.AddSeconds(10), 115.0), isNew: false);
Assert.NotEqual(before.Value, correction.Value);
}
[Fact]
public void Update_IterativeCorrections_RestoreState()
{
var deco = new Deco(5, 10);
for (int i = 0; i < 10; i++)
{
deco.Update(new TValue(DateTime.UtcNow.AddSeconds(i), 100.0 + i), isNew: true);
}
_ = deco.Update(new TValue(DateTime.UtcNow.AddSeconds(10), 120.0), isNew: true);
var restored = deco.Update(new TValue(DateTime.UtcNow.AddSeconds(10), 110.0), isNew: false);
var again = deco.Update(new TValue(DateTime.UtcNow.AddSeconds(10), 110.0), isNew: false);
Assert.Equal(restored.Value, again.Value, Tolerance);
}
[Fact]
public void Reset_ClearsState()
{
var deco = new Deco(5, 10);
for (int i = 0; i < 20; i++)
{
deco.Update(new TValue(DateTime.UtcNow.AddSeconds(i), 100.0 + i));
}
deco.Reset();
Assert.False(deco.IsHot);
Assert.Equal(0.0, deco.Last.Value);
}
// ── D) Warmup / convergence ──
[Fact]
public void IsHot_FlipsWhenWarmupReached()
{
var deco = new Deco(5, 10);
for (int i = 0; i < 9; i++)
{
deco.Update(new TValue(DateTime.UtcNow.AddSeconds(i), 100.0 + i));
Assert.False(deco.IsHot);
}
deco.Update(new TValue(DateTime.UtcNow.AddSeconds(10), 110.0));
Assert.True(deco.IsHot);
}
[Fact]
public void WarmupPeriod_EqualsLongPeriod()
{
var deco = new Deco(20, 60);
Assert.Equal(60, deco.WarmupPeriod);
}
// ── E) Robustness ──
[Fact]
public void Update_NaN_UsesLastValidValue()
{
var deco = new Deco(5, 10);
for (int i = 0; i < 5; i++)
{
deco.Update(new TValue(DateTime.UtcNow.AddSeconds(i), 100.0 + i));
}
var result = deco.Update(new TValue(DateTime.UtcNow.AddSeconds(5), double.NaN));
Assert.True(double.IsFinite(result.Value));
}
[Fact]
public void Update_Infinity_UsesLastValidValue()
{
var deco = new Deco(5, 10);
for (int i = 0; i < 5; i++)
{
deco.Update(new TValue(DateTime.UtcNow.AddSeconds(i), 100.0 + i));
}
var result = deco.Update(new TValue(DateTime.UtcNow.AddSeconds(5), double.PositiveInfinity));
Assert.True(double.IsFinite(result.Value));
}
[Fact]
public void Batch_NaN_Safe()
{
double[] src = [100, 101, double.NaN, 103, 104, 105, 106, 107, 108, 109];
double[] output = new double[src.Length];
Deco.Batch(src, output, 3, 6);
for (int i = 0; i < output.Length; i++)
{
Assert.True(double.IsFinite(output[i]));
}
}
// ── F) Consistency (4 modes match) ──
[Fact]
public void AllModes_ProduceSameResults()
{
int shortP = 10, longP = 20;
var gbm = new GBM(startPrice: 100.0, mu: 0.02, sigma: 0.1, seed: 42);
var bars = gbm.Fetch(500, DateTime.UtcNow.Ticks, TimeSpan.FromMinutes(1));
TSeries source = bars.Close;
// 1. Streaming
var streaming = new Deco(shortP, longP);
var streamResults = new double[source.Count];
for (int i = 0; i < source.Count; i++)
{
streamResults[i] = streaming.Update(source[i]).Value;
}
// 2. Batch TSeries
TSeries batchSeries = Deco.Batch(source, shortP, longP);
// 3. Batch Span
var spanOutput = new double[source.Count];
Deco.Batch(source.Values, spanOutput, shortP, longP);
// 4. Event-based
var eventSource = new TSeries();
var eventIndicator = new Deco(eventSource, shortP, longP);
var eventResults = new double[source.Count];
for (int i = 0; i < source.Count; i++)
{
eventSource.Add(source[i]);
eventResults[i] = eventIndicator.Last.Value;
}
for (int i = 0; i < source.Count; i++)
{
Assert.Equal(streamResults[i], batchSeries.Values[i], Tolerance);
Assert.Equal(streamResults[i], spanOutput[i], Tolerance);
Assert.Equal(streamResults[i], eventResults[i], Tolerance);
}
}
// ── G) Span API tests ──
[Fact]
public void Batch_MismatchedLengths_Throws()
{
double[] src = [1, 2, 3];
double[] output = new double[2];
var ex = Assert.Throws<ArgumentException>(() => Deco.Batch(src, output, 1, 2));
Assert.Equal("output", ex.ParamName);
}
[Fact]
public void Batch_ZeroShortPeriod_Throws()
{
double[] src = [1, 2, 3];
double[] output = new double[3];
var ex = Assert.Throws<ArgumentException>(() => Deco.Batch(src, output, 0, 2));
Assert.Equal("shortPeriod", ex.ParamName);
}
[Fact]
public void Batch_LongNotGreater_Throws()
{
double[] src = [1, 2, 3];
double[] output = new double[3];
var ex = Assert.Throws<ArgumentException>(() => Deco.Batch(src, output, 5, 5));
Assert.Equal("longPeriod", ex.ParamName);
}
[Fact]
public void Batch_EmptyInput_NoOp()
{
double[] src = [];
double[] output = [];
var ex = Record.Exception(() => Deco.Batch(src, output, 5, 10));
Assert.Null(ex);
}
[Fact]
public void Batch_Span_MatchesTSeries()
{
var gbm = new GBM(startPrice: 100.0, mu: 0.02, sigma: 0.1, seed: 7);
var bars = gbm.Fetch(200, DateTime.UtcNow.Ticks, TimeSpan.FromMinutes(1));
TSeries source = bars.Close;
int shortP = 10, longP = 20;
TSeries batchTs = Deco.Batch(source, shortP, longP);
var spanOutput = new double[source.Count];
Deco.Batch(source.Values, spanOutput, shortP, longP);
for (int i = 0; i < source.Count; i++)
{
Assert.Equal(batchTs.Values[i], spanOutput[i], Tolerance);
}
}
// ── H) Chainability ──
[Fact]
public void PubEvent_FiresOnUpdate()
{
var deco = new Deco(5, 10);
int firedCount = 0;
deco.Pub += (object? _, in TValueEventArgs _) => firedCount++;
deco.Update(new TValue(DateTime.UtcNow, 100.0));
Assert.Equal(1, firedCount);
}
[Fact]
public void Chained_Constructor_ReceivesEvents()
{
var src = new TSeries();
var deco = new Deco(src, 5, 10);
src.Add(new TValue(DateTime.UtcNow, 100.0));
src.Add(new TValue(DateTime.UtcNow.AddSeconds(1), 101.0));
src.Add(new TValue(DateTime.UtcNow.AddSeconds(2), 102.0));
Assert.True(double.IsFinite(deco.Last.Value));
}
// ── Additional: Oscillator behavior ──
[Fact]
public void ConstantInput_ProducesZeroOutput()
{
var deco = new Deco(5, 10);
for (int i = 0; i < 30; i++)
{
var result = deco.Update(new TValue(DateTime.UtcNow.AddSeconds(i), 100.0));
if (i >= 2)
{
Assert.Equal(0.0, result.Value, Tolerance);
}
}
}
[Fact]
public void NonLinearInput_NonZeroOutput()
{
// Use quadratic input (non-zero second derivative) since HP filter
// removes linear trends (which have zero second derivative)
var deco = new Deco(5, 10);
TValue last = default;
for (int i = 0; i < 30; i++)
{
last = deco.Update(new TValue(DateTime.UtcNow.AddSeconds(i), 100.0 + i * i * 0.1));
}
Assert.NotEqual(0.0, last.Value);
}
[Fact]
public void Calculate_ReturnsResultsAndIndicator()
{
var gbm = new GBM(startPrice: 100.0, mu: 0.05, sigma: 0.2, seed: 99);
var bars = gbm.Fetch(50, DateTime.UtcNow.Ticks, TimeSpan.FromMinutes(1));
TSeries source = bars.Close;
var (results, indicator) = Deco.Calculate(source, 10, 20);
Assert.Equal(source.Count, results.Count);
Assert.True(indicator.IsHot);
}
[Fact]
public void Prime_InitializesState()
{
var deco = new Deco(5, 10);
double[] primeData = [100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111];
deco.Prime(primeData);
Assert.True(deco.IsHot);
}
}

Some files were not shown because too many files have changed in this diff Show More