package finance // EMA calcula la media movil exponencial de data con el periodo dado. // El primer valor valido se inicializa con la SMA de los primeros period elementos. // Los primeros period-1 elementos del resultado son 0. func EMA(data []float64, period int) []float64 { n := len(data) result := make([]float64, n) if period <= 0 || period > n { return result } k := 2.0 / float64(period+1) // Seed con SMA var sum float64 for i := 0; i < period; i++ { sum += data[i] } result[period-1] = sum / float64(period) for i := period; i < n; i++ { result[i] = data[i]*k + result[i-1]*(1-k) } return result }