| name | indicator-buffer |
| description | Implement BufferList incremental indicators with efficient state management. Use for IIncrementFromChain or IIncrementFromQuote implementations. Covers interface selection, constructor patterns, and BufferListTestBase testing requirements. |
BufferList indicator development
Interface selection
| Interface | Additional Inputs | Use Case |
|---|
IIncrementFromChain | IReusable, (DateTime, double) | Chainable single-value indicators |
IIncrementFromQuote | (none — only IQuote from base) | Requires OHLCV properties |
See references/interface-selection.md for decision tree.
Constructor pattern
The chaining constructor parameter type depends on the interface implemented:
public class EmaList : BufferList<EmaResult>, IIncrementFromChain, IEma
{
public EmaList(int lookbackPeriods)
{
Ema.Validate(lookbackPeriods);
LookbackPeriods = lookbackPeriods;
_buffer = new Queue<double>(lookbackPeriods);
}
public EmaList(int lookbackPeriods, IReadOnlyList<IReusable> values)
: this(lookbackPeriods) => Add(values);
}
public class AdxList : BufferList<AdxResult>, IIncrementFromQuote, IAdx
{
public AdxList(int lookbackPeriods)
{
Adx.Validate(lookbackPeriods);
LookbackPeriods = lookbackPeriods;
}
public AdxList(int lookbackPeriods, IReadOnlyList<IQuote> quotes)
: this(lookbackPeriods) => Add(quotes);
}
Buffer management
_buffer.Update(capacity, value) — standard rolling buffer
_buffer.UpdateWithDequeue(capacity, value) — returns dequeued value for sum adjustment
State management
Use Clear() to reset all internal state:
public override void Clear()
{
base.Clear();
_buffer.Clear();
_bufferSum = 0;
}
Testing constraints
- Inherit
BufferListTestBase
IIncrementFromChain → implement ITestChainBufferList
IIncrementFromQuote → implement ITestQuoteBufferList
- Series parity:
bufferResults.IsExactly(seriesResults)
Required implementation