public static DirectionalMovementIndex Create(int periods) { DirectionalIndicatorPlus diPlus = DirectionalIndicatorPlus.Create(periods); DirectionalIndicatorMinus diMinus = DirectionalIndicatorMinus.Create(periods); double Function(CandleTimeSeries series, DateTime instant) { double diDiff = Math.Abs(diPlus[series, instant] - diMinus[series, instant]); double diSum = diPlus[series, instant] + diMinus[series, instant]; double dx = diDiff.DivideBy(diSum); return(dx); } DirectionalMovementIndex index = new DirectionalMovementIndex(Function); return(index); }
public static AverageDirectionalMovementIndex Create( int periods, int smoothingPeriods) { DirectionalMovementIndex dmi = DirectionalMovementIndex.Create(periods); double Function(CandleTimeSeries series, DateTime instant) { Candle candle = series[instant]; int index = series.GetIndex(candle); Candle[] candles = index.GetIntegersTo(Math.Max(1, index - smoothingPeriods)) .Select(idx => series[idx]) .ToArray(); double ema = candles .WeightedAverage((cdl, idx) => dmi[series, cdl.Start], (cdl, idx) => candles.Length - idx); return(ema); } AverageDirectionalMovementIndex plus = new AverageDirectionalMovementIndex(Function); return(plus); }