我正在尝试从交易视图“克隆”技术指标 ta.RMA。
但是经过一段时间的尝试,我还没有成功将其转换为工作代码。
这是 pine 语言中的等效内容:
alpha = 1/length
sum = 0.0
sum := na(sum[1]) ? ta.sma(src, length) : alpha * src + (1 - alpha) * nz(sum[1])
这是迄今为止我的打字稿代码:
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) {
// Missing
}
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
]
这是我的解决方案
function averageTrueRange(candles: Candle[], length: number) {
if (candles.length < length) return null
const lows = candles.map((candle) => +candle.low)
const highs = candles.map((candle) => +candle.high)
const closes = candles.map((candle) => +candle.close)
const TRResults: number[] = []
for (let x = 1; x < candles.length; x++) TRResults.push(Math.max(highs[x] - lows[x], Math.abs(highs[x] - closes[x - 1]), Math.abs(lows[x] - closes[x - 1])))
const RMAResults = [TRResults[0]]
const alpha = 1 / length
for (let x = 1; x < TRResults.length; x++) RMAResults.push((alpha * TRResults[x]) + ((1 - alpha) * RMAResults[RMAResults.length - 1]))
return RMAResults[RMAResults.length - 1]
}