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