我正在尝试创建一个连接到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 },
...
]

最佳答案

好的,我发现了问题...
我的翻译工作正常。问题是我需要反转阵列,所以最新的数据是第一位的。

07-24 18:14