added
This commit is contained in:
@@ -0,0 +1,43 @@
|
||||
package indicators
|
||||
|
||||
// RSI calcule le Relative Strength Index (Wilder's smoothing, période 14).
|
||||
// Retourne NaN si pas assez de données.
|
||||
func RSI(closes []float64, period int) float64 {
|
||||
if period <= 0 {
|
||||
period = 14
|
||||
}
|
||||
if len(closes) < period+1 {
|
||||
return -1
|
||||
}
|
||||
|
||||
var gains, losses float64
|
||||
for i := 1; i <= period; i++ {
|
||||
delta := closes[i] - closes[i-1]
|
||||
if delta > 0 {
|
||||
gains += delta
|
||||
} else {
|
||||
losses -= delta
|
||||
}
|
||||
}
|
||||
|
||||
avgGain := gains / float64(period)
|
||||
avgLoss := losses / float64(period)
|
||||
|
||||
// Wilder's smoothing pour le reste
|
||||
for i := period + 1; i < len(closes); i++ {
|
||||
delta := closes[i] - closes[i-1]
|
||||
if delta > 0 {
|
||||
avgGain = (avgGain*float64(period-1) + delta) / float64(period)
|
||||
avgLoss = (avgLoss * float64(period-1)) / float64(period)
|
||||
} else {
|
||||
avgGain = (avgGain * float64(period-1)) / float64(period)
|
||||
avgLoss = (avgLoss*float64(period-1) - delta) / float64(period)
|
||||
}
|
||||
}
|
||||
|
||||
if avgLoss == 0 {
|
||||
return 100
|
||||
}
|
||||
rs := avgGain / avgLoss
|
||||
return 100 - (100 / (1 + rs))
|
||||
}
|
||||
Reference in New Issue
Block a user