UNPKG

@thuantan2060/technicalindicators

Version:
1,901 lines (1,773 loc) 333 kB
(function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : typeof define === 'function' && define.amd ? define(factory) : (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.TechnicalIndicators = factory()); })(this, (function () { 'use strict'; function getDefaultExportFromCjs (x) { return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x; } var indexCjs$1 = {}; var lib = {}; var interopRequireDefault = {exports: {}}; (function (module) { function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; } module.exports = _interopRequireDefault, module.exports.__esModule = true, module.exports["default"] = module.exports; } (interopRequireDefault)); var interopRequireDefaultExports = interopRequireDefault.exports; var FixedSizeLinkedList = {}; var LinkedList = {}; var hasRequiredLinkedList; function requireLinkedList () { if (hasRequiredLinkedList) return LinkedList; hasRequiredLinkedList = 1; Object.defineProperty(LinkedList, "__esModule", { value: true }); LinkedList.LinkedList = void 0; class Item { next; prev; data; constructor(data, prev, next) { this.next = next; if (next) next.prev = this; this.prev = prev; if (prev) prev.next = this; this.data = data; } } let LinkedList$1 = class LinkedList { _head; _tail; _next; _length = 0; _current; constructor() {} get head() { return this._head && this._head.data; } get tail() { return this._tail && this._tail.data; } get current() { return this._current && this._current.data; } get length() { return this._length; } push(data) { this._tail = new Item(data, this._tail); if (this._length === 0) { this._head = this._tail; this._current = this._head; this._next = this._head; } this._length++; } pop() { var tail = this._tail; if (this._length === 0) { return; } this._length--; if (this._length === 0) { this._head = this._tail = this._current = this._next = undefined; return tail.data; } this._tail = tail.prev; this._tail.next = undefined; if (this._current === tail) { this._current = this._tail; this._next = undefined; } return tail.data; } shift() { var head = this._head; if (this._length === 0) { return; } this._length--; if (this._length === 0) { this._head = this._tail = this._current = this._next = undefined; return head.data; } this._head = this._head.next; if (this._current === head) { this._current = this._head; this._next = this._current.next; } return head.data; } unshift(data) { this._head = new Item(data, undefined, this._head); if (this._length === 0) { this._tail = this._head; this._next = this._head; } this._length++; } unshiftCurrent() { var current = this._current; if (current === this._head || this._length < 2) { return current && current.data; } // remove if (current === this._tail) { this._tail = current.prev; this._tail.next = undefined; this._current = this._tail; } else { current.next.prev = current.prev; current.prev.next = current.next; this._current = current.prev; } this._next = this._current.next; // unshift current.next = this._head; current.prev = undefined; this._head.prev = current; this._head = current; return current.data; } removeCurrent() { var current = this._current; if (this._length === 0) { return; } this._length--; if (this._length === 0) { this._head = this._tail = this._current = this._next = undefined; return current.data; } if (current === this._tail) { this._tail = current.prev; this._tail.next = undefined; this._current = this._tail; } else if (current === this._head) { this._head = current.next; this._head.prev = undefined; this._current = this._head; } else { current.next.prev = current.prev; current.prev.next = current.next; this._current = current.prev; } this._next = this._current.next; return current.data; } resetCursor() { this._current = this._next = this._head; return this; } next() { var next = this._next; if (next !== undefined) { this._next = next.next; this._current = next; return next.data; } } }; LinkedList.LinkedList = LinkedList$1; return LinkedList; } var hasRequiredFixedSizeLinkedList; function requireFixedSizeLinkedList () { if (hasRequiredFixedSizeLinkedList) return FixedSizeLinkedList; hasRequiredFixedSizeLinkedList = 1; Object.defineProperty(FixedSizeLinkedList, "__esModule", { value: true }); FixedSizeLinkedList.default = void 0; var _LinkedList = requireLinkedList(); /** * Created by AAravindan on 5/7/16. */ let FixedSizeLinkedList$1 = class FixedSizeLinkedList extends _LinkedList.LinkedList { totalPushed = 0; periodHigh = 0; periodLow = Infinity; periodSum = 0; lastShift; _push; constructor(size, maintainHigh, maintainLow, maintainSum) { super(); this.size = size; this.maintainHigh = maintainHigh; this.maintainLow = maintainLow; this.maintainSum = maintainSum; if (!size || typeof size !== 'number') { throw 'Size required and should be a number.'; } this._push = this.push; this.push = function (data) { this.add(data); this.totalPushed++; }; } add(data) { if (this.length === this.size) { this.lastShift = this.shift(); this._push(data); //TODO: FInd a better way if (this.maintainHigh) if (this.lastShift == this.periodHigh) this.calculatePeriodHigh(); if (this.maintainLow) if (this.lastShift == this.periodLow) this.calculatePeriodLow(); if (this.maintainSum) { this.periodSum = this.periodSum - this.lastShift; } } else { this._push(data); } //TODO: FInd a better way if (this.maintainHigh) if (this.periodHigh <= data) this.periodHigh = data; if (this.maintainLow) if (this.periodLow >= data) this.periodLow = data; if (this.maintainSum) { this.periodSum = this.periodSum + data; } } *iterator() { this.resetCursor(); while (this.next()) { yield this.current; } } calculatePeriodHigh() { this.resetCursor(); if (this.next()) this.periodHigh = this.current; while (this.next()) { if (this.periodHigh <= this.current) { this.periodHigh = this.current; } } } calculatePeriodLow() { this.resetCursor(); if (this.next()) this.periodLow = this.current; while (this.next()) { if (this.periodLow >= this.current) { this.periodLow = this.current; } } } }; FixedSizeLinkedList.default = FixedSizeLinkedList$1; return FixedSizeLinkedList; } var StockData = {}; var hasRequiredStockData; function requireStockData () { if (hasRequiredStockData) return StockData; hasRequiredStockData = 1; Object.defineProperty(StockData, "__esModule", { value: true }); StockData.default = StockData.CandleList = StockData.CandleData = void 0; let StockData$1 = class StockData { reversedInput; constructor(open, high, low, close, reversedInput) { this.open = open; this.high = high; this.low = low; this.close = close; this.reversedInput = reversedInput; } }; StockData.default = StockData$1; class CandleData { open; high; low; close; timestamp; volume; } StockData.CandleData = CandleData; class CandleList { open = []; high = []; low = []; close = []; volume = []; timestamp = []; } StockData.CandleList = CandleList; return StockData; } var SMA = {}; var indicator = {}; var NumberFormatter = {}; var config = {}; var hasRequiredConfig; function requireConfig () { if (hasRequiredConfig) return config; hasRequiredConfig = 1; Object.defineProperty(config, "__esModule", { value: true }); config.getConfig = getConfig; config.setConfig = setConfig; let config$1 = {}; function setConfig(key, value) { config$1[key] = value; } function getConfig(key) { return config$1[key]; } return config; } var hasRequiredNumberFormatter; function requireNumberFormatter () { if (hasRequiredNumberFormatter) return NumberFormatter; hasRequiredNumberFormatter = 1; Object.defineProperty(NumberFormatter, "__esModule", { value: true }); NumberFormatter.format = format; var _config = requireConfig(); function format(v) { let precision = (0, _config.getConfig)('precision'); if (precision) { return parseFloat(v.toPrecision(precision)); } return v; } return NumberFormatter; } var hasRequiredIndicator; function requireIndicator () { if (hasRequiredIndicator) return indicator; hasRequiredIndicator = 1; Object.defineProperty(indicator, "__esModule", { value: true }); indicator.IndicatorInput = indicator.Indicator = indicator.AllInputs = void 0; var _NumberFormatter = requireNumberFormatter(); class IndicatorInput { reversedInput; format; } indicator.IndicatorInput = IndicatorInput; class AllInputs { values; open; high; low; close; volume; timestamp; } indicator.AllInputs = AllInputs; class Indicator { result; format; constructor(input) { this.format = input.format || _NumberFormatter.format; } static reverseInputs(input) { if (input.reversedInput) { input.values ? input.values.reverse() : undefined; input.open ? input.open.reverse() : undefined; input.high ? input.high.reverse() : undefined; input.low ? input.low.reverse() : undefined; input.close ? input.close.reverse() : undefined; input.volume ? input.volume.reverse() : undefined; input.timestamp ? input.timestamp.reverse() : undefined; } } getResult() { return this.result; } } indicator.Indicator = Indicator; return indicator; } var hasRequiredSMA; function requireSMA () { if (hasRequiredSMA) return SMA; hasRequiredSMA = 1; Object.defineProperty(SMA, "__esModule", { value: true }); SMA.SMA = SMA.MAInput = void 0; SMA.sma = sma; var _indicator = requireIndicator(); var _LinkedList = requireLinkedList(); //STEP 1. Import Necessary indicator or rather last step //STEP 2. Create the input for the indicator, mandatory should be in the constructor class MAInput extends _indicator.IndicatorInput { constructor(period, values) { super(); this.period = period; this.values = values; } } //STEP3. Add class based syntax with export SMA.MAInput = MAInput; let SMA$1 = class SMA extends _indicator.Indicator { period; price; result; generator; constructor(input) { super(input); this.period = input.period; this.price = input.values; var genFn = function* (period) { var list = new _LinkedList.LinkedList(); var sum = 0; var counter = 1; var current = yield; var result; list.push(0); while (true) { if (counter < period) { counter++; list.push(current); sum = sum + current; } else { sum = sum - list.shift() + current; result = sum / period; list.push(current); } current = yield result; } }; this.generator = genFn(this.period); this.generator.next(); this.result = []; this.price.forEach(tick => { var result = this.generator.next(tick); if (result.value !== undefined) { this.result.push(this.format(result.value)); } }); } static calculate = sma; nextValue(price) { var result = this.generator.next(price).value; if (result != undefined) return this.format(result); } }; SMA.SMA = SMA$1; function sma(input) { _indicator.Indicator.reverseInputs(input); var result = new SMA$1(input).result; if (input.reversedInput) { result.reverse(); } _indicator.Indicator.reverseInputs(input); return result; } //STEP 6. Run the tests return SMA; } var EMA = {}; var hasRequiredEMA; function requireEMA () { if (hasRequiredEMA) return EMA; hasRequiredEMA = 1; Object.defineProperty(EMA, "__esModule", { value: true }); EMA.EMA = void 0; EMA.ema = ema; var _indicator = requireIndicator(); var _SMA = requireSMA(); let EMA$1 = class EMA extends _indicator.Indicator { period; price; result; generator; constructor(input) { super(input); var period = input.period; var priceArray = input.values; var exponent = 2 / (period + 1); var sma; this.result = []; sma = new _SMA.SMA({ period: period, values: [] }); var genFn = function* () { var tick = yield; var prevEma; while (true) { if (prevEma !== undefined && tick !== undefined) { prevEma = (tick - prevEma) * exponent + prevEma; tick = yield prevEma; } else { tick = yield; prevEma = sma.nextValue(tick); if (prevEma) tick = yield prevEma; } } }; this.generator = genFn(); this.generator.next(); this.generator.next(); priceArray.forEach(tick => { var result = this.generator.next(tick); if (result.value != undefined) { this.result.push(this.format(result.value)); } }); } static calculate = ema; nextValue(price) { var result = this.generator.next(price).value; if (result != undefined) return this.format(result); } }; EMA.EMA = EMA$1; function ema(input) { _indicator.Indicator.reverseInputs(input); var result = new EMA$1(input).result; if (input.reversedInput) { result.reverse(); } _indicator.Indicator.reverseInputs(input); return result; } return EMA; } var WMA = {}; var hasRequiredWMA; function requireWMA () { if (hasRequiredWMA) return WMA; hasRequiredWMA = 1; Object.defineProperty(WMA, "__esModule", { value: true }); WMA.WMA = void 0; WMA.wma = wma; var _indicator = requireIndicator(); var _LinkedList = requireLinkedList(); let WMA$1 = class WMA extends _indicator.Indicator { period; price; result; generator; constructor(input) { super(input); var period = input.period; var priceArray = input.values; this.result = []; this.generator = function* () { let data = new _LinkedList.LinkedList(); let denominator = period * (period + 1) / 2; while (true) { if (data.length < period) { data.push(yield); } else { data.resetCursor(); let result = 0; for (let i = 1; i <= period; i++) { result = result + data.next() * i / denominator; } var next = yield result; data.shift(); data.push(next); } } }(); this.generator.next(); priceArray.forEach((tick, index) => { var result = this.generator.next(tick); if (result.value != undefined) { this.result.push(this.format(result.value)); } }); } static calculate = wma; //STEP 5. REMOVE GET RESULT FUNCTION nextValue(price) { var result = this.generator.next(price).value; if (result != undefined) return this.format(result); } }; WMA.WMA = WMA$1; function wma(input) { _indicator.Indicator.reverseInputs(input); var result = new WMA$1(input).result; if (input.reversedInput) { result.reverse(); } _indicator.Indicator.reverseInputs(input); return result; } return WMA; } var WEMA = {}; var hasRequiredWEMA; function requireWEMA () { if (hasRequiredWEMA) return WEMA; hasRequiredWEMA = 1; Object.defineProperty(WEMA, "__esModule", { value: true }); WEMA.WEMA = void 0; WEMA.wema = wema; var _indicator = requireIndicator(); var _SMA = requireSMA(); let WEMA$1 = class WEMA extends _indicator.Indicator { period; price; result; generator; constructor(input) { super(input); var period = input.period; var priceArray = input.values; var exponent = 1 / period; var sma; this.result = []; sma = new _SMA.SMA({ period: period, values: [] }); var genFn = function* () { var tick = yield; var prevEma; while (true) { if (prevEma !== undefined && tick !== undefined) { prevEma = (tick - prevEma) * exponent + prevEma; tick = yield prevEma; } else { tick = yield; prevEma = sma.nextValue(tick); if (prevEma !== undefined) tick = yield prevEma; } } }; this.generator = genFn(); this.generator.next(); this.generator.next(); priceArray.forEach(tick => { var result = this.generator.next(tick); if (result.value != undefined) { this.result.push(this.format(result.value)); } }); } static calculate = wema; nextValue(price) { var result = this.generator.next(price).value; if (result != undefined) return this.format(result); } }; WEMA.WEMA = WEMA$1; function wema(input) { _indicator.Indicator.reverseInputs(input); var result = new WEMA$1(input).result; if (input.reversedInput) { result.reverse(); } _indicator.Indicator.reverseInputs(input); return result; } return WEMA; } var MACD = {}; var hasRequiredMACD; function requireMACD () { if (hasRequiredMACD) return MACD; hasRequiredMACD = 1; Object.defineProperty(MACD, "__esModule", { value: true }); MACD.MACDOutput = MACD.MACDInput = MACD.MACD = void 0; MACD.macd = macd; var _indicator = requireIndicator(); var _SMA = requireSMA(); var _EMA = requireEMA(); /** * Created by AAravindan on 5/4/16. */ class MACDInput extends _indicator.IndicatorInput { SimpleMAOscillator = true; SimpleMASignal = true; fastPeriod; slowPeriod; signalPeriod; constructor(values) { super(); this.values = values; } } MACD.MACDInput = MACDInput; class MACDOutput { MACD; signal; histogram; } MACD.MACDOutput = MACDOutput; let MACD$1 = class MACD extends _indicator.Indicator { result; generator; constructor(input) { super(input); var oscillatorMAtype = input.SimpleMAOscillator ? _SMA.SMA : _EMA.EMA; var signalMAtype = input.SimpleMASignal ? _SMA.SMA : _EMA.EMA; var fastMAProducer = new oscillatorMAtype({ period: input.fastPeriod, values: [], format: v => { return v; } }); var slowMAProducer = new oscillatorMAtype({ period: input.slowPeriod, values: [], format: v => { return v; } }); var signalMAProducer = new signalMAtype({ period: input.signalPeriod, values: [], format: v => { return v; } }); var format = this.format; this.result = []; this.generator = function* () { var index = 0; var tick; var MACD, signal, histogram, fast, slow; while (true) { if (index < input.slowPeriod) { tick = yield; fast = fastMAProducer.nextValue(tick); slow = slowMAProducer.nextValue(tick); index++; continue; } if (fast && slow) { //Just for typescript to be happy MACD = fast - slow; signal = signalMAProducer.nextValue(MACD); } histogram = MACD - signal; tick = yield { //fast : fast, //slow : slow, MACD: format(MACD), signal: signal ? format(signal) : undefined, histogram: isNaN(histogram) ? undefined : format(histogram) }; fast = fastMAProducer.nextValue(tick); slow = slowMAProducer.nextValue(tick); } }(); this.generator.next(); input.values.forEach(tick => { var result = this.generator.next(tick); if (result.value != undefined) { this.result.push(result.value); } }); } static calculate = macd; nextValue(price) { var result = this.generator.next(price).value; return result; } }; MACD.MACD = MACD$1; function macd(input) { _indicator.Indicator.reverseInputs(input); var result = new MACD$1(input).result; if (input.reversedInput) { result.reverse(); } _indicator.Indicator.reverseInputs(input); return result; } return MACD; } var RSI = {}; var AverageGain = {}; var hasRequiredAverageGain; function requireAverageGain () { if (hasRequiredAverageGain) return AverageGain; hasRequiredAverageGain = 1; Object.defineProperty(AverageGain, "__esModule", { value: true }); AverageGain.AvgGainInput = AverageGain.AverageGain = void 0; AverageGain.averagegain = averagegain; var _indicator = requireIndicator(); class AvgGainInput extends _indicator.IndicatorInput { period; values; } AverageGain.AvgGainInput = AvgGainInput; let AverageGain$1 = class AverageGain extends _indicator.Indicator { generator; constructor(input) { super(input); let values = input.values; let period = input.period; let format = this.format; this.generator = function* (period) { var currentValue = yield; var counter = 1; var gainSum = 0; var avgGain; var gain; var lastValue = currentValue; currentValue = yield; while (true) { gain = currentValue - lastValue; gain = gain > 0 ? gain : 0; if (gain > 0) { gainSum = gainSum + gain; } if (counter < period) { counter++; } else if (avgGain === undefined) { avgGain = gainSum / period; } else { avgGain = (avgGain * (period - 1) + gain) / period; } lastValue = currentValue; avgGain = avgGain !== undefined ? format(avgGain) : undefined; currentValue = yield avgGain; } }(period); this.generator.next(); this.result = []; values.forEach(tick => { var result = this.generator.next(tick); if (result.value !== undefined) { this.result.push(result.value); } }); } static calculate = averagegain; nextValue(price) { return this.generator.next(price).value; } }; AverageGain.AverageGain = AverageGain$1; function averagegain(input) { _indicator.Indicator.reverseInputs(input); var result = new AverageGain$1(input).result; if (input.reversedInput) { result.reverse(); } _indicator.Indicator.reverseInputs(input); return result; } return AverageGain; } var AverageLoss = {}; var hasRequiredAverageLoss; function requireAverageLoss () { if (hasRequiredAverageLoss) return AverageLoss; hasRequiredAverageLoss = 1; Object.defineProperty(AverageLoss, "__esModule", { value: true }); AverageLoss.AvgLossInput = AverageLoss.AverageLoss = void 0; AverageLoss.averageloss = averageloss; var _indicator = requireIndicator(); class AvgLossInput extends _indicator.IndicatorInput { values; period; } AverageLoss.AvgLossInput = AvgLossInput; let AverageLoss$1 = class AverageLoss extends _indicator.Indicator { generator; constructor(input) { super(input); let values = input.values; let period = input.period; let format = this.format; this.generator = function* (period) { var currentValue = yield; var counter = 1; var lossSum = 0; var avgLoss; var loss; var lastValue = currentValue; currentValue = yield; while (true) { loss = lastValue - currentValue; loss = loss > 0 ? loss : 0; if (loss > 0) { lossSum = lossSum + loss; } if (counter < period) { counter++; } else if (avgLoss === undefined) { avgLoss = lossSum / period; } else { avgLoss = (avgLoss * (period - 1) + loss) / period; } lastValue = currentValue; avgLoss = avgLoss !== undefined ? format(avgLoss) : undefined; currentValue = yield avgLoss; } }(period); this.generator.next(); this.result = []; values.forEach(tick => { var result = this.generator.next(tick); if (result.value !== undefined) { this.result.push(result.value); } }); } static calculate = averageloss; nextValue(price) { return this.generator.next(price).value; } }; AverageLoss.AverageLoss = AverageLoss$1; function averageloss(input) { _indicator.Indicator.reverseInputs(input); var result = new AverageLoss$1(input).result; if (input.reversedInput) { result.reverse(); } _indicator.Indicator.reverseInputs(input); return result; } return AverageLoss; } var hasRequiredRSI; function requireRSI () { if (hasRequiredRSI) return RSI; hasRequiredRSI = 1; Object.defineProperty(RSI, "__esModule", { value: true }); RSI.RSIInput = RSI.RSI = void 0; RSI.rsi = rsi; var _indicator = requireIndicator(); var _AverageGain = requireAverageGain(); var _AverageLoss = requireAverageLoss(); /** * Created by AAravindan on 5/5/16. */ class RSIInput extends _indicator.IndicatorInput { period; values; } RSI.RSIInput = RSIInput; let RSI$1 = class RSI extends _indicator.Indicator { generator; constructor(input) { super(input); var period = input.period; var values = input.values; var GainProvider = new _AverageGain.AverageGain({ period: period, values: [] }); var LossProvider = new _AverageLoss.AverageLoss({ period: period, values: [] }); this.generator = function* (period) { var current = yield; var lastAvgGain, lastAvgLoss, RS, currentRSI; while (true) { lastAvgGain = GainProvider.nextValue(current); lastAvgLoss = LossProvider.nextValue(current); if (lastAvgGain !== undefined && lastAvgLoss !== undefined) { if (lastAvgLoss === 0) { currentRSI = 100; } else if (lastAvgGain === 0) { currentRSI = 0; } else { RS = lastAvgGain / lastAvgLoss; RS = isNaN(RS) ? 0 : RS; currentRSI = parseFloat((100 - 100 / (1 + RS)).toFixed(2)); } } current = yield currentRSI; } }(); this.generator.next(); this.result = []; values.forEach(tick => { var result = this.generator.next(tick); if (result.value !== undefined) { this.result.push(result.value); } }); } static calculate = rsi; nextValue(price) { return this.generator.next(price).value; } }; RSI.RSI = RSI$1; function rsi(input) { _indicator.Indicator.reverseInputs(input); var result = new RSI$1(input).result; if (input.reversedInput) { result.reverse(); } _indicator.Indicator.reverseInputs(input); return result; } return RSI; } var BollingerBands = {}; var SD = {}; var hasRequiredSD; function requireSD () { if (hasRequiredSD) return SD; hasRequiredSD = 1; var _interopRequireDefault = interopRequireDefaultExports; Object.defineProperty(SD, "__esModule", { value: true }); SD.SDInput = SD.SD = void 0; SD.sd = sd; var _indicator = requireIndicator(); var _SMA = requireSMA(); var _FixedSizeLinkedList = _interopRequireDefault(requireFixedSizeLinkedList()); class SDInput extends _indicator.IndicatorInput { period; values; } SD.SDInput = SDInput; let SD$1 = class SD extends _indicator.Indicator { generator; constructor(input) { super(input); var period = input.period; var priceArray = input.values; var sma = new _SMA.SMA({ period: period, values: [], format: v => { return v; } }); this.result = []; this.generator = function* () { var tick; var mean; var currentSet = new _FixedSizeLinkedList.default(period); tick = yield; var sd; while (true) { currentSet.push(tick); mean = sma.nextValue(tick); if (mean) { let sum = 0; for (let x of currentSet.iterator()) { sum = sum + Math.pow(x - mean, 2); } sd = Math.sqrt(sum / period); } tick = yield sd; } }(); this.generator.next(); priceArray.forEach(tick => { var result = this.generator.next(tick); if (result.value != undefined) { this.result.push(this.format(result.value)); } }); } static calculate = sd; nextValue(price) { var nextResult = this.generator.next(price); if (nextResult.value != undefined) return this.format(nextResult.value); } }; SD.SD = SD$1; function sd(input) { _indicator.Indicator.reverseInputs(input); var result = new SD$1(input).result; if (input.reversedInput) { result.reverse(); } _indicator.Indicator.reverseInputs(input); return result; } return SD; } var hasRequiredBollingerBands; function requireBollingerBands () { if (hasRequiredBollingerBands) return BollingerBands; hasRequiredBollingerBands = 1; Object.defineProperty(BollingerBands, "__esModule", { value: true }); BollingerBands.BollingerBandsOutput = BollingerBands.BollingerBandsInput = BollingerBands.BollingerBands = void 0; BollingerBands.bollingerbands = bollingerbands; var _indicator = requireIndicator(); var _SMA = requireSMA(); var _SD = requireSD(); class BollingerBandsInput extends _indicator.IndicatorInput { period; stdDev; values; } BollingerBands.BollingerBandsInput = BollingerBandsInput; class BollingerBandsOutput extends _indicator.IndicatorInput { middle; upper; lower; pb; } BollingerBands.BollingerBandsOutput = BollingerBandsOutput; let BollingerBands$1 = class BollingerBands extends _indicator.Indicator { generator; constructor(input) { super(input); var period = input.period; var priceArray = input.values; var stdDev = input.stdDev; var format = this.format; var sma, sd; this.result = []; sma = new _SMA.SMA({ period: period, values: [], format: v => { return v; } }); sd = new _SD.SD({ period: period, values: [], format: v => { return v; } }); this.generator = function* () { var result; var tick; var calcSMA; var calcsd; tick = yield; while (true) { calcSMA = sma.nextValue(tick); calcsd = sd.nextValue(tick); if (calcSMA) { let middle = format(calcSMA); let upper = format(calcSMA + calcsd * stdDev); let lower = format(calcSMA - calcsd * stdDev); let pb = format((tick - lower) / (upper - lower)); result = { middle: middle, upper: upper, lower: lower, pb: pb }; } tick = yield result; } }(); this.generator.next(); priceArray.forEach(tick => { var result = this.generator.next(tick); if (result.value != undefined) { this.result.push(result.value); } }); } static calculate = bollingerbands; nextValue(price) { return this.generator.next(price).value; } }; BollingerBands.BollingerBands = BollingerBands$1; function bollingerbands(input) { _indicator.Indicator.reverseInputs(input); var result = new BollingerBands$1(input).result; if (input.reversedInput) { result.reverse(); } _indicator.Indicator.reverseInputs(input); return result; } return BollingerBands; } var ADX = {}; var WilderSmoothing = {}; var hasRequiredWilderSmoothing; function requireWilderSmoothing () { if (hasRequiredWilderSmoothing) return WilderSmoothing; hasRequiredWilderSmoothing = 1; Object.defineProperty(WilderSmoothing, "__esModule", { value: true }); WilderSmoothing.WilderSmoothing = void 0; WilderSmoothing.wildersmoothing = wildersmoothing; var _indicator = requireIndicator(); var _LinkedList = requireLinkedList(); //STEP3. Add class based syntax with export let WilderSmoothing$1 = class WilderSmoothing extends _indicator.Indicator { period; price; result; generator; constructor(input) { super(input); this.period = input.period; this.price = input.values; var genFn = function* (period) { new _LinkedList.LinkedList(); var sum = 0; var counter = 1; var current = yield; var result = 0; while (true) { if (counter < period) { counter++; sum = sum + current; result = undefined; } else if (counter == period) { counter++; sum = sum + current; result = sum; } else { result = result - result / period + current; } current = yield result; } }; this.generator = genFn(this.period); this.generator.next(); this.result = []; this.price.forEach(tick => { var result = this.generator.next(tick); if (result.value != undefined) { this.result.push(this.format(result.value)); } }); } static calculate = wildersmoothing; nextValue(price) { var result = this.generator.next(price).value; if (result != undefined) return this.format(result); } }; WilderSmoothing.WilderSmoothing = WilderSmoothing$1; function wildersmoothing(input) { _indicator.Indicator.reverseInputs(input); var result = new WilderSmoothing$1(input).result; if (input.reversedInput) { result.reverse(); } _indicator.Indicator.reverseInputs(input); return result; } //STEP 6. Run the tests return WilderSmoothing; } var MinusDM = {}; var hasRequiredMinusDM; function requireMinusDM () { if (hasRequiredMinusDM) return MinusDM; hasRequiredMinusDM = 1; Object.defineProperty(MinusDM, "__esModule", { value: true }); MinusDM.MDMInput = MinusDM.MDM = void 0; var _indicator = requireIndicator(); class MDMInput extends _indicator.IndicatorInput { low; high; } MinusDM.MDMInput = MDMInput; class MDM extends _indicator.Indicator { result; generator; constructor(input) { super(input); var lows = input.low; var highs = input.high; var format = this.format; if (lows.length != highs.length) { throw 'Inputs(low,high) not of equal size'; } this.result = []; this.generator = function* () { var minusDm; var current = yield; var last; while (true) { if (last) { let upMove = current.high - last.high; let downMove = last.low - current.low; minusDm = format(downMove > upMove && downMove > 0 ? downMove : 0); } last = current; current = yield minusDm; } }(); this.generator.next(); lows.forEach((tick, index) => { var result = this.generator.next({ high: highs[index], low: lows[index] }); if (result.value !== undefined) this.result.push(result.value); }); } static calculate(input) { _indicator.Indicator.reverseInputs(input); var result = new MDM(input).result; if (input.reversedInput) { result.reverse(); } _indicator.Indicator.reverseInputs(input); return result; } nextValue(price) { return this.generator.next(price).value; } } MinusDM.MDM = MDM; return MinusDM; } var PlusDM = {}; var hasRequiredPlusDM; function requirePlusDM () { if (hasRequiredPlusDM) return PlusDM; hasRequiredPlusDM = 1; Object.defineProperty(PlusDM, "__esModule", { value: true }); PlusDM.PDMInput = PlusDM.PDM = void 0; var _indicator = requireIndicator(); /** * Created by AAravindan on 5/8/16. */ class PDMInput extends _indicator.IndicatorInput { low; high; } PlusDM.PDMInput = PDMInput; class PDM extends _indicator.Indicator { result; generator; constructor(input) { super(input); var lows = input.low; var highs = input.high; var format = this.format; if (lows.length != highs.length) { throw 'Inputs(low,high) not of equal size'; } this.result = []; this.generator = function* () { var plusDm; var current = yield; var last; while (true) { if (last) { let upMove = current.high - last.high; let downMove = last.low - current.low; plusDm = format(upMove > downMove && upMove > 0 ? upMove : 0); } last = current; current = yield plusDm; } }(); this.generator.next(); lows.forEach((tick, index) => { var result = this.generator.next({ high: highs[index], low: lows[index] }); if (result.value !== undefined) this.result.push(result.value); }); } static calculate(input) { _indicator.Indicator.reverseInputs(input); var result = new PDM(input).result; if (input.reversedInput) { result.reverse(); } _indicator.Indicator.reverseInputs(input); return result; } nextValue(price) { return this.generator.next(price).value; } } PlusDM.PDM = PDM; return PlusDM; } var TrueRange = {}; var hasRequiredTrueRange; function requireTrueRange () { if (hasRequiredTrueRange) return TrueRange; hasRequiredTrueRange = 1; Object.defineProperty(TrueRange, "__esModule", { value: true }); TrueRange.TrueRangeInput = TrueRange.TrueRange = void 0; TrueRange.truerange = truerange; var _indicator = requireIndicator(); class TrueRangeInput extends _indicator.IndicatorInput { low; high; close; } TrueRange.TrueRangeInput = TrueRangeInput; let TrueRange$1 = class TrueRange extends _indicator.Indicator { result; generator; constructor(input) { super(input); var lows = input.low; var highs = input.high; var closes = input.close; var format = this.format; if (lows.length != highs.length) { throw 'Inputs(low,high) not of equal size'; } this.result = []; this.generator = function* () { var current = yield; var previousClose, result; while (true) { if (previousClose === undefined) { previousClose = current.close; current = yield result; } result = Math.max(current.high - current.low, isNaN(Math.abs(current.high - previousClose)) ? 0 : Math.abs(current.high - previousClose), isNaN(Math.abs(current.low - previousClose)) ? 0 : Math.abs(current.low - previousClose)); previousClose = current.close; if (result != undefined) { result = format(result); } current = yield result; } }(); this.generator.next(); lows.forEach((tick, index) => { var result = this.generator.next({ high: highs[index], low: lows[index], close: closes[index] }); if (result.value != undefined) { this.result.push(result.value); } }); } static calculate = truerange; nextValue(price) { return this.generator.next(price).value; } }; TrueRange.TrueRange = TrueRange$1; function truerange(input) { _indicator.Indicator.reverseInputs(input); var result = new TrueRange$1(input).result; if (input.reversedInput) { result.reverse(); } _indicator.Indicator.reverseInputs(input); return result; } return TrueRange; } var hasRequiredADX; function requireADX () { if (hasRequiredADX) return ADX; hasRequiredADX = 1; Object.defineProperty(ADX, "__esModule", { value: true }); ADX.ADXOutput = ADX.ADXInput = ADX.ADX = void 0; ADX.adx = adx; var _WilderSmoothing = requireWilderSmoothing(); var _indicator = requireIndicator(); var _MinusDM = requireMinusDM(); var _PlusDM = requirePlusDM(); var _TrueRange = requireTrueRange(); var _WEMA = requireWEMA(); class ADXInput extends _indicator.IndicatorInput { high; low; close; period; } ADX.ADXInput = ADXInput; class ADXOutput extends _indicator.IndicatorInput { adx; pdi; mdi; } ADX.ADXOutput = ADXOutput; let ADX$1 = class ADX extends _indicator.Indicator { result; generator; constructor(input) { super(input); var lows = input.low; var highs = input.high; var closes = input.close; var period = input.period; var format = this.format; var plusDM = new _PlusDM.PDM({ high: [], low: [] }); var minusDM = new _MinusDM.MDM({ high: [], low: [] }); var emaPDM = new _WilderSmoothing.WilderSmoothing({ period: period, values: [], format: v => { return v; } }); var emaMDM = new _WilderSmoothing.WilderSmoothing({ period: period, values: [], format: v => { return v; } }); var emaTR = new _WilderSmoothing.WilderSmoothing({ period: period, values: [], format: v => { return v; } }); var emaDX = new _WEMA.WEMA({ period: period, values: [], format: v => { return v; } }); var tr = new _TrueRange.TrueRange({ low: [], high: [], close: [] }); if (!(lows.length === highs.length && highs.length === closes.length)) { throw 'Inputs(low,high, close) not of equal size'; } this.result = []; this.generator = function* () { var tick = yield; var lastPDI, lastMDI, lastDX, smoothedDX; while (true) { let calcTr = tr.nextValue(tick); let calcPDM = plusDM.nextValue(tick); let calcMDM = minusDM.nextValue(tick); if (calcTr === undefined) { tick = yield; continue; } let lastATR = emaTR.nextValue(calcTr); let lastAPDM = emaPDM.nextValue(calcPDM); let lastAMDM = emaMDM.nextValue(calcMDM); if (lastATR != undefined && lastAPDM != undefined && lastAMDM != undefined) { lastPDI = lastAPDM * 100 / lastATR; lastMDI = lastAMDM * 100 / lastATR; let diDiff = Math.abs(lastPDI - lastMDI); let diSum = lastPDI + lastMDI; lastDX = diDiff / diSum * 100; smoothedDX = emaDX.nextValue(lastDX); // 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)); } tick = yield { adx: smoothedDX, pdi: lastPDI, mdi: lastMDI }; } }(); this.generator.next(); lows.forEach((tick, index) => { var result = this.generator.next({ high: highs[index], low: lows[index], close: closes[index] }); if (result.value != undefined && result.value.adx != undefined) { this.result.push({ adx: format(result.value.adx), pdi: format(result.value.pdi), mdi: format(result.value.mdi) }); } }); } static calculate = adx; nextValue(price) { let result = this.generator.next(price).value; if (result != undefined && result.adx != undefined) { return { adx: this.format(result.adx), pdi: this.format(result.pdi), mdi: this.format(result.mdi) }; } } }; ADX.ADX = ADX$1; function adx(input) { _indicator.Indicator.reverseInputs(input); var result = new ADX$1(input).result; if (input.reversedInput) { result.reverse(); } _indicator.Indicator.reverseInputs(input); return result; } return ADX; } var ATR = {}; var hasRequiredATR; function requireATR () { if (hasRequiredATR) return ATR; hasRequiredATR = 1; Object.defineProperty(ATR, "__esModule", { value: true }); ATR.ATRInput = ATR.ATR = void 0; ATR.atr = atr; var _indicator = requireIndicator(); var _WEMA = requireWEMA(); var _TrueRange = requireTrueRange(); class ATRInput extends _indicator.IndicatorInput { low; high; close; period; } ATR.ATRInput = ATRInput; let ATR$1 = class ATR extends _indicator.Indicator { result; generator; constructor(input) { super(input); var lows = input.low; var highs = input.high; var closes = input.close; var period = input.period; var format = this.format; if (!(lows.length === highs.length && highs.length === closes.length)) { throw 'Inputs(low,high, close) not of equal size'; } var trueRange = new _TrueRange.TrueRange({ low: [], high: [], close: [] }); var wema = new _WEMA.WEMA({ period: period, values: [], format: v => { return v; } }); this.result = []; this.generator = function* () { var tick = yield; var avgTrueRange, trange; while (true) { trange = trueRange.nextValue({ low: tick.low, high: tick.high, close: tick.close }); if (trange === undefined) { avgTrueRange = undefined; } else { avgTrueRange = wema.nextValue(trange); } tick = yield avgTrueRange; } }(); this.generator.next(); lows.forEach((tick, index) => { var result = this.generator.next({ high: highs[index], low: lows[index], close: closes[index] }); if (result.value !== undefined) { this.result.push(format(result.value)); } }); } static calculate = atr; nextValue(price) { return this.generator.next(price).value; } }; ATR.ATR = ATR$1; function atr(input) { _indicator.Indicator.reverseInputs(input); var result = new ATR$1(input).result; if (input.reversedInput) { result.reverse(); } _indicator.Indicator.reverseInputs(input); return result; } return ATR; } var ROC = {}; var hasRequiredROC; function requireROC () { if (hasRequiredROC) return ROC; hasRequiredROC = 1; var _interopRequireDefault = interopRequireDefaultExports; Object.defineProperty(ROC, "__esModule", { value: true }); ROC.ROCInput = ROC.ROC = void 0; ROC.roc = roc; var _indicator = requireIndicator(); var _FixedSizeLinkedList = _interopRequireDefault(requireFixedSizeLinkedList()); class ROCInput extends _indicator.IndicatorInput { period; values; } ROC.ROCInput = ROCInput; let ROC$1 = class ROC extends _indicator.Indicator { result; generator; constructor(input) { super(input); var period = input.period; var priceArray = input.values; this.result = []; this.generator = function* () { let index = 1; var pastPeriods = new _FixedSizeLinkedList.default(period); var tick = yield; var roc; while (true) { pastPeriods.push(tick); if (index < period) { index++; } else { roc = (tick - pastPeriods.lastShift) / pastPeriods.lastShift * 100; } tick = yield roc; } }(); this.generator.next(); priceArray