mirror of
https://github.com/mihakralj/QuanTAlib.git
synced 2026-08-19 02:58:05 +00:00
refactor structs to records, add new classes for financial calculations, implement EMA and SMA with circular buffer. Generate random financial data using GBM model. Also, test the SMA calculation with sample data.
This commit is contained in:
@@ -7,8 +7,8 @@ namespace Basics;
|
||||
#nullable disable
|
||||
public class TBars
|
||||
{
|
||||
private static Type[] maSeriesTypes = new Type[]
|
||||
{
|
||||
private static Type[] maSeriesTypes = new Type[]
|
||||
{
|
||||
typeof(ATR_Series),
|
||||
typeof(ATRP_Series),
|
||||
typeof(TR_Series),
|
||||
@@ -17,80 +17,81 @@ public class TBars
|
||||
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)
|
||||
[Theory]
|
||||
[MemberData(nameof(MASeriesData))]
|
||||
public void Name_exists(Type classType)
|
||||
{
|
||||
yield return new object[] { type };
|
||||
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
|
||||
Reference in New Issue
Block a user