mirror of
https://github.com/mihakralj/QuanTAlib.git
synced 2026-08-24 13:38:05 +00:00
Remove multiple Pine Script indicators: SSFDSP, STARCHANNEL, STBANDS, STC, UBANDS, UCHANNEL, VWAPBANDS, and VWAPSD. These indicators were deleted to streamline the library and remove unused or redundant code.
This commit is contained in:
@@ -144,28 +144,27 @@ public class AbberTests
|
||||
var abber = new Abber(3, 2.0);
|
||||
|
||||
// Bar 1: source = 100
|
||||
// SMA = 100, Deviation = 0, AvgDev = 0
|
||||
// SMA = 100, Deviation = |100-100| = 0, AvgDev = 0
|
||||
abber.Update(new TValue(DateTime.UtcNow, 100));
|
||||
Assert.Equal(100.0, abber.Last.Value, 1e-10);
|
||||
|
||||
// Bar 2: source = 110
|
||||
// SMA(2) = (100+110)/2 = 105
|
||||
// Dev1 = |100 - 100| = 0 (calculated when 100 was added, SMA was 100)
|
||||
// Dev2 = |110 - 100| = 10 (calculated when 110 is added, SMA was 100)
|
||||
// AvgDev = (0+10)/2 = 5
|
||||
// Upper = 105 + 2*5 = 115, Lower = 105 - 2*5 = 95
|
||||
// Dev1 = 0, Dev2 = |110 - 105| = 5 (same-bar SMA)
|
||||
// AvgDev = (0+5)/2 = 2.5
|
||||
// Upper = 105 + 2*2.5 = 110, Lower = 105 - 2*2.5 = 100
|
||||
abber.Update(new TValue(DateTime.UtcNow, 110));
|
||||
Assert.Equal(105.0, abber.Last.Value, 1e-10);
|
||||
|
||||
// Bar 3: source = 120
|
||||
// SMA(3) = (100+110+120)/3 = 110
|
||||
// Dev3 = |120 - 105| = 15 (calculated when 120 is added, SMA was 105)
|
||||
// AvgDev = (0+10+15)/3 = 8.333...
|
||||
// Upper = 110 + 2*8.333 = 126.666..., Lower = 110 - 2*8.333 = 93.333...
|
||||
// Dev3 = |120 - 110| = 10 (same-bar SMA)
|
||||
// AvgDev = (0+5+10)/3 = 5.0
|
||||
// Upper = 110 + 2*5 = 120, Lower = 110 - 2*5 = 100
|
||||
abber.Update(new TValue(DateTime.UtcNow, 120));
|
||||
Assert.Equal(110.0, abber.Last.Value, 1e-10);
|
||||
Assert.Equal(110.0 + 2.0 * 25.0 / 3.0, abber.Upper.Value, 1e-10);
|
||||
Assert.Equal(110.0 - 2.0 * 25.0 / 3.0, abber.Lower.Value, 1e-10);
|
||||
Assert.Equal(120.0, abber.Upper.Value, 1e-10);
|
||||
Assert.Equal(100.0, abber.Lower.Value, 1e-10);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
|
||||
@@ -36,11 +36,11 @@ public sealed class AbberValidationTests(ITestOutputHelper output) : IDisposable
|
||||
[Fact]
|
||||
public void Validate_ManualCalculation_Period3()
|
||||
{
|
||||
// Manual calculation verification
|
||||
// Manual calculation verification (same-bar SMA deviation)
|
||||
// Values: [100, 110, 120]
|
||||
// Bar 1: SMA=100, Dev=0, AvgDev=0
|
||||
// Bar 2: SMA=(100+110)/2=105, Dev1=0, Dev2=|110-100|=10, AvgDev=(0+10)/2=5
|
||||
// Bar 3: SMA=(100+110+120)/3=110, Dev3=|120-105|=15, AvgDev=(0+10+15)/3=8.333
|
||||
// Bar 1: SMA=100, Dev=|100-100|=0, AvgDev=0
|
||||
// Bar 2: SMA=(100+110)/2=105, Dev2=|110-105|=5, AvgDev=(0+5)/2=2.5
|
||||
// Bar 3: SMA=(100+110+120)/3=110, Dev3=|120-110|=10, AvgDev=(0+5+10)/3=5.0
|
||||
|
||||
var series = new TSeries();
|
||||
var time = DateTime.UtcNow;
|
||||
@@ -54,8 +54,8 @@ public sealed class AbberValidationTests(ITestOutputHelper output) : IDisposable
|
||||
// SMA(3) = 110
|
||||
Assert.Equal(110.0, middle.Last.Value, 1e-10);
|
||||
|
||||
// AvgDev = (0 + 10 + 15) / 3 = 25/3
|
||||
const double expectedAvgDev = 25.0 / 3.0;
|
||||
// AvgDev = (0 + 5 + 10) / 3 = 5.0
|
||||
const double expectedAvgDev = 5.0;
|
||||
double expectedBandWidth = 2.0 * expectedAvgDev;
|
||||
|
||||
Assert.Equal(110.0 + expectedBandWidth, upper.Last.Value, 1e-10);
|
||||
|
||||
+27
-19
@@ -190,9 +190,12 @@ public sealed class Abber : ITValuePublisher, IDisposable
|
||||
{
|
||||
_pState = _state;
|
||||
|
||||
// Calculate SMA first to get deviation
|
||||
// Compute SMA including the new value with correct divisor (matches batch ProcessMainLoop)
|
||||
int count = _sourceBuffer.Count;
|
||||
double sma = count > 0 ? _state.SumSource / count : value;
|
||||
double removedSource = count == _sourceBuffer.Capacity ? _sourceBuffer.Oldest : 0.0;
|
||||
double newSum = _state.SumSource - removedSource + value;
|
||||
int newCount = count < _sourceBuffer.Capacity ? count + 1 : count;
|
||||
double sma = newSum / newCount;
|
||||
double deviation = Math.Abs(value - sma);
|
||||
|
||||
UpdateState(value, deviation);
|
||||
@@ -201,17 +204,18 @@ public sealed class Abber : ITValuePublisher, IDisposable
|
||||
{
|
||||
_state = _pState;
|
||||
|
||||
// Calculate SMA first to get deviation
|
||||
int count = _sourceBuffer.Count;
|
||||
double sma = count > 0 ? _state.SumSource / count : value;
|
||||
double deviation = Math.Abs(value - sma);
|
||||
|
||||
// Replace newest source value and recompute sum for current-bar SMA (matches Pine)
|
||||
_sourceBuffer.UpdateNewest(value);
|
||||
_deviationBuffer.UpdateNewest(deviation);
|
||||
double currentSum = _sourceBuffer.Sum;
|
||||
int corrCount = _sourceBuffer.Count;
|
||||
double corrSma = corrCount > 0 ? currentSum / corrCount : value;
|
||||
double corrDeviation = Math.Abs(value - corrSma);
|
||||
|
||||
_deviationBuffer.UpdateNewest(corrDeviation);
|
||||
|
||||
_state = _state with
|
||||
{
|
||||
SumSource = _sourceBuffer.Sum,
|
||||
SumSource = currentSum,
|
||||
SumDeviation = _deviationBuffer.Sum,
|
||||
};
|
||||
}
|
||||
@@ -357,9 +361,12 @@ public sealed class Abber : ITValuePublisher, IDisposable
|
||||
{
|
||||
double value = GetValidValue(source[i].Value);
|
||||
|
||||
// Calculate SMA to get deviation
|
||||
// Compute SMA including the new value with correct divisor (matches batch ProcessMainLoop)
|
||||
int count = _sourceBuffer.Count;
|
||||
double sma = count > 0 ? _state.SumSource / count : value;
|
||||
double removedSource = count == _sourceBuffer.Capacity ? _sourceBuffer.Oldest : 0.0;
|
||||
double newSum = _state.SumSource - removedSource + value;
|
||||
int newCount = count < _sourceBuffer.Capacity ? count + 1 : count;
|
||||
double sma = newSum / newCount;
|
||||
double deviation = Math.Abs(value - sma);
|
||||
|
||||
UpdateState(value, deviation);
|
||||
@@ -606,18 +613,18 @@ public sealed class Abber : ITValuePublisher, IDisposable
|
||||
{
|
||||
double v = GetValidValue(source, i, ref state);
|
||||
|
||||
// Calculate current SMA to get deviation
|
||||
int count = i;
|
||||
double sma = count > 0 ? state.SumSource / count : v;
|
||||
// Compute SMA including the new value to get same-bar deviation (matches Pine)
|
||||
int newCount = i + 1;
|
||||
double newSum = state.SumSource + v;
|
||||
double sma = newSum / newCount;
|
||||
double deviation = Math.Abs(v - sma);
|
||||
|
||||
state.SumSource += v;
|
||||
state.SumSource = newSum;
|
||||
state.SumDeviation += deviation;
|
||||
|
||||
buffers.Source[i] = v;
|
||||
buffers.Deviation[i] = deviation;
|
||||
|
||||
int newCount = i + 1;
|
||||
double middle = state.SumSource / newCount;
|
||||
double avgDeviation = state.SumDeviation / newCount;
|
||||
WriteBandOutputs(outputs, i, middle, avgDeviation, multiplier);
|
||||
@@ -639,12 +646,13 @@ public sealed class Abber : ITValuePublisher, IDisposable
|
||||
{
|
||||
double v = GetValidValue(source, i, ref state);
|
||||
|
||||
// Calculate current SMA to get deviation
|
||||
double sma = state.SumSource / period;
|
||||
// Compute SMA including the new value to get same-bar deviation (matches Pine)
|
||||
double newSumSource = state.SumSource - buffers.Source[state.BufferIndex] + v;
|
||||
double sma = newSumSource / period;
|
||||
double deviation = Math.Abs(v - sma);
|
||||
|
||||
// Update running sums using single buffer index
|
||||
state.SumSource = state.SumSource - buffers.Source[state.BufferIndex] + v;
|
||||
state.SumSource = newSumSource;
|
||||
buffers.Source[state.BufferIndex] = v;
|
||||
|
||||
state.SumDeviation = state.SumDeviation - buffers.Deviation[state.BufferIndex] + deviation;
|
||||
|
||||
Reference in New Issue
Block a user