Javascript 如何通过迭代时间戳操作向API询问(过去14天的)许多值?
我想计算比特币价格的RSI(相对强度指数)(过去14天)。过去14天的必要数据来自API。结果应存储在变量中以供进一步处理。我尝试了不同的方法,但结果不起作用。我想我没有找到解决这个问题的正确方法。我无法创建一个完整的工作结果,所以我在这里要问关于堆栈溢出的第一个问题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
https://min-api.cryptocompare.com/data/pricehistorical?fsym=BTC&tsyms=USD&ts=1452680400
公共静态双计算器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);