public static DirectionalIndicatorPlus Create(int periods) { AverageDirectionalMovementPlus admPlus = AverageDirectionalMovementPlus.Create(periods); AverageTrueRange atr = AverageTrueRange.Create(periods); double Function(CandleTimeSeries series, DateTime instant) { return(admPlus[series, instant].DivideBy(atr[series, instant])); } DirectionalIndicatorPlus result = new DirectionalIndicatorPlus(Function); return(result); }
public static AverageDirectionalMovementPlus Create( int periods) { DirectionalMovementPlus dmPlus = DirectionalMovementPlus.Create( ); double Function(CandleTimeSeries series, DateTime instant) { Candle candle = series[instant]; int index = series.GetIndex(candle); Candle[] candles = index.GetIntegersTo(Math.Max(1, index - periods)) .Select(idx => series[idx]) .ToArray( ); double ema = candles .WeightedAverage((cdl, idx) => dmPlus[series, cdl.Start], (cdl, idx) => candles.Length - idx); return(ema); } AverageDirectionalMovementPlus plus = new AverageDirectionalMovementPlus(Function); return(plus); }