UNPKG

highstock-release

Version:

Official shim repo for Highstock releases.

143 lines (127 loc) 4.83 kB
/** * @license Highcharts JS v6.0.1 (2017-10-05) * * Indicator series type for Highstock * * (c) 2010-2017 Sebastian Bochan * * License: www.highcharts.com/license */ 'use strict'; (function(factory) { if (typeof module === 'object' && module.exports) { module.exports = factory; } else { factory(Highcharts); } }(function(Highcharts) { (function(H) { var seriesType = H.seriesType; // Utils: function populateAverage(xVal, yVal, yValVolume, i) { var high = yVal[i][1], low = yVal[i][2], close = yVal[i][3], volume = yValVolume[i], adY = close === high && close === low || high === low ? 0 : ((2 * close - low - high) / (high - low)) * volume, adX = xVal[i]; return [adX, adY]; } /** * The AD series type. * * @constructor seriesTypes.ad * @augments seriesTypes.sma */ seriesType('ad', 'sma', /** * Accumulation Distribution (AD). This series requires `linkedTo` option to be set. * * @extends {plotOptions.sma} * @product highstock * @sample {highstock} stock/indicators/accumulation-distribution Exponential moving average indicator * @since 6.0.0 * @optionparent plotOptions.ad */ { name: 'Accumulation/Distribution', params: { /** * The id of volume series which is mandatory. * For example using OHLC data, volumeSeriesID='volume' means the indicator will be calculated using OHLC and volume values. * * @type {Number} * @since 6.0.0 * @product highstock */ volumeSeriesID: 'volume' } }, { getValues: function(series, params) { var period = params.period, xVal = series.xData, yVal = series.yData, volumeSeriesID = params.volumeSeriesID, volumeSeries = series.chart.get(volumeSeriesID), yValVolume = volumeSeries && volumeSeries.yData, yValLen = yVal ? yVal.length : 0, AD = [], xData = [], yData = [], len, i, ADPoint; if (xVal.length <= period && yValLen && yVal[0].length !== 4) { return false; } if (!volumeSeries) { return H.error( 'Series ' + volumeSeriesID + ' not found! Check `volumeSeriesID`.', true ); } // i = period <-- skip first N-points // Calculate value one-by-one for each period in visible data for (i = period; i < yValLen; i++) { len = AD.length; ADPoint = populateAverage(xVal, yVal, yValVolume, i, period); if (len > 0) { ADPoint[1] += AD[len - 1][1]; ADPoint[1] = ADPoint[1]; } AD.push(ADPoint); xData.push(ADPoint[0]); yData.push(ADPoint[1]); } return { values: AD, xData: xData, yData: yData }; } }); /** * A `AD` series. If the [type](#series.ad.type) option is not * specified, it is inherited from [chart.type](#chart.type). * * For options that apply to multiple series, it is recommended to add * them to the [plotOptions.series](#plotOptions.series) options structure. * To apply to all series of this specific type, apply it to * [plotOptions.ad](#plotOptions.ad). * * @type {Object} * @since 6.0.0 * @extends series,plotOptions.ad * @excluding data,dataParser,dataURL * @product highstock * @apioption series.ad */ /** * @type {Array<Object|Array>} * @since 6.0.0 * @extends series.sma.data * @product highstock * @apioption series.ad.data */ }(Highcharts)); }));