{"version":3,"sources":["jsdelivr-header.js","/npm/@nenjotsu/technicalindicators@3.1.3/lib/Utils/LinkedList.js","/npm/@nenjotsu/technicalindicators@3.1.3/lib/Utils/FixedSizeLinkedList.js","/npm/@nenjotsu/technicalindicators@3.1.3/lib/StockData.js","/npm/@nenjotsu/technicalindicators@3.1.3/lib/config.js","/npm/@nenjotsu/technicalindicators@3.1.3/lib/Utils/NumberFormatter.js","/npm/@nenjotsu/technicalindicators@3.1.3/lib/indicator/indicator.js","/npm/@nenjotsu/technicalindicators@3.1.3/lib/moving_averages/SMA.js","/npm/@nenjotsu/technicalindicators@3.1.3/lib/moving_averages/EMA.js","/npm/@nenjotsu/technicalindicators@3.1.3/lib/moving_averages/WMA.js","/npm/@nenjotsu/technicalindicators@3.1.3/lib/moving_averages/WEMA.js","/npm/@nenjotsu/technicalindicators@3.1.3/lib/moving_averages/WilderSmoothing.js","/npm/@nenjotsu/technicalindicators@3.1.3/lib/moving_averages/MACD.js","/npm/@nenjotsu/technicalindicators@3.1.3/lib/Utils/AverageGain.js","/npm/@nenjotsu/technicalindicators@3.1.3/lib/Utils/AverageLoss.js","/npm/@nenjotsu/technicalindicators@3.1.3/lib/oscillators/RSI.js","/npm/@nenjotsu/technicalindicators@3.1.3/lib/Utils/SD.js","/npm/@nenjotsu/technicalindicators@3.1.3/lib/volatility/BollingerBands.js","/npm/@nenjotsu/technicalindicators@3.1.3/lib/directionalmovement/MinusDM.js","/npm/@nenjotsu/technicalindicators@3.1.3/lib/directionalmovement/PlusDM.js","/npm/@nenjotsu/technicalindicators@3.1.3/lib/directionalmovement/TrueRange.js","/npm/@nenjotsu/technicalindicators@3.1.3/lib/directionalmovement/ADX.js","/npm/@nenjotsu/technicalindicators@3.1.3/lib/directionalmovement/ATR.js","/npm/@nenjotsu/technicalindicators@3.1.3/lib/momentum/ROC.js","/npm/@nenjotsu/technicalindicators@3.1.3/lib/momentum/KST.js","/npm/@nenjotsu/technicalindicators@3.1.3/lib/momentum/PSAR.js","/npm/@nenjotsu/technicalindicators@3.1.3/lib/momentum/Stochastic.js","/npm/@nenjotsu/technicalindicators@3.1.3/lib/momentum/WilliamsR.js","/npm/@nenjotsu/technicalindicators@3.1.3/lib/volume/ADL.js","/npm/@nenjotsu/technicalindicators@3.1.3/lib/volume/OBV.js","/npm/@nenjotsu/technicalindicators@3.1.3/lib/momentum/TRIX.js","/npm/@nenjotsu/technicalindicators@3.1.3/lib/volume/ForceIndex.js","/npm/@nenjotsu/technicalindicators@3.1.3/lib/oscillators/CCI.js","/npm/@nenjotsu/technicalindicators@3.1.3/lib/oscillators/AwesomeOscillator.js","/npm/@nenjotsu/technicalindicators@3.1.3/lib/volume/VWAP.js","/npm/@nenjotsu/technicalindicators@3.1.3/lib/volume/VolumeProfile.js","/npm/@nenjotsu/technicalindicators@3.1.3/lib/chart_types/TypicalPrice.js","/npm/@nenjotsu/technicalindicators@3.1.3/lib/volume/MFI.js","/npm/@nenjotsu/technicalindicators@3.1.3/lib/momentum/StochasticRSI.js","/npm/@nenjotsu/technicalindicators@3.1.3/lib/Utils/Highest.js","/npm/@nenjotsu/technicalindicators@3.1.3/lib/Utils/Lowest.js","/npm/@nenjotsu/technicalindicators@3.1.3/lib/Utils/Sum.js","/npm/@nenjotsu/technicalindicators@3.1.3/lib/chart_types/Renko.js","/npm/@nenjotsu/technicalindicators@3.1.3/lib/chart_types/HeikinAshi.js","/npm/@nenjotsu/technicalindicators@3.1.3/lib/candlestick/CandlestickFinder.js","/npm/@nenjotsu/technicalindicators@3.1.3/lib/candlestick/MorningStar.js","/npm/@nenjotsu/technicalindicators@3.1.3/lib/candlestick/BullishEngulfingPattern.js","/npm/@nenjotsu/technicalindicators@3.1.3/lib/candlestick/BullishHarami.js","/npm/@nenjotsu/technicalindicators@3.1.3/lib/candlestick/BullishHaramiCross.js","/npm/@nenjotsu/technicalindicators@3.1.3/lib/candlestick/Doji.js","/npm/@nenjotsu/technicalindicators@3.1.3/lib/candlestick/MorningDojiStar.js","/npm/@nenjotsu/technicalindicators@3.1.3/lib/candlestick/DownsideTasukiGap.js","/npm/@nenjotsu/technicalindicators@3.1.3/lib/candlestick/BullishMarubozu.js","/npm/@nenjotsu/technicalindicators@3.1.3/lib/candlestick/PiercingLine.js","/npm/@nenjotsu/technicalindicators@3.1.3/lib/candlestick/ThreeWhiteSoldiers.js","/npm/@nenjotsu/technicalindicators@3.1.3/lib/candlestick/BullishHammerStick.js","/npm/@nenjotsu/technicalindicators@3.1.3/lib/candlestick/BullishInvertedHammerStick.js","/npm/@nenjotsu/technicalindicators@3.1.3/lib/candlestick/BearishHammerStick.js","/npm/@nenjotsu/technicalindicators@3.1.3/lib/candlestick/BearishInvertedHammerStick.js","/npm/@nenjotsu/technicalindicators@3.1.3/lib/candlestick/HammerPattern.js","/npm/@nenjotsu/technicalindicators@3.1.3/lib/candlestick/HammerPatternUnconfirmed.js","/npm/@nenjotsu/technicalindicators@3.1.3/lib/candlestick/TweezerBottom.js","/npm/@nenjotsu/technicalindicators@3.1.3/lib/candlestick/Bullish.js","/npm/@nenjotsu/technicalindicators@3.1.3/lib/candlestick/BearishEngulfingPattern.js","/npm/@nenjotsu/technicalindicators@3.1.3/lib/candlestick/BearishHarami.js","/npm/@nenjotsu/technicalindicators@3.1.3/lib/candlestick/BearishHaramiCross.js","/npm/@nenjotsu/technicalindicators@3.1.3/lib/candlestick/EveningDojiStar.js","/npm/@nenjotsu/technicalindicators@3.1.3/lib/candlestick/EveningStar.js","/npm/@nenjotsu/technicalindicators@3.1.3/lib/candlestick/BearishMarubozu.js","/npm/@nenjotsu/technicalindicators@3.1.3/lib/candlestick/ThreeBlackCrows.js","/npm/@nenjotsu/technicalindicators@3.1.3/lib/candlestick/HangingMan.js","/npm/@nenjotsu/technicalindicators@3.1.3/lib/candlestick/HangingManUnconfirmed.js","/npm/@nenjotsu/technicalindicators@3.1.3/lib/candlestick/ShootingStar.js","/npm/@nenjotsu/technicalindicators@3.1.3/lib/candlestick/ShootingStarUnconfirmed.js","/npm/@nenjotsu/technicalindicators@3.1.3/lib/candlestick/TweezerTop.js","/npm/@nenjotsu/technicalindicators@3.1.3/lib/candlestick/Bearish.js","/npm/@nenjotsu/technicalindicators@3.1.3/lib/candlestick/AbandonedBaby.js","/npm/@nenjotsu/technicalindicators@3.1.3/lib/candlestick/DarkCloudCover.js","/npm/@nenjotsu/technicalindicators@3.1.3/lib/candlestick/DragonFlyDoji.js","/npm/@nenjotsu/technicalindicators@3.1.3/lib/candlestick/GraveStoneDoji.js","/npm/@nenjotsu/technicalindicators@3.1.3/lib/candlestick/BullishSpinningTop.js","/npm/@nenjotsu/technicalindicators@3.1.3/lib/candlestick/BearishSpinningTop.js","/npm/@nenjotsu/technicalindicators@3.1.3/lib/candlestick/BullishFractal.js","/npm/@nenjotsu/technicalindicators@3.1.3/lib/candlestick/BearishFractal.js","/npm/@nenjotsu/technicalindicators@3.1.3/lib/drawingtools/fibonacci.js","/npm/@nenjotsu/technicalindicators@3.1.3/lib/ichimoku/IchimokuCloud.js","/npm/@nenjotsu/technicalindicators@3.1.3/lib/volatility/KeltnerChannels.js","/npm/@nenjotsu/technicalindicators@3.1.3/lib/volatility/ChandelierExit.js","/npm/@nenjotsu/technicalindicators@3.1.3/lib/Utils/CrossUp.js","/npm/@nenjotsu/technicalindicators@3.1.3/lib/Utils/CrossDown.js","/npm/@nenjotsu/technicalindicators@3.1.3/index.js"],"names":[],"mappings":"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","file":"/npm/@nenjotsu/technicalindicators@3.1.3/dist/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/@nenjotsu/technicalindicators@3.1.3/dist/index.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","class Item {\n    constructor(data, prev, next) {\n        this.next = next;\n        if (next)\n            next.prev = this;\n        this.prev = prev;\n        if (prev)\n            prev.next = this;\n        this.data = data;\n    }\n}\nexport class LinkedList {\n    constructor() {\n        this._length = 0;\n    }\n    get head() {\n        return this._head && this._head.data;\n    }\n    get tail() {\n        return this._tail && this._tail.data;\n    }\n    get current() {\n        return this._current && this._current.data;\n    }\n    get length() {\n        return this._length;\n    }\n    push(data) {\n        this._tail = new Item(data, this._tail);\n        if (this._length === 0) {\n            this._head = this._tail;\n            this._current = this._head;\n            this._next = this._head;\n        }\n        this._length++;\n    }\n    pop() {\n        var tail = this._tail;\n        if (this._length === 0) {\n            return;\n        }\n        this._length--;\n        if (this._length === 0) {\n            this._head = this._tail = this._current = this._next = undefined;\n            return tail.data;\n        }\n        this._tail = tail.prev;\n        this._tail.next = undefined;\n        if (this._current === tail) {\n            this._current = this._tail;\n            this._next = undefined;\n        }\n        return tail.data;\n    }\n    shift() {\n        var head = this._head;\n        if (this._length === 0) {\n            return;\n        }\n        this._length--;\n        if (this._length === 0) {\n            this._head = this._tail = this._current = this._next = undefined;\n            return head.data;\n        }\n        this._head = this._head.next;\n        if (this._current === head) {\n            this._current = this._head;\n            this._next = this._current.next;\n        }\n        return head.data;\n    }\n    unshift(data) {\n        this._head = new Item(data, undefined, this._head);\n        if (this._length === 0) {\n            this._tail = this._head;\n            this._next = this._head;\n        }\n        this._length++;\n    }\n    unshiftCurrent() {\n        var current = this._current;\n        if (current === this._head || this._length < 2) {\n            return current && current.data;\n        }\n        // remove\n        if (current === this._tail) {\n            this._tail = current.prev;\n            this._tail.next = undefined;\n            this._current = this._tail;\n        }\n        else {\n            current.next.prev = current.prev;\n            current.prev.next = current.next;\n            this._current = current.prev;\n        }\n        this._next = this._current.next;\n        // unshift\n        current.next = this._head;\n        current.prev = undefined;\n        this._head.prev = current;\n        this._head = current;\n        return current.data;\n    }\n    removeCurrent() {\n        var current = this._current;\n        if (this._length === 0) {\n            return;\n        }\n        this._length--;\n        if (this._length === 0) {\n            this._head = this._tail = this._current = this._next = undefined;\n            return current.data;\n        }\n        if (current === this._tail) {\n            this._tail = current.prev;\n            this._tail.next = undefined;\n            this._current = this._tail;\n        }\n        else if (current === this._head) {\n            this._head = current.next;\n            this._head.prev = undefined;\n            this._current = this._head;\n        }\n        else {\n            current.next.prev = current.prev;\n            current.prev.next = current.next;\n            this._current = current.prev;\n        }\n        this._next = this._current.next;\n        return current.data;\n    }\n    resetCursor() {\n        this._current = this._next = this._head;\n        return this;\n    }\n    next() {\n        var next = this._next;\n        if (next !== undefined) {\n            this._next = next.next;\n            this._current = next;\n            return next.data;\n        }\n    }\n}\n","/**\n * Created by AAravindan on 5/7/16.\n */\nimport { LinkedList } from './LinkedList';\nexport default class FixedSizeLinkedList extends LinkedList {\n    constructor(size, maintainHigh, maintainLow, maintainSum) {\n        super();\n        this.size = size;\n        this.maintainHigh = maintainHigh;\n        this.maintainLow = maintainLow;\n        this.maintainSum = maintainSum;\n        this.totalPushed = 0;\n        this.periodHigh = 0;\n        this.periodLow = Infinity;\n        this.periodSum = 0;\n        if (!size || typeof size !== 'number') {\n            throw ('Size required and should be a number.');\n        }\n        this._push = this.push;\n        this.push = function (data) {\n            this.add(data);\n            this.totalPushed++;\n        };\n    }\n    add(data) {\n        if (this.length === this.size) {\n            this.lastShift = this.shift();\n            this._push(data);\n            //TODO: FInd a better way\n            if (this.maintainHigh)\n                if (this.lastShift == this.periodHigh)\n                    this.calculatePeriodHigh();\n            if (this.maintainLow)\n                if (this.lastShift == this.periodLow)\n                    this.calculatePeriodLow();\n            if (this.maintainSum) {\n                this.periodSum = this.periodSum - this.lastShift;\n            }\n        }\n        else {\n            this._push(data);\n        }\n        //TODO: FInd a better way\n        if (this.maintainHigh)\n            if (this.periodHigh <= data)\n                (this.periodHigh = data);\n        if (this.maintainLow)\n            if (this.periodLow >= data)\n                (this.periodLow = data);\n        if (this.maintainSum) {\n            this.periodSum = this.periodSum + data;\n        }\n    }\n    *iterator() {\n        this.resetCursor();\n        while (this.next()) {\n            yield this.current;\n        }\n    }\n    calculatePeriodHigh() {\n        this.resetCursor();\n        if (this.next())\n            this.periodHigh = this.current;\n        while (this.next()) {\n            if (this.periodHigh <= this.current) {\n                this.periodHigh = this.current;\n            }\n            ;\n        }\n        ;\n    }\n    calculatePeriodLow() {\n        this.resetCursor();\n        if (this.next())\n            this.periodLow = this.current;\n        while (this.next()) {\n            if (this.periodLow >= this.current) {\n                this.periodLow = this.current;\n            }\n            ;\n        }\n        ;\n    }\n}\n","export default class StockData {\n    constructor(open, high, low, close, reversedInput) {\n        this.open = open;\n        this.high = high;\n        this.low = low;\n        this.close = close;\n        this.reversedInput = reversedInput;\n    }\n}\nexport class CandleData {\n}\nexport class CandleList {\n    constructor() {\n        this.open = [];\n        this.high = [];\n        this.low = [];\n        this.close = [];\n        this.volume = [];\n        this.timestamp = [];\n    }\n}\n","let config = {};\nexport function setConfig(key, value) {\n    config[key] = value;\n}\nexport function getConfig(key) {\n    return config[key];\n}\n","import { getConfig } from '../config';\nexport function format(v) {\n    let precision = getConfig('precision');\n    if (precision) {\n        return parseFloat(v.toPrecision(precision));\n    }\n    return v;\n}\n","import { format as nf } from '../Utils/NumberFormatter';\nexport class IndicatorInput {\n}\nexport class AllInputs {\n}\nexport class Indicator {\n    constructor(input) {\n        this.format = input.format || nf;\n    }\n    static reverseInputs(input) {\n        if (input.reversedInput) {\n            input.values ? input.values.reverse() : undefined;\n            input.open ? input.open.reverse() : undefined;\n            input.high ? input.high.reverse() : undefined;\n            input.low ? input.low.reverse() : undefined;\n            input.close ? input.close.reverse() : undefined;\n            input.volume ? input.volume.reverse() : undefined;\n            input.timestamp ? input.timestamp.reverse() : undefined;\n        }\n    }\n    getResult() {\n        return this.result;\n    }\n}\n","//STEP 1. Import Necessary indicator or rather last step\nimport { Indicator, IndicatorInput } from '../indicator/indicator';\nimport { LinkedList } from '../Utils/LinkedList';\n//STEP 2. Create the input for the indicator, mandatory should be in the constructor\nexport class MAInput extends IndicatorInput {\n    constructor(period, values) {\n        super();\n        this.period = period;\n        this.values = values;\n    }\n}\n//STEP3. Add class based syntax with export\nexport class SMA extends Indicator {\n    constructor(input) {\n        super(input);\n        this.period = input.period;\n        this.price = input.values;\n        var genFn = (function* (period) {\n            var list = new LinkedList();\n            var sum = 0;\n            var counter = 1;\n            var current = yield;\n            var result;\n            list.push(0);\n            while (true) {\n                if (counter < period) {\n                    counter++;\n                    list.push(current);\n                    sum = sum + current;\n                }\n                else {\n                    sum = sum - list.shift() + current;\n                    result = ((sum) / period);\n                    list.push(current);\n                }\n                current = yield result;\n            }\n        });\n        this.generator = genFn(this.period);\n        this.generator.next();\n        this.result = [];\n        this.price.forEach((tick) => {\n            var result = this.generator.next(tick);\n            if (result.value !== undefined) {\n                this.result.push(this.format(result.value));\n            }\n        });\n    }\n    nextValue(price) {\n        var result = this.generator.next(price).value;\n        if (result != undefined)\n            return this.format(result);\n    }\n    ;\n}\nSMA.calculate = sma;\nexport function sma(input) {\n    Indicator.reverseInputs(input);\n    var result = new SMA(input).result;\n    if (input.reversedInput) {\n        result.reverse();\n    }\n    Indicator.reverseInputs(input);\n    return result;\n}\n;\n//STEP 6. Run the tests\n","import { Indicator } from \"../indicator/indicator\";\nimport { SMA } from \"./SMA\";\nexport class EMA extends Indicator {\n    constructor(input) {\n        super(input);\n        var period = input.period;\n        var priceArray = input.values;\n        var exponent = 2 / (period + 1);\n        var sma;\n        this.result = [];\n        sma = new SMA({ period: period, values: [] });\n        var genFn = function* () {\n            var tick = yield;\n            var prevEma;\n            while (true) {\n                if (prevEma !== undefined && tick !== undefined) {\n                    prevEma = (tick - prevEma) * exponent + prevEma;\n                    tick = yield prevEma;\n                }\n                else {\n                    tick = yield;\n                    prevEma = sma.nextValue(tick);\n                    if (prevEma)\n                        tick = yield prevEma;\n                }\n            }\n        };\n        this.generator = genFn();\n        this.generator.next();\n        this.generator.next();\n        priceArray.forEach((tick) => {\n            var result = this.generator.next(tick);\n            if (result.value != undefined) {\n                this.result.push(this.format(result.value));\n            }\n        });\n    }\n    nextValue(price) {\n        var result = this.generator.next(price).value;\n        if (result != undefined)\n            return this.format(result);\n    }\n}\nEMA.calculate = ema;\nexport function ema(input) {\n    Indicator.reverseInputs(input);\n    var result = new EMA(input).result;\n    if (input.reversedInput) {\n        result.reverse();\n    }\n    Indicator.reverseInputs(input);\n    return result;\n}\n","\"use strict\";\nimport { Indicator } from '../indicator/indicator';\nimport { LinkedList } from '../Utils/LinkedList';\nexport class WMA extends Indicator {\n    constructor(input) {\n        super(input);\n        var period = input.period;\n        var priceArray = input.values;\n        this.result = [];\n        this.generator = (function* () {\n            let data = new LinkedList();\n            let denominator = period * (period + 1) / 2;\n            while (true) {\n                if ((data.length) < period) {\n                    data.push(yield);\n                }\n                else {\n                    data.resetCursor();\n                    let result = 0;\n                    for (let i = 1; i <= period; i++) {\n                        result = result + (data.next() * i / (denominator));\n                    }\n                    var next = yield result;\n                    data.shift();\n                    data.push(next);\n                }\n            }\n        })();\n        this.generator.next();\n        priceArray.forEach((tick, index) => {\n            var result = this.generator.next(tick);\n            if (result.value != undefined) {\n                this.result.push(this.format(result.value));\n            }\n        });\n    }\n    //STEP 5. REMOVE GET RESULT FUNCTION\n    nextValue(price) {\n        var result = this.generator.next(price).value;\n        if (result != undefined)\n            return this.format(result);\n    }\n    ;\n}\nWMA.calculate = wma;\n;\nexport function wma(input) {\n    Indicator.reverseInputs(input);\n    var result = new WMA(input).result;\n    if (input.reversedInput) {\n        result.reverse();\n    }\n    Indicator.reverseInputs(input);\n    return result;\n}\n","import { Indicator } from \"../indicator/indicator\";\nimport { SMA } from \"./SMA\";\nexport class WEMA extends Indicator {\n    constructor(input) {\n        super(input);\n        var period = input.period;\n        var priceArray = input.values;\n        var exponent = 1 / period;\n        var sma;\n        this.result = [];\n        sma = new SMA({ period: period, values: [] });\n        var genFn = function* () {\n            var tick = yield;\n            var prevEma;\n            while (true) {\n                if (prevEma !== undefined && tick !== undefined) {\n                    prevEma = (tick - prevEma) * exponent + prevEma;\n                    tick = yield prevEma;\n                }\n                else {\n                    tick = yield;\n                    prevEma = sma.nextValue(tick);\n                    if (prevEma !== undefined)\n                        tick = yield prevEma;\n                }\n            }\n        };\n        this.generator = genFn();\n        this.generator.next();\n        this.generator.next();\n        priceArray.forEach((tick) => {\n            var result = this.generator.next(tick);\n            if (result.value != undefined) {\n                this.result.push(this.format(result.value));\n            }\n        });\n    }\n    nextValue(price) {\n        var result = this.generator.next(price).value;\n        if (result != undefined)\n            return this.format(result);\n    }\n}\nWEMA.calculate = wema;\nexport function wema(input) {\n    Indicator.reverseInputs(input);\n    var result = new WEMA(input).result;\n    if (input.reversedInput) {\n        result.reverse();\n    }\n    Indicator.reverseInputs(input);\n    return result;\n}\n","import { Indicator } from \"../indicator/indicator\";\nimport { LinkedList } from \"../Utils/LinkedList\";\n//STEP3. Add class based syntax with export\nexport class WilderSmoothing extends Indicator {\n    constructor(input) {\n        super(input);\n        this.period = input.period;\n        this.price = input.values;\n        var genFn = function* (period) {\n            var list = new LinkedList();\n            var sum = 0;\n            var counter = 1;\n            var current = yield;\n            var result = 0;\n            while (true) {\n                if (counter < period) {\n                    counter++;\n                    sum = sum + current;\n                    result = undefined;\n                }\n                else if (counter == period) {\n                    counter++;\n                    sum = sum + current;\n                    result = sum;\n                }\n                else {\n                    result = result - result / period + current;\n                }\n                current = yield result;\n            }\n        };\n        this.generator = genFn(this.period);\n        this.generator.next();\n        this.result = [];\n        this.price.forEach((tick) => {\n            var result = this.generator.next(tick);\n            if (result.value != undefined) {\n                this.result.push(this.format(result.value));\n            }\n        });\n    }\n    nextValue(price) {\n        var result = this.generator.next(price).value;\n        if (result != undefined)\n            return this.format(result);\n    }\n}\nWilderSmoothing.calculate = wildersmoothing;\nexport function wildersmoothing(input) {\n    Indicator.reverseInputs(input);\n    var result = new WilderSmoothing(input).result;\n    if (input.reversedInput) {\n        result.reverse();\n    }\n    Indicator.reverseInputs(input);\n    return result;\n}\n//STEP 6. Run the tests\n","/**\n * Created by AAravindan on 5/4/16.\n */\nimport { Indicator, IndicatorInput } from \"../indicator/indicator\";\nimport { SMA } from \"./SMA\";\nimport { EMA } from \"./EMA\";\nexport class MACDInput extends IndicatorInput {\n    constructor(values) {\n        super();\n        this.values = values;\n        this.SimpleMAOscillator = true;\n        this.SimpleMASignal = true;\n    }\n}\nexport class MACDOutput {\n}\nexport class MACD extends Indicator {\n    constructor(input) {\n        super(input);\n        var oscillatorMAtype = input.SimpleMAOscillator ? SMA : EMA;\n        var signalMAtype = input.SimpleMASignal ? SMA : EMA;\n        var fastMAProducer = new oscillatorMAtype({\n            period: input.fastPeriod,\n            values: [],\n            format: (v) => {\n                return v;\n            },\n        });\n        var slowMAProducer = new oscillatorMAtype({\n            period: input.slowPeriod,\n            values: [],\n            format: (v) => {\n                return v;\n            },\n        });\n        var signalMAProducer = new signalMAtype({\n            period: input.signalPeriod,\n            values: [],\n            format: (v) => {\n                return v;\n            },\n        });\n        var format = this.format;\n        this.result = [];\n        this.generator = (function* () {\n            var index = 0;\n            var tick;\n            var MACD, signal, histogram, fast, slow;\n            while (true) {\n                if (index < input.slowPeriod) {\n                    tick = yield;\n                    fast = fastMAProducer.nextValue(tick);\n                    slow = slowMAProducer.nextValue(tick);\n                    index++;\n                    continue;\n                }\n                if (fast && slow) {\n                    //Just for typescript to be happy\n                    MACD = fast - slow;\n                    signal = signalMAProducer.nextValue(MACD);\n                }\n                histogram = MACD - signal;\n                tick = yield {\n                    //fast : fast,\n                    //slow : slow,\n                    MACD: format(MACD),\n                    signal: signal ? format(signal) : undefined,\n                    histogram: isNaN(histogram) ? undefined : format(histogram),\n                };\n                fast = fastMAProducer.nextValue(tick);\n                slow = slowMAProducer.nextValue(tick);\n            }\n        })();\n        this.generator.next();\n        input.values.forEach((tick) => {\n            var result = this.generator.next(tick);\n            if (result.value != undefined) {\n                this.result.push(result.value);\n            }\n        });\n    }\n    nextValue(price) {\n        var result = this.generator.next(price).value;\n        return result;\n    }\n}\nMACD.calculate = macd;\nexport function macd(input) {\n    Indicator.reverseInputs(input);\n    var result = new MACD(input).result;\n    if (input.reversedInput) {\n        result.reverse();\n    }\n    Indicator.reverseInputs(input);\n    return result;\n}\n","import { Indicator, IndicatorInput } from \"../indicator/indicator\";\nexport class AvgGainInput extends IndicatorInput {\n}\nexport class AverageGain extends Indicator {\n    constructor(input) {\n        super(input);\n        let values = input.values;\n        let period = input.period;\n        let format = this.format;\n        this.generator = (function* (period) {\n            var currentValue = yield;\n            var counter = 1;\n            var gainSum = 0;\n            var avgGain;\n            var gain;\n            var lastValue = currentValue;\n            currentValue = yield;\n            while (true) {\n                gain = currentValue - lastValue;\n                gain = gain > 0 ? gain : 0;\n                if (gain > 0) {\n                    gainSum = gainSum + gain;\n                }\n                if (counter < period) {\n                    counter++;\n                }\n                else if (avgGain === undefined) {\n                    avgGain = gainSum / period;\n                }\n                else {\n                    avgGain = (avgGain * (period - 1) + gain) / period;\n                }\n                lastValue = currentValue;\n                avgGain = avgGain !== undefined ? format(avgGain) : undefined;\n                currentValue = yield avgGain;\n            }\n        })(period);\n        this.generator.next();\n        this.result = [];\n        values.forEach((tick) => {\n            var result = this.generator.next(tick);\n            if (result.value !== undefined) {\n                this.result.push(result.value);\n            }\n        });\n    }\n    nextValue(price) {\n        return this.generator.next(price).value;\n    }\n}\nAverageGain.calculate = averagegain;\nexport function averagegain(input) {\n    Indicator.reverseInputs(input);\n    var result = new AverageGain(input).result;\n    if (input.reversedInput) {\n        result.reverse();\n    }\n    Indicator.reverseInputs(input);\n    return result;\n}\n","import { Indicator, IndicatorInput } from \"../indicator/indicator\";\nexport class AvgLossInput extends IndicatorInput {\n}\nexport class AverageLoss extends Indicator {\n    constructor(input) {\n        super(input);\n        let values = input.values;\n        let period = input.period;\n        let format = this.format;\n        this.generator = (function* (period) {\n            var currentValue = yield;\n            var counter = 1;\n            var lossSum = 0;\n            var avgLoss;\n            var loss;\n            var lastValue = currentValue;\n            currentValue = yield;\n            while (true) {\n                loss = lastValue - currentValue;\n                loss = loss > 0 ? loss : 0;\n                if (loss > 0) {\n                    lossSum = lossSum + loss;\n                }\n                if (counter < period) {\n                    counter++;\n                }\n                else if (avgLoss === undefined) {\n                    avgLoss = lossSum / period;\n                }\n                else {\n                    avgLoss = (avgLoss * (period - 1) + loss) / period;\n                }\n                lastValue = currentValue;\n                avgLoss = avgLoss !== undefined ? format(avgLoss) : undefined;\n                currentValue = yield avgLoss;\n            }\n        })(period);\n        this.generator.next();\n        this.result = [];\n        values.forEach((tick) => {\n            var result = this.generator.next(tick);\n            if (result.value !== undefined) {\n                this.result.push(result.value);\n            }\n        });\n    }\n    nextValue(price) {\n        return this.generator.next(price).value;\n    }\n}\nAverageLoss.calculate = averageloss;\nexport function averageloss(input) {\n    Indicator.reverseInputs(input);\n    var result = new AverageLoss(input).result;\n    if (input.reversedInput) {\n        result.reverse();\n    }\n    Indicator.reverseInputs(input);\n    return result;\n}\n","/**\n * Created by AAravindan on 5/5/16.\n */\nimport { Indicator, IndicatorInput } from \"../indicator/indicator\";\nimport { AverageGain } from \"../Utils/AverageGain\";\nimport { AverageLoss } from \"../Utils/AverageLoss\";\nexport class RSIInput extends IndicatorInput {\n}\nexport class RSI extends Indicator {\n    constructor(input) {\n        super(input);\n        var period = input.period;\n        var values = input.values;\n        var GainProvider = new AverageGain({ period: period, values: [] });\n        var LossProvider = new AverageLoss({ period: period, values: [] });\n        let count = 1;\n        this.generator = (function* (period) {\n            var current = yield;\n            var lastAvgGain, lastAvgLoss, RS, currentRSI;\n            while (true) {\n                lastAvgGain = GainProvider.nextValue(current);\n                lastAvgLoss = LossProvider.nextValue(current);\n                if (lastAvgGain !== undefined && lastAvgLoss !== undefined) {\n                    if (lastAvgLoss === 0) {\n                        currentRSI = 100;\n                    }\n                    else if (lastAvgGain === 0) {\n                        currentRSI = 0;\n                    }\n                    else {\n                        RS = lastAvgGain / lastAvgLoss;\n                        RS = isNaN(RS) ? 0 : RS;\n                        currentRSI = parseFloat((100 - 100 / (1 + RS)).toFixed(2));\n                    }\n                }\n                count++;\n                current = yield currentRSI;\n            }\n        })(period);\n        this.generator.next();\n        this.result = [];\n        values.forEach((tick) => {\n            var result = this.generator.next(tick);\n            if (result.value !== undefined) {\n                this.result.push(result.value);\n            }\n        });\n    }\n    nextValue(price) {\n        return this.generator.next(price).value;\n    }\n}\nRSI.calculate = rsi;\nexport function rsi(input) {\n    Indicator.reverseInputs(input);\n    var result = new RSI(input).result;\n    if (input.reversedInput) {\n        result.reverse();\n    }\n    Indicator.reverseInputs(input);\n    return result;\n}\n","import { IndicatorInput, Indicator } from '../indicator/indicator';\nimport { SMA } from '../moving_averages/SMA';\nimport LinkedList from '../Utils/FixedSizeLinkedList';\n/**\n * Created by AAravindan on 5/7/16.\n */\n\"use strict\";\nexport class SDInput extends IndicatorInput {\n}\n;\nexport class SD extends Indicator {\n    constructor(input) {\n        super(input);\n        var period = input.period;\n        var priceArray = input.values;\n        var sma = new SMA({ period: period, values: [], format: (v) => { return v; } });\n        this.result = [];\n        this.generator = (function* () {\n            var tick;\n            var mean;\n            var currentSet = new LinkedList(period);\n            ;\n            tick = yield;\n            var sd;\n            while (true) {\n                currentSet.push(tick);\n                mean = sma.nextValue(tick);\n                if (mean) {\n                    let sum = 0;\n                    for (let x of currentSet.iterator()) {\n                        sum = sum + (Math.pow((x - mean), 2));\n                    }\n                    sd = Math.sqrt(sum / (period));\n                }\n                tick = yield sd;\n            }\n        })();\n        this.generator.next();\n        priceArray.forEach((tick) => {\n            var result = this.generator.next(tick);\n            if (result.value != undefined) {\n                this.result.push(this.format(result.value));\n            }\n        });\n    }\n    nextValue(price) {\n        var nextResult = this.generator.next(price);\n        if (nextResult.value != undefined)\n            return this.format(nextResult.value);\n    }\n    ;\n}\nSD.calculate = sd;\nexport function sd(input) {\n    Indicator.reverseInputs(input);\n    var result = new SD(input).result;\n    if (input.reversedInput) {\n        result.reverse();\n    }\n    Indicator.reverseInputs(input);\n    return result;\n}\n;\n","\"use strict\";\nimport { Indicator, IndicatorInput } from '../indicator/indicator';\nimport { SMA } from '../moving_averages/SMA';\nimport { SD } from '../Utils/SD';\nexport class BollingerBandsInput extends IndicatorInput {\n}\n;\nexport class BollingerBandsOutput extends IndicatorInput {\n}\n;\nexport class BollingerBands extends Indicator {\n    constructor(input) {\n        super(input);\n        var period = input.period;\n        var priceArray = input.values;\n        var stdDev = input.stdDev;\n        var format = this.format;\n        var sma, sd;\n        this.result = [];\n        sma = new SMA({ period: period, values: [], format: (v) => { return v; } });\n        sd = new SD({ period: period, values: [], format: (v) => { return v; } });\n        this.generator = (function* () {\n            var result;\n            var tick;\n            var calcSMA;\n            var calcsd;\n            tick = yield;\n            while (true) {\n                calcSMA = sma.nextValue(tick);\n                calcsd = sd.nextValue(tick);\n                if (calcSMA) {\n                    let middle = format(calcSMA);\n                    let upper = format(calcSMA + (calcsd * stdDev));\n                    let lower = format(calcSMA - (calcsd * stdDev));\n                    let pb = format((tick - lower) / (upper - lower));\n                    result = {\n                        middle: middle,\n                        upper: upper,\n                        lower: lower,\n                        pb: pb\n                    };\n                }\n                tick = yield result;\n            }\n        })();\n        this.generator.next();\n        priceArray.forEach((tick) => {\n            var result = this.generator.next(tick);\n            if (result.value != undefined) {\n                this.result.push(result.value);\n            }\n        });\n    }\n    nextValue(price) {\n        return this.generator.next(price).value;\n    }\n    ;\n}\nBollingerBands.calculate = bollingerbands;\nexport function bollingerbands(input) {\n    Indicator.reverseInputs(input);\n    var result = new BollingerBands(input).result;\n    if (input.reversedInput) {\n        result.reverse();\n    }\n    Indicator.reverseInputs(input);\n    return result;\n}\n;\n","import { Indicator, IndicatorInput } from \"../indicator/indicator\";\n/**\n * Created by AAravindan on 5/8/16.\n */\n(\"use strict\");\nexport class MDMInput extends IndicatorInput {\n}\nexport class MDM extends Indicator {\n    constructor(input) {\n        super(input);\n        var lows = input.low;\n        var highs = input.high;\n        var format = this.format;\n        if (lows.length != highs.length) {\n            throw \"Inputs(low,high) not of equal size\";\n        }\n        this.result = [];\n        this.generator = (function* () {\n            var minusDm;\n            var current = yield;\n            var last;\n            while (true) {\n                if (last) {\n                    let upMove = current.high - last.high;\n                    let downMove = last.low - current.low;\n                    minusDm = format(downMove > upMove && downMove > 0 ? downMove : 0);\n                }\n                last = current;\n                current = yield minusDm;\n            }\n        })();\n        this.generator.next();\n        lows.forEach((tick, index) => {\n            var result = this.generator.next({\n                high: highs[index],\n                low: lows[index],\n            });\n            if (result.value !== undefined)\n                this.result.push(result.value);\n        });\n    }\n    static calculate(input) {\n        Indicator.reverseInputs(input);\n        var result = new MDM(input).result;\n        if (input.reversedInput) {\n            result.reverse();\n        }\n        Indicator.reverseInputs(input);\n        return result;\n    }\n    nextValue(price) {\n        return this.generator.next(price).value;\n    }\n}\n","import { Indicator, IndicatorInput } from \"../indicator/indicator\";\n/**\n * Created by AAravindan on 5/8/16.\n */\nexport class PDMInput extends IndicatorInput {\n}\nexport class PDM extends Indicator {\n    constructor(input) {\n        super(input);\n        var lows = input.low;\n        var highs = input.high;\n        var format = this.format;\n        if (lows.length != highs.length) {\n            throw \"Inputs(low,high) not of equal size\";\n        }\n        this.result = [];\n        this.generator = (function* () {\n            var plusDm;\n            var current = yield;\n            var last;\n            while (true) {\n                if (last) {\n                    let upMove = current.high - last.high;\n                    let downMove = last.low - current.low;\n                    plusDm = format(upMove > downMove && upMove > 0 ? upMove : 0);\n                }\n                last = current;\n                current = yield plusDm;\n            }\n        })();\n        this.generator.next();\n        lows.forEach((tick, index) => {\n            var result = this.generator.next({\n                high: highs[index],\n                low: lows[index],\n            });\n            if (result.value !== undefined)\n                this.result.push(result.value);\n        });\n    }\n    static calculate(input) {\n        Indicator.reverseInputs(input);\n        var result = new PDM(input).result;\n        if (input.reversedInput) {\n            result.reverse();\n        }\n        Indicator.reverseInputs(input);\n        return result;\n    }\n    nextValue(price) {\n        return this.generator.next(price).value;\n    }\n}\n","import { Indicator, IndicatorInput } from \"../indicator/indicator\";\n/**\n * Created by AAravindan on 5/8/16.\n */\n/**\n * Created by AAravindan on 5/8/16.\n */\n(\"use strict\");\nexport class TrueRangeInput extends IndicatorInput {\n}\nexport class TrueRange extends Indicator {\n    constructor(input) {\n        super(input);\n        var lows = input.low;\n        var highs = input.high;\n        var closes = input.close;\n        var format = this.format;\n        if (lows.length != highs.length) {\n            throw \"Inputs(low,high) not of equal size\";\n        }\n        this.result = [];\n        this.generator = (function* () {\n            var current = yield;\n            var previousClose, result;\n            while (true) {\n                if (previousClose === undefined) {\n                    previousClose = current.close;\n                    current = yield result;\n                }\n                result = Math.max(current.high - current.low, isNaN(Math.abs(current.high - previousClose))\n                    ? 0\n                    : Math.abs(current.high - previousClose), isNaN(Math.abs(current.low - previousClose))\n                    ? 0\n                    : Math.abs(current.low - previousClose));\n                previousClose = current.close;\n                if (result != undefined) {\n                    result = format(result);\n                }\n                current = yield result;\n            }\n        })();\n        this.generator.next();\n        lows.forEach((tick, index) => {\n            var result = this.generator.next({\n                high: highs[index],\n                low: lows[index],\n                close: closes[index],\n            });\n            if (result.value != undefined) {\n                this.result.push(result.value);\n            }\n        });\n    }\n    nextValue(price) {\n        return this.generator.next(price).value;\n    }\n}\nTrueRange.calculate = truerange;\nexport function truerange(input) {\n    Indicator.reverseInputs(input);\n    var result = new TrueRange(input).result;\n    if (input.reversedInput) {\n        result.reverse();\n    }\n    Indicator.reverseInputs(input);\n    return result;\n}\n","import { WilderSmoothing } from \"../moving_averages/WilderSmoothing\";\nimport { Indicator, IndicatorInput } from \"../indicator/indicator\";\nimport { MDM } from \"./MinusDM\";\nimport { PDM } from \"./PlusDM\";\nimport { TrueRange } from \"./TrueRange\";\nimport { WEMA } from \"../moving_averages/WEMA\";\nexport class ADXInput extends IndicatorInput {\n}\nexport class ADXOutput extends IndicatorInput {\n}\nexport class ADX extends Indicator {\n    constructor(input) {\n        super(input);\n        var lows = input.low;\n        var highs = input.high;\n        var closes = input.close;\n        var period = input.period;\n        var format = this.format;\n        var plusDM = new PDM({\n            high: [],\n            low: [],\n        });\n        var minusDM = new MDM({\n            high: [],\n            low: [],\n        });\n        var emaPDM = new WilderSmoothing({\n            period: period,\n            values: [],\n            format: (v) => {\n                return v;\n            },\n        });\n        var emaMDM = new WilderSmoothing({\n            period: period,\n            values: [],\n            format: (v) => {\n                return v;\n            },\n        });\n        var emaTR = new WilderSmoothing({\n            period: period,\n            values: [],\n            format: (v) => {\n                return v;\n            },\n        });\n        var emaDX = new WEMA({\n            period: period,\n            values: [],\n            format: (v) => {\n                return v;\n            },\n        });\n        var tr = new TrueRange({\n            low: [],\n            high: [],\n            close: [],\n        });\n        if (!(lows.length === highs.length && highs.length === closes.length)) {\n            throw \"Inputs(low,high, close) not of equal size\";\n        }\n        this.result = [];\n        ADXOutput;\n        this.generator = (function* () {\n            var tick = yield;\n            var index = 0;\n            var lastATR, lastAPDM, lastAMDM, lastPDI, lastMDI, lastDX, smoothedDX;\n            lastATR = 0;\n            lastAPDM = 0;\n            lastAMDM = 0;\n            while (true) {\n                let calcTr = tr.nextValue(tick);\n                let calcPDM = plusDM.nextValue(tick);\n                let calcMDM = minusDM.nextValue(tick);\n                if (calcTr === undefined) {\n                    tick = yield;\n                    continue;\n                }\n                let lastATR = emaTR.nextValue(calcTr);\n                let lastAPDM = emaPDM.nextValue(calcPDM);\n                let lastAMDM = emaMDM.nextValue(calcMDM);\n                if (lastATR != undefined &&\n                    lastAPDM != undefined &&\n                    lastAMDM != undefined) {\n                    lastPDI = (lastAPDM * 100) / lastATR;\n                    lastMDI = (lastAMDM * 100) / lastATR;\n                    let diDiff = Math.abs(lastPDI - lastMDI);\n                    let diSum = lastPDI + lastMDI;\n                    lastDX = (diDiff / diSum) * 100;\n                    smoothedDX = emaDX.nextValue(lastDX);\n                    // console.log(tick.high.toFixed(2), tick.low.toFixed(2), tick.close.toFixed(2) , calcTr.toFixed(2), calcPDM.toFixed(2), calcMDM.toFixed(2), lastATR.toFixed(2), lastAPDM.toFixed(2), lastAMDM.toFixed(2), lastPDI.toFixed(2), lastMDI.toFixed(2), diDiff.toFixed(2), diSum.toFixed(2), lastDX.toFixed(2));\n                }\n                tick = yield { adx: smoothedDX, pdi: lastPDI, mdi: lastMDI };\n            }\n        })();\n        this.generator.next();\n        lows.forEach((tick, index) => {\n            var result = this.generator.next({\n                high: highs[index],\n                low: lows[index],\n                close: closes[index],\n            });\n            if (result.value != undefined && result.value.adx != undefined) {\n                this.result.push({\n                    adx: format(result.value.adx),\n                    pdi: format(result.value.pdi),\n                    mdi: format(result.value.mdi),\n                });\n            }\n        });\n    }\n    nextValue(price) {\n        let result = this.generator.next(price).value;\n        if (result != undefined && result.adx != undefined) {\n            return {\n                adx: this.format(result.adx),\n                pdi: this.format(result.pdi),\n                mdi: this.format(result.mdi),\n            };\n        }\n    }\n}\nADX.calculate = adx;\nexport function adx(input) {\n    Indicator.reverseInputs(input);\n    var result = new ADX(input).result;\n    if (input.reversedInput) {\n        result.reverse();\n    }\n    Indicator.reverseInputs(input);\n    return result;\n}\n","import { Indicator, IndicatorInput } from \"../indicator/indicator\";\n/**\n * Created by AAravindan on 5/8/16.\n */\n(\"use strict\");\nimport { WEMA } from \"../moving_averages/WEMA\";\nimport { TrueRange } from \"./TrueRange\";\nexport class ATRInput extends IndicatorInput {\n}\nexport class ATR extends Indicator {\n    constructor(input) {\n        super(input);\n        var lows = input.low;\n        var highs = input.high;\n        var closes = input.close;\n        var period = input.period;\n        var format = this.format;\n        if (!(lows.length === highs.length && highs.length === closes.length)) {\n            throw \"Inputs(low,high, close) not of equal size\";\n        }\n        var trueRange = new TrueRange({\n            low: [],\n            high: [],\n            close: [],\n        });\n        var wema = new WEMA({\n            period: period,\n            values: [],\n            format: (v) => {\n                return v;\n            },\n        });\n        this.result = [];\n        this.generator = (function* () {\n            var tick = yield;\n            var avgTrueRange, trange;\n            while (true) {\n                trange = trueRange.nextValue({\n                    low: tick.low,\n                    high: tick.high,\n                    close: tick.close,\n                });\n                if (trange === undefined) {\n                    avgTrueRange = undefined;\n                }\n                else {\n                    avgTrueRange = wema.nextValue(trange);\n                }\n                tick = yield avgTrueRange;\n            }\n        })();\n        this.generator.next();\n        lows.forEach((tick, index) => {\n            var result = this.generator.next({\n                high: highs[index],\n                low: lows[index],\n                close: closes[index],\n            });\n            if (result.value !== undefined) {\n                this.result.push(format(result.value));\n            }\n        });\n    }\n    nextValue(price) {\n        return this.generator.next(price).value;\n    }\n}\nATR.calculate = atr;\nexport function atr(input) {\n    Indicator.reverseInputs(input);\n    var result = new ATR(input).result;\n    if (input.reversedInput) {\n        result.reverse();\n    }\n    Indicator.reverseInputs(input);\n    return result;\n}\n","import { Indicator, IndicatorInput } from \"../indicator/indicator\";\nimport LinkedList from \"../Utils/FixedSizeLinkedList\";\nexport class ROCInput extends IndicatorInput {\n}\nexport class ROC extends Indicator {\n    constructor(input) {\n        super(input);\n        var period = input.period;\n        var priceArray = input.values;\n        this.result = [];\n        this.generator = (function* () {\n            let index = 1;\n            var pastPeriods = new LinkedList(period);\n            var tick = yield;\n            var roc;\n            while (true) {\n                pastPeriods.push(tick);\n                if (index < period) {\n                    index++;\n                }\n                else {\n                    roc =\n                        ((tick - pastPeriods.lastShift) /\n                            pastPeriods.lastShift) *\n                            100;\n                }\n                tick = yield roc;\n            }\n        })();\n        this.generator.next();\n        priceArray.forEach((tick) => {\n            var result = this.generator.next(tick);\n            if (result.value != undefined && !isNaN(result.value)) {\n                this.result.push(this.format(result.value));\n            }\n        });\n    }\n    nextValue(price) {\n        var nextResult = this.generator.next(price);\n        if (nextResult.value != undefined && !isNaN(nextResult.value)) {\n            return this.format(nextResult.value);\n        }\n    }\n}\nROC.calculate = roc;\nexport function roc(input) {\n    Indicator.reverseInputs(input);\n    var result = new ROC(input).result;\n    if (input.reversedInput) {\n        result.reverse();\n    }\n    Indicator.reverseInputs(input);\n    return result;\n}\n","import { Indicator, IndicatorInput } from \"../indicator/indicator\";\nimport { SMA } from \"../moving_averages/SMA\";\nimport { ROC } from \"./ROC\";\nexport class KSTInput extends IndicatorInput {\n}\nexport class KSTOutput {\n}\nexport class KST extends Indicator {\n    constructor(input) {\n        super(input);\n        let priceArray = input.values;\n        let rocPer1 = input.ROCPer1;\n        let rocPer2 = input.ROCPer2;\n        let rocPer3 = input.ROCPer3;\n        let rocPer4 = input.ROCPer4;\n        let smaPer1 = input.SMAROCPer1;\n        let smaPer2 = input.SMAROCPer2;\n        let smaPer3 = input.SMAROCPer3;\n        let smaPer4 = input.SMAROCPer4;\n        let signalPeriod = input.signalPeriod;\n        let roc1 = new ROC({ period: rocPer1, values: [] });\n        let roc2 = new ROC({ period: rocPer2, values: [] });\n        let roc3 = new ROC({ period: rocPer3, values: [] });\n        let roc4 = new ROC({ period: rocPer4, values: [] });\n        let sma1 = new SMA({\n            period: smaPer1,\n            values: [],\n            format: (v) => {\n                return v;\n            },\n        });\n        let sma2 = new SMA({\n            period: smaPer2,\n            values: [],\n            format: (v) => {\n                return v;\n            },\n        });\n        let sma3 = new SMA({\n            period: smaPer3,\n            values: [],\n            format: (v) => {\n                return v;\n            },\n        });\n        let sma4 = new SMA({\n            period: smaPer4,\n            values: [],\n            format: (v) => {\n                return v;\n            },\n        });\n        let signalSMA = new SMA({\n            period: signalPeriod,\n            values: [],\n            format: (v) => {\n                return v;\n            },\n        });\n        var format = this.format;\n        this.result = [];\n        let firstResult = Math.max(rocPer1 + smaPer1, rocPer2 + smaPer2, rocPer3 + smaPer3, rocPer4 + smaPer4);\n        this.generator = (function* () {\n            let index = 1;\n            let tick = yield;\n            let kst;\n            let RCMA1, RCMA2, RCMA3, RCMA4, signal, result;\n            while (true) {\n                let roc1Result = roc1.nextValue(tick);\n                let roc2Result = roc2.nextValue(tick);\n                let roc3Result = roc3.nextValue(tick);\n                let roc4Result = roc4.nextValue(tick);\n                RCMA1 =\n                    roc1Result !== undefined\n                        ? sma1.nextValue(roc1Result)\n                        : undefined;\n                RCMA2 =\n                    roc2Result !== undefined\n                        ? sma2.nextValue(roc2Result)\n                        : undefined;\n                RCMA3 =\n                    roc3Result !== undefined\n                        ? sma3.nextValue(roc3Result)\n                        : undefined;\n                RCMA4 =\n                    roc4Result !== undefined\n                        ? sma4.nextValue(roc4Result)\n                        : undefined;\n                if (index < firstResult) {\n                    index++;\n                }\n                else {\n                    kst = RCMA1 * 1 + RCMA2 * 2 + RCMA3 * 3 + RCMA4 * 4;\n                }\n                signal =\n                    kst !== undefined ? signalSMA.nextValue(kst) : undefined;\n                result =\n                    kst !== undefined\n                        ? {\n                            kst: format(kst),\n                            signal: signal ? format(signal) : undefined,\n                        }\n                        : undefined;\n                tick = yield result;\n            }\n        })();\n        this.generator.next();\n        priceArray.forEach((tick) => {\n            let result = this.generator.next(tick);\n            if (result.value != undefined) {\n                this.result.push(result.value);\n            }\n        });\n    }\n    nextValue(price) {\n        let nextResult = this.generator.next(price);\n        if (nextResult.value != undefined)\n            return nextResult.value;\n    }\n}\nKST.calculate = kst;\nexport function kst(input) {\n    Indicator.reverseInputs(input);\n    var result = new KST(input).result;\n    if (input.reversedInput) {\n        result.reverse();\n    }\n    Indicator.reverseInputs(input);\n    return result;\n}\n","import { IndicatorInput, Indicator } from \"../indicator/indicator\";\n(\"use strict\");\n/*\n  There seems to be a few interpretations of the rules for this regarding which prices.\n  I mean the english from which periods are included. The wording does seem to\n  introduce some discrepancy so maybe that is why. I want to put the author's\n  own description here to reassess this later.\n  ----------------------------------------------------------------------------------------\n  For the first day of entry the SAR is the previous Significant Point\n\n  If long the SP is the lowest price reached while in the previous short trade\n  If short the SP is the highest price reached while in the previous long trade\n\n  If long:\n  Find the difference between the highest price made while in the trade and the SAR for today.\n  Multiple the difference by the AF and ADD the result to today's SAR to obtain the SAR for tomorrow.\n  Use 0.02 for the first AF and increase it by 0.02 on every day that a new high for the trade is made.\n  If a new high is not made continue to use the AF as last increased. Do not increase the AF above .20\n\n  Never move the SAR for tomorrow ABOVE the previous day's LOW or today's LOW.\n  If the SAR is calculated to be ABOVE the previous day's LOW or today's LOW then use the lower low between today and the previous day as the new SAR.\n  Make the next day's calculations based on this SAR.\n\n  If short:\n  Find the difference between the lowest price made while in the trade and the SAR for today.\n  Multiple the difference by the AF and SUBTRACT the result to today's SAR to obtain the SAR for tomorrow.\n  Use 0.02 for the first AF and increase it by 0.02 on every day that a new high for the trade is made.\n  If a new high is not made continue to use the AF as last increased. Do not increase the AF above .20\n\n  Never move the SAR for tomorrow BELOW the previous day's HIGH or today's HIGH.\n  If the SAR is calculated to be BELOW the previous day's HIGH or today's HIGH then use the higher high between today and the previous day as the new SAR. Make the next day's calculations based on this SAR.\n  ----------------------------------------------------------------------------------------\n*/\nexport class PSARInput extends IndicatorInput {\n}\nexport class PSAR extends Indicator {\n    constructor(input) {\n        super(input);\n        let highs = input.high || [];\n        let lows = input.low || [];\n        var genFn = function* (step, max) {\n            let curr, extreme, sar, furthest;\n            let up = true;\n            let accel = step;\n            let prev = yield;\n            while (true) {\n                if (curr) {\n                    sar = sar + accel * (extreme - sar);\n                    if (up) {\n                        sar = Math.min(sar, furthest.low, prev.low);\n                        if (curr.high > extreme) {\n                            extreme = curr.high;\n                            accel = Math.min(accel + step, max);\n                        }\n                    }\n                    else {\n                        sar = Math.max(sar, furthest.high, prev.high);\n                        if (curr.low < extreme) {\n                            extreme = curr.low;\n                            accel = Math.min(accel + step, max);\n                        }\n                    }\n                    if ((up && curr.low < sar) || (!up && curr.high > sar)) {\n                        accel = step;\n                        sar = extreme;\n                        up = !up;\n                        extreme = !up ? curr.low : curr.high;\n                    }\n                }\n                else {\n                    // Randomly setup start values? What is the trend on first tick??\n                    sar = prev.low;\n                    extreme = prev.high;\n                }\n                furthest = prev;\n                if (curr)\n                    prev = curr;\n                curr = yield sar;\n            }\n        };\n        this.result = [];\n        this.generator = genFn(input.step, input.max);\n        this.generator.next();\n        lows.forEach((tick, index) => {\n            var result = this.generator.next({\n                high: highs[index],\n                low: lows[index],\n            });\n            if (result.value !== undefined) {\n                this.result.push(result.value);\n            }\n        });\n    }\n    nextValue(input) {\n        let nextResult = this.generator.next(input);\n        if (nextResult.value !== undefined)\n            return nextResult.value;\n    }\n}\nPSAR.calculate = psar;\nexport function psar(input) {\n    Indicator.reverseInputs(input);\n    var result = new PSAR(input).result;\n    if (input.reversedInput) {\n        result.reverse();\n    }\n    Indicator.reverseInputs(input);\n    return result;\n}\n","import { IndicatorInput, Indicator } from '../indicator/indicator';\n/**\n * Created by AAravindan on 5/10/16.\n */\n\"use strict\";\nimport LinkedList from '../Utils/FixedSizeLinkedList';\nimport { SMA } from '../moving_averages/SMA';\nexport class StochasticInput extends IndicatorInput {\n}\n;\nexport class StochasticOutput {\n}\n;\nexport class Stochastic extends Indicator {\n    constructor(input) {\n        super(input);\n        let lows = input.low;\n        let highs = input.high;\n        let closes = input.close;\n        let period = input.period;\n        let signalPeriod = input.signalPeriod;\n        let format = this.format;\n        if (!((lows.length === highs.length) && (highs.length === closes.length))) {\n            throw ('Inputs(low,high, close) not of equal size');\n        }\n        this.result = [];\n        //%K = (Current Close - Lowest Low)/(Highest High - Lowest Low) * 100\n        //%D = 3-day SMA of %K\n        //\n        //Lowest Low = lowest low for the look-back period\n        //Highest High = highest high for the look-back period\n        //%K is multiplied by 100 to move the decimal point two places\n        this.generator = (function* () {\n            let index = 1;\n            let pastHighPeriods = new LinkedList(period, true, false);\n            let pastLowPeriods = new LinkedList(period, false, true);\n            let dSma = new SMA({\n                period: signalPeriod,\n                values: [],\n                format: (v) => { return v; }\n            });\n            let k, d;\n            var tick = yield;\n            while (true) {\n                pastHighPeriods.push(tick.high);\n                pastLowPeriods.push(tick.low);\n                if (index < period) {\n                    index++;\n                    tick = yield;\n                    continue;\n                }\n                let periodLow = pastLowPeriods.periodLow;\n                k = (tick.close - periodLow) / (pastHighPeriods.periodHigh - periodLow) * 100;\n                k = isNaN(k) ? 0 : k; //This happens when the close, high and low are same for the entire period; Bug fix for \n                d = dSma.nextValue(k);\n                tick = yield {\n                    k: format(k),\n                    d: (d !== undefined) ? format(d) : undefined\n                };\n            }\n        })();\n        this.generator.next();\n        lows.forEach((tick, index) => {\n            var result = this.generator.next({\n                high: highs[index],\n                low: lows[index],\n                close: closes[index]\n            });\n            if (result.value !== undefined) {\n                this.result.push(result.value);\n            }\n        });\n    }\n    ;\n    nextValue(input) {\n        let nextResult = this.generator.next(input);\n        if (nextResult.value !== undefined)\n            return nextResult.value;\n    }\n    ;\n}\nStochastic.calculate = stochastic;\nexport function stochastic(input) {\n    Indicator.reverseInputs(input);\n    var result = new Stochastic(input).result;\n    if (input.reversedInput) {\n        result.reverse();\n    }\n    Indicator.reverseInputs(input);\n    return result;\n}\n;\n","import { IndicatorInput, Indicator } from \"../indicator/indicator\";\nimport LinkedList from \"../Utils/FixedSizeLinkedList\";\nexport class WilliamsRInput extends IndicatorInput {\n}\nexport class WilliamsR extends Indicator {\n    constructor(input) {\n        super(input);\n        let lows = input.low;\n        let highs = input.high;\n        let closes = input.close;\n        let period = input.period;\n        let format = this.format;\n        if (!(lows.length === highs.length && highs.length === closes.length)) {\n            throw \"Inputs(low,high, close) not of equal size\";\n        }\n        this.result = [];\n        //%R = (Highest High - Close)/(Highest High - Lowest Low) * -100\n        //Lowest Low = lowest low for the look-back period\n        //Highest High = highest high for the look-back period\n        //%R is multiplied by -100 correct the inversion and move the decimal.\n        this.generator = (function* () {\n            let index = 1;\n            let pastHighPeriods = new LinkedList(period, true, false);\n            let pastLowPeriods = new LinkedList(period, false, true);\n            let periodLow;\n            let periodHigh;\n            var tick = yield;\n            let williamsR;\n            while (true) {\n                pastHighPeriods.push(tick.high);\n                pastLowPeriods.push(tick.low);\n                if (index < period) {\n                    index++;\n                    tick = yield;\n                    continue;\n                }\n                periodLow = pastLowPeriods.periodLow;\n                periodHigh = pastHighPeriods.periodHigh;\n                williamsR = format(((periodHigh - tick.close) / (periodHigh - periodLow)) *\n                    -100);\n                tick = yield williamsR;\n            }\n        })();\n        this.generator.next();\n        lows.forEach((low, index) => {\n            var result = this.generator.next({\n                high: highs[index],\n                low: lows[index],\n                close: closes[index],\n            });\n            if (result.value !== undefined) {\n                this.result.push(result.value);\n            }\n        });\n    }\n    nextValue(price) {\n        var nextResult = this.generator.next(price);\n        if (nextResult.value != undefined)\n            return this.format(nextResult.value);\n    }\n}\nWilliamsR.calculate = williamsr;\nexport function williamsr(input) {\n    Indicator.reverseInputs(input);\n    var result = new WilliamsR(input).result;\n    if (input.reversedInput) {\n        result.reverse();\n    }\n    Indicator.reverseInputs(input);\n    return result;\n}\n","/**\n * Created by AAravindan on 5/17/16.\n */\nimport { Indicator, IndicatorInput } from \"../indicator/indicator\";\nexport class ADLInput extends IndicatorInput {\n}\nexport class ADL extends Indicator {\n    constructor(input) {\n        super(input);\n        var highs = input.high;\n        var lows = input.low;\n        var closes = input.close;\n        var volumes = input.volume;\n        if (!(lows.length === highs.length &&\n            highs.length === closes.length &&\n            highs.length === volumes.length)) {\n            throw \"Inputs(low,high, close, volumes) not of equal size\";\n        }\n        this.result = [];\n        this.generator = (function* () {\n            var result = 0;\n            var tick;\n            tick = yield;\n            while (true) {\n                let moneyFlowMultiplier = (tick.close - tick.low - (tick.high - tick.close)) /\n                    (tick.high - tick.low);\n                moneyFlowMultiplier = isNaN(moneyFlowMultiplier)\n                    ? 1\n                    : moneyFlowMultiplier;\n                let moneyFlowVolume = moneyFlowMultiplier * tick.volume;\n                result = result + moneyFlowVolume;\n                tick = yield Math.round(result);\n            }\n        })();\n        this.generator.next();\n        highs.forEach((tickHigh, index) => {\n            var tickInput = {\n                high: tickHigh,\n                low: lows[index],\n                close: closes[index],\n                volume: volumes[index],\n            };\n            var result = this.generator.next(tickInput);\n            if (result.value != undefined) {\n                this.result.push(result.value);\n            }\n        });\n    }\n    nextValue(price) {\n        return this.generator.next(price).value;\n    }\n}\nADL.calculate = adl;\nexport function adl(input) {\n    Indicator.reverseInputs(input);\n    var result = new ADL(input).result;\n    if (input.reversedInput) {\n        result.reverse();\n    }\n    Indicator.reverseInputs(input);\n    return result;\n}\n","import { Indicator, IndicatorInput } from '../indicator/indicator';\n/**\n * Created by AAravindan on 5/17/16.\n */\n\"use strict\";\nexport class OBVInput extends IndicatorInput {\n}\nexport class OBV extends Indicator {\n    constructor(input) {\n        super(input);\n        var closes = input.close;\n        var volumes = input.volume;\n        this.result = [];\n        this.generator = (function* () {\n            var result = 0;\n            var tick;\n            var lastClose;\n            tick = yield;\n            if (tick.close && (typeof tick.close === 'number')) {\n                lastClose = tick.close;\n                tick = yield;\n            }\n            while (true) {\n                if (lastClose < tick.close) {\n                    result = result + tick.volume;\n                }\n                else if (tick.close < lastClose) {\n                    result = result - tick.volume;\n                }\n                lastClose = tick.close;\n                tick = yield result;\n            }\n        })();\n        this.generator.next();\n        closes.forEach((close, index) => {\n            let tickInput = {\n                close: closes[index],\n                volume: volumes[index]\n            };\n            let result = this.generator.next(tickInput);\n            if (result.value != undefined) {\n                this.result.push(result.value);\n            }\n        });\n    }\n    nextValue(price) {\n        return this.generator.next(price).value;\n    }\n    ;\n}\nOBV.calculate = obv;\nexport function obv(input) {\n    Indicator.reverseInputs(input);\n    var result = new OBV(input).result;\n    if (input.reversedInput) {\n        result.reverse();\n    }\n    Indicator.reverseInputs(input);\n    return result;\n}\n;\n","/**\n * Created by AAravindan on 5/9/16.\n */\n\"use strict\";\nimport { ROC } from \"./ROC.js\";\nimport { EMA } from \"../moving_averages/EMA.js\";\nimport { Indicator, IndicatorInput } from \"../indicator/indicator\";\nexport class TRIXInput extends IndicatorInput {\n}\nexport class TRIX extends Indicator {\n    constructor(input) {\n        super(input);\n        let priceArray = input.values;\n        let period = input.period;\n        let format = this.format;\n        let ema = new EMA({\n            period: period,\n            values: [],\n            format: (v) => {\n                return v;\n            },\n        });\n        let emaOfema = new EMA({\n            period: period,\n            values: [],\n            format: (v) => {\n                return v;\n            },\n        });\n        let emaOfemaOfema = new EMA({\n            period: period,\n            values: [],\n            format: (v) => {\n                return v;\n            },\n        });\n        let trixROC = new ROC({\n            period: 1,\n            values: [],\n            format: (v) => {\n                return v;\n            },\n        });\n        this.result = [];\n        this.generator = (function* () {\n            let tick = yield;\n            while (true) {\n                let initialema = ema.nextValue(tick);\n                let smoothedResult = initialema\n                    ? emaOfema.nextValue(initialema)\n                    : undefined;\n                let doubleSmoothedResult = smoothedResult\n                    ? emaOfemaOfema.nextValue(smoothedResult)\n                    : undefined;\n                let result = doubleSmoothedResult\n                    ? trixROC.nextValue(doubleSmoothedResult)\n                    : undefined;\n                tick = yield result ? format(result) : undefined;\n            }\n        })();\n        this.generator.next();\n        priceArray.forEach((tick) => {\n            let result = this.generator.next(tick);\n            if (result.value !== undefined) {\n                this.result.push(result.value);\n            }\n        });\n    }\n    nextValue(price) {\n        let nextResult = this.generator.next(price);\n        if (nextResult.value !== undefined)\n            return nextResult.value;\n    }\n}\nTRIX.calculate = trix;\nexport function trix(input) {\n    Indicator.reverseInputs(input);\n    var result = new TRIX(input).result;\n    if (input.reversedInput) {\n        result.reverse();\n    }\n    Indicator.reverseInputs(input);\n    return result;\n}\n","import { EMA } from \"../moving_averages/EMA\";\nimport { Indicator, IndicatorInput } from \"../indicator/indicator\";\nexport class ForceIndexInput extends IndicatorInput {\n    constructor() {\n        super(...arguments);\n        this.period = 1;\n    }\n}\nexport class ForceIndex extends Indicator {\n    constructor(input) {\n        super(input);\n        var closes = input.close;\n        var volumes = input.volume;\n        var period = input.period || 1;\n        if (!(volumes.length === closes.length)) {\n            throw \"Inputs(volume, close) not of equal size\";\n        }\n        let emaForceIndex = new EMA({ values: [], period: period });\n        this.result = [];\n        this.generator = (function* () {\n            var previousTick = yield;\n            var tick = yield;\n            let forceIndex;\n            while (true) {\n                forceIndex = (tick.close - previousTick.close) * tick.volume;\n                previousTick = tick;\n                tick = yield emaForceIndex.nextValue(forceIndex);\n            }\n        })();\n        this.generator.next();\n        volumes.forEach((tick, index) => {\n            var result = this.generator.next({\n                close: closes[index],\n                volume: volumes[index],\n            });\n            if (result.value != undefined) {\n                this.result.push(result.value);\n            }\n        });\n    }\n    nextValue(price) {\n        let result = this.generator.next(price).value;\n        if (result != undefined) {\n            return result;\n        }\n    }\n}\nForceIndex.calculate = forceindex;\nexport function forceindex(input) {\n    Indicator.reverseInputs(input);\n    var result = new ForceIndex(input).result;\n    if (input.reversedInput) {\n        result.reverse();\n    }\n    Indicator.reverseInputs(input);\n    return result;\n}\n","import { Indicator, IndicatorInput } from \"../indicator/indicator\";\nimport { SMA } from \"../moving_averages/SMA\";\nimport LinkedList from \"../Utils/FixedSizeLinkedList\";\nexport class CCIInput extends IndicatorInput {\n}\nexport class CCI extends Indicator {\n    constructor(input) {\n        super(input);\n        var lows = input.low;\n        var highs = input.high;\n        var closes = input.close;\n        var period = input.period;\n        var format = this.format;\n        let constant = 0.015;\n        var currentTpSet = new LinkedList(period);\n        var tpSMACalculator = new SMA({\n            period: period,\n            values: [],\n            format: (v) => {\n                return v;\n            },\n        });\n        if (!(lows.length === highs.length && highs.length === closes.length)) {\n            throw \"Inputs(low,high, close) not of equal size\";\n        }\n        this.result = [];\n        this.generator = (function* () {\n            var tick = yield;\n            while (true) {\n                let tp = (tick.high + tick.low + tick.close) / 3;\n                currentTpSet.push(tp);\n                let smaTp = tpSMACalculator.nextValue(tp);\n                let meanDeviation = null;\n                let cci;\n                let sum = 0;\n                if (smaTp != undefined) {\n                    //First, subtract the most recent 20-period average of the typical price from each period's typical price.\n                    //Second, take the absolute values of these numbers.\n                    //Third,sum the absolute values.\n                    for (let x of currentTpSet.iterator()) {\n                        sum = sum + Math.abs(x - smaTp);\n                    }\n                    //Fourth, divide by the total number of periods (20).\n                    meanDeviation = sum / period;\n                    cci = (tp - smaTp) / (constant * meanDeviation);\n                }\n                tick = yield cci;\n            }\n        })();\n        this.generator.next();\n        lows.forEach((tick, index) => {\n            var result = this.generator.next({\n                high: highs[index],\n                low: lows[index],\n                close: closes[index],\n            });\n            if (result.value != undefined) {\n                this.result.push(result.value);\n            }\n        });\n    }\n    nextValue(price) {\n        let result = this.generator.next(price).value;\n        if (result != undefined) {\n            return result;\n        }\n    }\n}\nCCI.calculate = cci;\nexport function cci(input) {\n    Indicator.reverseInputs(input);\n    var result = new CCI(input).result;\n    if (input.reversedInput) {\n        result.reverse();\n    }\n    Indicator.reverseInputs(input);\n    return result;\n}\n","import { Indicator, IndicatorInput } from \"../indicator/indicator\";\nimport { SMA } from \"../moving_averages/SMA\";\nexport class AwesomeOscillatorInput extends IndicatorInput {\n}\nexport class AwesomeOscillator extends Indicator {\n    constructor(input) {\n        super(input);\n        var highs = input.high;\n        var lows = input.low;\n        var fastPeriod = input.fastPeriod;\n        var slowPeriod = input.slowPeriod;\n        var slowSMA = new SMA({ values: [], period: slowPeriod });\n        var fastSMA = new SMA({ values: [], period: fastPeriod });\n        this.result = [];\n        this.generator = (function* () {\n            var result;\n            var tick;\n            var medianPrice;\n            var slowSmaValue;\n            var fastSmaValue;\n            tick = yield;\n            while (true) {\n                medianPrice = (tick.high + tick.low) / 2;\n                slowSmaValue = slowSMA.nextValue(medianPrice);\n                fastSmaValue = fastSMA.nextValue(medianPrice);\n                if (slowSmaValue !== undefined && fastSmaValue !== undefined) {\n                    result = fastSmaValue - slowSmaValue;\n                }\n                tick = yield result;\n            }\n        })();\n        this.generator.next();\n        highs.forEach((tickHigh, index) => {\n            var tickInput = {\n                high: tickHigh,\n                low: lows[index],\n            };\n            var result = this.generator.next(tickInput);\n            if (result.value != undefined) {\n                this.result.push(this.format(result.value));\n            }\n        });\n    }\n    nextValue(price) {\n        var result = this.generator.next(price);\n        if (result.value != undefined) {\n            return this.format(result.value);\n        }\n    }\n}\nAwesomeOscillator.calculate = awesomeoscillator;\nexport function awesomeoscillator(input) {\n    Indicator.reverseInputs(input);\n    var result = new AwesomeOscillator(input).result;\n    if (input.reversedInput) {\n        result.reverse();\n    }\n    Indicator.reverseInputs(input);\n    return result;\n}\n","import { Indicator, IndicatorInput } from \"../indicator/indicator\";\nexport class VWAPInput extends IndicatorInput {\n}\nexport class VWAP extends Indicator {\n    constructor(input) {\n        super(input);\n        var lows = input.low;\n        var highs = input.high;\n        var closes = input.close;\n        var volumes = input.volume;\n        var format = this.format;\n        if (!(lows.length === highs.length && highs.length === closes.length)) {\n            throw \"Inputs(low,high, close) not of equal size\";\n        }\n        this.result = [];\n        this.generator = (function* () {\n            let tick = yield;\n            let cumulativeTotal = 0;\n            let cumulativeVolume = 0;\n            while (true) {\n                let typicalPrice = (tick.high + tick.low + tick.close) / 3;\n                let total = tick.volume * typicalPrice;\n                cumulativeTotal = cumulativeTotal + total;\n                cumulativeVolume = cumulativeVolume + tick.volume;\n                tick = yield cumulativeTotal / cumulativeVolume;\n            }\n        })();\n        this.generator.next();\n        lows.forEach((tick, index) => {\n            let result = this.generator.next({\n                high: highs[index],\n                low: lows[index],\n                close: closes[index],\n                volume: volumes[index],\n            });\n            if (result.value != undefined) {\n                this.result.push(result.value);\n            }\n        });\n    }\n    nextValue(price) {\n        let result = this.generator.next(price).value;\n        if (result != undefined) {\n            return result;\n        }\n    }\n}\nVWAP.calculate = vwap;\nexport function vwap(input) {\n    Indicator.reverseInputs(input);\n    var result = new VWAP(input).result;\n    if (input.reversedInput) {\n        result.reverse();\n    }\n    Indicator.reverseInputs(input);\n    return result;\n}\n","import { Indicator, IndicatorInput } from '../indicator/indicator';\nexport class VolumeProfileInput extends IndicatorInput {\n}\nexport class VolumeProfileOutput {\n}\nexport function priceFallsBetweenBarRange(low, high, low1, high1) {\n    return (low <= low1 && high >= low1) || (low1 <= low && high1 >= low);\n}\nexport class VolumeProfile extends Indicator {\n    constructor(input) {\n        super(input);\n        var highs = input.high;\n        var lows = input.low;\n        var closes = input.close;\n        var opens = input.open;\n        var volumes = input.volume;\n        var bars = input.noOfBars;\n        if (!((lows.length === highs.length) && (highs.length === closes.length) && (highs.length === volumes.length))) {\n            throw ('Inputs(low,high, close, volumes) not of equal size');\n        }\n        this.result = [];\n        var max = Math.max(...highs, ...lows, ...closes, ...opens);\n        var min = Math.min(...highs, ...lows, ...closes, ...opens);\n        var barRange = (max - min) / bars;\n        var lastEnd = min;\n        for (let i = 0; i < bars; i++) {\n            let rangeStart = lastEnd;\n            let rangeEnd = rangeStart + barRange;\n            lastEnd = rangeEnd;\n            let bullishVolume = 0;\n            let bearishVolume = 0;\n            let totalVolume = 0;\n            for (let priceBar = 0; priceBar < highs.length; priceBar++) {\n                let priceBarStart = lows[priceBar];\n                let priceBarEnd = highs[priceBar];\n                let priceBarOpen = opens[priceBar];\n                let priceBarClose = closes[priceBar];\n                let priceBarVolume = volumes[priceBar];\n                if (priceFallsBetweenBarRange(rangeStart, rangeEnd, priceBarStart, priceBarEnd)) {\n                    totalVolume = totalVolume + priceBarVolume;\n                    if (priceBarOpen > priceBarClose) {\n                        bearishVolume = bearishVolume + priceBarVolume;\n                    }\n                    else {\n                        bullishVolume = bullishVolume + priceBarVolume;\n                    }\n                }\n            }\n            this.result.push({\n                rangeStart, rangeEnd, bullishVolume, bearishVolume, totalVolume\n            });\n        }\n    }\n    ;\n    nextValue(price) {\n        throw ('Next value not supported for volume profile');\n    }\n    ;\n}\nVolumeProfile.calculate = volumeprofile;\nexport function volumeprofile(input) {\n    Indicator.reverseInputs(input);\n    var result = new VolumeProfile(input).result;\n    if (input.reversedInput) {\n        result.reverse();\n    }\n    Indicator.reverseInputs(input);\n    return result;\n}\n;\n","/**\n * Created by AAravindan on 5/4/16.\n */\nimport { Indicator, IndicatorInput } from \"../indicator/indicator\";\nexport class TypicalPriceInput extends IndicatorInput {\n}\nexport class TypicalPrice extends Indicator {\n    constructor(input) {\n        super(input);\n        this.result = [];\n        this.generator = (function* () {\n            let priceInput = yield;\n            while (true) {\n                priceInput = yield (priceInput.high +\n                    priceInput.low +\n                    priceInput.close) /\n                    3;\n            }\n        })();\n        this.generator.next();\n        input.low.forEach((tick, index) => {\n            var result = this.generator.next({\n                high: input.high[index],\n                low: input.low[index],\n                close: input.close[index],\n            });\n            this.result.push(result.value);\n        });\n    }\n    nextValue(price) {\n        var result = this.generator.next(price).value;\n        return result;\n    }\n}\nTypicalPrice.calculate = typicalprice;\nexport function typicalprice(input) {\n    Indicator.reverseInputs(input);\n    var result = new TypicalPrice(input).result;\n    if (input.reversedInput) {\n        result.reverse();\n    }\n    Indicator.reverseInputs(input);\n    return result;\n}\n","/**\n * Created by AAravindan on 5/17/16.\n */\nimport { Indicator, IndicatorInput } from '../indicator/indicator';\nimport { TypicalPrice } from '../chart_types/TypicalPrice';\nimport FixedSizeLinkedList from '../Utils/FixedSizeLinkedList';\nexport class MFIInput extends IndicatorInput {\n}\nexport class MFI extends Indicator {\n    constructor(input) {\n        super(input);\n        var highs = input.high;\n        var lows = input.low;\n        var closes = input.close;\n        var volumes = input.volume;\n        var period = input.period;\n        var typicalPrice = new TypicalPrice({ low: [], high: [], close: [] });\n        var positiveFlow = new FixedSizeLinkedList(period, false, false, true);\n        var negativeFlow = new FixedSizeLinkedList(period, false, false, true);\n        if (!((lows.length === highs.length) && (highs.length === closes.length) && (highs.length === volumes.length))) {\n            throw ('Inputs(low,high, close, volumes) not of equal size');\n        }\n        this.result = [];\n        this.generator = (function* () {\n            var result;\n            var tick;\n            var lastClose;\n            var positiveFlowForPeriod;\n            var rawMoneyFlow = 0;\n            var moneyFlowRatio;\n            var negativeFlowForPeriod;\n            let typicalPriceValue = null;\n            let prevousTypicalPrice = null;\n            tick = yield;\n            lastClose = tick.close; //Fist value \n            tick = yield;\n            while (true) {\n                var { high, low, close, volume } = tick;\n                var positionMoney = 0;\n                var negativeMoney = 0;\n                typicalPriceValue = typicalPrice.nextValue({ high, low, close });\n                rawMoneyFlow = typicalPriceValue * volume;\n                if ((typicalPriceValue != null) && (prevousTypicalPrice != null)) {\n                    typicalPriceValue > prevousTypicalPrice ? positionMoney = rawMoneyFlow : negativeMoney = rawMoneyFlow;\n                    positiveFlow.push(positionMoney);\n                    negativeFlow.push(negativeMoney);\n                    positiveFlowForPeriod = positiveFlow.periodSum;\n                    negativeFlowForPeriod = negativeFlow.periodSum;\n                    if ((positiveFlow.totalPushed >= period) && (positiveFlow.totalPushed >= period)) {\n                        moneyFlowRatio = positiveFlowForPeriod / negativeFlowForPeriod;\n                        result = 100 - 100 / (1 + moneyFlowRatio);\n                    }\n                }\n                prevousTypicalPrice = typicalPriceValue;\n                tick = yield result;\n            }\n        })();\n        this.generator.next();\n        highs.forEach((tickHigh, index) => {\n            var tickInput = {\n                high: tickHigh,\n                low: lows[index],\n                close: closes[index],\n                volume: volumes[index]\n            };\n            var result = this.generator.next(tickInput);\n            if (result.value != undefined) {\n                this.result.push(parseFloat(result.value.toFixed(2)));\n            }\n        });\n    }\n    ;\n    nextValue(price) {\n        var result = this.generator.next(price);\n        if (result.value != undefined) {\n            return (parseFloat(result.value.toFixed(2)));\n        }\n    }\n    ;\n}\nMFI.calculate = mfi;\nexport function mfi(input) {\n    Indicator.reverseInputs(input);\n    var result = new MFI(input).result;\n    if (input.reversedInput) {\n        result.reverse();\n    }\n    Indicator.reverseInputs(input);\n    return result;\n}\n;\n","import { IndicatorInput, Indicator } from \"../indicator/indicator\";\n/**\n * Created by AAravindan on 5/10/16.\n */\n\"use strict\";\nimport { SMA } from \"../moving_averages/SMA\";\nimport { RSI } from \"../oscillators/RSI\";\nimport { Stochastic } from \"../momentum/Stochastic\";\nexport class StochasticRsiInput extends IndicatorInput {\n}\nexport class StochasticRSIOutput {\n}\nexport class StochasticRSI extends Indicator {\n    constructor(input) {\n        super(input);\n        let closes = input.values;\n        let rsiPeriod = input.rsiPeriod;\n        let stochasticPeriod = input.stochasticPeriod;\n        let kPeriod = input.kPeriod;\n        let dPeriod = input.dPeriod;\n        let format = this.format;\n        this.result = [];\n        this.generator = (function* () {\n            let index = 1;\n            let rsi = new RSI({ period: rsiPeriod, values: [] });\n            let stochastic = new Stochastic({\n                period: stochasticPeriod,\n                high: [],\n                low: [],\n                close: [],\n                signalPeriod: kPeriod,\n            });\n            let dSma = new SMA({\n                period: dPeriod,\n                values: [],\n                format: (v) => {\n                    return v;\n                },\n            });\n            let lastRSI, stochasticRSI, d, result;\n            var tick = yield;\n            while (true) {\n                lastRSI = rsi.nextValue(tick);\n                if (lastRSI !== undefined) {\n                    var stochasticInput = {\n                        high: lastRSI,\n                        low: lastRSI,\n                        close: lastRSI,\n                    };\n                    stochasticRSI = stochastic.nextValue(stochasticInput);\n                    if (stochasticRSI !== undefined &&\n                        stochasticRSI.d !== undefined) {\n                        d = dSma.nextValue(stochasticRSI.d);\n                        if (d !== undefined)\n                            result = {\n                                stochRSI: stochasticRSI.k,\n                                k: stochasticRSI.d,\n                                d: d,\n                            };\n                    }\n                }\n                tick = yield result;\n            }\n        })();\n        this.generator.next();\n        closes.forEach((tick, index) => {\n            var result = this.generator.next(tick);\n            if (result.value !== undefined) {\n                this.result.push(result.value);\n            }\n        });\n    }\n    nextValue(input) {\n        let nextResult = this.generator.next(input);\n        if (nextResult.value !== undefined)\n            return nextResult.value;\n    }\n}\nStochasticRSI.calculate = stochasticrsi;\nexport function stochasticrsi(input) {\n    Indicator.reverseInputs(input);\n    var result = new StochasticRSI(input).result;\n    if (input.reversedInput) {\n        result.reverse();\n    }\n    Indicator.reverseInputs(input);\n    return result;\n}\n","import { Indicator, IndicatorInput } from '../indicator/indicator';\nimport FixedSizedLinkedList from './FixedSizeLinkedList';\nexport class HighestInput extends IndicatorInput {\n}\nexport class Highest extends Indicator {\n    constructor(input) {\n        super(input);\n        var values = input.values;\n        var period = input.period;\n        this.result = [];\n        var periodList = new FixedSizedLinkedList(period, true, false, false);\n        this.generator = (function* () {\n            var result;\n            var tick;\n            var high;\n            tick = yield;\n            while (true) {\n                periodList.push(tick);\n                if (periodList.totalPushed >= period) {\n                    high = periodList.periodHigh;\n                }\n                tick = yield high;\n            }\n        })();\n        this.generator.next();\n        values.forEach((value, index) => {\n            var result = this.generator.next(value);\n            if (result.value != undefined) {\n                this.result.push(result.value);\n            }\n        });\n    }\n    ;\n    nextValue(price) {\n        var result = this.generator.next(price);\n        if (result.value != undefined) {\n            return result.value;\n        }\n    }\n    ;\n}\nHighest.calculate = highest;\nexport function highest(input) {\n    Indicator.reverseInputs(input);\n    var result = new Highest(input).result;\n    if (input.reversedInput) {\n        result.reverse();\n    }\n    Indicator.reverseInputs(input);\n    return result;\n}\n;\n","import { Indicator, IndicatorInput } from '../indicator/indicator';\nimport FixedSizedLinkedList from './FixedSizeLinkedList';\nexport class LowestInput extends IndicatorInput {\n}\nexport class Lowest extends Indicator {\n    constructor(input) {\n        super(input);\n        var values = input.values;\n        var period = input.period;\n        this.result = [];\n        var periodList = new FixedSizedLinkedList(period, false, true, false);\n        this.generator = (function* () {\n            var result;\n            var tick;\n            var high;\n            tick = yield;\n            while (true) {\n                periodList.push(tick);\n                if (periodList.totalPushed >= period) {\n                    high = periodList.periodLow;\n                }\n                tick = yield high;\n            }\n        })();\n        this.generator.next();\n        values.forEach((value, index) => {\n            var result = this.generator.next(value);\n            if (result.value != undefined) {\n                this.result.push(result.value);\n            }\n        });\n    }\n    ;\n    nextValue(price) {\n        var result = this.generator.next(price);\n        if (result.value != undefined) {\n            return result.value;\n        }\n    }\n    ;\n}\nLowest.calculate = lowest;\nexport function lowest(input) {\n    Indicator.reverseInputs(input);\n    var result = new Lowest(input).result;\n    if (input.reversedInput) {\n        result.reverse();\n    }\n    Indicator.reverseInputs(input);\n    return result;\n}\n;\n","import { Indicator, IndicatorInput } from '../indicator/indicator';\nimport FixedSizedLinkedList from './FixedSizeLinkedList';\nexport class SumInput extends IndicatorInput {\n}\nexport class Sum extends Indicator {\n    constructor(input) {\n        super(input);\n        var values = input.values;\n        var period = input.period;\n        this.result = [];\n        var periodList = new FixedSizedLinkedList(period, false, false, true);\n        this.generator = (function* () {\n            var result;\n            var tick;\n            var high;\n            tick = yield;\n            while (true) {\n                periodList.push(tick);\n                if (periodList.totalPushed >= period) {\n                    high = periodList.periodSum;\n                }\n                tick = yield high;\n            }\n        })();\n        this.generator.next();\n        values.forEach((value, index) => {\n            var result = this.generator.next(value);\n            if (result.value != undefined) {\n                this.result.push(result.value);\n            }\n        });\n    }\n    ;\n    nextValue(price) {\n        var result = this.generator.next(price);\n        if (result.value != undefined) {\n            return result.value;\n        }\n    }\n    ;\n}\nSum.calculate = sum;\nexport function sum(input) {\n    Indicator.reverseInputs(input);\n    var result = new Sum(input).result;\n    if (input.reversedInput) {\n        result.reverse();\n    }\n    Indicator.reverseInputs(input);\n    return result;\n}\n;\n","import { CandleList } from \"../StockData\";\nimport { atr } from \"../directionalmovement/ATR\";\n/**\n * Created by AAravindan on 5/4/16.\n */\nimport { Indicator, IndicatorInput } from \"../indicator/indicator\";\nexport class RenkoInput extends IndicatorInput {\n}\nclass Renko extends Indicator {\n    constructor(input) {\n        super(input);\n        var format = this.format;\n        let useATR = input.useATR;\n        let brickSize = input.brickSize || 0;\n        if (useATR) {\n            let atrResult = atr(Object.assign({}, input));\n            brickSize = atrResult[atrResult.length - 1];\n        }\n        this.result = new CandleList();\n        if (brickSize === 0) {\n            console.error(\"Not enough data to calculate brickSize for renko when using ATR\");\n            return;\n        }\n        let lastOpen = 0;\n        let lastHigh = 0;\n        let lastLow = Infinity;\n        let lastClose = 0;\n        let lastVolume = 0;\n        let lastTimestamp = 0;\n        this.generator = (function* () {\n            let candleData = yield;\n            while (true) {\n                //Calculating first bar\n                if (lastOpen === 0) {\n                    lastOpen = candleData.close;\n                    lastHigh = candleData.high;\n                    lastLow = candleData.low;\n                    lastClose = candleData.close;\n                    lastVolume = candleData.volume;\n                    lastTimestamp = candleData.timestamp;\n                    candleData = yield;\n                    continue;\n                }\n                let absoluteMovementFromClose = Math.abs(candleData.close - lastClose);\n                let absoluteMovementFromOpen = Math.abs(candleData.close - lastOpen);\n                if (absoluteMovementFromClose >= brickSize &&\n                    absoluteMovementFromOpen >= brickSize) {\n                    let reference = absoluteMovementFromClose > absoluteMovementFromOpen\n                        ? lastOpen\n                        : lastClose;\n                    let calculated = {\n                        open: reference,\n                        high: lastHigh > candleData.high\n                            ? lastHigh\n                            : candleData.high,\n                        low: lastLow < candleData.low ? lastLow : candleData.low,\n                        close: reference > candleData.close\n                            ? reference - brickSize\n                            : reference + brickSize,\n                        volume: lastVolume + candleData.volume,\n                        timestamp: candleData.timestamp,\n                    };\n                    lastOpen = calculated.open;\n                    lastHigh = calculated.close;\n                    lastLow = calculated.close;\n                    lastClose = calculated.close;\n                    lastVolume = 0;\n                    candleData = yield calculated;\n                }\n                else {\n                    lastHigh =\n                        lastHigh > candleData.high ? lastHigh : candleData.high;\n                    lastLow =\n                        lastLow < candleData.low ? lastLow : candleData.low;\n                    lastVolume = lastVolume + candleData.volume;\n                    lastTimestamp = candleData.timestamp;\n                    candleData = yield;\n                }\n            }\n        })();\n        this.generator.next();\n        input.low.forEach((tick, index) => {\n            var result = this.generator.next({\n                open: input.open[index],\n                high: input.high[index],\n                low: input.low[index],\n                close: input.close[index],\n                volume: input.volume[index],\n                timestamp: input.timestamp[index],\n            });\n            if (result.value) {\n                this.result.open.push(result.value.open);\n                this.result.high.push(result.value.high);\n                this.result.low.push(result.value.low);\n                this.result.close.push(result.value.close);\n                this.result.volume.push(result.value.volume);\n                this.result.timestamp.push(result.value.timestamp);\n            }\n        });\n    }\n    nextValue(price) {\n        console.error(\"Cannot calculate next value on Renko, Every value has to be recomputed for every change, use calcualte method\");\n        return null;\n    }\n}\nRenko.calculate = renko;\nexport function renko(input) {\n    Indicator.reverseInputs(input);\n    var result = new Renko(input).result;\n    if (input.reversedInput) {\n        result.open.reverse();\n        result.high.reverse();\n        result.low.reverse();\n        result.close.reverse();\n        result.volume.reverse();\n        result.timestamp.reverse();\n    }\n    Indicator.reverseInputs(input);\n    return result;\n}\n","import { CandleList } from \"../StockData\";\n/**\n * Created by AAravindan on 5/4/16.\n */\nimport { Indicator, IndicatorInput } from \"../indicator/indicator\";\nexport class HeikinAshiInput extends IndicatorInput {\n}\nexport class HeikinAshi extends Indicator {\n    constructor(input) {\n        super(input);\n        var format = this.format;\n        this.result = new CandleList();\n        let lastOpen = null;\n        let lastHigh = 0;\n        let lastLow = Infinity;\n        let lastClose = 0;\n        let lastVolume = 0;\n        let lastTimestamp = 0;\n        this.generator = (function* () {\n            let candleData = yield;\n            let calculated = null;\n            while (true) {\n                if (lastOpen === null) {\n                    lastOpen = (candleData.close + candleData.open) / 2;\n                    lastHigh = candleData.high;\n                    lastLow = candleData.low;\n                    lastClose =\n                        (candleData.close +\n                            candleData.open +\n                            candleData.high +\n                            candleData.low) /\n                            4;\n                    lastVolume = candleData.volume || 0;\n                    lastTimestamp = candleData.timestamp || 0;\n                    calculated = {\n                        open: lastOpen,\n                        high: lastHigh,\n                        low: lastLow,\n                        close: lastClose,\n                        volume: candleData.volume || 0,\n                        timestamp: candleData.timestamp || 0,\n                    };\n                }\n                else {\n                    let newClose = (candleData.close +\n                        candleData.open +\n                        candleData.high +\n                        candleData.low) /\n                        4;\n                    let newOpen = (lastOpen + lastClose) / 2;\n                    let newHigh = Math.max(newOpen, newClose, candleData.high);\n                    let newLow = Math.min(candleData.low, newOpen, newClose);\n                    calculated = {\n                        close: newClose,\n                        open: newOpen,\n                        high: newHigh,\n                        low: newLow,\n                        volume: candleData.volume || 0,\n                        timestamp: candleData.timestamp || 0,\n                    };\n                    lastClose = newClose;\n                    lastOpen = newOpen;\n                    lastHigh = newHigh;\n                    lastLow = newLow;\n                }\n                candleData = yield calculated;\n            }\n        })();\n        this.generator.next();\n        input.low.forEach((tick, index) => {\n            var result = this.generator.next({\n                open: input.open[index],\n                high: input.high[index],\n                low: input.low[index],\n                close: input.close[index],\n                volume: input.volume ? input.volume[index] : input.volume,\n                timestamp: input.timestamp\n                    ? input.timestamp[index]\n                    : input.timestamp,\n            });\n            if (result.value) {\n                this.result.open.push(result.value.open);\n                this.result.high.push(result.value.high);\n                this.result.low.push(result.value.low);\n                this.result.close.push(result.value.close);\n                this.result.volume.push(result.value.volume);\n                this.result.timestamp.push(result.value.timestamp);\n            }\n        });\n    }\n    nextValue(price) {\n        var result = this.generator.next(price).value;\n        return result;\n    }\n}\nHeikinAshi.calculate = heikinashi;\nexport function heikinashi(input) {\n    Indicator.reverseInputs(input);\n    var result = new HeikinAshi(input).result;\n    if (input.reversedInput) {\n        result.open.reverse();\n        result.high.reverse();\n        result.low.reverse();\n        result.close.reverse();\n        result.volume.reverse();\n        result.timestamp.reverse();\n    }\n    Indicator.reverseInputs(input);\n    return result;\n}\n","export default class CandlestickFinder {\n    constructor() {\n        // if (new.target === Abstract) {\n        //     throw new TypeError(\"Abstract class\");\n        // }\n    }\n    approximateEqual(a, b) {\n        let left = parseFloat(Math.abs(a - b).toPrecision(4)) * 1;\n        let right = parseFloat((a * 0.001).toPrecision(4)) * 1;\n        return left <= right;\n    }\n    logic(data) {\n        throw \"this has to be implemented\";\n    }\n    getAllPatternIndex(data) {\n        if (data.close.length < this.requiredCount) {\n            console.warn('Data count less than data required for the strategy ', this.name);\n            return [];\n        }\n        if (data.reversedInput) {\n            data.open.reverse();\n            data.high.reverse();\n            data.low.reverse();\n            data.close.reverse();\n        }\n        let strategyFn = this.logic;\n        return this._generateDataForCandleStick(data)\n            .map((current, index) => {\n            return strategyFn.call(this, current) ? index : undefined;\n        }).filter((hasIndex) => {\n            return hasIndex;\n        });\n    }\n    hasPattern(data) {\n        if (data.close.length < this.requiredCount) {\n            console.warn('Data count less than data required for the strategy ', this.name);\n            return false;\n        }\n        if (data.reversedInput) {\n            data.open.reverse();\n            data.high.reverse();\n            data.low.reverse();\n            data.close.reverse();\n        }\n        let strategyFn = this.logic;\n        return strategyFn.call(this, this._getLastDataForCandleStick(data));\n    }\n    _getLastDataForCandleStick(data) {\n        let requiredCount = this.requiredCount;\n        if (data.close.length === requiredCount) {\n            return data;\n        }\n        else {\n            let returnVal = {\n                open: [],\n                high: [],\n                low: [],\n                close: []\n            };\n            let i = 0;\n            let index = data.close.length - requiredCount;\n            while (i < requiredCount) {\n                returnVal.open.push(data.open[index + i]);\n                returnVal.high.push(data.high[index + i]);\n                returnVal.low.push(data.low[index + i]);\n                returnVal.close.push(data.close[index + i]);\n                i++;\n            }\n            return returnVal;\n        }\n    }\n    _generateDataForCandleStick(data) {\n        let requiredCount = this.requiredCount;\n        let generatedData = data.close.map(function (currentData, index) {\n            let i = 0;\n            let returnVal = {\n                open: [],\n                high: [],\n                low: [],\n                close: []\n            };\n            while (i < requiredCount) {\n                returnVal.open.push(data.open[index + i]);\n                returnVal.high.push(data.high[index + i]);\n                returnVal.low.push(data.low[index + i]);\n                returnVal.close.push(data.close[index + i]);\n                i++;\n            }\n            return returnVal;\n        }).filter((val, index) => { return (index <= (data.close.length - requiredCount)); });\n        return generatedData;\n    }\n}\n","import CandlestickFinder from './CandlestickFinder';\nexport default class MorningStar extends CandlestickFinder {\n    constructor() {\n        super();\n        this.name = 'MorningStar';\n        this.requiredCount = 3;\n    }\n    logic(data) {\n        let firstdaysOpen = data.open[0];\n        let firstdaysClose = data.close[0];\n        let firstdaysHigh = data.high[0];\n        let firstdaysLow = data.low[0];\n        let seconddaysOpen = data.open[1];\n        let seconddaysClose = data.close[1];\n        let seconddaysHigh = data.high[1];\n        let seconddaysLow = data.low[1];\n        let thirddaysOpen = data.open[2];\n        let thirddaysClose = data.close[2];\n        let thirddaysHigh = data.high[2];\n        let thirddaysLow = data.low[2];\n        let firstdaysMidpoint = ((firstdaysOpen + firstdaysClose) / 2);\n        let isFirstBearish = firstdaysClose < firstdaysOpen;\n        let isSmallBodyExists = ((firstdaysLow > seconddaysLow) &&\n            (firstdaysLow > seconddaysHigh));\n        let isThirdBullish = thirddaysOpen < thirddaysClose;\n        let gapExists = ((seconddaysHigh < firstdaysLow) &&\n            (seconddaysLow < firstdaysLow) &&\n            (thirddaysOpen > seconddaysHigh) &&\n            (seconddaysClose < thirddaysOpen));\n        let doesCloseAboveFirstMidpoint = thirddaysClose > firstdaysMidpoint;\n        return (isFirstBearish && isSmallBodyExists && gapExists && isThirdBullish && doesCloseAboveFirstMidpoint);\n    }\n}\nexport function morningstar(data) {\n    return new MorningStar().hasPattern(data);\n}\n","import CandlestickFinder from './CandlestickFinder';\nexport default class BullishEngulfingPattern extends CandlestickFinder {\n    constructor() {\n        super();\n        this.name = 'BullishEngulfingPattern';\n        this.requiredCount = 2;\n    }\n    logic(data) {\n        let firstdaysOpen = data.open[0];\n        let firstdaysClose = data.close[0];\n        let firstdaysHigh = data.high[0];\n        let firstdaysLow = data.low[0];\n        let seconddaysOpen = data.open[1];\n        let seconddaysClose = data.close[1];\n        let seconddaysHigh = data.high[1];\n        let seconddaysLow = data.low[1];\n        let isBullishEngulfing = ((firstdaysClose < firstdaysOpen) &&\n            (firstdaysOpen > seconddaysOpen) &&\n            (firstdaysClose > seconddaysOpen) &&\n            (firstdaysOpen < seconddaysClose));\n        return (isBullishEngulfing);\n    }\n}\nexport function bullishengulfingpattern(data) {\n    return new BullishEngulfingPattern().hasPattern(data);\n}\n","import CandlestickFinder from './CandlestickFinder';\nexport default class BullishHarami extends CandlestickFinder {\n    constructor() {\n        super();\n        this.requiredCount = 2;\n        this.name = \"BullishHarami\";\n    }\n    logic(data) {\n        let firstdaysOpen = data.open[0];\n        let firstdaysClose = data.close[0];\n        let firstdaysHigh = data.high[0];\n        let firstdaysLow = data.low[0];\n        let seconddaysOpen = data.open[1];\n        let seconddaysClose = data.close[1];\n        let seconddaysHigh = data.high[1];\n        let seconddaysLow = data.low[1];\n        let isBullishHaramiPattern = ((firstdaysOpen > seconddaysOpen) &&\n            (firstdaysClose < seconddaysOpen) &&\n            (firstdaysClose < seconddaysClose) &&\n            (firstdaysOpen > seconddaysLow) &&\n            (firstdaysHigh > seconddaysHigh));\n        return (isBullishHaramiPattern);\n    }\n}\nexport function bullishharami(data) {\n    return new BullishHarami().hasPattern(data);\n}\n","import CandlestickFinder from './CandlestickFinder';\nexport default class BullishHaramiCross extends CandlestickFinder {\n    constructor() {\n        super();\n        this.requiredCount = 2;\n        this.name = 'BullishHaramiCross';\n    }\n    logic(data) {\n        let firstdaysOpen = data.open[0];\n        let firstdaysClose = data.close[0];\n        let firstdaysHigh = data.high[0];\n        let firstdaysLow = data.low[0];\n        let seconddaysOpen = data.open[1];\n        let seconddaysClose = data.close[1];\n        let seconddaysHigh = data.high[1];\n        let seconddaysLow = data.low[1];\n        let isBullishHaramiCrossPattern = ((firstdaysOpen > seconddaysOpen) &&\n            (firstdaysClose < seconddaysOpen) &&\n            (firstdaysClose < seconddaysClose) &&\n            (firstdaysOpen > seconddaysLow) &&\n            (firstdaysHigh > seconddaysHigh));\n        let isSecondDayDoji = this.approximateEqual(seconddaysOpen, seconddaysClose);\n        return (isBullishHaramiCrossPattern && isSecondDayDoji);\n    }\n}\nexport function bullishharamicross(data) {\n    return new BullishHaramiCross().hasPattern(data);\n}\n","import CandlestickFinder from './CandlestickFinder';\nexport default class Doji extends CandlestickFinder {\n    constructor() {\n        super();\n        this.name = 'Doji';\n        this.requiredCount = 1;\n    }\n    logic(data) {\n        let daysOpen = data.open[0];\n        let daysClose = data.close[0];\n        let daysHigh = data.high[0];\n        let daysLow = data.low[0];\n        let isOpenEqualsClose = this.approximateEqual(daysOpen, daysClose);\n        let isHighEqualsOpen = isOpenEqualsClose && this.approximateEqual(daysOpen, daysHigh);\n        let isLowEqualsClose = isOpenEqualsClose && this.approximateEqual(daysClose, daysLow);\n        return (isOpenEqualsClose && isHighEqualsOpen == isLowEqualsClose);\n    }\n}\nexport function doji(data) {\n    return new Doji().hasPattern(data);\n}\n","import Doji from './Doji';\nimport CandlestickFinder from './CandlestickFinder';\nexport default class MorningDojiStar extends CandlestickFinder {\n    constructor() {\n        super();\n        this.name = 'MorningDojiStar';\n        this.requiredCount = 3;\n    }\n    logic(data) {\n        let firstdaysOpen = data.open[0];\n        let firstdaysClose = data.close[0];\n        let firstdaysHigh = data.high[0];\n        let firstdaysLow = data.low[0];\n        let seconddaysOpen = data.open[1];\n        let seconddaysClose = data.close[1];\n        let seconddaysHigh = data.high[1];\n        let seconddaysLow = data.low[1];\n        let thirddaysOpen = data.open[2];\n        let thirddaysClose = data.close[2];\n        let thirddaysHigh = data.high[2];\n        let thirddaysLow = data.low[2];\n        let firstdaysMidpoint = ((firstdaysOpen + firstdaysClose) / 2);\n        let isFirstBearish = firstdaysClose < firstdaysOpen;\n        let dojiExists = new Doji().hasPattern({\n            \"open\": [seconddaysOpen],\n            \"close\": [seconddaysClose],\n            \"high\": [seconddaysHigh],\n            \"low\": [seconddaysLow]\n        });\n        let isThirdBullish = thirddaysOpen < thirddaysClose;\n        let gapExists = ((seconddaysHigh < firstdaysLow) &&\n            (seconddaysLow < firstdaysLow) &&\n            (thirddaysOpen > seconddaysHigh) &&\n            (seconddaysClose < thirddaysOpen));\n        let doesCloseAboveFirstMidpoint = thirddaysClose > firstdaysMidpoint;\n        return (isFirstBearish && dojiExists && isThirdBullish && gapExists &&\n            doesCloseAboveFirstMidpoint);\n    }\n}\nexport function morningdojistar(data) {\n    return new MorningDojiStar().hasPattern(data);\n}\n","import CandlestickFinder from './CandlestickFinder';\nexport default class DownsideTasukiGap extends CandlestickFinder {\n    constructor() {\n        super();\n        this.requiredCount = 3;\n        this.name = 'DownsideTasukiGap';\n    }\n    logic(data) {\n        let firstdaysOpen = data.open[0];\n        let firstdaysClose = data.close[0];\n        let firstdaysHigh = data.high[0];\n        let firstdaysLow = data.low[0];\n        let seconddaysOpen = data.open[1];\n        let seconddaysClose = data.close[1];\n        let seconddaysHigh = data.high[1];\n        let seconddaysLow = data.low[1];\n        let thirddaysOpen = data.open[2];\n        let thirddaysClose = data.close[2];\n        let thirddaysHigh = data.high[2];\n        let thirddaysLow = data.low[2];\n        let isFirstBearish = firstdaysClose < firstdaysOpen;\n        let isSecondBearish = seconddaysClose < seconddaysOpen;\n        let isThirdBullish = thirddaysClose > thirddaysOpen;\n        let isFirstGapExists = seconddaysHigh < firstdaysLow;\n        let isDownsideTasukiGap = ((seconddaysOpen > thirddaysOpen) &&\n            (seconddaysClose < thirddaysOpen) &&\n            (thirddaysClose > seconddaysOpen) &&\n            (thirddaysClose < firstdaysClose));\n        return (isFirstBearish && isSecondBearish && isThirdBullish && isFirstGapExists && isDownsideTasukiGap);\n    }\n}\nexport function downsidetasukigap(data) {\n    return new DownsideTasukiGap().hasPattern(data);\n}\n","import CandlestickFinder from './CandlestickFinder';\nexport default class BullishMarubozu extends CandlestickFinder {\n    constructor() {\n        super();\n        this.name = 'BullishMarubozu';\n        this.requiredCount = 1;\n    }\n    logic(data) {\n        let daysOpen = data.open[0];\n        let daysClose = data.close[0];\n        let daysHigh = data.high[0];\n        let daysLow = data.low[0];\n        let isBullishMarbozu = this.approximateEqual(daysClose, daysHigh) &&\n            this.approximateEqual(daysLow, daysOpen) &&\n            daysOpen < daysClose &&\n            daysOpen < daysHigh;\n        return (isBullishMarbozu);\n    }\n}\nexport function bullishmarubozu(data) {\n    return new BullishMarubozu().hasPattern(data);\n}\n","import CandlestickFinder from './CandlestickFinder';\nexport default class PiercingLine extends CandlestickFinder {\n    constructor() {\n        super();\n        this.requiredCount = 2;\n        this.name = 'PiercingLine';\n    }\n    logic(data) {\n        let firstdaysOpen = data.open[0];\n        let firstdaysClose = data.close[0];\n        let firstdaysHigh = data.high[0];\n        let firstdaysLow = data.low[0];\n        let seconddaysOpen = data.open[1];\n        let seconddaysClose = data.close[1];\n        let seconddaysHigh = data.high[1];\n        let seconddaysLow = data.low[1];\n        let firstdaysMidpoint = ((firstdaysOpen + firstdaysClose) / 2);\n        let isDowntrend = seconddaysLow < firstdaysLow;\n        let isFirstBearish = firstdaysClose < firstdaysOpen;\n        let isSecondBullish = seconddaysClose > seconddaysOpen;\n        let isPiercingLinePattern = ((firstdaysLow > seconddaysOpen) &&\n            (seconddaysClose > firstdaysMidpoint));\n        return (isDowntrend && isFirstBearish && isPiercingLinePattern && isSecondBullish);\n    }\n}\nexport function piercingline(data) {\n    return new PiercingLine().hasPattern(data);\n}\n","import CandlestickFinder from './CandlestickFinder';\nexport default class ThreeWhiteSoldiers extends CandlestickFinder {\n    constructor() {\n        super();\n        this.name = 'ThreeWhiteSoldiers';\n        this.requiredCount = 3;\n    }\n    logic(data) {\n        let firstdaysOpen = data.open[0];\n        let firstdaysClose = data.close[0];\n        let firstdaysHigh = data.high[0];\n        let firstdaysLow = data.low[0];\n        let seconddaysOpen = data.open[1];\n        let seconddaysClose = data.close[1];\n        let seconddaysHigh = data.high[1];\n        let seconddaysLow = data.low[1];\n        let thirddaysOpen = data.open[2];\n        let thirddaysClose = data.close[2];\n        let thirddaysHigh = data.high[2];\n        let thirddaysLow = data.low[2];\n        let isUpTrend = seconddaysHigh > firstdaysHigh &&\n            thirddaysHigh > seconddaysHigh;\n        let isAllBullish = firstdaysOpen < firstdaysClose &&\n            seconddaysOpen < seconddaysClose &&\n            thirddaysOpen < thirddaysClose;\n        let doesOpenWithinPreviousBody = firstdaysClose > seconddaysOpen &&\n            seconddaysOpen < firstdaysHigh &&\n            seconddaysHigh > thirddaysOpen &&\n            thirddaysOpen < seconddaysClose;\n        return (isUpTrend && isAllBullish && doesOpenWithinPreviousBody);\n    }\n}\nexport function threewhitesoldiers(data) {\n    return new ThreeWhiteSoldiers().hasPattern(data);\n}\n","import CandlestickFinder from './CandlestickFinder';\nexport default class BullishHammerStick extends CandlestickFinder {\n    constructor() {\n        super();\n        this.name = 'BullishHammerStick';\n        this.requiredCount = 1;\n    }\n    logic(data) {\n        let daysOpen = data.open[0];\n        let daysClose = data.close[0];\n        let daysHigh = data.high[0];\n        let daysLow = data.low[0];\n        let isBullishHammer = daysClose > daysOpen;\n        isBullishHammer = isBullishHammer && this.approximateEqual(daysClose, daysHigh);\n        isBullishHammer = isBullishHammer && (daysClose - daysOpen) <= 2 * (daysOpen - daysLow);\n        return isBullishHammer;\n    }\n}\nexport function bullishhammerstick(data) {\n    return new BullishHammerStick().hasPattern(data);\n}\n","import CandlestickFinder from './CandlestickFinder';\nexport default class BullishInvertedHammerStick extends CandlestickFinder {\n    constructor() {\n        super();\n        this.name = 'BullishInvertedHammerStick';\n        this.requiredCount = 1;\n    }\n    logic(data) {\n        let daysOpen = data.open[0];\n        let daysClose = data.close[0];\n        let daysHigh = data.high[0];\n        let daysLow = data.low[0];\n        let isBullishInvertedHammer = daysClose > daysOpen;\n        isBullishInvertedHammer = isBullishInvertedHammer && this.approximateEqual(daysOpen, daysLow);\n        isBullishInvertedHammer = isBullishInvertedHammer && (daysClose - daysOpen) <= 2 * (daysHigh - daysClose);\n        return isBullishInvertedHammer;\n    }\n}\nexport function bullishinvertedhammerstick(data) {\n    return new BullishInvertedHammerStick().hasPattern(data);\n}\n","import CandlestickFinder from './CandlestickFinder';\nexport default class BearishHammerStick extends CandlestickFinder {\n    constructor() {\n        super();\n        this.name = 'BearishHammerStick';\n        this.requiredCount = 1;\n    }\n    logic(data) {\n        let daysOpen = data.open[0];\n        let daysClose = data.close[0];\n        let daysHigh = data.high[0];\n        let daysLow = data.low[0];\n        let isBearishHammer = daysOpen > daysClose;\n        isBearishHammer = isBearishHammer && this.approximateEqual(daysOpen, daysHigh);\n        isBearishHammer = isBearishHammer && (daysOpen - daysClose) <= 2 * (daysClose - daysLow);\n        return isBearishHammer;\n    }\n}\nexport function bearishhammerstick(data) {\n    return new BearishHammerStick().hasPattern(data);\n}\n","import CandlestickFinder from './CandlestickFinder';\nexport default class BearishInvertedHammerStick extends CandlestickFinder {\n    constructor() {\n        super();\n        this.name = 'BearishInvertedHammerStick';\n        this.requiredCount = 1;\n    }\n    logic(data) {\n        let daysOpen = data.open[0];\n        let daysClose = data.close[0];\n        let daysHigh = data.high[0];\n        let daysLow = data.low[0];\n        let isBearishInvertedHammer = daysOpen > daysClose;\n        isBearishInvertedHammer = isBearishInvertedHammer && this.approximateEqual(daysClose, daysLow);\n        isBearishInvertedHammer = isBearishInvertedHammer && (daysOpen - daysClose) <= 2 * (daysHigh - daysOpen);\n        return isBearishInvertedHammer;\n    }\n}\nexport function bearishinvertedhammerstick(data) {\n    return new BearishInvertedHammerStick().hasPattern(data);\n}\n","import CandlestickFinder from './CandlestickFinder';\nimport { averageloss } from '../Utils/AverageLoss';\nimport { averagegain } from '../Utils/AverageGain';\nimport { bearishhammerstick } from './BearishHammerStick';\nimport { bearishinvertedhammerstick } from './BearishInvertedHammerStick';\nimport { bullishhammerstick } from './BullishHammerStick';\nimport { bullishinvertedhammerstick } from './BullishInvertedHammerStick';\nexport default class HammerPattern extends CandlestickFinder {\n    constructor() {\n        super();\n        this.name = 'HammerPattern';\n        this.requiredCount = 5;\n    }\n    logic(data) {\n        let isPattern = this.downwardTrend(data);\n        isPattern = isPattern && this.includesHammer(data);\n        isPattern = isPattern && this.hasConfirmation(data);\n        return isPattern;\n    }\n    downwardTrend(data, confirm = true) {\n        let end = confirm ? 3 : 4;\n        // Analyze trends in closing prices of the first three or four candlesticks\n        let gains = averagegain({ values: data.close.slice(0, end), period: end - 1 });\n        let losses = averageloss({ values: data.close.slice(0, end), period: end - 1 });\n        // Downward trend, so more losses than gains\n        return losses > gains;\n    }\n    includesHammer(data, confirm = true) {\n        let start = confirm ? 3 : 4;\n        let end = confirm ? 4 : undefined;\n        let possibleHammerData = {\n            open: data.open.slice(start, end),\n            close: data.close.slice(start, end),\n            low: data.low.slice(start, end),\n            high: data.high.slice(start, end),\n        };\n        let isPattern = bearishhammerstick(possibleHammerData);\n        isPattern = isPattern || bearishinvertedhammerstick(possibleHammerData);\n        isPattern = isPattern || bullishhammerstick(possibleHammerData);\n        isPattern = isPattern || bullishinvertedhammerstick(possibleHammerData);\n        return isPattern;\n    }\n    hasConfirmation(data) {\n        let possibleHammer = {\n            open: data.open[3],\n            close: data.close[3],\n            low: data.low[3],\n            high: data.high[3],\n        };\n        let possibleConfirmation = {\n            open: data.open[4],\n            close: data.close[4],\n            low: data.low[4],\n            high: data.high[4],\n        };\n        // Confirmation candlestick is bullish\n        let isPattern = possibleConfirmation.open < possibleConfirmation.close;\n        return isPattern && possibleHammer.close < possibleConfirmation.close;\n    }\n}\nexport function hammerpattern(data) {\n    return new HammerPattern().hasPattern(data);\n}\n","import HammerPattern from './HammerPattern';\nexport default class HammerPatternUnconfirmed extends HammerPattern {\n    constructor() {\n        super();\n        this.name = 'HammerPatternUnconfirmed';\n    }\n    logic(data) {\n        let isPattern = this.downwardTrend(data, false);\n        isPattern = isPattern && this.includesHammer(data, false);\n        return isPattern;\n    }\n}\nexport function hammerpatternunconfirmed(data) {\n    return new HammerPatternUnconfirmed().hasPattern(data);\n}\n","import CandlestickFinder from './CandlestickFinder';\nimport { averageloss } from '../Utils/AverageLoss';\nimport { averagegain } from '../Utils/AverageGain';\nexport default class TweezerBottom extends CandlestickFinder {\n    constructor() {\n        super();\n        this.name = 'TweezerBottom';\n        this.requiredCount = 5;\n    }\n    logic(data) {\n        return this.downwardTrend(data) && data.low[3] == data.low[4];\n    }\n    downwardTrend(data) {\n        // Analyze trends in closing prices of the first three or four candlesticks\n        let gains = averagegain({ values: data.close.slice(0, 3), period: 2 });\n        let losses = averageloss({ values: data.close.slice(0, 3), period: 2 });\n        // Downward trend, so more losses than gains\n        return losses > gains;\n    }\n}\nexport function tweezerbottom(data) {\n    return new TweezerBottom().hasPattern(data);\n}\n","import MorningStar from './MorningStar';\nimport BullishEngulfingPattern from './BullishEngulfingPattern';\nimport BullishHarami from './BullishHarami';\nimport BullishHaramiCross from './BullishHaramiCross';\nimport MorningDojiStar from './MorningDojiStar';\nimport DownsideTasukiGap from './DownsideTasukiGap';\nimport BullishMarubozu from './BullishMarubozu';\nimport PiercingLine from './PiercingLine';\nimport ThreeWhiteSoldiers from './ThreeWhiteSoldiers';\nimport BullishHammerStick from './BullishHammerStick';\nimport BullishInvertedHammerStick from './BullishInvertedHammerStick';\nimport HammerPattern from './HammerPattern';\nimport HammerPatternUnconfirmed from './HammerPatternUnconfirmed';\nimport CandlestickFinder from './CandlestickFinder';\nimport TweezerBottom from './TweezerBottom';\nlet bullishPatterns = [\n    new BullishEngulfingPattern(),\n    new DownsideTasukiGap(),\n    new BullishHarami(),\n    new BullishHaramiCross(),\n    new MorningDojiStar(),\n    new MorningStar(),\n    new BullishMarubozu(),\n    new PiercingLine(),\n    new ThreeWhiteSoldiers(),\n    new BullishHammerStick(),\n    new BullishInvertedHammerStick(),\n    new HammerPattern(),\n    new HammerPatternUnconfirmed(),\n    new TweezerBottom()\n];\nexport default class BullishPatterns extends CandlestickFinder {\n    constructor() {\n        super();\n        this.name = 'Bullish Candlesticks';\n    }\n    hasPattern(data) {\n        return bullishPatterns.reduce(function (state, pattern) {\n            let result = pattern.hasPattern(data);\n            return state || result;\n        }, false);\n    }\n}\nexport function bullish(data) {\n    return new BullishPatterns().hasPattern(data);\n}\n","import CandlestickFinder from './CandlestickFinder';\nexport default class BearishEngulfingPattern extends CandlestickFinder {\n    constructor() {\n        super();\n        this.name = 'BearishEngulfingPattern';\n        this.requiredCount = 2;\n    }\n    logic(data) {\n        let firstdaysOpen = data.open[0];\n        let firstdaysClose = data.close[0];\n        let firstdaysHigh = data.high[0];\n        let firstdaysLow = data.low[0];\n        let seconddaysOpen = data.open[1];\n        let seconddaysClose = data.close[1];\n        let seconddaysHigh = data.high[1];\n        let seconddaysLow = data.low[1];\n        let isBearishEngulfing = ((firstdaysClose > firstdaysOpen) &&\n            (firstdaysOpen < seconddaysOpen) &&\n            (firstdaysClose < seconddaysOpen) &&\n            (firstdaysOpen > seconddaysClose));\n        return (isBearishEngulfing);\n    }\n}\nexport function bearishengulfingpattern(data) {\n    return new BearishEngulfingPattern().hasPattern(data);\n}\n","import CandlestickFinder from './CandlestickFinder';\nexport default class BearishHarami extends CandlestickFinder {\n    constructor() {\n        super();\n        this.requiredCount = 2;\n        this.name = 'BearishHarami';\n    }\n    logic(data) {\n        let firstdaysOpen = data.open[0];\n        let firstdaysClose = data.close[0];\n        let firstdaysHigh = data.high[0];\n        let firstdaysLow = data.low[0];\n        let seconddaysOpen = data.open[1];\n        let seconddaysClose = data.close[1];\n        let seconddaysHigh = data.high[1];\n        let seconddaysLow = data.low[1];\n        let isBearishHaramiPattern = ((firstdaysOpen < seconddaysOpen) &&\n            (firstdaysClose > seconddaysOpen) &&\n            (firstdaysClose > seconddaysClose) &&\n            (firstdaysOpen < seconddaysLow) &&\n            (firstdaysHigh > seconddaysHigh));\n        return (isBearishHaramiPattern);\n    }\n}\nexport function bearishharami(data) {\n    return new BearishHarami().hasPattern(data);\n}\n","import CandlestickFinder from './CandlestickFinder';\nexport default class BearishHaramiCross extends CandlestickFinder {\n    constructor() {\n        super();\n        this.requiredCount = 2;\n        this.name = 'BearishHaramiCross';\n    }\n    logic(data) {\n        let firstdaysOpen = data.open[0];\n        let firstdaysClose = data.close[0];\n        let firstdaysHigh = data.high[0];\n        let firstdaysLow = data.low[0];\n        let seconddaysOpen = data.open[1];\n        let seconddaysClose = data.close[1];\n        let seconddaysHigh = data.high[1];\n        let seconddaysLow = data.low[1];\n        let isBearishHaramiCrossPattern = ((firstdaysOpen < seconddaysOpen) &&\n            (firstdaysClose > seconddaysOpen) &&\n            (firstdaysClose > seconddaysClose) &&\n            (firstdaysOpen < seconddaysLow) &&\n            (firstdaysHigh > seconddaysHigh));\n        let isSecondDayDoji = this.approximateEqual(seconddaysOpen, seconddaysClose);\n        return (isBearishHaramiCrossPattern && isSecondDayDoji);\n    }\n}\nexport function bearishharamicross(data) {\n    return new BearishHaramiCross().hasPattern(data);\n}\n","import Doji from './Doji';\nimport CandlestickFinder from './CandlestickFinder';\nexport default class EveningDojiStar extends CandlestickFinder {\n    constructor() {\n        super();\n        this.name = 'EveningDojiStar';\n        this.requiredCount = 3;\n    }\n    logic(data) {\n        let firstdaysOpen = data.open[0];\n        let firstdaysClose = data.close[0];\n        let firstdaysHigh = data.high[0];\n        let firstdaysLow = data.low[0];\n        let seconddaysOpen = data.open[1];\n        let seconddaysClose = data.close[1];\n        let seconddaysHigh = data.high[1];\n        let seconddaysLow = data.low[1];\n        let thirddaysOpen = data.open[2];\n        let thirddaysClose = data.close[2];\n        let thirddaysHigh = data.high[2];\n        let thirddaysLow = data.low[2];\n        let firstdaysMidpoint = ((firstdaysOpen + firstdaysClose) / 2);\n        let isFirstBullish = firstdaysClose > firstdaysOpen;\n        let dojiExists = new Doji().hasPattern({\n            \"open\": [seconddaysOpen],\n            \"close\": [seconddaysClose],\n            \"high\": [seconddaysHigh],\n            \"low\": [seconddaysLow]\n        });\n        let isThirdBearish = thirddaysOpen > thirddaysClose;\n        let gapExists = ((seconddaysHigh > firstdaysHigh) &&\n            (seconddaysLow > firstdaysHigh) &&\n            (thirddaysOpen < seconddaysLow) &&\n            (seconddaysClose > thirddaysOpen));\n        let doesCloseBelowFirstMidpoint = thirddaysClose < firstdaysMidpoint;\n        return (isFirstBullish && dojiExists && gapExists && isThirdBearish && doesCloseBelowFirstMidpoint);\n    }\n}\nexport function eveningdojistar(data) {\n    return new EveningDojiStar().hasPattern(data);\n}\n","import CandlestickFinder from './CandlestickFinder';\nexport default class EveningStar extends CandlestickFinder {\n    constructor() {\n        super();\n        this.name = 'EveningStar';\n        this.requiredCount = 3;\n    }\n    logic(data) {\n        let firstdaysOpen = data.open[0];\n        let firstdaysClose = data.close[0];\n        let firstdaysHigh = data.high[0];\n        let firstdaysLow = data.low[0];\n        let seconddaysOpen = data.open[1];\n        let seconddaysClose = data.close[1];\n        let seconddaysHigh = data.high[1];\n        let seconddaysLow = data.low[1];\n        let thirddaysOpen = data.open[2];\n        let thirddaysClose = data.close[2];\n        let thirddaysHigh = data.high[2];\n        let thirddaysLow = data.low[2];\n        let firstdaysMidpoint = ((firstdaysOpen + firstdaysClose) / 2);\n        let isFirstBullish = firstdaysClose > firstdaysOpen;\n        let isSmallBodyExists = ((firstdaysHigh < seconddaysLow) &&\n            (firstdaysHigh < seconddaysHigh));\n        let isThirdBearish = thirddaysOpen > thirddaysClose;\n        let gapExists = ((seconddaysHigh > firstdaysHigh) &&\n            (seconddaysLow > firstdaysHigh) &&\n            (thirddaysOpen < seconddaysLow) &&\n            (seconddaysClose > thirddaysOpen));\n        let doesCloseBelowFirstMidpoint = thirddaysClose < firstdaysMidpoint;\n        return (isFirstBullish && isSmallBodyExists && gapExists && isThirdBearish && doesCloseBelowFirstMidpoint);\n    }\n}\nexport function eveningstar(data) {\n    return new EveningStar().hasPattern(data);\n}\n","import CandlestickFinder from './CandlestickFinder';\nexport default class BearishMarubozu extends CandlestickFinder {\n    constructor() {\n        super();\n        this.name = 'BearishMarubozu';\n        this.requiredCount = 1;\n    }\n    logic(data) {\n        let daysOpen = data.open[0];\n        let daysClose = data.close[0];\n        let daysHigh = data.high[0];\n        let daysLow = data.low[0];\n        let isBearishMarbozu = this.approximateEqual(daysOpen, daysHigh) &&\n            this.approximateEqual(daysLow, daysClose) &&\n            daysOpen > daysClose &&\n            daysOpen > daysLow;\n        return (isBearishMarbozu);\n    }\n}\nexport function bearishmarubozu(data) {\n    return new BearishMarubozu().hasPattern(data);\n}\n","import CandlestickFinder from './CandlestickFinder';\nexport default class ThreeBlackCrows extends CandlestickFinder {\n    constructor() {\n        super();\n        this.name = 'ThreeBlackCrows';\n        this.requiredCount = 3;\n    }\n    logic(data) {\n        let firstdaysOpen = data.open[0];\n        let firstdaysClose = data.close[0];\n        let firstdaysHigh = data.high[0];\n        let firstdaysLow = data.low[0];\n        let seconddaysOpen = data.open[1];\n        let seconddaysClose = data.close[1];\n        let seconddaysHigh = data.high[1];\n        let seconddaysLow = data.low[1];\n        let thirddaysOpen = data.open[2];\n        let thirddaysClose = data.close[2];\n        let thirddaysHigh = data.high[2];\n        let thirddaysLow = data.low[2];\n        let isDownTrend = firstdaysLow > seconddaysLow &&\n            seconddaysLow > thirddaysLow;\n        let isAllBearish = firstdaysOpen > firstdaysClose &&\n            seconddaysOpen > seconddaysClose &&\n            thirddaysOpen > thirddaysClose;\n        let doesOpenWithinPreviousBody = firstdaysOpen > seconddaysOpen &&\n            seconddaysOpen > firstdaysClose &&\n            seconddaysOpen > thirddaysOpen &&\n            thirddaysOpen > seconddaysClose;\n        return (isDownTrend && isAllBearish && doesOpenWithinPreviousBody);\n    }\n}\nexport function threeblackcrows(data) {\n    return new ThreeBlackCrows().hasPattern(data);\n}\n","import CandlestickFinder from './CandlestickFinder';\nimport { averageloss } from '../Utils/AverageLoss';\nimport { averagegain } from '../Utils/AverageGain';\nimport { bearishhammerstick } from './BearishHammerStick';\nimport { bullishhammerstick } from './BullishHammerStick';\nexport default class HangingMan extends CandlestickFinder {\n    constructor() {\n        super();\n        this.name = 'HangingMan';\n        this.requiredCount = 5;\n    }\n    logic(data) {\n        let isPattern = this.upwardTrend(data);\n        isPattern = isPattern && this.includesHammer(data);\n        isPattern = isPattern && this.hasConfirmation(data);\n        return isPattern;\n    }\n    upwardTrend(data, confirm = true) {\n        let end = confirm ? 3 : 4;\n        // Analyze trends in closing prices of the first three or four candlesticks\n        let gains = averagegain({ values: data.close.slice(0, end), period: end - 1 });\n        let losses = averageloss({ values: data.close.slice(0, end), period: end - 1 });\n        // Upward trend, so more gains than losses\n        return gains > losses;\n    }\n    includesHammer(data, confirm = true) {\n        let start = confirm ? 3 : 4;\n        let end = confirm ? 4 : undefined;\n        let possibleHammerData = {\n            open: data.open.slice(start, end),\n            close: data.close.slice(start, end),\n            low: data.low.slice(start, end),\n            high: data.high.slice(start, end),\n        };\n        let isPattern = bearishhammerstick(possibleHammerData);\n        isPattern = isPattern || bullishhammerstick(possibleHammerData);\n        return isPattern;\n    }\n    hasConfirmation(data) {\n        let possibleHammer = {\n            open: data.open[3],\n            close: data.close[3],\n            low: data.low[3],\n            high: data.high[3],\n        };\n        let possibleConfirmation = {\n            open: data.open[4],\n            close: data.close[4],\n            low: data.low[4],\n            high: data.high[4],\n        };\n        // Confirmation candlestick is bearish\n        let isPattern = possibleConfirmation.open > possibleConfirmation.close;\n        return isPattern && possibleHammer.close > possibleConfirmation.close;\n    }\n}\nexport function hangingman(data) {\n    return new HangingMan().hasPattern(data);\n}\n","import HangingMan from './HangingMan';\nexport default class HangingManUnconfirmed extends HangingMan {\n    constructor() {\n        super();\n        this.name = 'HangingManUnconfirmed';\n    }\n    logic(data) {\n        let isPattern = this.upwardTrend(data, false);\n        isPattern = isPattern && this.includesHammer(data, false);\n        return isPattern;\n    }\n}\nexport function hangingmanunconfirmed(data) {\n    return new HangingManUnconfirmed().hasPattern(data);\n}\n","import CandlestickFinder from './CandlestickFinder';\nimport { averageloss } from '../Utils/AverageLoss';\nimport { averagegain } from '../Utils/AverageGain';\nimport { bearishinvertedhammerstick } from './BearishInvertedHammerStick';\nimport { bullishinvertedhammerstick } from './BullishInvertedHammerStick';\nexport default class ShootingStar extends CandlestickFinder {\n    constructor() {\n        super();\n        this.name = 'ShootingStar';\n        this.requiredCount = 5;\n    }\n    logic(data) {\n        let isPattern = this.upwardTrend(data);\n        isPattern = isPattern && this.includesHammer(data);\n        isPattern = isPattern && this.hasConfirmation(data);\n        return isPattern;\n    }\n    upwardTrend(data, confirm = true) {\n        let end = confirm ? 3 : 4;\n        // Analyze trends in closing prices of the first three or four candlesticks\n        let gains = averagegain({ values: data.close.slice(0, end), period: end - 1 });\n        let losses = averageloss({ values: data.close.slice(0, end), period: end - 1 });\n        // Upward trend, so more gains than losses\n        return gains > losses;\n    }\n    includesHammer(data, confirm = true) {\n        let start = confirm ? 3 : 4;\n        let end = confirm ? 4 : undefined;\n        let possibleHammerData = {\n            open: data.open.slice(start, end),\n            close: data.close.slice(start, end),\n            low: data.low.slice(start, end),\n            high: data.high.slice(start, end),\n        };\n        let isPattern = bearishinvertedhammerstick(possibleHammerData);\n        isPattern = isPattern || bullishinvertedhammerstick(possibleHammerData);\n        return isPattern;\n    }\n    hasConfirmation(data) {\n        let possibleHammer = {\n            open: data.open[3],\n            close: data.close[3],\n            low: data.low[3],\n            high: data.high[3],\n        };\n        let possibleConfirmation = {\n            open: data.open[4],\n            close: data.close[4],\n            low: data.low[4],\n            high: data.high[4],\n        };\n        // Confirmation candlestick is bearish\n        let isPattern = possibleConfirmation.open > possibleConfirmation.close;\n        return isPattern && possibleHammer.close > possibleConfirmation.close;\n    }\n}\nexport function shootingstar(data) {\n    return new ShootingStar().hasPattern(data);\n}\n","import ShootingStar from './ShootingStar';\nexport default class ShootingStarUnconfirmed extends ShootingStar {\n    constructor() {\n        super();\n        this.name = 'ShootingStarUnconfirmed';\n    }\n    logic(data) {\n        let isPattern = this.upwardTrend(data, false);\n        isPattern = isPattern && this.includesHammer(data, false);\n        return isPattern;\n    }\n}\nexport function shootingstarunconfirmed(data) {\n    return new ShootingStarUnconfirmed().hasPattern(data);\n}\n","import CandlestickFinder from './CandlestickFinder';\nimport { averageloss } from '../Utils/AverageLoss';\nimport { averagegain } from '../Utils/AverageGain';\nexport default class TweezerTop extends CandlestickFinder {\n    constructor() {\n        super();\n        this.name = 'TweezerTop';\n        this.requiredCount = 5;\n    }\n    logic(data) {\n        return this.upwardTrend(data) && data.high[3] == data.high[4];\n    }\n    upwardTrend(data) {\n        // Analyze trends in closing prices of the first three or four candlesticks\n        let gains = averagegain({ values: data.close.slice(0, 3), period: 2 });\n        let losses = averageloss({ values: data.close.slice(0, 3), period: 2 });\n        // Upward trend, so more gains than losses\n        return gains > losses;\n    }\n}\nexport function tweezertop(data) {\n    return new TweezerTop().hasPattern(data);\n}\n","import BearishEngulfingPattern from './BearishEngulfingPattern';\nimport BearishHarami from './BearishHarami';\nimport BearishHaramiCross from './BearishHaramiCross';\nimport EveningDojiStar from './EveningDojiStar';\nimport EveningStar from './EveningStar';\nimport BearishMarubozu from './BearishMarubozu';\nimport ThreeBlackCrows from './ThreeBlackCrows';\nimport BearishHammerStick from './BearishHammerStick';\nimport BearishInvertedHammerStick from './BearishInvertedHammerStick';\nimport HangingMan from './HangingMan';\nimport HangingManUnconfirmed from './HangingManUnconfirmed';\nimport ShootingStar from './ShootingStar';\nimport ShootingStarUnconfirmed from './ShootingStarUnconfirmed';\nimport TweezerTop from './TweezerTop';\nimport CandlestickFinder from './CandlestickFinder';\nlet bearishPatterns = [\n    new BearishEngulfingPattern(),\n    new BearishHarami(),\n    new BearishHaramiCross(),\n    new EveningDojiStar(),\n    new EveningStar(),\n    new BearishMarubozu(),\n    new ThreeBlackCrows(),\n    new BearishHammerStick(),\n    new BearishInvertedHammerStick(),\n    new HangingMan(),\n    new HangingManUnconfirmed(),\n    new ShootingStar(),\n    new ShootingStarUnconfirmed(),\n    new TweezerTop()\n];\nexport default class BearishPatterns extends CandlestickFinder {\n    constructor() {\n        super();\n        this.name = 'Bearish Candlesticks';\n    }\n    hasPattern(data) {\n        return bearishPatterns.reduce(function (state, pattern) {\n            return state || pattern.hasPattern(data);\n        }, false);\n    }\n}\nexport function bearish(data) {\n    return new BearishPatterns().hasPattern(data);\n}\n","import CandlestickFinder from './CandlestickFinder';\nimport Doji from './Doji';\nexport default class AbandonedBaby extends CandlestickFinder {\n    constructor() {\n        super();\n        this.name = 'AbandonedBaby';\n        this.requiredCount = 3;\n    }\n    logic(data) {\n        let firstdaysOpen = data.open[0];\n        let firstdaysClose = data.close[0];\n        let firstdaysHigh = data.high[0];\n        let firstdaysLow = data.low[0];\n        let seconddaysOpen = data.open[1];\n        let seconddaysClose = data.close[1];\n        let seconddaysHigh = data.high[1];\n        let seconddaysLow = data.low[1];\n        let thirddaysOpen = data.open[2];\n        let thirddaysClose = data.close[2];\n        let thirddaysHigh = data.high[2];\n        let thirddaysLow = data.low[2];\n        let isFirstBearish = firstdaysClose < firstdaysOpen;\n        let dojiExists = new Doji().hasPattern({\n            \"open\": [seconddaysOpen],\n            \"close\": [seconddaysClose],\n            \"high\": [seconddaysHigh],\n            \"low\": [seconddaysLow]\n        });\n        let gapExists = ((seconddaysHigh < firstdaysLow) &&\n            (thirddaysLow > seconddaysHigh) &&\n            (thirddaysClose > thirddaysOpen));\n        let isThirdBullish = (thirddaysHigh < firstdaysOpen);\n        return (isFirstBearish && dojiExists && gapExists && isThirdBullish);\n    }\n}\nexport function abandonedbaby(data) {\n    return new AbandonedBaby().hasPattern(data);\n}\n","import CandlestickFinder from './CandlestickFinder';\nexport default class DarkCloudCover extends CandlestickFinder {\n    constructor() {\n        super();\n        this.name = 'DarkCloudCover';\n        this.requiredCount = 2;\n    }\n    logic(data) {\n        let firstdaysOpen = data.open[0];\n        let firstdaysClose = data.close[0];\n        let firstdaysHigh = data.high[0];\n        let firstdaysLow = data.low[0];\n        let seconddaysOpen = data.open[1];\n        let seconddaysClose = data.close[1];\n        let seconddaysHigh = data.high[1];\n        let seconddaysLow = data.low[1];\n        let firstdayMidpoint = ((firstdaysClose + firstdaysOpen) / 2);\n        let isFirstBullish = firstdaysClose > firstdaysOpen;\n        let isSecondBearish = seconddaysClose < seconddaysOpen;\n        let isDarkCloudPattern = ((seconddaysOpen > firstdaysHigh) &&\n            (seconddaysClose < firstdayMidpoint) &&\n            (seconddaysClose > firstdaysOpen));\n        return (isFirstBullish && isSecondBearish && isDarkCloudPattern);\n    }\n}\nexport function darkcloudcover(data) {\n    return new DarkCloudCover().hasPattern(data);\n}\n","import CandlestickFinder from './CandlestickFinder';\nexport default class DragonFlyDoji extends CandlestickFinder {\n    constructor() {\n        super();\n        this.requiredCount = 1;\n        this.name = 'DragonFlyDoji';\n    }\n    logic(data) {\n        let daysOpen = data.open[0];\n        let daysClose = data.close[0];\n        let daysHigh = data.high[0];\n        let daysLow = data.low[0];\n        let isOpenEqualsClose = this.approximateEqual(daysOpen, daysClose);\n        let isHighEqualsOpen = isOpenEqualsClose && this.approximateEqual(daysOpen, daysHigh);\n        let isLowEqualsClose = isOpenEqualsClose && this.approximateEqual(daysClose, daysLow);\n        return (isOpenEqualsClose && isHighEqualsOpen && !isLowEqualsClose);\n    }\n}\nexport function dragonflydoji(data) {\n    return new DragonFlyDoji().hasPattern(data);\n}\n","import CandlestickFinder from './CandlestickFinder';\nexport default class GraveStoneDoji extends CandlestickFinder {\n    constructor() {\n        super();\n        this.requiredCount = 1;\n        this.name = 'GraveStoneDoji';\n    }\n    logic(data) {\n        let daysOpen = data.open[0];\n        let daysClose = data.close[0];\n        let daysHigh = data.high[0];\n        let daysLow = data.low[0];\n        let isOpenEqualsClose = this.approximateEqual(daysOpen, daysClose);\n        let isHighEqualsOpen = isOpenEqualsClose && this.approximateEqual(daysOpen, daysHigh);\n        let isLowEqualsClose = isOpenEqualsClose && this.approximateEqual(daysClose, daysLow);\n        return (isOpenEqualsClose && isLowEqualsClose && !isHighEqualsOpen);\n    }\n}\nexport function gravestonedoji(data) {\n    return new GraveStoneDoji().hasPattern(data);\n}\n","import CandlestickFinder from './CandlestickFinder';\nexport default class BullishSpinningTop extends CandlestickFinder {\n    constructor() {\n        super();\n        this.name = 'BullishSpinningTop';\n        this.requiredCount = 1;\n    }\n    logic(data) {\n        let daysOpen = data.open[0];\n        let daysClose = data.close[0];\n        let daysHigh = data.high[0];\n        let daysLow = data.low[0];\n        let bodyLength = Math.abs(daysClose - daysOpen);\n        let upperShadowLength = Math.abs(daysHigh - daysClose);\n        let lowerShadowLength = Math.abs(daysOpen - daysLow);\n        let isBullishSpinningTop = bodyLength < upperShadowLength &&\n            bodyLength < lowerShadowLength;\n        return isBullishSpinningTop;\n    }\n}\nexport function bullishspinningtop(data) {\n    return new BullishSpinningTop().hasPattern(data);\n}\n","import CandlestickFinder from './CandlestickFinder';\nexport default class BearishSpinningTop extends CandlestickFinder {\n    constructor() {\n        super();\n        this.name = 'BearishSpinningTop';\n        this.requiredCount = 1;\n    }\n    logic(data) {\n        let daysOpen = data.open[0];\n        let daysClose = data.close[0];\n        let daysHigh = data.high[0];\n        let daysLow = data.low[0];\n        let bodyLength = Math.abs(daysClose - daysOpen);\n        let upperShadowLength = Math.abs(daysHigh - daysOpen);\n        let lowerShadowLength = Math.abs(daysHigh - daysLow);\n        let isBearishSpinningTop = bodyLength < upperShadowLength &&\n            bodyLength < lowerShadowLength;\n        return isBearishSpinningTop;\n    }\n}\nexport function bearishspinningtop(data) {\n    return new BearishSpinningTop().hasPattern(data);\n}\n","import CandlestickFinder from './CandlestickFinder';\nexport default class BullishFractal extends CandlestickFinder {\n    constructor() {\n        super();\n        this.name = 'BullishFractal';\n        this.requiredCount = 5;\n    }\n    // Bullish Fractal= ​Low(N)<Low(N−2) and Low(N)<Low(N−1) and Low(N)<Low(N+1) andLow(N)<Low(N+2)​\n    // Bearish Fractal= ​High(N)>High(N−2) andHigh(N)>High(N−1) andHigh(N)>High(N+1) andHigh(N)>High(N+2)​\n    logic(data) {\n        const n = 2;\n        let daysOpen = data.open[n];\n        let daysClose = data.close[n];\n        let daysHigh = data.high[n];\n        let daysLow = data.low[n];\n        let isBearishFractal = daysOpen > daysClose;\n        isBearishFractal = isBearishFractal && this.approximateEqual(daysOpen, daysHigh);\n        isBearishFractal = isBearishFractal && (daysLow < data.low[n - 2]);\n        isBearishFractal = isBearishFractal && (daysLow < data.low[n - 1]);\n        isBearishFractal = isBearishFractal && (daysLow < data.low[n + 1]);\n        // isBearishFractal = isBearishFractal && (daysLow < data.low[n+2]);\n        return isBearishFractal;\n    }\n}\nexport function bullishfractal(data) {\n    return new BullishFractal().hasPattern(data);\n}\n","import CandlestickFinder from './CandlestickFinder';\nexport default class BearishFractal extends CandlestickFinder {\n    constructor() {\n        super();\n        this.name = 'BearishFractal';\n        this.requiredCount = 5;\n    }\n    // Bullish Fractal= ​Low(N)<Low(N−2) and Low(N)<Low(N−1) and Low(N)<Low(N+1) andLow(N)<Low(N+2)​\n    // Bearish Fractal= ​High(N)>High(N−2) andHigh(N)>High(N−1) andHigh(N)>High(N+1) andHigh(N)>High(N+2)​\n    logic(data) {\n        const n = 2;\n        let daysOpen = data.open[n];\n        let daysClose = data.close[n];\n        let daysHigh = data.high[n];\n        let daysLow = data.low[n];\n        let isBearishFractal = daysOpen > daysClose;\n        isBearishFractal = isBearishFractal && this.approximateEqual(daysOpen, daysHigh);\n        isBearishFractal = isBearishFractal && (daysHigh > data.high[n - 2]);\n        isBearishFractal = isBearishFractal && (daysHigh > data.high[n - 1]);\n        isBearishFractal = isBearishFractal && (daysHigh > data.high[n + 1]);\n        // isBearishFractal = isBearishFractal && (daysHigh > data.high[n+2]);\n        return isBearishFractal;\n    }\n}\nexport function bearishfractal(data) {\n    return new BearishFractal().hasPattern(data);\n}\n","/**\n * Calcaultes the fibonacci retracements for given start and end points\n *\n * If calculating for up trend start should be low and end should be high and vice versa\n *\n * returns an array of retracements level containing [0 , 23.6, 38.2, 50, 61.8, 78.6, 100, 127.2, 161.8, 261.8, 423.6]\n *\n * @export\n * @param {number} start\n * @param {number} end\n * @returns {number[]}\n */\nexport function fibonacciretracement(start, end) {\n    let levels = [0, 23.6, 38.2, 50, 61.8, 78.6, 100, 127.2, 161.8, 261.8, 423.6];\n    let retracements;\n    if (start < end) {\n        retracements = levels.map(function (level) {\n            let calculated = end - Math.abs(start - end) * (level) / 100;\n            return calculated > 0 ? calculated : 0;\n        });\n    }\n    else {\n        retracements = levels.map(function (level) {\n            let calculated = end + Math.abs(start - end) * (level) / 100;\n            return calculated > 0 ? calculated : 0;\n        });\n    }\n    return retracements;\n}\n","import { Indicator, IndicatorInput } from \"../indicator/indicator\";\nimport LinkedList from \"../Utils/FixedSizeLinkedList\";\nexport class IchimokuCloudInput extends IndicatorInput {\n    constructor() {\n        super(...arguments);\n        this.conversionPeriod = 9;\n        this.basePeriod = 26;\n        this.spanPeriod = 52;\n        this.displacement = 26;\n    }\n}\nexport class IchimokuCloudOutput {\n}\nexport class IchimokuCloud extends Indicator {\n    constructor(input) {\n        super(input);\n        this.result = [];\n        var defaults = {\n            conversionPeriod: 9,\n            basePeriod: 26,\n            spanPeriod: 52,\n            displacement: 26,\n        };\n        var params = Object.assign({}, defaults, input);\n        var currentConversionData = new LinkedList(params.conversionPeriod * 2, true, true, false);\n        var currentBaseData = new LinkedList(params.basePeriod * 2, true, true, false);\n        var currenSpanData = new LinkedList(params.spanPeriod * 2, true, true, false);\n        this.generator = (function* () {\n            let result;\n            let tick;\n            let period = Math.max(params.conversionPeriod, params.basePeriod, params.spanPeriod, params.displacement);\n            let periodCounter = 1;\n            tick = yield;\n            while (true) {\n                // Keep a list of lows/highs for the max period\n                currentConversionData.push(tick.high);\n                currentConversionData.push(tick.low);\n                currentBaseData.push(tick.high);\n                currentBaseData.push(tick.low);\n                currenSpanData.push(tick.high);\n                currenSpanData.push(tick.low);\n                if (periodCounter < period) {\n                    periodCounter++;\n                }\n                else {\n                    // Tenkan-sen (ConversionLine): (9-period high + 9-period low)/2))\n                    let conversionLine = (currentConversionData.periodHigh +\n                        currentConversionData.periodLow) /\n                        2;\n                    // Kijun-sen (Base Line): (26-period high + 26-period low)/2))\n                    let baseLine = (currentBaseData.periodHigh +\n                        currentBaseData.periodLow) /\n                        2;\n                    // Senkou Span A (Leading Span A): (Conversion Line + Base Line)/2))\n                    let spanA = (conversionLine + baseLine) / 2;\n                    // Senkou Span B (Leading Span B): (52-period high + 52-period low)/2))\n                    let spanB = (currenSpanData.periodHigh + currenSpanData.periodLow) /\n                        2;\n                    // Senkou Span A / Senkou Span B offset by 26 periods\n                    // if(spanCounter < params.displacement) {\n                    // \tspanCounter++\n                    // } else {\n                    // \tspanA = spanAs.shift()\n                    // \tspanB = spanBs.shift()\n                    // }\n                    result = {\n                        conversion: conversionLine,\n                        base: baseLine,\n                        spanA: spanA,\n                        spanB: spanB,\n                    };\n                }\n                tick = yield result;\n            }\n        })();\n        this.generator.next();\n        input.low.forEach((tick, index) => {\n            var result = this.generator.next({\n                high: input.high[index],\n                low: input.low[index],\n            });\n            if (result.value) {\n                this.result.push(result.value);\n            }\n        });\n    }\n    nextValue(price) {\n        return this.generator.next(price).value;\n    }\n}\nIchimokuCloud.calculate = ichimokucloud;\nexport function ichimokucloud(input) {\n    Indicator.reverseInputs(input);\n    var result = new IchimokuCloud(input).result;\n    if (input.reversedInput) {\n        result.reverse();\n    }\n    Indicator.reverseInputs(input);\n    return result;\n}\n","import { Indicator, IndicatorInput } from '../indicator/indicator';\nimport { SMA } from '../moving_averages/SMA';\nimport { EMA } from '../moving_averages/EMA';\nimport { ATR } from '../directionalmovement/ATR';\nexport class KeltnerChannelsInput extends IndicatorInput {\n    constructor() {\n        super(...arguments);\n        this.maPeriod = 20;\n        this.atrPeriod = 10;\n        this.useSMA = false;\n        this.multiplier = 1;\n    }\n}\nexport class KeltnerChannelsOutput extends IndicatorInput {\n}\n;\nexport class KeltnerChannels extends Indicator {\n    constructor(input) {\n        super(input);\n        var maType = input.useSMA ? SMA : EMA;\n        var maProducer = new maType({ period: input.maPeriod, values: [], format: (v) => { return v; } });\n        var atrProducer = new ATR({ period: input.atrPeriod, high: [], low: [], close: [], format: (v) => { return v; } });\n        var tick;\n        this.result = [];\n        this.generator = (function* () {\n            var KeltnerChannelsOutput;\n            var result;\n            tick = yield;\n            while (true) {\n                var { close } = tick;\n                var ma = maProducer.nextValue(close);\n                var atr = atrProducer.nextValue(tick);\n                if (ma != undefined && atr != undefined) {\n                    result = {\n                        middle: ma,\n                        upper: ma + (input.multiplier * (atr)),\n                        lower: ma - (input.multiplier * (atr))\n                    };\n                }\n                tick = yield result;\n            }\n        })();\n        this.generator.next();\n        var highs = input.high;\n        highs.forEach((tickHigh, index) => {\n            var tickInput = {\n                high: tickHigh,\n                low: input.low[index],\n                close: input.close[index],\n            };\n            var result = this.generator.next(tickInput);\n            if (result.value != undefined) {\n                this.result.push(result.value);\n            }\n        });\n    }\n    ;\n    nextValue(price) {\n        var result = this.generator.next(price);\n        if (result.value != undefined) {\n            return result.value;\n        }\n    }\n    ;\n}\nKeltnerChannels.calculate = keltnerchannels;\nexport function keltnerchannels(input) {\n    Indicator.reverseInputs(input);\n    var result = new KeltnerChannels(input).result;\n    if (input.reversedInput) {\n        result.reverse();\n    }\n    Indicator.reverseInputs(input);\n    return result;\n}\n;\n","import { Indicator, IndicatorInput } from '../indicator/indicator';\nimport { ATR } from '../directionalmovement/ATR';\nimport LinkedList from '../Utils/FixedSizeLinkedList';\nexport class ChandelierExitInput extends IndicatorInput {\n    constructor() {\n        super(...arguments);\n        this.period = 22;\n        this.multiplier = 3;\n    }\n}\nexport class ChandelierExitOutput extends IndicatorInput {\n}\n;\nexport class ChandelierExit extends Indicator {\n    constructor(input) {\n        super(input);\n        var highs = input.high;\n        var lows = input.low;\n        var closes = input.close;\n        this.result = [];\n        var atrProducer = new ATR({ period: input.period, high: [], low: [], close: [], format: (v) => { return v; } });\n        var dataCollector = new LinkedList(input.period * 2, true, true, false);\n        this.generator = (function* () {\n            var result;\n            var tick = yield;\n            var atr;\n            while (true) {\n                var { high, low } = tick;\n                dataCollector.push(high);\n                dataCollector.push(low);\n                atr = atrProducer.nextValue(tick);\n                if ((dataCollector.totalPushed >= (2 * input.period)) && atr != undefined) {\n                    result = {\n                        exitLong: dataCollector.periodHigh - atr * input.multiplier,\n                        exitShort: dataCollector.periodLow + atr * input.multiplier\n                    };\n                }\n                tick = yield result;\n            }\n        })();\n        this.generator.next();\n        highs.forEach((tickHigh, index) => {\n            var tickInput = {\n                high: tickHigh,\n                low: lows[index],\n                close: closes[index],\n            };\n            var result = this.generator.next(tickInput);\n            if (result.value != undefined) {\n                this.result.push(result.value);\n            }\n        });\n    }\n    ;\n    nextValue(price) {\n        var result = this.generator.next(price);\n        if (result.value != undefined) {\n            return result.value;\n        }\n    }\n    ;\n}\nChandelierExit.calculate = chandelierexit;\nexport function chandelierexit(input) {\n    Indicator.reverseInputs(input);\n    var result = new ChandelierExit(input).result;\n    if (input.reversedInput) {\n        result.reverse();\n    }\n    Indicator.reverseInputs(input);\n    return result;\n}\n;\n","import { Indicator, IndicatorInput } from '../indicator/indicator';\nexport class CrossInput extends IndicatorInput {\n    constructor(lineA, lineB) {\n        super();\n        this.lineA = lineA;\n        this.lineB = lineB;\n    }\n}\nexport class CrossUp extends Indicator {\n    constructor(input) {\n        super(input);\n        this.lineA = input.lineA;\n        this.lineB = input.lineB;\n        var currentLineA = [];\n        var currentLineB = [];\n        const genFn = (function* () {\n            var current = yield;\n            var result = false;\n            while (true) {\n                currentLineA.unshift(current.valueA);\n                currentLineB.unshift(current.valueB);\n                result = current.valueA > current.valueB;\n                var pointer = 1;\n                while (result === true && currentLineA[pointer] >= currentLineB[pointer]) {\n                    if (currentLineA[pointer] > currentLineB[pointer]) {\n                        result = false;\n                    }\n                    else if (currentLineA[pointer] < currentLineB[pointer]) {\n                        result = true;\n                    }\n                    else if (currentLineA[pointer] === currentLineB[pointer]) {\n                        pointer += 1;\n                    }\n                }\n                if (result === true) {\n                    currentLineA = [current.valueA];\n                    currentLineB = [current.valueB];\n                }\n                current = yield result;\n            }\n        });\n        this.generator = genFn();\n        this.generator.next();\n        this.result = [];\n        this.lineA.forEach((value, index) => {\n            var result = this.generator.next({\n                valueA: this.lineA[index],\n                valueB: this.lineB[index]\n            });\n            if (result.value !== undefined) {\n                this.result.push(result.value);\n            }\n        });\n    }\n    static reverseInputs(input) {\n        if (input.reversedInput) {\n            input.lineA ? input.lineA.reverse() : undefined;\n            input.lineB ? input.lineB.reverse() : undefined;\n        }\n    }\n    nextValue(valueA, valueB) {\n        return this.generator.next({\n            valueA: valueA,\n            valueB: valueB\n        }).value;\n    }\n    ;\n}\nCrossUp.calculate = crossUp;\nexport function crossUp(input) {\n    Indicator.reverseInputs(input);\n    var result = new CrossUp(input).result;\n    if (input.reversedInput) {\n        result.reverse();\n    }\n    Indicator.reverseInputs(input);\n    return result;\n}\n","import { Indicator, IndicatorInput } from \"../indicator/indicator\";\nexport class CrossInput extends IndicatorInput {\n    constructor(lineA, lineB) {\n        super();\n        this.lineA = lineA;\n        this.lineB = lineB;\n    }\n}\nexport class CrossDown extends Indicator {\n    constructor(input) {\n        super(input);\n        this.lineA = input.lineA;\n        this.lineB = input.lineB;\n        var currentLineA = [];\n        var currentLineB = [];\n        const genFn = function* () {\n            var current = yield;\n            var result = false;\n            while (true) {\n                currentLineA.unshift(current.valueA);\n                currentLineB.unshift(current.valueB);\n                result = current.valueA < current.valueB;\n                var pointer = 1;\n                while (result === true &&\n                    currentLineA[pointer] <= currentLineB[pointer]) {\n                    if (currentLineA[pointer] < currentLineB[pointer]) {\n                        result = false;\n                    }\n                    else if (currentLineA[pointer] > currentLineB[pointer]) {\n                        result = true;\n                    }\n                    else if (currentLineA[pointer] === currentLineB[pointer]) {\n                        pointer += 1;\n                    }\n                }\n                if (result === true) {\n                    currentLineA = [current.valueA];\n                    currentLineB = [current.valueB];\n                }\n                current = yield result;\n            }\n        };\n        this.generator = genFn();\n        this.generator.next();\n        this.result = [];\n        this.lineA.forEach((value, index) => {\n            var result = this.generator.next({\n                valueA: this.lineA[index],\n                valueB: this.lineB[index],\n            });\n            if (result.value !== undefined) {\n                this.result.push(result.value);\n            }\n        });\n    }\n    static reverseInputs(input) {\n        if (input.reversedInput) {\n            input.lineA ? input.lineA.reverse() : undefined;\n            input.lineB ? input.lineB.reverse() : undefined;\n        }\n    }\n    nextValue(valueA, valueB) {\n        return this.generator.next({\n            valueA: valueA,\n            valueB: valueB,\n        }).value;\n    }\n}\nCrossDown.calculate = crossDown;\nexport function crossDown(input) {\n    Indicator.reverseInputs(input);\n    var result = new CrossDown(input).result;\n    if (input.reversedInput) {\n        result.reverse();\n    }\n    Indicator.reverseInputs(input);\n    return result;\n}\n","export * from './lib/index.js';\nexport function getAvailableIndicators () {\n  let AvailableIndicators   = []\n  AvailableIndicators.push('sma');\n  AvailableIndicators.push('ema');\n  AvailableIndicators.push('wma');\n  AvailableIndicators.push('wema');\n  AvailableIndicators.push('macd');\n  AvailableIndicators.push('rsi');\n  AvailableIndicators.push('bollingerbands');\n  AvailableIndicators.push('adx');\n  AvailableIndicators.push('atr');\n  AvailableIndicators.push('truerange');\n  AvailableIndicators.push('roc');\n  AvailableIndicators.push('kst');\n  AvailableIndicators.push('psar');\n  AvailableIndicators.push('stochastic');\n  AvailableIndicators.push('williamsr');\n  AvailableIndicators.push('adl');\n  AvailableIndicators.push('obv');\n  AvailableIndicators.push('trix');\n\n  AvailableIndicators.push('cci');\n  AvailableIndicators.push('awesomeoscillator');\n  AvailableIndicators.push('forceindex');\n  AvailableIndicators.push('vwap');\n  AvailableIndicators.push('volumeprofile');\n  AvailableIndicators.push('renko');\n  AvailableIndicators.push('heikinashi');\n\n  AvailableIndicators.push('stochasticrsi');\n  AvailableIndicators.push('mfi');\n\n  AvailableIndicators.push('averagegain');\n  AvailableIndicators.push('averageloss');\n  AvailableIndicators.push('highest');\n  AvailableIndicators.push('lowest');\n  AvailableIndicators.push('sum');\n  AvailableIndicators.push('FixedSizeLinkedList');\n  AvailableIndicators.push('sd');\n  AvailableIndicators.push('bullish');\n  AvailableIndicators.push('bearish');\n  AvailableIndicators.push('abandonedbaby');\n  AvailableIndicators.push('doji');\n  AvailableIndicators.push('bearishengulfingpattern');\n  AvailableIndicators.push('bullishengulfingpattern');\n  AvailableIndicators.push('darkcloudcover');\n  AvailableIndicators.push('downsidetasukigap');\n  AvailableIndicators.push('dragonflydoji');\n  AvailableIndicators.push('gravestonedoji');\n  AvailableIndicators.push('bullishharami');\n  AvailableIndicators.push('bearishharami');\n  AvailableIndicators.push('bullishharamicross');\n  AvailableIndicators.push('bearishharamicross');\n  AvailableIndicators.push('eveningdojistar');\n  AvailableIndicators.push('eveningstar');\n  AvailableIndicators.push('morningdojistar');\n  AvailableIndicators.push('morningstar');\n  AvailableIndicators.push('bullishmarubozu');\n  AvailableIndicators.push('bearishmarubozu');\n  AvailableIndicators.push('piercingline');\n  AvailableIndicators.push('bullishspinningtop');\n  AvailableIndicators.push('bearishspinningtop');\n  AvailableIndicators.push('threeblackcrows');\n  AvailableIndicators.push('threewhitesoldiers');\n  AvailableIndicators.push('bullishhammerstick');\n  AvailableIndicators.push('bearishhammerstick');\n  AvailableIndicators.push('bullishinvertedhammerstick');\n  AvailableIndicators.push('bearishinvertedhammerstick');\n  AvailableIndicators.push('hammerpattern');\n  AvailableIndicators.push('hammerpatternunconfirmed');\n  AvailableIndicators.push('hangingman');\n  AvailableIndicators.push('hangingmanunconfirmed');\n  AvailableIndicators.push('shootingstar');\n  AvailableIndicators.push('shootingstarunconfirmed');\n  AvailableIndicators.push('tweezertop');\n  AvailableIndicators.push('tweezerbottom');\n\n  AvailableIndicators.push('predictPattern');\n  AvailableIndicators.push('hasDoubleBottom');\n  AvailableIndicators.push('hasDoubleTop');\n  AvailableIndicators.push('hasHeadAndShoulder');\n  AvailableIndicators.push('hasInverseHeadAndShoulder');\n  AvailableIndicators.push('isTrendingUp');\n  AvailableIndicators.push('isTrendingDown');\n  AvailableIndicators.push('ichimokucloud');\n  \n  AvailableIndicators.push('keltnerchannels');\n  AvailableIndicators.push('chandelierexit');\n  AvailableIndicators.push('crossup');\n  AvailableIndicators.push('crossdown');\n  AvailableIndicators.push('crossover');\n  return AvailableIndicators;\n};\n\nlet AvailableIndicators = getAvailableIndicators();\nexport { AvailableIndicators }\n"]}