基于Kraken OHLC计算RSI,需匹配cryptowatch.de的LTC-EUR数值
实现和cryptowatch.de匹配的LTC-EUR RSI计算(基于Kraken OHLC数据)
要完全匹配cryptowatch.de上的RSI数值,核心是严格遵循stockcharts.com的标准RSI算法,同时注意几个容易踩坑的细节。我帮你完善了代码,并且标注了关键要点:
// 核心说明:输入data必须是按**时间升序**排列的收盘价数组(最早的价格在索引0,最新的在最后) // 如果你的原始Kraken数据是降序(最新价格在前),请先执行 data = data.reverse() 转换 function calculateRSI(data, period = 14) { // 确保数据是从旧到新的顺序 const sortedData = [...data]; // 如果原始是降序,改成 [...data].reverse() // 第一步:计算每个周期的价格变化(当前收盘价 - 前一天收盘价) const priceChanges = []; for (let i = 1; i < sortedData.length; i++) { priceChanges.push(sortedData[i] - sortedData[i - 1]); } // 初始化前14周期的平均涨幅/跌幅(简单算术平均) let avgGain = 0; let avgLoss = 0; for (let i = 0; i < period; i++) { const change = priceChanges[i]; if (change > 0) { avgGain += change; } else { avgLoss += Math.abs(change); } } avgGain /= period; avgLoss /= period; // 计算RSI数组 const rsiResults = []; // 第一个RSI值对应第15个价格数据(前14个周期变化计算而来) let rs = avgGain / (avgLoss || 0.00001); // 防止除以0的边界情况 rsiResults.push(100 - (100 / (1 + rs))); // 后续周期用平滑平均(EMA方式)计算 for (let i = period; i < priceChanges.length; i++) { const currentChange = priceChanges[i]; const currentGain = currentChange > 0 ? currentChange : 0; const currentLoss = currentChange < 0 ? Math.abs(currentChange) : 0; // 平滑公式:前平均*(period-1)/period + 当前变化/period avgGain = (avgGain * (period - 1) + currentGain) / period; avgLoss = (avgLoss * (period - 1) + currentLoss) / period; rs = avgGain / (avgLoss || 0.00001); rsiResults.push(100 - (100 / (1 + rs))); } // 返回的rsiResults长度为:原始数据长度 - period // 最后一个元素就是最新的RSI值,和cryptowatch显示的数值一致 return rsiResults; }
关键细节(决定是否匹配的核心):
- 必须用收盘价:你原始代码里用的是开盘价数组,这是最容易导致数值不匹配的错误!cryptowatch和stockcharts的RSI都是基于收盘价计算的,一定要提取Kraken OHLC数据里的
close字段,而不是open。 - 数据顺序不能错:输入的价格数组必须是从旧到新的升序排列。如果Kraken返回的OHLC数据是按时间降序(最新在前),一定要先反转数组。
- 平滑平均逻辑:前14个周期用简单算术平均,之后的周期必须用EMA式的平滑计算(而不是重新计算简单平均),这是stockcharts的标准算法,cryptowatch完全遵循这个规则。
- 避免除以0:当连续上涨导致平均跌幅为0时,RS会趋近于无穷大,此时RSI=100,代码里用极小值
0.00001代替0,避免计算报错。
验证匹配的步骤:
- 从Kraken获取和cryptowatch相同时间周期的LTC-EUR OHLC数据(比如1小时线)
- 提取所有收盘价,按时间升序排列
- 调用上述函数,取返回数组的最后一个值,和cryptowatch显示的RSI对比,误差会在小数点后两位以内(平台可能有四舍五入处理)
内容的提问来源于stack exchange,提问作者Simon
相关产品推荐
相关产品推荐

