mirror of
https://github.com/mihakralj/QuanTAlib.git
synced 2026-08-15 17:18:05 +00:00
Sonar changes
This commit is contained in:
+157
-157
@@ -1,157 +1,157 @@
|
||||
# Coverage of indicators
|
||||
|
||||
| Indicator | QuanTAlib | TA-LIB | Skender | Pandas-TA |
|
||||
|--|:--:|:--:|:--:|:--:|
|
||||
| **Basics** |||||
|
||||
| OC2 - (Open+Close)/2 |✔️|||✔️|
|
||||
| HL2 - (High+Low)/2 |✔️|||✔️|
|
||||
| HLC3 - Typical Price |✔️|||✔️|
|
||||
| OHL3 - (Open+High+Low)/3 |✔️|||✔️|
|
||||
| OHLC4 - (O+H+L+C)/4 |✔️|||✔️|
|
||||
| HLCC4 - Weighted Price |✔️||✔️|✔️|
|
||||
| ZL - Zero Lag - De-lagged price |✔️|||✔️|
|
||||
| ADD - Addition |✔️|✔️|||
|
||||
| SUB - Subtraction |✔️|✔️|||
|
||||
| MUL - Multiplication |✔️|✔️|||
|
||||
| DIV - Division |✔️|✔️|||
|
||||
||||||
|
||||
| **Statistics** |||||
|
||||
| BETA - Beta coefficient |||✔️||
|
||||
| BIAS - Bias |✔️|||✔️|
|
||||
| ENTR - Entropy |✔️|||✔️|
|
||||
| KUR - Kurtosis |✔️|||✔️|
|
||||
| LINREG - Linear Regression ||✔️|✔️||
|
||||
| MAD - Mean Absolute Deviation |✔️||✔️|✔️|
|
||||
| MAPE - Mean Absolute Percent Error |✔️||✔️||
|
||||
| MAX - Max value |✔️|✔️|||
|
||||
| MIN - Min value |✔️|✔️|||
|
||||
| MED - Median value |✔️|✔️||✔️|
|
||||
| MSE - Mean Squared Error |✔️||✔️||
|
||||
| PSDEV - Population Standard Deviation |✔️||||
|
||||
| PVAR - Population Variance |✔️||||
|
||||
| QUANTILE ||||✔️|
|
||||
| RS - R-Squared Coefficient |||✔️||
|
||||
| SKEW - Skewness ||||✔️|
|
||||
| SLOPE - Slope |||✔️||
|
||||
| SMAPE - Symmetric Mean Absolute Percent Error |✔️||||
|
||||
| SDEV - Sample Standard Deviation |✔️|✔️|✔️|✔️|
|
||||
| VAR - Sample Variance |✔️|||✔️|
|
||||
| WMAPE - Weighted Mean Absolute Percent Error |✔️||||
|
||||
| ZSCORE |||✔️|✔️|
|
||||
||||||
|
||||
| **Moving Averages** |||||
|
||||
| AFIRMA - Autoregressive Finite Impulse Response Moving Average |||||
|
||||
| ALMA - Arnaud Legoux Moving Average |||✔️|✔️|
|
||||
| ARIMA - Autoregressive Integrated Moving Average |||||
|
||||
| ATR - Average True Range |✔️|✔️|✔️|✔️|
|
||||
| ATRP - Average True Range Percent |✔️||✔️||
|
||||
| DEMA - Double EMA |✔️|✔️|✔️|✔️|
|
||||
| EMA - Exponential Moving Average |✔️|✔️|✔️|✔️|
|
||||
| EPMA - Endpoint Moving Average |||✔️||
|
||||
| FWMA - Fibonacci's Weighted Moving Average ||||✔️|
|
||||
| HEMA - Hull Exponential Moving Average |✔️||||
|
||||
| HMA - Hull Moving Average |✔️||✔️|✔️|
|
||||
| HWMA - Holt-Winter Moving Average ||||✔️|
|
||||
| JMA - Jurik Moving Average |✔️|||✔️|
|
||||
| KAMA - Kaufman's Adaptive Moving Average |✔️|✔️|✔️|✔️|
|
||||
| LSMA - Least Squares Moving Average |||✔️||
|
||||
| MACD - Moving Average Convergence/Divergence ||✔️|✔️|✔️|
|
||||
| MAMA - MESA Adaptive Moving Average ||✔️|✔️||
|
||||
| MMA - Modified Moving Average |||✔️||
|
||||
| NATR - Normalized Average True Range ||✔️|✔️|✔️|
|
||||
| PPMA - Pivot Point Moving Average |||✔️||
|
||||
| PWMA - Pascal's Weighted Moving Average ||||✔️|
|
||||
| RMA - WildeR's Moving Average |✔️|||✔️|
|
||||
| SINWMA - Sine Weighted Moving Average ||||✔️|
|
||||
| SMA - Simple Moving Average |✔️|✔️|✔️|✔️|
|
||||
| SMMA - Smoothed Moving Average |✔️||✔️||
|
||||
| STOCH - Stochastic Oscillator ||✔️|✔️|✔️|
|
||||
| SSF - Ehler's Super Smoother Filter ||||✔️|
|
||||
| SUP - Supertrend |||✔️|✔️|
|
||||
| SWMA - Symmetric Weighted Moving Average ||||✔️|
|
||||
| T3 - Tillson T3 Moving Average ||✔️|✔️|✔️|
|
||||
| TEMA - Triple EMA |✔️|✔️|✔️|✔️|
|
||||
| TRIMA - Triangular Moving Average ||✔️||✔️|
|
||||
| VIDYA - Variable Index Dynamic Average ||||✔️|
|
||||
| VWAP - Volume Weighted Average Price |||✔️|✔️|
|
||||
| VWMA - Volume Weighted Moving Average |||✔️|✔️|
|
||||
| WMA - Weighted Moving Average |✔️|✔️|✔️|✔️|
|
||||
| ZLEMA - Zero Lag EMA |✔️|||✔️|
|
||||
||||||
|
||||
| **Oscillators and Indices** |||||
|
||||
| AC - Acceleration Oscillator ||||✔️|
|
||||
| AD - Chaikin Accumulation Distribution ||✔️|✔️|✔️|
|
||||
| ADOSC - Chaikin Accumulation Distribution Oscillator ||✔️|✔️||
|
||||
| ADX - Average Directional Movement Index ||✔️|✔️|✔️|
|
||||
| ADXR - Average Directional Movement Index Rating ||✔️|✔️||
|
||||
| AO - Awesome Oscillator |||✔️|✔️|
|
||||
| APO - Absolute Price Oscillator ||✔️||✔️|
|
||||
| AROON - Aroon oscillator ||✔️|✔️|✔️|
|
||||
| BBANDS - Bollinger Bands ||✔️|✔️|✔️|
|
||||
| BOP - Balance of Power ||✔️|✔️|✔️|
|
||||
| CCI - Commodity Channel Index ||✔️|✔️|✔️|
|
||||
| CFO - Chande Forcast Oscillator ||||✔️|
|
||||
| CMF - Chaikin Money Flow |||✔️|✔️|
|
||||
| CMO - Chande Momentum Oscillator ||✔️||✔️|
|
||||
| COG - Center of Gravity ||||✔️|
|
||||
| CRSI - Connor RSI |||✔️||
|
||||
| CTI - Ehler's Correlation Trend Indicator ||||✔️|
|
||||
| DMI - Directional Movement Index ||✔️|✔️|✔️|
|
||||
| EFI - Elder Ray's Force Index |||✔️|✔️|
|
||||
| GAT - Alligator oscillator |||✔️||
|
||||
| KRI - Kairi Relative Index |||||
|
||||
| KVO - Klinger Volume Oscillator |||✔️|✔️|
|
||||
| MFI - Money Flow Index ||✔️|✔️|✔️|
|
||||
| MOM - Momentum |||✔️|✔️|
|
||||
| NVI - Negative Volume Index ||||✔️|
|
||||
| PO - Price Oscillator ||||✔️|
|
||||
| PPO - Percentage Price Oscillator ||✔️||✔️|
|
||||
| PVI - Positive Volume Index ||||✔️|
|
||||
| RSI - Relative Strength Index ||✔️|✔️|✔️|
|
||||
| RVGI - Relative Vigor Index ||||✔️|
|
||||
| SRSI - Stochastic RSI |||✔️|✔️|
|
||||
| TRIX - 1-day ROC of TEMA ||✔️|✔️|✔️|
|
||||
| TSI - True Strength Index |||✔️|✔️|
|
||||
| UI - Ulcer Index |||✔️|✔️|
|
||||
| UO - Ultimate Oscillator ||✔️|✔️|✔️|
|
||||
| WGAT - Williams Alligator |||✔️||
|
||||
||||||
|
||||
| **Volume** |||||
|
||||
| AOBV - Archer On-Balance Volume ||||✔️|
|
||||
| OBV - On-Balance Volume ||✔️|✔️|✔️|
|
||||
| PRS - Price Relative Strength |||✔️||
|
||||
| PVOL - Price-Volume |||||
|
||||
| PVR - Price Volume Rank ||||✔️|
|
||||
| PVT - Price Volume Trend ||||✔️|
|
||||
| VP - Volume Profile ||||✔️|
|
||||
||||||
|
||||
|**Unsorted**|||||
|
||||
| CHN - Price Channel |||✔️||
|
||||
| COPPOCK - Coppock Curve ||||✔️|
|
||||
| CORREL - Pearson's Correlation Coefficient ||✔️|✔️||
|
||||
| EOM - Ease of Movement ||||✔️|
|
||||
| HILO - Gann High-Low Activator ||||✔️|
|
||||
| HV - Historical Volatility |||✔️||
|
||||
| HT - HT Trendline |||✔️||
|
||||
| ICH - Ichimoku |||✔️|✔️|
|
||||
| MCGD - McGinley Dynamic ||||✔️|
|
||||
| ROC - Rate of Change ||✔️|✔️|✔️|
|
||||
| SAR - Parabolic Stop and Reverse ||✔️|✔️|✔️|
|
||||
| STC - Schaff Trend Cycle |||✔️|✔️|
|
||||
| TR - True Range ||✔️|✔️|✔️|
|
||||
| WILLR - Larry Williams' %R ||✔️|✔️|✔️|
|
||||
| HURST - Hurst Exponent |||✔️||
|
||||
| VOR - Vortex Indicator |||✔️|✔️|
|
||||
| DON - Donchian Channels |||✔️|✔️|
|
||||
| FCB - Fractal Chaos Bands |||✔️||
|
||||
| KEL - Keltner Channels |||✔️|✔️|
|
||||
| PVT - Pivot Points |||✔️||
|
||||
| STARC - Starc Bands |||✔️||
|
||||
| DPO - De-trended Price Oscillator |||✔️|✔️|
|
||||
| KDJ - KDJ Index |||✔️|✔️|
|
||||
| SMI - Stochastic Momentum Index |||✔️|✔️|
|
||||
| CHAND - Chandelier Exit |||✔️||
|
||||
| VSTOP - Volatility Stop |||✔️||
|
||||
| PVO - Percentage Volume Oscillator |||✔️|✔️|
|
||||
| Hilbert Transform Instantaneous Trendline |||||
|
||||
| PMO - Price Momentum Oscillator |||✔️||
|
||||
# Coverage of indicators
|
||||
|
||||
| Indicator | QuanTAlib | TA-LIB | Skender | Pandas-TA |
|
||||
|--|:--:|:--:|:--:|:--:|
|
||||
| **Basics** |||||
|
||||
| OC2 - (Open+Close)/2 |✔️|||✔️|
|
||||
| HL2 - (High+Low)/2 |✔️|||✔️|
|
||||
| HLC3 - Typical Price |✔️|||✔️|
|
||||
| OHL3 - (Open+High+Low)/3 |✔️|||✔️|
|
||||
| OHLC4 - (O+H+L+C)/4 |✔️|||✔️|
|
||||
| HLCC4 - Weighted Price |✔️||✔️|✔️|
|
||||
| ZL - Zero Lag - De-lagged price |✔️|||✔️|
|
||||
| ADD - Addition |✔️|✔️|||
|
||||
| SUB - Subtraction |✔️|✔️|||
|
||||
| MUL - Multiplication |✔️|✔️|||
|
||||
| DIV - Division |✔️|✔️|||
|
||||
||||||
|
||||
| **Statistics** |||||
|
||||
| BETA - Beta coefficient |||✔️||
|
||||
| BIAS - Bias |✔️|||✔️|
|
||||
| ENTR - Entropy |✔️|||✔️|
|
||||
| KUR - Kurtosis |✔️|||✔️|
|
||||
| LINREG - Linear Regression ||✔️|✔️||
|
||||
| MAD - Mean Absolute Deviation |✔️||✔️|✔️|
|
||||
| MAPE - Mean Absolute Percent Error |✔️||✔️||
|
||||
| MAX - Max value |✔️|✔️|||
|
||||
| MIN - Min value |✔️|✔️|||
|
||||
| MED - Median value |✔️|✔️||✔️|
|
||||
| MSE - Mean Squared Error |✔️||✔️||
|
||||
| PSDEV - Population Standard Deviation |✔️||||
|
||||
| PVAR - Population Variance |✔️||||
|
||||
| QUANTILE ||||✔️|
|
||||
| RS - R-Squared Coefficient |||✔️||
|
||||
| SKEW - Skewness ||||✔️|
|
||||
| SLOPE - Slope |||✔️||
|
||||
| SMAPE - Symmetric Mean Absolute Percent Error |✔️||||
|
||||
| SDEV - Sample Standard Deviation |✔️|✔️|✔️|✔️|
|
||||
| VAR - Sample Variance |✔️|||✔️|
|
||||
| WMAPE - Weighted Mean Absolute Percent Error |✔️||||
|
||||
| ZSCORE |||✔️|✔️|
|
||||
||||||
|
||||
| **Moving Averages** |||||
|
||||
| AFIRMA - Autoregressive Finite Impulse Response Moving Average |||||
|
||||
| ALMA - Arnaud Legoux Moving Average |||✔️|✔️|
|
||||
| ARIMA - Autoregressive Integrated Moving Average |||||
|
||||
| ATR - Average True Range |✔️|✔️|✔️|✔️|
|
||||
| ATRP - Average True Range Percent |✔️||✔️||
|
||||
| DEMA - Double EMA |✔️|✔️|✔️|✔️|
|
||||
| EMA - Exponential Moving Average |✔️|✔️|✔️|✔️|
|
||||
| EPMA - Endpoint Moving Average |||✔️||
|
||||
| FWMA - Fibonacci's Weighted Moving Average ||||✔️|
|
||||
| HEMA - Hull Exponential Moving Average |✔️||||
|
||||
| HMA - Hull Moving Average |✔️||✔️|✔️|
|
||||
| HWMA - Holt-Winter Moving Average ||||✔️|
|
||||
| JMA - Jurik Moving Average |✔️|||✔️|
|
||||
| KAMA - Kaufman's Adaptive Moving Average |✔️|✔️|✔️|✔️|
|
||||
| LSMA - Least Squares Moving Average |||✔️||
|
||||
| MACD - Moving Average Convergence/Divergence ||✔️|✔️|✔️|
|
||||
| MAMA - MESA Adaptive Moving Average ||✔️|✔️||
|
||||
| MMA - Modified Moving Average |||✔️||
|
||||
| NATR - Normalized Average True Range ||✔️|✔️|✔️|
|
||||
| PPMA - Pivot Point Moving Average |||✔️||
|
||||
| PWMA - Pascal's Weighted Moving Average ||||✔️|
|
||||
| RMA - WildeR's Moving Average |✔️|||✔️|
|
||||
| SINWMA - Sine Weighted Moving Average ||||✔️|
|
||||
| SMA - Simple Moving Average |✔️|✔️|✔️|✔️|
|
||||
| SMMA - Smoothed Moving Average |✔️||✔️||
|
||||
| STOCH - Stochastic Oscillator ||✔️|✔️|✔️|
|
||||
| SSF - Ehler's Super Smoother Filter ||||✔️|
|
||||
| SUP - Supertrend |||✔️|✔️|
|
||||
| SWMA - Symmetric Weighted Moving Average ||||✔️|
|
||||
| T3 - Tillson T3 Moving Average ||✔️|✔️|✔️|
|
||||
| TEMA - Triple EMA |✔️|✔️|✔️|✔️|
|
||||
| TRIMA - Triangular Moving Average ||✔️||✔️|
|
||||
| VIDYA - Variable Index Dynamic Average ||||✔️|
|
||||
| VWAP - Volume Weighted Average Price |||✔️|✔️|
|
||||
| VWMA - Volume Weighted Moving Average |||✔️|✔️|
|
||||
| WMA - Weighted Moving Average |✔️|✔️|✔️|✔️|
|
||||
| ZLEMA - Zero Lag EMA |✔️|||✔️|
|
||||
||||||
|
||||
| **Oscillators and Indices** |||||
|
||||
| AC - Acceleration Oscillator ||||✔️|
|
||||
| AD - Chaikin Accumulation Distribution ||✔️|✔️|✔️|
|
||||
| ADOSC - Chaikin Accumulation Distribution Oscillator ||✔️|✔️||
|
||||
| ADX - Average Directional Movement Index ||✔️|✔️|✔️|
|
||||
| ADXR - Average Directional Movement Index Rating ||✔️|✔️||
|
||||
| AO - Awesome Oscillator |||✔️|✔️|
|
||||
| APO - Absolute Price Oscillator ||✔️||✔️|
|
||||
| AROON - Aroon oscillator ||✔️|✔️|✔️|
|
||||
| BBANDS - Bollinger Bands ||✔️|✔️|✔️|
|
||||
| BOP - Balance of Power ||✔️|✔️|✔️|
|
||||
| CCI - Commodity Channel Index ||✔️|✔️|✔️|
|
||||
| CFO - Chande Forcast Oscillator ||||✔️|
|
||||
| CMF - Chaikin Money Flow |||✔️|✔️|
|
||||
| CMO - Chande Momentum Oscillator ||✔️||✔️|
|
||||
| COG - Center of Gravity ||||✔️|
|
||||
| CRSI - Connor RSI |||✔️||
|
||||
| CTI - Ehler's Correlation Trend Indicator ||||✔️|
|
||||
| DMI - Directional Movement Index ||✔️|✔️|✔️|
|
||||
| EFI - Elder Ray's Force Index |||✔️|✔️|
|
||||
| GAT - Alligator oscillator |||✔️||
|
||||
| KRI - Kairi Relative Index |||||
|
||||
| KVO - Klinger Volume Oscillator |||✔️|✔️|
|
||||
| MFI - Money Flow Index ||✔️|✔️|✔️|
|
||||
| MOM - Momentum |||✔️|✔️|
|
||||
| NVI - Negative Volume Index ||||✔️|
|
||||
| PO - Price Oscillator ||||✔️|
|
||||
| PPO - Percentage Price Oscillator ||✔️||✔️|
|
||||
| PVI - Positive Volume Index ||||✔️|
|
||||
| RSI - Relative Strength Index ||✔️|✔️|✔️|
|
||||
| RVGI - Relative Vigor Index ||||✔️|
|
||||
| SRSI - Stochastic RSI |||✔️|✔️|
|
||||
| TRIX - 1-day ROC of TEMA ||✔️|✔️|✔️|
|
||||
| TSI - True Strength Index |||✔️|✔️|
|
||||
| UI - Ulcer Index |||✔️|✔️|
|
||||
| UO - Ultimate Oscillator ||✔️|✔️|✔️|
|
||||
| WGAT - Williams Alligator |||✔️||
|
||||
||||||
|
||||
| **Volume** |||||
|
||||
| AOBV - Archer On-Balance Volume ||||✔️|
|
||||
| OBV - On-Balance Volume ||✔️|✔️|✔️|
|
||||
| PRS - Price Relative Strength |||✔️||
|
||||
| PVOL - Price-Volume |||||
|
||||
| PVR - Price Volume Rank ||||✔️|
|
||||
| PVT - Price Volume Trend ||||✔️|
|
||||
| VP - Volume Profile ||||✔️|
|
||||
||||||
|
||||
|**Unsorted**|||||
|
||||
| CHN - Price Channel |||✔️||
|
||||
| COPPOCK - Coppock Curve ||||✔️|
|
||||
| CORREL - Pearson's Correlation Coefficient ||✔️|✔️||
|
||||
| EOM - Ease of Movement ||||✔️|
|
||||
| HILO - Gann High-Low Activator ||||✔️|
|
||||
| HV - Historical Volatility |||✔️||
|
||||
| HT - HT Trendline |||✔️||
|
||||
| ICH - Ichimoku |||✔️|✔️|
|
||||
| MCGD - McGinley Dynamic ||||✔️|
|
||||
| ROC - Rate of Change ||✔️|✔️|✔️|
|
||||
| SAR - Parabolic Stop and Reverse ||✔️|✔️|✔️|
|
||||
| STC - Schaff Trend Cycle |||✔️|✔️|
|
||||
| TR - True Range ||✔️|✔️|✔️|
|
||||
| WILLR - Larry Williams' %R ||✔️|✔️|✔️|
|
||||
| HURST - Hurst Exponent |||✔️||
|
||||
| VOR - Vortex Indicator |||✔️|✔️|
|
||||
| DON - Donchian Channels |||✔️|✔️|
|
||||
| FCB - Fractal Chaos Bands |||✔️||
|
||||
| KEL - Keltner Channels |||✔️|✔️|
|
||||
| PVT - Pivot Points |||✔️||
|
||||
| STARC - Starc Bands |||✔️||
|
||||
| DPO - De-trended Price Oscillator |||✔️|✔️|
|
||||
| KDJ - KDJ Index |||✔️|✔️|
|
||||
| SMI - Stochastic Momentum Index |||✔️|✔️|
|
||||
| CHAND - Chandelier Exit |||✔️||
|
||||
| VSTOP - Volatility Stop |||✔️||
|
||||
| PVO - Percentage Volume Oscillator |||✔️|✔️|
|
||||
| Hilbert Transform Instantaneous Trendline |||||
|
||||
| PMO - Price Momentum Oscillator |||✔️||
|
||||
|
||||
@@ -30,12 +30,12 @@ public class ZLMA_chart : Indicator
|
||||
private int matype = 2;
|
||||
|
||||
#endregion Parameters
|
||||
|
||||
|
||||
private TBars bars;
|
||||
///////
|
||||
///////
|
||||
private TSeries indicator;
|
||||
///////
|
||||
|
||||
///////
|
||||
|
||||
public ZLMA_chart()
|
||||
{
|
||||
this.SeparateWindow = false;
|
||||
|
||||
@@ -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); }
|
||||
}
|
||||
|
||||
|
||||
@@ -1,71 +1,71 @@
|
||||
namespace QuanTAlib;
|
||||
using System;
|
||||
|
||||
/* <summary>
|
||||
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.
|
||||
|
||||
</summary> */
|
||||
|
||||
public class ZLEMA_Series : Single_TSeries_Indicator
|
||||
{
|
||||
private readonly System.Collections.Generic.List<double> _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;
|
||||
|
||||
/* <summary>
|
||||
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.
|
||||
|
||||
</summary> */
|
||||
|
||||
public class ZLEMA_Series : Single_TSeries_Indicator
|
||||
{
|
||||
private readonly System.Collections.Generic.List<double> _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);
|
||||
}
|
||||
}
|
||||
+119
-119
@@ -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));
|
||||
}
|
||||
*/
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user