使用javascript计算指数移动平均线(EMA)

时间:2016-10-15 08:52:51

标签: javascript arrays moving-average

您好可以在javascript中计算EMA吗?

我正在尝试应用的EMA公式是

  

EMA = array [i] * K + EMA(previous)*(1-K)

其中K是平滑因子:

  

K = 2 /(N + 1)

N是我想要考虑的价值范围

所以,如果我有一个这样的值数组,并且这个值会在这段时间内增长:

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

目标是有一个函数,返回EMA的数组,因为任何这个值,期望非常拳头“Range”值,有这个EMA,对于数据上的每个项目,我都是相关的EMA值。通过这种方式,我可以使用全部或仅使用最后一个来“预测”下一个。

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

我无法弄清楚如何实现这一点,任何帮助都会被贬低

3 个答案:

答案 0 :(得分:5)

我不知道我是否完全理解你需要什么,但我会给你一个函数的代码,该函数返回一个数组,其中包含为每个索引计算的EMA> 0(第一个索引没有计算任何先前的EMA,并将返回输入的第一个值)。

app.after_request

这应该这样做。

答案 1 :(得分: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));

答案 2 :(得分:0)

我喜欢递归,因此这是使用它的EMA函数的示例。无需维护数组。

function weightMultiplier(N) { return 2 / (N + 1) }

function ema(tIndex, N, array) {
    if (!array[tIndex-1] || (tIndex) - (N) < 0) return undefined;
    const k = weightMultiplier(N);
    const price = array[tIndex];
    const yEMA = ema(tIndex-1, N, array) || array[tIndex-1]
    return (price - yEMA) * k + yEMA
}