mirror of
https://github.com/mihakralj/QuanTAlib.git
synced 2026-08-25 13:58:04 +00:00
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:
-77
@@ -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
@@ -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.
@@ -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/**"
|
|
||||||
# ==============================================
|
|
||||||
@@ -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
|
|
||||||
@@ -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($$$)
|
|
||||||
@@ -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
@@ -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/
|
||||||
|
|||||||
@@ -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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -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>
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
{
|
|
||||||
"sonarCloudOrganization": "mihakralj-quantalib",
|
|
||||||
"projectKey": "mihakralj_QuanTAlib",
|
|
||||||
"region": "EU"
|
|
||||||
}
|
|
||||||
@@ -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>
|
|
||||||
@@ -7,7 +7,7 @@
|
|||||||
[](https://www.nuget.org/packages/QuanTAlib/)
|
[](https://www.nuget.org/packages/QuanTAlib/)
|
||||||
[](https://dotnet.microsoft.com/en-us/download/dotnet)
|
[](https://dotnet.microsoft.com/en-us/download/dotnet)
|
||||||
|
|
||||||
[](lib/_index.md)
|
[](lib/_index.md)
|
||||||
[](ndepend/ndependout/ndependreport.html)
|
[](ndepend/ndependout/ndependreport.html)
|
||||||
[](ndepend/ndependout/ndependreport.html)
|
[](ndepend/ndependout/ndependreport.html)
|
||||||
[](ndepend/ndependout/ndependreport.html)
|
[](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
@@ -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
@@ -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
@@ -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
@@ -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 |
|
||||||
|
|||||||
@@ -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
@@ -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). |
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
@@ -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,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
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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,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,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,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
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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,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,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,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,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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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,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,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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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,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,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.
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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,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,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)
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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,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,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
|
||||||
|
|||||||
@@ -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,4 +1,4 @@
|
|||||||
# HT_TRENDMODE: Hilbert Transform Trend Mode
|
# HT_TRENDMODE: Ehlers Hilbert Transform Trend vs Cycle Mode
|
||||||
|
|
||||||
## Historical Context
|
## Historical Context
|
||||||
|
|
||||||
|
|||||||
@@ -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
@@ -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. |
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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,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
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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,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)
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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,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,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,4 +1,4 @@
|
|||||||
# EDCF — Ehlers Distance Coefficient Filter
|
# EDCF: Ehlers Distance Coefficient Filter
|
||||||
|
|
||||||
## Overview
|
## Overview
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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,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,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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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,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
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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,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."
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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,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,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,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
|
||||||
|
|||||||
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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
Reference in New Issue
Block a user