Sonar changes

This commit is contained in:
Miha Kralj
2022-04-24 20:16:11 -07:00
parent 13617dc614
commit 86d0adc1d4
5 changed files with 350 additions and 352 deletions
+157 -157
View File
@@ -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 |||✔️||
+4 -4
View File
@@ -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;
-2
View File
@@ -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); }
}
+70 -70
View File
@@ -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
View File
@@ -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));
}
*/
}