mirror of
https://github.com/mihakralj/QuanTAlib.git
synced 2026-08-18 02:28:05 +00:00
feat(dynamics): add PlusDI, MinusDI, PlusDM, MinusDM indicators
Complete thin Dx-composition wrapper indicators with full test coverage: - PlusDi/MinusDi: Directional Indicator wrappers (DiPlus/DiMinus from Dx) - PlusDm/MinusDm: Directional Movement wrappers (DmPlus/DmMinus from Dx) - Individual validation tests per indicator directory (TALib, Skender, bounds) - Combined unit tests (DiDm.Tests.cs) and validation tests (DiDm.Validation.Tests.cs) - Quantower wrappers + tests for all 4 indicators - PineScript v6 implementations with compensated RMA - Normalized .md documentation for all indicators and categories - 182 tests passing, 0 failures
This commit is contained in:
@@ -0,0 +1,44 @@
|
||||
// Licensed under the Apache License, Version 2.0
|
||||
// © mihakralj
|
||||
//@version=6
|
||||
indicator("Minus Directional Movement (-DM)", "-DM", overlay=false)
|
||||
|
||||
//@function Calculates Wilder-smoothed -DM using compensated RMA
|
||||
//@param period Number of bars used in the calculation
|
||||
//@returns Smoothed -DM value in price units (≥0)
|
||||
//@optimized Uses Wilder's smoothing (RMA) with warmup compensation for accurate values from bar 1
|
||||
minusdm(simple int period) =>
|
||||
if period <= 0
|
||||
runtime.error("Period must be greater than 0")
|
||||
float alpha = 1.0 / period
|
||||
float beta = 1.0 - alpha
|
||||
float minus_dm = 0.0
|
||||
if not na(low[1])
|
||||
float upMove = high - high[1]
|
||||
float downMove = low[1] - low
|
||||
if downMove > upMove and downMove > 0
|
||||
minus_dm := downMove
|
||||
var bool warmup = true
|
||||
var float e = 1.0
|
||||
var float minus_dm_ema = 0.0
|
||||
var float minus_dm_result = minus_dm
|
||||
minus_dm_ema := alpha * (minus_dm - minus_dm_ema) + minus_dm_ema
|
||||
if warmup
|
||||
e *= beta
|
||||
float c = 1.0 / (1.0 - e)
|
||||
minus_dm_result := c * minus_dm_ema
|
||||
warmup := e > 1e-10
|
||||
else
|
||||
minus_dm_result := minus_dm_ema
|
||||
minus_dm_result
|
||||
|
||||
// ---------- Main loop ----------
|
||||
|
||||
// Inputs
|
||||
i_period = input.int(14, "Period", minval=1, tooltip="Number of bars used in the calculation")
|
||||
|
||||
// Calculation
|
||||
minus_dm_value = minusdm(i_period)
|
||||
|
||||
// Plot
|
||||
plot(minus_dm_value, "-DM", color=color.red, linewidth=2)
|
||||
Reference in New Issue
Block a user