highcharts 如何在highchart中实现移动平均

pqwbnv8z  于 2022-11-11  发布在  Highcharts
关注(0)|答案(5)|浏览(275)

我想在hightchart中实现移动平均线。highchart中有没有这个选项。
喜欢:我有系列10, 20, 30, 40, 50, 60, 70
并且这里移动平均值将是2
然后,第二个系列将生成系列1的平均值
如:15, 35, 105(取每两个数据点的平均值)
并将series1的移动平均线序列嵌入到同一个图表中。

4smxwvx5

4smxwvx51#

你可以计算移动平均值,然后像这样相加:

$('#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。

qzwqbdag

qzwqbdag2#

不,目前HighCharts不做任何类似的数据分析。您需要生成自己的移动平均线,并将其创建为自己的系列或plotLine/plotBand。

qrjkbowd

qrjkbowd3#

这些天有一个插件的Highcharts与您可以添加一个SMA(简单移动平均线).
请参阅:http://www.highcharts.com/plugin-registry/single/16/technical-indicators

vatpfxk5

vatpfxk54#

使用技术指标插件here支持移动平均线
以下是您需要包含的JavaScript source的链接:
它是通过将另一个系列添加到以下类型的图表中来实现的:'趋势线',算法:“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

yzuktlbb

yzuktlbb5#

如果你想要比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
    });
});

示例:JS Fiddle with data

相关问题