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.