Javascript 如何通过迭代时间戳操作向API询问(过去14天的)许多值?

Javascript 如何通过迭代时间戳操作向API询问(过去14天的)许多值?,javascript,jquery,arrays,algorithm,api,Javascript,Jquery,Arrays,Algorithm,Api,我想计算比特币价格的RSI(相对强度指数)(过去14天)。过去14天的必要数据来自API。结果应存储在变量中以供进一步处理。我尝试了不同的方法,但结果不起作用。我想我没有找到解决这个问题的正确方法。我无法创建一个完整的工作结果,所以我在这里要问关于堆栈溢出的第一个问题 如何通过via查询过去14天的API课程 迭代时间戳操作 时间戳现在为-1天/-2天。。。。(&ts=XXXXXXXXXX)-示例:(ts=1452680400) https://min-api.cryptocompare.com

我想计算比特币价格的RSI(相对强度指数)(过去14天)。过去14天的必要数据来自API。结果应存储在变量中以供进一步处理。我尝试了不同的方法,但结果不起作用。我想我没有找到解决这个问题的正确方法。我无法创建一个完整的工作结果,所以我在这里要问关于堆栈溢出的第一个问题

  • 如何通过via查询过去14天的API课程 迭代时间戳操作
  • 时间戳现在为-1天/-2天。。。。(&ts=XXXXXXXXXX)-示例:(ts=1452680400)

    https://min-api.cryptocompare.com/data/pricehistorical?fsym=BTC&tsyms=USD&ts=1452680400

  • 如何将API中的值放入数组中
  • 然后我想把数组放在这个计算公式中:
  • 公共静态双计算器i(IEnumerable closePrices)
    {
    var prices=收盘价为双倍[]??收盘价.ToArray();
    双增益=0;
    双累积损失=0;
    对于(int i=1;i=0)
    {
    增益+=差值;
    }
    其他的
    {
    sumLoss-=差异;
    }
    }
    如果(sumGain==0)返回0;
    if(数学绝对值(sumLoss)<公差)返回100;
    var relativeStrength=累计收益/累计损失;
    返回100.0-(100.0/(1+相对长度));
    }
    
    几个相当广泛的问题(如果您发布一些您已经尝试过自己编写的代码,通常效果会更好)。。。但有趣的问题需要解决

    假设我们可以使用es6语法、Promissions和fetch(如果不能,请查看如何进行polyfill和Transfile)

    创建时间戳数组 要获取当前日期的时间戳,请编写
    date.now()
    。要将此时间戳更改为几天前的一天,我们将其减少一天中的毫秒数:

    const timeStampForDaysAgo = 
      nrOfDays => Date.now() - 1000 * 60 * 60 * 24 * nrOfDays;
    
    // e.g.: yesterday
    const yesterday = timeStampForDaysAgo(1);
    
    现在,如果我们填充一个整数数组
    0…14
    ,我们可以使用
    map
    创建一个时间戳数组

    const lastTwoWeeks = Array.from(Array(14), (_, i) => timeStampForDaysAgo(i))
    
    处理请求 在现代浏览器中,您可以使用
    fetch
    执行请求。我们需要一个URL列表,而不仅仅是时间戳。为了创建URL,我们再次使用
    map

    const urls = lastTwoWeeks.map(ts => `https://your-url.com?ts=${ts}`);
    
    const btcRequests = urls.map(url => fetch(url).then(r => r.json()));
    
    现在我们有了URL,我们可以创建请求(同样,使用
    map
    ):

    计算结果 在所有请求完成之前,我们无法开始计算结果。这就是
    承诺的地方。所有
    都包括:

    Promise.all(btcRequests).then(calcRSI);
    
    这确保我们只调用
    calcRSI
    ,直到所有请求完成

    因为API返回
    {BTC:{USD:Number}}
    的对象,所以我们必须先提取这些数字,然后才能进行计算

    Promise
      .all(btcRequests)
      .then(responses => responses.map(obj => obj.BTC.USD))
    
    现在我们有了一个数字数组,我们终于可以调用你在C代码中给出的计算函数了。当然,您必须首先将其转换为javascript

    const calcRSI = (arrayOfValues) => /* do math, return value */
    
    Promise
      .all(btcRequests)
      .then(responses => responses.map(obj => obj.BTC.USD))
      .then(calcRSI)
      .then(rsi => console.log("The RSI for the last 14 days, is:", rsi);
    

    请参阅此步骤中的代码(确保打开控制台)

    步骤1您可能需要进行14次查询,每天一次。并相应地更改时间戳。您可以使用JS日期功能获取时间戳。步骤2:我们不知道从API返回的数据是什么样子,以便知道如何转换它,如果它返回为JSON,可能它甚至已经在一个数组中。第3步中的代码看起来像C#,而不是JavaScript。因此,您可能需要通过ajax或postback将数据发送到服务器。哇!非常感谢!我试图完全理解这一点,但我不熟悉Lambda函数。结果看起来不错,但在重新加载页面时会切换。有没有办法在“小时”内将其降低到准确度?我真的被这个解决方案迷住了:)要使时间戳回到
    x
    hours,您可以从
    timestaffordaysago
    函数中删除
    24
    。但请确保不要同时执行太多API请求。。。服务中可能有一个端点同时为您提供多个数据点?是的,我认为最好将此API请求与(接近价格)一起使用:但是脚本需要更改一点,实际上我正在尝试这一点-但这确实是一个困难的挑战。当然!好发现!
    Promise
      .all(btcRequests)
      .then(responses => responses.map(obj => obj.BTC.USD))
    
    const calcRSI = (arrayOfValues) => /* do math, return value */
    
    Promise
      .all(btcRequests)
      .then(responses => responses.map(obj => obj.BTC.USD))
      .then(calcRSI)
      .then(rsi => console.log("The RSI for the last 14 days, is:", rsi);