indicator: implement bollinger indicator

This commit is contained in:
c9s 2023-06-09 18:36:54 +08:00
parent 9d9f898f17
commit 295ae95da6
No known key found for this signature in database
GPG Key ID: 7385E7E464CB0A54

52
pkg/indicator/v2_boll.go Normal file
View File

@ -0,0 +1,52 @@
package indicator
type BollStream struct {
// the band series
*Float64Series
UpBand, DownBand *Float64Series
window int
k float64
SMA *SMAStream
StdDev *StdDevStream
}
// BOOL2 is bollinger indicator
// the data flow:
//
// priceSource ->
//
// -> calculate SMA
// -> calculate stdDev -> calculate bandWidth -> get latest SMA -> upBand, downBand
func BOLL2(source Float64Source, window int, k float64) *BollStream {
// bind these indicators before our main calculator
sma := SMA2(source, window)
stdDev := StdDev2(source, window)
s := &BollStream{
Float64Series: NewFloat64Series(),
UpBand: NewFloat64Series(),
DownBand: NewFloat64Series(),
window: window,
k: k,
SMA: sma,
StdDev: stdDev,
}
s.Bind(source, s)
// on band update
s.Float64Series.OnUpdate(func(band float64) {
mid := s.SMA.Last(0)
s.UpBand.PushAndEmit(mid + band)
s.DownBand.PushAndEmit(mid - band)
})
return s
}
func (s *BollStream) Calculate(v float64) float64 {
stdDev := s.StdDev.Last(0)
band := stdDev * s.k
return band
}