49 lines
1.2 KiB
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()
|
|
}
|