diff --git a/.editorconfig b/.editorconfig
index 030b2cc8..2350d179 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -20,12 +20,43 @@ resharper_for_can_be_converted_to_foreach_highlighting = none
resharper_unused_parameter_local_highlighting = none
resharper_conditional_access_qualifier_is_non_nullable_according_to_api_contract_highlighting = none
resharper_redundant_lambda_parameter_type_highlighting = none
+resharper_not_accessed_positional_property_local_highlighting = none
+resharper_possible_loss_of_fraction_highlighting = hint
+
+# Suppress JB InspectCode false positives / intentional patterns
+resharper_unused_method_return_value_local_highlighting = none
+resharper_member_initializer_value_ignored_highlighting = none
+resharper_redundant_explicit_array_creation_highlighting = hint
+resharper_with_expression_modifies_all_members_highlighting = hint
+resharper_redundant_delegate_creation_highlighting = hint
+resharper_redundant_default_member_initializer_highlighting = hint
+resharper_redundant_empty_switch_section_highlighting = hint
+resharper_empty_for_statement_highlighting = hint
+resharper_using_statement_resource_initialization_highlighting = hint
+resharper_unused_member_local_highlighting = hint
+resharper_not_accessed_variable_highlighting = hint
+resharper_private_field_can_be_converted_to_local_variable_highlighting = hint
+resharper_collection_never_queried_local_highlighting = hint
+resharper_unused_auto_property_accessor_local_highlighting = hint
+resharper_unused_tuple_component_in_return_value_highlighting = hint
+resharper_convert_type_check_to_null_check_highlighting = hint
+resharper_redundant_name_qualifier_highlighting = hint
+resharper_redundant_suppress_nullable_warning_expression_highlighting = hint
+resharper_possible_null_reference_exception_highlighting = hint
+resharper_assign_null_to_not_null_attribute_highlighting = hint
+resharper_default_struct_equality_is_used_global_highlighting = hint
+dotnet_diagnostic.CS0628.severity = none
+dotnet_diagnostic.CS8602.severity = none
+dotnet_diagnostic.CS8601.severity = none
+dotnet_diagnostic.CS0660.severity = none
+dotnet_diagnostic.CS0661.severity = none
resharper_redundant_cast_highlighting = hint
resharper_redundant_assignment_highlighting = hint
resharper_not_accessed_field_local_highlighting = hint
resharper_unused_auto_property_accessor_global_highlighting = hint
resharper_condition_is_always_true_or_false_highlighting = hint
+resharper_condition_is_always_true_or_false_according_to_nullable_api_contract_highlighting = hint
resharper_access_to_modified_closure_highlighting = hint
resharper_generic_enumerator_not_disposed_highlighting = hint
@@ -85,6 +116,10 @@ csharp_style_var_for_built_in_types = false:silent
csharp_style_var_when_type_is_apparent = true:suggestion
csharp_style_var_elsewhere = false:silent
+[python/src/**.cs]
+resharper_enforce_if_statement_braces_highlighting = none
+csharp_prefer_braces = false:silent
+
[ndepend/**]
dotnet_analyzer_diagnostic.severity = none
generated_code = true
diff --git a/.gitignore b/.gitignore
index d125cc48..5f04fe62 100644
--- a/.gitignore
+++ b/.gitignore
@@ -36,9 +36,8 @@ bld/
*.coverage
*.coveragexml
-# NDepend
-ndepend/NDependOut/
-ndepend/coverage/
+# NDepend (entire directory — tooling + generated output)
+ndepend/
# BenchmarkDotNet
BenchmarkDotNet.Artifacts/
@@ -49,7 +48,7 @@ BenchmarkDotNet.Artifacts/
# Temporary files and agent workspace
temp/
-temp_pandas_ta/
+pandas_ta/
temp_decompile/
Invoke-WebRequest/
.temp/
diff --git a/QuanTAlib.slnx b/QuanTAlib.slnx
index f448c0f5..b91e4df7 100644
--- a/QuanTAlib.slnx
+++ b/QuanTAlib.slnx
@@ -10,4 +10,7 @@
+
+
+
diff --git a/README.md b/README.md
index 521cd57d..02703b4d 100644
--- a/README.md
+++ b/README.md
@@ -8,14 +8,14 @@
[](https://dotnet.microsoft.com/en-us/download/dotnet)
[](lib/_index.md)
-[](ndepend/ndependout/ndependreport.html)
-[](ndepend/ndependout/ndependreport.html)
-[](ndepend/ndependout/ndependreport.html)
-[](ndepend/ndependout/ndependreport.html)
-[](ndepend/ndependout/ndependreport.html)
-[](ndepend/ndependout/ndependreport.html)
+[](docs/ndepend.md)
+[](docs/ndepend.md)
+[](docs/ndepend.md)
+[](docs/ndepend.md)
+[](docs/ndepend.md)
+[](docs/ndepend.md)
-Static code analysis provided by [ndepend](https://www.ndepend.com/)
+Static code analysis provided by [ndepend](https://www.ndepend.com/)
# QuanTAlib - Quantitative Technical Indicators Without Compromises
diff --git a/ndepend/badges/classes.svg b/docs/img/classes.svg
similarity index 93%
rename from ndepend/badges/classes.svg
rename to docs/img/classes.svg
index 811fc0a3..104c8248 100644
--- a/ndepend/badges/classes.svg
+++ b/docs/img/classes.svg
@@ -1,6 +1,6 @@
\ No newline at end of file
diff --git a/ndepend/badges/comments.svg b/docs/img/comments.svg
similarity index 92%
rename from ndepend/badges/comments.svg
rename to docs/img/comments.svg
index ae2b6ac2..e460a53a 100644
--- a/ndepend/badges/comments.svg
+++ b/docs/img/comments.svg
@@ -1,6 +1,6 @@
\ No newline at end of file
diff --git a/ndepend/badges/complexity.svg b/docs/img/complexity.svg
similarity index 91%
rename from ndepend/badges/complexity.svg
rename to docs/img/complexity.svg
index b25dd871..f10d4fbd 100644
--- a/ndepend/badges/complexity.svg
+++ b/docs/img/complexity.svg
@@ -1,6 +1,6 @@
\ No newline at end of file
diff --git a/ndepend/badges/files.svg b/docs/img/files.svg
similarity index 92%
rename from ndepend/badges/files.svg
rename to docs/img/files.svg
index c33c7a2a..7720ce1f 100644
--- a/ndepend/badges/files.svg
+++ b/docs/img/files.svg
@@ -1,6 +1,6 @@
\ No newline at end of file
diff --git a/ndepend/badges/loc.svg b/docs/img/loc.svg
similarity index 92%
rename from ndepend/badges/loc.svg
rename to docs/img/loc.svg
index 60f49dd8..5db9379b 100644
--- a/ndepend/badges/loc.svg
+++ b/docs/img/loc.svg
@@ -1,6 +1,6 @@
\ No newline at end of file
diff --git a/ndepend/badges/methods.svg b/docs/img/methods.svg
similarity index 93%
rename from ndepend/badges/methods.svg
rename to docs/img/methods.svg
index 97a982c5..65fcf2a0 100644
--- a/ndepend/badges/methods.svg
+++ b/docs/img/methods.svg
@@ -1,6 +1,6 @@
\ No newline at end of file
diff --git a/ndepend/badges/public-api.svg b/docs/img/public-api.svg
similarity index 92%
rename from ndepend/badges/public-api.svg
rename to docs/img/public-api.svg
index b4fc5f9b..c3717bfa 100644
--- a/ndepend/badges/public-api.svg
+++ b/docs/img/public-api.svg
@@ -1,6 +1,6 @@
\ No newline at end of file
diff --git a/docs/ndepend.md b/docs/ndepend.md
index 3feb0eb9..4db3e4d0 100644
--- a/docs/ndepend.md
+++ b/docs/ndepend.md
@@ -73,7 +73,7 @@ This script:
1. Builds the solution in Release configuration
2. Runs NDepend analysis against the compiled assemblies
3. Generates the HTML report at `ndepend/NDependOut/NDependReport.html`
-4. Updates quality gate badges in `ndepend/badges/`
+4. Updates quality gate badges in `docs/img/`
**Prerequisites:** NDepend license (set `NDEPEND_LICENSE` environment variable). Without a license, the script runs but produces warnings instead of full analysis.
diff --git a/global.json b/global.json
deleted file mode 100644
index 991126f1..00000000
--- a/global.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "sdk": {
- "version": "10.0.103",
- "allowPrerelease": false
- }
-}
\ No newline at end of file
diff --git a/lib/QuanTAlib.Tests.csproj b/lib/QuanTAlib.Tests.csproj
index e351131b..bc69a21b 100644
--- a/lib/QuanTAlib.Tests.csproj
+++ b/lib/QuanTAlib.Tests.csproj
@@ -8,6 +8,7 @@
true
$(NoWarn);CS8892
false
+ https://www.myget.org/F/ooplesfinance_stockindicators/api/v3/index.json
diff --git a/lib/channels/aberr/Aberr.cs b/lib/channels/aberr/Aberr.cs
index 492dd580..edf80c70 100644
--- a/lib/channels/aberr/Aberr.cs
+++ b/lib/channels/aberr/Aberr.cs
@@ -96,12 +96,12 @@ public sealed class Aberr : ITValuePublisher, IDisposable
{
if (period <= 0)
{
- throw new ArgumentException("Period must be greater than 0", nameof(period));
+ throw new ArgumentOutOfRangeException(nameof(period), "Period must be greater than 0");
}
if (multiplier <= 0)
{
- throw new ArgumentException("Multiplier must be greater than 0", nameof(multiplier));
+ throw new ArgumentOutOfRangeException(nameof(multiplier), "Multiplier must be greater than 0");
}
_period = period;
@@ -132,13 +132,13 @@ public sealed class Aberr : ITValuePublisher, IDisposable
_source.Pub += _handler;
}
- private void HandleValue(object? sender, in TValueEventArgs e) => Update(e.Value, e.IsNew);
+ private void HandleValue(object? _, in TValueEventArgs e) => Update(e.Value, e.IsNew);
///
/// Helper to invoke the Pub event.
///
[MethodImpl(MethodImplOptions.AggressiveInlining)]
- private void PubEvent(TValue value, bool isNew = true)
+ private void PubEvent(TValue value, bool isNew)
{
Pub?.Invoke(this, new TValueEventArgs { Value = value, IsNew = isNew });
}
@@ -301,7 +301,8 @@ public sealed class Aberr : ITValuePublisher, IDisposable
}
else
{
- double recalcSumSource = 0, recalcSumDeviation = 0;
+ double recalcSumSource = 0;
+ double recalcSumDeviation = 0;
for (int k = 0; k < period; k++)
{
recalcSumSource += buffers.Source[k];
@@ -439,11 +440,11 @@ public sealed class Aberr : ITValuePublisher, IDisposable
[StructLayout(LayoutKind.Auto)]
private ref struct ScalarState
{
- public double SumSource;
- public double SumDeviation;
- public double LastValidValue;
- public int BufferIndex;
- public int TickCount;
+ internal double SumSource;
+ internal double SumDeviation;
+ internal double LastValidValue;
+ internal int BufferIndex;
+ internal int TickCount;
}
///
@@ -452,8 +453,8 @@ public sealed class Aberr : ITValuePublisher, IDisposable
[StructLayout(LayoutKind.Auto)]
private readonly ref struct WorkBuffers(Span source, Span deviation)
{
- public readonly Span Source = source;
- public readonly Span Deviation = deviation;
+ internal readonly Span Source = source;
+ internal readonly Span Deviation = deviation;
}
///
@@ -510,12 +511,12 @@ public sealed class Aberr : ITValuePublisher, IDisposable
if (period <= 0)
{
- throw new ArgumentException("Period must be greater than 0", nameof(period));
+ throw new ArgumentOutOfRangeException(nameof(period), "Period must be greater than 0");
}
if (multiplier <= 0)
{
- throw new ArgumentException("Multiplier must be greater than 0", nameof(multiplier));
+ throw new ArgumentOutOfRangeException(nameof(multiplier), "Multiplier must be greater than 0");
}
if (len == 0)
@@ -701,5 +702,6 @@ public sealed class Aberr : ITValuePublisher, IDisposable
}
_disposed = true;
}
+ GC.SuppressFinalize(this);
}
}
diff --git a/lib/channels/accbands/AccBands.cs b/lib/channels/accbands/AccBands.cs
index 9c8efc57..d9279d98 100644
--- a/lib/channels/accbands/AccBands.cs
+++ b/lib/channels/accbands/AccBands.cs
@@ -528,14 +528,14 @@ public sealed class AccBands : ITValuePublisher, IDisposable
[StructLayout(LayoutKind.Auto)]
private ref struct ScalarState
{
- public double SumAdjHigh;
- public double SumAdjLow;
- public double SumClose;
- public double LastValidHigh;
- public double LastValidLow;
- public double LastValidClose;
- public int BufferIndex;
- public int TickCount;
+ internal double SumAdjHigh;
+ internal double SumAdjLow;
+ internal double SumClose;
+ internal double LastValidHigh;
+ internal double LastValidLow;
+ internal double LastValidClose;
+ internal int BufferIndex;
+ internal int TickCount;
}
///
@@ -544,9 +544,9 @@ public sealed class AccBands : ITValuePublisher, IDisposable
[StructLayout(LayoutKind.Auto)]
private readonly ref struct WorkBuffers(Span adjHigh, Span adjLow, Span close)
{
- public readonly Span AdjHigh = adjHigh;
- public readonly Span AdjLow = adjLow;
- public readonly Span Close = close;
+ internal readonly Span AdjHigh = adjHigh;
+ internal readonly Span AdjLow = adjLow;
+ internal readonly Span Close = close;
}
///
diff --git a/lib/channels/apz/Apz.cs b/lib/channels/apz/Apz.cs
index f339b444..11d79623 100644
--- a/lib/channels/apz/Apz.cs
+++ b/lib/channels/apz/Apz.cs
@@ -439,15 +439,15 @@ public sealed class Apz : ITValuePublisher
[StructLayout(LayoutKind.Auto)]
private ref struct ScalarState
{
- public double Ema1Price;
- public double Ema2Price;
- public double Ema1Range;
- public double Ema2Range;
- public double E;
- public double LastValidPrice;
- public double LastValidHigh;
- public double LastValidLow;
- public bool IsHot;
+ internal double Ema1Price;
+ internal double Ema2Price;
+ internal double Ema1Range;
+ internal double Ema2Range;
+ internal double E;
+ internal double LastValidPrice;
+ internal double LastValidHigh;
+ internal double LastValidLow;
+ internal bool IsHot;
}
///
diff --git a/lib/channels/dchannel/Dchannel.cs b/lib/channels/dchannel/Dchannel.cs
index 64631797..1ddad134 100644
--- a/lib/channels/dchannel/Dchannel.cs
+++ b/lib/channels/dchannel/Dchannel.cs
@@ -269,8 +269,8 @@ public sealed class Dchannel : ITValuePublisher
try
{
- QuanTAlib.Highest.Batch(high, top.AsSpan(0, len), period);
- QuanTAlib.Lowest.Batch(low, bot.AsSpan(0, len), period);
+ Highest.Batch(high, top.AsSpan(0, len), period);
+ Lowest.Batch(low, bot.AsSpan(0, len), period);
for (int i = 0; i < len; i++)
{
diff --git a/lib/channels/decaychannel/Decaychannel.cs b/lib/channels/decaychannel/Decaychannel.cs
index 299921b8..bbf98faf 100644
--- a/lib/channels/decaychannel/Decaychannel.cs
+++ b/lib/channels/decaychannel/Decaychannel.cs
@@ -16,8 +16,8 @@ public sealed class Decaychannel : ITValuePublisher
private readonly double _decayLambda;
private readonly double[] _hBuf;
private readonly double[] _lBuf;
- private readonly double[] _hBuf_prev;
- private readonly double[] _lBuf_prev;
+ private readonly double[] _hBufPrev;
+ private readonly double[] _lBufPrev;
private int _count;
private long _index;
@@ -42,7 +42,7 @@ public sealed class Decaychannel : ITValuePublisher
long Index);
private State _state;
- private State _p_state;
+ private State _pState;
private readonly TBarPublishedHandler _barHandler;
@@ -66,8 +66,8 @@ public sealed class Decaychannel : ITValuePublisher
_decayLambda = Math.Log(2.0) / period;
_hBuf = new double[_period];
_lBuf = new double[_period];
- _hBuf_prev = new double[_period];
- _lBuf_prev = new double[_period];
+ _hBufPrev = new double[_period];
+ _lBufPrev = new double[_period];
_count = 0;
_index = -1;
_currentMax = double.NaN;
@@ -78,7 +78,7 @@ public sealed class Decaychannel : ITValuePublisher
_minAge = 0;
_state = new State(double.NaN, double.NaN, double.NaN, double.NaN, 0, 0, double.NaN, double.NaN, 0, -1);
- _p_state = _state;
+ _pState = _state;
Name = $"Decaychannel({period})";
WarmupPeriod = period;
@@ -135,25 +135,25 @@ public sealed class Decaychannel : ITValuePublisher
_index);
// Save buffer contents
- Array.Copy(_hBuf, _hBuf_prev, _period);
- Array.Copy(_lBuf, _lBuf_prev, _period);
+ Array.Copy(_hBuf, _hBufPrev, _period);
+ Array.Copy(_lBuf, _lBufPrev, _period);
}
private void RestoreState()
{
- _currentMax = _p_state.CurrentMax;
- _currentMin = _p_state.CurrentMin;
- _maxAge = _p_state.MaxAge;
- _minAge = _p_state.MinAge;
- _rawMax = _p_state.RawMax;
- _rawMin = _p_state.RawMin;
- _count = _p_state.Count;
- _index = _p_state.Index;
- _state = _p_state;
+ _currentMax = _pState.CurrentMax;
+ _currentMin = _pState.CurrentMin;
+ _maxAge = _pState.MaxAge;
+ _minAge = _pState.MinAge;
+ _rawMax = _pState.RawMax;
+ _rawMin = _pState.RawMin;
+ _count = _pState.Count;
+ _index = _pState.Index;
+ _state = _pState;
// Restore buffer contents
- Array.Copy(_hBuf_prev, _hBuf, _period);
- Array.Copy(_lBuf_prev, _lBuf, _period);
+ Array.Copy(_hBufPrev, _hBuf, _period);
+ Array.Copy(_lBufPrev, _lBuf, _period);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
@@ -200,7 +200,7 @@ public sealed class Decaychannel : ITValuePublisher
{
// Save state BEFORE advancing (this is state from end of previous bar)
SaveState();
- _p_state = _state;
+ _pState = _state;
// Now advance to new bar
_index++;
@@ -379,8 +379,8 @@ public sealed class Decaychannel : ITValuePublisher
{
Array.Clear(_hBuf);
Array.Clear(_lBuf);
- Array.Clear(_hBuf_prev);
- Array.Clear(_lBuf_prev);
+ Array.Clear(_hBufPrev);
+ Array.Clear(_lBufPrev);
_count = 0;
_index = -1;
_currentMax = double.NaN;
@@ -390,7 +390,7 @@ public sealed class Decaychannel : ITValuePublisher
_maxAge = 0;
_minAge = 0;
_state = new State(double.NaN, double.NaN, double.NaN, double.NaN, 0, 0, double.NaN, double.NaN, 0, -1);
- _p_state = _state;
+ _pState = _state;
Last = default;
Upper = default;
Lower = default;
@@ -436,8 +436,8 @@ public sealed class Decaychannel : ITValuePublisher
try
{
- QuanTAlib.Highest.Batch(high, rawMaxArr.AsSpan(0, len), period);
- QuanTAlib.Lowest.Batch(low, rawMinArr.AsSpan(0, len), period);
+ Highest.Batch(high, rawMaxArr.AsSpan(0, len), period);
+ Lowest.Batch(low, rawMinArr.AsSpan(0, len), period);
double currentMax = double.NaN;
double currentMin = double.NaN;
diff --git a/lib/channels/vwapsd/Vwapsd.Quantower.cs b/lib/channels/vwapsd/Vwapsd.Quantower.cs
index fb7355ec..350daa36 100644
--- a/lib/channels/vwapsd/Vwapsd.Quantower.cs
+++ b/lib/channels/vwapsd/Vwapsd.Quantower.cs
@@ -58,18 +58,6 @@ public class VwapsdIndicator : Indicator, IWatchlistIndicator
base.OnInit();
}
- private void UpdateSeriesNames()
- {
- if (UpperSeries != null)
- {
- UpperSeries.Name = $"Upper (+{NumDevs:F1}σ)";
- }
- if (LowerSeries != null)
- {
- LowerSeries.Name = $"Lower (-{NumDevs:F1}σ)";
- }
- }
-
protected override void OnUpdate(UpdateArgs args)
{
var item = HistoricalData[0, SeekOriginHistory.End];
diff --git a/lib/core/avgprice/Avgprice.cs b/lib/core/avgprice/Avgprice.cs
index b8710434..db181582 100644
--- a/lib/core/avgprice/Avgprice.cs
+++ b/lib/core/avgprice/Avgprice.cs
@@ -132,8 +132,6 @@ public sealed class Avgprice : AbstractBase
return new TSeries(t, v);
}
-
- ///
public override TSeries Update(TSeries source)
{
int len = source.Count;
@@ -201,8 +199,6 @@ public sealed class Avgprice : AbstractBase
PubEvent(Last, isNew);
return Last;
}
-
- ///
public override void Prime(ReadOnlySpan source, TimeSpan? step = null)
{
for (int i = 0; i < source.Length; i++)
@@ -210,8 +206,6 @@ public sealed class Avgprice : AbstractBase
Update(new TValue(DateTime.UtcNow, source[i]), isNew: true);
}
}
-
- ///
public override void Reset()
{
_s = new State(0, 0, 0, 0, 0, 0);
diff --git a/lib/core/ha/Ha.cs b/lib/core/ha/Ha.cs
index ff2e659a..1987f350 100644
--- a/lib/core/ha/Ha.cs
+++ b/lib/core/ha/Ha.cs
@@ -117,8 +117,6 @@ public sealed class Ha : AbstractBase
return result;
}
-
- ///
public override TSeries Update(TSeries source)
{
int len = source.Count;
@@ -204,8 +202,6 @@ public sealed class Ha : AbstractBase
PubEvent(Last, isNew);
return LastBar;
}
-
- ///
public override void Prime(ReadOnlySpan source, TimeSpan? step = null)
{
for (int i = 0; i < source.Length; i++)
@@ -213,8 +209,6 @@ public sealed class Ha : AbstractBase
Update(new TValue(DateTime.UtcNow.Ticks, source[i]), isNew: true);
}
}
-
- ///
public override void Reset()
{
_s = default;
diff --git a/lib/core/medprice/Medprice.cs b/lib/core/medprice/Medprice.cs
index 16e22eab..98bee37f 100644
--- a/lib/core/medprice/Medprice.cs
+++ b/lib/core/medprice/Medprice.cs
@@ -130,8 +130,6 @@ public sealed class Medprice : AbstractBase
return new TSeries(t, v);
}
-
- ///
public override TSeries Update(TSeries source)
{
int len = source.Count;
@@ -197,8 +195,6 @@ public sealed class Medprice : AbstractBase
PubEvent(Last, isNew);
return Last;
}
-
- ///
public override void Prime(ReadOnlySpan source, TimeSpan? step = null)
{
for (int i = 0; i < source.Length; i++)
@@ -206,8 +202,6 @@ public sealed class Medprice : AbstractBase
Update(new TValue(DateTime.UtcNow, source[i]), isNew: true);
}
}
-
- ///
public override void Reset()
{
_s = new State(0, 0, 0, 0);
diff --git a/lib/core/midbody/Midbody.cs b/lib/core/midbody/Midbody.cs
index b8ffaba7..1872f05a 100644
--- a/lib/core/midbody/Midbody.cs
+++ b/lib/core/midbody/Midbody.cs
@@ -130,8 +130,6 @@ public sealed class Midbody : AbstractBase
return new TSeries(t, v);
}
-
- ///
public override TSeries Update(TSeries source)
{
int len = source.Count;
@@ -197,8 +195,6 @@ public sealed class Midbody : AbstractBase
PubEvent(Last, isNew);
return Last;
}
-
- ///
public override void Prime(ReadOnlySpan source, TimeSpan? step = null)
{
for (int i = 0; i < source.Length; i++)
@@ -206,8 +202,6 @@ public sealed class Midbody : AbstractBase
Update(new TValue(DateTime.UtcNow, source[i]), isNew: true);
}
}
-
- ///
public override void Reset()
{
_s = new State(0, 0, 0, 0);
diff --git a/lib/core/midprice/Midprice.cs b/lib/core/midprice/Midprice.cs
index ea5a4ed7..159bf94d 100644
--- a/lib/core/midprice/Midprice.cs
+++ b/lib/core/midprice/Midprice.cs
@@ -135,8 +135,6 @@ public sealed class Midprice : AbstractBase
return new TSeries(t, v);
}
-
- ///
public override TSeries Update(TSeries source)
{
var result = new TSeries(source.Count);
@@ -178,8 +176,6 @@ public sealed class Midprice : AbstractBase
PubEvent(Last, isNew);
return Last;
}
-
- ///
public override void Prime(ReadOnlySpan source, TimeSpan? step = null)
{
TimeSpan interval = step ?? TimeSpan.FromSeconds(1);
@@ -191,8 +187,6 @@ public sealed class Midprice : AbstractBase
time += interval;
}
}
-
- ///
public override void Reset()
{
_highBuffer.Clear();
diff --git a/lib/core/typprice/Typprice.cs b/lib/core/typprice/Typprice.cs
index edafbd37..82d77867 100644
--- a/lib/core/typprice/Typprice.cs
+++ b/lib/core/typprice/Typprice.cs
@@ -132,8 +132,6 @@ public sealed class Typprice : AbstractBase
return new TSeries(t, v);
}
-
- ///
public override TSeries Update(TSeries source)
{
int len = source.Count;
@@ -200,8 +198,6 @@ public sealed class Typprice : AbstractBase
PubEvent(Last, isNew);
return Last;
}
-
- ///
public override void Prime(ReadOnlySpan source, TimeSpan? step = null)
{
for (int i = 0; i < source.Length; i++)
@@ -209,8 +205,6 @@ public sealed class Typprice : AbstractBase
Update(new TValue(DateTime.UtcNow, source[i]), isNew: true);
}
}
-
- ///
public override void Reset()
{
_s = new State(0, 0, 0, 0, 0);
diff --git a/lib/core/wclprice/Wclprice.cs b/lib/core/wclprice/Wclprice.cs
index 43dd9271..da0add8d 100644
--- a/lib/core/wclprice/Wclprice.cs
+++ b/lib/core/wclprice/Wclprice.cs
@@ -131,8 +131,6 @@ public sealed class Wclprice : AbstractBase
return new TSeries(t, v);
}
-
- ///
public override TSeries Update(TSeries source)
{
int len = source.Count;
@@ -199,8 +197,6 @@ public sealed class Wclprice : AbstractBase
PubEvent(Last, isNew);
return Last;
}
-
- ///
public override void Prime(ReadOnlySpan source, TimeSpan? step = null)
{
for (int i = 0; i < source.Length; i++)
@@ -208,8 +204,6 @@ public sealed class Wclprice : AbstractBase
Update(new TValue(DateTime.UtcNow, source[i]), isNew: true);
}
}
-
- ///
public override void Reset()
{
_s = new State(0, 0, 0, 0, 0);
diff --git a/lib/cycles/ccyc/Ccyc.Tests.cs b/lib/cycles/ccyc/Ccyc.Tests.cs
index 6314442f..e4faf26d 100644
--- a/lib/cycles/ccyc/Ccyc.Tests.cs
+++ b/lib/cycles/ccyc/Ccyc.Tests.cs
@@ -287,13 +287,6 @@ public class CcycTests
Assert.Equal(source.Count, batchResults.Count);
- // Compare last 50 values
- for (int i = source.Count - 50; i < source.Count; i++)
- {
- // Streaming processes all bars and streaming result is the last one
- // But for exact comparison, batch results should match streaming approach
- }
-
// The batch method creates a fresh indicator and calls Update(TSeries),
// which processes sequentially — should match streaming exactly
var ccyc2 = new Ccyc();
diff --git a/lib/dynamics/ichimoku/Ichimoku.cs b/lib/dynamics/ichimoku/Ichimoku.cs
index 901a7ab8..2d97ab6d 100644
--- a/lib/dynamics/ichimoku/Ichimoku.cs
+++ b/lib/dynamics/ichimoku/Ichimoku.cs
@@ -208,8 +208,8 @@ public sealed class Ichimoku : ITValuePublisher
_p_state = _state;
Array.Fill(_highBuffer, double.NaN);
Array.Fill(_lowBuffer, double.NaN);
- Array.Copy(_highBuffer, _p_highBuffer!, _highBuffer.Length);
- Array.Copy(_lowBuffer, _p_lowBuffer!, _lowBuffer.Length);
+ Array.Copy(_highBuffer, _p_highBuffer, _highBuffer.Length);
+ Array.Copy(_lowBuffer, _p_lowBuffer, _lowBuffer.Length);
Tenkan = default;
Kijun = default;
SenkouA = default;
@@ -299,14 +299,14 @@ public sealed class Ichimoku : ITValuePublisher
if (isNew)
{
_p_state = _state;
- Array.Copy(_highBuffer, _p_highBuffer!, _highBuffer.Length);
- Array.Copy(_lowBuffer, _p_lowBuffer!, _lowBuffer.Length);
+ Array.Copy(_highBuffer, _p_highBuffer, _highBuffer.Length);
+ Array.Copy(_lowBuffer, _p_lowBuffer, _lowBuffer.Length);
}
else
{
_state = _p_state;
- Array.Copy(_p_highBuffer!, _highBuffer, _highBuffer.Length);
- Array.Copy(_p_lowBuffer!, _lowBuffer, _lowBuffer.Length);
+ Array.Copy(_p_highBuffer, _highBuffer, _highBuffer.Length);
+ Array.Copy(_p_lowBuffer, _lowBuffer, _lowBuffer.Length);
}
var (high, low, close) = GetValidHLC(bar);
diff --git a/lib/dynamics/pfe/Pfe.cs b/lib/dynamics/pfe/Pfe.cs
index db0ef5b7..cc08c68e 100644
--- a/lib/dynamics/pfe/Pfe.cs
+++ b/lib/dynamics/pfe/Pfe.cs
@@ -198,8 +198,6 @@ public sealed class Pfe : AbstractBase
PubEvent(Last, isNew);
return Last;
}
-
- ///
public override TSeries Update(TSeries source)
{
if (source.Count == 0)
@@ -225,8 +223,6 @@ public sealed class Pfe : AbstractBase
Last = new TValue(tSpan[len - 1], vSpan[len - 1]);
return new TSeries(t, v);
}
-
- ///
public override void Prime(ReadOnlySpan source, TimeSpan? step = null)
{
if (source.Length == 0)
@@ -457,8 +453,6 @@ public sealed class Pfe : AbstractBase
}
}
}
-
- ///
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public override void Reset()
{
diff --git a/lib/dynamics/ravi/Ravi.cs b/lib/dynamics/ravi/Ravi.cs
index bb4dbc50..b649054a 100644
--- a/lib/dynamics/ravi/Ravi.cs
+++ b/lib/dynamics/ravi/Ravi.cs
@@ -184,8 +184,6 @@ public sealed class Ravi : AbstractBase
PubEvent(Last, isNew);
return Last;
}
-
- ///
public override TSeries Update(TSeries source)
{
if (source.Count == 0)
@@ -211,8 +209,6 @@ public sealed class Ravi : AbstractBase
Last = new TValue(tSpan[len - 1], vSpan[len - 1]);
return new TSeries(t, v);
}
-
- ///
public override void Prime(ReadOnlySpan source, TimeSpan? step = null)
{
if (source.Length == 0)
@@ -465,8 +461,6 @@ public sealed class Ravi : AbstractBase
}
}
}
-
- ///
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public override void Reset()
{
diff --git a/lib/dynamics/ttm_squeeze/TtmSqueeze.Validation.Tests.cs b/lib/dynamics/ttm_squeeze/TtmSqueeze.Validation.Tests.cs
index ab0bb038..9058adb4 100644
--- a/lib/dynamics/ttm_squeeze/TtmSqueeze.Validation.Tests.cs
+++ b/lib/dynamics/ttm_squeeze/TtmSqueeze.Validation.Tests.cs
@@ -49,7 +49,7 @@ public class TtmSqueezeValidationTests
}
// Momentum should be near zero since price = midline
- Assert.True(System.Math.Abs(squeeze.Momentum.Value) < 1.0);
+ Assert.True(Math.Abs(squeeze.Momentum.Value) < 1.0);
}
[Fact]
@@ -250,7 +250,7 @@ public class TtmSqueezeValidationTests
for (int i = 0; i < 50; i++)
{
- double price = 100 + System.Math.Sin(i * 0.2) * 10;
+ double price = 100 + Math.Sin(i * 0.2) * 10;
double high = price + 2;
double low = price - 2;
source.Add(new TBar(baseTime + i * 60000, price, high, low, price + 0.5, 1000));
@@ -306,7 +306,7 @@ public class TtmSqueezeValidationTests
Assert.True(double.IsFinite(squeeze.Momentum.Value));
// With constant price, donchian midline = price, so momentum should be near 0
- Assert.True(System.Math.Abs(squeeze.Momentum.Value) < 0.01);
+ Assert.True(Math.Abs(squeeze.Momentum.Value) < 0.01);
}
[Fact]
diff --git a/lib/dynamics/vhf/Vhf.cs b/lib/dynamics/vhf/Vhf.cs
index 22578b28..feaef26d 100644
--- a/lib/dynamics/vhf/Vhf.cs
+++ b/lib/dynamics/vhf/Vhf.cs
@@ -184,8 +184,6 @@ public sealed class Vhf : AbstractBase
PubEvent(Last, isNew);
return Last;
}
-
- ///
public override TSeries Update(TSeries source)
{
if (source.Count == 0)
@@ -211,8 +209,6 @@ public sealed class Vhf : AbstractBase
Last = new TValue(tSpan[len - 1], vSpan[len - 1]);
return new TSeries(t, v);
}
-
- ///
public override void Prime(ReadOnlySpan source, TimeSpan? step = null)
{
if (source.Length == 0)
@@ -461,8 +457,6 @@ public sealed class Vhf : AbstractBase
}
}
}
-
- ///
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public override void Reset()
{
diff --git a/lib/errors/wrmse/Wrmse.cs b/lib/errors/wrmse/Wrmse.cs
index 397e3706..cb6f70c9 100644
--- a/lib/errors/wrmse/Wrmse.cs
+++ b/lib/errors/wrmse/Wrmse.cs
@@ -187,26 +187,18 @@ public sealed class Wrmse : AbstractBase
{
return Update(actual, predicted, DefaultWeight, isNew);
}
-
- ///
public override TValue Update(TValue input, bool isNew = true)
{
throw new NotSupportedException("WRMSE requires two inputs. Use Update(actual, predicted) or Update(actual, predicted, weight).");
}
-
- ///
public override TSeries Update(TSeries source)
{
throw new NotSupportedException("WRMSE requires two inputs. Use Batch(actualSeries, predictedSeries, period) or Batch(actualSeries, predictedSeries, weightsSeries, period).");
}
-
- ///
public override void Prime(ReadOnlySpan source, TimeSpan? step = null)
{
throw new NotSupportedException("WRMSE requires two inputs.");
}
-
- ///
public override void Reset()
{
_weightedErrorBuffer.Clear();
diff --git a/lib/feeds/csvfeed/CsvFeed.cs b/lib/feeds/csvfeed/CsvFeed.cs
index 4bbff254..407de657 100644
--- a/lib/feeds/csvfeed/CsvFeed.cs
+++ b/lib/feeds/csvfeed/CsvFeed.cs
@@ -16,12 +16,12 @@ internal readonly record struct ParsedOhlcv(long Time, double Open, double High,
[StructLayout(LayoutKind.Auto)]
internal ref struct OhlcvParseState
{
- public long Time;
- public double Open;
- public double High;
- public double Low;
- public double Close;
- public double Volume;
+ internal long Time;
+ internal double Open;
+ internal double High;
+ internal double Low;
+ internal double Close;
+ internal double Volume;
}
///
diff --git a/lib/filters/agc/agc_signature.svg b/lib/filters/agc/agc_signature.svg
new file mode 100644
index 00000000..bb3ca732
--- /dev/null
+++ b/lib/filters/agc/agc_signature.svg
@@ -0,0 +1,19694 @@
+
+
+
diff --git a/lib/filters/alaguerre/ALaguerre.cs b/lib/filters/alaguerre/ALaguerre.cs
index 2e6301a7..2c527d60 100644
--- a/lib/filters/alaguerre/ALaguerre.cs
+++ b/lib/filters/alaguerre/ALaguerre.cs
@@ -117,13 +117,9 @@ public sealed class ALaguerre : AbstractBase
}
source.Pub += Handle;
}
-
- ///
public override bool IsHot => _s.Count >= WarmupPeriod;
private const int StackAllocThreshold = 512;
-
- ///
public override void Prime(ReadOnlySpan source, TimeSpan? step = null)
{
if (source.Length == 0)
@@ -203,8 +199,6 @@ public sealed class ALaguerre : AbstractBase
}
return _lastValidValue;
}
-
- ///
[MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)]
public override TValue Update(TValue input, bool isNew = true)
{
@@ -230,8 +224,6 @@ public sealed class ALaguerre : AbstractBase
PubEvent(Last, isNew);
return Last;
}
-
- ///
[MethodImpl(MethodImplOptions.AggressiveOptimization)]
public override TSeries Update(TSeries source)
{
@@ -571,8 +563,6 @@ public sealed class ALaguerre : AbstractBase
coeffBuf, ref cHead, ref cCount,
ref state, ref lastValid);
}
-
- ///
public override void Reset()
{
_s = State.New();
diff --git a/lib/filters/baxterking/BaxterKing.cs b/lib/filters/baxterking/BaxterKing.cs
index 0d3a1592..6089a88e 100644
--- a/lib/filters/baxterking/BaxterKing.cs
+++ b/lib/filters/baxterking/BaxterKing.cs
@@ -247,9 +247,6 @@ public sealed class BaxterKing : AbstractBase
}
}
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- private static double SoftBandPass(double value) => value;
-
public static TSeries Batch(TSeries source, int pLow = 6, int pHigh = 32, int k = 12)
{
double[] input = source.Values.ToArray();
diff --git a/lib/filters/butter2/Butter2.cs b/lib/filters/butter2/Butter2.cs
index 005bc1f2..3ac0678d 100644
--- a/lib/filters/butter2/Butter2.cs
+++ b/lib/filters/butter2/Butter2.cs
@@ -34,7 +34,7 @@ public sealed class Butter2 : AbstractBase
CalculateCoefficients();
Name = $"Butter2({_period})";
WarmupPeriod = 4 * period;
- _handler = new TValuePublishedHandler(Handle);
+ _handler = Handle;
Init();
}
diff --git a/lib/filters/butter3/Butter3.cs b/lib/filters/butter3/Butter3.cs
index 438d620e..fe16bfd4 100644
--- a/lib/filters/butter3/Butter3.cs
+++ b/lib/filters/butter3/Butter3.cs
@@ -33,7 +33,7 @@ public sealed class Butter3 : AbstractBase
CalculateCoefficients();
Name = $"Butter3({_period})";
WarmupPeriod = 6 * period;
- _handler = new TValuePublishedHandler(Handle);
+ _handler = Handle;
Init();
}
diff --git a/lib/filters/cfitz/Cfitz.cs b/lib/filters/cfitz/Cfitz.cs
index 8434975c..32406088 100644
--- a/lib/filters/cfitz/Cfitz.cs
+++ b/lib/filters/cfitz/Cfitz.cs
@@ -232,19 +232,6 @@ public sealed class Cfitz : AbstractBase
return weightedSum;
}
- ///
- /// Computes the ideal band-pass weight B_j for lag j.
- ///
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- private static double IdealWeight(double wl, double wh, int j)
- {
- if (j == 0)
- {
- return (wh - wl) / Math.PI;
- }
- return (Math.Sin(j * wh) - Math.Sin(j * wl)) / (Math.PI * j);
- }
-
public static TSeries Batch(TSeries source, int pLow = 6, int pHigh = 32)
{
double[] input = source.Values.ToArray();
diff --git a/lib/filters/cheby1/Cheby1.cs b/lib/filters/cheby1/Cheby1.cs
index 408ed3cc..8bc13c3b 100644
--- a/lib/filters/cheby1/Cheby1.cs
+++ b/lib/filters/cheby1/Cheby1.cs
@@ -65,7 +65,7 @@ public sealed class Cheby1 : AbstractBase
double wc = 2.0 * Math.PI / period;
double Wc = Math.Tan(wc * 0.5);
double epsilon = Math.Sqrt(Math.Pow(10.0, safeRipple * 0.1) - 1.0);
- double mu = System.Math.Asinh(1.0 / epsilon) * 0.5;
+ double mu = Math.Asinh(1.0 / epsilon) * 0.5;
double sinhMu = Math.Sinh(mu);
double coshMu = Math.Cosh(mu);
double sigma = -sinhMu * Wc;
@@ -226,7 +226,7 @@ public sealed class Cheby1 : AbstractBase
double wc = 2.0 * Math.PI / period;
double Wc = Math.Tan(wc * 0.5);
double epsilon = Math.Sqrt(Math.Pow(10.0, safeRipple * 0.1) - 1.0);
- double mu = System.Math.Asinh(1.0 / epsilon) * 0.5;
+ double mu = Math.Asinh(1.0 / epsilon) * 0.5;
double sinhMu = Math.Sinh(mu);
double coshMu = Math.Cosh(mu);
double sigma = -sinhMu * Wc;
diff --git a/lib/filters/cheby2/Cheby2.cs b/lib/filters/cheby2/Cheby2.cs
index 30fbd1ed..0e7b2c88 100644
--- a/lib/filters/cheby2/Cheby2.cs
+++ b/lib/filters/cheby2/Cheby2.cs
@@ -65,7 +65,7 @@ public sealed class Cheby2 : AbstractBase
double wc = 2.0 * Math.PI / period;
double Wc = 2.0 * Math.Tan(wc * 0.5);
double epsilon = 1.0 / Math.Sqrt(Math.Pow(10.0, safeAtten * 0.1) - 1.0);
- double mu = System.Math.Asinh(1.0 / epsilon) * 0.5;
+ double mu = Math.Asinh(1.0 / epsilon) * 0.5;
double sinhMu = Math.Sinh(mu);
double coshMu = Math.Cosh(mu);
double sqrt2 = Math.Sqrt(2.0);
@@ -246,7 +246,7 @@ public sealed class Cheby2 : AbstractBase
double wc = 2.0 * Math.PI / period;
double Wc = 2.0 * Math.Tan(wc * 0.5);
double epsilon = 1.0 / Math.Sqrt(Math.Pow(10.0, safeAtten * 0.1) - 1.0);
- double mu = System.Math.Asinh(1.0 / epsilon) * 0.5;
+ double mu = Math.Asinh(1.0 / epsilon) * 0.5;
double sinhMu = Math.Sinh(mu);
double coshMu = Math.Cosh(mu);
double sqrt2 = Math.Sqrt(2.0);
diff --git a/lib/filters/gauss/Gauss.cs b/lib/filters/gauss/Gauss.cs
index 649b3037..7dec560d 100644
--- a/lib/filters/gauss/Gauss.cs
+++ b/lib/filters/gauss/Gauss.cs
@@ -278,53 +278,53 @@ public sealed class Gauss : AbstractBase
weights[i] *= invSum;
}
- // Apply filter
- for (int i = 0; i < source.Length; i++)
- {
- double result = 0;
- double wSum = 0;
+ // Apply filter
+ for (int i = 0; i < source.Length; i++)
+ {
+ double result = 0;
+ double wSum = 0;
- // This loop logic matches the RingBuffer partial fill logic.
- // If i < kernelSize, we don't have enough history.
- // The available history is source[0]...source[i].
- // This history maps to the END of the kernel weights.
- // E.g. if we have only 1 item (index i=0), it corresponds to weights[kernelSize-1].
+ // This loop logic matches the RingBuffer partial fill logic.
+ // If i < kernelSize, we don't have enough history.
+ // The available history is source[0]...source[i].
+ // This history maps to the END of the kernel weights.
+ // E.g. if we have only 1 item (index i=0), it corresponds to weights[kernelSize-1].
- int count = Math.Min(i + 1, kernelSize);
+ int count = Math.Min(i + 1, kernelSize);
- for (int j = 0; j < count; j++)
- {
- // Source index: i - (count - 1) + j
- // if j=0, source index is i - count + 1.
- // if count=kernelSize, init index is i - kernelSize + 1.
- // if count=1 (i=0), init index is 0.
+ for (int j = 0; j < count; j++)
+ {
+ // Source index: i - (count - 1) + j
+ // if j=0, source index is i - count + 1.
+ // if count=kernelSize, init index is i - kernelSize + 1.
+ // if count=1 (i=0), init index is 0.
- int srcIdx = i - (count - 1) + j;
- double val = source[srcIdx];
+ int srcIdx = i - (count - 1) + j;
+ double val = source[srcIdx];
- if (!double.IsNaN(val))
- {
- // Weight index:
- // If full buffer, we use full weights 0..kernelSize-1.
- // If partial, we align to end of weights.
- // j=0 (oldest available) -> weights[kernelSize - count]
- int weightIdx = kernelSize - count + j;
+ if (!double.IsNaN(val))
+ {
+ // Weight index:
+ // If full buffer, we use full weights 0..kernelSize-1.
+ // If partial, we align to end of weights.
+ // j=0 (oldest available) -> weights[kernelSize - count]
+ int weightIdx = kernelSize - count + j;
- double w = weights[weightIdx];
- result += val * w;
- wSum += w;
- }
- }
+ double w = weights[weightIdx];
+ result += val * w;
+ wSum += w;
+ }
+ }
- if (wSum > 0)
- {
- output[i] = result / wSum;
- }
- else
- {
- output[i] = double.NaN;
- }
- }
+ if (wSum > 0)
+ {
+ output[i] = result / wSum;
+ }
+ else
+ {
+ output[i] = double.NaN;
+ }
+ }
}
finally
{
diff --git a/lib/filters/gauss/gauss_signature.svg b/lib/filters/gauss/gauss_signature.svg
new file mode 100644
index 00000000..590e9f8b
--- /dev/null
+++ b/lib/filters/gauss/gauss_signature.svg
@@ -0,0 +1,19604 @@
+
+
+
diff --git a/lib/filters/hann/Hann.cs b/lib/filters/hann/Hann.cs
index 27a7f27b..a6f658df 100644
--- a/lib/filters/hann/Hann.cs
+++ b/lib/filters/hann/Hann.cs
@@ -81,14 +81,11 @@ public sealed class Hann : AbstractBase
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private void GenerateWeights()
{
- double coefSum = 0;
double denom = Length - 1;
for (int i = 0; i < Length; i++)
{
- double w = 0.5 * (1.0 - Math.Cos(2.0 * Math.PI * i / denom));
- _weights[i] = w;
- coefSum += w;
+ _weights[i] = 0.5 * (1.0 - Math.Cos(2.0 * Math.PI * i / denom));
}
}
diff --git a/lib/filters/hp/hp_signature.svg b/lib/filters/hp/hp_signature.svg
new file mode 100644
index 00000000..b06c1e35
--- /dev/null
+++ b/lib/filters/hp/hp_signature.svg
@@ -0,0 +1,19672 @@
+
+
+
diff --git a/lib/filters/kalman/kalman_signature.svg b/lib/filters/kalman/kalman_signature.svg
new file mode 100644
index 00000000..33eddc2d
--- /dev/null
+++ b/lib/filters/kalman/kalman_signature.svg
@@ -0,0 +1,19669 @@
+
+
+
diff --git a/lib/filters/laguerre/laguerre_signature.svg b/lib/filters/laguerre/laguerre_signature.svg
new file mode 100644
index 00000000..e79defb8
--- /dev/null
+++ b/lib/filters/laguerre/laguerre_signature.svg
@@ -0,0 +1,19699 @@
+
+
+
diff --git a/lib/filters/lms/lms_signature.svg b/lib/filters/lms/lms_signature.svg
new file mode 100644
index 00000000..eae2c9b5
--- /dev/null
+++ b/lib/filters/lms/lms_signature.svg
@@ -0,0 +1,19405 @@
+
+
+
diff --git a/lib/filters/oneeuro/oneeuro_signature.svg b/lib/filters/oneeuro/oneeuro_signature.svg
new file mode 100644
index 00000000..d0fead12
--- /dev/null
+++ b/lib/filters/oneeuro/oneeuro_signature.svg
@@ -0,0 +1,19637 @@
+
+
+
diff --git a/lib/filters/rls/rls_signature.svg b/lib/filters/rls/rls_signature.svg
new file mode 100644
index 00000000..fa0716f8
--- /dev/null
+++ b/lib/filters/rls/rls_signature.svg
@@ -0,0 +1,19484 @@
+
+
+
diff --git a/lib/filters/roofing/roofing_signature.svg b/lib/filters/roofing/roofing_signature.svg
new file mode 100644
index 00000000..9fa9c70a
--- /dev/null
+++ b/lib/filters/roofing/roofing_signature.svg
@@ -0,0 +1,19488 @@
+
+
+
diff --git a/lib/filters/spbf/spbf_signature.svg b/lib/filters/spbf/spbf_signature.svg
new file mode 100644
index 00000000..51d5b789
--- /dev/null
+++ b/lib/filters/spbf/spbf_signature.svg
@@ -0,0 +1,19761 @@
+
+
+
diff --git a/lib/filters/ssf3/Ssf3.cs b/lib/filters/ssf3/Ssf3.cs
index 0d10d7e5..d8190ac2 100644
--- a/lib/filters/ssf3/Ssf3.cs
+++ b/lib/filters/ssf3/Ssf3.cs
@@ -33,7 +33,7 @@ public sealed class Ssf3 : AbstractBase
CalculateCoefficients();
Name = $"Ssf3({_period})";
WarmupPeriod = 6 * period;
- _handler = new TValuePublishedHandler(Handle);
+ _handler = Handle;
Init();
}
diff --git a/lib/filters/wavelet/wavelet_signature.svg b/lib/filters/wavelet/wavelet_signature.svg
new file mode 100644
index 00000000..2f780e17
--- /dev/null
+++ b/lib/filters/wavelet/wavelet_signature.svg
@@ -0,0 +1,19717 @@
+
+
+
diff --git a/lib/momentum/cci/Cci.Quantower.Tests.cs b/lib/momentum/cci/Cci.Quantower.Tests.cs
index d91bff0d..55e4c0cc 100644
--- a/lib/momentum/cci/Cci.Quantower.Tests.cs
+++ b/lib/momentum/cci/Cci.Quantower.Tests.cs
@@ -127,6 +127,6 @@ public class CciIndicatorTests
public void CciIndicator_ImplementsIWatchlistIndicator()
{
var indicator = new CciIndicator();
- Assert.True(indicator is IWatchlistIndicator);
+ Assert.IsAssignableFrom(indicator);
}
}
diff --git a/lib/momentum/cmo/Cmo.cs b/lib/momentum/cmo/Cmo.cs
index 2b30c929..4f5d74c0 100644
--- a/lib/momentum/cmo/Cmo.cs
+++ b/lib/momentum/cmo/Cmo.cs
@@ -36,8 +36,6 @@ public sealed class Cmo : AbstractBase
private readonly TValuePublishedHandler _handler;
private double _prevValue;
private double _p_prevValue;
-
- ///
public override bool IsHot => _upBuffer.IsFull;
///
@@ -72,9 +70,6 @@ public sealed class Cmo : AbstractBase
{
source.Pub += _handler;
}
-
-
- ///
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public override TValue Update(TValue input, bool isNew = true)
{
@@ -131,8 +126,6 @@ public sealed class Cmo : AbstractBase
PubEvent(Last, isNew);
return Last;
}
-
- ///
public override TSeries Update(TSeries source)
{
if (source.Count == 0)
@@ -167,8 +160,6 @@ public sealed class Cmo : AbstractBase
{
Update(args.Value, args.IsNew);
}
-
- ///
public override void Prime(ReadOnlySpan source, TimeSpan? step = null)
{
foreach (var value in source)
@@ -290,8 +281,6 @@ public sealed class Cmo : AbstractBase
TSeries results = indicator.Update(source);
return (results, indicator);
}
-
- ///
public override void Reset()
{
_upBuffer.Clear();
@@ -300,8 +289,6 @@ public sealed class Cmo : AbstractBase
_p_prevValue = double.NaN;
Last = default;
}
-
- ///
protected override void Dispose(bool disposing)
{
if (disposing)
diff --git a/lib/momentum/prs/Prs.cs b/lib/momentum/prs/Prs.cs
index ba808ed4..84eae8a4 100644
--- a/lib/momentum/prs/Prs.cs
+++ b/lib/momentum/prs/Prs.cs
@@ -145,15 +145,11 @@ public sealed class Prs : AbstractBase
{
return Update(new TValue(DateTime.UtcNow, baseValue), new TValue(DateTime.UtcNow, compValue), isNew);
}
-
- ///
/// Not supported for bi-input indicator. Use Update(baseValue, compValue) instead.
public override TValue Update(TValue input, bool isNew = true)
{
throw new NotSupportedException("PRS requires two inputs (base and comparison). Use Update(baseValue, compValue).");
}
-
- ///
/// Not supported for bi-input indicator. Use Calculate(baseSeries, compSeries, period) instead.
public override TSeries Update(TSeries source)
{
@@ -240,8 +236,6 @@ public sealed class Prs : AbstractBase
return _ema;
}
-
- ///
public override void Prime(ReadOnlySpan source, TimeSpan? step = null)
{
throw new NotSupportedException("PRS requires two inputs. Use Prime(baseSource, compSource).");
diff --git a/lib/momentum/sam/Sam.cs b/lib/momentum/sam/Sam.cs
index e501199d..4715554d 100644
--- a/lib/momentum/sam/Sam.cs
+++ b/lib/momentum/sam/Sam.cs
@@ -36,7 +36,6 @@ public sealed class Sam : AbstractBase
private readonly double _ssC3;
private const double TwoPi = 2.0 * Math.PI;
- private const double HalfPi = Math.PI / 2.0;
private const double Sqrt2 = 1.4142135623730951;
private const int MaxCyclePeriod = 50;
private const int MinCyclePeriod = 6;
diff --git a/lib/oscillators/bbb/Bbb.cs b/lib/oscillators/bbb/Bbb.cs
index 769de92b..9e143bcd 100644
--- a/lib/oscillators/bbb/Bbb.cs
+++ b/lib/oscillators/bbb/Bbb.cs
@@ -94,8 +94,6 @@ public sealed class Bbb : AbstractBase
/// Standard deviation multiplier.
///
public double Multiplier => _multiplier;
-
- ///
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public override TValue Update(TValue input, bool isNew = true)
{
@@ -167,8 +165,6 @@ public sealed class Bbb : AbstractBase
PubEvent(Last, isNew);
return Last;
}
-
- ///
public override TSeries Update(TSeries source)
{
Reset();
@@ -304,8 +300,6 @@ public sealed class Bbb : AbstractBase
_state.SumSq += v * v;
}
}
-
- ///
public override void Prime(ReadOnlySpan source, TimeSpan? step = null)
{
for (int i = 0; i < source.Length; i++)
@@ -313,8 +307,6 @@ public sealed class Bbb : AbstractBase
Update(new TValue(DateTime.UtcNow, source[i]), isNew: true);
}
}
-
- ///
public override void Reset()
{
_buffer.Clear();
diff --git a/lib/oscillators/bbi/Bbi.cs b/lib/oscillators/bbi/Bbi.cs
index 2a442a97..89478ae0 100644
--- a/lib/oscillators/bbi/Bbi.cs
+++ b/lib/oscillators/bbi/Bbi.cs
@@ -110,8 +110,6 @@ public sealed class Bbi : AbstractBase
/// True when enough bars have been processed for valid (full-window) output.
public override bool IsHot => _s.Index >= WarmupPeriod;
-
- ///
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public override TValue Update(TValue input, bool isNew = true)
{
@@ -202,8 +200,6 @@ public sealed class Bbi : AbstractBase
PubEvent(Last, isNew);
return Last;
}
-
- ///
public override TSeries Update(TSeries source)
{
int len = source.Count;
@@ -227,8 +223,6 @@ public sealed class Bbi : AbstractBase
return new TSeries(t, v);
}
-
- ///
public override void Prime(ReadOnlySpan source, TimeSpan? step = null)
{
for (int i = 0; i < source.Length; i++)
@@ -236,8 +230,6 @@ public sealed class Bbi : AbstractBase
Update(new TValue(DateTime.UtcNow, source[i]), isNew: true);
}
}
-
- ///
public override void Reset()
{
Array.Clear(_buf1);
diff --git a/lib/oscillators/cfo/Cfo.cs b/lib/oscillators/cfo/Cfo.cs
index 5c2d8ef1..943a191c 100644
--- a/lib/oscillators/cfo/Cfo.cs
+++ b/lib/oscillators/cfo/Cfo.cs
@@ -81,8 +81,6 @@ public sealed class Cfo : AbstractBase
/// Period of the indicator.
///
public int Period => _period;
-
- ///
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public override TValue Update(TValue input, bool isNew = true)
{
@@ -153,8 +151,6 @@ public sealed class Cfo : AbstractBase
PubEvent(Last, isNew);
return Last;
}
-
- ///
public override TSeries Update(TSeries source)
{
int len = source.Count;
@@ -191,8 +187,6 @@ public sealed class Cfo : AbstractBase
_state.SumXY += i * v;
}
}
-
- ///
public override void Prime(ReadOnlySpan source, TimeSpan? step = null)
{
for (int i = 0; i < source.Length; i++)
@@ -200,8 +194,6 @@ public sealed class Cfo : AbstractBase
Update(new TValue(DateTime.UtcNow, source[i]), isNew: true);
}
}
-
- ///
public override void Reset()
{
_buffer.Clear();
diff --git a/lib/oscillators/crsi/Crsi.cs b/lib/oscillators/crsi/Crsi.cs
index 7072e00e..9ac79ead 100644
--- a/lib/oscillators/crsi/Crsi.cs
+++ b/lib/oscillators/crsi/Crsi.cs
@@ -118,8 +118,6 @@ public sealed class Crsi : AbstractBase
/// Percent rank lookback period.
///
public int RankPeriod => _rankPeriod;
-
- ///
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public override TValue Update(TValue input, bool isNew = true)
{
@@ -224,8 +222,6 @@ public sealed class Crsi : AbstractBase
PubEvent(Last, isNew);
return Last;
}
-
- ///
public override TSeries Update(TSeries source)
{
int len = source.Count;
@@ -250,8 +246,6 @@ public sealed class Crsi : AbstractBase
Last = new TValue(tSpan[len - 1], vSpan[len - 1]);
return new TSeries(t, v);
}
-
- ///
public override void Prime(ReadOnlySpan source, TimeSpan? step = null)
{
for (int i = 0; i < source.Length; i++)
@@ -259,8 +253,6 @@ public sealed class Crsi : AbstractBase
Update(new TValue(DateTime.UtcNow, source[i]), isNew: true);
}
}
-
- ///
public override void Reset()
{
_priceRsi.Reset();
diff --git a/lib/oscillators/cti/Cti.cs b/lib/oscillators/cti/Cti.cs
index 7fb37890..97e61692 100644
--- a/lib/oscillators/cti/Cti.cs
+++ b/lib/oscillators/cti/Cti.cs
@@ -77,14 +77,10 @@ public sealed class Cti : AbstractBase
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private void Handle(object? sender, in TValueEventArgs e) => Update(e.Value, e.IsNew);
-
- ///
public override bool IsHot => _buffer.IsFull;
/// Period of the indicator.
public int Period => _period;
-
- ///
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public override TValue Update(TValue input, bool isNew = true)
{
@@ -151,8 +147,6 @@ public sealed class Cti : AbstractBase
PubEvent(Last, isNew);
return Last;
}
-
- ///
public override TSeries Update(TSeries source)
{
int len = source.Count;
@@ -207,8 +201,6 @@ public sealed class Cti : AbstractBase
_s.SumXY = Math.FusedMultiplyAdd(i, v, _s.SumXY);
}
}
-
- ///
public override void Prime(ReadOnlySpan source, TimeSpan? step = null)
{
for (int i = 0; i < source.Length; i++)
@@ -216,8 +208,6 @@ public sealed class Cti : AbstractBase
Update(new TValue(DateTime.UtcNow, source[i]), isNew: true);
}
}
-
- ///
public override void Reset()
{
_buffer.Clear();
diff --git a/lib/oscillators/dem/Dem.cs b/lib/oscillators/dem/Dem.cs
index 72719209..1aab42f6 100644
--- a/lib/oscillators/dem/Dem.cs
+++ b/lib/oscillators/dem/Dem.cs
@@ -278,7 +278,6 @@ public sealed class Dem : ITValuePublisher
double prevHigh = double.NaN;
double prevLow = double.NaN;
int idx = 0;
- int count = 0;
for (int i = 0; i < len; i++)
{
@@ -302,7 +301,6 @@ public sealed class Dem : ITValuePublisher
deMinSum += deMin;
idx = (idx + 1) % period;
- count++;
prevHigh = h;
prevLow = l;
diff --git a/lib/oscillators/dosc/Dosc.cs b/lib/oscillators/dosc/Dosc.cs
index 4c5cb561..d4eb3baa 100644
--- a/lib/oscillators/dosc/Dosc.cs
+++ b/lib/oscillators/dosc/Dosc.cs
@@ -143,11 +143,7 @@ public sealed class Dosc : AbstractBase
}
source.Pub += Handle;
}
-
- ///
public override bool IsHot => _s.Count >= WarmupPeriod;
-
- ///
public override void Prime(ReadOnlySpan source, TimeSpan? step = null)
{
if (source.Length == 0)
@@ -195,8 +191,6 @@ public sealed class Dosc : AbstractBase
}
return s.LastValidSrc;
}
-
- ///
[MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)]
public override TValue Update(TValue input, bool isNew = true)
{
@@ -226,8 +220,6 @@ public sealed class Dosc : AbstractBase
PubEvent(Last, isNew);
return Last;
}
-
- ///
[MethodImpl(MethodImplOptions.AggressiveOptimization)]
public override TSeries Update(TSeries source)
{
@@ -428,8 +420,6 @@ public sealed class Dosc : AbstractBase
TSeries results = indicator.Update(source);
return (results, indicator);
}
-
- ///
public override void Reset()
{
_s = State.New();
diff --git a/lib/oscillators/dpo/Dpo.cs b/lib/oscillators/dpo/Dpo.cs
index 14464fd8..eb83140c 100644
--- a/lib/oscillators/dpo/Dpo.cs
+++ b/lib/oscillators/dpo/Dpo.cs
@@ -78,8 +78,6 @@ public sealed class Dpo : AbstractBase
/// Displacement of the SMA lookback.
///
public int Displacement => _displacement;
-
- ///
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public override TValue Update(TValue input, bool isNew = true)
{
@@ -141,8 +139,6 @@ public sealed class Dpo : AbstractBase
PubEvent(Last, isNew);
return Last;
}
-
- ///
public override TSeries Update(TSeries source)
{
int len = source.Count;
@@ -164,8 +160,6 @@ public sealed class Dpo : AbstractBase
return new TSeries(t, v);
}
-
- ///
public override void Prime(ReadOnlySpan source, TimeSpan? step = null)
{
for (int i = 0; i < source.Length; i++)
@@ -173,8 +167,6 @@ public sealed class Dpo : AbstractBase
Update(new TValue(DateTime.UtcNow, source[i]), isNew: true);
}
}
-
- ///
public override void Reset()
{
_smaBuffer.Clear();
diff --git a/lib/oscillators/dymoi/Dymoi.cs b/lib/oscillators/dymoi/Dymoi.cs
index 84df96d4..60e81ae3 100644
--- a/lib/oscillators/dymoi/Dymoi.cs
+++ b/lib/oscillators/dymoi/Dymoi.cs
@@ -143,8 +143,6 @@ public sealed class Dymoi : AbstractBase
/// Maximum allowable dynamic period.
public int MaxPeriod => _maxPeriod;
-
- ///
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public override TValue Update(TValue input, bool isNew = true)
{
@@ -276,8 +274,6 @@ public sealed class Dymoi : AbstractBase
PubEvent(Last, isNew);
return Last;
}
-
- ///
public override TSeries Update(TSeries source)
{
int len = source.Count;
@@ -302,8 +298,6 @@ public sealed class Dymoi : AbstractBase
Last = new TValue(tSpan[len - 1], vSpan[len - 1]);
return new TSeries(t, v);
}
-
- ///
public override void Prime(ReadOnlySpan source, TimeSpan? step = null)
{
for (int i = 0; i < source.Length; i++)
@@ -311,8 +305,6 @@ public sealed class Dymoi : AbstractBase
Update(new TValue(DateTime.UtcNow, source[i]), isNew: true);
}
}
-
- ///
public override void Reset()
{
_s = new State(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.0, true, double.NaN, double.NaN);
diff --git a/lib/oscillators/er/Er.cs b/lib/oscillators/er/Er.cs
index 2e7ac00f..00ce5657 100644
--- a/lib/oscillators/er/Er.cs
+++ b/lib/oscillators/er/Er.cs
@@ -73,8 +73,6 @@ public sealed class Er : AbstractBase
/// Period of the indicator.
///
public int Period => _period;
-
- ///
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public override TValue Update(TValue input, bool isNew = true)
{
@@ -141,8 +139,6 @@ public sealed class Er : AbstractBase
PubEvent(Last, isNew);
return Last;
}
-
- ///
public override TSeries Update(TSeries source)
{
int len = source.Count;
@@ -164,8 +160,6 @@ public sealed class Er : AbstractBase
return new TSeries(t, v);
}
-
- ///
public override void Prime(ReadOnlySpan source, TimeSpan? step = null)
{
TimeSpan interval = step ?? TimeSpan.FromTicks(1);
@@ -175,8 +169,6 @@ public sealed class Er : AbstractBase
Update(new TValue(baseTime + (interval * i), source[i]), isNew: true);
}
}
-
- ///
public override void Reset()
{
_closeBuf.Clear();
diff --git a/lib/oscillators/fisher/Fisher.cs b/lib/oscillators/fisher/Fisher.cs
index 714bdc88..7e08668d 100644
--- a/lib/oscillators/fisher/Fisher.cs
+++ b/lib/oscillators/fisher/Fisher.cs
@@ -90,8 +90,6 @@ public sealed class Fisher : AbstractBase
/// Current Signal line value.
///
public double Signal => _state.Signal;
-
- ///
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public override TValue Update(TValue input, bool isNew = true)
{
@@ -172,8 +170,6 @@ public sealed class Fisher : AbstractBase
PubEvent(Last, isNew);
return Last;
}
-
- ///
public override TSeries Update(TSeries source)
{
int len = source.Count;
@@ -195,8 +191,6 @@ public sealed class Fisher : AbstractBase
return new TSeries(t, v);
}
-
- ///
public override void Prime(ReadOnlySpan source, TimeSpan? step = null)
{
TimeSpan interval = step ?? TimeSpan.FromTicks(1);
@@ -206,8 +200,6 @@ public sealed class Fisher : AbstractBase
Update(new TValue(baseTime + (interval * i), source[i]), isNew: true);
}
}
-
- ///
public override void Reset()
{
_buffer.Clear();
diff --git a/lib/oscillators/fisher04/Fisher04.cs b/lib/oscillators/fisher04/Fisher04.cs
index 3a941c81..e9e08ae7 100644
--- a/lib/oscillators/fisher04/Fisher04.cs
+++ b/lib/oscillators/fisher04/Fisher04.cs
@@ -88,8 +88,6 @@ public sealed class Fisher04 : AbstractBase
/// Current Signal line value.
///
public double Signal => _state.Signal;
-
- ///
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public override TValue Update(TValue input, bool isNew = true)
{
@@ -168,8 +166,6 @@ public sealed class Fisher04 : AbstractBase
PubEvent(Last, isNew);
return Last;
}
-
- ///
public override TSeries Update(TSeries source)
{
int len = source.Count;
@@ -191,8 +187,6 @@ public sealed class Fisher04 : AbstractBase
return new TSeries(t, v);
}
-
- ///
public override void Prime(ReadOnlySpan source, TimeSpan? step = null)
{
TimeSpan interval = step ?? TimeSpan.FromTicks(1);
@@ -202,8 +196,6 @@ public sealed class Fisher04 : AbstractBase
Update(new TValue(baseTime + (interval * i), source[i]), isNew: true);
}
}
-
- ///
public override void Reset()
{
_buffer.Clear();
diff --git a/lib/oscillators/gator/Gator.cs b/lib/oscillators/gator/Gator.cs
index 3b818158..1ee7383b 100644
--- a/lib/oscillators/gator/Gator.cs
+++ b/lib/oscillators/gator/Gator.cs
@@ -230,8 +230,6 @@ public sealed class Gator : AbstractBase
PubEvent(Last, isNew);
return Last;
}
-
- ///
public override TSeries Update(TSeries source)
{
if (source.Count == 0)
@@ -257,8 +255,6 @@ public sealed class Gator : AbstractBase
Last = new TValue(tSpan[len - 1], vSpan[len - 1]);
return new TSeries(t, v);
}
-
- ///
public override void Prime(ReadOnlySpan source, TimeSpan? step = null)
{
if (source.Length == 0)
@@ -555,8 +551,6 @@ public sealed class Gator : AbstractBase
}
}
}
-
- ///
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public override void Reset()
{
diff --git a/lib/oscillators/inertia/Inertia.cs b/lib/oscillators/inertia/Inertia.cs
index 8f41d172..f43602e6 100644
--- a/lib/oscillators/inertia/Inertia.cs
+++ b/lib/oscillators/inertia/Inertia.cs
@@ -83,8 +83,6 @@ public sealed class Inertia : AbstractBase
/// Period of the indicator.
///
public int Period => _period;
-
- ///
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public override TValue Update(TValue input, bool isNew = true)
{
@@ -155,8 +153,6 @@ public sealed class Inertia : AbstractBase
PubEvent(Last, isNew);
return Last;
}
-
- ///
public override TSeries Update(TSeries source)
{
int len = source.Count;
@@ -193,8 +189,6 @@ public sealed class Inertia : AbstractBase
_state.SumXY += i * v;
}
}
-
- ///
public override void Prime(ReadOnlySpan source, TimeSpan? step = null)
{
for (int i = 0; i < source.Length; i++)
@@ -202,8 +196,6 @@ public sealed class Inertia : AbstractBase
Update(new TValue(DateTime.UtcNow, source[i]), isNew: true);
}
}
-
- ///
public override void Reset()
{
_buffer.Clear();
diff --git a/lib/oscillators/kri/Kri.cs b/lib/oscillators/kri/Kri.cs
index 0962bcd8..1a1ef261 100644
--- a/lib/oscillators/kri/Kri.cs
+++ b/lib/oscillators/kri/Kri.cs
@@ -59,14 +59,10 @@ public sealed class Kri : AbstractBase
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private void Handle(object? sender, in TValueEventArgs e) => Update(e.Value, e.IsNew);
-
- ///
public override bool IsHot => _buffer.IsFull;
/// Period of the indicator.
public int Period => _period;
-
- ///
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public override TValue Update(TValue input, bool isNew = true)
{
@@ -120,8 +116,6 @@ public sealed class Kri : AbstractBase
PubEvent(Last, isNew);
return Last;
}
-
- ///
public override TSeries Update(TSeries source)
{
int len = source.Count;
@@ -140,8 +134,6 @@ public sealed class Kri : AbstractBase
return new TSeries(t, v);
}
-
- ///
public override void Prime(ReadOnlySpan source, TimeSpan? step = null)
{
TimeSpan interval = step ?? TimeSpan.FromTicks(1);
@@ -151,8 +143,6 @@ public sealed class Kri : AbstractBase
Update(new TValue(baseTime + (interval * i), source[i]), isNew: true);
}
}
-
- ///
public override void Reset()
{
_buffer.Clear();
diff --git a/lib/oscillators/psl/Psl.cs b/lib/oscillators/psl/Psl.cs
index f8007061..d8fa2c30 100644
--- a/lib/oscillators/psl/Psl.cs
+++ b/lib/oscillators/psl/Psl.cs
@@ -62,14 +62,10 @@ public sealed class Psl : AbstractBase
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private void Handle(object? sender, in TValueEventArgs e) => Update(e.Value, e.IsNew);
-
- ///
public override bool IsHot => _buffer.IsFull;
/// Period of the indicator.
public int Period => _period;
-
- ///
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public override TValue Update(TValue input, bool isNew = true)
{
@@ -126,8 +122,6 @@ public sealed class Psl : AbstractBase
PubEvent(Last, isNew);
return Last;
}
-
- ///
public override TSeries Update(TSeries source)
{
int len = source.Count;
@@ -146,8 +140,6 @@ public sealed class Psl : AbstractBase
return new TSeries(t, v);
}
-
- ///
public override void Prime(ReadOnlySpan source, TimeSpan? step = null)
{
TimeSpan interval = step ?? TimeSpan.FromTicks(1);
@@ -157,8 +149,6 @@ public sealed class Psl : AbstractBase
Update(new TValue(baseTime + (interval * i), source[i]), isNew: true);
}
}
-
- ///
public override void Reset()
{
_buffer.Clear();
diff --git a/lib/oscillators/reflex/Reflex.cs b/lib/oscillators/reflex/Reflex.cs
index 1f90ace0..bdeab1e1 100644
--- a/lib/oscillators/reflex/Reflex.cs
+++ b/lib/oscillators/reflex/Reflex.cs
@@ -108,11 +108,7 @@ public sealed class Reflex : AbstractBase
}
source.Pub += Handle;
}
-
- ///
public override bool IsHot => _s.Count >= _period;
-
- ///
public override void Prime(ReadOnlySpan source, TimeSpan? step = null)
{
if (source.Length == 0)
@@ -160,8 +156,6 @@ public sealed class Reflex : AbstractBase
}
return s.LastValid;
}
-
- ///
[MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)]
public override TValue Update(TValue input, bool isNew = true)
{
@@ -183,8 +177,6 @@ public sealed class Reflex : AbstractBase
PubEvent(Last, isNew);
return Last;
}
-
- ///
[MethodImpl(MethodImplOptions.AggressiveOptimization)]
public override TSeries Update(TSeries source)
{
@@ -396,8 +388,6 @@ public sealed class Reflex : AbstractBase
TSeries results = indicator.Update(source);
return (results, indicator);
}
-
- ///
public override void Reset()
{
_s = State.New();
diff --git a/lib/oscillators/reverseema/ReverseEma.cs b/lib/oscillators/reverseema/ReverseEma.cs
index 6e041283..5eafc03e 100644
--- a/lib/oscillators/reverseema/ReverseEma.cs
+++ b/lib/oscillators/reverseema/ReverseEma.cs
@@ -122,11 +122,7 @@ public sealed class ReverseEma : AbstractBase
}
source.Pub += Handle;
}
-
- ///
public override bool IsHot => _s.IsHot;
-
- ///
public override void Prime(ReadOnlySpan source, TimeSpan? step = null)
{
if (source.Length == 0)
@@ -185,8 +181,6 @@ public sealed class ReverseEma : AbstractBase
}
return _lastValidValue;
}
-
- ///
[MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)]
public override TValue Update(TValue input, bool isNew = true)
{
@@ -213,8 +207,6 @@ public sealed class ReverseEma : AbstractBase
PubEvent(Last, isNew);
return Last;
}
-
- ///
[MethodImpl(MethodImplOptions.AggressiveOptimization)]
public override TSeries Update(TSeries source)
{
@@ -415,8 +407,6 @@ public sealed class ReverseEma : AbstractBase
TSeries results = indicator.Update(source);
return (results, indicator);
}
-
- ///
public override void Reset()
{
_s = State.New();
diff --git a/lib/oscillators/trendflex/Trendflex.cs b/lib/oscillators/trendflex/Trendflex.cs
index 4e79da9d..dc8b0e1c 100644
--- a/lib/oscillators/trendflex/Trendflex.cs
+++ b/lib/oscillators/trendflex/Trendflex.cs
@@ -99,11 +99,7 @@ public sealed class Trendflex : AbstractBase
}
source.Pub += Handle;
}
-
- ///
public override bool IsHot => _s.Count >= _period;
-
- ///
public override void Prime(ReadOnlySpan source, TimeSpan? step = null)
{
if (source.Length == 0)
@@ -148,8 +144,6 @@ public sealed class Trendflex : AbstractBase
}
return s.LastValid;
}
-
- ///
[MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)]
public override TValue Update(TValue input, bool isNew = true)
{
@@ -171,8 +165,6 @@ public sealed class Trendflex : AbstractBase
PubEvent(Last, isNew);
return Last;
}
-
- ///
[MethodImpl(MethodImplOptions.AggressiveOptimization)]
public override TSeries Update(TSeries source)
{
@@ -337,8 +329,6 @@ public sealed class Trendflex : AbstractBase
TSeries results = indicator.Update(source);
return (results, indicator);
}
-
- ///
public override void Reset()
{
_s = State.New();
diff --git a/lib/oscillators/trix/Trix.cs b/lib/oscillators/trix/Trix.cs
index 2c77cc9f..a69245a7 100644
--- a/lib/oscillators/trix/Trix.cs
+++ b/lib/oscillators/trix/Trix.cs
@@ -96,8 +96,6 @@ public sealed class Trix : AbstractBase
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private void Handle(object? sender, in TValueEventArgs e) => Update(e.Value, e.IsNew);
-
- ///
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public override TValue Update(TValue input, bool isNew = true)
{
@@ -198,8 +196,6 @@ public sealed class Trix : AbstractBase
PubEvent(Last, isNew);
return Last;
}
-
- ///
public override TSeries Update(TSeries source)
{
int len = source.Count;
@@ -223,8 +219,6 @@ public sealed class Trix : AbstractBase
return new TSeries(t, v);
}
-
- ///
public override void Prime(ReadOnlySpan source, TimeSpan? step = null)
{
for (int i = 0; i < source.Length; i++)
@@ -232,8 +226,6 @@ public sealed class Trix : AbstractBase
Update(new TValue(DateTime.UtcNow, source[i]), isNew: true);
}
}
-
- ///
public override void Reset()
{
_s = new State(0, 0, 0, 1.0, 1.0, 1.0, 0, 0, 0);
diff --git a/lib/statistics/cointegration/Cointegration.cs b/lib/statistics/cointegration/Cointegration.cs
index e6a0d69b..4b4d9f1c 100644
--- a/lib/statistics/cointegration/Cointegration.cs
+++ b/lib/statistics/cointegration/Cointegration.cs
@@ -114,15 +114,11 @@ public sealed class Cointegration : AbstractBase
{
return Update(new TValue(DateTime.MinValue, seriesA), new TValue(DateTime.MinValue, seriesB), isNew);
}
-
- ///
/// Not supported for bi-input indicator. Use Update(seriesA, seriesB) instead.
public override TValue Update(TValue input, bool isNew = true)
{
throw new NotSupportedException("Cointegration requires two inputs (seriesA and seriesB). Use Update(seriesA, seriesB).");
}
-
- ///
/// Not supported for bi-input indicator. Use Calculate(seriesA, seriesB, period) instead.
public override TSeries Update(TSeries source)
{
@@ -402,8 +398,6 @@ public sealed class Cointegration : AbstractBase
_sumDelta2 = FusedMultiplyAdd(delta, delta, _sumDelta2);
}
}
-
- ///
public override void Prime(ReadOnlySpan source, TimeSpan? step = null)
{
throw new NotSupportedException("Cointegration requires two inputs.");
diff --git a/lib/statistics/correlation/Correlation.cs b/lib/statistics/correlation/Correlation.cs
index 2212e521..6896d29a 100644
--- a/lib/statistics/correlation/Correlation.cs
+++ b/lib/statistics/correlation/Correlation.cs
@@ -113,15 +113,11 @@ public sealed class Correlation : AbstractBase
{
return Update(new TValue(DateTime.MinValue, seriesX), new TValue(DateTime.MinValue, seriesY), isNew);
}
-
- ///
/// Not supported for bi-input indicator. Use Update(seriesX, seriesY) instead.
public override TValue Update(TValue input, bool isNew = true)
{
throw new NotSupportedException("Correlation requires two inputs (seriesX and seriesY). Use Update(seriesX, seriesY).");
}
-
- ///
/// Not supported for bi-input indicator. Use Calculate(seriesX, seriesY, period) instead.
public override TSeries Update(TSeries source)
{
@@ -263,8 +259,6 @@ public sealed class Correlation : AbstractBase
_sumXY = FusedMultiplyAdd(x, y, _sumXY);
}
}
-
- ///
public override void Prime(ReadOnlySpan source, TimeSpan? step = null)
{
throw new NotSupportedException("Correlation requires two inputs.");
diff --git a/lib/statistics/granger/Granger.cs b/lib/statistics/granger/Granger.cs
index f68fb180..f1530f53 100644
--- a/lib/statistics/granger/Granger.cs
+++ b/lib/statistics/granger/Granger.cs
@@ -108,15 +108,11 @@ public sealed class Granger : AbstractBase
{
return Update(new TValue(DateTime.UtcNow, seriesY), new TValue(DateTime.UtcNow, seriesX), isNew);
}
-
- ///
/// Not supported for dual-input indicator. Use Update(seriesY, seriesX) instead.
public override TValue Update(TValue input, bool isNew = true)
{
throw new NotSupportedException("Granger requires two inputs (seriesY and seriesX). Use Update(seriesY, seriesX).");
}
-
- ///
/// Not supported for dual-input indicator. Use Batch(seriesY, seriesX, period) instead.
public override TSeries Update(TSeries source)
{
@@ -370,8 +366,6 @@ public sealed class Granger : AbstractBase
_sumYLagXLag = FusedMultiplyAdd(yLag, xLag, _sumYLagXLag);
}
}
-
- ///
public override void Prime(ReadOnlySpan source, TimeSpan? step = null)
{
throw new NotSupportedException("Granger requires two inputs.");
diff --git a/lib/statistics/kendall/Kendall.cs b/lib/statistics/kendall/Kendall.cs
index d656f7fb..3e3ee825 100644
--- a/lib/statistics/kendall/Kendall.cs
+++ b/lib/statistics/kendall/Kendall.cs
@@ -93,15 +93,11 @@ public sealed class Kendall : AbstractBase
{
return Update(new TValue(DateTime.UtcNow, seriesX), new TValue(DateTime.UtcNow, seriesY), isNew);
}
-
- ///
/// Not supported for dual-input indicator. Use Update(seriesX, seriesY) instead.
public override TValue Update(TValue input, bool isNew = true)
{
throw new NotSupportedException("Kendall requires two inputs (seriesX and seriesY). Use Update(seriesX, seriesY).");
}
-
- ///
/// Not supported for dual-input indicator. Use Batch(seriesX, seriesY, period) instead.
public override TSeries Update(TSeries source)
{
@@ -173,8 +169,6 @@ public sealed class Kendall : AbstractBase
return (concordant - discordant) / denominator;
}
-
- ///
public override void Prime(ReadOnlySpan source, TimeSpan? step = null)
{
throw new NotSupportedException("Kendall requires two inputs.");
diff --git a/lib/statistics/pacf/Pacf.cs b/lib/statistics/pacf/Pacf.cs
index 8073ffe6..678fb54b 100644
--- a/lib/statistics/pacf/Pacf.cs
+++ b/lib/statistics/pacf/Pacf.cs
@@ -279,7 +279,7 @@ public sealed class Pacf : AbstractBase
_sum = 0;
for (int i = 0; i < _buffer.Count; i++)
{
- _sum += _buffer[i];
+ _sum += _buffer[i];
}
}
diff --git a/lib/statistics/spearman/Spearman.cs b/lib/statistics/spearman/Spearman.cs
index 08316420..87716d2b 100644
--- a/lib/statistics/spearman/Spearman.cs
+++ b/lib/statistics/spearman/Spearman.cs
@@ -98,15 +98,11 @@ public sealed class Spearman : AbstractBase
{
return Update(new TValue(DateTime.UtcNow, seriesX), new TValue(DateTime.UtcNow, seriesY), isNew);
}
-
- ///
/// Not supported for dual-input indicator. Use Update(seriesX, seriesY) instead.
public override TValue Update(TValue input, bool isNew = true)
{
throw new NotSupportedException("Spearman requires two inputs (seriesX and seriesY). Use Update(seriesX, seriesY).");
}
-
- ///
/// Not supported for dual-input indicator. Use Batch(seriesX, seriesY, period) instead.
public override TSeries Update(TSeries source)
{
@@ -236,8 +232,6 @@ public sealed class Spearman : AbstractBase
ranks[i] = countSmaller + (countEqual - 1) * 0.5 + 1.0;
}
}
-
- ///
public override void Prime(ReadOnlySpan source, TimeSpan? step = null)
{
throw new NotSupportedException("Spearman requires two inputs.");
diff --git a/lib/trends_FIR/alma/Alma.cs b/lib/trends_FIR/alma/Alma.cs
index 8ea14141..d2d263b8 100644
--- a/lib/trends_FIR/alma/Alma.cs
+++ b/lib/trends_FIR/alma/Alma.cs
@@ -31,7 +31,7 @@ public sealed class Alma : AbstractBase
[StructLayout(LayoutKind.Auto)]
private record struct State(double LastValidValue, bool IsInitialized);
private State _state;
- private State _p_state;
+ private State _pState;
public bool IsNew => _isNew;
public override bool IsHot => _buffer.IsFull;
@@ -139,11 +139,11 @@ public sealed class Alma : AbstractBase
{
if (isNew)
{
- _p_state = _state;
+ _pState = _state;
}
else
{
- _state = _p_state;
+ _state = _pState;
}
if (double.IsFinite(input.Value))
@@ -213,7 +213,7 @@ public sealed class Alma : AbstractBase
// Reset state
_buffer.Clear();
_state = default;
- _p_state = default;
+ _pState = default;
int warmupLength = Math.Min(source.Length, WarmupPeriod);
int startIndex = source.Length - warmupLength;
@@ -254,7 +254,7 @@ public sealed class Alma : AbstractBase
Update(new TValue(DateTime.MinValue, source[i]), isNew: true, publish: false);
}
- _p_state = _state;
+ _pState = _state;
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
@@ -449,7 +449,7 @@ public sealed class Alma : AbstractBase
{
_buffer.Clear();
_state = new State(double.NaN, IsInitialized: false);
- _p_state = _state;
+ _pState = _state;
Last = default;
}
-}
\ No newline at end of file
+}
diff --git a/lib/trends_FIR/nlma/Nlma.cs b/lib/trends_FIR/nlma/Nlma.cs
index bd31992d..6ad1ad77 100644
--- a/lib/trends_FIR/nlma/Nlma.cs
+++ b/lib/trends_FIR/nlma/Nlma.cs
@@ -90,8 +90,6 @@ public sealed class Nlma : AbstractBase
_isNew = isNew;
return UpdateCore(input, isNew, publish: true);
}
-
- ///
public override TSeries Update(TSeries source)
{
if (source.Count == 0)
@@ -326,8 +324,6 @@ public sealed class Nlma : AbstractBase
}
// ── Prime / Batch / Calculate ──────────────────────────────────────
-
- ///
public override void Prime(ReadOnlySpan source, TimeSpan? step = null)
{
foreach (var value in source)
@@ -489,8 +485,6 @@ public sealed class Nlma : AbstractBase
}
// ── Reset / Dispose ────────────────────────────────────────────────
-
- ///
public override void Reset()
{
_buffer.Clear();
@@ -498,8 +492,6 @@ public sealed class Nlma : AbstractBase
_p_lastValidValue = double.NaN;
Last = default;
}
-
- ///
protected override void Dispose(bool disposing)
{
if (!_disposed)
diff --git a/lib/trends_FIR/wma/Wma.Coverage.Tests.cs b/lib/trends_FIR/wma/Wma.Coverage.Tests.cs
index 465cad16..3bdcab93 100644
--- a/lib/trends_FIR/wma/Wma.Coverage.Tests.cs
+++ b/lib/trends_FIR/wma/Wma.Coverage.Tests.cs
@@ -1,9 +1,10 @@
using System.Reflection;
using System.Runtime.Intrinsics.X86;
+using Xunit.Abstractions;
namespace QuanTAlib.Tests;
-public class WmaCoverageTests
+public class WmaCoverageTests(ITestOutputHelper output)
{
[Fact]
public void Cover_Scalar_Fallback_SmallData()
@@ -41,7 +42,7 @@ public class WmaCoverageTests
source[i] = i;
}
- double[] output = new double[len];
+ double[] result = new double[len];
// Use reflection to invoke private static CalculateSimdCore
var method = typeof(Wma).GetMethod("CalculateSimdCore", BindingFlags.NonPublic | BindingFlags.Static);
@@ -73,12 +74,12 @@ public class WmaCoverageTests
// Maybe I can use `MethodInfo.CreateDelegate`?
// Delegates can take Spans if defined correctly.
- InvokePrivateStaticMethod_WithSpans("CalculateSimdCore", source, output, period);
+ InvokePrivateStaticMethod_WithSpans("CalculateSimdCore", source, result, period);
}
catch (Exception ex)
{
// If reflection fails, we can't cover it.
- Console.WriteLine($"Could not invoke AVX2 core: {ex.Message}");
+ output.WriteLine($"Could not invoke AVX2 core: {ex.Message}");
}
}
diff --git a/lib/trends_IIR/rema/Rema.cs b/lib/trends_IIR/rema/Rema.cs
index 1b867ee5..2dc2c038 100644
--- a/lib/trends_IIR/rema/Rema.cs
+++ b/lib/trends_IIR/rema/Rema.cs
@@ -87,13 +87,9 @@ public sealed class Rema : AbstractBase
}
source.Pub += Handle;
}
-
- ///
public override bool IsHot => _state.IsHot;
private const int StackAllocThreshold = 512;
-
- ///
public override void Prime(ReadOnlySpan source, TimeSpan? step = null)
{
if (source.Length == 0)
@@ -162,8 +158,6 @@ public sealed class Rema : AbstractBase
}
return _lastValidValue;
}
-
- ///
[MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)]
public override TValue Update(TValue input, bool isNew = true)
{
@@ -184,8 +178,6 @@ public sealed class Rema : AbstractBase
PubEvent(Last, isNew);
return Last;
}
-
- ///
[MethodImpl(MethodImplOptions.AggressiveOptimization)]
public override TSeries Update(TSeries source)
{
@@ -450,8 +442,6 @@ public sealed class Rema : AbstractBase
TSeries results = rema.Update(source);
return (results, rema);
}
-
- ///
public override void Reset()
{
_state = State.New();
diff --git a/lib/trends_IIR/rgma/Rgma.cs b/lib/trends_IIR/rgma/Rgma.cs
index 1efcf74a..84686bd1 100644
--- a/lib/trends_IIR/rgma/Rgma.cs
+++ b/lib/trends_IIR/rgma/Rgma.cs
@@ -47,8 +47,6 @@ public sealed class Rgma : AbstractBase
private const double COVERAGE_THRESHOLD = 0.05;
private const int ResyncInterval = 10000;
private const int StackAllocThreshold = 512;
-
- ///
public override bool IsHot => _state.IsHot;
///
@@ -112,8 +110,6 @@ public sealed class Rgma : AbstractBase
}
return _lastValidValue;
}
-
- ///
public override void Prime(ReadOnlySpan source, TimeSpan? step = null)
{
if (source.Length == 0)
@@ -190,8 +186,6 @@ public sealed class Rgma : AbstractBase
}
}
}
-
- ///
[MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)]
public override TValue Update(TValue input, bool isNew = true)
{
@@ -234,8 +228,6 @@ public sealed class Rgma : AbstractBase
PubEvent(Last, isNew);
return Last;
}
-
- ///
[MethodImpl(MethodImplOptions.AggressiveOptimization)]
public override TSeries Update(TSeries source)
{
@@ -463,8 +455,6 @@ public sealed class Rgma : AbstractBase
TSeries results = rgma.Update(source);
return (results, rgma);
}
-
- ///
public override void Reset()
{
_state = State.New();
@@ -475,8 +465,6 @@ public sealed class Rgma : AbstractBase
Array.Fill(_p_filters, double.NaN);
Last = default;
}
-
- ///
protected override void Dispose(bool disposing)
{
if (!_disposed)
diff --git a/lib/volatility/bbw/Bbw.cs b/lib/volatility/bbw/Bbw.cs
index 4d56ec30..557ac5ef 100644
--- a/lib/volatility/bbw/Bbw.cs
+++ b/lib/volatility/bbw/Bbw.cs
@@ -95,8 +95,6 @@ public sealed class Bbw : AbstractBase
/// Standard deviation multiplier.
///
public double Multiplier => _multiplier;
-
- ///
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public override TValue Update(TValue input, bool isNew = true)
{
@@ -159,8 +157,6 @@ public sealed class Bbw : AbstractBase
PubEvent(Last, isNew);
return Last;
}
-
- ///
public override TSeries Update(TSeries source)
{
int len = source.Count;
@@ -196,8 +192,6 @@ public sealed class Bbw : AbstractBase
_state.SumSq += v * v;
}
}
-
- ///
public override void Prime(ReadOnlySpan source, TimeSpan? step = null)
{
for (int i = 0; i < source.Length; i++)
@@ -205,8 +199,6 @@ public sealed class Bbw : AbstractBase
Update(new TValue(DateTime.UtcNow, source[i]), isNew: true);
}
}
-
- ///
public override void Reset()
{
_buffer.Clear();
diff --git a/lib/volatility/bbwn/Bbwn.cs b/lib/volatility/bbwn/Bbwn.cs
index 7609d60b..47e9ed48 100644
--- a/lib/volatility/bbwn/Bbwn.cs
+++ b/lib/volatility/bbwn/Bbwn.cs
@@ -107,8 +107,6 @@ public sealed class Bbwn : AbstractBase
/// Historical lookback period for normalization.
///
public int Lookback => _lookback;
-
- ///
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public override TValue Update(TValue input, bool isNew = true)
{
@@ -212,8 +210,6 @@ public sealed class Bbwn : AbstractBase
PubEvent(Last, isNew);
return Last;
}
-
- ///
public override TSeries Update(TSeries source)
{
int len = source.Count;
@@ -249,8 +245,6 @@ public sealed class Bbwn : AbstractBase
_state.SumSq += v * v;
}
}
-
- ///
public override void Prime(ReadOnlySpan source, TimeSpan? step = null)
{
for (int i = 0; i < source.Length; i++)
@@ -258,8 +252,6 @@ public sealed class Bbwn : AbstractBase
Update(new TValue(DateTime.UtcNow, source[i]), isNew: true);
}
}
-
- ///
public override void Reset()
{
_buffer.Clear();
diff --git a/lib/volatility/bbwp/Bbwp.cs b/lib/volatility/bbwp/Bbwp.cs
index a5088607..ec2a973a 100644
--- a/lib/volatility/bbwp/Bbwp.cs
+++ b/lib/volatility/bbwp/Bbwp.cs
@@ -108,8 +108,6 @@ public sealed class Bbwp : AbstractBase
/// Historical lookback period for percentile calculation.
///
public int Lookback => _lookback;
-
- ///
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public override TValue Update(TValue input, bool isNew = true)
{
@@ -205,8 +203,6 @@ public sealed class Bbwp : AbstractBase
PubEvent(Last, isNew);
return Last;
}
-
- ///
public override TSeries Update(TSeries source)
{
int len = source.Count;
@@ -242,8 +238,6 @@ public sealed class Bbwp : AbstractBase
_state.SumSq += v * v;
}
}
-
- ///
public override void Prime(ReadOnlySpan source, TimeSpan? step = null)
{
for (int i = 0; i < source.Length; i++)
@@ -251,8 +245,6 @@ public sealed class Bbwp : AbstractBase
Update(new TValue(DateTime.UtcNow, source[i]), isNew: true);
}
}
-
- ///
public override void Reset()
{
_buffer.Clear();
diff --git a/lib/volatility/ccv/Ccv.cs b/lib/volatility/ccv/Ccv.cs
index 493a648a..b7a3d78f 100644
--- a/lib/volatility/ccv/Ccv.cs
+++ b/lib/volatility/ccv/Ccv.cs
@@ -100,8 +100,6 @@ public sealed class Ccv : AbstractBase
/// Smoothing method (1=SMA, 2=EMA, 3=WMA).
///
public int Method => _method;
-
- ///
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public override TValue Update(TValue input, bool isNew = true)
{
@@ -242,8 +240,6 @@ public sealed class Ccv : AbstractBase
PubEvent(Last, isNew);
return Last;
}
-
- ///
public override TSeries Update(TSeries source)
{
int len = source.Count;
@@ -276,8 +272,6 @@ public sealed class Ccv : AbstractBase
_state.Sum += _returnBuffer[i];
}
}
-
- ///
public override void Prime(ReadOnlySpan source, TimeSpan? step = null)
{
for (int i = 0; i < source.Length; i++)
@@ -285,8 +279,6 @@ public sealed class Ccv : AbstractBase
Update(new TValue(DateTime.UtcNow, source[i]), isNew: true);
}
}
-
- ///
public override void Reset()
{
_returnBuffer.Clear();
diff --git a/lib/volatility/cv/Cv.cs b/lib/volatility/cv/Cv.cs
index 82a02bb7..e1a9a2f4 100644
--- a/lib/volatility/cv/Cv.cs
+++ b/lib/volatility/cv/Cv.cs
@@ -117,8 +117,6 @@ public sealed class Cv : AbstractBase
/// Beta coefficient (persistence weight).
///
public double Beta => _beta;
-
- ///
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public override TValue Update(TValue input, bool isNew = true)
{
@@ -241,8 +239,6 @@ public sealed class Cv : AbstractBase
PubEvent(Last, isNew);
return Last;
}
-
- ///
public override TSeries Update(TSeries source)
{
int len = source.Count;
@@ -265,8 +261,6 @@ public sealed class Cv : AbstractBase
return new TSeries(t, v);
}
-
- ///
public override void Prime(ReadOnlySpan source, TimeSpan? step = null)
{
for (int i = 0; i < source.Length; i++)
@@ -274,8 +268,6 @@ public sealed class Cv : AbstractBase
Update(new TValue(DateTime.UtcNow, source[i]), isNew: true);
}
}
-
- ///
public override void Reset()
{
_s = new State(0.0, 0.0, 0.0, 0.0, double.NaN, 0.0, 0);
diff --git a/lib/volatility/cvi/Cvi.cs b/lib/volatility/cvi/Cvi.cs
index 55d619b7..eaa04fc8 100644
--- a/lib/volatility/cvi/Cvi.cs
+++ b/lib/volatility/cvi/Cvi.cs
@@ -152,8 +152,6 @@ public sealed class Cvi : AbstractBase
return new TSeries(t, v);
}
-
- ///
public override TSeries Update(TSeries source)
{
int len = source.Count;
@@ -254,8 +252,6 @@ public sealed class Cvi : AbstractBase
PubEvent(Last, isNew);
return Last;
}
-
- ///
public override void Prime(ReadOnlySpan source, TimeSpan? step = null)
{
for (int i = 0; i < source.Length; i++)
@@ -263,8 +259,6 @@ public sealed class Cvi : AbstractBase
Update(new TValue(DateTime.UtcNow, source[i]), isNew: true);
}
}
-
- ///
public override void Reset()
{
_emaBuffer.Clear();
diff --git a/lib/volatility/ewma/Ewma.cs b/lib/volatility/ewma/Ewma.cs
index 63001a7e..9c7b845c 100644
--- a/lib/volatility/ewma/Ewma.cs
+++ b/lib/volatility/ewma/Ewma.cs
@@ -103,8 +103,6 @@ public sealed class Ewma : AbstractBase
/// Number of periods per year for annualization.
///
public int AnnualPeriods => _annualPeriods;
-
- ///
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public override TValue Update(TValue input, bool isNew = true)
{
@@ -193,8 +191,6 @@ public sealed class Ewma : AbstractBase
PubEvent(Last, isNew);
return Last;
}
-
- ///
public override TSeries Update(TSeries source)
{
int len = source.Count;
@@ -217,8 +213,6 @@ public sealed class Ewma : AbstractBase
return new TSeries(t, v);
}
-
- ///
public override void Prime(ReadOnlySpan source, TimeSpan? step = null)
{
for (int i = 0; i < source.Length; i++)
@@ -226,8 +220,6 @@ public sealed class Ewma : AbstractBase
Update(new TValue(DateTime.UtcNow, source[i]), isNew: true);
}
}
-
- ///
public override void Reset()
{
_s = new State(0.0, 1.0, double.NaN, 0.0, 0);
diff --git a/lib/volatility/gkv/Gkv.cs b/lib/volatility/gkv/Gkv.cs
index c545c4b0..deffd52c 100644
--- a/lib/volatility/gkv/Gkv.cs
+++ b/lib/volatility/gkv/Gkv.cs
@@ -226,8 +226,6 @@ public sealed class Gkv : AbstractBase
return new TSeries(t, v);
}
-
- ///
public override TSeries Update(TSeries source)
{
int len = source.Count;
@@ -324,8 +322,6 @@ public sealed class Gkv : AbstractBase
PubEvent(Last, isNew);
return Last;
}
-
- ///
public override void Prime(ReadOnlySpan source, TimeSpan? step = null)
{
for (int i = 0; i < source.Length; i++)
@@ -333,8 +329,6 @@ public sealed class Gkv : AbstractBase
Update(new TValue(DateTime.UtcNow, source[i]), isNew: true);
}
}
-
- ///
public override void Reset()
{
_s = new State(0, 1.0, 0, 0, 0);
diff --git a/lib/volatility/hlv/Hlv.cs b/lib/volatility/hlv/Hlv.cs
index 6e8b6cf5..e6c60efd 100644
--- a/lib/volatility/hlv/Hlv.cs
+++ b/lib/volatility/hlv/Hlv.cs
@@ -211,8 +211,6 @@ public sealed class Hlv : AbstractBase
return new TSeries(t, v);
}
-
- ///
public override TSeries Update(TSeries source)
{
int len = source.Count;
@@ -309,8 +307,6 @@ public sealed class Hlv : AbstractBase
PubEvent(Last, isNew);
return Last;
}
-
- ///
public override void Prime(ReadOnlySpan source, TimeSpan? step = null)
{
for (int i = 0; i < source.Length; i++)
@@ -318,8 +314,6 @@ public sealed class Hlv : AbstractBase
Update(new TValue(DateTime.UtcNow, source[i]), isNew: true);
}
}
-
- ///
public override void Reset()
{
_s = new State(0, 1.0, 0, 0, 0);
diff --git a/lib/volatility/hv/Hv.cs b/lib/volatility/hv/Hv.cs
index a413196d..37a8ba60 100644
--- a/lib/volatility/hv/Hv.cs
+++ b/lib/volatility/hv/Hv.cs
@@ -33,8 +33,6 @@ namespace QuanTAlib;
[SkipLocalsInit]
public sealed class Hv : AbstractBase
{
- private const double Epsilon = 1e-10;
-
private readonly int _period;
private readonly bool _annualize;
private readonly int _annualPeriods;
@@ -182,8 +180,6 @@ public sealed class Hv : AbstractBase
return new TSeries(t, v);
}
-
- ///
public override TSeries Update(TSeries source)
{
int len = source.Count;
@@ -308,8 +304,6 @@ public sealed class Hv : AbstractBase
PubEvent(Last, isNew);
return Last;
}
-
- ///
public override void Prime(ReadOnlySpan source, TimeSpan? step = null)
{
for (int i = 0; i < source.Length; i++)
@@ -317,8 +311,6 @@ public sealed class Hv : AbstractBase
Update(new TValue(DateTime.UtcNow, source[i]), isNew: true);
}
}
-
- ///
public override void Reset()
{
_s = new State(double.NaN, 0, 0, 0, 0, 0);
diff --git a/lib/volatility/jvoltyn/Jvoltyn.Validation.Tests.cs b/lib/volatility/jvoltyn/Jvoltyn.Validation.Tests.cs
index 7c25b26f..e6d37e49 100644
--- a/lib/volatility/jvoltyn/Jvoltyn.Validation.Tests.cs
+++ b/lib/volatility/jvoltyn/Jvoltyn.Validation.Tests.cs
@@ -92,9 +92,9 @@ public class JvoltynValidationTests
// Calculate logParam manually to verify normalization
double lengthParam = (DefaultPeriod - 1.0) / 2.0;
- double logParam = System.Math.Log(System.Math.Sqrt(lengthParam)) / System.Math.Log(2.0);
+ double logParam = Math.Log(Math.Sqrt(lengthParam)) / Math.Log(2.0);
logParam = (logParam + 2.0) < 0.0 ? 0.0 : (logParam + 2.0);
- double normFactor = System.Math.Abs(logParam - 1.0) > 1e-10 ? 100.0 / (logParam - 1.0) : 0.0;
+ double normFactor = Math.Abs(logParam - 1.0) > 1e-10 ? 100.0 / (logParam - 1.0) : 0.0;
for (int i = 0; i < series.Count; i++)
{
diff --git a/lib/volatility/rsv/Rsv.cs b/lib/volatility/rsv/Rsv.cs
index 68325554..6f37e1d2 100644
--- a/lib/volatility/rsv/Rsv.cs
+++ b/lib/volatility/rsv/Rsv.cs
@@ -229,8 +229,6 @@ public sealed class Rsv : AbstractBase
return new TSeries(t, v);
}
-
- ///
public override TSeries Update(TSeries source)
{
if (source.Count == 0)
@@ -338,8 +336,6 @@ public sealed class Rsv : AbstractBase
PubEvent(Last, isNew);
return Last;
}
-
- ///
public override void Prime(ReadOnlySpan source, TimeSpan? step = null)
{
for (int i = 0; i < source.Length; i++)
@@ -347,8 +343,6 @@ public sealed class Rsv : AbstractBase
Update(new TValue(DateTime.UtcNow, source[i]), isNew: true);
}
}
-
- ///
public override void Reset()
{
_s = new State(0, 0, 0, 0, 0);
diff --git a/lib/volatility/rv/Rv.cs b/lib/volatility/rv/Rv.cs
index 930a205d..ea0b10ad 100644
--- a/lib/volatility/rv/Rv.cs
+++ b/lib/volatility/rv/Rv.cs
@@ -196,8 +196,6 @@ public sealed class Rv : AbstractBase
return new TSeries(t, v);
}
-
- ///
public override TSeries Update(TSeries source)
{
int len = source.Count;
@@ -320,8 +318,6 @@ public sealed class Rv : AbstractBase
PubEvent(Last, isNew);
return Last;
}
-
- ///
public override void Prime(ReadOnlySpan source, TimeSpan? step = null)
{
for (int i = 0; i < source.Length; i++)
@@ -329,8 +325,6 @@ public sealed class Rv : AbstractBase
Update(new TValue(DateTime.UtcNow, source[i]), isNew: true);
}
}
-
- ///
public override void Reset()
{
_s = new State(double.NaN, 0, 0, 0);
diff --git a/lib/volatility/rvi/Rvi.cs b/lib/volatility/rvi/Rvi.cs
index e00758f9..64be846b 100644
--- a/lib/volatility/rvi/Rvi.cs
+++ b/lib/volatility/rvi/Rvi.cs
@@ -177,8 +177,6 @@ public sealed class Rvi : AbstractBase
return new TSeries(t, v);
}
-
- ///
public override TSeries Update(TSeries source)
{
if (source.Count == 0)
@@ -344,8 +342,6 @@ public sealed class Rvi : AbstractBase
PubEvent(Last, isNew);
return Last;
}
-
- ///
public override void Prime(ReadOnlySpan source, TimeSpan? step = null)
{
for (int i = 0; i < source.Length; i++)
@@ -353,8 +349,6 @@ public sealed class Rvi : AbstractBase
Update(new TValue(DateTime.UtcNow, source[i]), isNew: true);
}
}
-
- ///
public override void Reset()
{
_s = new State(double.NaN, 0, 0, 0, 1.0, 0, 1.0, 50.0, 0);
diff --git a/lib/volatility/tr/Tr.Validation.Tests.cs b/lib/volatility/tr/Tr.Validation.Tests.cs
index a65ec8f4..dcb6ca12 100644
--- a/lib/volatility/tr/Tr.Validation.Tests.cs
+++ b/lib/volatility/tr/Tr.Validation.Tests.cs
@@ -683,7 +683,7 @@ public class TrValidationTests
Tr.Batch(high, low, close, qOutput);
// Use ValidationHelper for correct TALib index mapping
- QuanTAlib.Tests.ValidationHelper.VerifyData(qOutput, output, outRange, lookback);
+ ValidationHelper.VerifyData(qOutput, output, outRange, lookback);
}
[Fact]
diff --git a/lib/volatility/tr/Tr.cs b/lib/volatility/tr/Tr.cs
index f3a3dea9..adb4283c 100644
--- a/lib/volatility/tr/Tr.cs
+++ b/lib/volatility/tr/Tr.cs
@@ -152,8 +152,6 @@ public sealed class Tr : AbstractBase
return new TSeries(t, v);
}
-
- ///
public override TSeries Update(TSeries source)
{
int len = source.Count;
@@ -258,8 +256,6 @@ public sealed class Tr : AbstractBase
PubEvent(Last, isNew);
return Last;
}
-
- ///
public override void Prime(ReadOnlySpan source, TimeSpan? step = null)
{
for (int i = 0; i < source.Length; i++)
@@ -267,8 +263,6 @@ public sealed class Tr : AbstractBase
Update(new TValue(DateTime.UtcNow, source[i]), isNew: true);
}
}
-
- ///
public override void Reset()
{
_s = new State(double.NaN, 0, 0, 0, 0, 0);
diff --git a/lib/volatility/ui/Ui.cs b/lib/volatility/ui/Ui.cs
index a3573bb3..7f3abf03 100644
--- a/lib/volatility/ui/Ui.cs
+++ b/lib/volatility/ui/Ui.cs
@@ -118,8 +118,6 @@ public sealed class Ui : AbstractBase
{
return UpdateCore(bar.Time, bar.Close, isNew);
}
-
- ///
public override TSeries Update(TSeries source)
{
int len = source.Count;
@@ -235,8 +233,6 @@ public sealed class Ui : AbstractBase
PubEvent(Last, isNew);
return Last;
}
-
- ///
public override void Prime(ReadOnlySpan source, TimeSpan? step = null)
{
for (int i = 0; i < source.Length; i++)
@@ -244,8 +240,6 @@ public sealed class Ui : AbstractBase
Update(new TValue(DateTime.UtcNow, source[i]), isNew: true);
}
}
-
- ///
public override void Reset()
{
_closeBuffer.Clear();
diff --git a/lib/volatility/vov/Vov.cs b/lib/volatility/vov/Vov.cs
index 91c6e6f3..77c081f5 100644
--- a/lib/volatility/vov/Vov.cs
+++ b/lib/volatility/vov/Vov.cs
@@ -136,8 +136,6 @@ public sealed class Vov : AbstractBase
{
return UpdateCore(bar.Time, bar.Close, isNew);
}
-
- ///
public override TSeries Update(TSeries source)
{
int len = source.Count;
@@ -279,8 +277,6 @@ public sealed class Vov : AbstractBase
PubEvent(Last, isNew);
return Last;
}
-
- ///
public override void Prime(ReadOnlySpan source, TimeSpan? step = null)
{
for (int i = 0; i < source.Length; i++)
@@ -288,8 +284,6 @@ public sealed class Vov : AbstractBase
Update(new TValue(DateTime.UtcNow, source[i]), isNew: true);
}
}
-
- ///
public override void Reset()
{
_priceBuffer.Clear();
diff --git a/lib/volatility/vr/Vr.cs b/lib/volatility/vr/Vr.cs
index 76596d71..f37b5e5f 100644
--- a/lib/volatility/vr/Vr.cs
+++ b/lib/volatility/vr/Vr.cs
@@ -227,8 +227,6 @@ public sealed class Vr : AbstractBase
return new TSeries(t, v);
}
-
- ///
public override TSeries Update(TSeries source)
{
// For TSeries (price-only), create synthetic bars
@@ -248,8 +246,6 @@ public sealed class Vr : AbstractBase
return new TSeries(t, v);
}
-
- ///
public override void Prime(ReadOnlySpan source, TimeSpan? step = null)
{
for (int i = 0; i < source.Length; i++)
@@ -257,8 +253,6 @@ public sealed class Vr : AbstractBase
Update(new TValue(DateTime.UtcNow, source[i]), isNew: true);
}
}
-
- ///
public override void Reset()
{
_s = new State(0, 1.0, 0, 0, 0, false);
diff --git a/lib/volatility/yzv/Yzv.cs b/lib/volatility/yzv/Yzv.cs
index 78c14595..24372161 100644
--- a/lib/volatility/yzv/Yzv.cs
+++ b/lib/volatility/yzv/Yzv.cs
@@ -238,8 +238,6 @@ public sealed class Yzv : AbstractBase
return new TSeries(t, v);
}
-
- ///
public override TSeries Update(TSeries source)
{
// For TSeries (price-only), create synthetic bars
@@ -259,8 +257,6 @@ public sealed class Yzv : AbstractBase
return new TSeries(t, v);
}
-
- ///
public override void Prime(ReadOnlySpan source, TimeSpan? step = null)
{
for (int i = 0; i < source.Length; i++)
@@ -268,8 +264,6 @@ public sealed class Yzv : AbstractBase
Update(new TValue(DateTime.UtcNow, source[i]), isNew: true);
}
}
-
- ///
public override void Reset()
{
_s = new State(0, 1.0, 0, 0, 0, false);
diff --git a/lib/volume/twap/Twap.cs b/lib/volume/twap/Twap.cs
index 1a1c5ae9..7c006cba 100644
--- a/lib/volume/twap/Twap.cs
+++ b/lib/volume/twap/Twap.cs
@@ -41,16 +41,10 @@ public sealed class Twap : ITValuePublisher
private State _s;
private State _ps;
-
- ///
public TValue Last { get; private set; }
- ///
public bool IsHot { get; private set; }
- ///
public static int WarmupPeriod => 1;
- ///
public string Name { get; }
- ///
public event TValuePublishedHandler? Pub;
///
diff --git a/lib/volume/va/Va.cs b/lib/volume/va/Va.cs
index a0c5015d..921dcb5a 100644
--- a/lib/volume/va/Va.cs
+++ b/lib/volume/va/Va.cs
@@ -37,16 +37,10 @@ public sealed class Va : ITValuePublisher
private State _s;
private State _ps;
-
- ///
public TValue Last { get; private set; }
- ///
public bool IsHot => _s.Index >= 1;
- ///
public static int WarmupPeriod => 1;
- ///
public string Name { get; }
- ///
public event TValuePublishedHandler? Pub;
///
diff --git a/lib/volume/vf/Vf.Validation.Tests.cs b/lib/volume/vf/Vf.Validation.Tests.cs
index d63b1c60..8864ec34 100644
--- a/lib/volume/vf/Vf.Validation.Tests.cs
+++ b/lib/volume/vf/Vf.Validation.Tests.cs
@@ -110,7 +110,7 @@ public class VfValidationTests
vfHigh.Update(bar2High, isNew: true);
// Higher volume should produce larger absolute VF
- Assert.True(System.Math.Abs(vfHigh.Last.Value) > System.Math.Abs(vfLow.Last.Value),
+ Assert.True(Math.Abs(vfHigh.Last.Value) > Math.Abs(vfLow.Last.Value),
$"High volume VF ({vfHigh.Last.Value}) should exceed low volume VF ({vfLow.Last.Value})");
}
diff --git a/lib/volume/vf/Vf.cs b/lib/volume/vf/Vf.cs
index 72555607..bebe6fb1 100644
--- a/lib/volume/vf/Vf.cs
+++ b/lib/volume/vf/Vf.cs
@@ -36,16 +36,10 @@ public sealed class Vf : ITValuePublisher
private State _ps;
private readonly int _period;
private readonly double _alpha;
-
- ///
public TValue Last { get; private set; }
- ///
public bool IsHot => _s.Index >= _period;
- ///
public int WarmupPeriod => _period;
- ///
public string Name { get; }
- ///
public event TValuePublishedHandler? Pub;
///
diff --git a/lib/volume/vo/Vo.cs b/lib/volume/vo/Vo.cs
index a1daa9bd..e3008ece 100644
--- a/lib/volume/vo/Vo.cs
+++ b/lib/volume/vo/Vo.cs
@@ -47,18 +47,12 @@ public sealed class Vo : ITValuePublisher
private double[]? _pBufferShort;
private double[]? _pBufferLong;
private double[]? _pBufferSignal;
-
- ///
public TValue Last { get; private set; }
/// Gets the current signal line value.
public double Signal => _s.SignalValue;
- ///
public bool IsHot => _s.Index >= _longPeriod;
- ///
public int WarmupPeriod => _longPeriod;
- ///
public string Name { get; }
- ///
public event TValuePublishedHandler? Pub;
///
diff --git a/lib/volume/vroc/Vroc.cs b/lib/volume/vroc/Vroc.cs
index 76fdb252..5c07e64c 100644
--- a/lib/volume/vroc/Vroc.cs
+++ b/lib/volume/vroc/Vroc.cs
@@ -34,16 +34,10 @@ public sealed class Vroc : ITValuePublisher
private readonly bool _usePercent;
private readonly double[] _buffer;
private double[]? _pBuffer;
-
- ///
public TValue Last { get; private set; }
- ///
public bool IsHot => _s.Index > _period;
- ///
public int WarmupPeriod => _period + 1;
- ///
public string Name { get; }
- ///
public event TValuePublishedHandler? Pub;
///
diff --git a/ndepend/NDBadge.deps.json b/ndepend/NDBadge.deps.json
deleted file mode 100644
index e2c78f8c..00000000
--- a/ndepend/NDBadge.deps.json
+++ /dev/null
@@ -1,154 +0,0 @@
-{
- "runtimeTarget": {
- "name": ".NETCoreApp,Version=v10.0",
- "signature": ""
- },
- "compilationOptions": {},
- "targets": {
- ".NETCoreApp,Version=v10.0": {
- "NDBadge/1.0.0": {
- "dependencies": {
- "SkiaSharp": "3.119.1",
- "SkiaSharp.NativeAssets.Linux": "3.119.1"
- },
- "runtime": {
- "NDBadge.dll": {}
- }
- },
- "SkiaSharp/3.119.1": {
- "dependencies": {
- "SkiaSharp.NativeAssets.Win32": "3.119.1",
- "SkiaSharp.NativeAssets.macOS": "3.119.1"
- },
- "runtime": {
- "lib/net8.0/SkiaSharp.dll": {
- "assemblyVersion": "3.119.0.0",
- "fileVersion": "3.119.1.0"
- }
- }
- },
- "SkiaSharp.NativeAssets.Linux/3.119.1": {
- "runtimeTargets": {
- "runtimes/linux-arm/native/libSkiaSharp.so": {
- "rid": "linux-arm",
- "assetType": "native",
- "fileVersion": "0.0.0.0"
- },
- "runtimes/linux-arm64/native/libSkiaSharp.so": {
- "rid": "linux-arm64",
- "assetType": "native",
- "fileVersion": "0.0.0.0"
- },
- "runtimes/linux-loongarch64/native/libSkiaSharp.so": {
- "rid": "linux-loongarch64",
- "assetType": "native",
- "fileVersion": "0.0.0.0"
- },
- "runtimes/linux-musl-arm/native/libSkiaSharp.so": {
- "rid": "linux-musl-arm",
- "assetType": "native",
- "fileVersion": "0.0.0.0"
- },
- "runtimes/linux-musl-arm64/native/libSkiaSharp.so": {
- "rid": "linux-musl-arm64",
- "assetType": "native",
- "fileVersion": "0.0.0.0"
- },
- "runtimes/linux-musl-loongarch64/native/libSkiaSharp.so": {
- "rid": "linux-musl-loongarch64",
- "assetType": "native",
- "fileVersion": "0.0.0.0"
- },
- "runtimes/linux-musl-riscv64/native/libSkiaSharp.so": {
- "rid": "linux-musl-riscv64",
- "assetType": "native",
- "fileVersion": "0.0.0.0"
- },
- "runtimes/linux-musl-x64/native/libSkiaSharp.so": {
- "rid": "linux-musl-x64",
- "assetType": "native",
- "fileVersion": "0.0.0.0"
- },
- "runtimes/linux-riscv64/native/libSkiaSharp.so": {
- "rid": "linux-riscv64",
- "assetType": "native",
- "fileVersion": "0.0.0.0"
- },
- "runtimes/linux-x64/native/libSkiaSharp.so": {
- "rid": "linux-x64",
- "assetType": "native",
- "fileVersion": "0.0.0.0"
- },
- "runtimes/linux-x86/native/libSkiaSharp.so": {
- "rid": "linux-x86",
- "assetType": "native",
- "fileVersion": "0.0.0.0"
- }
- }
- },
- "SkiaSharp.NativeAssets.macOS/3.119.1": {
- "runtimeTargets": {
- "runtimes/osx/native/libSkiaSharp.dylib": {
- "rid": "osx",
- "assetType": "native",
- "fileVersion": "0.0.0.0"
- }
- }
- },
- "SkiaSharp.NativeAssets.Win32/3.119.1": {
- "runtimeTargets": {
- "runtimes/win-arm64/native/libSkiaSharp.dll": {
- "rid": "win-arm64",
- "assetType": "native",
- "fileVersion": "0.0.0.0"
- },
- "runtimes/win-x64/native/libSkiaSharp.dll": {
- "rid": "win-x64",
- "assetType": "native",
- "fileVersion": "0.0.0.0"
- },
- "runtimes/win-x86/native/libSkiaSharp.dll": {
- "rid": "win-x86",
- "assetType": "native",
- "fileVersion": "0.0.0.0"
- }
- }
- }
- }
- },
- "libraries": {
- "NDBadge/1.0.0": {
- "type": "project",
- "serviceable": false,
- "sha512": ""
- },
- "SkiaSharp/3.119.1": {
- "type": "package",
- "serviceable": true,
- "sha512": "sha512-+Ru1BTSZQne3Vp+vbSb50Ke3Nlc3ZnItxx4+751J9WZ8YzLKAV/n+9DAo4zFTyeCI//ueT63c+VybmTTpYBEiw==",
- "path": "skiasharp/3.119.1",
- "hashPath": "skiasharp.3.119.1.nupkg.sha512"
- },
- "SkiaSharp.NativeAssets.Linux/3.119.1": {
- "type": "package",
- "serviceable": true,
- "sha512": "sha512-9YNoc4SeKvQhrwiqwT4ezkNfMywPdPSK+UFvo/CaoXqLixcnYOTsQKm5BF9mc4+q3vKgDtEgMt0d1ygZhJTEHg==",
- "path": "skiasharp.nativeassets.linux/3.119.1",
- "hashPath": "skiasharp.nativeassets.linux.3.119.1.nupkg.sha512"
- },
- "SkiaSharp.NativeAssets.macOS/3.119.1": {
- "type": "package",
- "serviceable": true,
- "sha512": "sha512-6hR3BdLhApjDxR1bFrJ7/lMydPfI01s3K+3WjIXFUlfC0MFCFCwRzv+JtzIkW9bDXs7XUVQS+6EVf0uzCasnGQ==",
- "path": "skiasharp.nativeassets.macos/3.119.1",
- "hashPath": "skiasharp.nativeassets.macos.3.119.1.nupkg.sha512"
- },
- "SkiaSharp.NativeAssets.Win32/3.119.1": {
- "type": "package",
- "serviceable": true,
- "sha512": "sha512-8C4GSXVJqSr0y3Tyyv5jz6MJSTVUyYkMjeKrzK+VyZPGLo89MNoUEclVuYahzOCDdtbfXrd2HtxXfDuvoSXrUw==",
- "path": "skiasharp.nativeassets.win32/3.119.1",
- "hashPath": "skiasharp.nativeassets.win32.3.119.1.nupkg.sha512"
- }
- }
-}
\ No newline at end of file
diff --git a/ndepend/NDBadge.dll b/ndepend/NDBadge.dll
deleted file mode 100644
index 785038f1..00000000
Binary files a/ndepend/NDBadge.dll and /dev/null differ
diff --git a/ndepend/NDBadge.exe b/ndepend/NDBadge.exe
deleted file mode 100644
index 6cffcad8..00000000
Binary files a/ndepend/NDBadge.exe and /dev/null differ
diff --git a/ndepend/NDBadge.runtimeconfig.json b/ndepend/NDBadge.runtimeconfig.json
deleted file mode 100644
index f730443c..00000000
--- a/ndepend/NDBadge.runtimeconfig.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
- "runtimeOptions": {
- "tfm": "net10.0",
- "framework": {
- "name": "Microsoft.NETCore.App",
- "version": "10.0.0"
- },
- "configProperties": {
- "System.Reflection.Metadata.MetadataUpdater.IsSupported": false,
- "System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization": false
- }
- }
-}
\ No newline at end of file
diff --git a/ndepend/SkiaSharp.dll b/ndepend/SkiaSharp.dll
deleted file mode 100644
index 40b5f963..00000000
Binary files a/ndepend/SkiaSharp.dll and /dev/null differ
diff --git a/ndepend/coverage-exclusions.runsettings b/ndepend/coverage-exclusions.runsettings
deleted file mode 100644
index 0e67e8e5..00000000
--- a/ndepend/coverage-exclusions.runsettings
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
- .*::System\.Collections\..*\.GetEnumerator\(\).*
-
-
-
-
-
-
-
-
diff --git a/ndepend/generate-badges.ps1 b/ndepend/generate-badges.ps1
deleted file mode 100644
index f26db07a..00000000
--- a/ndepend/generate-badges.ps1
+++ /dev/null
@@ -1,122 +0,0 @@
-#!/usr/bin/env pwsh
-#requires -Version 7.0
-
-<#
-.SYNOPSIS
- Generates NDepend metric badges for QuanTAlib
-.DESCRIPTION
- Creates SVG badges for key quality metrics that reinforce QuanTAlib's
- identity: scale, quality, low complexity, and comprehensive documentation.
-#>
-
-[CmdletBinding()]
-param(
- [Parameter(Mandatory = $false)]
- [string]$NDBadgePath = "$PSScriptRoot\NDBadge.exe",
-
- [Parameter(Mandatory = $false)]
- [string]$XmlPath = ".\ndepend\NDependOut\TrendMetrics\NDependTrendData2026.xml"
-)
-
-$ErrorActionPreference = 'Stop'
-
-# Validate prerequisites
-if (-not (Test-Path $NDBadgePath)) {
- Write-Error "NDBadge.exe not found at: $NDBadgePath"
- exit 1
-}
-
-if (-not (Test-Path $XmlPath)) {
- Write-Error "NDepend trend data XML not found at: $XmlPath"
- Write-Information "Please run ndepend.ps1 first to generate analysis data"
- exit 1
-}
-
-$ScriptDir = $PSScriptRoot
-$OutputDir = Join-Path $ScriptDir "badges"
-
-# Create output directory
-if (-not (Test-Path $OutputDir)) {
- New-Item -ItemType Directory -Path $OutputDir -Force | Out-Null
-}
-
-Write-Information "=== Generating QuanTAlib Quality Badges ==="
-Write-Information "Output directory: $OutputDir`n"
-
-# Selected badges for QuanTAlib README
-Write-Information "Generating QuanTAlib badges..."
-
-$HighValueBadges = @(
- @{
- Metric = "# Lines of Code"
- Output = "loc.svg"
- Description = "Total lines of code"
- },
- @{
- Metric = "# Source Files"
- Output = "files.svg"
- Description = "Source files"
- },
- @{
- Metric = "# Classes"
- Output = "classes.svg"
- Description = "Classes"
- },
- @{
- Metric = "# Methods"
- Output = "methods.svg"
- Description = "Methods"
- },
- @{
- Metric = "# Public Types"
- Output = "public-api.svg"
- Description = "Public API surface"
- },
- @{
- Metric = "Percentage of Comments"
- Output = "comments.svg"
- Description = "Comment percentage"
- },
- @{
- Metric = "Average Cyclomatic Complexity for Methods"
- Output = "complexity.svg"
- Description = "Average complexity"
- }
-)
-
-foreach ($badge in $HighValueBadges) {
- $outputPath = Join-Path $OutputDir $badge.Output
- Write-Information " [$($badge.Output)] $($badge.Description)"
-
- & $NDBadgePath --xml $XmlPath --metric $badge.Metric --output $outputPath
-
- if ($LASTEXITCODE -ne 0) {
- Write-Warning "Failed to generate badge: $($badge.Output)"
- }
-}
-
-
-# Generate summary
-Write-Information "`n=== Badge Generation Complete ==="
-$generatedBadges = Get-ChildItem -Path $OutputDir -Filter "*.svg"
-Write-Information "Generated $($generatedBadges.Count) badges in: $OutputDir"
-
-Write-Information "`nGenerated badges:"
-$HighValueBadges | ForEach-Object {
- Write-Information " - $($_.Output.PadRight(20)) : $($_.Description)"
-}
-
-Write-Information "`nMarkdown snippet for README.md:"
-Write-Information @"
-
-## Quality Metrics
-
-[]()
-[]()
-[]()
-[]()
-[]()
-[]()
-[]()
-
-"@
diff --git a/ndepend/libSkiaSharp.dll b/ndepend/libSkiaSharp.dll
deleted file mode 100644
index 036745b3..00000000
Binary files a/ndepend/libSkiaSharp.dll and /dev/null differ
diff --git a/ndepend/ndepend.ps1 b/ndepend/ndepend.ps1
deleted file mode 100644
index 03225120..00000000
--- a/ndepend/ndepend.ps1
+++ /dev/null
@@ -1,239 +0,0 @@
-#!/usr/bin/env pwsh
-#requires -Version 7.0
-
-[CmdletBinding()]
-param(
- [Parameter(Mandatory = $false)]
- [string]$NdependLicense = $env:NDEPEND_LICENSE
-)
-
-$ErrorActionPreference = 'Stop'
-$ProgressPreference = 'SilentlyContinue'
-
-# Configuration
-# Determine NDepend installation path based on OS
-if ($IsWindows -or $env:OS -like "Windows*") {
- $NdependDll = "C:\ndepend\net10.0\NDepend.Console.MultiOS.dll"
-} else {
- $NdependDll = Join-Path $HOME "NDepend/net10.0/NDepend.Console.MultiOS.dll"
-}
-# Ensure ScriptDir is set correctly even if $PSScriptRoot is empty (e.g., dot-sourced)
-$ScriptDir = if ($PSScriptRoot) { $PSScriptRoot } else { Split-Path -Parent $MyInvocation.MyCommand.Path }
-$ProjectRoot = Split-Path -Parent $ScriptDir
-$CoverageDir = Join-Path $ScriptDir "coverage"
-$SarifDir = Join-Path $ProjectRoot ".sarif"
-$SolutionFile = Join-Path $ProjectRoot "QuanTAlib.slnx"
-$TestProject = Join-Path $ProjectRoot "lib/QuanTAlib.Tests.csproj"
-$TestProject2 = Join-Path $ProjectRoot "quantower/Quantower.Tests.csproj"
-$RunSettingsFile = Join-Path $ProjectRoot "coverlet.runsettings"
-$NdependProject = Join-Path $ScriptDir "quantalib.ndproj"
-
-# Validate prerequisites
-if (-not (Test-Path $NdependDll)) {
- Write-Error "NDepend console not found at: $NdependDll"
- exit 1
-}
-
-if ([string]::IsNullOrWhiteSpace($NdependLicense)) {
- Write-Warning "NDEPEND_LICENSE environment variable not set. License activation may fail."
-}
-
-if (-not (Test-Path $SolutionFile)) {
- Write-Error "Solution file not found: $SolutionFile"
- exit 1
-}
-
-# Helper function for section headers
-function Write-Section {
- param([string]$Message)
- Write-Information "`n=== $Message ==="
-}
-
-# Track analysis failure
-$AnalysisFailed = $false
-
-try {
- # Create .sarif directory
- Write-Section "Creating .sarif directory for Roslyn analyzer output"
- if (-not (Test-Path $SarifDir)) {
- New-Item -ItemType Directory -Path $SarifDir -Force | Out-Null
- }
- Write-Information "SARIF directory: $SarifDir"
-
- # Restore, clean, and build
- Write-Section "Cleaning and building solution (generates SARIF files)"
-
- Write-Information "Restoring packages..."
- dotnet restore $SolutionFile -v q
- if ($LASTEXITCODE -ne 0) { throw "Restore failed with exit code $LASTEXITCODE" }
-
- Write-Information "Cleaning solution..."
- dotnet clean $SolutionFile -v q
- if ($LASTEXITCODE -ne 0) { throw "Clean failed with exit code $LASTEXITCODE" }
-
- Write-Information "Removing old coverage data..."
- if (Test-Path $CoverageDir) {
- Remove-Item -Path $CoverageDir -Recurse -Force
- }
-
- Write-Information "Building solution..."
- dotnet build $SolutionFile -c Debug --no-incremental
- if ($LASTEXITCODE -ne 0) { throw "Build failed with exit code $LASTEXITCODE" }
-
- # Run tests with coverage (QuanTAlib.Tests)
- Write-Section "Running tests with coverage (QuanTAlib.Tests)"
- dotnet test $TestProject `
- -c Debug `
- --no-build `
- --collect:"XPlat Code Coverage" `
- --settings $RunSettingsFile `
- --results-directory:$CoverageDir
-
- if ($LASTEXITCODE -ne 0) { throw "Tests failed for QuanTAlib.Tests with exit code $LASTEXITCODE" }
-
- # Run tests with coverage (Quantower.Tests)
- Write-Section "Running tests with coverage (Quantower.Tests)"
- dotnet test $TestProject2 `
- -c Debug `
- --no-build `
- --collect:"XPlat Code Coverage" `
- --settings $RunSettingsFile `
- --results-directory:$CoverageDir
-
- if ($LASTEXITCODE -ne 0) { throw "Tests failed for Quantower.Tests with exit code $LASTEXITCODE" }
-
- # Find coverage files
- Write-Information "`nSearching for coverage files..."
- $CoverageFiles = Get-ChildItem -Path $CoverageDir -Filter "coverage.opencover.xml" -Recurse -File |
- Select-Object -ExpandProperty FullName
-
- if (-not $CoverageFiles) {
- Write-Warning "No coverage files found in $CoverageDir"
- }
- else {
- $CoverageFiles | ForEach-Object {
- Write-Information "Coverage file: $_"
- }
- }
-
- # Run JetBrains InspectCode
- Write-Section "Running JetBrains InspectCode"
- $InspectCodeOutput = Join-Path $SarifDir "resharper.sarif.json"
- $jbPath = Get-Command "jb" -ErrorAction SilentlyContinue
- if ($jbPath) {
- Write-Information "Running InspectCode analysis..."
- jb inspectcode $SolutionFile --output=$InspectCodeOutput --format=Sarif --no-build
- if ($LASTEXITCODE -ne 0) {
- Write-Warning "InspectCode completed with exit code $LASTEXITCODE"
- }
- else {
- Write-Information "InspectCode SARIF saved to: $InspectCodeOutput"
- }
- }
- else {
- Write-Warning "JetBrains CLI (jb) not found. Skipping InspectCode analysis."
- Write-Information " Install with: dotnet tool install -g JetBrains.ReSharper.GlobalTools"
- }
-
- # List SARIF files
- Write-Section "SARIF files generated"
- $SarifFiles = Get-ChildItem -Path $SarifDir -Filter "*.json" -ErrorAction SilentlyContinue
- if ($SarifFiles) {
- $SarifFiles | ForEach-Object {
- Write-Information " $($_.Name) ($([math]::Round($_.Length / 1KB, 2)) KB)"
- }
- }
- else {
- Write-Information "No SARIF files found"
- }
-
- # Activate NDepend license
- Write-Section "Activating NDepend license"
- if (-not [string]::IsNullOrWhiteSpace($NdependLicense)) {
- dotnet $NdependDll --RegLic $NdependLicense
- if ($LASTEXITCODE -ne 0) { Write-Warning "License activation returned exit code $LASTEXITCODE" }
- }
- else {
- Write-Warning "Skipping license activation (no license provided)"
- }
-
- # Run NDepend analysis
- Write-Section "Running NDepend analysis"
- $NdependArgs = @($NdependProject)
- if ($CoverageFiles) {
- $NdependArgs += "/CoverageFiles"
- foreach ($file in $CoverageFiles) {
- $NdependArgs += $file
- }
- }
-
- dotnet $NdependDll @NdependArgs
- if ($LASTEXITCODE -ne 0) {
- Write-Warning "NDepend analysis completed with exit code $LASTEXITCODE"
- $AnalysisFailed = $true
- }
-
-}
-catch {
- Write-Error "Script failed: $_"
- $AnalysisFailed = $true
-}
-finally {
- # Always deactivate license
- Write-Section "Deactivating NDepend license"
- if (-not [string]::IsNullOrWhiteSpace($NdependLicense)) {
- dotnet $NdependDll --UnregLic
- if ($LASTEXITCODE -ne 0) { Write-Warning "License deactivation returned exit code $LASTEXITCODE" }
- }
- else {
- Write-Information "Skipping license deactivation (no license provided)"
- }
-
- # Generate badges from NDepend trend data
- Write-Section "Generating quality badges"
- $NDBadgePath = Join-Path $ScriptDir "NDBadge.exe"
- # Find the most recent trend data file
- $TrendMetricsDir = Join-Path $ScriptDir "NDependOut\TrendMetrics"
- $TrendXml = if (Test-Path $TrendMetricsDir) {
- Get-ChildItem -Path $TrendMetricsDir -Filter "NDependTrendData*.xml" -File |
- Sort-Object Name -Descending |
- Select-Object -First 1 -ExpandProperty FullName
- }
- else { $null }
- $BadgeDir = Join-Path $ScriptDir "badges"
-
- if ((Test-Path $NDBadgePath) -and $TrendXml -and (Test-Path $TrendXml)) {
- if (-not (Test-Path $BadgeDir)) {
- New-Item -ItemType Directory -Path $BadgeDir -Force | Out-Null
- }
-
- $Badges = @(
- @{ Metric = "# Lines of Code"; Output = "loc.svg" },
- @{ Metric = "# Source Files"; Output = "files.svg" },
- @{ Metric = "# Classes"; Output = "classes.svg" },
- @{ Metric = "# Methods"; Output = "methods.svg" },
- @{ Metric = "# Public Types"; Output = "public-api.svg" },
- @{ Metric = "Percentage of Comments"; Output = "comments.svg" },
- @{ Metric = "Average Cyclomatic Complexity for Methods"; Output = "complexity.svg" }
- )
-
- foreach ($badge in $Badges) {
- $outputPath = Join-Path $BadgeDir $badge.Output
- & $NDBadgePath --xml $TrendXml --metric $badge.Metric --output $outputPath 2>$null
- if ($LASTEXITCODE -eq 0) {
- Write-Information " Generated: $($badge.Output)"
- }
- }
- Write-Information "Badges saved to: $BadgeDir"
- }
- else {
- Write-Information "Skipping badge generation (NDBadge.exe or trend data not found)"
- }
-
- Write-Section "Done"
-
- if ($AnalysisFailed) {
- Write-Information "Note: Analysis completed with quality gate failures"
- exit 1
- }
-}
\ No newline at end of file
diff --git a/ndepend/quantalib.ndproj b/ndepend/quantalib.ndproj
deleted file mode 100644
index 9488ae44..00000000
--- a/ndepend/quantalib.ndproj
+++ /dev/null
@@ -1,565 +0,0 @@
-
-
- .\NDependOut
-
-
-
- .
-
-
-
- .NET 10.0
-
-
- True
- True
- True
- False
-
-
-
-
- .\coverage\43fa2c87-f47e-4cfd-bc4d-2b640a2a37d6\coverage.opencover.xml
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 1
- 1
- 0
- 0
- $ManDay$
- 50
- USD
- After
- 18
- 240
- 8
- 5
- 10
- 20
- 50
- 1200000000
- 12000000000
- 72000000000
- 360000000000
-
-
-
-
- ND1000: Avoid types too big
-warnif count > 0
-from t in JustMyCode.Types
-where t.NbLinesOfCode > 500 &&
- !t.IsGeneratedByCompiler
-let loc = t.NbLinesOfCode
-orderby loc descending
-select new {
- t,
- loc,
- t.Methods,
- t.Fields
-}
-// This rule identifies types that are too large and should be split into smaller, more focused types.
-// Threshold increased from default 200 to 500 to accommodate complex financial algorithm classes.
-// 10 min per issue
-]]>
-
- ND1004: Avoid methods with too many parameters
-warnif count > 0
-from m in JustMyCode.Methods
-where m.NbParameters > 8 &&
- !m.IsGeneratedByCompiler
-let np = m.NbParameters
-orderby np descending
-select new {
- m,
- np,
- m.NbLinesOfCode
-}
-// This rule identifies methods with too many parameters.
-// Threshold increased from default 5 to 8 to accommodate OHLCV bar data (6 values + time + flags).
-// 5 min per issue
-]]>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/nuget.config b/nuget.config
deleted file mode 100644
index 904d6945..00000000
--- a/nuget.config
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
-
-
-
-
diff --git a/perf/perf.csproj b/perf/perf.csproj
index 175b1921..0beb9a9c 100644
--- a/perf/perf.csproj
+++ b/perf/perf.csproj
@@ -7,6 +7,7 @@
enable
latest
true
+ https://www.myget.org/F/ooplesfinance_stockindicators/api/v3/index.json
diff --git a/quantalib.code-workspace b/quantalib.code-workspace
deleted file mode 100644
index 65c8568d..00000000
--- a/quantalib.code-workspace
+++ /dev/null
@@ -1,50 +0,0 @@
-{
- "folders": [
- {
- "path": "."
- }
- ],
- "settings": {
- "github.copilot.enable": {
- "*": true,
- "plaintext": false,
- "markdown": true,
- "scminput": false
- },
- "chat.editor.wordWrap": "on",
- "git.confirmSync": false,
- "git.decorations.enabled": true,
- "terminal.integrated.shellIntegration.enabled": true,
- "terminal.integrated.suggest.enabled": true,
- "omnisharp.enableEditorConfigSupport": true,
- "dotnet.defaultSolution": "QuanTAlib.slnx",
- "dotnet.unitTests.runSettingsPath": ".config/coverage.runsettings",
- "dotnet.completion.showCompletionItemsFromUnimportedNamespaces": true,
- "dotnet.server.useOmnisharp": false,
- "coderabbit.agentType": "Roo",
- "qodana.pathPrefix": "",
- "terminal.integrated.defaultProfile.windows": "PowerShell",
- "terminal.integrated.profiles.windows": {
- "PowerShell": {
- "source": "PowerShell",
- "path": "C:\\Program Files\\PowerShell\\7\\pwsh.exe",
- "icon": "terminal-powershell"
- },
- "Git Bash": {
- "path": "C:\\Program Files\\Git\\bin\\bash.exe",
- "icon": "terminal-bash"
- }
- },
- "terminal.integrated.automationProfile.windows": {
- "path": "C:\\Program Files\\PowerShell\\7\\pwsh.exe"
- },
- "qodana.projectId": "KbxmN",
- "sarif-viewer.connectToGithubCodeScanning": "on",
- "chatgpt.openOnStartup": true,
- "chatgpt.commentCodeLensEnabled": false,
- "chat.tools.terminal.autoApprove": {
- "code": true
- },
- "powershell.cwd": "quantalib"
- }
-}
diff --git a/sonar-suppressions.json b/sonar-suppressions.json
deleted file mode 100644
index acf418c3..00000000
--- a/sonar-suppressions.json
+++ /dev/null
@@ -1,162 +0,0 @@
-{
- "$schema": "https://json-schema.org/draft/2020-12/schema",
- "description": "Single source of truth for Sonar rule suppressions across SonarCloud, Codacy, and local builds",
- "rules": [
- {
- "id": "S107",
- "reason": "Methods should not have too many parameters - high-performance SIMD methods require multiple parameters for zero-allocation patterns"
- },
- {
- "id": "S1144",
- "reason": "Unused private types or members should be removed - false positives on reflection/serialization patterns"
- },
- {
- "id": "S1244",
- "reason": "Floating point numbers should not be tested for equality - intentional exact comparisons in financial calculations"
- },
- {
- "id": "S1944",
- "reason": "Inappropriate casts should not be made - false positives on generic constraint patterns"
- },
- {
- "id": "S2053",
- "reason": "Hashes should include unpredictable salt - not applicable to non-cryptographic hashing"
- },
- {
- "id": "S2245",
- "reason": "Using pseudorandom number generators is security-sensitive - GBM uses deterministic seeds for reproducibility"
- },
- {
- "id": "S2259",
- "reason": "Null pointers should not be dereferenced - false positives with nullable reference types"
- },
- {
- "id": "S2583",
- "reason": "Conditionally executed code should be reachable - false positives on defensive programming patterns"
- },
- {
- "id": "S2589",
- "reason": "Boolean expressions should not be gratuitous - false positives on explicit clarity patterns"
- },
- {
- "id": "S3236",
- "reason": "Caller information arguments should not be provided explicitly - intentional for testing/debugging"
- },
- {
- "id": "S3329",
- "reason": "Cipher Block Chaining IVs should be unpredictable - not applicable to non-cryptographic code"
- },
- {
- "id": "S3604",
- "reason": "Member initializer values should not be redundant - null! is intentional for nullable reference types in Quantower adapters"
- },
- {
- "id": "S3655",
- "reason": "Empty nullable value should not be accessed - false positives with HasValue checks"
- },
- {
- "id": "S3776",
- "reason": "Cognitive Complexity of methods should not be too high - complex algorithms require complex implementations"
- },
- {
- "id": "S3949",
- "reason": "Calculations should not overflow - false positives on checked arithmetic contexts"
- },
- {
- "id": "S3966",
- "reason": "Objects should not be disposed more than once - false positives on defensive dispose patterns"
- },
- {
- "id": "S4158",
- "reason": "Empty collections should not be accessed or iterated - false positives on lazy initialization"
- },
- {
- "id": "S4347",
- "reason": "Secure random number generators should not output predictable values - deterministic seeds for reproducibility"
- },
- {
- "id": "S5773",
- "reason": "Types allowed to be deserialized should be restricted - not applicable to this codebase"
- },
- {
- "id": "S6781",
- "reason": "JWT tokens should not be created using insecure secrets - not applicable to this codebase"
- },
- {
- "id": "S109",
- "reason": "Magic numbers should be replaced with named constants - numeric literals in SIMD/math algorithms are intentional and self-documenting"
- },
- {
- "id": "S122",
- "reason": "Statements should be on separate lines - compact initialization patterns improve readability in coefficient setup"
- },
- {
- "id": "S134",
- "reason": "Control flow statements should not be nested too deeply - complex algorithms require nested loops"
- },
- {
- "id": "S138",
- "reason": "Methods should not have too many lines - SIMD batch calculations are intentionally monolithic for performance"
- },
- {
- "id": "S1067",
- "reason": "Expressions should not be too complex - validation guard clauses benefit from compound conditions"
- },
- {
- "id": "S1227",
- "reason": "Break statements should not be used - early exit patterns improve performance in search loops"
- },
- {
- "id": "S1309",
- "reason": "Track uses of in-source issue suppressions - intentional suppressions are documented"
- },
- {
- "id": "S1451",
- "reason": "File headers should match a defined format - no file header requirement for this project"
- },
- {
- "id": "S1541",
- "reason": "Cyclomatic complexity should not be too high - optimized algorithms require complex control flow"
- },
- {
- "id": "S1659",
- "reason": "Multiple variables should not be declared on the same line - SIMD register declarations benefit from grouping"
- },
- {
- "id": "S2360",
- "reason": "Optional parameters should not be used - optional parameters are idiomatic for indicator constructors"
- },
- {
- "id": "S3254",
- "reason": "Default parameter values should not be passed as arguments - explicit defaults improve clarity"
- },
- {
- "id": "S3264",
- "reason": "Events should be invoked - events may be conditionally invoked or used for chaining"
- },
- {
- "id": "S3904",
- "reason": "Assemblies should have version information - version is set via Directory.Build.props"
- },
- {
- "id": "S3906",
- "reason": "Event handlers should have the correct signature - custom delegates are used for performance"
- },
- {
- "id": "S3908",
- "reason": "Generic event handlers should be used - TValuePublishedHandler is a performance-optimized custom delegate"
- },
- {
- "id": "S3990",
- "reason": "Assemblies should be marked CLSCompliant - CLS compliance not required for internal library"
- },
- {
- "id": "S3992",
- "reason": "Assemblies should have ComVisible attribute - COM interop not required"
- },
- {
- "id": "S4035",
- "reason": "Classes implementing IComparable should also implement IEquatable - performance-optimized value types use custom equality semantics"
- }
- ]
-}