UNPKG

@syncfusion/ej2-charts

Version:

Feature-rich chart control with built-in support for over 25 chart types, technical indictors, trendline, zooming, tooltip, selection, crosshair and trackball.

167 lines (166 loc) 7.78 kB
var __extends = (this && this.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; return extendStatics(d, b); }; return function (d, b) { extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); import { Series } from '../series/chart-series'; import { TechnicalAnalysis } from './indicator-base'; /** * The `BollingerBands` module is used to render the Bollinger Band indicator. */ var BollingerBands = /** @class */ (function (_super) { __extends(BollingerBands, _super); function BollingerBands() { return _super !== null && _super.apply(this, arguments) || this; } /** * Initializes the series collection for a technical indicator. * * @param {TechnicalIndicator} indicator - The technical indicator for which the series collection is initialized. * @param {Chart} chart - The chart associated with the technical indicator. * @returns {void} * @private */ BollingerBands.prototype.initSeriesCollection = function (indicator, chart) { indicator.targetSeries = []; var rangeArea = new Series(indicator, 'targetSeries', {}, true); rangeArea.type = 'RangeArea'; if (indicator.bandColor !== 'transparent' && indicator.bandColor !== 'none') { this.setSeriesProperties(rangeArea, indicator, 'BollingerBand', indicator.bandColor, 0, chart); } var signalLine = new Series(indicator, 'targetSeries', {}, true); this.setSeriesProperties(signalLine, indicator, 'BollingerBand', indicator.fill, indicator.width, chart); var upperLine = new Series(indicator, 'targetSeries', {}, true); this.setSeriesProperties(upperLine, indicator, 'UpperLine', indicator.upperLine.color, indicator.upperLine.width, chart); var lowerLine = new Series(indicator, 'targetSeries', {}, true); this.setSeriesProperties(lowerLine, indicator, 'LowerLine', indicator.lowerLine.color, indicator.lowerLine.width, chart); }; /** * Defines the predictions using Bollinger Band Approach * * @private * @param {TechnicalIndicator} indicator - The technical indicator for which the data source is to be initialized. * @returns {void} */ BollingerBands.prototype.initDataSource = function (indicator) { var enableBand = indicator.bandColor !== 'transparent' && indicator.bandColor !== 'none'; var start = enableBand ? 1 : 0; var signalCollection = []; var upperCollection = []; var lowerCollection = []; var bandCollection = []; var upperSeries = indicator.targetSeries[start + 1]; var lowerSeries = indicator.targetSeries[start + 2]; var signalSeries = indicator.targetSeries[start]; var rangeAreaSeries = enableBand ? indicator.targetSeries[0] : null; //prepare data var validData = indicator.points; if (validData.length && validData.length >= indicator.period) { var sum = 0; var deviationSum = 0; var multiplier = indicator.standardDeviation; var limit = validData.length; var length_1 = Math.round(indicator.period); var smaPoints = []; var deviations = []; var bollingerPoints = []; for (var i_1 = 0; i_1 < length_1; i_1++) { sum += Number(validData[i_1].close); } var sma = sum / indicator.period; for (var i_2 = 0; i_2 < limit; i_2++) { var y = Number(validData[i_2].close); if (i_2 >= length_1 - 1 && i_2 < limit) { if (i_2 - indicator.period >= 0) { var diff = y - Number(validData[i_2 - length_1].close); sum = sum + diff; sma = sum / (indicator.period); smaPoints[i_2] = sma; deviations[i_2] = Math.pow(y - sma, 2); deviationSum += deviations[i_2] - deviations[i_2 - length_1]; } else { smaPoints[i_2] = sma; deviations[i_2] = Math.pow(y - sma, 2); deviationSum += deviations[i_2]; } var range = Math.sqrt(deviationSum / (indicator.period)); var lowerBand = smaPoints[i_2] - (multiplier * range); var upperBand = smaPoints[i_2] + (multiplier * range); if (i_2 + 1 === length_1) { for (var j_1 = 0; j_1 < length_1 - 1; j_1++) { bollingerPoints[j_1] = { 'X': validData[j_1].x, 'mb': smaPoints[i_2], 'lb': lowerBand, 'ub': upperBand, visible: true }; } } bollingerPoints[i_2] = { 'X': validData[i_2].x, 'mb': smaPoints[i_2], 'lb': lowerBand, 'ub': upperBand, visible: true }; } else { if (i_2 < indicator.period - 1) { smaPoints[i_2] = sma; deviations[i_2] = Math.pow(y - sma, 2); deviationSum += deviations[i_2]; } } } var i = -1; var j = -1; for (var k = 0; k < limit; k++) { if (k >= (length_1 - 1)) { var ub = 'ub'; var lb = 'lb'; var mb = 'mb'; upperCollection.push(this.getDataPoint(validData[k].x, bollingerPoints[k][ub], validData[k], upperSeries, upperCollection.length)); lowerCollection.push(this.getDataPoint(validData[k].x, bollingerPoints[k][lb], validData[k], lowerSeries, lowerCollection.length)); signalCollection.push(this.getDataPoint(validData[k].x, bollingerPoints[k][mb], validData[k], signalSeries, signalCollection.length)); if (enableBand) { bandCollection.push(this.getRangePoint(validData[k].x, upperCollection[++i].y, lowerCollection[++j].y, validData[k], rangeAreaSeries, bandCollection.length)); } } } } if (enableBand) { this.setSeriesRange(bandCollection, indicator, indicator.targetSeries[0]); } this.setSeriesRange(signalCollection, indicator, indicator.targetSeries[start]); this.setSeriesRange(upperCollection, indicator, indicator.targetSeries[start + 1]); this.setSeriesRange(lowerCollection, indicator, indicator.targetSeries[start + 2]); }; /** * To destroy the Bollinger Band. * * @returns {void} * @private */ BollingerBands.prototype.destroy = function () { /** * Destroys the bollinger band. */ }; /** * Get module name. * * @returns {string} - Returns the module name. */ BollingerBands.prototype.getModuleName = function () { /** * Returns the module name of the series. */ return 'BollingerBandsIndicator'; }; return BollingerBands; }(TechnicalAnalysis)); export { BollingerBands };