我想在 hightchart 中实现移动平均线。highchart 中是否有任何选项。
喜欢:我有系列10, 20, 30, 40, 50, 60, 70
这里的移动平均线是2
。
然后第二个系列将产生系列的平均值1
比如:(15, 35, 105
取每两个数据点的平均值)
并将这个移动平均线系列嵌入series1
到同一张图表上。
我想在 hightchart 中实现移动平均线。highchart 中是否有任何选项。
喜欢:我有系列10, 20, 30, 40, 50, 60, 70
这里的移动平均线是2
。
然后第二个系列将产生系列的平均值1
比如:(15, 35, 105
取每两个数据点的平均值)
并将这个移动平均线系列嵌入series1
到同一张图表上。
您可以计算移动平均线并将其添加如下:
$('#buttonAddSeries').click(function() {
var series = chart.series[0];
var data = [];
var period = 2;
var sumForAverage = 0;
var i;
for(i=0;i<series.data.length;i++) {
sumForAverage += series.data[i].y;
if(i<period) {
data.push(null);
} else {
sumForAverage -= series.data[i-period].y;
data.push([series.data[i].x, sumForAverage/period]);
}
}
chart.addSeries({
name: 'Moving Average',
data: data
});
});
您可以使用任意数量的点作为周期,而不仅仅是 2。
现在有一个用于 Highcharts 的插件,您可以使用它添加 SMA(简单移动平均线)。
请参阅:http ://www.highcharts.com/plugin-registry/single/16/technical-indicators
不,目前 HighCharts 不做任何这样的数据分析。您需要生成自己的移动平均线并将其创建为自己的系列或 plotLine/plotBand。
使用此处的技术指标插件支持移动平均线
这是您需要包含的JavaScript 源代码的链接:
它是通过在类型的图表中添加另一个系列来实现的:“趋势线”,算法:“SMA”,它通过 id 引用相关数据系列:
series : [
{
name: 'AAPL Stock Price',
type : 'line',
id: 'primary',
data : [100,101,105,107,104,105,106,104,...]
}, {
name: '15-day SMA',
linkedTo: 'primary',
showInLegend: true,
type: 'trendline',
algorithm: 'SMA',
periods: 15
}]
这是一个JSFiddle。
如果你想要比 for 循环更有效的东西:
$('#buttonAddSeries').click(function() {
var series = chart.get('seriesId')
var yData = series.processedYData
var xData = series.processedXData
var data = [];
var period = 3;
/* sumForAverage initialised to sum of yData indexed between 0 and period */
var sumForAverage = yData.slice(0, period).reduce(function(prev, cur) {
return prev + cur;
});
/* Subset yData from period to end. */
yDataWindow = yData.slice(period, yData.length)
/* At each point add the new value and subtract yData[currentIndex]. */
yDataWindow.reduce(function(previousValue, currentValue, currentIndex) {
/* push each iteration to data */
data.push([xData[currentIndex + period], previousValue/period])
return previousValue + currentValue - yData[currentIndex]
/* sumForAverage is passed as starting value */
}, sumForAverage)
chart.addSeries({
name: 'Moving Average',
data: data
});
});