Skip to content

Moving Average Envelopes

Moving Average Envelopes is a price band channel overlay that is offset from the moving average of price. [Discuss] 💬

csharp
// C# usage syntax
IReadOnlyList<MaEnvelopeResult> results =
  bars.ToMaEnvelopes(lookbackPeriods, percentOffset, movingAverageType);

Parameters

paramtypedescription
lookbackPeriodsintNumber of periods (N) in the moving average. Must be greater than 1.
percentOffsetdoublePercent offset for envelope width. Example: 3.5% would be entered as 3.5 (not 0.035). Must be greater than 0. Typical values range from 2 to 10. Default is 2.5.
movingAverageTypeMaTypeType of moving average (e.g. SMA, EMA, HMA). See MaType enum options below. Default is MaType.SMA.

Historical price bars requirements

bars is a collection of generic TBar historical price bars. It should have a consistent frequency (day, hour, minute, etc). See the Guide for more information.

Detailed bars requirements for each of the MaType enum options types can be found at the links in the following table.

MaType enum options

These are the supported moving average types:

enum valuemoving average
MaType.ALMAArnaud Legoux Moving Average
MaType.DEMADouble Exponential Moving Average
MaType.EPMAEndpoint Moving Average
MaType.EMAExponential Moving Average
MaType.HMAHull Moving Average
MaType.SMASimple Moving Average (default)
MaType.SMMASmoothed Moving Average
MaType.TEMATriple Exponential Moving Average
MaType.WMAWeighted Moving Average

🚩

For ALMA, default values are used for offset and sigma.

Response

csharp
IReadOnlyList<MaEnvelopeResult>
  • This method returns a time series of all available indicator values for the bars provided.
  • It always returns the same number of elements as there are in the historical price bars.
  • It does not return a single incremental indicator value.
  • The first periods will have null values since there's not enough data to calculate; the quantity will vary based on the movingAverageType specified.

🚩 ⚞ Convergence warning

Some moving average variants have decreasing magnitude, convergence-related precision errors that can be as high as ~5% deviation in indicator values for earlier periods. See the MaType enum options section above for more information.

MaEnvelopeResult

propertytypedescription
TimestampDateTimeDate from evaluated TBar
CenterlinedoubleMoving average
UpperEnvelopedoubleUpper envelope band
LowerEnvelopedoubleLower envelope band

The moving average Centerline is based on the movingAverageType type specified.

Utilities

See Utilities and helpers for more information.

Chaining

This indicator may be generated from any chain-enabled indicator or method.

csharp
// example
var results = bars
    .Use(CandlePart.HLC3)
    .ToMaEnvelopes(..);

Results cannot be further chained with additional transforms.

See Chaining indicators for more.

Streaming

Use the buffer-style List<T> when you need incremental calculations without a hub:

csharp
MaEnvelopesList maEnvList = new(lookbackPeriods, percentOffset, movingAverageType);

foreach (IBar bar in bars)  // simulating stream
{
  maEnvList.Add(bar);
}

// based on `ICollection<MaEnvelopeResult>`
IReadOnlyList<MaEnvelopeResult> results = maEnvList;

Subscribe to a BarHub for advanced streaming scenarios:

csharp
BarHub barHub = new();
MaEnvelopesHub observer = barHub.ToMaEnvelopesHub(lookbackPeriods, percentOffset, movingAverageType);

foreach (IBar bar in bars)  // simulating stream
{
  barHub.Add(bar);
}

IReadOnlyList<MaEnvelopeResult> results = observer.Results;

::: note In streaming mode, only certain moving average types are supported. ALMA, EPMA, and HMA are not yet supported in streaming mode and will throw a NotImplementedException. :::

See Buffer lists and Stream hubs for full usage guides.