2016-10-15 216 views
1

嗨有可能在javascript中計算EMA嗎?使用javascript計算指數移動平均線(EMA)

對於EMA,我試圖應用的公式是本

EMA =陣列[I] * K + EMA(上)*(1 - K)

其中K是平滑因子:

K = 2 /(N + 1)

,N是那我要考慮

所以,如果我有像這樣的數值數組值範圍,而這個值時期成長:

var data = [15,18,12,14,16,11,6,18,15,16]; 

的目標是有一個函數,返回數組的EMA,因爲任何這個值,期望非常拳頭的「範圍」值,有這個EMA,對於每個數據項,我都有相關的EMA值。這樣我就可以全部使用或者只使用最後一個來「預測」下一個。

function EMACalc(Array,Range) { 
var k = 2/(Range + 1); 
... 
} 

我無法弄清楚如何做到這一點,任何幫助將apreciated

+0

你不應該使用'Array'和'Range'爲參數的名稱,因爲要覆蓋本地JS對象 –

+0

問題:通過'EMA =數組[我] * K + EMA(previous)*(1-K)'你的意思是EMA [i] = array [i] * K + EMA [i-1] *(1-K)'? –

+0

Ok @ DanielG.Reina,明白了,是的,EMA [i]聽起來更好。因爲要計算出i項目的EMA,您應該知道i-1項目的EMA!對於第一個元素可以使用它的相同元素的值 –

回答

3

我不知道我是否完全瞭解你需要什麼,但我會給你一個函數的代碼返回一個數組,其EMA爲每個索引> 0計算(第一個索引沒有任何先前計算的EMA,並且將返回輸入的第一個值)。

function EMACalc(mArray,mRange) { 
    var k = 2/(mRange + 1); 
    // first item is just the same as the first item in the input 
    emaArray = [mArray[0]]; 
    // for the rest of the items, they are computed with the previous one 
    for (var i = 1; i < mArray.length; i++) { 
    emaArray.push(mArray[i] * k + emaArray[i - 1] * (1 - k)); 
    } 
    return emaArray; 
} 

這應該這樣做。

+0

Tnx @Daniel,我試着用這篇文章中的值https://docs.oracle.com/cd/E12032_01/doc/epm.921/html_ir_studio /frameset.htm?/cd/E12032_01/doc/epm.921/html_ir_studio/ir_studio-15-74.html,但給NaN除了第一項。 –

+0

Ops,抱歉找到了錯誤,你的函數說mRange,但是k有範圍:D –

+0

當計算'k'時,我忘了將'Range'改成'mRange'。讓我知道是否還有其他問題。如果您將信息複製爲文本,請記住在調用函數之前將值解析爲數字(整數或浮點數),因爲它需要一組數字 –

3

以下可以是實現EMA的另一種方式。

var getEMA = (a,r) => a.reduce((p,n,i) => i ? p.concat(2*n/(r+1) + p[p.length-1]*(r-1)/(r+1)) : p, [a[0]]), 
 
     data = [15,18,12,14,16,11,6,18,15,16], 
 
    range = 3; 
 

 
console.log(getEMA(data,range));

+1

警告:我認爲這裏有一個微妙的錯誤,產生錯誤的結果。 lambda映射中[i-1]的值不是先前計算的ema,而是之前的_input_值。該數組不會被映射操作符變異。錯誤可以清楚地在以下codepen中找到:http:// codepen。io/corolla/pen/QpwRmz 我相信@dgrcode的答案是正確的。 – corolla

+0

@corolla是的,你是對的。我已經相應地更正了我的代碼。感謝您的高舉。 – Redu