我正在尝试创建一个连接到Binance API的交易工具,并计算各种指标并进行相应的交易。我正在使用TradingView提供的ALMA和EMA指标。我的ALMA的设置为(30,0.85,6),时间为1小时。
在TradingView的文档中,我找到了用于ALMA计算的算法,其算法如下:
pine_alma(series, windowsize, offset, sigma) =>
m = floor(offset * (windowsize - 1))
s = windowsize / sigma
norm = 0.0
sum = 0.0
for i = 0 to windowsize - 1
weight = exp(-1 * pow(i - m, 2) / (2 * pow(s, 2)))
norm := norm + weight
sum := sum + series[windowsize - i - 1] * weight
sum / norm
我的工具是用JavaScript编写的,因此我将其翻译为以下内容:
function calculateALMA(series, windowsize, offset, sigma) {
let m = Math.floor(offset * (windowsize - 1));
let s = windowsize / sigma;
let weight = 0.0;
let norm = 0.0;
let sum = 0.0;
for (let i = 0; i < windowsize; i++) {
console.log(i);
weight = Math.exp(-1 * Math.pow(i - m, 2) / (2 * Math.pow(s, 2)));
norm = norm + weight;
sum = sum + (series[windowsize - i - 1].close * weight);
}
return (sum / norm);
}
“系列”是一个数组,其中包含1小时内最新的30个烛台。
我的问题是,计算出的值与ALMA的transactionview图中显示的值不完全相同。
例如,我为BTCUSDT计算的ALMA为9534.99,而图形上的ALMA为9486.99。
图中的接近值与我从币安获得的数据中的值相同,因此我怀疑从pine脚本到javascript的翻译有误。
有什么想法我做错了吗?
编辑:“系列”的内容是这样的(有30个项目)
[ { openTime: 1564387200000,
open: 9624.79,
high: 9650,
low: 9525.01,
close: 9573.26,
volume: 1155.847601,
closeTime: 1564390799999 },
{ openTime: 1564390800000,
open: 9573.64,
high: 9584.98,
low: 9395,
close: 9494.08,
volume: 2105.111588,
closeTime: 1564394399999 },
{ openTime: 1564394400000,
open: 9495.51,
high: 9544,
low: 9456.14,
close: 9511.69,
volume: 1056.144078,
closeTime: 1564397999999 },
...
]
最佳答案
好的,我发现了问题...
我的翻译工作正常。问题是我需要反转阵列,所以最新的数据是第一位的。