如何在JavaScript/TypeScript中复现TradingView的RMA指标
实现TradingView的ta.RMA指标(TypeScript版)
先明确TradingView中ta.RMA的核心逻辑(对应你提供的Pine代码):
- 平滑系数
alpha = 1 / length - 第一个RMA值用对应周期的简单移动平均(SMA)初始化
- 后续每个RMA值遵循公式:
alpha * 当前数据 + (1 - alpha) * 上一个RMA值
以下是补全后的relativeMovingAverage函数,同时兼容边界情况处理:
function simpleMovingAverage(data: number[], period: number) { if (data.length < period) return null let sum = 0 for (let i = 0; i < period; i++) { sum += data[i] } const smaValues = [sum / period]; for (let i = period; i < data.length; i++) { sum = sum - data[i - period] + data[i]; smaValues.push(sum / period); } return smaValues } function relativeMovingAverage(data: number[], period: number) { // 边界处理:数据长度不足周期时返回null if (data.length < period) return null const alpha = 1 / period const rmaValues: number[] = [] // 第一步:用对应周期的SMA作为第一个RMA值 const sma = simpleMovingAverage(data, period) if (!sma) return null rmaValues.push(sma[0]) // 从第period个数据开始计算后续RMA值 for (let i = period; i < data.length; i++) { const prevRma = rmaValues[rmaValues.length - 1] const currentRma = alpha * data[i] + (1 - alpha) * prevRma rmaValues.push(currentRma) } return rmaValues } // 测试数据 const t = [ 39.69999999999709, 77.19999999999709, 69.79999999998836, 48.90000000000873, 28.40000000000873, 25.19999999999709, 16.5, 10, 59.89999999999418, 52.90000000000873, 22.80000000000291, 97.5, 103.39999999999418, 63.5, 79.69999999999709, 97.60000000000582, 57.29999999998836, 23.69999999999709, 89.79999999998836, 33.60000000000582 ] // 示例调用(比如周期设为10) const rmaResult = relativeMovingAverage(t, 10) console.log(rmaResult)
关键说明
- 函数首先检查数据长度是否满足周期要求,避免越界错误
- 复用已实现的
simpleMovingAverage生成初始值,和Pine代码逻辑完全对齐 - 后续迭代严格遵循RMA的递推公式,确保和TradingView的ta.RMA计算结果一致
内容的提问来源于stack exchange,提问作者PowerKuu
相关产品推荐
相关产品推荐

