Documentation update

This commit is contained in:
Miha Kralj
2022-11-09 15:04:56 -08:00
parent 43a0f13dfb
commit f62e9c76b8
18 changed files with 366 additions and 532 deletions
-53
View File
@@ -1,53 +0,0 @@
using System.Drawing;
using TradingPlatform.BusinessLayer;
namespace QuanTAlib;
public class PSDEV_chart : Indicator
{
#region Parameters
[InputParameter("Smoothing period", 0, 1, 999, 1, 1)]
private int Period = 10;
[InputParameter("Data source", 1, variants: new object[]
{ "Open", 0, "High", 1, "Low", 2, "Close", 3, "HL2", 4, "OC2", 5,
"OHL3", 6, "HLC3", 7, "OHLC4", 8, "Weighted (HLCC4)", 9 })]
private int DataSource = 8;
#endregion Parameters
private TBars bars;
///////dotnet
private SDEV_Series indicator;
///////
public PSDEV_chart()
{
this.SeparateWindow = true;
this.Name = "PSDEV - Population Standard Deviation (Biased)";
this.Description = "PSDEV description";
this.AddLineSeries("PSDEV", Color.RoyalBlue, 3, LineStyle.Solid);
}
protected override void OnInit()
{
this.bars = new();
this.ShortName =
"PSDEV (" + TBars.SelectStr(this.DataSource) + ", " + this.Period + ")";
this.indicator = new(source: bars.Select(this.DataSource),
period: this.Period, useNaN: true);
}
protected override void OnUpdate(UpdateArgs args)
{
bool update = !(args.Reason == UpdateReason.NewBar ||
args.Reason == UpdateReason.HistoricalBar);
this.bars.Add(this.Time(), this.GetPrice(PriceType.Open),
this.GetPrice(PriceType.High), this.GetPrice(PriceType.Low),
this.GetPrice(PriceType.Close),
this.GetPrice(PriceType.Volume), update);
double result = this.indicator[this.indicator.Count - 1].v;
this.SetValue(result, 0);
}
}
-53
View File
@@ -1,53 +0,0 @@
using System.Drawing;
using TradingPlatform.BusinessLayer;
namespace QuanTAlib;
public class PSDEV_chart : Indicator
{
#region Parameters
[InputParameter("Smoothing period", 0, 1, 999, 1, 1)]
private int Period = 10;
[InputParameter("Data source", 1, variants: new object[]
{ "Open", 0, "High", 1, "Low", 2, "Close", 3, "HL2", 4, "OC2", 5,
"OHL3", 6, "HLC3", 7, "OHLC4", 8, "Weighted (HLCC4)", 9 })]
private int DataSource = 8;
#endregion Parameters
private TBars bars;
///////dotnet
private PSDEV_Series indicator;
///////
public PSDEV_chart()
{
this.SeparateWindow = true;
this.Name = "PSDEV - Population Standard Deviation (Biased)";
this.Description = "PSDEV description";
this.AddLineSeries("PSDEV", Color.RoyalBlue, 3, LineStyle.Solid);
}
protected override void OnInit()
{
this.bars = new();
this.ShortName =
"PSDEV (" + TBars.SelectStr(this.DataSource) + ", " + this.Period + ")";
this.indicator = new(source: bars.Select(this.DataSource),
period: this.Period, useNaN: true);
}
protected override void OnUpdate(UpdateArgs args)
{
bool update = !(args.Reason == UpdateReason.NewBar ||
args.Reason == UpdateReason.HistoricalBar);
this.bars.Add(this.Time(), this.GetPrice(PriceType.Open),
this.GetPrice(PriceType.High), this.GetPrice(PriceType.Low),
this.GetPrice(PriceType.Close),
this.GetPrice(PriceType.Volume), update);
double result = this.indicator[this.indicator.Count - 1].v;
this.SetValue(result, 0);
}
}
@@ -1,53 +0,0 @@
using System.Drawing;
using TradingPlatform.BusinessLayer;
namespace QuanTAlib;
public class PSDEV_chart : Indicator
{
#region Parameters
[InputParameter("Smoothing period", 0, 1, 999, 1, 1)]
private int Period = 10;
[InputParameter("Data source", 1, variants: new object[]
{ "Open", 0, "High", 1, "Low", 2, "Close", 3, "HL2", 4, "OC2", 5,
"OHL3", 6, "HLC3", 7, "OHLC4", 8, "Weighted (HLCC4)", 9 })]
private int DataSource = 8;
#endregion Parameters
private TBars bars;
///////dotnet
private PSDEV_Series indicator;
///////
public PSDEV_chart()
{
this.SeparateWindow = true;
this.Name = "PSDEV - Population Standard Deviation (Biased)";
this.Description = "PSDEV description";
this.AddLineSeries("PSDEV", Color.RoyalBlue, 3, LineStyle.Solid);
}
protected override void OnInit()
{
this.bars = new();
this.ShortName =
"PSDEV (" + TBars.SelectStr(this.DataSource) + ", " + this.Period + ")";
this.indicator = new(source: bars.Select(this.DataSource),
period: this.Period, useNaN: true);
}
protected override void OnUpdate(UpdateArgs args)
{
bool update = !(args.Reason == UpdateReason.NewBar ||
args.Reason == UpdateReason.HistoricalBar);
this.bars.Add(this.Time(), this.GetPrice(PriceType.Open),
this.GetPrice(PriceType.High), this.GetPrice(PriceType.Low),
this.GetPrice(PriceType.Close),
this.GetPrice(PriceType.Volume), update);
double result = this.indicator[this.indicator.Count - 1].v;
this.SetValue(result, 0);
}
}
-54
View File
@@ -1,54 +0,0 @@
using System.Drawing;
using TradingPlatform.BusinessLayer;
namespace QuanTAlib;
public class PVAR_chart : Indicator
{
#region Parameters
[InputParameter("Smoothing period", 0, 1, 999, 1, 1)]
private int Period = 10;
[InputParameter("Data source", 1, variants: new object[]
{ "Open", 0, "High", 1, "Low", 2, "Close", 3, "HL2", 4, "OC2", 5,
"OHL3", 6, "HLC3", 7, "OHLC4", 8, "Weighted (HLCC4)", 9 })]
private int DataSource = 8;
#endregion Parameters
private TBars bars;
///////dotnet
private PVAR_Series indicator;
///////
public PVAR_chart()
{
this.SeparateWindow = true;
this.Name = "PVAR - Population Variance (Biased)";
this.Description = "PVAR description";
this.AddLineSeries("PVAR", Color.RoyalBlue, 3, LineStyle.Solid);
}
protected override void OnInit()
{
this.bars = new();
this.ShortName =
"PVAR (" + TBars.SelectStr(this.DataSource) + ", " + this.Period + ")";
this.indicator = new(source: bars.Select(this.DataSource),
period: this.Period, useNaN: true);
}
protected override void OnUpdate(UpdateArgs args)
{
bool update = !(args.Reason == UpdateReason.NewBar ||
args.Reason == UpdateReason.HistoricalBar);
this.bars.Add(this.Time(), this.GetPrice(PriceType.Open),
this.GetPrice(PriceType.High), this.GetPrice(PriceType.Low),
this.GetPrice(PriceType.Close),
this.GetPrice(PriceType.Volume), update);
double result = this.indicator[this.indicator.Count - 1].v;
this.SetValue(result, 0);
}
}
+2 -2
View File
@@ -19,13 +19,13 @@ public class SDEV_chart : Indicator
private TBars bars; private TBars bars;
///////dotnet ///////dotnet
private SSDEV_Series indicator; private SDEV_Series indicator;
/////// ///////
public SDEV_chart() public SDEV_chart()
{ {
this.SeparateWindow = true; this.SeparateWindow = true;
this.Name = "SDEV - Sample Standard Deviation (Unbiased)"; this.Name = "SDEV - Standard Deviation";
this.Description = "SDEV description"; this.Description = "SDEV description";
this.AddLineSeries("SDEV", Color.RoyalBlue, 3, LineStyle.Solid); this.AddLineSeries("SDEV", Color.RoyalBlue, 3, LineStyle.Solid);
} }
+1 -1
View File
@@ -25,7 +25,7 @@ public class VAR_chart : Indicator
public VAR_chart() public VAR_chart()
{ {
this.SeparateWindow = true; this.SeparateWindow = true;
this.Name = "VAR - Sample Variance (Unbiased)"; this.Name = "VAR - Variance";
this.Description = "VAR description"; this.Description = "VAR description";
this.AddLineSeries("VAR", Color.RoyalBlue, 3, LineStyle.Solid); this.AddLineSeries("VAR", Color.RoyalBlue, 3, LineStyle.Solid);
} }
@@ -13,7 +13,7 @@ Sources:
</summary> */ </summary> */
public class ADO_Series : Single_TBars_Indicator public class ADOSC_Series : Single_TBars_Indicator
{ {
private readonly ADL_Series _TSadl; private readonly ADL_Series _TSadl;
@@ -21,7 +21,7 @@ public class ADO_Series : Single_TBars_Indicator
private readonly EMA_Series _TSfast; private readonly EMA_Series _TSfast;
private readonly SUB_Series _TSado; private readonly SUB_Series _TSado;
public ADO_Series(TBars source, bool useNaN = false) : base(source, period: 0, useNaN) public ADOSC_Series(TBars source, bool useNaN = false) : base(source, period: 0, useNaN)
{ {
_TSadl = new(source: source, useNaN: false); _TSadl = new(source: source, useNaN: false);
_TSslow = new(source: _TSadl, period: 10, useNaN: false); _TSslow = new(source: _TSadl, period: 10, useNaN: false);
+11 -12
View File
@@ -2,31 +2,28 @@
using System; using System;
/* <summary> /* <summary>
ATR: wildeR Moving Average ATRP: Average True Range Percent
The average true range (ATR) is a price volatility indicator Average True Range Percent is (ATR/Close Price)*100.
showing the average price variation of assets within a given time period. This normalizes so it can be compared to other stocks.
Sources: Sources:
https://en.wikipedia.org/wiki/Average_true_range https://www.fidelity.com/learning-center/trading-investing/technical-analysis/technical-indicator-guide/atrp
https://www.tradingview.com/wiki/Average_True_Range_(ATR)
https://www.investopedia.com/terms/a/atr.asp
</summary> */ </summary> */
public class ATRP_Series : Single_TBars_Indicator
public class ATR_Series : Single_TBars_Indicator
{ {
private readonly System.Collections.Generic.List<double> _buffer = new(); private readonly System.Collections.Generic.List<double> _buffer = new();
private readonly double _k, _k1m; private readonly double _k, _k1m;
private double _lastema, _lastlastema, _lastcm1; private double _lastema, _lastlastema, _lastcm1;
private double _cm1 = double.NaN; private double _cm1 = double.NaN;
public ATR_Series(TBars source, int period, bool useNaN = false) : base(source, period, useNaN) public ATRP_Series(TBars source, int period, bool useNaN = false) : base(source, period, useNaN)
{ {
this._k = 1.0 / (double)(this._p); this._k = 1.0 / (double)(this._p);
this._k1m = 1.0 - this._k; this._k1m = 1.0 - this._k;
this._lastema = this._lastlastema = double.NaN; this._lastema = this._lastlastema = double.NaN;
if (this._bars.Count > 0) { base.Add(this._bars); } if (_bars.Count > 0) { base.Add(_bars); }
} }
public override void Add((DateTime t, double o, double h, double l, double c, double v) TBar, bool update) public override void Add((DateTime t, double o, double h, double l, double c, double v) TBar, bool update)
@@ -36,7 +33,7 @@ public class ATR_Series : Single_TBars_Indicator
this._cm1 = this._lastcm1; this._cm1 = this._lastcm1;
} }
if (this._cm1 is double.NaN) { this._cm1 = TBar.c; } if (_cm1 is double.NaN) { _cm1 = TBar.c; }
double d1 = Math.Abs(TBar.h - TBar.l); double d1 = Math.Abs(TBar.h - TBar.l);
double d2 = Math.Abs(_cm1 - TBar.h); double d2 = Math.Abs(_cm1 - TBar.h);
double d3 = Math.Abs(_cm1 - TBar.l); double d3 = Math.Abs(_cm1 - TBar.l);
@@ -58,7 +55,9 @@ public class ATR_Series : Single_TBars_Indicator
this._lastlastema = this._lastema; this._lastlastema = this._lastema;
this._lastema = _ema; this._lastema = _ema;
var ret = (d.t, this.Count < this._p - 1 && this._NaN ? double.NaN : _ema); double _atrp = 100 * (_ema / TBar.c);
var ret = (d.t, this.Count < this._p - 1 && this._NaN ? double.NaN : _atrp);
base.Add(ret, update); base.Add(ret, update);
} }
} }
+12 -11
View File
@@ -2,28 +2,31 @@
using System; using System;
/* <summary> /* <summary>
ATRP: Average True Range Percent ATR: wildeR Moving Average
Average True Range Percent is (ATR/Close Price)*100. The average true range (ATR) is a price volatility indicator
This normalizes so it can be compared to other stocks. showing the average price variation of assets within a given time period.
Sources: Sources:
https://www.fidelity.com/learning-center/trading-investing/technical-analysis/technical-indicator-guide/atrp https://en.wikipedia.org/wiki/Average_true_range
https://www.tradingview.com/wiki/Average_True_Range_(ATR)
https://www.investopedia.com/terms/a/atr.asp
</summary> */ </summary> */
public class ATRP_Series : Single_TBars_Indicator
public class ATR_Series : Single_TBars_Indicator
{ {
private readonly System.Collections.Generic.List<double> _buffer = new(); private readonly System.Collections.Generic.List<double> _buffer = new();
private readonly double _k, _k1m; private readonly double _k, _k1m;
private double _lastema, _lastlastema, _lastcm1; private double _lastema, _lastlastema, _lastcm1;
private double _cm1 = double.NaN; private double _cm1 = double.NaN;
public ATRP_Series(TBars source, int period, bool useNaN = false) : base(source, period, useNaN) public ATR_Series(TBars source, int period, bool useNaN = false) : base(source, period, useNaN)
{ {
this._k = 1.0 / (double)(this._p); this._k = 1.0 / (double)(this._p);
this._k1m = 1.0 - this._k; this._k1m = 1.0 - this._k;
this._lastema = this._lastlastema = double.NaN; this._lastema = this._lastlastema = double.NaN;
if (_bars.Count > 0) { base.Add(_bars); } if (this._bars.Count > 0) { base.Add(this._bars); }
} }
public override void Add((DateTime t, double o, double h, double l, double c, double v) TBar, bool update) public override void Add((DateTime t, double o, double h, double l, double c, double v) TBar, bool update)
@@ -33,7 +36,7 @@ public class ATRP_Series : Single_TBars_Indicator
this._cm1 = this._lastcm1; this._cm1 = this._lastcm1;
} }
if (_cm1 is double.NaN) { _cm1 = TBar.c; } if (this._cm1 is double.NaN) { this._cm1 = TBar.c; }
double d1 = Math.Abs(TBar.h - TBar.l); double d1 = Math.Abs(TBar.h - TBar.l);
double d2 = Math.Abs(_cm1 - TBar.h); double d2 = Math.Abs(_cm1 - TBar.h);
double d3 = Math.Abs(_cm1 - TBar.l); double d3 = Math.Abs(_cm1 - TBar.l);
@@ -55,9 +58,7 @@ public class ATRP_Series : Single_TBars_Indicator
this._lastlastema = this._lastema; this._lastlastema = this._lastema;
this._lastema = _ema; this._lastema = _ema;
double _atrp = 100 * (_ema / TBar.c); var ret = (d.t, this.Count < this._p - 1 && this._NaN ? double.NaN : _ema);
var ret = (d.t, this.Count < this._p - 1 && this._NaN ? double.NaN : _atrp);
base.Add(ret, update); base.Add(ret, update);
} }
} }
-43
View File
@@ -1,43 +0,0 @@
namespace QuanTAlib;
using System;
/* <summary>
PVAR: Population Variance
Population variance without Bessel's correction
Sources:
https://en.wikipedia.org/wiki/Variance
Bessel's correction: https://en.wikipedia.org/wiki/Bessel%27s_correction
Remark:
PVAR (Population Variance) is also known as a biased Sample Variance. For unbiased
sample variance use SVAR instead.
</summary> */
public class PVAR_Series : Single_TSeries_Indicator
{
public PVAR_Series(TSeries source, int period, bool useNaN = false) : base(source, period, useNaN)
{
if (base._data.Count > 0) { base.Add(base._data); }
}
private readonly System.Collections.Generic.List<double> _buffer = new();
public override void Add((System.DateTime t, double v) TValue, bool update)
{
if (update) { _buffer[_buffer.Count - 1] = TValue.v; }
else { _buffer.Add(TValue.v); }
if (_buffer.Count > this._p && this._p != 0) { _buffer.RemoveAt(0); }
double _sma = 0;
for (int i = 0; i < _buffer.Count; i++) { _sma += _buffer[i]; }
_sma /= this._buffer.Count;
double _pvar = 0;
for (int i = 0; i < _buffer.Count; i++) { _pvar += (_buffer[i] - _sma) * (_buffer[i] - _sma); }
_pvar /= this._buffer.Count;
var result = (TValue.t, (this.Count < this._p - 1 && this._NaN) ? double.NaN : _pvar);
base.Add(result, update);
}
}
+43
View File
@@ -0,0 +1,43 @@
namespace QuanTAlib;
using System;
/* <summary>
SVAR: Sample Variance
Sample variance uses Bessel's correction to correct the bias in the estimation of population variance.
Sources:
https://en.wikipedia.org/wiki/Variance
Bessel's correction: https://en.wikipedia.org/wiki/Bessel%27s_correction
Remark:
SVAR is also known as the Unbiased Sample Variance, while VAR (Population Variance) is known as
the Biased Sample Variance.
</summary> */
public class SVAR_Series : Single_TSeries_Indicator
{
public SVAR_Series(TSeries source, int period, bool useNaN = false) : base(source, period, useNaN)
{
if (base._data.Count > 0) { base.Add(base._data); }
}
private readonly System.Collections.Generic.List<double> _buffer = new();
public override void Add((System.DateTime t, double v) TValue, bool update)
{
if (update) { this._buffer[this._buffer.Count - 1] = TValue.v; }
else { this._buffer.Add(TValue.v); }
if (this._buffer.Count > this._p && this._p != 0) { this._buffer.RemoveAt(0); }
double _sma = 0;
for (int i = 0; i < this._buffer.Count; i++) { _sma += this._buffer[i]; }
_sma /= this._buffer.Count;
double _svar = 0;
for (int i = 0; i < this._buffer.Count; i++) { _svar += (this._buffer[i] - _sma) * (this._buffer[i] - _sma); }
_svar /= (this._buffer.Count > 1) ? this._buffer.Count - 1 : 1; // Bessel's correction
var result = (TValue.t, (this.Count < this._p - 1 && this._NaN) ? double.NaN : _svar);
base.Add(result, update);
}
}
+12 -12
View File
@@ -2,16 +2,16 @@
using System; using System;
/* <summary> /* <summary>
VAR: Sample Variance VAR: Population Variance
Sample variance uses Bessel's correction to correct the bias in the estimation of population variance. Population variance without Bessel's correction
Sources: Sources:
https://en.wikipedia.org/wiki/Variance https://en.wikipedia.org/wiki/Variance
Bessel's correction: https://en.wikipedia.org/wiki/Bessel%27s_correction Bessel's correction: https://en.wikipedia.org/wiki/Bessel%27s_correction
Remark: Remark:
VAR is also known as the Unbiased Sample Variance, while PVAR (Population Variance) is known as VAR (Population Variance) is also known as a biased Sample Variance. For unbiased
the Biased Sample Variance. sample variance use SVAR instead.
</summary> */ </summary> */
@@ -25,19 +25,19 @@ public class VAR_Series : Single_TSeries_Indicator
public override void Add((System.DateTime t, double v) TValue, bool update) public override void Add((System.DateTime t, double v) TValue, bool update)
{ {
if (update) { this._buffer[this._buffer.Count - 1] = TValue.v; } if (update) { _buffer[_buffer.Count - 1] = TValue.v; }
else { this._buffer.Add(TValue.v); } else { _buffer.Add(TValue.v); }
if (this._buffer.Count > this._p && this._p != 0) { this._buffer.RemoveAt(0); } if (_buffer.Count > this._p && this._p != 0) { _buffer.RemoveAt(0); }
double _sma = 0; double _sma = 0;
for (int i = 0; i < this._buffer.Count; i++) { _sma += this._buffer[i]; } for (int i = 0; i < _buffer.Count; i++) { _sma += _buffer[i]; }
_sma /= this._buffer.Count; _sma /= this._buffer.Count;
double _svar = 0; double _pvar = 0;
for (int i = 0; i < this._buffer.Count; i++) { _svar += (this._buffer[i] - _sma) * (this._buffer[i] - _sma); } for (int i = 0; i < _buffer.Count; i++) { _pvar += (_buffer[i] - _sma) * (_buffer[i] - _sma); }
_svar /= (this._buffer.Count > 1) ? this._buffer.Count - 1 : 1; // Bessel's correction _pvar /= this._buffer.Count;
var result = (TValue.t, (this.Count < this._p - 1 && this._NaN) ? double.NaN : _svar); var result = (TValue.t, (this.Count < this._p - 1 && this._NaN) ? double.NaN : _pvar);
base.Add(result, update); base.Add(result, update);
} }
} }
+2 -2
View File
@@ -9,7 +9,7 @@ public class PVAR_Test
public void Add_Test() public void Add_Test()
{ {
TSeries a = new() { 0, 1, 2, 3, 4, 5 }; TSeries a = new() { 0, 1, 2, 3, 4, 5 };
PVAR_Series c = new(a, 3); SVAR_Series c = new(a, 3);
Assert.Equal(6, c.Count); Assert.Equal(6, c.Count);
a.Add(5); a.Add(5);
Assert.Equal(a.Count, c.Count); Assert.Equal(a.Count, c.Count);
@@ -21,7 +21,7 @@ public class PVAR_Test
public void Edge_Test() public void Edge_Test()
{ {
TSeries a = new() { double.NaN, double.Epsilon, double.PositiveInfinity, double.MaxValue }; TSeries a = new() { double.NaN, double.Epsilon, double.PositiveInfinity, double.MaxValue };
PVAR_Series c = new(a, 3); SVAR_Series c = new(a, 3);
Assert.Equal(a.Count, c.Count); Assert.Equal(a.Count, c.Count);
a.Add(double.NaN); a.Add(double.NaN);
Assert.Equal(a.Count, c.Count); Assert.Equal(a.Count, c.Count);
+2 -2
View File
@@ -9,7 +9,7 @@ public class VAR_Test
public void Add_Test() public void Add_Test()
{ {
TSeries a = new() { 0, 1, 2, 3, 4, 5 }; TSeries a = new() { 0, 1, 2, 3, 4, 5 };
VAR_Series c = new(a, 3); SVAR_Series c = new(a, 3);
Assert.Equal(6, c.Count); Assert.Equal(6, c.Count);
a.Add(5); a.Add(5);
Assert.Equal(a.Count, c.Count); Assert.Equal(a.Count, c.Count);
@@ -21,7 +21,7 @@ public class VAR_Test
public void Edge_Test() public void Edge_Test()
{ {
TSeries a = new() { double.NaN, double.Epsilon, double.PositiveInfinity, double.MaxValue }; TSeries a = new() { double.NaN, double.Epsilon, double.PositiveInfinity, double.MaxValue };
VAR_Series c = new(a, 3); SVAR_Series c = new(a, 3);
Assert.Equal(a.Count, c.Count); Assert.Equal(a.Count, c.Count);
a.Add(double.NaN); a.Add(double.NaN);
Assert.Equal(a.Count, c.Count); Assert.Equal(a.Count, c.Count);
+1
View File
@@ -33,6 +33,7 @@
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference> </PackageReference>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.5.0-preview-20221003-04" /> <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.5.0-preview-20221003-04" />
<PackageReference Include="Python.Included" Version="3.10.0-preview5" />
<PackageReference Include="TALib.NETCore" Version="0.4.4" /> <PackageReference Include="TALib.NETCore" Version="0.4.4" />
<PackageReference Include="Skender.Stock.Indicators" Version="2.4.0" /> <PackageReference Include="Skender.Stock.Indicators" Version="2.4.0" />
<PackageReference Include="xunit" Version="2.4.2" /> <PackageReference Include="xunit" Version="2.4.2" />
+71 -71
View File
@@ -1,4 +1,4 @@
/*
using Xunit; using Xunit;
using System; using System;
@@ -20,6 +20,8 @@ public class PandasTA
this.bars = new(1000); this.bars = new(1000);
this.period = this.rnd.Next(28) + 3; this.period = this.rnd.Next(28) + 3;
Runtime.PythonDLL = @"python310.dll";
Installer.InstallPath = Path.GetFullPath(".");
Installer.SetupPython().Wait(); Installer.SetupPython().Wait();
Installer.TryInstallPip(); Installer.TryInstallPip();
Installer.PipInstallModule("numpy"); Installer.PipInstallModule("numpy");
@@ -34,91 +36,89 @@ public class PandasTA
{ {
PythonEngine.Shutdown(); 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);
[Fact] Assert.Equal(System.Math.Round((double)pta.tail(1), 7), Math.Round(QL.Last().v, 7));
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] [Fact]
void EMA() void TEMA()
{ {
EMA_Series QL = new(this.bars.Close, this.period, false); TEMA_Series QL = new(this.bars.Close, this.period, false);
var pta = this.ta.ema(close: this.df[0], length: this.period); 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)); 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] [Fact]
void TEMA() void WMA()
{ {
TEMA_Series QL = new(this.bars.Close, this.period, false); WMA_Series QL = new(this.bars.Close, this.period, false);
var pta = this.ta.tema(close: this.df[0], length: this.period); 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)); Assert.Equal(System.Math.Round((double)pta.tail(1), 7), Math.Round(QL.Last().v, 7));
} }
[Fact] [Fact]
void ENTP() void DEMA()
{ {
ENTP_Series QL = new(this.bars.Close, this.period, useNaN:false); DEMA_Series QL = new(this.bars.Close, this.period, false);
var pta = this.ta.entropy(close: this.df[0], length: this.period); 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)); 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);
[Fact] Assert.Equal(System.Math.Round((double)pta.tail(1), 7), Math.Round(QL.Last().v, 7));
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 KURT()
{
KURT_Series QL = new(this.bars.Close, this.period, useNaN: false);
var pta = this.ta.kurtosis(close: this.df[0], length: this.period);
[Fact] Assert.Equal(System.Math.Round((double)pta.tail(1), 4), Math.Round(QL.Last().v, 4));
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 MAD()
{
MAD_Series QL = new(this.bars.Close, this.period, useNaN: false);
var pta = this.ta.mad(close: this.df[0], length: this.period);
[Fact] Assert.Equal(System.Math.Round((double)pta.tail(1), 7), Math.Round(QL.Last().v, 7));
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));
}
} }
*/
+42 -5
View File
@@ -30,6 +30,42 @@ public class TA_LIB
///////////////////////////////////////// /////////////////////////////////////////
[Fact]
public void ADD()
{
ADD_Series QL = new(this.bars.Open, this.bars.Close);
Core.Add(this.inopen, this.inclose, 0, this.bars.Count - 1, this.TALIB, out int outBegIdx, out _);
Assert.Equal(Math.Round(this.TALIB[this.TALIB.Length - outBegIdx - 1], 8), Math.Round(QL.Last().v, 8));
}
[Fact]
public void SUB()
{
SUB_Series QL = new(this.bars.Open, this.bars.Close);
Core.Sub(this.inopen, this.inclose, 0, this.bars.Count - 1, this.TALIB, out int outBegIdx, out _);
Assert.Equal(Math.Round(this.TALIB[this.TALIB.Length - outBegIdx - 1], 8), Math.Round(QL.Last().v, 8));
}
[Fact]
public void MUL()
{
MUL_Series QL = new(this.bars.Open, this.bars.Close);
Core.Mult(this.inopen, this.inclose, 0, this.bars.Count - 1, this.TALIB, out int outBegIdx, out _);
Assert.Equal(Math.Round(this.TALIB[this.TALIB.Length - outBegIdx - 1], 8), Math.Round(QL.Last().v, 8));
}
[Fact]
public void DIV()
{
DIV_Series QL = new(this.bars.Open, this.bars.Close);
Core.Div(this.inopen, this.inclose, 0, this.bars.Count - 1, this.TALIB, out int outBegIdx, out _);
Assert.Equal(Math.Round(this.TALIB[this.TALIB.Length - outBegIdx - 1], 8), Math.Round(QL.Last().v, 8));
}
[Fact] [Fact]
public void SDEV() public void SDEV()
{ {
@@ -39,6 +75,7 @@ public class TA_LIB
Assert.Equal(Math.Round(this.TALIB[this.TALIB.Length - outBegIdx - 1], 8), Math.Round(QL.Last().v, 8)); Assert.Equal(Math.Round(this.TALIB[this.TALIB.Length - outBegIdx - 1], 8), Math.Round(QL.Last().v, 8));
} }
[Fact] [Fact]
public void SMA() public void SMA()
{ {
@@ -112,9 +149,9 @@ public class TA_LIB
} }
[Fact] [Fact]
public void ADO() public void ADOSC()
{ {
ADO_Series QL = new(this.bars, false); ADOSC_Series QL = new(this.bars, false);
Core.AdOsc(this.inhigh, this.inlow, this.inclose, this.involume, 0, this.bars.Count - 1, this.TALIB, out int outBegIdx, out _); Core.AdOsc(this.inhigh, this.inlow, this.inclose, this.involume, 0, this.bars.Count - 1, this.TALIB, out int outBegIdx, out _);
Assert.Equal(Math.Round(this.TALIB[this.TALIB.Length - outBegIdx - 1], 8), Math.Round(QL.Last().v, 8)); Assert.Equal(Math.Round(this.TALIB[this.TALIB.Length - outBegIdx - 1], 8), Math.Round(QL.Last().v, 8));
@@ -175,9 +212,9 @@ public class TA_LIB
double[] outLower = new double[this.bars.Count]; double[] outLower = new double[this.bars.Count];
BBANDS_Series QL = new(this.bars.Close, period:26, multiplier:2.0, false); BBANDS_Series QL = new(this.bars.Close, period:26, multiplier:2.0, false);
Core.Bbands(this.inclose, 0, this.bars.Count - 1, outRealUpperBand: outUpper, outRealMiddleBand: outMiddle, outRealLowerBand: outLower, out int outBegIdx, out _, optInTimePeriod:26, optInNbDevUp:2.0, optInNbDevDn:2.0); Core.Bbands(this.inclose, 0, this.bars.Count - 1, outRealUpperBand: outUpper, outRealMiddleBand: outMiddle, outRealLowerBand: outLower, out int outBegIdx, out _, optInTimePeriod:26, optInNbDevUp:2.0, optInNbDevDn:2.0);
Assert.Equal(Math.Round(outUpper[outUpper.Length - outBegIdx - 1], 8), Math.Round(QL.Upper.Last().v, 8)); Assert.Equal(Math.Round(outUpper[outUpper.Length - outBegIdx - 1], 7), Math.Round(QL.Upper.Last().v, 7));
Assert.Equal(Math.Round(outMiddle[outMiddle.Length - outBegIdx - 1], 8), Math.Round(QL.Mid.Last().v, 8)); Assert.Equal(Math.Round(outMiddle[outMiddle.Length - outBegIdx - 1], 7), Math.Round(QL.Mid.Last().v, 7));
Assert.Equal(Math.Round(outLower[outLower.Length - outBegIdx - 1], 8), Math.Round(QL.Lower.Last().v, 8)); Assert.Equal(Math.Round(outLower[outLower.Length - outBegIdx - 1], 7), Math.Round(QL.Lower.Last().v, 7));
} }
+162 -153
View File
@@ -1,155 +1,164 @@
# Coverage of indicators # Coverage of indicators
| Indicator | QuanTAlib | TA-LIB | Skender | Pandas-TA | ✔️= Calculation exists in QuanTAlib
|--|:--:|:--:|:--:|:--:|
| **Basics** ||||| ⭐= Calculation is validated against other TA libraries
| OC2 - (Open+Close)/2 |✔️|||✔️|
| HL2 - (High+Low)/2 |✔️|||✔️| ⛔= Not implemented in QuanTAlib (yet)
| HLC3 - Typical Price |✔️|||✔️|
| OHL3 - (Open+High+Low)/3 |✔️|||✔️| | **BASIC TRANSFORMS** | **QuanTAlib** | **TA-LIB** | **Skender** |
| OHLC4 - (O+H+L+C)/4 |✔️|||✔️| |--|:--:|:--:|:--:|
| HLCC4 - Weighted Price |✔️||✔️|✔️| | ✔️ OC2 - (Open+Close)/2 | .OC2 || GetBaseQuote |
| ZL - Zero Lag - De-lagged price |✔️|||✔️| | ⭐ HL2 - Median Price | .HL2 | MEDPRICE | GetBaseQuote |
| ADD - Addition |✔️|✔️||| | ⭐ HLC3 - Typical Price | .HLC3 | TYPPRICE ||
| SUB - Subtraction |✔️|✔️||| | ✔️ OHL3 - (Open+High+Low)/3 | .OHL3 |||
| MUL - Multiplication |✔️|✔️||| | ⭐ OHLC4 - Average Price | .OHLC4 | AVGPRICE | GetBaseQuote |
| DIV - Division |✔️|✔️||| | ⭐ HLCC4 - Weighted Price | .HLCC4 | WCLPRICE ||
|||||| | ✔️ ZL - De-lagged price (Zero-Lag) | ZL_Series |||
| **Statistics** ||||| | ⭐ MAX - Max value | MAX_Series | MAX ||
| BETA - Beta coefficient |||✔️|| | ⛔ MID - Midpoint value || MIDPOINT ||
| BIAS - Bias |✔️|||✔️| | ⛔ MIDP - Midpoint price || MIDPRICE ||
| ENTR - Entropy |✔️|||✔️| | ⭐ MIN - Min value | MIN_Series | MIN ||
| KUR - Kurtosis |✔️|||✔️| | ⭐ ADD - Addition | ADD_Series | ADD ||
| LINREG - Linear Regression |✔️|✔️|✔️|| | ⭐ SUB - Subtraction | SUB_Series | SUB ||
| MAD - Mean Absolute Deviation |✔️||✔️|✔️| | ⭐ MUL - Multiplication | MUL_Series | MUL ||
| MAPE - Mean Absolute Percent Error |✔️||✔️|| | ⭐ DIV - Division | DIV_Series | DIV ||
| MAX - Max value |✔️|✔️||| |||||
| MIN - Min value |✔️|✔️||| | **STATISTICS & NUMERICAL ANALYSIS** | **QuanTAlib** | **TA-LIB** | **Skender** |
| MED - Median value |✔️|✔️||✔️| | ✔️ BIAS - Bias | BIAS_Series |||
| MSE - Mean Squared Error |✔️||✔️|| | ⛔ CORREL - Pearson's Correlation Coefficient || CORREL | GetCorrelation |
| PSDEV - Population Standard Deviation |✔️|||| | ⛔ COVAR - Covariance ||| GetCorrelation |
| PVAR - Population Variance |✔️|||| | ✔️ ENTP - Entropy | ENTP_Series |||
| QUANTILE ||||✔️| | ✔️ KURT - Kurtosis | KURT_Series |||
| SKEW - Skewness ||||✔️| | ⭐ LINREG - Linear Regression | LINREG_Series || GetSlope |
| SMAPE - Symmetric Mean Absolute Percent Error |✔️|||| | ⭐ MAD - Mean Absolute Deviation | MAD_Series || GetSma |
| SDEV - Sample Standard Deviation |✔️|✔️|✔️|✔️| | ⭐ MAPE - Mean Absolute Percent Error | MAPE_Series || GetSma |
| VAR - Sample Variance |✔️|||✔️| | ✔️ MED - Median value | MED_Series |||
| WMAPE - Weighted Mean Absolute Percent Error |✔️|||| | ✔️ MSE - Mean Squared Error | MSE_Series || GetSma |
| ZSCORE |||✔️|✔️| | ⛔ SKEW - Skewness ||||
|||||| | ⭐ SDEV - Standard Deviation (Volatility) | SDEV_Series |||
| **Moving Averages** ||||| | ✔️ SSDEV - Sample Standard Deviation | SSDEV_Series |||
| AFIRMA - Autoregressive Finite Impulse Response Moving Average ||||| | ✔️ SMAPE - Symmetric Mean Absolute Percent Error | SMAPE_Series |||
| ALMA - Arnaud Legoux Moving Average |✔️||✔️|✔️| | ✔️ VAR - Population Variance | VAR_Series |||
| ARIMA - Autoregressive Integrated Moving Average ||||| | ✔️ SVAR - Sample Variance | SVAR_Series |||
| ATR - Average True Range |✔️|✔️|✔️|✔️| | ⛔ QUANT - Quantile ||||
| ATRP - Average True Range Percent |✔️||✔️|| | ✔️ WMAPE - Weighted Mean Absolute Percent Error | WMAPE_Series |||
| DEMA - Double EMA |✔️|✔️|✔️|✔️| | ⛔ ZSCORE - Number of standard deviations from mean ||||
| EMA - Exponential Moving Average |✔️|✔️|✔️|✔️| |||||
| EPMA - Endpoint Moving Average |||✔️|| | **TREND INDICATORS & AVERAGES** | **QuanTAlib** | **TA-LIB** | **Skender** |
| FWMA - Fibonacci's Weighted Moving Average ||||✔️| | ⛔ AFIRMA - Autoregressive Finite Impulse Response Moving Average ||||
| HEMA - Hull Exponential Moving Average |✔️|||| | ⭐ ALMA - Arnaud Legoux Moving Average | ALMA_Series || GetAlma |
| HMA - Hull Moving Average |✔️||✔️|✔️| | ⛔ ARIMA - Autoregressive Integrated Moving Average ||||
| HWMA - Holt-Winter Moving Average ||||✔️| | ⭐ DEMA - Double EMA Average | DEMA_Series | DEMA | GetDema |
| JMA - Jurik Moving Average |✔️|||✔️| | ⭐ EMA - Exponential Moving Average | EMA_Series || GetEma |
| KAMA - Kaufman's Adaptive Moving Average |✔️|✔️|✔️|✔️| | ⛔ EPMA - Endpoint Moving Average ||| GetEpma |
| LSMA - Least Squares Moving Average |||✔️|| | ⛔ FWMA - Fibonacci's Weighted Moving Average ||||
| MACD - Moving Average Convergence/Divergence |✔️|✔️|✔️|✔️| | ✔️ HEMA - Hull/EMA Average | HEMA_Series |||
| MAMA - MESA Adaptive Moving Average ||✔️|✔️|| | ⛔ Hilbert Transform Instantaneous Trendline || HT_TRENDLINE | GetHtTrendline |
| MMA - Modified Moving Average |||✔️|| | ⭐ HMA - Hull Moving Average | HMA_Series || GetHma |
| NATR - Normalized Average True Range ||✔️|✔️|✔️| | ⛔ HWMA - Holt-Winter Moving Average ||||
| PPMA - Pivot Point Moving Average |||✔️|| | ✔️ JMA - Jurik Moving Average | JMA_Series |||
| PWMA - Pascal's Weighted Moving Average ||||✔️| | ⭐ KAMA - Kaufman's Adaptive Moving Average | KAMA_Series | KAMA | GetKama |
| RMA - WildeR's Moving Average |✔️|||✔️| | ⛔ LSMA - Least Squares Moving Average ||||
| SINWMA - Sine Weighted Moving Average ||||✔️| | ⭐ MACD - Moving Average Convergence/Divergence | MACD_Series | MACD | GetMacd |
| SMA - Simple Moving Average |✔️|✔️|✔️|✔️| | ⛔ MAMA - MESA Adaptive Moving Average || MAMA | GetMama |
| SMMA - Smoothed Moving Average |✔️||✔️|| | MMA - Modified Moving Average ||||
| STOCH - Stochastic Oscillator ||✔️|✔️|✔️| | ⛔ PPMA - Pivot Point Moving Average ||||
| SSF - Ehler's Super Smoother Filter ||||✔️| | ⛔ PWMA - Pascal's Weighted Moving Average ||||
| SUP - Supertrend |||✔️|✔️| | ✔️ RMA - WildeR's Moving Average | RMA__Series |||
| SWMA - Symmetric Weighted Moving Average ||||✔️| | ⛔ SINWMA - Sine Weighted Moving Average ||||
| T3 - Tillson T3 Moving Average ||✔️|✔️|✔️| | ⭐ SMA - Simple Moving Average | SMA_Series |||
| TEMA - Triple EMA |✔️|✔️|✔️|✔️| | ⭐ SMMA - Smoothed Moving Average | SMMA_Series |||
| TRIMA - Triangular Moving Average ||✔️||✔️| | ⛔ SSF - Ehler's Super Smoother Filter ||||
| VIDYA - Variable Index Dynamic Average ||||✔️| | ⛔ SUP - Supertrend ||||
| VWAP - Volume Weighted Average Price |||✔️|✔️| | ⛔ SWMA - Symmetric Weighted Moving Average ||||
| VWMA - Volume Weighted Moving Average |||✔️|✔️| | ⛔ T3 - Tillson T3 Moving Average ||||
| WMA - Weighted Moving Average |✔️|✔️|✔️|✔️| | ⭐ TEMA - Triple EMA Average | TEMA_Series |||
| ZLEMA - Zero Lag EMA |✔️|||✔️| | ⛔ TRIMA - Triangular Moving Average ||||
|||||| | ⛔ VIDYA - Variable Index Dynamic Average ||||
| **Oscillators and Indices** ||||| | ⭐ WMA - Weighted Moving Average | WMA_Series |||
| AC - Acceleration Oscillator ||||✔️| | ✔️ ZLEMA - Zero Lag EMA Average | ZLEMA_Series |||
| AD - Chaikin Accumulation Distribution ||✔️|✔️|✔️| |||||
| ADOSC - Chaikin Accumulation Distribution Oscillator ||✔️|✔️|| | **VOLATILITY INDICATORS** | **QuanTAlib** | **TA-LIB** | **Skender** |
| ADX - Average Directional Movement Index ||✔️|✔️|✔️| | ADL - Chaikin Accumulation Distribution Line | ADL_Series | AD | GetAdl |
| ADXR - Average Directional Movement Index Rating ||✔️|✔️|| | ⭐ ADOSC - Chaikin Accumulation Distribution Oscillator | ADOSC_Series | ADOSC| GetAdl |
| AO - Awesome Oscillator |||✔️|✔️| | ⭐ ATR - Average True Range | ATR_Series | ATR | GetAtr |
| APO - Absolute Price Oscillator ||✔️||✔️| | ⭐ ATRP - Average True Range Percent | ATRP_Series || GetAtr |
| AROON - Aroon oscillator ||✔️|✔️|✔️| | ✔️ BETA - Beta coefficient || BETA | GetBeta |
| BBANDS - Bollinger Bands ||✔️|✔️|✔️| | BBANDS - Bollinger Bands® | BBANDS_Series | BBANDS | GetBollingerBands |
| BOP - Balance of Power ||✔️|✔️|✔️| | ⛔ CRSI - Connor RSI ||| GetConnorsRsi |
| CCI - Commodity Channel Index |✔️|✔️|✔️|✔️| | ⛔ DON - Donchian Channels ||| GetDonchian |
| CFO - Chande Forcast Oscillator ||||✔️| | ⛔ FCB - Fractal Chaos Bands ||| GetFcb |
| CMF - Chaikin Money Flow |||✔️|✔️| | ⛔ HV - Historical Volatility ||||
| CMO - Chande Momentum Oscillator ||✔️||✔️| | ⛔ ICH - Ichimoku ||| GetIchimoku |
| COG - Center of Gravity ||||✔️| | ⛔ KEL - Keltner Channels ||| GetKeltner |
| CRSI - Connor RSI |||✔️|| | ⛔ NATR - Normalized Average True Range || NATR | GetAtr |
| CTI - Ehler's Correlation Trend Indicator ||||✔️| | ⭐ RSI - Relative Strength Index | RSI_Series ||
| DMI - Directional Movement Index ||✔️|✔️|✔️| | ⛔ SAR - Parabolic Stop and Reverse || SAR | GetParabolicSar |
| EFI - Elder Ray's Force Index |||✔️|✔️| | ⛔ SRSI - Stochastic RSI ||||
| GAT - Alligator oscillator |||✔️|| | ⛔ STARC - Starc Bands ||||
| KRI - Kairi Relative Index ||||| | ⭐ TR - True Range | TR_Series |||
| KVO - Klinger Volume Oscillator |||✔️|✔️| | ⛔ UI - Ulcer Index ||||
| MFI - Money Flow Index ||✔️|✔️|✔️| | ⛔ VSTOP - Volatility Stop ||||
| MOM - Momentum |||✔️|✔️| |||||
| NVI - Negative Volume Index ||||✔️| | **MOMENTUM INDICATORS & OSCILLATORS** | **QuanTAlib** | **TA-LIB** | **Skender** |
| PO - Price Oscillator ||||✔️| | ⛔ AC - Acceleration Oscillator ||||
| PPO - Percentage Price Oscillator ||✔️||✔️| | ⛔ ADX - Average Directional Movement Index || ADX | GetAdx |
| PVI - Positive Volume Index ||||✔️| | ⛔ ADXR - Average Directional Movement Index Rating || ADXR | GetAdx |
| RSI - Relative Strength Index |✔️|✔️|✔️|✔️| | ⛔ AO - Awesome Oscillator ||| GetAwesome |
| RVGI - Relative Vigor Index ||||✔️| | ⛔ APO - Absolute Price Oscillator || APO ||
| SRSI - Stochastic RSI |||✔️|✔️| | ⛔ AROON - Aroon oscillator || AROON | GetAroon |
| TRIX - 1-day ROC of TEMA ||✔️|✔️|✔️| | ⛔ BOP - Balance of Power || BOP | GetBop |
| TSI - True Strength Index |||✔️|✔️| | ⭐ CCI - Commodity Channel Index | CCI_Series | CCI | GetCci |
| UI - Ulcer Index |||✔️|✔️| | ⛔ CFO - Chande Forcast Oscillator ||||
| UO - Ultimate Oscillator ||✔️|✔️|✔️| | ⛔ CMF - Chaikin Money Flow ||||
| WGAT - Williams Alligator |||✔️|| | ⛔ CMO - Chande Momentum Oscillator || CMO | GetCmo |
|||||| | ⛔ COG - Center of Gravity ||||
| **Volume** ||||| | ⛔ CTI - Ehler's Correlation Trend Indicator ||||
| AOBV - Archer On-Balance Volume ||||✔️| | ⛔ DPO - Detrended Price Oscillator ||| GetDpo |
| OBV - On-Balance Volume ||✔️|✔️|✔️| | ⛔ DMI - Directional Movement Index || DX | GetAdx |
| PRS - Price Relative Strength |||✔️|| | ⛔ EFI - Elder Ray's Force Index ||| GetElderRay |
| PVOL - Price-Volume ||||| | ⛔ GAT - Alligator oscillator ||| GetGator |
| PVR - Price Volume Rank ||||✔️| | ⛔ HURST - Hurst Exponent ||| GetHurst |
| PVT - Price Volume Trend ||||✔️| | ⛔ KRI - Kairi Relative Index ||||
| VP - Volume Profile ||||✔️| | ⛔ KVO - Klinger Volume Oscillator ||||
|||||| | ⛔ MFI - Money Flow Index || MFI | GetMfi |
|**Unsorted**||||| | ⛔ ROC - Rate of Change (Momentum) || MOM | GetRoc |
| CHN - Price Channel |||✔️|| | ⛔ NVI - Negative Volume Index ||||
| COPPOCK - Coppock Curve ||||✔️| | ⛔ PO - Price Oscillator ||||
| CORREL - Pearson's Correlation Coefficient ||✔️|✔️|| | ⛔ PPO - Percentage Price Oscillator || PPO ||
| EOM - Ease of Movement ||||✔️| | ⛔ PMO - Price Momentum Oscillator ||||
| HILO - Gann High-Low Activator ||||✔️| | ⛔ PVI - Positive Volume Index ||||
| HV - Historical Volatility |||✔️|| | ⛔ RVGI - Relative Vigor Index ||||
| HT - HT Trendline |||✔️|| | ⛔ SMI - Stochastic Momentum Index ||||
| ICH - Ichimoku |||✔️|✔️| | ⛔ STOCH - Stochastic Oscillator ||||
| MCGD - McGinley Dynamic ||||✔️| | ⛔ TRIX - 1-day ROC of TEMA ||||
| ROC - Rate of Change ||✔️|✔️|✔️| | ⛔ TSI - True Strength Index ||||
| SAR - Parabolic Stop and Reverse ||✔️|✔️|✔️| | ⛔ UO - Ultimate Oscillator ||||
| STC - Schaff Trend Cycle |||✔️|✔️| | ⛔ WGAT - Williams Alligator ||||
| TR - True Range ||✔️|✔️|✔️| |||||
| WILLR - Larry Williams' %R ||✔️|✔️|✔️| | **VOLUME INDICATORS** | **QuanTAlib** | **TA-LIB** | **Skender** |
| HURST - Hurst Exponent |||✔️|| | ⛔ AOBV - Archer On-Balance Volume ||||
| VOR - Vortex Indicator |||✔️|✔️| | ⛔ OBV - On-Balance Volume || OBV | GetObv |
| DON - Donchian Channels |||✔️|✔️| | ⛔ PRS - Price Relative Strength |||
| FCB - Fractal Chaos Bands |||✔️|| | ⛔ PVOL - Price-Volume ||||
| KEL - Keltner Channels |||✔️|✔️| | ⛔ PVO - Percentage Volume Oscillator ||||
| PVT - Pivot Points |||✔️|| | PVR - Price Volume Rank ||||
| STARC - Starc Bands |||✔️|| | ⛔ PVT - Price Volume Trend ||||
| DPO - De-trended Price Oscillator |||✔️|✔️| | ⛔ VP - Volume Profile ||||
| KDJ - KDJ Index |||✔️|✔️| | ⛔ VWAP - Volume Weighted Average Price ||||
| SMI - Stochastic Momentum Index |||✔️|✔️| | ⛔ VWMA - Volume Weighted Moving Average ||||
| CHAND - Chandelier Exit |||✔️|| |||||
| VSTOP - Volatility Stop |||✔️|| |**Unsorted** | **QuanTAlib** | **TA-LIB** | **Skender** |
| PVO - Percentage Volume Oscillator |||✔️|✔️| | ⛔ CHN - Price Channel ||||
| Hilbert Transform Instantaneous Trendline ||||| | ⛔ COPPOCK - Coppock Curve ||||
| PMO - Price Momentum Oscillator |||✔️|| | ⛔ EOM - Ease of Movement ||||
| ⛔ HILO - Gann High-Low Activator ||||
| ⛔ HT - HT Trendline ||||
| ⛔ MCGD - McGinley Dynamic ||||
| ⛔ STC - Schaff Trend Cycle ||||
| ⛔ WILLR - Larry Williams' %R ||||
| ⛔ VOR - Vortex Indicator ||||
| ⛔ PVT - Pivot Points ||||
| ⛔ KDJ - KDJ Index ||||
| ⛔ CHAND - Chandelier Exit ||||