2013-11-14 51 views
4

問題:如何計算移動平均線並將其繪製在JS/HTML5圖表上?移動平均線HTML5/JS圖表

我能找到的最接近的例子是this website。看看它的JS文件,我無法確定繪圖圖表庫。經仔細檢查,似乎移動平均值不是在服務器端而是在客戶端計算的。

任何建議表示讚賞!

enter image description here

+0

無法獲取該頁面以加載任何圖表。至少對於高位圖,您需要在場景後面自行計算,並在添加其他點時添加到圖表中。 – wergeld

+1

你是指計算運行的N點平均值?你爲什麼要尋找一個圖書館來做到這一點,應該是死的簡單的客戶端或服務器端,然後它只是另一個高圖形系列繪製。 – Mark

+0

@Nyxynyx您好,請檢查我的答案,謝謝 – thenewseattle

回答

14

這裏有一個quick example,其計算3點移動平均客戶端,並與Highcharts繪製它:

var N = 100; 
var someData = []; 
for (var i = 0; i < N; i++) 
{ 
    someData.push([i,Math.random() * 100]); 
} 

var moveMean = []; 
for (var i = 1; i < N-1; i++) 
{ 
    var mean = (someData[i][1] + someData[i-1][1] + someData[i+1][1])/3.0; 
    moveMean.push([i,mean]); 
} 

enter image description here

4

我下面寫了一個更通用的功能。

要使用它,只需傳遞一個數組值,移動平均數(或長度)和一個可選的限定符函數。

例如:

movingAvg(arr, 10)將陣列arr在返回的值的10個數據點的移動平均。

movingAvg(arr, 20, function(val){ return val != 0; })將陣列中返回非零值的20個數據點的移動平均arr

因此,與chart.js之,例如,可以使用它像這樣:

... 
,datasets: [ 
    { 
     label: "Values" 
     ,data: values 
    } 
    ,{ 
     type: "line" 
     ,label: "20 Point Moving Average" 
     ,data: movingAvg(values, 20, function(val){ return val != 0; }) 
    } 
] 
... 

功能:

/** 
    * returns an array with moving average of the input array 
    * @param array - the input array 
    * @param count - the number of elements to include in the moving average calculation 
    * @param qualifier - an optional function that will be called on each 
    * value to determine whether it should be used 
    */ 
    function movingAvg(array, count, qualifier){ 

     // calculate average for subarray 
     var avg = function(array, qualifier){ 

      var sum = 0, count = 0, val; 
      for (var i in array){ 
       val = array[i]; 
       if (!qualifier || qualifier(val)){ 
        sum += val; 
        count++; 
       } 
      } 

      return sum/count; 
     }; 

     var result = [], val; 

     // pad beginning of result with null values 
     for (var i=0; i < count-1; i++) 
      result.push(null); 

     // calculate average for each subarray and add to result 
     for (var i=0, len=array.length - count; i <= len; i++){ 

      val = avg(array.slice(i, i + count), qualifier); 
      if (isNaN(val)) 
       result.push(null); 
      else 
       result.push(val); 
     } 

     return result; 
    } 
0

我遇到了同樣的問題。 這裏是我的例子供您參考。 您可以根據需要設置任意長度的採樣點。

var getAverage = function(arr, n){ 
 
    var sum=0; 
 
    if(n>arr.length){ 
 
    n = arr.length; 
 
    } 
 
    
 
    for(var ii=arr.length-n; ii<arr.length; ii++){ 
 
    sum += arr[ii]; 
 
    } 
 
    return sum/n; 
 
} 
 

 

 
function(acceleration, 3);

0

的代碼不是我的,但它非常適用於金融計算移動平均。

var movingAverage = function(d, t, roundUp) { 
    if (d.length >= t && d.constructor === Array) { 
     var r = [], s = 0, f = this.decimalRoundingFactor, ma; 

     roundUp = typeof roundUp === undefined? true : roundUp; 

     for(var i=0;i<d.length;++i) { 
      s += isNaN(d[i])? 0: d[i]; 
      if (i < t-1) { 
       r.push(NaN); 
      } else if (i+1 === t) { 
       ma = roundUp? Math.round((s/t)*f)/f: s/t; 
       r.push(ma); 
      } else { 
       s -= isNaN(d[i-t])? 0: d[i-t]; 
       ma = roundUp? Math.round((s/t)*f)/f: s/t; 
       r.push(ma); 
      } 
     } 

     return r; 
    } else { 
     throw "[ERROR] TechnicalAnalysis#movingAverage: Not enought data! OR data is not Array!"; 
    } 
};