Example #1
0
        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);
        }