diff --git a/Source/Basics/ZL_Series.cs b/Source/Basics/ZL_Series.cs index c4843d19..04fc419d 100644 --- a/Source/Basics/ZL_Series.cs +++ b/Source/Basics/ZL_Series.cs @@ -3,12 +3,12 @@ using System; /* ZL: Zero Lag - Data is de-lagged by removing the data from “lag” days ago, thus removing + Data is de-lagged by removing the data from “lag” days ago, thus removing (or attempting to) the cumulative effect of the moving average. Calculation: Lag = (Period-1)/2 - ZL = Data + (Data - Data(Lag days ago) ) + ZL = Data + (Data - Data(Lag days ago) ) Sources: https://mudrex.com/blog/zero-lag-ema-trading-strategy/ @@ -24,7 +24,7 @@ public class ZL_Series : Single_TSeries_Indicator public override void Add((DateTime t, double v) TValue, bool update) { int _lag = (int)((_p-1) * 0.5); - _lag = (_data.Count-_lag < 0) ? 0 : _data.Count-_lag; + _lag = (this.Count-_lag < 0) ? 0 : this.Count-_lag; double _zl = TValue.v + (TValue.v - _data[_lag].v); diff --git a/Source/Indicators/ZLEMA_Series.cs b/Source/Indicators/ZLEMA_Series.cs index e9ffdd3c..5642cf8f 100644 --- a/Source/Indicators/ZLEMA_Series.cs +++ b/Source/Indicators/ZLEMA_Series.cs @@ -21,19 +21,51 @@ Remark: public class ZLEMA_Series : Single_TSeries_Indicator { - private ZL_Series zlag; - private EMA_Series ema; + private readonly System.Collections.Generic.List _buffer = new(); + private readonly double _k, _k1m; + private double _lastema, _lastlastema; - public ZLEMA_Series(TSeries source, int period, bool useNaN = false) : base(source, period, useNaN) - { - zlag = new(source: source, period: period, useNaN: false); - ema = new EMA_Series(source: source, period: period, useNaN: useNaN); - } + public ZLEMA_Series(TSeries source, int period, bool useNaN = false) : base(source, period, useNaN) + { + this._k = 2.0 / (this._p + 1); + this._k1m = 1.0 - this._k; + this._lastema = this._lastlastema = double.NaN; + if (base._data.Count > 0) + { base.Add(base._data); } + } - public override void Add((System.DateTime t, double v) TValue, bool update) - { - (System.DateTime t, double v) result = ema[ema.Count-1]; - base.Add(result, update); + public override void Add((System.DateTime t, double v) TValue, bool update) + { + int _lag = (int)((_p - 1) * 0.5); + _lag = (this.Count - _lag < 0) ? 0 : this.Count - _lag; + double _zl = TValue.v + (TValue.v - _data[_lag].v); + double _ema = 0; + if (update) + { this._lastema = this._lastlastema; } + if (this.Count < this._p) + { + if (update) + { this._buffer[this._buffer.Count - 1] = _zl; } + else + { + this._buffer.Add(_zl); + } + if (this._buffer.Count > this._p) + { this._buffer.RemoveAt(0); } - } -} + for (int i = 0; i < this._buffer.Count; i++) + { _ema += this._buffer[i]; } + _ema /= this._buffer.Count; + } + else + { + _ema = TValue.v * this._k + this._lastema * this._k1m; + } + + this._lastlastema = this._lastema; + this._lastema = _ema; + + var ret = (TValue.t, this.Count < this._p - 1 && this._NaN ? double.NaN : _ema); + base.Add(ret, update); + } +} \ No newline at end of file diff --git a/Tests/Tests.csproj b/Tests/Tests.csproj index ac4a1d2a..e7f92739 100644 --- a/Tests/Tests.csproj +++ b/Tests/Tests.csproj @@ -26,6 +26,14 @@ 1701;1702;MSB3270 + + + + + + + + all diff --git a/Tests/Validations/Pandas_TA.cs b/Tests/Validations/Pandas_TA.cstemp similarity index 100% rename from Tests/Validations/Pandas_TA.cs rename to Tests/Validations/Pandas_TA.cstemp