mirror of
https://github.com/mihakralj/QuanTAlib.git
synced 2026-08-19 11:08:05 +00:00
Add new data structures and event handling classes for trading platform. Include base classes, value and bar structs, event arguments, emitters, listeners. Update ruleset for SonarLint.
This commit is contained in:
+154
-154
@@ -1,155 +1,155 @@
|
||||
using Xunit;
|
||||
using System;
|
||||
using QuanTAlib;
|
||||
|
||||
namespace Basics;
|
||||
#nullable disable
|
||||
public class Indicators
|
||||
{
|
||||
private static Type[] maSeriesTypes = new Type[]
|
||||
{
|
||||
typeof(SMA_Series),
|
||||
typeof(EMA_Series),
|
||||
typeof(DEMA_Series),
|
||||
typeof(TEMA_Series),
|
||||
typeof(WMA_Series),
|
||||
typeof(ALMA_Series),
|
||||
typeof(DWMA_Series),
|
||||
typeof(FWMA_Series),
|
||||
typeof(HMA_Series),
|
||||
typeof(ZLEMA_Series),
|
||||
typeof(RMA_Series),
|
||||
typeof(HEMA_Series),
|
||||
typeof(JMA_Series),
|
||||
typeof(CUSUM_Series),
|
||||
typeof(SMMA_Series),
|
||||
typeof(T3_Series),
|
||||
typeof(KAMA_Series),
|
||||
typeof(TRIMA_Series),
|
||||
typeof(MAMA_Series),
|
||||
typeof(HWMA_Series),
|
||||
};
|
||||
|
||||
[Theory]
|
||||
[MemberData(nameof(MASeriesData))]
|
||||
public void Name_exists(Type classType)
|
||||
{
|
||||
TSeries data = new("Data") {1,2,3};
|
||||
|
||||
var MA_Series = Activator.CreateInstance(classType, data, 5, false) as TSeries;
|
||||
Assert.NotEmpty(MA_Series.Name);
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[MemberData(nameof(MASeriesData))]
|
||||
public void Series_Length(Type classType)
|
||||
{
|
||||
GBM_Feed feed = new(1000);
|
||||
TSeries data = feed.OHLC4;
|
||||
|
||||
var MA_Series = Activator.CreateInstance(classType, data, 5, false) as TSeries;
|
||||
Assert.Equal(1000, MA_Series.Count);
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[MemberData(nameof(MASeriesData))]
|
||||
public void Return_data(Type classType)
|
||||
{
|
||||
TSeries data = new() { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
|
||||
|
||||
var MA_Series = Activator.CreateInstance(classType, data, 5, false) as TSeries;
|
||||
var result = MA_Series.Add(20);
|
||||
Assert.Equal(result.v, MA_Series.Last.v);
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[MemberData(nameof(MASeriesData))]
|
||||
public void Update(Type classType)
|
||||
{
|
||||
TSeries data = new() { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
|
||||
|
||||
var MA_Series = Activator.CreateInstance(classType, data, 5, false) as TSeries;
|
||||
var pre_update = MA_Series.Last.v;
|
||||
|
||||
double pre_data = data.Last.v;
|
||||
data.Add(20, true);
|
||||
data.Add(pre_data, true);
|
||||
|
||||
Assert.Equal(pre_update, MA_Series.Last.v);
|
||||
Assert.Equal(data.Count, MA_Series.Count);
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[MemberData(nameof(MASeriesData))]
|
||||
public void Period_zero(Type classType)
|
||||
{
|
||||
GBM_Feed feed = new(100);
|
||||
TSeries data = feed.OHLC4;
|
||||
|
||||
var MA_Series = Activator.CreateInstance(classType, data, 0, false) as TSeries;
|
||||
Assert.Equal(data.Count, MA_Series.Count);
|
||||
Assert.False(double.IsNaN(MA_Series.Last.v));
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[MemberData(nameof(MASeriesData))]
|
||||
public void Reset(Type classType)
|
||||
{
|
||||
GBM_Feed feed = new(10);
|
||||
TSeries data = feed.OHLC4;
|
||||
var MA_Series = Activator.CreateInstance(classType, data, 10, false) as TSeries;
|
||||
MA_Series.Reset();
|
||||
data.Add(0);
|
||||
Assert.Equal(data.Last.v, MA_Series.Last.v);
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[MemberData(nameof(MASeriesData))]
|
||||
public void Period_one(Type classType)
|
||||
{
|
||||
GBM_Feed feed = new(100);
|
||||
TSeries data = feed.OHLC4;
|
||||
|
||||
var MA_Series = Activator.CreateInstance(classType, data, 1, false) as TSeries;
|
||||
Assert.InRange(MA_Series.Last.v - data.Last.v, -10e-6, 10e-6);
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[MemberData(nameof(MASeriesData))]
|
||||
public void NaN_test(Type classType)
|
||||
{
|
||||
GBM_Feed feed = new(100);
|
||||
TSeries data = feed.OHLC4;
|
||||
|
||||
var MA_Series = Activator.CreateInstance(classType, data, 10, true) as TSeries;
|
||||
Assert.True(double.IsNaN(MA_Series[0].v));
|
||||
Assert.True(double.IsNaN(MA_Series[8].v));
|
||||
Assert.False(double.IsNaN(MA_Series[9].v));
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[MemberData(nameof(MASeriesData))]
|
||||
public void Edge_numbers(Type classType)
|
||||
{
|
||||
TSeries data = new() { double.Epsilon, double.PositiveInfinity, double.MaxValue, double.NegativeInfinity };
|
||||
var MA_Series = Activator.CreateInstance(classType, data, 10, true) as TSeries;
|
||||
Assert.Equal(4, MA_Series.Count);
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[MemberData(nameof(MASeriesData))]
|
||||
public void handling_NaN(Type classType) {
|
||||
TSeries data = new("Name") { 1, 2, 3, 4, 5, 6, double.NaN, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 };
|
||||
var MA_Series = Activator.CreateInstance(classType, data, 10, true) as TSeries;
|
||||
Assert.False(double.IsNaN(MA_Series.Last.v));
|
||||
}
|
||||
|
||||
public static IEnumerable<object[]> MASeriesData()
|
||||
{
|
||||
foreach (var type in maSeriesTypes)
|
||||
{
|
||||
yield return new object[] { type };
|
||||
}
|
||||
}
|
||||
}
|
||||
using Xunit;
|
||||
using System;
|
||||
using QuanTAlib;
|
||||
|
||||
namespace Basics;
|
||||
#nullable disable
|
||||
public class Indicators
|
||||
{
|
||||
private static Type[] maSeriesTypes = new Type[]
|
||||
{
|
||||
typeof(SMA_Series),
|
||||
typeof(EMA_Series),
|
||||
typeof(DEMA_Series),
|
||||
typeof(TEMA_Series),
|
||||
typeof(WMA_Series),
|
||||
typeof(ALMA_Series),
|
||||
typeof(DWMA_Series),
|
||||
typeof(FWMA_Series),
|
||||
typeof(HMA_Series),
|
||||
typeof(ZLEMA_Series),
|
||||
typeof(RMA_Series),
|
||||
typeof(HEMA_Series),
|
||||
typeof(JMA_Series),
|
||||
typeof(CUSUM_Series),
|
||||
typeof(SMMA_Series),
|
||||
typeof(T3_Series),
|
||||
typeof(KAMA_Series),
|
||||
typeof(TRIMA_Series),
|
||||
typeof(MAMA_Series),
|
||||
typeof(HWMA_Series),
|
||||
};
|
||||
|
||||
[Theory]
|
||||
[MemberData(nameof(MASeriesData))]
|
||||
public void Name_exists(Type classType)
|
||||
{
|
||||
TSeries data = new("Data") {1,2,3};
|
||||
|
||||
var MA_Series = Activator.CreateInstance(classType, data, 5, false) as TSeries;
|
||||
Assert.NotEmpty(MA_Series.Name);
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[MemberData(nameof(MASeriesData))]
|
||||
public void Series_Length(Type classType)
|
||||
{
|
||||
GBM_Feed feed = new(1000);
|
||||
TSeries data = feed.OHLC4;
|
||||
|
||||
var MA_Series = Activator.CreateInstance(classType, data, 5, false) as TSeries;
|
||||
Assert.Equal(1000, MA_Series.Count);
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[MemberData(nameof(MASeriesData))]
|
||||
public void Return_data(Type classType)
|
||||
{
|
||||
TSeries data = new() { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
|
||||
|
||||
var MA_Series = Activator.CreateInstance(classType, data, 5, false) as TSeries;
|
||||
var result = MA_Series.Add(20);
|
||||
Assert.Equal(result.v, MA_Series.Last.v);
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[MemberData(nameof(MASeriesData))]
|
||||
public void Update(Type classType)
|
||||
{
|
||||
TSeries data = new() { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
|
||||
|
||||
var MA_Series = Activator.CreateInstance(classType, data, 5, false) as TSeries;
|
||||
var pre_update = MA_Series.Last.v;
|
||||
|
||||
double pre_data = data.Last.v;
|
||||
data.Add(20, true);
|
||||
data.Add(pre_data, true);
|
||||
|
||||
Assert.Equal(pre_update, MA_Series.Last.v);
|
||||
Assert.Equal(data.Count, MA_Series.Count);
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[MemberData(nameof(MASeriesData))]
|
||||
public void Period_zero(Type classType)
|
||||
{
|
||||
GBM_Feed feed = new(100);
|
||||
TSeries data = feed.OHLC4;
|
||||
|
||||
var MA_Series = Activator.CreateInstance(classType, data, 0, false) as TSeries;
|
||||
Assert.Equal(data.Count, MA_Series.Count);
|
||||
Assert.False(double.IsNaN(MA_Series.Last.v));
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[MemberData(nameof(MASeriesData))]
|
||||
public void Reset(Type classType)
|
||||
{
|
||||
GBM_Feed feed = new(10);
|
||||
TSeries data = feed.OHLC4;
|
||||
var MA_Series = Activator.CreateInstance(classType, data, 10, false) as TSeries;
|
||||
MA_Series.Reset();
|
||||
data.Add(0);
|
||||
Assert.Equal(data.Last.v, MA_Series.Last.v);
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[MemberData(nameof(MASeriesData))]
|
||||
public void Period_one(Type classType)
|
||||
{
|
||||
GBM_Feed feed = new(100);
|
||||
TSeries data = feed.OHLC4;
|
||||
|
||||
var MA_Series = Activator.CreateInstance(classType, data, 1, false) as TSeries;
|
||||
Assert.InRange(MA_Series.Last.v - data.Last.v, -10e-6, 10e-6);
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[MemberData(nameof(MASeriesData))]
|
||||
public void NaN_test(Type classType)
|
||||
{
|
||||
GBM_Feed feed = new(100);
|
||||
TSeries data = feed.OHLC4;
|
||||
|
||||
var MA_Series = Activator.CreateInstance(classType, data, 10, true) as TSeries;
|
||||
Assert.True(double.IsNaN(MA_Series[0].v));
|
||||
Assert.True(double.IsNaN(MA_Series[8].v));
|
||||
Assert.False(double.IsNaN(MA_Series[9].v));
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[MemberData(nameof(MASeriesData))]
|
||||
public void Edge_numbers(Type classType)
|
||||
{
|
||||
TSeries data = new() { double.Epsilon, double.PositiveInfinity, double.MaxValue, double.NegativeInfinity };
|
||||
var MA_Series = Activator.CreateInstance(classType, data, 10, true) as TSeries;
|
||||
Assert.Equal(4, MA_Series.Count);
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[MemberData(nameof(MASeriesData))]
|
||||
public void handling_NaN(Type classType) {
|
||||
TSeries data = new("Name") { 1, 2, 3, 4, 5, 6, double.NaN, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 };
|
||||
var MA_Series = Activator.CreateInstance(classType, data, 10, true) as TSeries;
|
||||
Assert.False(double.IsNaN(MA_Series.Last.v));
|
||||
}
|
||||
|
||||
public static IEnumerable<object[]> MASeriesData()
|
||||
{
|
||||
foreach (var type in maSeriesTypes)
|
||||
{
|
||||
yield return new object[] { type };
|
||||
}
|
||||
}
|
||||
}
|
||||
#nullable restore
|
||||
+159
-159
@@ -1,160 +1,160 @@
|
||||
using Xunit;
|
||||
using System;
|
||||
using System.Runtime.InteropServices;
|
||||
using QuanTAlib;
|
||||
|
||||
namespace Basics;
|
||||
#nullable disable
|
||||
public class Oscillators
|
||||
{
|
||||
private static Type[] maSeriesTypes = new[]
|
||||
{
|
||||
typeof(BIAS_Series),
|
||||
typeof(MAX_Series),
|
||||
typeof(MIN_Series),
|
||||
typeof(MIDPOINT_Series),
|
||||
typeof(ZL_Series),
|
||||
typeof(DECAY_Series),
|
||||
typeof(ENTROPY_Series),
|
||||
typeof(KURTOSIS_Series),
|
||||
typeof(MAD_Series),
|
||||
typeof(MAPE_Series),
|
||||
typeof(MAE_Series),
|
||||
typeof(MSE_Series),
|
||||
typeof(SDEV_Series),
|
||||
typeof(SMAPE_Series),
|
||||
typeof(WMAPE_Series),
|
||||
typeof(SSDEV_Series),
|
||||
typeof(VAR_Series),
|
||||
typeof(SVAR_Series),
|
||||
typeof(MEDIAN_Series),
|
||||
typeof(ZSCORE_Series),
|
||||
typeof(CMO_Series),
|
||||
typeof(RSI_Series),
|
||||
typeof(TRIX_Series),
|
||||
typeof(BBANDS_Series),
|
||||
};
|
||||
|
||||
[Theory]
|
||||
[MemberData(nameof(MASeriesData))]
|
||||
public void Name_exists(Type classType)
|
||||
{
|
||||
TSeries data = new("Data") {1,2,3};
|
||||
|
||||
var MA_Series = Activator.CreateInstance(classType, data, 5, false) as TSeries;
|
||||
Assert.NotEmpty(MA_Series.Name);
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[MemberData(nameof(MASeriesData))]
|
||||
public void Series_Length(Type classType)
|
||||
{
|
||||
GBM_Feed feed = new(1000);
|
||||
TSeries data = feed.OHLC4;
|
||||
|
||||
var MA_Series = Activator.CreateInstance(classType, data, 5, false) as TSeries;
|
||||
Assert.Equal(1000, MA_Series.Count);
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[MemberData(nameof(MASeriesData))]
|
||||
public void Return_data(Type classType)
|
||||
{
|
||||
TSeries data = new() { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
|
||||
|
||||
var MA_Series = Activator.CreateInstance(classType, data, 5, false) as TSeries;
|
||||
var result = MA_Series.Add(20);
|
||||
Assert.Equal(result.v, MA_Series.Last.v);
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[MemberData(nameof(MASeriesData))]
|
||||
public void Update(Type classType)
|
||||
{
|
||||
TSeries data = new() { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
|
||||
|
||||
var MA_Series = Activator.CreateInstance(classType, data, 5, false) as TSeries;
|
||||
var pre_update = MA_Series.Last.v;
|
||||
|
||||
double pre_data = data.Last.v;
|
||||
data.Add(20, true);
|
||||
data.Add(pre_data, true);
|
||||
|
||||
Assert.Equal(pre_update, MA_Series.Last.v);
|
||||
Assert.Equal(data.Count, MA_Series.Count);
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[MemberData(nameof(MASeriesData))]
|
||||
public void Period_zero(Type classType)
|
||||
{
|
||||
GBM_Feed feed = new(100);
|
||||
TSeries data = feed.OHLC4;
|
||||
|
||||
var MA_Series = Activator.CreateInstance(classType, data, 0, false) as TSeries;
|
||||
Assert.Equal(data.Count, MA_Series.Count);
|
||||
Assert.False(double.IsNaN(MA_Series.Last.v));
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[MemberData(nameof(MASeriesData))]
|
||||
public void Reset(Type classType)
|
||||
{
|
||||
GBM_Feed feed = new(10);
|
||||
TSeries data = feed.OHLC4;
|
||||
var MA_Series = Activator.CreateInstance(classType, data, 10, false) as TSeries;
|
||||
MA_Series.Reset();
|
||||
data.Add(1);
|
||||
Assert.False(double.IsNaN(MA_Series.Last.v));
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[MemberData(nameof(MASeriesData))]
|
||||
public void Period_one(Type classType)
|
||||
{
|
||||
GBM_Feed feed = new(100);
|
||||
TSeries data = feed.OHLC4;
|
||||
|
||||
var MA_Series = Activator.CreateInstance(classType, data, 1, false) as TSeries;
|
||||
Assert.False(double.IsNaN(MA_Series[^1].v));
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[MemberData(nameof(MASeriesData))]
|
||||
public void NaN_test(Type classType)
|
||||
{
|
||||
GBM_Feed feed = new(100);
|
||||
TSeries data = feed.OHLC4;
|
||||
|
||||
var MA_Series = Activator.CreateInstance(classType, data, 10, true) as TSeries;
|
||||
Assert.True(double.IsNaN(MA_Series[0].v));
|
||||
Assert.True(double.IsNaN(MA_Series[8].v));
|
||||
Assert.False(double.IsNaN(MA_Series[9].v));
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[MemberData(nameof(MASeriesData))]
|
||||
public void Edge_numbers(Type classType)
|
||||
{
|
||||
TSeries data = new() { double.Epsilon, double.PositiveInfinity, double.MaxValue, double.NegativeInfinity };
|
||||
var MA_Series = Activator.CreateInstance(classType, data, 10, true) as TSeries;
|
||||
Assert.Equal(4, MA_Series.Count);
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[MemberData(nameof(MASeriesData))]
|
||||
public void handling_NaN(Type classType) {
|
||||
TSeries data = new("Name") { 1, 2, 3, 4, 5, 6, double.NaN, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 };
|
||||
var MA_Series = Activator.CreateInstance(classType, data, 10, true) as TSeries;
|
||||
Assert.False(double.IsNaN(MA_Series.Last.v));
|
||||
}
|
||||
|
||||
public static IEnumerable<object[]> MASeriesData()
|
||||
{
|
||||
foreach (var type in maSeriesTypes)
|
||||
{
|
||||
yield return new object[] { type };
|
||||
}
|
||||
}
|
||||
}
|
||||
using Xunit;
|
||||
using System;
|
||||
using System.Runtime.InteropServices;
|
||||
using QuanTAlib;
|
||||
|
||||
namespace Basics;
|
||||
#nullable disable
|
||||
public class Oscillators
|
||||
{
|
||||
private static Type[] maSeriesTypes = new[]
|
||||
{
|
||||
typeof(BIAS_Series),
|
||||
typeof(MAX_Series),
|
||||
typeof(MIN_Series),
|
||||
typeof(MIDPOINT_Series),
|
||||
typeof(ZL_Series),
|
||||
typeof(DECAY_Series),
|
||||
typeof(ENTROPY_Series),
|
||||
typeof(KURTOSIS_Series),
|
||||
typeof(MAD_Series),
|
||||
typeof(MAPE_Series),
|
||||
typeof(MAE_Series),
|
||||
typeof(MSE_Series),
|
||||
typeof(SDEV_Series),
|
||||
typeof(SMAPE_Series),
|
||||
typeof(WMAPE_Series),
|
||||
typeof(SSDEV_Series),
|
||||
typeof(VAR_Series),
|
||||
typeof(SVAR_Series),
|
||||
typeof(MEDIAN_Series),
|
||||
typeof(ZSCORE_Series),
|
||||
typeof(CMO_Series),
|
||||
typeof(RSI_Series),
|
||||
typeof(TRIX_Series),
|
||||
typeof(BBANDS_Series),
|
||||
};
|
||||
|
||||
[Theory]
|
||||
[MemberData(nameof(MASeriesData))]
|
||||
public void Name_exists(Type classType)
|
||||
{
|
||||
TSeries data = new("Data") {1,2,3};
|
||||
|
||||
var MA_Series = Activator.CreateInstance(classType, data, 5, false) as TSeries;
|
||||
Assert.NotEmpty(MA_Series.Name);
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[MemberData(nameof(MASeriesData))]
|
||||
public void Series_Length(Type classType)
|
||||
{
|
||||
GBM_Feed feed = new(1000);
|
||||
TSeries data = feed.OHLC4;
|
||||
|
||||
var MA_Series = Activator.CreateInstance(classType, data, 5, false) as TSeries;
|
||||
Assert.Equal(1000, MA_Series.Count);
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[MemberData(nameof(MASeriesData))]
|
||||
public void Return_data(Type classType)
|
||||
{
|
||||
TSeries data = new() { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
|
||||
|
||||
var MA_Series = Activator.CreateInstance(classType, data, 5, false) as TSeries;
|
||||
var result = MA_Series.Add(20);
|
||||
Assert.Equal(result.v, MA_Series.Last.v);
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[MemberData(nameof(MASeriesData))]
|
||||
public void Update(Type classType)
|
||||
{
|
||||
TSeries data = new() { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
|
||||
|
||||
var MA_Series = Activator.CreateInstance(classType, data, 5, false) as TSeries;
|
||||
var pre_update = MA_Series.Last.v;
|
||||
|
||||
double pre_data = data.Last.v;
|
||||
data.Add(20, true);
|
||||
data.Add(pre_data, true);
|
||||
|
||||
Assert.Equal(pre_update, MA_Series.Last.v);
|
||||
Assert.Equal(data.Count, MA_Series.Count);
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[MemberData(nameof(MASeriesData))]
|
||||
public void Period_zero(Type classType)
|
||||
{
|
||||
GBM_Feed feed = new(100);
|
||||
TSeries data = feed.OHLC4;
|
||||
|
||||
var MA_Series = Activator.CreateInstance(classType, data, 0, false) as TSeries;
|
||||
Assert.Equal(data.Count, MA_Series.Count);
|
||||
Assert.False(double.IsNaN(MA_Series.Last.v));
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[MemberData(nameof(MASeriesData))]
|
||||
public void Reset(Type classType)
|
||||
{
|
||||
GBM_Feed feed = new(10);
|
||||
TSeries data = feed.OHLC4;
|
||||
var MA_Series = Activator.CreateInstance(classType, data, 10, false) as TSeries;
|
||||
MA_Series.Reset();
|
||||
data.Add(1);
|
||||
Assert.False(double.IsNaN(MA_Series.Last.v));
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[MemberData(nameof(MASeriesData))]
|
||||
public void Period_one(Type classType)
|
||||
{
|
||||
GBM_Feed feed = new(100);
|
||||
TSeries data = feed.OHLC4;
|
||||
|
||||
var MA_Series = Activator.CreateInstance(classType, data, 1, false) as TSeries;
|
||||
Assert.False(double.IsNaN(MA_Series[^1].v));
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[MemberData(nameof(MASeriesData))]
|
||||
public void NaN_test(Type classType)
|
||||
{
|
||||
GBM_Feed feed = new(100);
|
||||
TSeries data = feed.OHLC4;
|
||||
|
||||
var MA_Series = Activator.CreateInstance(classType, data, 10, true) as TSeries;
|
||||
Assert.True(double.IsNaN(MA_Series[0].v));
|
||||
Assert.True(double.IsNaN(MA_Series[8].v));
|
||||
Assert.False(double.IsNaN(MA_Series[9].v));
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[MemberData(nameof(MASeriesData))]
|
||||
public void Edge_numbers(Type classType)
|
||||
{
|
||||
TSeries data = new() { double.Epsilon, double.PositiveInfinity, double.MaxValue, double.NegativeInfinity };
|
||||
var MA_Series = Activator.CreateInstance(classType, data, 10, true) as TSeries;
|
||||
Assert.Equal(4, MA_Series.Count);
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[MemberData(nameof(MASeriesData))]
|
||||
public void handling_NaN(Type classType) {
|
||||
TSeries data = new("Name") { 1, 2, 3, 4, 5, 6, double.NaN, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 };
|
||||
var MA_Series = Activator.CreateInstance(classType, data, 10, true) as TSeries;
|
||||
Assert.False(double.IsNaN(MA_Series.Last.v));
|
||||
}
|
||||
|
||||
public static IEnumerable<object[]> MASeriesData()
|
||||
{
|
||||
foreach (var type in maSeriesTypes)
|
||||
{
|
||||
yield return new object[] { type };
|
||||
}
|
||||
}
|
||||
}
|
||||
#nullable restore
|
||||
@@ -1,96 +1,96 @@
|
||||
using Xunit;
|
||||
using System;
|
||||
using System.Runtime.InteropServices;
|
||||
using QuanTAlib;
|
||||
|
||||
namespace Basics;
|
||||
#nullable disable
|
||||
public class TBars
|
||||
{
|
||||
private static Type[] maSeriesTypes = new Type[]
|
||||
{
|
||||
typeof(ATR_Series),
|
||||
typeof(ATRP_Series),
|
||||
typeof(TR_Series),
|
||||
typeof(ADL_Series),
|
||||
typeof(CCI_Series),
|
||||
typeof(OBV_Series),
|
||||
typeof(ADOSC_Series),
|
||||
typeof(MIDPRICE_Series),
|
||||
};
|
||||
|
||||
[Theory]
|
||||
[MemberData(nameof(MASeriesData))]
|
||||
public void Name_exists(Type classType)
|
||||
{
|
||||
GBM_Feed data = new(10);
|
||||
|
||||
var MA_Series = Activator.CreateInstance(classType, data) as TSeries;
|
||||
Assert.NotEmpty(MA_Series.Name);
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[MemberData(nameof(MASeriesData))]
|
||||
public void Series_Length(Type classType)
|
||||
{
|
||||
GBM_Feed data = new(1000);
|
||||
|
||||
var MA_Series = Activator.CreateInstance(classType, data) as TSeries;
|
||||
Assert.Equal(1000, MA_Series.Count);
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[MemberData(nameof(MASeriesData))]
|
||||
public void Return_data(Type classType)
|
||||
{
|
||||
GBM_Feed data = new(10);
|
||||
var MA_Series = Activator.CreateInstance(classType, data) as TSeries;
|
||||
var result = MA_Series.Add((DateTime.Today, 1,2,3,4,5));
|
||||
Assert.Equal(result.v, MA_Series.Last.v);
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[MemberData(nameof(MASeriesData))]
|
||||
public void Update(Type classType)
|
||||
{
|
||||
GBM_Feed data = new(10);
|
||||
var MA_Series = Activator.CreateInstance(classType, data) as TSeries;
|
||||
var pre_update = MA_Series.Last;
|
||||
|
||||
var pre_data = data.Last;
|
||||
data.Add((DateTime.Today, 1, 2, 3, 4, 5), true);
|
||||
data.Add(pre_data, true);
|
||||
|
||||
Assert.Equal(pre_update.v, MA_Series.Last.v);
|
||||
Assert.Equal(data.Count, MA_Series.Count);
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[MemberData(nameof(MASeriesData))]
|
||||
public void Reset(Type classType)
|
||||
{
|
||||
GBM_Feed data = new(10);
|
||||
var MA_Series = Activator.CreateInstance(classType, data) as TSeries;
|
||||
MA_Series.Reset();
|
||||
data.Add();
|
||||
Assert.False(double.IsNaN(MA_Series.Last.v));
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[MemberData(nameof(MASeriesData))]
|
||||
public void Period_default(Type classType) {
|
||||
GBM_Feed data = new(100);
|
||||
|
||||
var MA_Series = Activator.CreateInstance(classType, data) as TSeries;
|
||||
Assert.False(double.IsNaN(MA_Series.Last.v));
|
||||
}
|
||||
|
||||
public static IEnumerable<object[]> MASeriesData()
|
||||
{
|
||||
foreach (var type in maSeriesTypes)
|
||||
{
|
||||
yield return new object[] { type };
|
||||
}
|
||||
}
|
||||
}
|
||||
using Xunit;
|
||||
using System;
|
||||
using System.Runtime.InteropServices;
|
||||
using QuanTAlib;
|
||||
|
||||
namespace Basics;
|
||||
#nullable disable
|
||||
public class TBars
|
||||
{
|
||||
private static Type[] maSeriesTypes = new Type[]
|
||||
{
|
||||
typeof(ATR_Series),
|
||||
typeof(ATRP_Series),
|
||||
typeof(TR_Series),
|
||||
typeof(ADL_Series),
|
||||
typeof(CCI_Series),
|
||||
typeof(OBV_Series),
|
||||
typeof(ADOSC_Series),
|
||||
typeof(MIDPRICE_Series),
|
||||
};
|
||||
|
||||
[Theory]
|
||||
[MemberData(nameof(MASeriesData))]
|
||||
public void Name_exists(Type classType)
|
||||
{
|
||||
GBM_Feed data = new(10);
|
||||
|
||||
var MA_Series = Activator.CreateInstance(classType, data) as TSeries;
|
||||
Assert.NotEmpty(MA_Series.Name);
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[MemberData(nameof(MASeriesData))]
|
||||
public void Series_Length(Type classType)
|
||||
{
|
||||
GBM_Feed data = new(1000);
|
||||
|
||||
var MA_Series = Activator.CreateInstance(classType, data) as TSeries;
|
||||
Assert.Equal(1000, MA_Series.Count);
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[MemberData(nameof(MASeriesData))]
|
||||
public void Return_data(Type classType)
|
||||
{
|
||||
GBM_Feed data = new(10);
|
||||
var MA_Series = Activator.CreateInstance(classType, data) as TSeries;
|
||||
var result = MA_Series.Add((DateTime.Today, 1,2,3,4,5));
|
||||
Assert.Equal(result.v, MA_Series.Last.v);
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[MemberData(nameof(MASeriesData))]
|
||||
public void Update(Type classType)
|
||||
{
|
||||
GBM_Feed data = new(10);
|
||||
var MA_Series = Activator.CreateInstance(classType, data) as TSeries;
|
||||
var pre_update = MA_Series.Last;
|
||||
|
||||
var pre_data = data.Last;
|
||||
data.Add((DateTime.Today, 1, 2, 3, 4, 5), true);
|
||||
data.Add(pre_data, true);
|
||||
|
||||
Assert.Equal(pre_update.v, MA_Series.Last.v);
|
||||
Assert.Equal(data.Count, MA_Series.Count);
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[MemberData(nameof(MASeriesData))]
|
||||
public void Reset(Type classType)
|
||||
{
|
||||
GBM_Feed data = new(10);
|
||||
var MA_Series = Activator.CreateInstance(classType, data) as TSeries;
|
||||
MA_Series.Reset();
|
||||
data.Add();
|
||||
Assert.False(double.IsNaN(MA_Series.Last.v));
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[MemberData(nameof(MASeriesData))]
|
||||
public void Period_default(Type classType) {
|
||||
GBM_Feed data = new(100);
|
||||
|
||||
var MA_Series = Activator.CreateInstance(classType, data) as TSeries;
|
||||
Assert.False(double.IsNaN(MA_Series.Last.v));
|
||||
}
|
||||
|
||||
public static IEnumerable<object[]> MASeriesData()
|
||||
{
|
||||
foreach (var type in maSeriesTypes)
|
||||
{
|
||||
yield return new object[] { type };
|
||||
}
|
||||
}
|
||||
}
|
||||
#nullable restore
|
||||
+64
-64
@@ -1,64 +1,64 @@
|
||||
using Xunit;
|
||||
using System;
|
||||
using QuanTAlib;
|
||||
|
||||
namespace Pairs;
|
||||
public class ADD_Test
|
||||
{
|
||||
[Fact]
|
||||
public void ADDSeriesSeries_Test()
|
||||
{
|
||||
TSeries a = new() { 0, 1, 2, 3, 4, 5 };
|
||||
TSeries b = new() { 5, 4, 3, 2, 1, 0 };
|
||||
ADD_Series c = new(a, b);
|
||||
Assert.Equal(5, c.Last().v);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ADDSeriesDouble_Test()
|
||||
{
|
||||
TSeries a = new() { 0, 1, 2, 3, 4, 5 };
|
||||
ADD_Series c = new(a, 10.0);
|
||||
Assert.Equal(15, c.Last().v);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ADDDoubleSeries_Test()
|
||||
{
|
||||
TSeries a = new() { 0, 1, 2, 3, 4, 5 };
|
||||
ADD_Series c = new(10.0, a);
|
||||
Assert.Equal(15, c.Last().v);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ADDEventing_Test()
|
||||
{
|
||||
TSeries a = new() { 0, 1, 2, 3, 4, 5 };
|
||||
TSeries b = new() { 5, 4, 3, 2, 1, 0 };
|
||||
ADD_Series c = new(a, b);
|
||||
a.Add(2);
|
||||
b.Add(2);
|
||||
Assert.Equal(4, c.Last().v);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ADDUpdateDouble_Test()
|
||||
{
|
||||
TSeries a = new() { 0, 1, 2, 3, 4, 5 };
|
||||
double b = 10;
|
||||
ADD_Series c = new(a, b);
|
||||
a.Add(0, true);
|
||||
Assert.Equal(10, c.Last().v);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ADDUpdating_Test()
|
||||
{
|
||||
TSeries a = new() { 0, 1, 2, 3, 4, 5 };
|
||||
TSeries b = new() { 5, 4, 3, 2, 1, 0 };
|
||||
ADD_Series c = new(a, b);
|
||||
a.Add(10, true);
|
||||
b.Add(10, true);
|
||||
Assert.Equal(20, c.Last().v);
|
||||
}
|
||||
}
|
||||
using Xunit;
|
||||
using System;
|
||||
using QuanTAlib;
|
||||
|
||||
namespace Pairs;
|
||||
public class ADD_Test
|
||||
{
|
||||
[Fact]
|
||||
public void ADDSeriesSeries_Test()
|
||||
{
|
||||
TSeries a = new() { 0, 1, 2, 3, 4, 5 };
|
||||
TSeries b = new() { 5, 4, 3, 2, 1, 0 };
|
||||
ADD_Series c = new(a, b);
|
||||
Assert.Equal(5, c.Last().v);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ADDSeriesDouble_Test()
|
||||
{
|
||||
TSeries a = new() { 0, 1, 2, 3, 4, 5 };
|
||||
ADD_Series c = new(a, 10.0);
|
||||
Assert.Equal(15, c.Last().v);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ADDDoubleSeries_Test()
|
||||
{
|
||||
TSeries a = new() { 0, 1, 2, 3, 4, 5 };
|
||||
ADD_Series c = new(10.0, a);
|
||||
Assert.Equal(15, c.Last().v);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ADDEventing_Test()
|
||||
{
|
||||
TSeries a = new() { 0, 1, 2, 3, 4, 5 };
|
||||
TSeries b = new() { 5, 4, 3, 2, 1, 0 };
|
||||
ADD_Series c = new(a, b);
|
||||
a.Add(2);
|
||||
b.Add(2);
|
||||
Assert.Equal(4, c.Last().v);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ADDUpdateDouble_Test()
|
||||
{
|
||||
TSeries a = new() { 0, 1, 2, 3, 4, 5 };
|
||||
double b = 10;
|
||||
ADD_Series c = new(a, b);
|
||||
a.Add(0, true);
|
||||
Assert.Equal(10, c.Last().v);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ADDUpdating_Test()
|
||||
{
|
||||
TSeries a = new() { 0, 1, 2, 3, 4, 5 };
|
||||
TSeries b = new() { 5, 4, 3, 2, 1, 0 };
|
||||
ADD_Series c = new(a, b);
|
||||
a.Add(10, true);
|
||||
b.Add(10, true);
|
||||
Assert.Equal(20, c.Last().v);
|
||||
}
|
||||
}
|
||||
|
||||
+64
-64
@@ -1,64 +1,64 @@
|
||||
using Xunit;
|
||||
using System;
|
||||
using QuanTAlib;
|
||||
|
||||
namespace Pairs;
|
||||
public class DIV_Test
|
||||
{
|
||||
[Fact]
|
||||
public void DIVSeriesSeries_Test()
|
||||
{
|
||||
TSeries a = new() { 0, 1, 2, 3, 4, 15 };
|
||||
TSeries b = new() { 5, 4, 3, 2, 1, 3 };
|
||||
DIV_Series c = new(a, b);
|
||||
Assert.Equal(5, c.Last().v);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void DIVSeriesDouble_Test()
|
||||
{
|
||||
TSeries a = new() { 0, 1, 2, 3, 4, 15.0 };
|
||||
DIV_Series c = new(a, 0);
|
||||
Assert.Equal(double.PositiveInfinity, c.Last().v);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void DIVDoubleSeries_Test()
|
||||
{
|
||||
TSeries a = new() { 0, 1, 2, 3, 4, 3.0 };
|
||||
DIV_Series c = new(12.0, a);
|
||||
Assert.Equal(4.0, c.Last().v);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void DIVEventing_Test()
|
||||
{
|
||||
TSeries a = new() { 0, 1, 2, 3, 4, 5 };
|
||||
TSeries b = new() { 5, 4, 3, 2, 1, 0 };
|
||||
DIV_Series c = new(a, b);
|
||||
a.Add(12.0);
|
||||
b.Add(2);
|
||||
Assert.Equal(6.0, c.Last().v);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void DIVUpdatewDouble_Test()
|
||||
{
|
||||
TSeries a = new() { 0, 1, 2, 3, 4, 15 };
|
||||
double b = 2;
|
||||
DIV_Series c = new(a, b);
|
||||
a.Add(10, true);
|
||||
Assert.Equal(5, c.Last().v);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void DIVUpdating_Test()
|
||||
{
|
||||
TSeries a = new() { 0, 1, 2, 3, 4, 5 };
|
||||
TSeries b = new() { 5, 4, 3, 2, 1, 1 };
|
||||
DIV_Series c = new(a, b);
|
||||
a.Add(10, true);
|
||||
b.Add(2, true);
|
||||
Assert.Equal(5, c.Last().v);
|
||||
}
|
||||
}
|
||||
using Xunit;
|
||||
using System;
|
||||
using QuanTAlib;
|
||||
|
||||
namespace Pairs;
|
||||
public class DIV_Test
|
||||
{
|
||||
[Fact]
|
||||
public void DIVSeriesSeries_Test()
|
||||
{
|
||||
TSeries a = new() { 0, 1, 2, 3, 4, 15 };
|
||||
TSeries b = new() { 5, 4, 3, 2, 1, 3 };
|
||||
DIV_Series c = new(a, b);
|
||||
Assert.Equal(5, c.Last().v);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void DIVSeriesDouble_Test()
|
||||
{
|
||||
TSeries a = new() { 0, 1, 2, 3, 4, 15.0 };
|
||||
DIV_Series c = new(a, 0);
|
||||
Assert.Equal(double.PositiveInfinity, c.Last().v);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void DIVDoubleSeries_Test()
|
||||
{
|
||||
TSeries a = new() { 0, 1, 2, 3, 4, 3.0 };
|
||||
DIV_Series c = new(12.0, a);
|
||||
Assert.Equal(4.0, c.Last().v);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void DIVEventing_Test()
|
||||
{
|
||||
TSeries a = new() { 0, 1, 2, 3, 4, 5 };
|
||||
TSeries b = new() { 5, 4, 3, 2, 1, 0 };
|
||||
DIV_Series c = new(a, b);
|
||||
a.Add(12.0);
|
||||
b.Add(2);
|
||||
Assert.Equal(6.0, c.Last().v);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void DIVUpdatewDouble_Test()
|
||||
{
|
||||
TSeries a = new() { 0, 1, 2, 3, 4, 15 };
|
||||
double b = 2;
|
||||
DIV_Series c = new(a, b);
|
||||
a.Add(10, true);
|
||||
Assert.Equal(5, c.Last().v);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void DIVUpdating_Test()
|
||||
{
|
||||
TSeries a = new() { 0, 1, 2, 3, 4, 5 };
|
||||
TSeries b = new() { 5, 4, 3, 2, 1, 1 };
|
||||
DIV_Series c = new(a, b);
|
||||
a.Add(10, true);
|
||||
b.Add(2, true);
|
||||
Assert.Equal(5, c.Last().v);
|
||||
}
|
||||
}
|
||||
|
||||
+64
-64
@@ -1,64 +1,64 @@
|
||||
using Xunit;
|
||||
using System;
|
||||
using QuanTAlib;
|
||||
|
||||
namespace Pairs;
|
||||
public class MUL_Test
|
||||
{
|
||||
[Fact]
|
||||
public void MULSeriesSeries_Test()
|
||||
{
|
||||
TSeries a = new() { 0, 1, 2, 3, 4, 5 };
|
||||
TSeries b = new() { 5, 4, 3, 2, 1, 1 };
|
||||
MUL_Series c = new(a, b);
|
||||
Assert.Equal(5, c.Last().v);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void MULSeriesDouble_Test()
|
||||
{
|
||||
TSeries a = new() { 0, 1, 2, 3, 4, 5 };
|
||||
MUL_Series c = new(a, 10.0);
|
||||
Assert.Equal(50, c.Last().v);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void MULDoubleSeries_Test()
|
||||
{
|
||||
TSeries a = new() { 0, 1, 2, 3, 4, 5 };
|
||||
MUL_Series c = new(5.0, a);
|
||||
Assert.Equal(25, c.Last().v);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void MULEventing_Test()
|
||||
{
|
||||
TSeries a = new() { 0, 1, 2, 3, 4, 5 };
|
||||
TSeries b = new() { 5, 4, 3, 2, 1, 0 };
|
||||
MUL_Series c = new(a, b);
|
||||
a.Add(2);
|
||||
b.Add(5);
|
||||
Assert.Equal(10, c.Last().v);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void MULUpdateDouble_Test()
|
||||
{
|
||||
TSeries a = new() { 0, 1, 2, 3, 4, 5 };
|
||||
double b = 10;
|
||||
MUL_Series c = new(a, b);
|
||||
a.Add(2, true);
|
||||
Assert.Equal(20, c.Last().v);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void MULUpdating_Test()
|
||||
{
|
||||
TSeries a = new() { 0, 1, 2, 3, 4, 5 };
|
||||
TSeries b = new() { 5, 4, 3, 2, 1, 0 };
|
||||
MUL_Series c = new(a, b);
|
||||
a.Add(10, true);
|
||||
b.Add(10, true);
|
||||
Assert.Equal(100, c.Last().v);
|
||||
}
|
||||
}
|
||||
using Xunit;
|
||||
using System;
|
||||
using QuanTAlib;
|
||||
|
||||
namespace Pairs;
|
||||
public class MUL_Test
|
||||
{
|
||||
[Fact]
|
||||
public void MULSeriesSeries_Test()
|
||||
{
|
||||
TSeries a = new() { 0, 1, 2, 3, 4, 5 };
|
||||
TSeries b = new() { 5, 4, 3, 2, 1, 1 };
|
||||
MUL_Series c = new(a, b);
|
||||
Assert.Equal(5, c.Last().v);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void MULSeriesDouble_Test()
|
||||
{
|
||||
TSeries a = new() { 0, 1, 2, 3, 4, 5 };
|
||||
MUL_Series c = new(a, 10.0);
|
||||
Assert.Equal(50, c.Last().v);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void MULDoubleSeries_Test()
|
||||
{
|
||||
TSeries a = new() { 0, 1, 2, 3, 4, 5 };
|
||||
MUL_Series c = new(5.0, a);
|
||||
Assert.Equal(25, c.Last().v);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void MULEventing_Test()
|
||||
{
|
||||
TSeries a = new() { 0, 1, 2, 3, 4, 5 };
|
||||
TSeries b = new() { 5, 4, 3, 2, 1, 0 };
|
||||
MUL_Series c = new(a, b);
|
||||
a.Add(2);
|
||||
b.Add(5);
|
||||
Assert.Equal(10, c.Last().v);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void MULUpdateDouble_Test()
|
||||
{
|
||||
TSeries a = new() { 0, 1, 2, 3, 4, 5 };
|
||||
double b = 10;
|
||||
MUL_Series c = new(a, b);
|
||||
a.Add(2, true);
|
||||
Assert.Equal(20, c.Last().v);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void MULUpdating_Test()
|
||||
{
|
||||
TSeries a = new() { 0, 1, 2, 3, 4, 5 };
|
||||
TSeries b = new() { 5, 4, 3, 2, 1, 0 };
|
||||
MUL_Series c = new(a, b);
|
||||
a.Add(10, true);
|
||||
b.Add(10, true);
|
||||
Assert.Equal(100, c.Last().v);
|
||||
}
|
||||
}
|
||||
|
||||
+64
-64
@@ -1,64 +1,64 @@
|
||||
using Xunit;
|
||||
using System;
|
||||
using QuanTAlib;
|
||||
|
||||
namespace Pairs;
|
||||
public class SUB_Test
|
||||
{
|
||||
[Fact]
|
||||
public void SUBSeriesSeries_Test()
|
||||
{
|
||||
TSeries a = new() { 0, 1, 2, 3, 4, 5 };
|
||||
TSeries b = new() { 5, 4, 3, 2, 1, 1 };
|
||||
SUB_Series c = new(a, b);
|
||||
Assert.Equal(4, c.Last().v);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void SUBSeriesDouble_Test()
|
||||
{
|
||||
TSeries a = new() { 0, 1, 2, 3, 4, 15.0 };
|
||||
SUB_Series c = new(a, 10.0);
|
||||
Assert.Equal(5.0, c.Last().v);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void SUBDoubleSeries_Test()
|
||||
{
|
||||
TSeries a = new() { 0, 1, 2, 3, 4, 15.0 };
|
||||
SUB_Series c = new(10.0, a);
|
||||
Assert.Equal(-5.0, c.Last().v);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void SUBEventing_Test()
|
||||
{
|
||||
TSeries a = new() { 0, 1, 2, 3, 4, 5 };
|
||||
TSeries b = new() { 5, 4, 3, 2, 1, 0 };
|
||||
SUB_Series c = new(a, b);
|
||||
a.Add(7.0);
|
||||
b.Add(2);
|
||||
Assert.Equal(5.0, c.Last().v);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void SUBUpdatewDouble_Test()
|
||||
{
|
||||
TSeries a = new() { 0, 1, 2, 3, 4, 15 };
|
||||
double b = 10;
|
||||
SUB_Series c = new(a, b);
|
||||
a.Add(1, true);
|
||||
Assert.Equal(-9, c.Last().v);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void SUBUpdating_Test()
|
||||
{
|
||||
TSeries a = new() { 0, 1, 2, 3, 4, 5 };
|
||||
TSeries b = new() { 5, 4, 3, 2, 1, 1 };
|
||||
SUB_Series c = new(a, b);
|
||||
a.Add(10, true);
|
||||
b.Add(0, true);
|
||||
Assert.Equal(10, c.Last().v);
|
||||
}
|
||||
}
|
||||
using Xunit;
|
||||
using System;
|
||||
using QuanTAlib;
|
||||
|
||||
namespace Pairs;
|
||||
public class SUB_Test
|
||||
{
|
||||
[Fact]
|
||||
public void SUBSeriesSeries_Test()
|
||||
{
|
||||
TSeries a = new() { 0, 1, 2, 3, 4, 5 };
|
||||
TSeries b = new() { 5, 4, 3, 2, 1, 1 };
|
||||
SUB_Series c = new(a, b);
|
||||
Assert.Equal(4, c.Last().v);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void SUBSeriesDouble_Test()
|
||||
{
|
||||
TSeries a = new() { 0, 1, 2, 3, 4, 15.0 };
|
||||
SUB_Series c = new(a, 10.0);
|
||||
Assert.Equal(5.0, c.Last().v);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void SUBDoubleSeries_Test()
|
||||
{
|
||||
TSeries a = new() { 0, 1, 2, 3, 4, 15.0 };
|
||||
SUB_Series c = new(10.0, a);
|
||||
Assert.Equal(-5.0, c.Last().v);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void SUBEventing_Test()
|
||||
{
|
||||
TSeries a = new() { 0, 1, 2, 3, 4, 5 };
|
||||
TSeries b = new() { 5, 4, 3, 2, 1, 0 };
|
||||
SUB_Series c = new(a, b);
|
||||
a.Add(7.0);
|
||||
b.Add(2);
|
||||
Assert.Equal(5.0, c.Last().v);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void SUBUpdatewDouble_Test()
|
||||
{
|
||||
TSeries a = new() { 0, 1, 2, 3, 4, 15 };
|
||||
double b = 10;
|
||||
SUB_Series c = new(a, b);
|
||||
a.Add(1, true);
|
||||
Assert.Equal(-9, c.Last().v);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void SUBUpdating_Test()
|
||||
{
|
||||
TSeries a = new() { 0, 1, 2, 3, 4, 5 };
|
||||
TSeries b = new() { 5, 4, 3, 2, 1, 1 };
|
||||
SUB_Series c = new(a, b);
|
||||
a.Add(10, true);
|
||||
b.Add(0, true);
|
||||
Assert.Equal(10, c.Last().v);
|
||||
}
|
||||
}
|
||||
|
||||
+112
-112
@@ -1,112 +1,112 @@
|
||||
using Xunit;
|
||||
using System;
|
||||
using QuanTAlib;
|
||||
|
||||
namespace Bars;
|
||||
public class TBars_Test
|
||||
{
|
||||
[Fact]
|
||||
public void InsertingTuple()
|
||||
{
|
||||
TBars s = new() { (t: DateTime.Today, o: double.Epsilon, h: double.NaN, l: Double.MaxValue, c: Double.NegativeInfinity, v: Double.PositiveInfinity) };
|
||||
var tup = (t: DateTime.Today, o: double.Epsilon, h: double.NaN, l: Double.MaxValue,
|
||||
c: Double.NegativeInfinity, v: Double.PositiveInfinity);
|
||||
Assert.Equal(tup, s[^1]);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Casting_Parameters()
|
||||
{
|
||||
TBars s = new()
|
||||
{
|
||||
{ DateTime.Today, 0.1, 1.1, 2.1, 3.1, 4.1, false }
|
||||
};
|
||||
Assert.Equal(0.1, s[^1].o);
|
||||
Assert.Equal(1.1, s[^1].h);
|
||||
Assert.Equal(2.1, s[^1].l);
|
||||
Assert.Equal(3.1, s[^1].c);
|
||||
Assert.Equal(4.1, s[^1].v);
|
||||
Assert.Equal(DateTime.Today, s[^1].t);
|
||||
Assert.Single(s);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Updating_Value()
|
||||
{
|
||||
TBars s = new()
|
||||
{
|
||||
{ DateTime.Today, 0.1, 1.1, 2.1, 3.1, 4.1 }
|
||||
};
|
||||
s.Add(DateTime.Today, 1.0, 1.0, 1.0, 1.0, 1.0, update: false);
|
||||
s.Add(DateTime.Today, 0.0, 0.0, 0.0, 0.0, 0.0, update: true);
|
||||
Assert.Equal(0.0, s[^1].o);
|
||||
Assert.Equal(0.0, s[^1].h);
|
||||
Assert.Equal(0.0, s[^1].l);
|
||||
Assert.Equal(0.0, s[^1].c);
|
||||
Assert.Equal(0.0, s[^1].v);
|
||||
Assert.Equal(2, s.Count);
|
||||
}
|
||||
[Fact]
|
||||
public void Extracting_TSeries()
|
||||
{
|
||||
TBars s = new()
|
||||
{
|
||||
{ DateTime.Today, 0.1, 1.1, 2.1, 3.1, 4.1 },
|
||||
{ DateTime.Today, 2.1, 3.1, 4.1, 5.1, 6.1 }
|
||||
};
|
||||
|
||||
TSeries t = s.Open;
|
||||
Assert.Equal(t.t, s.Open.t);
|
||||
Assert.Equal(t.v, s.Open.v);
|
||||
|
||||
t = s.High;
|
||||
Assert.Equal(t.t, s.High.t);
|
||||
Assert.Equal(t.v, s.High.v);
|
||||
|
||||
t = s.Low;
|
||||
Assert.Equal(t.t, s.Low.t);
|
||||
Assert.Equal(t.v, s.Low.v);
|
||||
|
||||
t = s.Close;
|
||||
Assert.Equal(t.t, s.Close.t);
|
||||
Assert.Equal(t.v, s.Close.v);
|
||||
|
||||
t = s.Volume;
|
||||
Assert.Equal(t.t, s.Volume.t);
|
||||
Assert.Equal(t.v, s.Volume.v);
|
||||
|
||||
t = s.HL2;
|
||||
Assert.Equal(t.t, s.HL2.t);
|
||||
Assert.Equal(t.v, s.HL2.v);
|
||||
|
||||
t = s.OC2;
|
||||
Assert.Equal(t.t, s.OC2.t);
|
||||
Assert.Equal(t.v, s.OC2.v);
|
||||
|
||||
t = s.OHL3;
|
||||
Assert.Equal(t.t, s.OHL3.t);
|
||||
Assert.Equal(t.v, s.OHL3.v);
|
||||
|
||||
t = s.HLC3;
|
||||
Assert.Equal(t.t, s.HLC3.t);
|
||||
Assert.Equal(t.v, s.HLC3.v);
|
||||
|
||||
t = s.OHLC4;
|
||||
Assert.Equal(t.t, s.OHLC4.t);
|
||||
Assert.Equal(t.v, s.OHLC4.v);
|
||||
|
||||
t = s.HLCC4;
|
||||
Assert.Equal(t.t, s.HLCC4.t);
|
||||
Assert.Equal(t.v, s.HLCC4.v);
|
||||
}
|
||||
[Fact]
|
||||
public void Broadcasting_Events()
|
||||
{
|
||||
TBars s = new() { (DateTime.Today, 2.1, 3.1, 4.1, 5.1, 6.1) };
|
||||
TSeries t = new();
|
||||
s.Close.Pub += t.Sub;
|
||||
s.Add(DateTime.Today, 0.1, 1.1, 2.1, 3.1, 4.1, false);
|
||||
Assert.Equal(s.Close.v, t.v);
|
||||
Assert.Equal(s.Close.Count, t.Count);
|
||||
}
|
||||
}
|
||||
using Xunit;
|
||||
using System;
|
||||
using QuanTAlib;
|
||||
|
||||
namespace Bars;
|
||||
public class TBars_Test
|
||||
{
|
||||
[Fact]
|
||||
public void InsertingTuple()
|
||||
{
|
||||
TBars s = new() { (t: DateTime.Today, o: double.Epsilon, h: double.NaN, l: Double.MaxValue, c: Double.NegativeInfinity, v: Double.PositiveInfinity) };
|
||||
var tup = (t: DateTime.Today, o: double.Epsilon, h: double.NaN, l: Double.MaxValue,
|
||||
c: Double.NegativeInfinity, v: Double.PositiveInfinity);
|
||||
Assert.Equal(tup, s[^1]);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Casting_Parameters()
|
||||
{
|
||||
TBars s = new()
|
||||
{
|
||||
{ DateTime.Today, 0.1, 1.1, 2.1, 3.1, 4.1, false }
|
||||
};
|
||||
Assert.Equal(0.1, s[^1].o);
|
||||
Assert.Equal(1.1, s[^1].h);
|
||||
Assert.Equal(2.1, s[^1].l);
|
||||
Assert.Equal(3.1, s[^1].c);
|
||||
Assert.Equal(4.1, s[^1].v);
|
||||
Assert.Equal(DateTime.Today, s[^1].t);
|
||||
Assert.Single(s);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Updating_Value()
|
||||
{
|
||||
TBars s = new()
|
||||
{
|
||||
{ DateTime.Today, 0.1, 1.1, 2.1, 3.1, 4.1 }
|
||||
};
|
||||
s.Add(DateTime.Today, 1.0, 1.0, 1.0, 1.0, 1.0, update: false);
|
||||
s.Add(DateTime.Today, 0.0, 0.0, 0.0, 0.0, 0.0, update: true);
|
||||
Assert.Equal(0.0, s[^1].o);
|
||||
Assert.Equal(0.0, s[^1].h);
|
||||
Assert.Equal(0.0, s[^1].l);
|
||||
Assert.Equal(0.0, s[^1].c);
|
||||
Assert.Equal(0.0, s[^1].v);
|
||||
Assert.Equal(2, s.Count);
|
||||
}
|
||||
[Fact]
|
||||
public void Extracting_TSeries()
|
||||
{
|
||||
TBars s = new()
|
||||
{
|
||||
{ DateTime.Today, 0.1, 1.1, 2.1, 3.1, 4.1 },
|
||||
{ DateTime.Today, 2.1, 3.1, 4.1, 5.1, 6.1 }
|
||||
};
|
||||
|
||||
TSeries t = s.Open;
|
||||
Assert.Equal(t.t, s.Open.t);
|
||||
Assert.Equal(t.v, s.Open.v);
|
||||
|
||||
t = s.High;
|
||||
Assert.Equal(t.t, s.High.t);
|
||||
Assert.Equal(t.v, s.High.v);
|
||||
|
||||
t = s.Low;
|
||||
Assert.Equal(t.t, s.Low.t);
|
||||
Assert.Equal(t.v, s.Low.v);
|
||||
|
||||
t = s.Close;
|
||||
Assert.Equal(t.t, s.Close.t);
|
||||
Assert.Equal(t.v, s.Close.v);
|
||||
|
||||
t = s.Volume;
|
||||
Assert.Equal(t.t, s.Volume.t);
|
||||
Assert.Equal(t.v, s.Volume.v);
|
||||
|
||||
t = s.HL2;
|
||||
Assert.Equal(t.t, s.HL2.t);
|
||||
Assert.Equal(t.v, s.HL2.v);
|
||||
|
||||
t = s.OC2;
|
||||
Assert.Equal(t.t, s.OC2.t);
|
||||
Assert.Equal(t.v, s.OC2.v);
|
||||
|
||||
t = s.OHL3;
|
||||
Assert.Equal(t.t, s.OHL3.t);
|
||||
Assert.Equal(t.v, s.OHL3.v);
|
||||
|
||||
t = s.HLC3;
|
||||
Assert.Equal(t.t, s.HLC3.t);
|
||||
Assert.Equal(t.v, s.HLC3.v);
|
||||
|
||||
t = s.OHLC4;
|
||||
Assert.Equal(t.t, s.OHLC4.t);
|
||||
Assert.Equal(t.v, s.OHLC4.v);
|
||||
|
||||
t = s.HLCC4;
|
||||
Assert.Equal(t.t, s.HLCC4.t);
|
||||
Assert.Equal(t.v, s.HLCC4.v);
|
||||
}
|
||||
[Fact]
|
||||
public void Broadcasting_Events()
|
||||
{
|
||||
TBars s = new() { (DateTime.Today, 2.1, 3.1, 4.1, 5.1, 6.1) };
|
||||
TSeries t = new();
|
||||
s.Close.Pub += t.Sub;
|
||||
s.Add(DateTime.Today, 0.1, 1.1, 2.1, 3.1, 4.1, false);
|
||||
Assert.Equal(s.Close.v, t.v);
|
||||
Assert.Equal(s.Close.Count, t.Count);
|
||||
}
|
||||
}
|
||||
|
||||
+486
-486
@@ -1,486 +1,486 @@
|
||||
using System;
|
||||
using QuanTAlib;
|
||||
using Skender.Stock.Indicators;
|
||||
using Xunit;
|
||||
|
||||
namespace Validations;
|
||||
public class Skender
|
||||
{
|
||||
private readonly GBM_Feed bars;
|
||||
private readonly Random rnd = new();
|
||||
private readonly int period, digits, skip;
|
||||
private readonly IEnumerable<Quote> quotes;
|
||||
|
||||
|
||||
public Skender()
|
||||
{
|
||||
bars = new(Bars: 10000, Volatility: 0.5, Drift: 0.0, Precision: 2);
|
||||
period = rnd.Next(30) + 5;
|
||||
digits = 6; //minimizing rounding errors in type conversions
|
||||
skip = period+2;
|
||||
|
||||
quotes = bars.Select(q => new Quote
|
||||
{
|
||||
Date = q.t,
|
||||
Open = (decimal)q.o,
|
||||
High = (decimal)q.h,
|
||||
Low = (decimal)q.l,
|
||||
Close = (decimal)q.c,
|
||||
Volume = (decimal)q.v
|
||||
});
|
||||
}
|
||||
|
||||
/*
|
||||
[Fact]
|
||||
public void ADL()
|
||||
{
|
||||
ADL_Series QL = new(bars);
|
||||
var SK = quotes.GetAdl().Select(i => i.Adl);
|
||||
for (int i = QL.Length; i > skip; i--)
|
||||
{
|
||||
double QL_item = QL[i - 1].v;
|
||||
double SK_item = SK.ElementAt(i - 1)!;
|
||||
Assert.InRange(SK_item! - QL_item, -Math.Pow(10,-digits), Math.Pow(10,-digits));
|
||||
}
|
||||
}
|
||||
*/
|
||||
[Fact]
|
||||
public void ALMA()
|
||||
{
|
||||
ALMA_Series QL = new(bars.Close, period, useNaN: false);
|
||||
var SK = quotes.GetAlma(period).Select(i => i.Alma.Null2NaN()!);
|
||||
for (int i = QL.Length; i > skip; i--)
|
||||
{
|
||||
double QL_item = QL[i - 1].v;
|
||||
double SK_item = SK.ElementAt(i - 1);
|
||||
Assert.InRange(SK_item! - QL_item, -Math.Pow(10, -digits), Math.Pow(10, -digits));
|
||||
}
|
||||
}
|
||||
[Fact]
|
||||
public void ATR()
|
||||
{
|
||||
ATR_Series QL = new(bars, period:period,useNaN: false);
|
||||
var SK = quotes.GetAtr(period).Select(i => i.Atr.Null2NaN()!);
|
||||
for (int i = QL.Length; i > skip; i--)
|
||||
{
|
||||
double QL_item = QL[i - 1].v;
|
||||
double SK_item = SK.ElementAt(i - 1);
|
||||
Assert.InRange(SK_item! - QL_item, -Math.Pow(10, -digits), Math.Pow(10, -digits));
|
||||
}
|
||||
}
|
||||
[Fact]
|
||||
public void ATRP()
|
||||
{
|
||||
ATRP_Series QL = new(bars, period, false);
|
||||
var SK = quotes.GetAtr(period).Select(i => i.Atrp.Null2NaN()!);
|
||||
for (int i = QL.Length; i > skip; i--)
|
||||
{
|
||||
double QL_item = QL[i - 1].v;
|
||||
double SK_item = SK.ElementAt(i - 1);
|
||||
Assert.InRange(SK_item! - QL_item, -Math.Pow(10, -digits), Math.Pow(10, -digits));
|
||||
}
|
||||
}
|
||||
[Fact]
|
||||
public void BBANDS()
|
||||
{
|
||||
BBANDS_Series QL = new(bars.Close, period, 2.0, useNaN: false);
|
||||
var SK = quotes.GetBollingerBands(period, 2.0);
|
||||
for (int i = QL.Length; i > skip; i--)
|
||||
{
|
||||
double QL_item = QL.Mid[i - 1].v;
|
||||
double SK_item = SK.ElementAt(i - 1).Sma!.Value;
|
||||
Assert.InRange(SK_item! - QL_item, -Math.Pow(10, -digits), Math.Pow(10, -digits));
|
||||
QL_item = QL.Upper[i - 1].v;
|
||||
SK_item = SK.ElementAt(i - 1).UpperBand!.Value;
|
||||
Assert.InRange(SK_item! - QL_item, -Math.Pow(10, -digits), Math.Pow(10, -digits));
|
||||
QL_item = QL.Lower[i - 1].v;
|
||||
SK_item = SK.ElementAt(i - 1).LowerBand!.Value;
|
||||
Assert.InRange(SK_item! - QL_item, -Math.Pow(10, -digits), Math.Pow(10, -digits));
|
||||
QL_item = QL.Bandwidth[i - 1].v;
|
||||
SK_item = SK.ElementAt(i - 1).Width!.Value;
|
||||
Assert.InRange(SK_item! - QL_item, -Math.Pow(10, -digits), Math.Pow(10, -digits));
|
||||
QL_item = QL.PercentB[i - 1].v;
|
||||
SK_item = SK.ElementAt(i - 1).PercentB!.Value;
|
||||
Assert.InRange(SK_item! - QL_item, -Math.Pow(10, -digits), Math.Pow(10, -digits));
|
||||
QL_item = QL.Zscore[i - 1].v;
|
||||
SK_item = SK.ElementAt(i - 1).ZScore!.Value;
|
||||
Assert.InRange(SK_item! - QL_item, -Math.Pow(10, -digits), Math.Pow(10, -digits));
|
||||
}
|
||||
}
|
||||
[Fact]
|
||||
public void CCI()
|
||||
{
|
||||
CCI_Series QL = new(bars, period, false);
|
||||
var SK = quotes.GetCci(period).Select(i => i.Cci.Null2NaN()!);
|
||||
for (int i = QL.Length; i > skip; i--)
|
||||
{
|
||||
double QL_item = QL[i - 1].v;
|
||||
double SK_item = SK.ElementAt(i - 1);
|
||||
Assert.InRange(SK_item! - QL_item, -Math.Pow(10, -digits), Math.Pow(10, -digits));
|
||||
}
|
||||
}
|
||||
[Fact]
|
||||
public void CMO()
|
||||
{
|
||||
CMO_Series QL = new(bars.Close, period, false);
|
||||
var SK = quotes.GetCmo(period).Select(i => i.Cmo.Null2NaN()!);
|
||||
for (int i = QL.Length; i > skip; i--)
|
||||
{
|
||||
double QL_item = QL[i - 1].v;
|
||||
double SK_item = SK.ElementAt(i - 1);
|
||||
Assert.InRange(SK_item! - QL_item, -Math.Pow(10, -digits), Math.Pow(10, -digits));
|
||||
}
|
||||
}
|
||||
[Fact]
|
||||
public void CORR()
|
||||
{
|
||||
CORR_Series QL = new(bars.High, bars.Low, period, false);
|
||||
var SK = quotes.Use(CandlePart.High).GetCorrelation(quotes.Use(CandlePart.Low), period).Select(i => i.Correlation.Null2NaN()!);
|
||||
for (int i = QL.Length; i > skip; i--)
|
||||
{
|
||||
double QL_item = QL[i - 1].v;
|
||||
double SK_item = SK.ElementAt(i - 1);
|
||||
Assert.InRange(SK_item! - QL_item, -Math.Pow(10, -digits), Math.Pow(10, -digits));
|
||||
}
|
||||
}
|
||||
[Fact]
|
||||
public void COVAR()
|
||||
{
|
||||
COVAR_Series QL = new(bars.High, bars.Low, period, false);
|
||||
var SK = quotes.Use(CandlePart.High).GetCorrelation(quotes.Use(CandlePart.Low), period).Select(i => i.Covariance.Null2NaN()!);
|
||||
for (int i = QL.Length; i > skip; i--)
|
||||
{
|
||||
double QL_item = QL[i - 1].v;
|
||||
double SK_item = SK.ElementAt(i - 1);
|
||||
Assert.InRange(SK_item! - QL_item, -Math.Pow(10,-digits), Math.Pow(10,-digits));
|
||||
}
|
||||
}
|
||||
[Fact]
|
||||
public void DEMA()
|
||||
{
|
||||
DEMA_Series QL = new(bars.Close, period, false, useSMA: true);
|
||||
var SK = quotes.GetDema(period).Select(i => i.Dema.Null2NaN()!);
|
||||
for (int i = QL.Length; i > skip; i--)
|
||||
{
|
||||
double QL_item = QL[i - 1].v;
|
||||
double SK_item = SK.ElementAt(i - 1);
|
||||
Assert.InRange(SK_item! - QL_item, -Math.Pow(10,-digits), Math.Pow(10,-digits));
|
||||
}
|
||||
}
|
||||
[Fact]
|
||||
public void EMA()
|
||||
{
|
||||
EMA_Series QL = new(bars.Close, period, false);
|
||||
var SK = quotes.GetEma(lookbackPeriods: period).Select(i => i.Ema.Null2NaN()!);
|
||||
for (int i = QL.Length; i > skip; i--)
|
||||
{
|
||||
double QL_item = QL[i - 1].v;
|
||||
double SK_item = SK.ElementAt(i - 1);
|
||||
Assert.InRange(SK_item! - QL_item, -Math.Pow(10,-digits), Math.Pow(10,-digits));
|
||||
}
|
||||
}
|
||||
[Fact]
|
||||
public void HL2()
|
||||
{
|
||||
TSeries QL = bars.HL2;
|
||||
var SK = quotes.GetBaseQuote(CandlePart.HL2).ToList();
|
||||
for (int i = QL.Length; i > skip; i--)
|
||||
{
|
||||
double QL_item = QL[i - 1].v;
|
||||
double SK_item = SK.ElementAt(i - 1).Value;
|
||||
Assert.InRange(SK_item! - QL_item, -Math.Pow(10, -digits), Math.Pow(10, -digits));
|
||||
}
|
||||
}
|
||||
[Fact]
|
||||
public void HLC3()
|
||||
{
|
||||
TSeries QL = bars.HLC3;
|
||||
var SK = quotes.GetBaseQuote(CandlePart.HLC3).ToList();
|
||||
for (int i = QL.Length; i > skip; i--)
|
||||
{
|
||||
double QL_item = QL[i - 1].v;
|
||||
double SK_item = SK.ElementAt(i - 1).Value;
|
||||
Assert.InRange(SK_item! - QL_item, -Math.Pow(10, -digits), Math.Pow(10, -digits));
|
||||
}
|
||||
}
|
||||
[Fact]
|
||||
public void HMA()
|
||||
{
|
||||
HMA_Series QL = new(bars.Close, period, useNaN: false);
|
||||
var SK = quotes.GetHma(period).Select(i => i.Hma.Null2NaN()!);
|
||||
for (int i = QL.Length; i > skip*2; i--)
|
||||
{
|
||||
double QL_item = QL[i - 1].v;
|
||||
double SK_item = SK.ElementAt(i - 1);
|
||||
Assert.InRange(SK_item! - QL_item, -Math.Pow(10, -digits), Math.Pow(10, -digits));
|
||||
}
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void KAMA()
|
||||
{
|
||||
// TODO: check precision of KAMA()
|
||||
KAMA_Series QL = new(bars.Close, period, useNaN: false);
|
||||
var SK = quotes.GetKama(period).Select(i => i.Kama.Null2NaN()!);
|
||||
for (int i = QL.Length; i > skip+2; i--)
|
||||
{
|
||||
double QL_item = QL[i - 1].v;
|
||||
double SK_item = SK.ElementAt(i - 1);
|
||||
Assert.InRange(SK_item! - QL_item, -Math.Pow(10,-digits), Math.Pow(10,-digits));
|
||||
}
|
||||
}
|
||||
[Fact]
|
||||
public void SLOPE()
|
||||
{
|
||||
SLOPE_Series QL = new(bars.Close, period, useNaN: false);
|
||||
var SK = quotes.GetSlope(period);
|
||||
for (int i = QL.Length; i > skip; i--)
|
||||
{
|
||||
double QL_item = QL[i - 1].v;
|
||||
double SK_item = (double)SK.ElementAt(i - 1).Slope!;
|
||||
Assert.InRange(SK_item! - QL_item, -Math.Pow(10,-digits), Math.Pow(10,-digits));
|
||||
QL_item = QL.Intercept[i - 1].v;
|
||||
SK_item = (double)SK.ElementAt(i - 1).Intercept!;
|
||||
Assert.InRange(SK_item! - QL_item, -Math.Pow(10,-digits), Math.Pow(10,-digits));
|
||||
QL_item = QL.RSquared[i - 1].v;
|
||||
SK_item = (double)SK.ElementAt(i - 1).RSquared!;
|
||||
Assert.InRange(SK_item! - QL_item, -Math.Pow(10,-digits), Math.Pow(10,-digits));
|
||||
QL_item = QL.StdDev[i - 1].v;
|
||||
SK_item = (double)SK.ElementAt(i - 1).StdDev!;
|
||||
Assert.InRange(SK_item! - QL_item, -Math.Pow(10,-digits), Math.Pow(10,-digits));
|
||||
}
|
||||
}
|
||||
[Fact]
|
||||
public void MACD()
|
||||
{
|
||||
MACD_Series QL = new(bars.Close, 26, 12, 9, useNaN: false);
|
||||
var SK = quotes.GetMacd(12, 26, 9);
|
||||
for (int i = QL.Length; i > 27; i--)
|
||||
{
|
||||
double QL_item = QL[i - 1].v;
|
||||
double SK_item = SK.ElementAt(i - 1).Macd.Null2NaN()!;
|
||||
Assert.InRange(SK_item! - QL_item, -Math.Pow(10,-digits), Math.Pow(10,-digits));
|
||||
//QL_item = QL.Signal[i - 1].v;
|
||||
//SK_item = SK.ElementAt(i - 1).Signal.Null2NaN()!;
|
||||
//Assert.InRange(SK_item! - QL_item, -Math.Pow(10,-digits), Math.Pow(10,-digits));
|
||||
}
|
||||
}
|
||||
[Fact]
|
||||
public void MAD()
|
||||
{
|
||||
MAD_Series QL = new(bars.Close, period, false);
|
||||
var SK = quotes.GetSmaAnalysis(period).Select(i => i.Mad.Null2NaN()!);
|
||||
for (int i = QL.Length; i > skip; i--)
|
||||
{
|
||||
double QL_item = QL[i - 1].v;
|
||||
double SK_item = SK.ElementAt(i - 1);
|
||||
Assert.InRange(SK_item! - QL_item, -Math.Pow(10,-digits), Math.Pow(10,-digits));
|
||||
}
|
||||
}
|
||||
[Fact]
|
||||
public void MAMA()
|
||||
{
|
||||
MAMA_Series QL = new(bars.HL2, fastlimit: 0.5, slowlimit: 0.05);
|
||||
var SK = quotes.GetMama(fastLimit: 0.5, slowLimit: 0.05);
|
||||
for (int i = QL.Length; i > skip; i--)
|
||||
{
|
||||
double QL_item = QL[i - 1].v;
|
||||
double SK_item = SK.ElementAt(i - 1).Mama.Null2NaN()!;
|
||||
Assert.InRange(SK_item! - QL_item, -Math.Pow(10,-digits), Math.Pow(10,-digits));
|
||||
QL_item = QL.Fama[i - 1].v;
|
||||
SK_item = SK.ElementAt(i - 1).Fama.Null2NaN()!;
|
||||
Assert.InRange(SK_item! - QL_item, -Math.Pow(10,-digits), Math.Pow(10,-digits));
|
||||
}
|
||||
}
|
||||
[Fact]
|
||||
public void MAPE()
|
||||
{
|
||||
MAPE_Series QL = new(bars.Close, period, false);
|
||||
var SK = quotes.GetSmaAnalysis(period).Select(i => i.Mape.Null2NaN()!);
|
||||
for (int i = QL.Length; i > skip; i--)
|
||||
{
|
||||
double QL_item = QL[i - 1].v;
|
||||
double SK_item = SK.ElementAt(i - 1);
|
||||
Assert.InRange(SK_item! - QL_item, -Math.Pow(10,-digits), Math.Pow(10,-digits));
|
||||
}
|
||||
}
|
||||
[Fact]
|
||||
public void MSE()
|
||||
{
|
||||
MSE_Series QL = new(bars.Close, period, false);
|
||||
var SK = quotes.GetSmaAnalysis(period).Select(i => i.Mse.Null2NaN()!);
|
||||
for (int i = QL.Length; i > skip; i--)
|
||||
{
|
||||
double QL_item = QL[i - 1].v;
|
||||
double SK_item = SK.ElementAt(i - 1);
|
||||
Assert.InRange(SK_item! - QL_item, -Math.Pow(10,-digits), Math.Pow(10,-digits));
|
||||
}
|
||||
}
|
||||
[Fact]
|
||||
public void OBV()
|
||||
{
|
||||
OBV_Series QL = new(bars, period, false);
|
||||
var SK = quotes.GetObv(period).Select(i => i.Obv!);
|
||||
for (int i = QL.Length; i > skip; i--) {
|
||||
double QL_item = QL.Last().v;
|
||||
// adding volume[0] to OBV to pass the test and keep compatibility with TA-LIB
|
||||
double SK_item = SK.Last()! + (double)quotes.First().Volume!;
|
||||
Assert.InRange(SK_item! - QL_item, -Math.Pow(10,-digits), Math.Pow(10,-digits));
|
||||
}
|
||||
}
|
||||
[Fact]
|
||||
public void OC2()
|
||||
{
|
||||
TSeries QL = bars.OC2;
|
||||
var SK = quotes.GetBaseQuote(CandlePart.OC2).ToList();
|
||||
for (int i = QL.Length; i > skip; i--)
|
||||
{
|
||||
double QL_item = QL[i - 1].v;
|
||||
double SK_item = SK.ElementAt(i - 1).Value;
|
||||
Assert.InRange(SK_item! - QL_item, -Math.Pow(10, -digits), Math.Pow(10, -digits));
|
||||
}
|
||||
}
|
||||
[Fact]
|
||||
public void OHL3()
|
||||
{
|
||||
TSeries QL = bars.OHL3;
|
||||
var SK = quotes.GetBaseQuote(CandlePart.OHL3).ToList();
|
||||
for (int i = QL.Length; i > skip; i--)
|
||||
{
|
||||
double QL_item = QL[i - 1].v;
|
||||
double SK_item = SK.ElementAt(i - 1).Value;
|
||||
Assert.InRange(SK_item! - QL_item, -Math.Pow(10, -digits), Math.Pow(10, -digits));
|
||||
}
|
||||
}
|
||||
[Fact]
|
||||
public void OHLC4()
|
||||
{
|
||||
TSeries QL = bars.OHLC4;
|
||||
var SK = quotes.GetBaseQuote(CandlePart.OHLC4).ToList();
|
||||
for (int i = QL.Length; i > skip; i--)
|
||||
{
|
||||
double QL_item = QL[i - 1].v;
|
||||
double SK_item = SK.ElementAt(i - 1).Value;
|
||||
Assert.InRange(SK_item! - QL_item, -Math.Pow(10, -digits), Math.Pow(10, -digits));
|
||||
}
|
||||
}
|
||||
[Fact]
|
||||
public void RSI()
|
||||
{
|
||||
RSI_Series QL = new(bars.Close, period, useNaN: false);
|
||||
var SK = quotes.GetRsi(period).Select(i => i.Rsi.Null2NaN()!);
|
||||
for (int i = QL.Length; i > skip; i--)
|
||||
{
|
||||
double QL_item = QL[i - 1].v;
|
||||
double SK_item = SK.ElementAt(i - 1);
|
||||
Assert.InRange(SK_item! - QL_item, -Math.Pow(10,-digits), Math.Pow(10,-digits));
|
||||
}
|
||||
}
|
||||
[Fact]
|
||||
public void SDEV()
|
||||
{
|
||||
SDEV_Series QL = new(bars.Close, period, useNaN: false);
|
||||
var SK = quotes.GetStdDev(period).Select(i => i.StdDev.Null2NaN()!);
|
||||
for (int i = QL.Length; i > skip; i--)
|
||||
{
|
||||
double QL_item = QL[i - 1].v;
|
||||
double SK_item = SK.ElementAt(i - 1);
|
||||
Assert.InRange(SK_item! - QL_item, -Math.Pow(10,-digits), Math.Pow(10,-digits));
|
||||
}
|
||||
}
|
||||
[Fact]
|
||||
public void SMA()
|
||||
{
|
||||
SMA_Series QL = new(bars.Close, period, false);
|
||||
var SK = quotes.GetSma(period).Select(i => i.Sma.Null2NaN()!);
|
||||
for (int i = QL.Length; i > skip; i--)
|
||||
{
|
||||
double QL_item = QL[i - 1].v;
|
||||
double SK_item = SK.ElementAt(i - 1);
|
||||
Assert.InRange(SK_item! - QL_item, -Math.Pow(10,-digits), Math.Pow(10,-digits));
|
||||
}
|
||||
}
|
||||
[Fact]
|
||||
public void SMMA()
|
||||
{
|
||||
SMMA_Series QL = new(bars.Close, period, useNaN: false);
|
||||
var SK = quotes.GetSmma(period).Select(i => i.Smma.Null2NaN()!);
|
||||
for (int i = QL.Length; i > skip; i--)
|
||||
{
|
||||
double QL_item = QL[i - 1].v;
|
||||
double SK_item = SK.ElementAt(i - 1);
|
||||
Assert.InRange(SK_item! - QL_item, -Math.Pow(10,-digits), Math.Pow(10,-digits));
|
||||
}
|
||||
}
|
||||
[Fact]
|
||||
public void T3()
|
||||
{
|
||||
T3_Series QL = new(source: bars.Close, period: period, vfactor: 0.7, false);
|
||||
var SK = quotes.GetT3(lookbackPeriods: period, volumeFactor: 0.7).Select(i => i.T3.Null2NaN()!);
|
||||
for (int i = QL.Length; i > period*15; i--)
|
||||
{
|
||||
double QL_item = QL[i - 1].v;
|
||||
double SK_item = SK.ElementAt(i - 1);
|
||||
Assert.InRange(SK_item! - QL_item, -Math.Pow(10,-digits), Math.Pow(10,-digits));
|
||||
}
|
||||
}
|
||||
[Fact]
|
||||
public void TRIX() {
|
||||
TRIX_Series QL = new(bars.Close, period, false);
|
||||
var SK = quotes.GetTrix(period).Select(i => i.Trix.Null2NaN()!);
|
||||
for (int i = QL.Length; i > period*12; i--) {
|
||||
double QL_item = QL[i - 1].v;
|
||||
double SK_item = SK.ElementAt(i - 1);
|
||||
Assert.InRange(SK_item! - QL_item, -Math.Pow(10, -digits), Math.Pow(10, -digits));
|
||||
}
|
||||
}
|
||||
[Fact]
|
||||
public void TEMA()
|
||||
{
|
||||
TEMA_Series QL = new(bars.Close, period, false);
|
||||
var SK = quotes.GetTema(period).Select(i => i.Tema.Null2NaN()!);
|
||||
for (int i = QL.Length; i > skip; i--)
|
||||
{
|
||||
double QL_item = QL[i - 1].v;
|
||||
double SK_item = SK.ElementAt(i - 1);
|
||||
Assert.InRange(SK_item! - QL_item, -Math.Pow(10,-digits), Math.Pow(10,-digits));
|
||||
}
|
||||
}
|
||||
[Fact]
|
||||
public void TR()
|
||||
{
|
||||
TR_Series QL = new(bars);
|
||||
var SK = quotes.GetTr().Select(i => i.Tr.Null2NaN()!);
|
||||
for (int i = QL.Length; i > skip; i--)
|
||||
{
|
||||
double QL_item = QL[i - 1].v;
|
||||
double SK_item = SK.ElementAt(i - 1);
|
||||
Assert.InRange(SK_item! - QL_item, -Math.Pow(10,-digits), Math.Pow(10,-digits));
|
||||
}
|
||||
}
|
||||
[Fact]
|
||||
public void WMA()
|
||||
{
|
||||
WMA_Series QL = new(bars.Close, period, false);
|
||||
var SK = quotes.GetWma(period).Select(i => i.Wma.Null2NaN()!);
|
||||
for (int i = QL.Length; i > skip*2; i--)
|
||||
{
|
||||
double QL_item = QL[i - 1].v;
|
||||
double SK_item = SK.ElementAt(i - 1);
|
||||
Assert.InRange(SK_item! - QL_item, -Math.Pow(10,-digits), Math.Pow(10,-digits));
|
||||
}
|
||||
}
|
||||
[Fact]
|
||||
public void ZSCORE()
|
||||
{
|
||||
ZSCORE_Series QL = new(bars.Close, period, useNaN: false);
|
||||
var SK = quotes.GetStdDev(period).Select(i => i.ZScore.Null2NaN()!);
|
||||
for (int i = QL.Length; i > skip; i--)
|
||||
{
|
||||
double QL_item = QL[i - 1].v;
|
||||
double SK_item = SK.ElementAt(i - 1);
|
||||
Assert.InRange(SK_item! - QL_item, -Math.Pow(10,-digits), Math.Pow(10,-digits));
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
using System;
|
||||
using QuanTAlib;
|
||||
using Skender.Stock.Indicators;
|
||||
using Xunit;
|
||||
|
||||
namespace Validations;
|
||||
public class Skender
|
||||
{
|
||||
private readonly GBM_Feed bars;
|
||||
private readonly Random rnd = new();
|
||||
private readonly int period, digits, skip;
|
||||
private readonly IEnumerable<Quote> quotes;
|
||||
|
||||
|
||||
public Skender()
|
||||
{
|
||||
bars = new(Bars: 10000, Volatility: 0.5, Drift: 0.0, Precision: 2);
|
||||
period = rnd.Next(30) + 5;
|
||||
digits = 6; //minimizing rounding errors in type conversions
|
||||
skip = period+2;
|
||||
|
||||
quotes = bars.Select(q => new Quote
|
||||
{
|
||||
Date = q.t,
|
||||
Open = (decimal)q.o,
|
||||
High = (decimal)q.h,
|
||||
Low = (decimal)q.l,
|
||||
Close = (decimal)q.c,
|
||||
Volume = (decimal)q.v
|
||||
});
|
||||
}
|
||||
|
||||
/*
|
||||
[Fact]
|
||||
public void ADL()
|
||||
{
|
||||
ADL_Series QL = new(bars);
|
||||
var SK = quotes.GetAdl().Select(i => i.Adl);
|
||||
for (int i = QL.Length; i > skip; i--)
|
||||
{
|
||||
double QL_item = QL[i - 1].v;
|
||||
double SK_item = SK.ElementAt(i - 1)!;
|
||||
Assert.InRange(SK_item! - QL_item, -Math.Pow(10,-digits), Math.Pow(10,-digits));
|
||||
}
|
||||
}
|
||||
*/
|
||||
[Fact]
|
||||
public void ALMA()
|
||||
{
|
||||
ALMA_Series QL = new(bars.Close, period, useNaN: false);
|
||||
var SK = quotes.GetAlma(period).Select(i => i.Alma.Null2NaN()!);
|
||||
for (int i = QL.Length; i > skip; i--)
|
||||
{
|
||||
double QL_item = QL[i - 1].v;
|
||||
double SK_item = SK.ElementAt(i - 1);
|
||||
Assert.InRange(SK_item! - QL_item, -Math.Pow(10, -digits), Math.Pow(10, -digits));
|
||||
}
|
||||
}
|
||||
[Fact]
|
||||
public void ATR()
|
||||
{
|
||||
ATR_Series QL = new(bars, period:period,useNaN: false);
|
||||
var SK = quotes.GetAtr(period).Select(i => i.Atr.Null2NaN()!);
|
||||
for (int i = QL.Length; i > skip; i--)
|
||||
{
|
||||
double QL_item = QL[i - 1].v;
|
||||
double SK_item = SK.ElementAt(i - 1);
|
||||
Assert.InRange(SK_item! - QL_item, -Math.Pow(10, -digits), Math.Pow(10, -digits));
|
||||
}
|
||||
}
|
||||
[Fact]
|
||||
public void ATRP()
|
||||
{
|
||||
ATRP_Series QL = new(bars, period, false);
|
||||
var SK = quotes.GetAtr(period).Select(i => i.Atrp.Null2NaN()!);
|
||||
for (int i = QL.Length; i > skip; i--)
|
||||
{
|
||||
double QL_item = QL[i - 1].v;
|
||||
double SK_item = SK.ElementAt(i - 1);
|
||||
Assert.InRange(SK_item! - QL_item, -Math.Pow(10, -digits), Math.Pow(10, -digits));
|
||||
}
|
||||
}
|
||||
[Fact]
|
||||
public void BBANDS()
|
||||
{
|
||||
BBANDS_Series QL = new(bars.Close, period, 2.0, useNaN: false);
|
||||
var SK = quotes.GetBollingerBands(period, 2.0);
|
||||
for (int i = QL.Length; i > skip; i--)
|
||||
{
|
||||
double QL_item = QL.Mid[i - 1].v;
|
||||
double SK_item = SK.ElementAt(i - 1).Sma!.Value;
|
||||
Assert.InRange(SK_item! - QL_item, -Math.Pow(10, -digits), Math.Pow(10, -digits));
|
||||
QL_item = QL.Upper[i - 1].v;
|
||||
SK_item = SK.ElementAt(i - 1).UpperBand!.Value;
|
||||
Assert.InRange(SK_item! - QL_item, -Math.Pow(10, -digits), Math.Pow(10, -digits));
|
||||
QL_item = QL.Lower[i - 1].v;
|
||||
SK_item = SK.ElementAt(i - 1).LowerBand!.Value;
|
||||
Assert.InRange(SK_item! - QL_item, -Math.Pow(10, -digits), Math.Pow(10, -digits));
|
||||
QL_item = QL.Bandwidth[i - 1].v;
|
||||
SK_item = SK.ElementAt(i - 1).Width!.Value;
|
||||
Assert.InRange(SK_item! - QL_item, -Math.Pow(10, -digits), Math.Pow(10, -digits));
|
||||
QL_item = QL.PercentB[i - 1].v;
|
||||
SK_item = SK.ElementAt(i - 1).PercentB!.Value;
|
||||
Assert.InRange(SK_item! - QL_item, -Math.Pow(10, -digits), Math.Pow(10, -digits));
|
||||
QL_item = QL.Zscore[i - 1].v;
|
||||
SK_item = SK.ElementAt(i - 1).ZScore!.Value;
|
||||
Assert.InRange(SK_item! - QL_item, -Math.Pow(10, -digits), Math.Pow(10, -digits));
|
||||
}
|
||||
}
|
||||
[Fact]
|
||||
public void CCI()
|
||||
{
|
||||
CCI_Series QL = new(bars, period, false);
|
||||
var SK = quotes.GetCci(period).Select(i => i.Cci.Null2NaN()!);
|
||||
for (int i = QL.Length; i > skip; i--)
|
||||
{
|
||||
double QL_item = QL[i - 1].v;
|
||||
double SK_item = SK.ElementAt(i - 1);
|
||||
Assert.InRange(SK_item! - QL_item, -Math.Pow(10, -digits), Math.Pow(10, -digits));
|
||||
}
|
||||
}
|
||||
[Fact]
|
||||
public void CMO()
|
||||
{
|
||||
CMO_Series QL = new(bars.Close, period, false);
|
||||
var SK = quotes.GetCmo(period).Select(i => i.Cmo.Null2NaN()!);
|
||||
for (int i = QL.Length; i > skip; i--)
|
||||
{
|
||||
double QL_item = QL[i - 1].v;
|
||||
double SK_item = SK.ElementAt(i - 1);
|
||||
Assert.InRange(SK_item! - QL_item, -Math.Pow(10, -digits), Math.Pow(10, -digits));
|
||||
}
|
||||
}
|
||||
[Fact]
|
||||
public void CORR()
|
||||
{
|
||||
CORR_Series QL = new(bars.High, bars.Low, period, false);
|
||||
var SK = quotes.Use(CandlePart.High).GetCorrelation(quotes.Use(CandlePart.Low), period).Select(i => i.Correlation.Null2NaN()!);
|
||||
for (int i = QL.Length; i > skip; i--)
|
||||
{
|
||||
double QL_item = QL[i - 1].v;
|
||||
double SK_item = SK.ElementAt(i - 1);
|
||||
Assert.InRange(SK_item! - QL_item, -Math.Pow(10, -digits), Math.Pow(10, -digits));
|
||||
}
|
||||
}
|
||||
[Fact]
|
||||
public void COVAR()
|
||||
{
|
||||
COVAR_Series QL = new(bars.High, bars.Low, period, false);
|
||||
var SK = quotes.Use(CandlePart.High).GetCorrelation(quotes.Use(CandlePart.Low), period).Select(i => i.Covariance.Null2NaN()!);
|
||||
for (int i = QL.Length; i > skip; i--)
|
||||
{
|
||||
double QL_item = QL[i - 1].v;
|
||||
double SK_item = SK.ElementAt(i - 1);
|
||||
Assert.InRange(SK_item! - QL_item, -Math.Pow(10,-digits), Math.Pow(10,-digits));
|
||||
}
|
||||
}
|
||||
[Fact]
|
||||
public void DEMA()
|
||||
{
|
||||
DEMA_Series QL = new(bars.Close, period, false, useSMA: true);
|
||||
var SK = quotes.GetDema(period).Select(i => i.Dema.Null2NaN()!);
|
||||
for (int i = QL.Length; i > skip; i--)
|
||||
{
|
||||
double QL_item = QL[i - 1].v;
|
||||
double SK_item = SK.ElementAt(i - 1);
|
||||
Assert.InRange(SK_item! - QL_item, -Math.Pow(10,-digits), Math.Pow(10,-digits));
|
||||
}
|
||||
}
|
||||
[Fact]
|
||||
public void EMA()
|
||||
{
|
||||
EMA_Series QL = new(bars.Close, period, false);
|
||||
var SK = quotes.GetEma(lookbackPeriods: period).Select(i => i.Ema.Null2NaN()!);
|
||||
for (int i = QL.Length; i > skip; i--)
|
||||
{
|
||||
double QL_item = QL[i - 1].v;
|
||||
double SK_item = SK.ElementAt(i - 1);
|
||||
Assert.InRange(SK_item! - QL_item, -Math.Pow(10,-digits), Math.Pow(10,-digits));
|
||||
}
|
||||
}
|
||||
[Fact]
|
||||
public void HL2()
|
||||
{
|
||||
TSeries QL = bars.HL2;
|
||||
var SK = quotes.GetBaseQuote(CandlePart.HL2).ToList();
|
||||
for (int i = QL.Length; i > skip; i--)
|
||||
{
|
||||
double QL_item = QL[i - 1].v;
|
||||
double SK_item = SK.ElementAt(i - 1).Value;
|
||||
Assert.InRange(SK_item! - QL_item, -Math.Pow(10, -digits), Math.Pow(10, -digits));
|
||||
}
|
||||
}
|
||||
[Fact]
|
||||
public void HLC3()
|
||||
{
|
||||
TSeries QL = bars.HLC3;
|
||||
var SK = quotes.GetBaseQuote(CandlePart.HLC3).ToList();
|
||||
for (int i = QL.Length; i > skip; i--)
|
||||
{
|
||||
double QL_item = QL[i - 1].v;
|
||||
double SK_item = SK.ElementAt(i - 1).Value;
|
||||
Assert.InRange(SK_item! - QL_item, -Math.Pow(10, -digits), Math.Pow(10, -digits));
|
||||
}
|
||||
}
|
||||
[Fact]
|
||||
public void HMA()
|
||||
{
|
||||
HMA_Series QL = new(bars.Close, period, useNaN: false);
|
||||
var SK = quotes.GetHma(period).Select(i => i.Hma.Null2NaN()!);
|
||||
for (int i = QL.Length; i > skip*2; i--)
|
||||
{
|
||||
double QL_item = QL[i - 1].v;
|
||||
double SK_item = SK.ElementAt(i - 1);
|
||||
Assert.InRange(SK_item! - QL_item, -Math.Pow(10, -digits), Math.Pow(10, -digits));
|
||||
}
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void KAMA()
|
||||
{
|
||||
// TODO: check precision of KAMA()
|
||||
KAMA_Series QL = new(bars.Close, period, useNaN: false);
|
||||
var SK = quotes.GetKama(period).Select(i => i.Kama.Null2NaN()!);
|
||||
for (int i = QL.Length; i > skip+2; i--)
|
||||
{
|
||||
double QL_item = QL[i - 1].v;
|
||||
double SK_item = SK.ElementAt(i - 1);
|
||||
Assert.InRange(SK_item! - QL_item, -Math.Pow(10,-digits), Math.Pow(10,-digits));
|
||||
}
|
||||
}
|
||||
[Fact]
|
||||
public void SLOPE()
|
||||
{
|
||||
SLOPE_Series QL = new(bars.Close, period, useNaN: false);
|
||||
var SK = quotes.GetSlope(period);
|
||||
for (int i = QL.Length; i > skip; i--)
|
||||
{
|
||||
double QL_item = QL[i - 1].v;
|
||||
double SK_item = (double)SK.ElementAt(i - 1).Slope!;
|
||||
Assert.InRange(SK_item! - QL_item, -Math.Pow(10,-digits), Math.Pow(10,-digits));
|
||||
QL_item = QL.Intercept[i - 1].v;
|
||||
SK_item = (double)SK.ElementAt(i - 1).Intercept!;
|
||||
Assert.InRange(SK_item! - QL_item, -Math.Pow(10,-digits), Math.Pow(10,-digits));
|
||||
QL_item = QL.RSquared[i - 1].v;
|
||||
SK_item = (double)SK.ElementAt(i - 1).RSquared!;
|
||||
Assert.InRange(SK_item! - QL_item, -Math.Pow(10,-digits), Math.Pow(10,-digits));
|
||||
QL_item = QL.StdDev[i - 1].v;
|
||||
SK_item = (double)SK.ElementAt(i - 1).StdDev!;
|
||||
Assert.InRange(SK_item! - QL_item, -Math.Pow(10,-digits), Math.Pow(10,-digits));
|
||||
}
|
||||
}
|
||||
[Fact]
|
||||
public void MACD()
|
||||
{
|
||||
MACD_Series QL = new(bars.Close, 26, 12, 9, useNaN: false);
|
||||
var SK = quotes.GetMacd(12, 26, 9);
|
||||
for (int i = QL.Length; i > 27; i--)
|
||||
{
|
||||
double QL_item = QL[i - 1].v;
|
||||
double SK_item = SK.ElementAt(i - 1).Macd.Null2NaN()!;
|
||||
Assert.InRange(SK_item! - QL_item, -Math.Pow(10,-digits), Math.Pow(10,-digits));
|
||||
//QL_item = QL.Signal[i - 1].v;
|
||||
//SK_item = SK.ElementAt(i - 1).Signal.Null2NaN()!;
|
||||
//Assert.InRange(SK_item! - QL_item, -Math.Pow(10,-digits), Math.Pow(10,-digits));
|
||||
}
|
||||
}
|
||||
[Fact]
|
||||
public void MAD()
|
||||
{
|
||||
MAD_Series QL = new(bars.Close, period, false);
|
||||
var SK = quotes.GetSmaAnalysis(period).Select(i => i.Mad.Null2NaN()!);
|
||||
for (int i = QL.Length; i > skip; i--)
|
||||
{
|
||||
double QL_item = QL[i - 1].v;
|
||||
double SK_item = SK.ElementAt(i - 1);
|
||||
Assert.InRange(SK_item! - QL_item, -Math.Pow(10,-digits), Math.Pow(10,-digits));
|
||||
}
|
||||
}
|
||||
[Fact]
|
||||
public void MAMA()
|
||||
{
|
||||
MAMA_Series QL = new(bars.HL2, fastlimit: 0.5, slowlimit: 0.05);
|
||||
var SK = quotes.GetMama(fastLimit: 0.5, slowLimit: 0.05);
|
||||
for (int i = QL.Length; i > skip; i--)
|
||||
{
|
||||
double QL_item = QL[i - 1].v;
|
||||
double SK_item = SK.ElementAt(i - 1).Mama.Null2NaN()!;
|
||||
Assert.InRange(SK_item! - QL_item, -Math.Pow(10,-digits), Math.Pow(10,-digits));
|
||||
QL_item = QL.Fama[i - 1].v;
|
||||
SK_item = SK.ElementAt(i - 1).Fama.Null2NaN()!;
|
||||
Assert.InRange(SK_item! - QL_item, -Math.Pow(10,-digits), Math.Pow(10,-digits));
|
||||
}
|
||||
}
|
||||
[Fact]
|
||||
public void MAPE()
|
||||
{
|
||||
MAPE_Series QL = new(bars.Close, period, false);
|
||||
var SK = quotes.GetSmaAnalysis(period).Select(i => i.Mape.Null2NaN()!);
|
||||
for (int i = QL.Length; i > skip; i--)
|
||||
{
|
||||
double QL_item = QL[i - 1].v;
|
||||
double SK_item = SK.ElementAt(i - 1);
|
||||
Assert.InRange(SK_item! - QL_item, -Math.Pow(10,-digits), Math.Pow(10,-digits));
|
||||
}
|
||||
}
|
||||
[Fact]
|
||||
public void MSE()
|
||||
{
|
||||
MSE_Series QL = new(bars.Close, period, false);
|
||||
var SK = quotes.GetSmaAnalysis(period).Select(i => i.Mse.Null2NaN()!);
|
||||
for (int i = QL.Length; i > skip; i--)
|
||||
{
|
||||
double QL_item = QL[i - 1].v;
|
||||
double SK_item = SK.ElementAt(i - 1);
|
||||
Assert.InRange(SK_item! - QL_item, -Math.Pow(10,-digits), Math.Pow(10,-digits));
|
||||
}
|
||||
}
|
||||
[Fact]
|
||||
public void OBV()
|
||||
{
|
||||
OBV_Series QL = new(bars, period, false);
|
||||
var SK = quotes.GetObv(period).Select(i => i.Obv!);
|
||||
for (int i = QL.Length; i > skip; i--) {
|
||||
double QL_item = QL.Last().v;
|
||||
// adding volume[0] to OBV to pass the test and keep compatibility with TA-LIB
|
||||
double SK_item = SK.Last()! + (double)quotes.First().Volume!;
|
||||
Assert.InRange(SK_item! - QL_item, -Math.Pow(10,-digits), Math.Pow(10,-digits));
|
||||
}
|
||||
}
|
||||
[Fact]
|
||||
public void OC2()
|
||||
{
|
||||
TSeries QL = bars.OC2;
|
||||
var SK = quotes.GetBaseQuote(CandlePart.OC2).ToList();
|
||||
for (int i = QL.Length; i > skip; i--)
|
||||
{
|
||||
double QL_item = QL[i - 1].v;
|
||||
double SK_item = SK.ElementAt(i - 1).Value;
|
||||
Assert.InRange(SK_item! - QL_item, -Math.Pow(10, -digits), Math.Pow(10, -digits));
|
||||
}
|
||||
}
|
||||
[Fact]
|
||||
public void OHL3()
|
||||
{
|
||||
TSeries QL = bars.OHL3;
|
||||
var SK = quotes.GetBaseQuote(CandlePart.OHL3).ToList();
|
||||
for (int i = QL.Length; i > skip; i--)
|
||||
{
|
||||
double QL_item = QL[i - 1].v;
|
||||
double SK_item = SK.ElementAt(i - 1).Value;
|
||||
Assert.InRange(SK_item! - QL_item, -Math.Pow(10, -digits), Math.Pow(10, -digits));
|
||||
}
|
||||
}
|
||||
[Fact]
|
||||
public void OHLC4()
|
||||
{
|
||||
TSeries QL = bars.OHLC4;
|
||||
var SK = quotes.GetBaseQuote(CandlePart.OHLC4).ToList();
|
||||
for (int i = QL.Length; i > skip; i--)
|
||||
{
|
||||
double QL_item = QL[i - 1].v;
|
||||
double SK_item = SK.ElementAt(i - 1).Value;
|
||||
Assert.InRange(SK_item! - QL_item, -Math.Pow(10, -digits), Math.Pow(10, -digits));
|
||||
}
|
||||
}
|
||||
[Fact]
|
||||
public void RSI()
|
||||
{
|
||||
RSI_Series QL = new(bars.Close, period, useNaN: false);
|
||||
var SK = quotes.GetRsi(period).Select(i => i.Rsi.Null2NaN()!);
|
||||
for (int i = QL.Length; i > skip; i--)
|
||||
{
|
||||
double QL_item = QL[i - 1].v;
|
||||
double SK_item = SK.ElementAt(i - 1);
|
||||
Assert.InRange(SK_item! - QL_item, -Math.Pow(10,-digits), Math.Pow(10,-digits));
|
||||
}
|
||||
}
|
||||
[Fact]
|
||||
public void SDEV()
|
||||
{
|
||||
SDEV_Series QL = new(bars.Close, period, useNaN: false);
|
||||
var SK = quotes.GetStdDev(period).Select(i => i.StdDev.Null2NaN()!);
|
||||
for (int i = QL.Length; i > skip; i--)
|
||||
{
|
||||
double QL_item = QL[i - 1].v;
|
||||
double SK_item = SK.ElementAt(i - 1);
|
||||
Assert.InRange(SK_item! - QL_item, -Math.Pow(10,-digits), Math.Pow(10,-digits));
|
||||
}
|
||||
}
|
||||
[Fact]
|
||||
public void SMA()
|
||||
{
|
||||
SMA_Series QL = new(bars.Close, period, false);
|
||||
var SK = quotes.GetSma(period).Select(i => i.Sma.Null2NaN()!);
|
||||
for (int i = QL.Length; i > skip; i--)
|
||||
{
|
||||
double QL_item = QL[i - 1].v;
|
||||
double SK_item = SK.ElementAt(i - 1);
|
||||
Assert.InRange(SK_item! - QL_item, -Math.Pow(10,-digits), Math.Pow(10,-digits));
|
||||
}
|
||||
}
|
||||
[Fact]
|
||||
public void SMMA()
|
||||
{
|
||||
SMMA_Series QL = new(bars.Close, period, useNaN: false);
|
||||
var SK = quotes.GetSmma(period).Select(i => i.Smma.Null2NaN()!);
|
||||
for (int i = QL.Length; i > skip; i--)
|
||||
{
|
||||
double QL_item = QL[i - 1].v;
|
||||
double SK_item = SK.ElementAt(i - 1);
|
||||
Assert.InRange(SK_item! - QL_item, -Math.Pow(10,-digits), Math.Pow(10,-digits));
|
||||
}
|
||||
}
|
||||
[Fact]
|
||||
public void T3()
|
||||
{
|
||||
T3_Series QL = new(source: bars.Close, period: period, vfactor: 0.7, false);
|
||||
var SK = quotes.GetT3(lookbackPeriods: period, volumeFactor: 0.7).Select(i => i.T3.Null2NaN()!);
|
||||
for (int i = QL.Length; i > period*15; i--)
|
||||
{
|
||||
double QL_item = QL[i - 1].v;
|
||||
double SK_item = SK.ElementAt(i - 1);
|
||||
Assert.InRange(SK_item! - QL_item, -Math.Pow(10,-digits), Math.Pow(10,-digits));
|
||||
}
|
||||
}
|
||||
[Fact]
|
||||
public void TRIX() {
|
||||
TRIX_Series QL = new(bars.Close, period, false);
|
||||
var SK = quotes.GetTrix(period).Select(i => i.Trix.Null2NaN()!);
|
||||
for (int i = QL.Length; i > period*12; i--) {
|
||||
double QL_item = QL[i - 1].v;
|
||||
double SK_item = SK.ElementAt(i - 1);
|
||||
Assert.InRange(SK_item! - QL_item, -Math.Pow(10, -digits), Math.Pow(10, -digits));
|
||||
}
|
||||
}
|
||||
[Fact]
|
||||
public void TEMA()
|
||||
{
|
||||
TEMA_Series QL = new(bars.Close, period, false);
|
||||
var SK = quotes.GetTema(period).Select(i => i.Tema.Null2NaN()!);
|
||||
for (int i = QL.Length; i > skip; i--)
|
||||
{
|
||||
double QL_item = QL[i - 1].v;
|
||||
double SK_item = SK.ElementAt(i - 1);
|
||||
Assert.InRange(SK_item! - QL_item, -Math.Pow(10,-digits), Math.Pow(10,-digits));
|
||||
}
|
||||
}
|
||||
[Fact]
|
||||
public void TR()
|
||||
{
|
||||
TR_Series QL = new(bars);
|
||||
var SK = quotes.GetTr().Select(i => i.Tr.Null2NaN()!);
|
||||
for (int i = QL.Length; i > skip; i--)
|
||||
{
|
||||
double QL_item = QL[i - 1].v;
|
||||
double SK_item = SK.ElementAt(i - 1);
|
||||
Assert.InRange(SK_item! - QL_item, -Math.Pow(10,-digits), Math.Pow(10,-digits));
|
||||
}
|
||||
}
|
||||
[Fact]
|
||||
public void WMA()
|
||||
{
|
||||
WMA_Series QL = new(bars.Close, period, false);
|
||||
var SK = quotes.GetWma(period).Select(i => i.Wma.Null2NaN()!);
|
||||
for (int i = QL.Length; i > skip*2; i--)
|
||||
{
|
||||
double QL_item = QL[i - 1].v;
|
||||
double SK_item = SK.ElementAt(i - 1);
|
||||
Assert.InRange(SK_item! - QL_item, -Math.Pow(10,-digits), Math.Pow(10,-digits));
|
||||
}
|
||||
}
|
||||
[Fact]
|
||||
public void ZSCORE()
|
||||
{
|
||||
ZSCORE_Series QL = new(bars.Close, period, useNaN: false);
|
||||
var SK = quotes.GetStdDev(period).Select(i => i.ZScore.Null2NaN()!);
|
||||
for (int i = QL.Length; i > skip; i--)
|
||||
{
|
||||
double QL_item = QL[i - 1].v;
|
||||
double SK_item = SK.ElementAt(i - 1);
|
||||
Assert.InRange(SK_item! - QL_item, -Math.Pow(10,-digits), Math.Pow(10,-digits));
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
+524
-524
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user