KAMA w. SMA warmup

This commit is contained in:
Miha Kralj
2022-04-24 13:45:17 -07:00
parent 24793f432f
commit 6b9aa85aa1
3 changed files with 110 additions and 64 deletions
+24 -20
View File
@@ -35,26 +35,30 @@ public class KAMA_Series : Single_TSeries_Indicator
_scSlow = 2.0 / (slow+1); _scSlow = 2.0 / (slow+1);
if (base._data.Count > 0) { base.Add(base._data); } if (base._data.Count > 0) { base.Add(base._data); }
} }
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) { {
_buffer[_buffer.Count - 1] = TValue.v; if (update){
this._lastkama = this._lastlastkama; _buffer[_buffer.Count - 1] = TValue.v;
} this._lastkama = this._lastlastkama;
else { } else {
_buffer.Add(TValue.v); _buffer.Add(TValue.v);
} }
if (_buffer.Count>_p+1) { _buffer.RemoveAt(0); } if (_buffer.Count > _p + 1) { _buffer.RemoveAt(0); }
double _kama = TValue.v; double _kama = TValue.v;
double _change = Math.Abs( _buffer[_buffer.Count-1] - _buffer[(_buffer.Count>_p+1)?1:0]); if (this.Count < this._p) {
double _sumpv = 0; for (int i = 0; i < this._buffer.Count; i++) { _kama += this._buffer[i]; }
for (int i = 1; i < _buffer.Count; i++) { _kama /= this._buffer.Count;
_sumpv += Math.Abs(_buffer[(_buffer.Count>0)?i:0]- _buffer[i-1]); } else {
} double _change = Math.Abs(_buffer[_buffer.Count - 1] - _buffer[(_buffer.Count > _p + 1) ? 1 : 0]);
double _er = (_sumpv==0)?0:_change/_sumpv; double _sumpv = 0;
double _sc = (_er * (_scFast - _scSlow)) + _scSlow; for (int i = 1; i < _buffer.Count; i++)
if (_buffer.Count==1) { _lastkama = _buffer[0]; } {
_sumpv += Math.Abs(_buffer[(_buffer.Count > 0) ? i : 0] - _buffer[i - 1]);
_kama = (_lastkama + (_sc * _sc * (TValue.v - _lastkama))); }
double _er = (_sumpv == 0) ? 0 : _change / _sumpv;
double _sc = (_er * (_scFast - _scSlow)) + _scSlow;
_kama = (_lastkama + (_sc * _sc * (TValue.v - _lastkama)));
}
_lastlastkama = _lastkama; _lastlastkama = _lastkama;
_lastkama = _kama; _lastkama = _kama;
var result = (TValue.t, (this.Count < this._p - 1 && this._NaN) ? double.NaN : _kama); var result = (TValue.t, (this.Count < this._p - 1 && this._NaN) ? double.NaN : _kama);
+33
View File
@@ -0,0 +1,33 @@
using Xunit;
using System;
using QuanTAlib;
namespace MovingAvg;
public class KAMA_Test
{
[Fact]
public void Add_Test()
{
TSeries a = new() { 0, 1, 2, 3, 4, 5 };
KAMA_Series c = new(a, 3);
Assert.Equal(6, c.Count);
a.Add(5);
Assert.Equal(a.Count, c.Count);
a.Add(0, update: true);
Assert.Equal(a.Count, c.Count);
}
[Fact]
public void Edge_Test()
{
TSeries a = new() { double.NaN, double.Epsilon, double.PositiveInfinity, double.MaxValue };
KAMA_Series c = new(a, 3);
Assert.Equal(a.Count, c.Count);
a.Add(double.NaN);
Assert.Equal(a.Count, c.Count);
a.Add(double.PositiveInfinity);
Assert.Equal(a.Count, c.Count);
}
}
+11 -2
View File
@@ -1,7 +1,7 @@
using Xunit;
using System; using System;
using Skender.Stock.Indicators;
using QuanTAlib; using QuanTAlib;
using Skender.Stock.Indicators;
using Xunit;
namespace Validation; namespace Validation;
@@ -108,4 +108,13 @@ public class Skender_Stock
Assert.Equal(Math.Round((double)SK.Last().Atrp!, 8), Math.Round(QL.Last().v, 8)); Assert.Equal(Math.Round((double)SK.Last().Atrp!, 8), Math.Round(QL.Last().v, 8));
} }
[Fact]
public void KAMA()
{
KAMA_Series QL = new(this.bars.Close, this.period, useNaN: false);
var SK = this.quotes.GetKama(this.period);
Assert.Equal(Math.Round((double)SK.Last().Kama!, 8), Math.Round(QL.Last().v, 8));
}
} }