我正在制作一个使用metaapi.cloud的交易机器人,我正在尝试计算移动平均值(快速/指数),但它返回我无效的值,这是我的代码:
async movingAverage(symbol, period, type = "S") {
let candles = (await this.account.getHistoricalCandles(symbol, this.params.timeframe, null, period)).map(c => c.close);
const result = [];
let sum = 0;
if (type === "S") {
for (let i = 0; i < period; i++) {
sum += candles[i];
}
result.push(sum / period);
for (let i = period; i < candles.length; i++) {
sum = sum - candles[i - period] + candles[i];
result.push(sum / period)
}
} else if (type === "E") {
const weight = 2 / (period + 1);
for (let i = 0; i < period; i++) {
sum += candles[i];
}
sum /= period;
result.push(sum);
for (let i = period; i < candles.length; i++) {
sum = (candles[i] * weight) + (sum * (1 - weight));
result.push(sum);
}
} else {
// throw Error()
}
return result;
}
这是我的使用方法:
async onTick(infos) {
let sma = await this.movingAverage(infos.symbol, this.params.fast, "S");
console.log('SMA ' + sma[0]);
}
现在当我测试它时,SMA 应该返回“1906.6963”,但它给了我“1900.7813” 也许我使用了错误的方法来计算它们? 如果有人有解决办法!预先感谢。
在下面的示例中,将 period 设置为 1 以查看处理的所有值,将 period 设置为非常大的数字以查看整个平均值。
一定还有其他我没有想到的边缘情况。为简洁起见,下面的示例使用 SMA。
async function movingAverage(symbol, period, type = "S") {
let candles = [1,2,3,"","",4, "0",0, null, "99,9123", undefined,"0.123e5", "wrongval", 9, 10, 20, 100]
.map(d => parseFloat((d ?? "").toString().replace(",",".")))
.filter(d => +d || +d === 0);
const result = [];
if (candles.length <= 0){return result}
let sum = 0;
period = Math.min(candles.length, period) || 1;
for (let i = 0; i < period; i++) {
sum += candles[i];
}
result.push(sum / period);
for (let i = period; i < candles.length; i++) {
sum = sum - candles[i - period] + candles[i];
result.push(sum / period)
}
return result;
}
movingAverage("SPX",500).then(x => document.getElementById("result").textContent = x)
<div id="result"></div>
您的移动平均线计算对我来说看起来是正确的,至少对于简单移动平均线 (SMA) 来说是这样。对于指数移动平均线 (EMA),该公式似乎也是正确的,它对最近的价格施加更大的权重,这就是为什么它对最近的价格变化反应更显着。
数值差异的可能原因如下:
您的测试值的来源:确保您要比较的 SMA 值(即“1906.6963”)是使用相同的时间范围、周期和价格(在本例中为收盘价)计算的。另外,检查它是 SMA 还是 EMA,因为这两种方法会产生不同的结果。
蜡烛数据:检查您用于计算移动平均线的历史数据的质量。是否有任何缺失或不正确的值?
数据顺序:移动平均线的计算取决于数据的顺序。最新数据应该位于数组的末尾(即,candles[candles.length - 1] 是最新价格)。
你可以尝试打印出
candles
数组来看看数据是否符合你的预期。如果上述几点正确,您的移动平均线计算应该按预期工作。
最后一个注意事项是确保您的
period
变量确实是您想要用于计算的周期数,并且您有足够的数据点。如果数据点少于period
,计算将不准确。