# all files / technicalindicators/lib/directionalmovement/ PlusDM.js

91.67% Statements 33/36
81.25% Branches 13/16
100% Functions 5/5
91.67% Lines 33/36

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65

    1×

    1×

    1×

    3×
    3×
    3×

    3×

    3×

    3×
    3×
    3×
    3×
    3×
    114×
    111×
    111×
    111×

    114×
    114×

    3×

    3×
    76×

    76×
    74×

    1×
    1×

    1×
    1×
    1×

    1×
    1×

    1×
    38×

     /**
     * Created by AAravindan on 5/8/16.
     */
    "use strict"
    const nf = require('../Utils/NumberFormatter');

    let PDM;

    module.exports = PDM = function(input) {

      var lows = input.low
      var highs = input.high;
      var format = input.format || nf;

      if(Ilows.length != highs.length) {
        throw ('Inputs(low,high) not of equal size');
      }

      this.result = [];

      this.generator = (function* (){
        var plusDm;
        var current = yield;
        var last;
        while (true) {
          if(last) {
            let upMove = (current.high  - last.high)
            let downMove = (last.low - current.low)
            plusDm = format((upMove > downMove && upMove > 0) ? upMove : 0);
          }
          last = current;
          current = yield plusDm;
        }
      })();

      this.generator.next();

      lows.forEach((tick, index) => {
        var result = this.generator.next({
          high : highs[index],
          low  : lows[index]
        });
        if(result.value!==undefined)
          this.result.push(result.value);
      });
    };

    PDM.calculate = function(input) {
      if(Iinput.reversedInput) {
        input.high.reverse();
        input.low.reverse();
      }
      let result = (new PDM(input)).result;
      input.reversedInput ? result.reverse():undefined;
      return result;
    };

    PDM.prototype.getResult = function () {
      return this.result;
    };

    PDM.prototype.nextValue = function (price) {
      return this.generator.next(price).value;
    };