normalization of methods

This commit is contained in:
Miha Kralj
2026-02-10 21:33:16 -08:00
parent 915d7a007b
commit 6d6259a47d
527 changed files with 10525 additions and 2123 deletions
+6 -6
View File
@@ -214,7 +214,7 @@ public class BbandsTests
TSeries source = bars.Close;
// Act
TSeries result = Bbands.Calculate(source, period: 5, multiplier: 2.0);
TSeries result = Bbands.Batch(source, period: 5, multiplier: 2.0);
// Assert
Assert.Equal(source.Count, result.Count);
@@ -236,9 +236,9 @@ public class BbandsTests
double[] middleArray = new double[source.Count];
double[] upperArray = new double[source.Count];
double[] lowerArray = new double[source.Count];
Bbands.Calculate(sourceArray.AsSpan(), middleArray, upperArray, lowerArray, period, multiplier);
Bbands.Batch(sourceArray.AsSpan(), middleArray, upperArray, lowerArray, period, multiplier);
TSeries seriesResult = Bbands.Calculate(source, period, multiplier);
TSeries seriesResult = Bbands.Batch(source, period, multiplier);
// Assert - Compare last 10 values
for (int i = source.Count - 10; i < source.Count; i++)
@@ -258,7 +258,7 @@ public class BbandsTests
// Act & Assert
ArgumentException exception = Assert.Throws<ArgumentException>(
() => Bbands.Calculate(sourceArr.AsSpan(), middleArr.AsSpan(), upperArr.AsSpan(), lowerArr.AsSpan()));
() => Bbands.Batch(sourceArr.AsSpan(), middleArr.AsSpan(), upperArr.AsSpan(), lowerArr.AsSpan()));
Assert.Equal("source", exception.ParamName);
}
@@ -305,14 +305,14 @@ public class BbandsTests
}
// Batch
TSeries batchResult = Bbands.Calculate(source, period, multiplier);
TSeries batchResult = Bbands.Batch(source, period, multiplier);
// Span - Copy arrays before using to avoid ref local lambda issue
double[] sourceArray = source.Values.ToArray();
double[] middleArray = new double[source.Count];
double[] upperArray = new double[source.Count];
double[] lowerArray = new double[source.Count];
Bbands.Calculate(sourceArray.AsSpan(), middleArray, upperArray, lowerArray, period, multiplier);
Bbands.Batch(sourceArray.AsSpan(), middleArray, upperArray, lowerArray, period, multiplier);
// Assert - Compare last 50 values (streaming only has last value)
Assert.Equal(batchResult[^1].Value, streamingBbands.Middle.Value, precision: 8);
@@ -100,7 +100,7 @@ public sealed class BbandsValidationTests : IDisposable
double[] qMiddle = new double[sourceData.Length];
double[] qUpper = new double[sourceData.Length];
double[] qLower = new double[sourceData.Length];
Bbands.Calculate(sourceData.AsSpan(), qMiddle.AsSpan(), qUpper.AsSpan(), qLower.AsSpan(), period, multiplier);
Bbands.Batch(sourceData.AsSpan(), qMiddle.AsSpan(), qUpper.AsSpan(), qLower.AsSpan(), period, multiplier);
// Calculate Skender Bollinger Bands
var sResult = _testData.SkenderQuotes.GetBollingerBands(period, multiplier).ToList();
@@ -215,7 +215,7 @@ public sealed class BbandsValidationTests : IDisposable
double[] qMiddle = new double[sourceData.Length];
double[] qUpper = new double[sourceData.Length];
double[] qLower = new double[sourceData.Length];
Bbands.Calculate(sourceData.AsSpan(), qMiddle.AsSpan(), qUpper.AsSpan(), qLower.AsSpan(), period, multiplier);
Bbands.Batch(sourceData.AsSpan(), qMiddle.AsSpan(), qUpper.AsSpan(), qLower.AsSpan(), period, multiplier);
// Calculate TA-Lib Bollinger Bands
var retCode = Functions.Bbands<double>(
@@ -321,7 +321,7 @@ public sealed class BbandsValidationTests : IDisposable
double[] qMiddle = new double[sourceData.Length];
double[] qUpper = new double[sourceData.Length];
double[] qLower = new double[sourceData.Length];
Bbands.Calculate(sourceData.AsSpan(), qMiddle.AsSpan(), qUpper.AsSpan(), qLower.AsSpan(), period, multiplier);
Bbands.Batch(sourceData.AsSpan(), qMiddle.AsSpan(), qUpper.AsSpan(), qLower.AsSpan(), period, multiplier);
// Calculate Tulip Bollinger Bands
var bbandsIndicator = Tulip.Indicators.bbands;
+11 -3
View File
@@ -181,7 +181,7 @@ public sealed class Bbands : AbstractBase
Span<double> upperSpan = upperRented.AsSpan(0, len);
Span<double> lowerSpan = lowerRented.AsSpan(0, len);
Calculate(sourceSpan, middleSpan, upperSpan, lowerSpan, _period, _multiplier);
Batch(sourceSpan, middleSpan, upperSpan, lowerSpan, _period, _multiplier);
for (int i = 0; i < len; i++)
{
@@ -230,7 +230,7 @@ public sealed class Bbands : AbstractBase
/// <summary>
/// Calculates Bollinger Bands for the entire series and returns the middle band series.
/// </summary>
public static TSeries Calculate(TSeries source, int period = DefaultPeriod, double multiplier = DefaultMultiplier)
public static TSeries Batch(TSeries source, int period = DefaultPeriod, double multiplier = DefaultMultiplier)
{
Bbands bbands = new(period, multiplier);
return bbands.Update(source);
@@ -239,7 +239,7 @@ public sealed class Bbands : AbstractBase
/// <summary>
/// Calculates Bollinger Bands across all input values using SIMD-optimized operations where possible.
/// </summary>
public static void Calculate(
public static void Batch(
ReadOnlySpan<double> source,
Span<double> middle,
Span<double> upper,
@@ -360,4 +360,12 @@ public sealed class Bbands : AbstractBase
}
}
}
public static (TSeries Results, Bbands Indicator) Calculate(TSeries source, int period = DefaultPeriod, double multiplier = DefaultMultiplier)
{
var indicator = new Bbands(period, multiplier);
TSeries results = indicator.Update(source);
return (results, indicator);
}
}