bbgo_origin/pkg/indicator/v2/boll.go

64 lines
1.3 KiB
Go
Raw Normal View History

2023-07-10 08:54:22 +00:00
package indicatorv2
import (
"github.com/c9s/bbgo/pkg/types"
)
type BOLLStream struct {
// the band series
2023-07-10 08:54:22 +00:00
*types.Float64Series
2023-07-10 08:54:22 +00:00
UpBand, DownBand *types.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
2023-07-10 08:54:22 +00:00
func BOLL(source types.Float64Source, window int, k float64) *BOLLStream {
// bind these indicators before our main calculator
2023-07-11 02:26:38 +00:00
sma := SMA(source, window)
2023-07-10 08:54:22 +00:00
stdDev := StdDev(source, window)
s := &BOLLStream{
2023-07-10 08:54:22 +00:00
Float64Series: types.NewFloat64Series(),
UpBand: types.NewFloat64Series(),
DownBand: types.NewFloat64Series(),
window: window,
k: k,
SMA: sma,
StdDev: stdDev,
}
// on band update
s.Float64Series.OnUpdate(func(band float64) {
mid := s.SMA.Last(0)
s.UpBand.PushAndEmit(mid + band)
s.DownBand.PushAndEmit(mid - band)
})
s.Bind(source, s)
return s
}
func (s *BOLLStream) Calculate(v float64) float64 {
stdDev := s.StdDev.Last(0)
band := stdDev * s.k
return band
}
func (s *BOLLStream) Truncate() {
s.Slice = generalTruncate(s.Slice)
s.UpBand.Slice = generalTruncate(s.UpBand.Slice)
s.DownBand.Slice = generalTruncate(s.DownBand.Slice)
}