【问题标题】:Converting ALMA algorithm to javascript将 ALMA 算法转换为 javascript
【发布时间】:2019-07-30 12:47:35
【问题描述】:

我正在尝试创建一个连接到 Binance API 并相应地计算各种指标和交易的交易工具。我正在使用 TradingView 提供的 ALMA 和 EMA 指标。我的 ALMA 的设置是 (30, 0.85, 6),周期为 1h。

在 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);
}

'series' 是一个数组,其中包含 1 小时内的 30 个最新烛台。 我的问题是计算的值与 ALMA 的交易视图图中显示的值不完全相同。 例如,我计算的 BTCUSDT 的 ALMA 是 9534.99,而图表上的 ALMA 是 9486.99。 图表和我从币安收到的数据中的接近值是相同的,所以我怀疑我从 pine-script 到 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 },
...
]

【问题讨论】:

  • 介意提供“系列”对象结构的完整示例吗?
  • 我用“系列”的内容编辑了问题
  • 我可以看到 1 个奇怪的差异 - 在原始版本中,您在 series[windowsize - i - 1] 旁边缺少 .close 但不知道它可以做什么。
  • xd,您是为整个对象提供 30 个项目,还是仅使用您提供的项目运行原始脚本,看看它是否会产生不同的值。如果太长,请使用其他网站共享 JSON,例如 justpaste.it
  • Tom,在原始脚本中,系列只是关闭值的数组。我的系列是一系列烛台对象。因此我的数组中需要 .close :-)

标签: javascript node.js algorithmic-trading pine-script cryptocurrency


【解决方案1】:

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

换句话说,当调用函数时,将series参数的数组反转:

calculateALMA(series.reverse(), windowsize, offset, sigma)

【讨论】:

  • 因为series.reverse() 也会改变series 数组,一个非破坏性的反转它的方法是改写[...series].reverse()
猜你喜欢
  • 2021-08-07
  • 2013-08-06
  • 2020-04-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-23
  • 2019-01-10
  • 1970-01-01
  • 2013-12-21
相关资源
最近更新 更多