UNPKG

trading-signals

Version:

Technical indicators to run technical analysis with JavaScript / TypeScript.

63 lines 2.22 kB
import { TechnicalIndicator, TradingSignal } from '../../base/Indicator.js'; import { getAverage, getStandardDeviation, pushUpdate } from '../../util/index.js'; export class BollingerBands extends TechnicalIndicator { prices = []; #previousResult; #twoPreviousResult; #lastPrice; #previousPrice; interval; deviationMultiplier; constructor(interval, deviationMultiplier = 2) { super(); this.interval = interval; this.deviationMultiplier = deviationMultiplier; } getRequiredInputs() { return this.interval; } update(price, replace) { const dropOut = pushUpdate(this.prices, replace, price, this.interval); if (replace) { this.result = this.#previousResult; this.#previousResult = this.#twoPreviousResult; this.#lastPrice = this.#previousPrice; } this.#twoPreviousResult = this.#previousResult; this.#previousResult = this.result; this.#previousPrice = this.#lastPrice; this.#lastPrice = price; if (dropOut) { const middle = getAverage(this.prices); const standardDeviation = getStandardDeviation(this.prices, middle); return (this.result = { lower: middle - standardDeviation * this.deviationMultiplier, middle, upper: middle + standardDeviation * this.deviationMultiplier, }); } return null; } calculateSignal(result, price) { if (!result || price === undefined) { return TradingSignal.UNKNOWN; } if (price > result.upper) { return TradingSignal.BULLISH; } if (price < result.lower) { return TradingSignal.BEARISH; } return TradingSignal.SIDEWAYS; } getSignal() { const previousState = this.calculateSignal(this.#twoPreviousResult, this.#previousPrice); const state = this.calculateSignal(this.#previousResult, this.#lastPrice); const hasChanged = previousState !== state; return { hasChanged, state, }; } } //# sourceMappingURL=BollingerBands.js.map