trading-signals
Version:
Technical indicators to run technical analysis with JavaScript / TypeScript.
57 lines • 2.13 kB
JavaScript
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