public Tendency Classify(DateTime day, CandleTimeSeries series)
        {
            AverageDirectionalMovementIndex adx = AverageDirectionalMovementIndex.Create(directionalIndexPeriod, averagePeriod);
            double   adxValue    = adx.GetValueAt(series, day.Date);
            double   adxSlope    = 0;
            DateTime previousDay = day.Date.Subtract(TimeSpan.FromDays(1));
            bool     containsPreviousDayCandle = series.ContainsCandleAt(previousDay);

            if (containsPreviousDayCandle)
            {
                double previousDayAdxValue = adx.GetValueAt(series, previousDay);
                adxSlope = (adxValue - previousDayAdxValue) / 1;
            }
            DirectionalMovementPlus diPlus   = DirectionalMovementPlus.Create();
            double diPlusValue               = diPlus.GetValueAt(series, day.Date);
            DirectionalMovementMinus diMinus = DirectionalMovementMinus.Create();
            double diMinusValue              = diMinus.GetValueAt(series, day.Date);

            if (adxValue >= adxMinimumValue &&
                adxSlope >= 0)
            {
                return(diPlusValue > diMinusValue
                    ? Tendency.Up
                    : Tendency.Down);
            }
            return(Tendency.Range);
        }
 /// <summary>
 /// Resets this indicator to its initial state
 /// </summary>
 public override void Reset()
 {
     base.Reset();
     TrueRange.Reset();
     DirectionalMovementPlus.Reset();
     DirectionalMovementMinus.Reset();
     SmoothedTrueRange.Reset();
     SmoothedDirectionalMovementMinus.Reset();
     SmoothedDirectionalMovementPlus.Reset();
     PositiveDirectionalIndex.Reset();
     NegativeDirectionalIndex.Reset();
 }
Exemplo n.º 3
0
        /// <summary>
        /// Computes the next value of this indicator from the given state
        /// </summary>
        /// <param name="input">The input given to the indicator</param>
        /// <returns>A new value for this indicator</returns>
        protected override decimal ComputeNextValue(IBaseDataBar input)
        {
            TrueRange.Update(input);
            DirectionalMovementPlus.Update(input);
            DirectionalMovementMinus.Update(input);
            SmoothedTrueRange.Update(Current);
            SmoothedDirectionalMovementMinus.Update(Current);
            SmoothedDirectionalMovementPlus.Update(Current);
            if (_previousInput != null)
            {
                PositiveDirectionalIndex.Update(Current);
                NegativeDirectionalIndex.Update(Current);
            }
            var diff  = Math.Abs(PositiveDirectionalIndex - NegativeDirectionalIndex);
            var sum   = PositiveDirectionalIndex + NegativeDirectionalIndex;
            var value = sum == 0 ? 50 : ((_period - 1) * Current.Value + 100 * diff / sum) / _period;

            _previousInput = input;
            return(value);
        }