mirror of
https://github.com/mihakralj/QuanTAlib.git
synced 2026-08-21 20:18:05 +00:00
Deep review of all indicator categories verified .md headers against .cs WarmupPeriod, parameters, inputs, and outputs. Fixes include warmup corrections, parameter documentation, output type accuracy, and Pine Script alignment.
61 lines
2.1 KiB
C#
61 lines
2.1 KiB
C#
using System.Drawing;
|
|
using System.Runtime.CompilerServices;
|
|
using TradingPlatform.BusinessLayer;
|
|
|
|
namespace QuanTAlib;
|
|
|
|
/// <summary>
|
|
/// EDECAY (Exponential Decay) Quantower indicator.
|
|
/// Tracks peaks and decays exponentially at a rate of (period-1)/period per bar.
|
|
/// Formula: output = max(input, prev_output * (period-1)/period)
|
|
/// </summary>
|
|
[SkipLocalsInit]
|
|
public class EdecayIndicator : Indicator, IWatchlistIndicator
|
|
{
|
|
[InputParameter("Period", sortIndex: 1, 1, 1000, 1, 0)]
|
|
public int Period { get; set; } = 5;
|
|
|
|
[IndicatorExtensions.DataSourceInput]
|
|
public SourceType Source { get; set; } = SourceType.Close;
|
|
|
|
[InputParameter("Show cold values", sortIndex: 21)]
|
|
public bool ShowColdValues { get; set; } = true;
|
|
|
|
private Edecay _edecay = null!;
|
|
protected LineSeries Series;
|
|
protected string SourceName = null!;
|
|
private Func<IHistoryItem, double> _priceSelector = null!;
|
|
|
|
public static int MinHistoryDepths => 0;
|
|
int IWatchlistIndicator.MinHistoryDepths => MinHistoryDepths;
|
|
|
|
public override string ShortName => $"EDECAY {Period}:{SourceName}";
|
|
|
|
public EdecayIndicator()
|
|
{
|
|
OnBackGround = true;
|
|
SeparateWindow = false;
|
|
SourceName = Source.ToString();
|
|
Name = "EDECAY - Exponential Decay";
|
|
Description = "Exponential Decay: output = max(input, prev_output * (period-1)/period)";
|
|
Series = new LineSeries(name: $"EDECAY {Period}", color: IndicatorExtensions.Averages, width: 2, style: LineStyle.Solid);
|
|
AddLineSeries(Series);
|
|
}
|
|
|
|
protected override void OnInit()
|
|
{
|
|
_edecay = new Edecay(Period);
|
|
SourceName = Source.ToString();
|
|
_priceSelector = Source.GetPriceSelector();
|
|
base.OnInit();
|
|
}
|
|
|
|
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
|
protected override void OnUpdate(UpdateArgs args)
|
|
{
|
|
var item = HistoricalData[Count - 1, SeekOriginHistory.Begin];
|
|
TValue result = _edecay.Update(new TValue(item.TimeLeft.Ticks, _priceSelector(item)), isNew: args.IsNewBar());
|
|
Series.SetValue(result.Value, _edecay.IsHot, ShowColdValues);
|
|
}
|
|
}
|