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:
Miha Kralj
2026-02-20 18:44:56 -08:00
parent 3dd05f23e4
commit cbeefc9d64
283 changed files with 23963 additions and 3838 deletions
+9 -10
View File
@@ -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]
+6 -6
View File
@@ -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
View File
@@ -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;