package indicator import "sig-pub/pkg/types/series" // ATR = SMA(TR, N) // 平均真实波幅 (ATR) atr define: https://www.investopedia.com/terms/a/atr.asp type ATR struct { } // indicator interface func (c *ATR) Name() string { return "atr" } func (c *ATR) RequiredSeries(window int16) int16 { return window + 1 } // Calculate 计算单根k线rsi指标 func (c *ATR) Calculate(ctx IIndicatorContext, window int16) (vector float64) { klineSeries := ctx.Series(0, int16(window)+1) highs := klineSeries.High() lows := klineSeries.Low() closes := klineSeries.Close() trs := make([]float64, 0, window) for i := range window { high := highs[i] low := lows[i] close1 := closes[i+1] // 计算TR tr := max(high-low, high-close1, low-close1) trs = append(trs, tr) } // 计算TR平均值得到ATR seriesTR := series.NewFloats(trs...) atr := seriesTR.Avg() return atr }