使用 javascript 计算指数移动平均线 (EMA)
Calculating Exponential Moving Average (EMA) using javascript
您好 可以在 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];
目标是有一个函数,即 return EMA 的数组,因为任何这个值,期望第一个 "Range" 值,有这个 EMA,对于每个项目数据,我有相关的 EMA 值。这样我就可以使用全部或仅使用最后一个到 "predict" 下一个。
function EMACalc(Array,Range) {
var k = 2/(Range + 1);
...
}
我不知道如何实现这一点,任何帮助将不胜感激
我不知道我是否完全理解您的需求,但我会给您一个函数的代码,该函数 return 是一个数组,其中为每个 > 0 的索引(第一个索引)计算了 EMA没有计算任何先前的 EMA,并将 return 输入的第一个值)。
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;
}
这应该可以做到。
下面可以是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));
我喜欢递归,所以这里有一个使用递归的 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
}
您好 可以在 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];
目标是有一个函数,即 return EMA 的数组,因为任何这个值,期望第一个 "Range" 值,有这个 EMA,对于每个项目数据,我有相关的 EMA 值。这样我就可以使用全部或仅使用最后一个到 "predict" 下一个。
function EMACalc(Array,Range) {
var k = 2/(Range + 1);
...
}
我不知道如何实现这一点,任何帮助将不胜感激
我不知道我是否完全理解您的需求,但我会给您一个函数的代码,该函数 return 是一个数组,其中为每个 > 0 的索引(第一个索引)计算了 EMA没有计算任何先前的 EMA,并将 return 输入的第一个值)。
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;
}
这应该可以做到。
下面可以是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));
我喜欢递归,所以这里有一个使用递归的 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
}