influxdb/influxql/query/internal/gota/rsi.go

49 lines
1.2 KiB
Go

package gota
// RSI - Relative Strength Index (http://stockcharts.com/school/doku.php?id=chart_school:technical_indicators:relative_strength_index_rsi)
type RSI struct {
emaUp EMA
emaDown EMA
lastV float64
}
// NewRSI constructs a new RSI.
func NewRSI(inTimePeriod int, warmType WarmupType) *RSI {
ema := NewEMA(inTimePeriod+1, warmType)
ema.alpha = float64(1) / float64(inTimePeriod)
return &RSI{
emaUp: *ema,
emaDown: *ema,
}
}
// WarmCount returns the number of samples that must be provided for the algorithm to be fully "warmed".
func (rsi RSI) WarmCount() int {
return rsi.emaUp.WarmCount()
}
// Warmed indicates whether the algorithm has enough data to generate accurate results.
func (rsi RSI) Warmed() bool {
return rsi.emaUp.Warmed()
}
// Last returns the last output value.
func (rsi RSI) Last() float64 {
return 100 - (100 / (1 + rsi.emaUp.Last()/rsi.emaDown.Last()))
}
// Add adds a new sample value to the algorithm and returns the computed value.
func (rsi *RSI) Add(v float64) float64 {
var up float64
var down float64
if v > rsi.lastV {
up = v - rsi.lastV
} else if v < rsi.lastV {
down = rsi.lastV - v
}
rsi.emaUp.Add(up)
rsi.emaDown.Add(down)
rsi.lastV = v
return rsi.Last()
}