Compatibility with TALIB

This commit is contained in:
Miha Kralj
2022-11-22 18:32:58 -08:00
parent ae168ee345
commit 38d0c08b4e
9 changed files with 644 additions and 119 deletions
+32 -17
View File
@@ -1,6 +1,7 @@
namespace QuanTAlib;
using System;
using System.Linq;
using System.Runtime.CompilerServices;
/* <summary>
DEMA: Double Exponential Moving Average
@@ -18,15 +19,15 @@ Remark:
public class DEMA_Series : Single_TSeries_Indicator
{
private readonly System.Collections.Generic.List<double> _buffer = new();
private readonly double _k, _k1m;
private readonly System.Collections.Generic.List<double> _buffer1 = new();
private readonly System.Collections.Generic.List<double> _buffer2 = new();
private readonly double _k;
private double _lastema1, _lastlastema1;
private double _lastema2, _lastlastema2;
public DEMA_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;
_k = 2.0 / (_p + 1);
if (_data.Count > 0) { base.Add(_data); }
}
@@ -34,26 +35,40 @@ public class DEMA_Series : Single_TSeries_Indicator
{
if (update)
{
this._lastema1 = this._lastlastema1;
this._lastema2 = this._lastlastema2;
_lastema1 = _lastlastema1;
_lastema2 = _lastlastema2;
}
double _ema1, _ema2;
if (this.Count < this._p)
double _ema1, _ema2, _dema;
if (this.Count < _p)
{
Add_Replace_Trim(_buffer, TValue.v, _p, update);
double _sma = _buffer.Average();
Add_Replace_Trim(_buffer1, TValue.v, _p, update);
_ema1 = 0;
for (int i=0; i<_buffer1.Count; i++) { _ema1 += _buffer1[i]; }
_ema1 /= _buffer1.Count;
_ema1 = _ema2 = _sma;
Add_Replace_Trim(_buffer2, _ema1, _p, update);
_ema2 = 0;
for (int i = 0; i < _buffer2.Count; i++) { _ema2 += _buffer2[i]; }
_ema2 /= _buffer2.Count;
}
else
else if(this.Count < (2*_p - 1)) // second _p
{
_ema1 = (TValue.v * this._k) + (this._lastema1 * this._k1m);
_ema2 = (_ema1 * this._k) + (this._lastema2 * this._k1m);
_ema1 = (TValue.v - _lastema1) * _k + _lastema1;
Add_Replace_Trim(_buffer2, _ema1, _p, update);
_ema2 = 0;
for (int i = 0; i < _buffer2.Count; i++) { _ema2 += _buffer2[i]; }
_ema2 /= _buffer2.Count;
}
else // all others
{
_ema1 = (TValue.v - _lastema1) * _k + _lastema1;
_ema2 = (_ema1 - _lastema2) * _k + _lastema2;
}
_dema = 2*_ema1 - _ema2;
double _dema = (2 * _ema1) - _ema2;
this._lastlastema1 = this._lastema1;
this._lastlastema2 = this._lastema2;
this._lastema1 = _ema1;
@@ -61,4 +76,4 @@ public class DEMA_Series : Single_TSeries_Indicator
base.Add((TValue.t, _dema), update, _NaN);
}
}
}
+3 -1
View File
@@ -42,7 +42,9 @@ public class EMA_Series : Single_TSeries_Indicator
if (this.Count < this._p)
{
Add_Replace(_buffer, TValue.v, update);
_ema = _buffer.Average();
_ema = 0;
for (int i = 0; i < _buffer.Count; i++) { _ema += _buffer[i]; }
_ema /= _buffer.Count;
}
else
{
+3 -1
View File
@@ -28,7 +28,9 @@ public class SMA_Series : Single_TSeries_Indicator
public override void Add((System.DateTime t, double v) TValue, bool update)
{
Add_Replace_Trim(_buffer, TValue.v, _p, update);
double _sma = _buffer.Sum() / _buffer.Count;
double _sma = 0;
for (int i=0; i<_buffer.Count; i++) { _sma+= _buffer[i]; }
_sma /= _buffer.Count;
base.Add((TValue.t, _sma), update, _NaN);
}