From 8fcc3ee368ef728238c3861e44b9250236edce38 Mon Sep 17 00:00:00 2001 From: c9s Date: Wed, 31 Aug 2022 01:43:40 +0800 Subject: [PATCH] indicator: update pivot low and pivot high indicator --- pkg/bbgo/standard_indicator_set.go | 5 ++ pkg/indicator/pivothigh.go | 65 +++++++++++++++++++ pkg/indicator/pivothigh_callbacks.go | 15 +++++ pkg/indicator/{pivot_low.go => pivotlow.go} | 0 .../{pivot_low_test.go => pivotlow_test.go} | 0 5 files changed, 85 insertions(+) create mode 100644 pkg/indicator/pivothigh.go create mode 100644 pkg/indicator/pivothigh_callbacks.go rename pkg/indicator/{pivot_low.go => pivotlow.go} (100%) rename pkg/indicator/{pivot_low_test.go => pivotlow_test.go} (100%) diff --git a/pkg/bbgo/standard_indicator_set.go b/pkg/bbgo/standard_indicator_set.go index 09ef5d082..6de98dbd1 100644 --- a/pkg/bbgo/standard_indicator_set.go +++ b/pkg/bbgo/standard_indicator_set.go @@ -81,6 +81,11 @@ func (s *StandardIndicatorSet) VWMA(iw types.IntervalWindow) *indicator.VWMA { } +func (s *StandardIndicatorSet) PivotHigh(iw types.IntervalWindow) *indicator.PivotHigh { + inc := s.allocateSimpleIndicator(&indicator.PivotHigh{IntervalWindow: iw}, iw) + return inc.(*indicator.PivotHigh) +} + func (s *StandardIndicatorSet) PivotLow(iw types.IntervalWindow) *indicator.PivotLow { inc := s.allocateSimpleIndicator(&indicator.PivotLow{IntervalWindow: iw}, iw) return inc.(*indicator.PivotLow) diff --git a/pkg/indicator/pivothigh.go b/pkg/indicator/pivothigh.go new file mode 100644 index 000000000..d92bc1df7 --- /dev/null +++ b/pkg/indicator/pivothigh.go @@ -0,0 +1,65 @@ +package indicator + +import ( + "time" + + "github.com/c9s/bbgo/pkg/datatype/floats" + "github.com/c9s/bbgo/pkg/types" +) + +//go:generate callbackgen -type PivotHigh +type PivotHigh struct { + types.SeriesBase + + types.IntervalWindow + + Lows floats.Slice + Values floats.Slice + EndTime time.Time + + updateCallbacks []func(value float64) +} + +func (inc *PivotHigh) Length() int { + return inc.Values.Length() +} + +func (inc *PivotHigh) Last() float64 { + if len(inc.Values) == 0 { + return 0.0 + } + + return inc.Values.Last() +} + +func (inc *PivotHigh) Update(value float64) { + if len(inc.Lows) == 0 { + inc.SeriesBase.Series = inc + } + + inc.Lows.Push(value) + + if len(inc.Lows) < inc.Window { + return + } + + low, ok := calculatePivotHigh(inc.Lows, inc.Window, inc.RightWindow) + if !ok { + return + } + + if low > 0.0 { + inc.Values.Push(low) + } +} + +func (inc *PivotHigh) PushK(k types.KLine) { + if k.EndTime.Before(inc.EndTime) { + return + } + + inc.Update(k.Low.Float64()) + inc.EndTime = k.EndTime.Time() + inc.EmitUpdate(inc.Last()) +} + diff --git a/pkg/indicator/pivothigh_callbacks.go b/pkg/indicator/pivothigh_callbacks.go new file mode 100644 index 000000000..64891ada0 --- /dev/null +++ b/pkg/indicator/pivothigh_callbacks.go @@ -0,0 +1,15 @@ +// Code generated by "callbackgen -type PivotHigh"; DO NOT EDIT. + +package indicator + +import () + +func (inc *PivotHigh) OnUpdate(cb func(value float64)) { + inc.updateCallbacks = append(inc.updateCallbacks, cb) +} + +func (inc *PivotHigh) EmitUpdate(value float64) { + for _, cb := range inc.updateCallbacks { + cb(value) + } +} diff --git a/pkg/indicator/pivot_low.go b/pkg/indicator/pivotlow.go similarity index 100% rename from pkg/indicator/pivot_low.go rename to pkg/indicator/pivotlow.go diff --git a/pkg/indicator/pivot_low_test.go b/pkg/indicator/pivotlow_test.go similarity index 100% rename from pkg/indicator/pivot_low_test.go rename to pkg/indicator/pivotlow_test.go