53 lines
862 B
Go
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
|
|
}
|