indicator/rsi.go
2024-06-25 23:17:36 +08:00

53 lines
862 B
Go

package indicator
type RSI struct {
winLen int
avgU *SMMA
avgD *SMMA
u float64
d float64
lastClose *float64
rs float64
result float64
}
func NewRSI(winLen int) *RSI {
r := new(RSI)
r.winLen = winLen
r.avgU = NewSMMA(r.winLen)
r.avgD = NewSMMA(r.winLen)
return r
}
func (r *RSI) Update(price float64) {
if r.lastClose == nil {
r.lastClose = &price
return
}
if price > *r.lastClose {
r.u = price - *r.lastClose
r.d = 0
} else {
r.u = 0
r.d = *r.lastClose - price
}
r.avgU.Update(r.u)
r.avgD.Update(r.d)
uResult := r.avgU.Result()
dResult := r.avgD.Result()
r.rs = uResult / dResult
r.result = 100 - (100 / (1 + r.rs))
if dResult == 0 {
if uResult != 0 {
r.result = 100
} else {
r.result = 0
}
}
r.lastClose = &price
}
func (r *RSI) Result() float64 {
return r.result
}