mirror of
https://github.com/mihakralj/QuanTAlib.git
synced 2026-08-08 05:57:43 +00:00
feat(oscillators): add DSO - Ehlers Deviation-Scaled Oscillator
Implement DSO (TASC Oct 2018) with SSF 2-pole filter, RMS normalization, and Fisher Transform (±0.99 clamp). Sealed class, O(1) streaming RMS via RingBuffer, precomputed SSF coefficients. New files: Dso.cs, Dso.Quantower.cs, Dso.md, dso.pine, Dso.Tests.cs (27), Dso.Validation.Tests.cs (7), Dso.Quantower.Tests.cs (11) Updated: Exports.cs, _bridge.py, oscillators.py, SPEC.md, _sidebar.md, lib/_index.md, oscillators/_index.md, docs/indicators.md, docs/pinescript.md All 19,565 tests pass, 0 warnings.
This commit is contained in:
@@ -447,6 +447,7 @@ HAS_KRI = _bind("qtl_kri", [_dp, _ci, _dp, _ci])
|
||||
HAS_PSL = _bind("qtl_psl", [_dp, _ci, _dp, _ci])
|
||||
HAS_DECO = _bind("qtl_deco", [_dp, _ci, _dp, _ci, _ci])
|
||||
HAS_DOSC = _bind("qtl_dosc", [_dp, _ci, _dp, _ci, _ci, _ci, _ci])
|
||||
HAS_DSO = _bind("qtl_dso", [_dp, _ci, _dp, _ci])
|
||||
HAS_DYMI = _bind("qtl_dymi", [_dp, _ci, _dp, _ci, _ci, _ci, _ci, _ci])
|
||||
HAS_CRSI = _bind("qtl_crsi", [_dp, _ci, _dp, _ci, _ci, _ci])
|
||||
HAS_BBB = _bind("qtl_bbb", [_dp, _ci, _dp, _ci, _cd])
|
||||
|
||||
@@ -49,6 +49,7 @@ __all__ = [
|
||||
"psl",
|
||||
"deco",
|
||||
"dosc",
|
||||
"dso",
|
||||
"dymi",
|
||||
"crsi",
|
||||
"bbb",
|
||||
@@ -547,6 +548,14 @@ def dosc(close: object, rsi_period: int = 14, ema1_period: int = 5,
|
||||
return _wrap(dst, idx, f"DOSC_{rsi_period}", "oscillators", offset)
|
||||
|
||||
|
||||
def dso(close: object, period: int = 40, offset: int = 0, **kwargs) -> object:
|
||||
"""Ehlers Deviation-Scaled Oscillator."""
|
||||
period = int(kwargs.get("length", period)); offset = int(offset)
|
||||
src, idx = _arr(close); n = len(src); dst = _out(n)
|
||||
_check(_lib.qtl_dso(_ptr(src), n, _ptr(dst), period))
|
||||
return _wrap(dst, idx, f"DSO_{period}", "oscillators", offset)
|
||||
|
||||
|
||||
def dymi(close: object, base_period: int = 14, short_period: int = 5,
|
||||
long_period: int = 10, min_period: int = 3, max_period: int = 30,
|
||||
offset: int = 0, **kwargs) -> object:
|
||||
|
||||
Reference in New Issue
Block a user