Module backtrader.indicators.directionalmove

Expand source code
#!/usr/bin/env python
# -*- coding: utf-8; py-indent-offset:4 -*-
###############################################################################
#
# Copyright (C) 2015-2023 Daniel Rodriguez
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
#
###############################################################################
from __future__ import (absolute_import, division, print_function,
                        unicode_literals)

from . import Indicator, And, If, MovAv, ATR


class UpMove(Indicator):
    '''
    Defined by J. Welles Wilder, Jr. in 1978 in his book *"New Concepts in
    Technical Trading Systems"* as part of the Directional Move System to
    calculate Directional Indicators.

    Positive if the given data has moved higher than the previous day

    Formula:
      - upmove = data - data(-1)

    See:
      - https://en.wikipedia.org/wiki/Average_directional_movement_index
    '''
    lines = ('upmove',)

    def __init__(self):
        self.lines.upmove = self.data - self.data(-1)
        super(UpMove, self).__init__()


class DownMove(Indicator):
    '''
    Defined by J. Welles Wilder, Jr. in 1978 in his book *"New Concepts in
    Technical Trading Systems"* as part of the Directional Move System to
    calculate Directional Indicators.

    Positive if the given data has moved lower than the previous day

    Formula:
      - downmove = data(-1) - data

    See:
      - https://en.wikipedia.org/wiki/Average_directional_movement_index
    '''
    lines = ('downmove',)

    def __init__(self):
        self.lines.downmove = self.data(-1) - self.data
        super(DownMove, self).__init__()


class _DirectionalIndicator(Indicator):
    '''
    This class serves as the root base class for all "Directional Movement
    System" related indicators, given that the calculations are first common
    and then derived from the common calculations.

    It can calculate the +DI and -DI values (using kwargs as the hint as to
    what to calculate) but doesn't assign them to lines. This is left for
    sublcases of this class.
    '''
    params = (('period', 14), ('movav', MovAv.Smoothed))

    plotlines = dict(plusDI=dict(_name='+DI'), minusDI=dict(_name='-DI'))

    def _plotlabel(self):
        plabels = [self.p.period]
        plabels += [self.p.movav] * self.p.notdefault('movav')
        return plabels

    def __init__(self, _plus=True, _minus=True):
        atr = ATR(self.data, period=self.p.period, movav=self.p.movav)

        upmove = self.data.high - self.data.high(-1)
        downmove = self.data.low(-1) - self.data.low

        if _plus:
            plus = And(upmove > downmove, upmove > 0.0)
            plusDM = If(plus, upmove, 0.0)
            plusDMav = self.p.movav(plusDM, period=self.p.period)

            self.DIplus = 100.0 * plusDMav / atr

        if _minus:
            minus = And(downmove > upmove, downmove > 0.0)
            minusDM = If(minus, downmove, 0.0)
            minusDMav = self.p.movav(minusDM, period=self.p.period)

            self.DIminus = 100.0 * minusDMav / atr

        super(_DirectionalIndicator, self).__init__()


class DirectionalIndicator(_DirectionalIndicator):
    '''
    Defined by J. Welles Wilder, Jr. in 1978 in his book *"New Concepts in
    Technical Trading Systems"*.

    Intended to measure trend strength

    This indicator shows +DI, -DI:
      - Use PlusDirectionalIndicator (PlusDI) to get +DI
      - Use MinusDirectionalIndicator (MinusDI) to get -DI
      - Use AverageDirectionalIndex (ADX) to get ADX
      - Use AverageDirectionalIndexRating (ADXR) to get ADX, ADXR
      - Use DirectionalMovementIndex (DMI) to get ADX, +DI, -DI
      - Use DirectionalMovement (DM) to get ADX, ADXR, +DI, -DI

    Formula:
      - upmove = high - high(-1)
      - downmove = low(-1) - low
      - +dm = upmove if upmove > downmove and upmove > 0 else 0
      - -dm = downmove if downmove > upmove and downmove > 0 else 0
      - +di = 100 * MovingAverage(+dm, period) / atr(period)
      - -di = 100 * MovingAverage(-dm, period) / atr(period)

    The moving average used is the one originally defined by Wilder,
    the SmoothedMovingAverage

    See:
      - https://en.wikipedia.org/wiki/Average_directional_movement_index
    '''
    alias = ('DI',)
    lines = ('plusDI', 'minusDI',)

    def __init__(self):
        super(DirectionalIndicator, self).__init__()

        self.lines.plusDI = self.DIplus
        self.lines.minusDI = self.DIminus


class PlusDirectionalIndicator(_DirectionalIndicator):
    '''
    Defined by J. Welles Wilder, Jr. in 1978 in his book *"New Concepts in
    Technical Trading Systems"*.

    Intended to measure trend strength

    This indicator shows +DI:
      - Use MinusDirectionalIndicator (MinusDI) to get -DI
      - Use Directional Indicator (DI) to get +DI, -DI
      - Use AverageDirectionalIndex (ADX) to get ADX
      - Use AverageDirectionalIndexRating (ADXR) to get ADX, ADXR
      - Use DirectionalMovementIndex (DMI) to get ADX, +DI, -DI
      - Use DirectionalMovement (DM) to get ADX, ADXR, +DI, -DI

    Formula:
      - upmove = high - high(-1)
      - downmove = low(-1) - low
      - +dm = upmove if upmove > downmove and upmove > 0 else 0
      - +di = 100 * MovingAverage(+dm, period) / atr(period)

    The moving average used is the one originally defined by Wilder,
    the SmoothedMovingAverage

    See:
      - https://en.wikipedia.org/wiki/Average_directional_movement_index
    '''
    alias = (('PlusDI', '+DI'),)
    lines = ('plusDI',)

    plotinfo = dict(plotname='+DirectionalIndicator')

    def __init__(self):
        super(PlusDirectionalIndicator, self).__init__(_minus=False)

        self.lines.plusDI = self.DIplus


class MinusDirectionalIndicator(_DirectionalIndicator):
    '''
    Defined by J. Welles Wilder, Jr. in 1978 in his book *"New Concepts in
    Technical Trading Systems"*.

    Intended to measure trend strength

    This indicator shows -DI:
      - Use PlusDirectionalIndicator (PlusDI) to get +DI
      - Use Directional Indicator (DI) to get +DI, -DI
      - Use AverageDirectionalIndex (ADX) to get ADX
      - Use AverageDirectionalIndexRating (ADXR) to get ADX, ADXR
      - Use DirectionalMovementIndex (DMI) to get ADX, +DI, -DI
      - Use DirectionalMovement (DM) to get ADX, ADXR, +DI, -DI

    Formula:
      - upmove = high - high(-1)
      - downmove = low(-1) - low
      - -dm = downmove if downmove > upmove and downmove > 0 else 0
      - -di = 100 * MovingAverage(-dm, period) / atr(period)

    The moving average used is the one originally defined by Wilder,
    the SmoothedMovingAverage

    See:
      - https://en.wikipedia.org/wiki/Average_directional_movement_index
    '''
    alias = (('MinusDI', '-DI'),)
    lines = ('minusDI',)

    plotinfo = dict(plotname='-DirectionalIndicator')

    def __init__(self):
        super(MinusDirectionalIndicator, self).__init__(_plus=False)

        self.lines.minusDI = self.DIminus


class AverageDirectionalMovementIndex(_DirectionalIndicator):
    '''
    Defined by J. Welles Wilder, Jr. in 1978 in his book *"New Concepts in
    Technical Trading Systems"*.

    Intended to measure trend strength

    This indicator only shows ADX:
      - Use PlusDirectionalIndicator (PlusDI) to get +DI
      - Use MinusDirectionalIndicator (MinusDI) to get -DI
      - Use Directional Indicator (DI) to get +DI, -DI
      - Use AverageDirectionalIndexRating (ADXR) to get ADX, ADXR
      - Use DirectionalMovementIndex (DMI) to get ADX, +DI, -DI
      - Use DirectionalMovement (DM) to get ADX, ADXR, +DI, -DI

    Formula:
      - upmove = high - high(-1)
      - downmove = low(-1) - low
      - +dm = upmove if upmove > downmove and upmove > 0 else 0
      - -dm = downmove if downmove > upmove and downmove > 0 else 0
      - +di = 100 * MovingAverage(+dm, period) / atr(period)
      - -di = 100 * MovingAverage(-dm, period) / atr(period)
      - dx = 100 * abs(+di - -di) / (+di + -di)
      - adx = MovingAverage(dx, period)

    The moving average used is the one originally defined by Wilder,
    the SmoothedMovingAverage

    See:
      - https://en.wikipedia.org/wiki/Average_directional_movement_index
    '''
    alias = ('ADX',)

    lines = ('adx',)

    plotlines = dict(adx=dict(_name='ADX'))

    def __init__(self):
        super(AverageDirectionalMovementIndex, self).__init__()

        dx = abs(self.DIplus - self.DIminus) / (self.DIplus + self.DIminus)
        self.lines.adx = 100.0 * self.p.movav(dx, period=self.p.period)


class AverageDirectionalMovementIndexRating(AverageDirectionalMovementIndex):
    '''
    Defined by J. Welles Wilder, Jr. in 1978 in his book *"New Concepts in
    Technical Trading Systems"*.

    Intended to measure trend strength.

    ADXR is the average of ADX with a value period bars ago

    This indicator shows the ADX and ADXR:
      - Use PlusDirectionalIndicator (PlusDI) to get +DI
      - Use MinusDirectionalIndicator (MinusDI) to get -DI
      - Use Directional Indicator (DI) to get +DI, -DI
      - Use AverageDirectionalIndex (ADX) to get ADX
      - Use DirectionalMovementIndex (DMI) to get ADX, +DI, -DI
      - Use DirectionalMovement (DM) to get ADX, ADXR, +DI, -DI

    Formula:
      - upmove = high - high(-1)
      - downmove = low(-1) - low
      - +dm = upmove if upmove > downmove and upmove > 0 else 0
      - -dm = downmove if downmove > upmove and downmove > 0 else 0
      - +di = 100 * MovingAverage(+dm, period) / atr(period)
      - -di = 100 * MovingAverage(-dm, period) / atr(period)
      - dx = 100 * abs(+di - -di) / (+di + -di)
      - adx = MovingAverage(dx, period)
      - adxr = (adx + adx(-period)) / 2

    The moving average used is the one originally defined by Wilder,
    the SmoothedMovingAverage

    See:
      - https://en.wikipedia.org/wiki/Average_directional_movement_index
    '''
    alias = ('ADXR',)

    lines = ('adxr',)
    plotlines = dict(adxr=dict(_name='ADXR'))

    def __init__(self):
        super(AverageDirectionalMovementIndexRating, self).__init__()

        self.lines.adxr = (self.l.adx + self.l.adx(-self.p.period)) / 2.0


class DirectionalMovementIndex(AverageDirectionalMovementIndex,
                               DirectionalIndicator):
    '''
    Defined by J. Welles Wilder, Jr. in 1978 in his book *"New Concepts in
    Technical Trading Systems"*.

    Intended to measure trend strength

    This indicator shows the ADX, +DI, -DI:
      - Use PlusDirectionalIndicator (PlusDI) to get +DI
      - Use MinusDirectionalIndicator (MinusDI) to get -DI
      - Use Directional Indicator (DI) to get +DI, -DI
      - Use AverageDirectionalIndex (ADX) to get ADX
      - Use AverageDirectionalIndexRating (ADXRating) to get ADX, ADXR
      - Use DirectionalMovement (DM) to get ADX, ADXR, +DI, -DI

    Formula:
      - upmove = high - high(-1)
      - downmove = low(-1) - low
      - +dm = upmove if upmove > downmove and upmove > 0 else 0
      - -dm = downmove if downmove > upmove and downmove > 0 else 0
      - +di = 100 * MovingAverage(+dm, period) / atr(period)
      - -di = 100 * MovingAverage(-dm, period) / atr(period)
      - dx = 100 * abs(+di - -di) / (+di + -di)
      - adx = MovingAverage(dx, period)

    The moving average used is the one originally defined by Wilder,
    the SmoothedMovingAverage

    See:
      - https://en.wikipedia.org/wiki/Average_directional_movement_index
    '''
    alias = ('DMI',)


class DirectionalMovement(AverageDirectionalMovementIndexRating,
                          DirectionalIndicator):
    '''
    Defined by J. Welles Wilder, Jr. in 1978 in his book *"New Concepts in
    Technical Trading Systems"*.

    Intended to measure trend strength

    This indicator shows ADX, ADXR, +DI, -DI.

      - Use PlusDirectionalIndicator (PlusDI) to get +DI
      - Use MinusDirectionalIndicator (MinusDI) to get -DI
      - Use Directional Indicator (DI) to get +DI, -DI
      - Use AverageDirectionalIndex (ADX) to get ADX
      - Use AverageDirectionalIndexRating (ADXR) to get ADX, ADXR
      - Use DirectionalMovementIndex (DMI) to get ADX, +DI, -DI

    Formula:
      - upmove = high - high(-1)
      - downmove = low(-1) - low
      - +dm = upmove if upmove > downmove and upmove > 0 else 0
      - -dm = downmove if downmove > upmove and downmove > 0 else 0
      - +di = 100 * MovingAverage(+dm, period) / atr(period)
      - -di = 100 * MovingAverage(-dm, period) / atr(period)
      - dx = 100 * abs(+di - -di) / (+di + -di)
      - adx = MovingAverage(dx, period)

    The moving average used is the one originally defined by Wilder,
    the SmoothedMovingAverage

    See:
      - https://en.wikipedia.org/wiki/Average_directional_movement_index
    '''
    alias = ('DM',)

Classes

class ADX

Defined by J. Welles Wilder, Jr. in 1978 in his book "New Concepts in Technical Trading Systems".

Intended to measure trend strength

This indicator only shows ADX: - Use PlusDirectionalIndicator (PlusDI) to get +DI - Use MinusDirectionalIndicator (MinusDI) to get -DI - Use Directional Indicator (DI) to get +DI, -DI - Use AverageDirectionalIndexRating (ADXR) to get ADX, ADXR - Use DirectionalMovementIndex (DMI) to get ADX, +DI, -DI - Use DirectionalMovement (DM) to get ADX, ADXR, +DI, -DI

Formula

  • upmove = high - high(-1)
  • downmove = low(-1) - low
  • +dm = upmove if upmove > downmove and upmove > 0 else 0
  • -dm = downmove if downmove > upmove and downmove > 0 else 0
  • +di = 100 * MovingAverage(+dm, period) / atr(period)
  • -di = 100 * MovingAverage(-dm, period) / atr(period)
  • dx = 100 * abs(+di - -di) / (+di + -di)
  • adx = MovingAverage(dx, period)

The moving average used is the one originally defined by Wilder, the SmoothedMovingAverage

See

Ancestors

Class variables

var alias
var aliased
var frompackages
var linealias
var packages
var params
var plotinfo
var plotlines

Inherited members

class ADXR

Defined by J. Welles Wilder, Jr. in 1978 in his book "New Concepts in Technical Trading Systems".

Intended to measure trend strength.

ADXR is the average of ADX with a value period bars ago

This indicator shows the ADX and ADXR: - Use PlusDirectionalIndicator (PlusDI) to get +DI - Use MinusDirectionalIndicator (MinusDI) to get -DI - Use Directional Indicator (DI) to get +DI, -DI - Use AverageDirectionalIndex (ADX) to get ADX - Use DirectionalMovementIndex (DMI) to get ADX, +DI, -DI - Use DirectionalMovement (DM) to get ADX, ADXR, +DI, -DI

Formula

  • upmove = high - high(-1)
  • downmove = low(-1) - low
  • +dm = upmove if upmove > downmove and upmove > 0 else 0
  • -dm = downmove if downmove > upmove and downmove > 0 else 0
  • +di = 100 * MovingAverage(+dm, period) / atr(period)
  • -di = 100 * MovingAverage(-dm, period) / atr(period)
  • dx = 100 * abs(+di - -di) / (+di + -di)
  • adx = MovingAverage(dx, period)
  • adxr = (adx + adx(-period)) / 2

The moving average used is the one originally defined by Wilder, the SmoothedMovingAverage

See

Ancestors

Class variables

var alias
var aliased
var frompackages
var linealias
var packages
var params
var plotinfo
var plotlines

Inherited members

class AverageDirectionalMovementIndex

Defined by J. Welles Wilder, Jr. in 1978 in his book "New Concepts in Technical Trading Systems".

Intended to measure trend strength

This indicator only shows ADX: - Use PlusDirectionalIndicator (PlusDI) to get +DI - Use MinusDirectionalIndicator (MinusDI) to get -DI - Use Directional Indicator (DI) to get +DI, -DI - Use AverageDirectionalIndexRating (ADXR) to get ADX, ADXR - Use DirectionalMovementIndex (DMI) to get ADX, +DI, -DI - Use DirectionalMovement (DM) to get ADX, ADXR, +DI, -DI

Formula

  • upmove = high - high(-1)
  • downmove = low(-1) - low
  • +dm = upmove if upmove > downmove and upmove > 0 else 0
  • -dm = downmove if downmove > upmove and downmove > 0 else 0
  • +di = 100 * MovingAverage(+dm, period) / atr(period)
  • -di = 100 * MovingAverage(-dm, period) / atr(period)
  • dx = 100 * abs(+di - -di) / (+di + -di)
  • adx = MovingAverage(dx, period)

The moving average used is the one originally defined by Wilder, the SmoothedMovingAverage

See

Expand source code
class AverageDirectionalMovementIndex(_DirectionalIndicator):
    '''
    Defined by J. Welles Wilder, Jr. in 1978 in his book *"New Concepts in
    Technical Trading Systems"*.

    Intended to measure trend strength

    This indicator only shows ADX:
      - Use PlusDirectionalIndicator (PlusDI) to get +DI
      - Use MinusDirectionalIndicator (MinusDI) to get -DI
      - Use Directional Indicator (DI) to get +DI, -DI
      - Use AverageDirectionalIndexRating (ADXR) to get ADX, ADXR
      - Use DirectionalMovementIndex (DMI) to get ADX, +DI, -DI
      - Use DirectionalMovement (DM) to get ADX, ADXR, +DI, -DI

    Formula:
      - upmove = high - high(-1)
      - downmove = low(-1) - low
      - +dm = upmove if upmove > downmove and upmove > 0 else 0
      - -dm = downmove if downmove > upmove and downmove > 0 else 0
      - +di = 100 * MovingAverage(+dm, period) / atr(period)
      - -di = 100 * MovingAverage(-dm, period) / atr(period)
      - dx = 100 * abs(+di - -di) / (+di + -di)
      - adx = MovingAverage(dx, period)

    The moving average used is the one originally defined by Wilder,
    the SmoothedMovingAverage

    See:
      - https://en.wikipedia.org/wiki/Average_directional_movement_index
    '''
    alias = ('ADX',)

    lines = ('adx',)

    plotlines = dict(adx=dict(_name='ADX'))

    def __init__(self):
        super(AverageDirectionalMovementIndex, self).__init__()

        dx = abs(self.DIplus - self.DIminus) / (self.DIplus + self.DIminus)
        self.lines.adx = 100.0 * self.p.movav(dx, period=self.p.period)

Ancestors

Subclasses

Class variables

var alias
var aliased
var frompackages
var linealias
var packages
var params
var plotinfo
var plotlines

Inherited members

class AverageDirectionalMovementIndexRating

Defined by J. Welles Wilder, Jr. in 1978 in his book "New Concepts in Technical Trading Systems".

Intended to measure trend strength.

ADXR is the average of ADX with a value period bars ago

This indicator shows the ADX and ADXR: - Use PlusDirectionalIndicator (PlusDI) to get +DI - Use MinusDirectionalIndicator (MinusDI) to get -DI - Use Directional Indicator (DI) to get +DI, -DI - Use AverageDirectionalIndex (ADX) to get ADX - Use DirectionalMovementIndex (DMI) to get ADX, +DI, -DI - Use DirectionalMovement (DM) to get ADX, ADXR, +DI, -DI

Formula

  • upmove = high - high(-1)
  • downmove = low(-1) - low
  • +dm = upmove if upmove > downmove and upmove > 0 else 0
  • -dm = downmove if downmove > upmove and downmove > 0 else 0
  • +di = 100 * MovingAverage(+dm, period) / atr(period)
  • -di = 100 * MovingAverage(-dm, period) / atr(period)
  • dx = 100 * abs(+di - -di) / (+di + -di)
  • adx = MovingAverage(dx, period)
  • adxr = (adx + adx(-period)) / 2

The moving average used is the one originally defined by Wilder, the SmoothedMovingAverage

See

Expand source code
class AverageDirectionalMovementIndexRating(AverageDirectionalMovementIndex):
    '''
    Defined by J. Welles Wilder, Jr. in 1978 in his book *"New Concepts in
    Technical Trading Systems"*.

    Intended to measure trend strength.

    ADXR is the average of ADX with a value period bars ago

    This indicator shows the ADX and ADXR:
      - Use PlusDirectionalIndicator (PlusDI) to get +DI
      - Use MinusDirectionalIndicator (MinusDI) to get -DI
      - Use Directional Indicator (DI) to get +DI, -DI
      - Use AverageDirectionalIndex (ADX) to get ADX
      - Use DirectionalMovementIndex (DMI) to get ADX, +DI, -DI
      - Use DirectionalMovement (DM) to get ADX, ADXR, +DI, -DI

    Formula:
      - upmove = high - high(-1)
      - downmove = low(-1) - low
      - +dm = upmove if upmove > downmove and upmove > 0 else 0
      - -dm = downmove if downmove > upmove and downmove > 0 else 0
      - +di = 100 * MovingAverage(+dm, period) / atr(period)
      - -di = 100 * MovingAverage(-dm, period) / atr(period)
      - dx = 100 * abs(+di - -di) / (+di + -di)
      - adx = MovingAverage(dx, period)
      - adxr = (adx + adx(-period)) / 2

    The moving average used is the one originally defined by Wilder,
    the SmoothedMovingAverage

    See:
      - https://en.wikipedia.org/wiki/Average_directional_movement_index
    '''
    alias = ('ADXR',)

    lines = ('adxr',)
    plotlines = dict(adxr=dict(_name='ADXR'))

    def __init__(self):
        super(AverageDirectionalMovementIndexRating, self).__init__()

        self.lines.adxr = (self.l.adx + self.l.adx(-self.p.period)) / 2.0

Ancestors

Subclasses

Class variables

var alias
var aliased
var frompackages
var linealias
var packages
var params
var plotinfo
var plotlines

Inherited members

class DI

Defined by J. Welles Wilder, Jr. in 1978 in his book "New Concepts in Technical Trading Systems".

Intended to measure trend strength

This indicator shows +DI, -DI: - Use PlusDirectionalIndicator (PlusDI) to get +DI - Use MinusDirectionalIndicator (MinusDI) to get -DI - Use AverageDirectionalIndex (ADX) to get ADX - Use AverageDirectionalIndexRating (ADXR) to get ADX, ADXR - Use DirectionalMovementIndex (DMI) to get ADX, +DI, -DI - Use DirectionalMovement (DM) to get ADX, ADXR, +DI, -DI

Formula

  • upmove = high - high(-1)
  • downmove = low(-1) - low
  • +dm = upmove if upmove > downmove and upmove > 0 else 0
  • -dm = downmove if downmove > upmove and downmove > 0 else 0
  • +di = 100 * MovingAverage(+dm, period) / atr(period)
  • -di = 100 * MovingAverage(-dm, period) / atr(period)

The moving average used is the one originally defined by Wilder, the SmoothedMovingAverage

See

Ancestors

Class variables

var alias
var aliased
var frompackages
var linealias
var packages
var params
var plotinfo
var plotlines

Inherited members

class DM

Defined by J. Welles Wilder, Jr. in 1978 in his book "New Concepts in Technical Trading Systems".

Intended to measure trend strength

This indicator shows ADX, ADXR, +DI, -DI.

  • Use PlusDirectionalIndicator (PlusDI) to get +DI
  • Use MinusDirectionalIndicator (MinusDI) to get -DI
  • Use Directional Indicator (DI) to get +DI, -DI
  • Use AverageDirectionalIndex (ADX) to get ADX
  • Use AverageDirectionalIndexRating (ADXR) to get ADX, ADXR
  • Use DirectionalMovementIndex (DMI) to get ADX, +DI, -DI

Formula

  • upmove = high - high(-1)
  • downmove = low(-1) - low
  • +dm = upmove if upmove > downmove and upmove > 0 else 0
  • -dm = downmove if downmove > upmove and downmove > 0 else 0
  • +di = 100 * MovingAverage(+dm, period) / atr(period)
  • -di = 100 * MovingAverage(-dm, period) / atr(period)
  • dx = 100 * abs(+di - -di) / (+di + -di)
  • adx = MovingAverage(dx, period)

The moving average used is the one originally defined by Wilder, the SmoothedMovingAverage

See

Ancestors

Class variables

var alias
var aliased
var frompackages
var linealias
var packages
var params
var plotinfo
var plotlines

Inherited members

class DMI

Defined by J. Welles Wilder, Jr. in 1978 in his book "New Concepts in Technical Trading Systems".

Intended to measure trend strength

This indicator shows the ADX, +DI, -DI: - Use PlusDirectionalIndicator (PlusDI) to get +DI - Use MinusDirectionalIndicator (MinusDI) to get -DI - Use Directional Indicator (DI) to get +DI, -DI - Use AverageDirectionalIndex (ADX) to get ADX - Use AverageDirectionalIndexRating (ADXRating) to get ADX, ADXR - Use DirectionalMovement (DM) to get ADX, ADXR, +DI, -DI

Formula

  • upmove = high - high(-1)
  • downmove = low(-1) - low
  • +dm = upmove if upmove > downmove and upmove > 0 else 0
  • -dm = downmove if downmove > upmove and downmove > 0 else 0
  • +di = 100 * MovingAverage(+dm, period) / atr(period)
  • -di = 100 * MovingAverage(-dm, period) / atr(period)
  • dx = 100 * abs(+di - -di) / (+di + -di)
  • adx = MovingAverage(dx, period)

The moving average used is the one originally defined by Wilder, the SmoothedMovingAverage

See

Ancestors

Class variables

var alias
var aliased
var frompackages
var linealias
var packages
var params
var plotinfo
var plotlines

Inherited members

class DirectionalIndicator

Defined by J. Welles Wilder, Jr. in 1978 in his book "New Concepts in Technical Trading Systems".

Intended to measure trend strength

This indicator shows +DI, -DI: - Use PlusDirectionalIndicator (PlusDI) to get +DI - Use MinusDirectionalIndicator (MinusDI) to get -DI - Use AverageDirectionalIndex (ADX) to get ADX - Use AverageDirectionalIndexRating (ADXR) to get ADX, ADXR - Use DirectionalMovementIndex (DMI) to get ADX, +DI, -DI - Use DirectionalMovement (DM) to get ADX, ADXR, +DI, -DI

Formula

  • upmove = high - high(-1)
  • downmove = low(-1) - low
  • +dm = upmove if upmove > downmove and upmove > 0 else 0
  • -dm = downmove if downmove > upmove and downmove > 0 else 0
  • +di = 100 * MovingAverage(+dm, period) / atr(period)
  • -di = 100 * MovingAverage(-dm, period) / atr(period)

The moving average used is the one originally defined by Wilder, the SmoothedMovingAverage

See

Expand source code
class DirectionalIndicator(_DirectionalIndicator):
    '''
    Defined by J. Welles Wilder, Jr. in 1978 in his book *"New Concepts in
    Technical Trading Systems"*.

    Intended to measure trend strength

    This indicator shows +DI, -DI:
      - Use PlusDirectionalIndicator (PlusDI) to get +DI
      - Use MinusDirectionalIndicator (MinusDI) to get -DI
      - Use AverageDirectionalIndex (ADX) to get ADX
      - Use AverageDirectionalIndexRating (ADXR) to get ADX, ADXR
      - Use DirectionalMovementIndex (DMI) to get ADX, +DI, -DI
      - Use DirectionalMovement (DM) to get ADX, ADXR, +DI, -DI

    Formula:
      - upmove = high - high(-1)
      - downmove = low(-1) - low
      - +dm = upmove if upmove > downmove and upmove > 0 else 0
      - -dm = downmove if downmove > upmove and downmove > 0 else 0
      - +di = 100 * MovingAverage(+dm, period) / atr(period)
      - -di = 100 * MovingAverage(-dm, period) / atr(period)

    The moving average used is the one originally defined by Wilder,
    the SmoothedMovingAverage

    See:
      - https://en.wikipedia.org/wiki/Average_directional_movement_index
    '''
    alias = ('DI',)
    lines = ('plusDI', 'minusDI',)

    def __init__(self):
        super(DirectionalIndicator, self).__init__()

        self.lines.plusDI = self.DIplus
        self.lines.minusDI = self.DIminus

Ancestors

Subclasses

Class variables

var alias
var aliased
var frompackages
var linealias
var packages
var params
var plotinfo
var plotlines

Inherited members

class DirectionalMovement

Defined by J. Welles Wilder, Jr. in 1978 in his book "New Concepts in Technical Trading Systems".

Intended to measure trend strength

This indicator shows ADX, ADXR, +DI, -DI.

  • Use PlusDirectionalIndicator (PlusDI) to get +DI
  • Use MinusDirectionalIndicator (MinusDI) to get -DI
  • Use Directional Indicator (DI) to get +DI, -DI
  • Use AverageDirectionalIndex (ADX) to get ADX
  • Use AverageDirectionalIndexRating (ADXR) to get ADX, ADXR
  • Use DirectionalMovementIndex (DMI) to get ADX, +DI, -DI

Formula

  • upmove = high - high(-1)
  • downmove = low(-1) - low
  • +dm = upmove if upmove > downmove and upmove > 0 else 0
  • -dm = downmove if downmove > upmove and downmove > 0 else 0
  • +di = 100 * MovingAverage(+dm, period) / atr(period)
  • -di = 100 * MovingAverage(-dm, period) / atr(period)
  • dx = 100 * abs(+di - -di) / (+di + -di)
  • adx = MovingAverage(dx, period)

The moving average used is the one originally defined by Wilder, the SmoothedMovingAverage

See

Expand source code
class DirectionalMovement(AverageDirectionalMovementIndexRating,
                          DirectionalIndicator):
    '''
    Defined by J. Welles Wilder, Jr. in 1978 in his book *"New Concepts in
    Technical Trading Systems"*.

    Intended to measure trend strength

    This indicator shows ADX, ADXR, +DI, -DI.

      - Use PlusDirectionalIndicator (PlusDI) to get +DI
      - Use MinusDirectionalIndicator (MinusDI) to get -DI
      - Use Directional Indicator (DI) to get +DI, -DI
      - Use AverageDirectionalIndex (ADX) to get ADX
      - Use AverageDirectionalIndexRating (ADXR) to get ADX, ADXR
      - Use DirectionalMovementIndex (DMI) to get ADX, +DI, -DI

    Formula:
      - upmove = high - high(-1)
      - downmove = low(-1) - low
      - +dm = upmove if upmove > downmove and upmove > 0 else 0
      - -dm = downmove if downmove > upmove and downmove > 0 else 0
      - +di = 100 * MovingAverage(+dm, period) / atr(period)
      - -di = 100 * MovingAverage(-dm, period) / atr(period)
      - dx = 100 * abs(+di - -di) / (+di + -di)
      - adx = MovingAverage(dx, period)

    The moving average used is the one originally defined by Wilder,
    the SmoothedMovingAverage

    See:
      - https://en.wikipedia.org/wiki/Average_directional_movement_index
    '''
    alias = ('DM',)

Ancestors

Subclasses

Class variables

var alias
var aliased
var frompackages
var linealias
var packages
var params
var plotinfo
var plotlines

Inherited members

class DirectionalMovementIndex

Defined by J. Welles Wilder, Jr. in 1978 in his book "New Concepts in Technical Trading Systems".

Intended to measure trend strength

This indicator shows the ADX, +DI, -DI: - Use PlusDirectionalIndicator (PlusDI) to get +DI - Use MinusDirectionalIndicator (MinusDI) to get -DI - Use Directional Indicator (DI) to get +DI, -DI - Use AverageDirectionalIndex (ADX) to get ADX - Use AverageDirectionalIndexRating (ADXRating) to get ADX, ADXR - Use DirectionalMovement (DM) to get ADX, ADXR, +DI, -DI

Formula

  • upmove = high - high(-1)
  • downmove = low(-1) - low
  • +dm = upmove if upmove > downmove and upmove > 0 else 0
  • -dm = downmove if downmove > upmove and downmove > 0 else 0
  • +di = 100 * MovingAverage(+dm, period) / atr(period)
  • -di = 100 * MovingAverage(-dm, period) / atr(period)
  • dx = 100 * abs(+di - -di) / (+di + -di)
  • adx = MovingAverage(dx, period)

The moving average used is the one originally defined by Wilder, the SmoothedMovingAverage

See

Expand source code
class DirectionalMovementIndex(AverageDirectionalMovementIndex,
                               DirectionalIndicator):
    '''
    Defined by J. Welles Wilder, Jr. in 1978 in his book *"New Concepts in
    Technical Trading Systems"*.

    Intended to measure trend strength

    This indicator shows the ADX, +DI, -DI:
      - Use PlusDirectionalIndicator (PlusDI) to get +DI
      - Use MinusDirectionalIndicator (MinusDI) to get -DI
      - Use Directional Indicator (DI) to get +DI, -DI
      - Use AverageDirectionalIndex (ADX) to get ADX
      - Use AverageDirectionalIndexRating (ADXRating) to get ADX, ADXR
      - Use DirectionalMovement (DM) to get ADX, ADXR, +DI, -DI

    Formula:
      - upmove = high - high(-1)
      - downmove = low(-1) - low
      - +dm = upmove if upmove > downmove and upmove > 0 else 0
      - -dm = downmove if downmove > upmove and downmove > 0 else 0
      - +di = 100 * MovingAverage(+dm, period) / atr(period)
      - -di = 100 * MovingAverage(-dm, period) / atr(period)
      - dx = 100 * abs(+di - -di) / (+di + -di)
      - adx = MovingAverage(dx, period)

    The moving average used is the one originally defined by Wilder,
    the SmoothedMovingAverage

    See:
      - https://en.wikipedia.org/wiki/Average_directional_movement_index
    '''
    alias = ('DMI',)

Ancestors

Subclasses

Class variables

var alias
var aliased
var frompackages
var linealias
var packages
var params
var plotinfo
var plotlines

Inherited members

class DownMove

Defined by J. Welles Wilder, Jr. in 1978 in his book "New Concepts in Technical Trading Systems" as part of the Directional Move System to calculate Directional Indicators.

Positive if the given data has moved lower than the previous day

Formula

  • downmove = data(-1) - data

See

Expand source code
class DownMove(Indicator):
    '''
    Defined by J. Welles Wilder, Jr. in 1978 in his book *"New Concepts in
    Technical Trading Systems"* as part of the Directional Move System to
    calculate Directional Indicators.

    Positive if the given data has moved lower than the previous day

    Formula:
      - downmove = data(-1) - data

    See:
      - https://en.wikipedia.org/wiki/Average_directional_movement_index
    '''
    lines = ('downmove',)

    def __init__(self):
        self.lines.downmove = self.data(-1) - self.data
        super(DownMove, self).__init__()

Ancestors

Class variables

var alias
var aliased
var frompackages
var linealias
var packages
var params
var plotinfo
var plotlines

Inherited members

class MinusDI

Defined by J. Welles Wilder, Jr. in 1978 in his book "New Concepts in Technical Trading Systems".

Intended to measure trend strength

This indicator shows -DI: - Use PlusDirectionalIndicator (PlusDI) to get +DI - Use Directional Indicator (DI) to get +DI, -DI - Use AverageDirectionalIndex (ADX) to get ADX - Use AverageDirectionalIndexRating (ADXR) to get ADX, ADXR - Use DirectionalMovementIndex (DMI) to get ADX, +DI, -DI - Use DirectionalMovement (DM) to get ADX, ADXR, +DI, -DI

Formula

  • upmove = high - high(-1)
  • downmove = low(-1) - low
  • -dm = downmove if downmove > upmove and downmove > 0 else 0
  • -di = 100 * MovingAverage(-dm, period) / atr(period)

The moving average used is the one originally defined by Wilder, the SmoothedMovingAverage

See

Ancestors

Class variables

var alias
var aliased
var frompackages
var linealias
var packages
var params
var plotinfo
var plotlines

Inherited members

class MinusDirectionalIndicator

Defined by J. Welles Wilder, Jr. in 1978 in his book "New Concepts in Technical Trading Systems".

Intended to measure trend strength

This indicator shows -DI: - Use PlusDirectionalIndicator (PlusDI) to get +DI - Use Directional Indicator (DI) to get +DI, -DI - Use AverageDirectionalIndex (ADX) to get ADX - Use AverageDirectionalIndexRating (ADXR) to get ADX, ADXR - Use DirectionalMovementIndex (DMI) to get ADX, +DI, -DI - Use DirectionalMovement (DM) to get ADX, ADXR, +DI, -DI

Formula

  • upmove = high - high(-1)
  • downmove = low(-1) - low
  • -dm = downmove if downmove > upmove and downmove > 0 else 0
  • -di = 100 * MovingAverage(-dm, period) / atr(period)

The moving average used is the one originally defined by Wilder, the SmoothedMovingAverage

See

Expand source code
class MinusDirectionalIndicator(_DirectionalIndicator):
    '''
    Defined by J. Welles Wilder, Jr. in 1978 in his book *"New Concepts in
    Technical Trading Systems"*.

    Intended to measure trend strength

    This indicator shows -DI:
      - Use PlusDirectionalIndicator (PlusDI) to get +DI
      - Use Directional Indicator (DI) to get +DI, -DI
      - Use AverageDirectionalIndex (ADX) to get ADX
      - Use AverageDirectionalIndexRating (ADXR) to get ADX, ADXR
      - Use DirectionalMovementIndex (DMI) to get ADX, +DI, -DI
      - Use DirectionalMovement (DM) to get ADX, ADXR, +DI, -DI

    Formula:
      - upmove = high - high(-1)
      - downmove = low(-1) - low
      - -dm = downmove if downmove > upmove and downmove > 0 else 0
      - -di = 100 * MovingAverage(-dm, period) / atr(period)

    The moving average used is the one originally defined by Wilder,
    the SmoothedMovingAverage

    See:
      - https://en.wikipedia.org/wiki/Average_directional_movement_index
    '''
    alias = (('MinusDI', '-DI'),)
    lines = ('minusDI',)

    plotinfo = dict(plotname='-DirectionalIndicator')

    def __init__(self):
        super(MinusDirectionalIndicator, self).__init__(_plus=False)

        self.lines.minusDI = self.DIminus

Ancestors

Subclasses

Class variables

var alias
var aliased
var frompackages
var linealias
var packages
var params
var plotinfo
var plotlines

Inherited members

class PlusDI

Defined by J. Welles Wilder, Jr. in 1978 in his book "New Concepts in Technical Trading Systems".

Intended to measure trend strength

This indicator shows +DI: - Use MinusDirectionalIndicator (MinusDI) to get -DI - Use Directional Indicator (DI) to get +DI, -DI - Use AverageDirectionalIndex (ADX) to get ADX - Use AverageDirectionalIndexRating (ADXR) to get ADX, ADXR - Use DirectionalMovementIndex (DMI) to get ADX, +DI, -DI - Use DirectionalMovement (DM) to get ADX, ADXR, +DI, -DI

Formula

  • upmove = high - high(-1)
  • downmove = low(-1) - low
  • +dm = upmove if upmove > downmove and upmove > 0 else 0
  • +di = 100 * MovingAverage(+dm, period) / atr(period)

The moving average used is the one originally defined by Wilder, the SmoothedMovingAverage

See

Ancestors

Class variables

var alias
var aliased
var frompackages
var linealias
var packages
var params
var plotinfo
var plotlines

Inherited members

class PlusDirectionalIndicator

Defined by J. Welles Wilder, Jr. in 1978 in his book "New Concepts in Technical Trading Systems".

Intended to measure trend strength

This indicator shows +DI: - Use MinusDirectionalIndicator (MinusDI) to get -DI - Use Directional Indicator (DI) to get +DI, -DI - Use AverageDirectionalIndex (ADX) to get ADX - Use AverageDirectionalIndexRating (ADXR) to get ADX, ADXR - Use DirectionalMovementIndex (DMI) to get ADX, +DI, -DI - Use DirectionalMovement (DM) to get ADX, ADXR, +DI, -DI

Formula

  • upmove = high - high(-1)
  • downmove = low(-1) - low
  • +dm = upmove if upmove > downmove and upmove > 0 else 0
  • +di = 100 * MovingAverage(+dm, period) / atr(period)

The moving average used is the one originally defined by Wilder, the SmoothedMovingAverage

See

Expand source code
class PlusDirectionalIndicator(_DirectionalIndicator):
    '''
    Defined by J. Welles Wilder, Jr. in 1978 in his book *"New Concepts in
    Technical Trading Systems"*.

    Intended to measure trend strength

    This indicator shows +DI:
      - Use MinusDirectionalIndicator (MinusDI) to get -DI
      - Use Directional Indicator (DI) to get +DI, -DI
      - Use AverageDirectionalIndex (ADX) to get ADX
      - Use AverageDirectionalIndexRating (ADXR) to get ADX, ADXR
      - Use DirectionalMovementIndex (DMI) to get ADX, +DI, -DI
      - Use DirectionalMovement (DM) to get ADX, ADXR, +DI, -DI

    Formula:
      - upmove = high - high(-1)
      - downmove = low(-1) - low
      - +dm = upmove if upmove > downmove and upmove > 0 else 0
      - +di = 100 * MovingAverage(+dm, period) / atr(period)

    The moving average used is the one originally defined by Wilder,
    the SmoothedMovingAverage

    See:
      - https://en.wikipedia.org/wiki/Average_directional_movement_index
    '''
    alias = (('PlusDI', '+DI'),)
    lines = ('plusDI',)

    plotinfo = dict(plotname='+DirectionalIndicator')

    def __init__(self):
        super(PlusDirectionalIndicator, self).__init__(_minus=False)

        self.lines.plusDI = self.DIplus

Ancestors

Subclasses

Class variables

var alias
var aliased
var frompackages
var linealias
var packages
var params
var plotinfo
var plotlines

Inherited members

class UpMove

Defined by J. Welles Wilder, Jr. in 1978 in his book "New Concepts in Technical Trading Systems" as part of the Directional Move System to calculate Directional Indicators.

Positive if the given data has moved higher than the previous day

Formula

  • upmove = data - data(-1)

See

Expand source code
class UpMove(Indicator):
    '''
    Defined by J. Welles Wilder, Jr. in 1978 in his book *"New Concepts in
    Technical Trading Systems"* as part of the Directional Move System to
    calculate Directional Indicators.

    Positive if the given data has moved higher than the previous day

    Formula:
      - upmove = data - data(-1)

    See:
      - https://en.wikipedia.org/wiki/Average_directional_movement_index
    '''
    lines = ('upmove',)

    def __init__(self):
        self.lines.upmove = self.data - self.data(-1)
        super(UpMove, self).__init__()

Ancestors

Class variables

var alias
var aliased
var frompackages
var linealias
var packages
var params
var plotinfo
var plotlines

Inherited members