trading-signals
Version:
Technical indicators to run technical analysis with JavaScript / TypeScript.
52 lines • 1.86 kB
JavaScript
import { TechnicalIndicator, TradingSignal } from '../../base/Indicator.js';
import { ATR } from '../../volatility/ATR/ATR.js';
export class VolatilityStop extends TechnicalIndicator {
#atr;
#previous = null;
#previousSnapshot = null;
interval;
multiplier;
constructor({ interval = 5, multiplier = 3.5 } = {}) {
super();
this.interval = interval;
this.multiplier = multiplier;
this.#atr = new ATR(interval);
}
getRequiredInputs() {
return this.#atr.getRequiredInputs();
}
update(candle, replace) {
if (replace) {
this.#previous = this.#previousSnapshot;
}
else {
this.#previousSnapshot = this.#previous;
}
const atr = this.#atr.update(candle, replace);
if (atr === null) {
return null;
}
const { close } = candle;
const loss = this.multiplier * atr;
const previous = this.#previous;
let result;
if (previous === null) {
result = { signal: TradingSignal.BULLISH, stop: close - loss };
}
else if (close > previous.stop && previous.close > previous.stop) {
result = { signal: TradingSignal.BULLISH, stop: Math.max(previous.stop, close - loss) };
}
else if (close < previous.stop && previous.close < previous.stop) {
result = { signal: TradingSignal.BEARISH, stop: Math.min(previous.stop, close + loss) };
}
else if (close > previous.stop) {
result = { signal: TradingSignal.BULLISH, stop: close - loss };
}
else {
result = { signal: TradingSignal.BEARISH, stop: close + loss };
}
this.#previous = { close, stop: result.stop };
return (this.result = result);
}
}
//# sourceMappingURL=VolatilityStop.js.map