diff --git a/Quantower/Indicators/ZLMA_chart.cs b/Quantower/Indicators/ZLMA_chart.cs
index e8370495..0b556b0a 100644
--- a/Quantower/Indicators/ZLMA_chart.cs
+++ b/Quantower/Indicators/ZLMA_chart.cs
@@ -30,13 +30,12 @@ public class ZLMA_chart : Indicator
private int matype = 2;
#endregion Parameters
-
+
private TBars bars;
- ///////
- private ZL_Series zerolag;
+ ///////
private TSeries indicator;
- ///////
-
+ ///////
+
public ZLMA_chart()
{
this.SeparateWindow = false;
diff --git a/Source/Indicators/JMA_Series.cs b/Source/Indicators/JMA_Series.cs
index 4a9068c2..d1639a09 100644
--- a/Source/Indicators/JMA_Series.cs
+++ b/Source/Indicators/JMA_Series.cs
@@ -41,8 +41,6 @@ public class JMA_Series : Single_TSeries_Indicator
this.rvolty = Math.Exp((1 / this.pow1) * Math.Log(len1));
this.len2 = Math.Sqrt(0.5 * (_p - 1)) * len1;
this.beta = 0.45 * (_p - 1) / (0.45 * (_p - 1) + 2);
- this._l = (int)Math.Round(this._p - 1 * 0.5);
-
if (base._data.Count > 0) { base.Add(base._data); }
}
diff --git a/Source/Indicators/ZLEMA_Series.cs b/Source/Indicators/ZLEMA_Series.cs
index 5642cf8f..be2913f7 100644
--- a/Source/Indicators/ZLEMA_Series.cs
+++ b/Source/Indicators/ZLEMA_Series.cs
@@ -1,71 +1,71 @@
-namespace QuanTAlib;
-using System;
-
-/*
-ZLEMA: Zero Lag Exponential Moving Average
- The Zero lag exponential moving average (ZLEMA) indicator was created by John
- Ehlers and Ric Way.
-
-The formula for a given N-Day period and for a given Data series is:
- Lag = (Period-1)/2
- Ema Data = {Data+(Data-Data(Lag days ago))
- ZLEMA = EMA (EmaData,Period)
-
-Remark:
- The idea is do a regular exponential moving average (EMA) calculation but on a
- de-lagged data instead of doing it on the regular data. Data is de-lagged by
- removing the data from "lag" days ago thus removing (or attempting to remove)
- the cumulative lag effect of the moving average.
-
- */
-
-public class ZLEMA_Series : Single_TSeries_Indicator
-{
- 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)
- {
- 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)
- {
- 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);
- }
+namespace QuanTAlib;
+using System;
+
+/*
+ZLEMA: Zero Lag Exponential Moving Average
+ The Zero lag exponential moving average (ZLEMA) indicator was created by John
+ Ehlers and Ric Way.
+
+The formula for a given N-Day period and for a given Data series is:
+ Lag = (Period-1)/2
+ Ema Data = {Data+(Data-Data(Lag days ago))
+ ZLEMA = EMA (EmaData,Period)
+
+Remark:
+ The idea is do a regular exponential moving average (EMA) calculation but on a
+ de-lagged data instead of doing it on the regular data. Data is de-lagged by
+ removing the data from "lag" days ago thus removing (or attempting to remove)
+ the cumulative lag effect of the moving average.
+
+ */
+
+public class ZLEMA_Series : Single_TSeries_Indicator
+{
+ 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)
+ {
+ 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)
+ {
+ 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/Validations/Pandas_TA.cstemp b/Tests/Validations/Pandas_TA.cstemp
index 27c2e9b8..0aa769bd 100644
--- a/Tests/Validations/Pandas_TA.cstemp
+++ b/Tests/Validations/Pandas_TA.cstemp
@@ -1,120 +1,120 @@
-using Xunit;
-using System;
-using QuanTAlib;
-using Python.Runtime;
-using Python.Included;
-
-namespace Validation;
-public class PandasTA
-{
- private readonly RND_Feed bars;
- private readonly Random rnd = new();
- private readonly int period;
- private readonly dynamic ta;
- private readonly dynamic df;
-
- public PandasTA()
- {
- this.bars = new(1000);
- this.period = this.rnd.Next(28) + 3;
-
- Installer.SetupPython().Wait();
- Installer.TryInstallPip();
- Installer.PipInstallModule("numpy");
- Installer.PipInstallModule("pandas");
- Installer.PipInstallModule("pandas-ta");
- PythonEngine.Initialize();
- this.ta = Py.Import("pandas_ta");
- this.df = this.ta.DataFrame(this.bars.Close.v);
- }
-
- ~PandasTA()
- {
- PythonEngine.Shutdown();
- }
-
- [Fact]
- void SMA()
- {
- SMA_Series QL = new(this.bars.Close, this.period, false);
- var pta = this.ta.sma(close: this.df[0], length: this.period);
-
- Assert.Equal(System.Math.Round((double)pta.tail(1), 7), Math.Round(QL.Last().v, 7));
- }
-
-/*
- [Fact]
- void EMA()
- {
- EMA_Series QL = new(this.bars.Close, this.period, false);
- var pta = this.ta.ema(close: this.df[0], length: this.period);
-
- Assert.Equal(System.Math.Round((double)pta.tail(1), 7), Math.Round(QL.Last().v, 7));
- }
-
- [Fact]
- void TEMA()
- {
- TEMA_Series QL = new(this.bars.Close, this.period, false);
- var pta = this.ta.tema(close: this.df[0], length: this.period);
-
- Assert.Equal(System.Math.Round((double)pta.tail(1), 7), Math.Round(QL.Last().v, 7));
- }
-
- [Fact]
- void ENTP()
- {
- ENTP_Series QL = new(this.bars.Close, this.period, useNaN:false);
- var pta = this.ta.entropy(close: this.df[0], length: this.period);
-
- Assert.Equal(System.Math.Round((double)pta.tail(1), 7), Math.Round(QL.Last().v, 7));
- }
-
-
- [Fact]
- void WMA()
- {
- WMA_Series QL = new(this.bars.Close, this.period, false);
- var pta = this.ta.wma(close: this.df[0], length: this.period);
-
- Assert.Equal(System.Math.Round((double)pta.tail(1), 7), Math.Round(QL.Last().v, 7));
- }
-
- [Fact]
- void DEMA()
- {
- DEMA_Series QL = new(this.bars.Close, this.period, false);
- var pta = this.ta.dema(close: this.df[0], length: this.period);
-
- Assert.Equal(System.Math.Round((double)pta.tail(1), 7), Math.Round(QL.Last().v, 7));
- }
-
- [Fact]
- void BIAS()
- {
- BIAS_Series QL = new(this.bars.Close, this.period, false);
- var pta = this.ta.bias(close: this.df[0], length: this.period);
-
- Assert.Equal(System.Math.Round((double)pta.tail(1), 7), Math.Round(QL.Last().v, 7));
- }
-
- [Fact]
- void KURT()
- {
- KURT_Series QL = new(this.bars.Close, this.period, useNaN: false);
- var pta = this.ta.kurtosis(close: this.df[0], length: this.period);
-
- Assert.Equal(System.Math.Round((double)pta.tail(1), 4), Math.Round(QL.Last().v, 4));
- }
-
- [Fact]
- void MAD()
- {
- MAD_Series QL = new(this.bars.Close, this.period, useNaN: false);
- var pta = this.ta.mad(close: this.df[0], length: this.period);
-
- Assert.Equal(System.Math.Round((double)pta.tail(1), 7), Math.Round(QL.Last().v, 7));
- }
-*/
-
+using Xunit;
+using System;
+using QuanTAlib;
+using Python.Runtime;
+using Python.Included;
+
+namespace Validation;
+public class PandasTA
+{
+ private readonly RND_Feed bars;
+ private readonly Random rnd = new();
+ private readonly int period;
+ private readonly dynamic ta;
+ private readonly dynamic df;
+
+ public PandasTA()
+ {
+ this.bars = new(1000);
+ this.period = this.rnd.Next(28) + 3;
+
+ Installer.SetupPython().Wait();
+ Installer.TryInstallPip();
+ Installer.PipInstallModule("numpy");
+ Installer.PipInstallModule("pandas");
+ Installer.PipInstallModule("pandas-ta");
+ PythonEngine.Initialize();
+ this.ta = Py.Import("pandas_ta");
+ this.df = this.ta.DataFrame(this.bars.Close.v);
+ }
+
+ ~PandasTA()
+ {
+ PythonEngine.Shutdown();
+ }
+
+ [Fact]
+ void SMA()
+ {
+ SMA_Series QL = new(this.bars.Close, this.period, false);
+ var pta = this.ta.sma(close: this.df[0], length: this.period);
+
+ Assert.Equal(System.Math.Round((double)pta.tail(1), 7), Math.Round(QL.Last().v, 7));
+ }
+
+/*
+ [Fact]
+ void EMA()
+ {
+ EMA_Series QL = new(this.bars.Close, this.period, false);
+ var pta = this.ta.ema(close: this.df[0], length: this.period);
+
+ Assert.Equal(System.Math.Round((double)pta.tail(1), 7), Math.Round(QL.Last().v, 7));
+ }
+
+ [Fact]
+ void TEMA()
+ {
+ TEMA_Series QL = new(this.bars.Close, this.period, false);
+ var pta = this.ta.tema(close: this.df[0], length: this.period);
+
+ Assert.Equal(System.Math.Round((double)pta.tail(1), 7), Math.Round(QL.Last().v, 7));
+ }
+
+ [Fact]
+ void ENTP()
+ {
+ ENTP_Series QL = new(this.bars.Close, this.period, useNaN:false);
+ var pta = this.ta.entropy(close: this.df[0], length: this.period);
+
+ Assert.Equal(System.Math.Round((double)pta.tail(1), 7), Math.Round(QL.Last().v, 7));
+ }
+
+
+ [Fact]
+ void WMA()
+ {
+ WMA_Series QL = new(this.bars.Close, this.period, false);
+ var pta = this.ta.wma(close: this.df[0], length: this.period);
+
+ Assert.Equal(System.Math.Round((double)pta.tail(1), 7), Math.Round(QL.Last().v, 7));
+ }
+
+ [Fact]
+ void DEMA()
+ {
+ DEMA_Series QL = new(this.bars.Close, this.period, false);
+ var pta = this.ta.dema(close: this.df[0], length: this.period);
+
+ Assert.Equal(System.Math.Round((double)pta.tail(1), 7), Math.Round(QL.Last().v, 7));
+ }
+
+ [Fact]
+ void BIAS()
+ {
+ BIAS_Series QL = new(this.bars.Close, this.period, false);
+ var pta = this.ta.bias(close: this.df[0], length: this.period);
+
+ Assert.Equal(System.Math.Round((double)pta.tail(1), 7), Math.Round(QL.Last().v, 7));
+ }
+
+ [Fact]
+ void KURT()
+ {
+ KURT_Series QL = new(this.bars.Close, this.period, useNaN: false);
+ var pta = this.ta.kurtosis(close: this.df[0], length: this.period);
+
+ Assert.Equal(System.Math.Round((double)pta.tail(1), 4), Math.Round(QL.Last().v, 4));
+ }
+
+ [Fact]
+ void MAD()
+ {
+ MAD_Series QL = new(this.bars.Close, this.period, useNaN: false);
+ var pta = this.ta.mad(close: this.df[0], length: this.period);
+
+ Assert.Equal(System.Math.Round((double)pta.tail(1), 7), Math.Round(QL.Last().v, 7));
+ }
+*/
+
}
\ No newline at end of file