UNPKG

trading-signals

Version:

Technical indicators to run technical analysis with JavaScript / TypeScript.

57 lines 2.13 kB
import { TechnicalIndicator, TradingSignal } from '../../base/Indicator.js'; import { ATR } from '../../volatility/ATR/ATR.js'; export class SuperTrend extends TechnicalIndicator { #atr; #state; #previousState; interval; multiplier; constructor({ interval = 10, multiplier = 3 } = {}) { super(); this.interval = interval; this.multiplier = multiplier; this.#atr = new ATR(interval); } getRequiredInputs() { return this.#atr.getRequiredInputs(); } update(candle, replace) { if (replace) { this.#state = this.#previousState; } const atr = this.#atr.update(candle, replace); if (atr === null) { return null; } const hl2 = (candle.high + candle.low) / 2; const basicUpperBand = hl2 + this.multiplier * atr; const basicLowerBand = hl2 - this.multiplier * atr; const previous = this.#state; let finalUpperBand; let finalLowerBand; let isUp; if (previous === undefined) { finalUpperBand = basicUpperBand; finalLowerBand = basicLowerBand; isUp = candle.close > finalUpperBand; } else { finalUpperBand = basicUpperBand < previous.finalUpperBand || previous.close > previous.finalUpperBand ? basicUpperBand : previous.finalUpperBand; finalLowerBand = basicLowerBand > previous.finalLowerBand || previous.close < previous.finalLowerBand ? basicLowerBand : previous.finalLowerBand; isUp = previous.isUp ? candle.close >= finalLowerBand : candle.close > finalUpperBand; } this.#previousState = previous; this.#state = { close: candle.close, finalLowerBand, finalUpperBand, isUp }; return (this.result = { supertrend: isUp ? finalLowerBand : finalUpperBand, trend: isUp ? TradingSignal.BULLISH : TradingSignal.BEARISH, }); } } //# sourceMappingURL=SuperTrend.js.map