diff --git a/lib/core/tbarseries/tbarseries.cs b/lib/core/tbarseries/tbarseries.cs index 2843d96e..4bb8863b 100644 --- a/lib/core/tbarseries/tbarseries.cs +++ b/lib/core/tbarseries/tbarseries.cs @@ -6,9 +6,8 @@ using System.Runtime.InteropServices; namespace QuanTAlib; /// -/// A high-performance OHLCV time series implementation using Structure of Arrays (SoA) layout. -/// Stores Time, Open, High, Low, Close, Volume in separate contiguous arrays for SIMD efficiency. -/// Exposes TSeries views for each component that share the underlying Time array. +/// Performance-focused event args for TBar updates. +/// Implemented as struct to avoid heap allocations in high-frequency event dispatch. /// [StructLayout(LayoutKind.Auto)] public readonly struct TBarEventArgs diff --git a/lib/core/tseries/ITValuePublisher.cs b/lib/core/tseries/ITValuePublisher.cs index 0d924896..d44cb154 100644 --- a/lib/core/tseries/ITValuePublisher.cs +++ b/lib/core/tseries/ITValuePublisher.cs @@ -1,14 +1,24 @@ using System; +using System.Runtime.InteropServices; namespace QuanTAlib; -public sealed class TValueEventArgs : EventArgs +/// +/// Performance-focused event args for TValue updates. +/// Implemented as struct to avoid heap allocations in high-frequency event dispatch. +/// +[StructLayout(LayoutKind.Auto)] +public readonly struct TValueEventArgs { public TValue Value { get; init; } public bool IsNew { get; init; } } -public delegate void TValuePublishedHandler(object? sender, TValueEventArgs args); +// Performance-focused event args struct; not derived from EventArgs by design. +// We intentionally deviate from the standard EventArgs pattern here for perf. +#pragma warning disable MA0046 // The second parameter must be of type 'System.EventArgs' or a derived type +public delegate void TValuePublishedHandler(object? sender, in TValueEventArgs args); +#pragma warning restore MA0046 /// /// Interface for objects that publish TValue updates. diff --git a/lib/core/tseries/tseries.cs b/lib/core/tseries/tseries.cs index 3f1016cf..6d8545e8 100644 --- a/lib/core/tseries/tseries.cs +++ b/lib/core/tseries/tseries.cs @@ -109,8 +109,7 @@ public class TSeries : IReadOnlyList, ITValuePublisher _v[lastIdx] = value.Value; } - var args = new TValueEventArgs { Value = value, IsNew = isNew }; - Pub?.Invoke(this, args); + Pub?.Invoke(this, new TValueEventArgs { Value = value, IsNew = isNew }); } // Overload for backward compatibility (assumes isNew=true) diff --git a/lib/momentum/apo/Apo.cs b/lib/momentum/apo/Apo.cs index df399e6e..e1ffc1c5 100644 --- a/lib/momentum/apo/Apo.cs +++ b/lib/momentum/apo/Apo.cs @@ -145,7 +145,7 @@ public sealed class Apo : ITValuePublisher return new TSeries(t, v); } - private void Handle(object? sender, TValueEventArgs args) + private void Handle(object? sender, in TValueEventArgs args) { Update(args.Value, args.IsNew); } diff --git a/lib/momentum/aroon/Aroon.Validation.Tests.cs b/lib/momentum/aroon/Aroon.Validation.Tests.cs index e918647b..c25ec2df 100644 --- a/lib/momentum/aroon/Aroon.Validation.Tests.cs +++ b/lib/momentum/aroon/Aroon.Validation.Tests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using Skender.Stock.Indicators; diff --git a/lib/momentum/aroonosc/AroonOsc.Validation.Tests.cs b/lib/momentum/aroonosc/AroonOsc.Validation.Tests.cs index aa2bf73e..066a9ef1 100644 --- a/lib/momentum/aroonosc/AroonOsc.Validation.Tests.cs +++ b/lib/momentum/aroonosc/AroonOsc.Validation.Tests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using Skender.Stock.Indicators; diff --git a/lib/momentum/cfb/Cfb.cs b/lib/momentum/cfb/Cfb.cs index 2b7fa9fc..25efc61c 100644 --- a/lib/momentum/cfb/Cfb.cs +++ b/lib/momentum/cfb/Cfb.cs @@ -93,7 +93,7 @@ public sealed class Cfb : ITValuePublisher } [MethodImpl(MethodImplOptions.AggressiveInlining)] - private void Handle(object? sender, TValueEventArgs args) => Update(args.Value, args.IsNew); + private void Handle(object? sender, in TValueEventArgs args) => Update(args.Value, args.IsNew); [MethodImpl(MethodImplOptions.AggressiveInlining)] public void Reset() diff --git a/lib/momentum/macd/Macd.cs b/lib/momentum/macd/Macd.cs index 25352daf..b10c1c0e 100644 --- a/lib/momentum/macd/Macd.cs +++ b/lib/momentum/macd/Macd.cs @@ -103,7 +103,7 @@ public sealed class Macd : ITValuePublisher return new TSeries(t, v); } - private void Handle(object? sender, TValueEventArgs args) + private void Handle(object? sender, in TValueEventArgs args) { Update(args.Value, args.IsNew); } diff --git a/lib/momentum/rsi/Rsi.cs b/lib/momentum/rsi/Rsi.cs index 36e28507..c3cc218a 100644 --- a/lib/momentum/rsi/Rsi.cs +++ b/lib/momentum/rsi/Rsi.cs @@ -147,7 +147,7 @@ public sealed class Rsi : AbstractBase return new TSeries(t, v); } - private void Handle(object? sender, TValueEventArgs args) + private void Handle(object? sender, in TValueEventArgs args) { Update(args.Value, args.IsNew); } diff --git a/lib/momentum/rsx/Rsx.cs b/lib/momentum/rsx/Rsx.cs index 3123008f..d619b8a5 100644 --- a/lib/momentum/rsx/Rsx.cs +++ b/lib/momentum/rsx/Rsx.cs @@ -93,7 +93,7 @@ public sealed class Rsx : ITValuePublisher public bool IsHot => _state.IsInitialized; [MethodImpl(MethodImplOptions.AggressiveInlining)] - private void Handle(object? sender, TValueEventArgs args) => Update(args.Value, args.IsNew); + private void Handle(object? sender, in TValueEventArgs args) => Update(args.Value, args.IsNew); public TValue Update(TValue input, bool isNew = true) { diff --git a/lib/momentum/vel/Vel.cs b/lib/momentum/vel/Vel.cs index 497ba635..b7608deb 100644 --- a/lib/momentum/vel/Vel.cs +++ b/lib/momentum/vel/Vel.cs @@ -48,7 +48,7 @@ public sealed class Vel : ITValuePublisher } [MethodImpl(MethodImplOptions.AggressiveInlining)] - private void Handle(object? sender, TValueEventArgs args) => Update(args.Value, args.IsNew); + private void Handle(object? sender, in TValueEventArgs args) => Update(args.Value, args.IsNew); [MethodImpl(MethodImplOptions.AggressiveInlining)] public TValue Update(TValue input, bool isNew = true) diff --git a/lib/statistics/linreg/LinReg.Validation.Tests.cs b/lib/statistics/linreg/LinReg.Validation.Tests.cs index 26b835e6..8665a35d 100644 --- a/lib/statistics/linreg/LinReg.Validation.Tests.cs +++ b/lib/statistics/linreg/LinReg.Validation.Tests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Linq; using System.Runtime.CompilerServices; using Xunit; diff --git a/lib/statistics/linreg/LinReg.cs b/lib/statistics/linreg/LinReg.cs index 6275ae22..fb368d3c 100644 --- a/lib/statistics/linreg/LinReg.cs +++ b/lib/statistics/linreg/LinReg.cs @@ -102,7 +102,7 @@ public sealed class LinReg : AbstractBase } [MethodImpl(MethodImplOptions.AggressiveInlining)] - private void Handle(object? sender, TValueEventArgs args) => Update(args.Value, args.IsNew); + private void Handle(object? sender, in TValueEventArgs args) => Update(args.Value, args.IsNew); [MethodImpl(MethodImplOptions.AggressiveInlining)] private double GetValidValue(double input) diff --git a/lib/statistics/median/Median.cs b/lib/statistics/median/Median.cs index 5fb4a299..cd60e7f6 100644 --- a/lib/statistics/median/Median.cs +++ b/lib/statistics/median/Median.cs @@ -82,7 +82,7 @@ public sealed class Median : AbstractBase } [MethodImpl(MethodImplOptions.AggressiveInlining)] - private void Handle(object? sender, TValueEventArgs args) => Update(args.Value, args.IsNew); + private void Handle(object? sender, in TValueEventArgs args) => Update(args.Value, args.IsNew); [MethodImpl(MethodImplOptions.AggressiveInlining)] public override TValue Update(TValue input, bool isNew = true) diff --git a/lib/statistics/stddev/StdDev.Validation.Tests.cs b/lib/statistics/stddev/StdDev.Validation.Tests.cs index 3e9536d6..35b0f909 100644 --- a/lib/statistics/stddev/StdDev.Validation.Tests.cs +++ b/lib/statistics/stddev/StdDev.Validation.Tests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Linq; using Xunit; using QuanTAlib; diff --git a/lib/statistics/variance/Variance.Validation.Tests.cs b/lib/statistics/variance/Variance.Validation.Tests.cs index b1f58ed1..79ef1b95 100644 --- a/lib/statistics/variance/Variance.Validation.Tests.cs +++ b/lib/statistics/variance/Variance.Validation.Tests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Linq; using Xunit; using QuanTAlib; diff --git a/lib/trends/alma/Alma.cs b/lib/trends/alma/Alma.cs index c624bddc..5a8b78d4 100644 --- a/lib/trends/alma/Alma.cs +++ b/lib/trends/alma/Alma.cs @@ -89,7 +89,7 @@ public sealed class Alma : AbstractBase, IDisposable } [MethodImpl(MethodImplOptions.AggressiveInlining)] - private void Handle(object? sender, TValueEventArgs e) => Update(e.Value, e.IsNew); + private void Handle(object? sender, in TValueEventArgs e) => Update(e.Value, e.IsNew); public void Dispose() { diff --git a/lib/trends/bessel/Bessel.cs b/lib/trends/bessel/Bessel.cs index 644942eb..936b3e59 100644 --- a/lib/trends/bessel/Bessel.cs +++ b/lib/trends/bessel/Bessel.cs @@ -319,7 +319,7 @@ public sealed class Bessel : AbstractBase, IDisposable } [MethodImpl(MethodImplOptions.AggressiveInlining)] - private void Handle(object? sender, TValueEventArgs e) => Update(e.Value, e.IsNew); + private void Handle(object? sender, in TValueEventArgs e) => Update(e.Value, e.IsNew); public override void Reset() { diff --git a/lib/trends/bilateral/Bilateral.cs b/lib/trends/bilateral/Bilateral.cs index 86f618fd..c6314179 100644 --- a/lib/trends/bilateral/Bilateral.cs +++ b/lib/trends/bilateral/Bilateral.cs @@ -117,7 +117,7 @@ public sealed class Bilateral : AbstractBase } [MethodImpl(MethodImplOptions.AggressiveInlining)] - private void Handle(object? sender, TValueEventArgs args) => Update(args.Value, args.IsNew); + private void Handle(object? sender, in TValueEventArgs args) => Update(args.Value, args.IsNew); public override TSeries Update(TSeries source) { diff --git a/lib/trends/blma/Blma.cs b/lib/trends/blma/Blma.cs index 834c2be5..840ca551 100644 --- a/lib/trends/blma/Blma.cs +++ b/lib/trends/blma/Blma.cs @@ -50,7 +50,7 @@ public sealed class Blma : AbstractBase, IDisposable } } - private void Handle(object? sender, TValueEventArgs args) + private void Handle(object? sender, in TValueEventArgs args) { Update(args.Value, args.IsNew); } diff --git a/lib/trends/butter/Butter.cs b/lib/trends/butter/Butter.cs index 2e006cf3..59781bf0 100644 --- a/lib/trends/butter/Butter.cs +++ b/lib/trends/butter/Butter.cs @@ -42,7 +42,7 @@ public sealed class Butter : AbstractBase source.Pub += _handler; } - private void Handle(object? sender, TValueEventArgs args) + private void Handle(object? sender, in TValueEventArgs args) { Update(args.Value, args.IsNew); } diff --git a/lib/trends/conv/Conv.cs b/lib/trends/conv/Conv.cs index b2ffd034..848743fc 100644 --- a/lib/trends/conv/Conv.cs +++ b/lib/trends/conv/Conv.cs @@ -66,7 +66,7 @@ public sealed class Conv : AbstractBase, IDisposable } } - private void Handle(object? sender, TValueEventArgs e) => Update(e.Value, e.IsNew); + private void Handle(object? sender, in TValueEventArgs e) => Update(e.Value, e.IsNew); [MethodImpl(MethodImplOptions.AggressiveInlining)] private double GetValidValue(double input) diff --git a/lib/trends/dema/Dema.Quantower.Tests.cs b/lib/trends/dema/Dema.Quantower.Tests.cs index a0e1030d..22906c7f 100644 --- a/lib/trends/dema/Dema.Quantower.Tests.cs +++ b/lib/trends/dema/Dema.Quantower.Tests.cs @@ -1,4 +1,4 @@ -using Xunit; +using Xunit; using TradingPlatform.BusinessLayer; namespace QuanTAlib.Tests; diff --git a/lib/trends/dema/Dema.cs b/lib/trends/dema/Dema.cs index ca958c0c..2a095f38 100644 --- a/lib/trends/dema/Dema.cs +++ b/lib/trends/dema/Dema.cs @@ -337,5 +337,5 @@ public sealed class Dema : AbstractBase, IDisposable } } - private void Handle(object? sender, TValueEventArgs e) => Update(e.Value, e.IsNew); + private void Handle(object? sender, in TValueEventArgs e) => Update(e.Value, e.IsNew); } diff --git a/lib/trends/dwma/Dwma.cs b/lib/trends/dwma/Dwma.cs index 693093f1..c5ea55ca 100644 --- a/lib/trends/dwma/Dwma.cs +++ b/lib/trends/dwma/Dwma.cs @@ -90,7 +90,7 @@ public sealed class Dwma : AbstractBase return new TSeries(t, v); } - private void Handle(object? sender, TValueEventArgs args) + private void Handle(object? sender, in TValueEventArgs args) { Update(args.Value, args.IsNew); } diff --git a/lib/trends/ema/Ema.cs b/lib/trends/ema/Ema.cs index f393a7f1..7e5deb2a 100644 --- a/lib/trends/ema/Ema.cs +++ b/lib/trends/ema/Ema.cs @@ -182,7 +182,7 @@ public sealed class Ema : AbstractBase } [MethodImpl(MethodImplOptions.AggressiveInlining)] - private void Handle(object? sender, TValueEventArgs e) => Update(e.Value, e.IsNew); + private void Handle(object? sender, in TValueEventArgs e) => Update(e.Value, e.IsNew); [MethodImpl(MethodImplOptions.AggressiveInlining)] private double GetValidValue(double input) diff --git a/lib/trends/hma/Hma.cs b/lib/trends/hma/Hma.cs index 9a1ac8f6..ee50ce4f 100644 --- a/lib/trends/hma/Hma.cs +++ b/lib/trends/hma/Hma.cs @@ -117,7 +117,7 @@ public sealed class Hma : AbstractBase return new TSeries(t, v); } - private void Handle(object? sender, TValueEventArgs args) + private void Handle(object? sender, in TValueEventArgs args) { Update(args.Value, args.IsNew); } diff --git a/lib/trends/htit/Htit.cs b/lib/trends/htit/Htit.cs index 868b2788..b381b715 100644 --- a/lib/trends/htit/Htit.cs +++ b/lib/trends/htit/Htit.cs @@ -253,7 +253,7 @@ public sealed class Htit : AbstractBase return new TSeries(t, v); } - private void Handle(object? sender, TValueEventArgs args) + private void Handle(object? sender, in TValueEventArgs args) { Update(args.Value, args.IsNew); } diff --git a/lib/trends/jma/Jma.cs b/lib/trends/jma/Jma.cs index cdbd1e1e..0c3ef14e 100644 --- a/lib/trends/jma/Jma.cs +++ b/lib/trends/jma/Jma.cs @@ -292,7 +292,7 @@ public sealed class Jma : AbstractBase return new TSeries(t, v); } - private void Handle(object? sender, TValueEventArgs args) => Update(args.Value, args.IsNew); + private void Handle(object? sender, in TValueEventArgs args) => Update(args.Value, args.IsNew); public override void Prime(ReadOnlySpan source, TimeSpan? step = null) { diff --git a/lib/trends/kama/Kama.cs b/lib/trends/kama/Kama.cs index 61edd72b..033b3fd4 100644 --- a/lib/trends/kama/Kama.cs +++ b/lib/trends/kama/Kama.cs @@ -208,7 +208,7 @@ public sealed class Kama : AbstractBase return new TSeries(t, v); } - private void Handle(object? sender, TValueEventArgs args) + private void Handle(object? sender, in TValueEventArgs args) { Update(args.Value, args.IsNew); } diff --git a/lib/trends/lsma/Lsma.Validation.Tests.cs b/lib/trends/lsma/Lsma.Validation.Tests.cs index 21389db0..1c9ac0a9 100644 --- a/lib/trends/lsma/Lsma.Validation.Tests.cs +++ b/lib/trends/lsma/Lsma.Validation.Tests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using OoplesFinance.StockIndicators; diff --git a/lib/trends/lsma/Lsma.cs b/lib/trends/lsma/Lsma.cs index 5904e058..8e29a202 100644 --- a/lib/trends/lsma/Lsma.cs +++ b/lib/trends/lsma/Lsma.cs @@ -87,7 +87,7 @@ public sealed class Lsma : AbstractBase, IDisposable _source.Pub += _handler; } - private void Handle(object? sender, TValueEventArgs e) => Update(e.Value, e.IsNew); + private void Handle(object? sender, in TValueEventArgs e) => Update(e.Value, e.IsNew); [MethodImpl(MethodImplOptions.AggressiveInlining)] private double GetValidValue(double input) diff --git a/lib/trends/mama/Mama.cs b/lib/trends/mama/Mama.cs index ab6aeac7..f9b64fb2 100644 --- a/lib/trends/mama/Mama.cs +++ b/lib/trends/mama/Mama.cs @@ -80,7 +80,7 @@ public sealed class Mama : AbstractBase source.Pub += _handler; } - private void Handle(object? sender, TValueEventArgs e) => Update(e.Value, e.IsNew); + private void Handle(object? sender, in TValueEventArgs e) => Update(e.Value, e.IsNew); private void Init() { diff --git a/lib/trends/mgdi/Mgdi.cs b/lib/trends/mgdi/Mgdi.cs index 5d8d9647..16cf0134 100644 --- a/lib/trends/mgdi/Mgdi.cs +++ b/lib/trends/mgdi/Mgdi.cs @@ -49,7 +49,7 @@ public sealed class Mgdi : AbstractBase source.Pub += _handler; } - private void Handle(object? sender, TValueEventArgs e) => Update(e.Value, e.IsNew); + private void Handle(object? sender, in TValueEventArgs e) => Update(e.Value, e.IsNew); private void Init() { diff --git a/lib/trends/pwma/Pwma.Quantower.cs b/lib/trends/pwma/Pwma.Quantower.cs index a0595e9a..4863e51d 100644 --- a/lib/trends/pwma/Pwma.Quantower.cs +++ b/lib/trends/pwma/Pwma.Quantower.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Drawing; using System.Runtime.CompilerServices; using TradingPlatform.BusinessLayer; diff --git a/lib/trends/pwma/Pwma.cs b/lib/trends/pwma/Pwma.cs index 8501850c..5baf69ec 100644 --- a/lib/trends/pwma/Pwma.cs +++ b/lib/trends/pwma/Pwma.cs @@ -62,7 +62,7 @@ public sealed class Pwma : AbstractBase source.Pub += _handler; } - private void Handle(object? sender, TValueEventArgs e) => Update(e.Value, e.IsNew); + private void Handle(object? sender, in TValueEventArgs e) => Update(e.Value, e.IsNew); [MethodImpl(MethodImplOptions.AggressiveInlining)] private double GetValidValue(double input, double lastValid) diff --git a/lib/trends/rma/Rma.cs b/lib/trends/rma/Rma.cs index f07adff5..b9132e00 100644 --- a/lib/trends/rma/Rma.cs +++ b/lib/trends/rma/Rma.cs @@ -80,7 +80,7 @@ public sealed class Rma : AbstractBase } [MethodImpl(MethodImplOptions.AggressiveInlining)] - private void Handle(object? sender, TValueEventArgs e) => Update(e.Value, e.IsNew); + private void Handle(object? sender, in TValueEventArgs e) => Update(e.Value, e.IsNew); public override TValue Update(TValue input, bool isNew = true) { diff --git a/lib/trends/sma/Sma.cs b/lib/trends/sma/Sma.cs index e8ba982c..b4d1e934 100644 --- a/lib/trends/sma/Sma.cs +++ b/lib/trends/sma/Sma.cs @@ -71,7 +71,7 @@ public sealed class Sma : AbstractBase source.Pub += _handler; } - private void Handle(object? sender, TValueEventArgs e) => Update(e.Value, e.IsNew); + private void Handle(object? sender, in TValueEventArgs e) => Update(e.Value, e.IsNew); ///////////////////////////////////////////////////////////////////////////////////////////////// // Mode B: Streaming (Stateful) diff --git a/lib/trends/ssf/Ssf.cs b/lib/trends/ssf/Ssf.cs index b8fbe74f..a2ca0661 100644 --- a/lib/trends/ssf/Ssf.cs +++ b/lib/trends/ssf/Ssf.cs @@ -77,7 +77,7 @@ public sealed class Ssf : AbstractBase source.Pub += _handler; } - private void Handle(object? sender, TValueEventArgs e) => Update(e.Value, e.IsNew); + private void Handle(object? sender, in TValueEventArgs e) => Update(e.Value, e.IsNew); public override bool IsHot => _state.IsHot; diff --git a/lib/trends/t3/T3.cs b/lib/trends/t3/T3.cs index bfe3d00d..91c27650 100644 --- a/lib/trends/t3/T3.cs +++ b/lib/trends/t3/T3.cs @@ -108,7 +108,7 @@ public sealed class T3 : AbstractBase, IDisposable _publisher.Pub += _handler; } - private void Handle(object? sender, TValueEventArgs e) => Update(e.Value, e.IsNew); + private void Handle(object? sender, in TValueEventArgs e) => Update(e.Value, e.IsNew); /// /// True if the T3 has been initialized (received at least one value). diff --git a/lib/trends/tema/Tema.cs b/lib/trends/tema/Tema.cs index 624c595e..24b964cd 100644 --- a/lib/trends/tema/Tema.cs +++ b/lib/trends/tema/Tema.cs @@ -85,7 +85,7 @@ public sealed class Tema : AbstractBase _handler = Handle; } - private void Handle(object? sender, TValueEventArgs e) => Update(e.Value, e.IsNew); + private void Handle(object? sender, in TValueEventArgs e) => Update(e.Value, e.IsNew); /// /// Initializes the indicator state using the provided history. diff --git a/lib/trends/trima/Trima.Validation.Tests.cs b/lib/trends/trima/Trima.Validation.Tests.cs index a2eecb21..48f78a92 100644 --- a/lib/trends/trima/Trima.Validation.Tests.cs +++ b/lib/trends/trima/Trima.Validation.Tests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using Skender.Stock.Indicators; diff --git a/lib/trends/trima/Trima.cs b/lib/trends/trima/Trima.cs index 41fd4857..2c57ef94 100644 --- a/lib/trends/trima/Trima.cs +++ b/lib/trends/trima/Trima.cs @@ -99,7 +99,7 @@ public sealed class Trima : AbstractBase, IDisposable return new TSeries(t, v); } - private void Handle(object? sender, TValueEventArgs args) => Update(args.Value, args.IsNew); + private void Handle(object? sender, in TValueEventArgs args) => Update(args.Value, args.IsNew); public override void Prime(ReadOnlySpan source, TimeSpan? step = null) { diff --git a/lib/trends/usf/Usf.cs b/lib/trends/usf/Usf.cs index 8e20dc71..b323411e 100644 --- a/lib/trends/usf/Usf.cs +++ b/lib/trends/usf/Usf.cs @@ -73,7 +73,7 @@ public sealed class Usf : AbstractBase source.Pub += _handler; } - private void Handle(object? sender, TValueEventArgs e) => Update(e.Value, e.IsNew); + private void Handle(object? sender, in TValueEventArgs e) => Update(e.Value, e.IsNew); public override bool IsHot => _state.IsHot; diff --git a/lib/trends/vidya/Vidya.cs b/lib/trends/vidya/Vidya.cs index 98e625eb..8de15f22 100644 --- a/lib/trends/vidya/Vidya.cs +++ b/lib/trends/vidya/Vidya.cs @@ -72,7 +72,7 @@ public sealed class Vidya : AbstractBase, IDisposable } } - private void Handle(object? sender, TValueEventArgs e) => Update(e.Value, e.IsNew); + private void Handle(object? sender, in TValueEventArgs e) => Update(e.Value, e.IsNew); public override bool IsHot => _state.BarCount >= _period; diff --git a/lib/trends/wma/Wma.cs b/lib/trends/wma/Wma.cs index 99611486..beff7ae2 100644 --- a/lib/trends/wma/Wma.cs +++ b/lib/trends/wma/Wma.cs @@ -194,7 +194,7 @@ public sealed class Wma : AbstractBase, IDisposable return new TSeries(t, v); } - private void Handle(object? sender, TValueEventArgs e) => Update(e.Value, e.IsNew); + private void Handle(object? sender, in TValueEventArgs e) => Update(e.Value, e.IsNew); public override void Prime(ReadOnlySpan source, TimeSpan? step = null) { diff --git a/lib/volatility/atr/Atr.cs b/lib/volatility/atr/Atr.cs index 0d12a571..285d9658 100644 --- a/lib/volatility/atr/Atr.cs +++ b/lib/volatility/atr/Atr.cs @@ -64,7 +64,7 @@ public sealed class Atr : AbstractBase // but we can rely on manual updates or the user subscribing. } - private void Handle(object? sender, TValueEventArgs e) => Update(e.Value, e.IsNew); + private void Handle(object? sender, in TValueEventArgs e) => Update(e.Value, e.IsNew); /// /// True if the ATR has warmed up and is providing valid results.