diff --git a/pkg/indicator/ad.go b/pkg/indicator/ad.go index 31536c8f5..02d91acee 100644 --- a/pkg/indicator/ad.go +++ b/pkg/indicator/ad.go @@ -64,15 +64,3 @@ func (inc *AD) CalculateAndUpdate(kLines []types.KLine) { inc.EmitUpdate(inc.Last(0)) inc.EndTime = kLines[len(kLines)-1].EndTime.Time() } - -func (inc *AD) handleKLineWindowUpdate(interval types.Interval, window types.KLineWindow) { - if inc.Interval != interval { - return - } - - inc.CalculateAndUpdate(window) -} - -func (inc *AD) Bind(updater KLineWindowUpdater) { - updater.OnKLineWindowUpdate(inc.handleKLineWindowUpdate) -} diff --git a/pkg/indicator/alma.go b/pkg/indicator/alma.go index 7f3c806b6..85e33056b 100644 --- a/pkg/indicator/alma.go +++ b/pkg/indicator/alma.go @@ -90,14 +90,3 @@ func (inc *ALMA) CalculateAndUpdate(allKLines []types.KLine) { inc.Update(allKLines[len(allKLines)-1].Close.Float64()) inc.EmitUpdate(inc.Last(0)) } - -func (inc *ALMA) handleKLineWindowUpdate(interval types.Interval, window types.KLineWindow) { - if inc.Interval != interval { - return - } - inc.CalculateAndUpdate(window) -} - -func (inc *ALMA) Bind(updater KLineWindowUpdater) { - updater.OnKLineWindowUpdate(inc.handleKLineWindowUpdate) -} diff --git a/pkg/indicator/ca_callbacks.go b/pkg/indicator/ca_callbacks.go index 4883dc6a6..d4b999952 100644 --- a/pkg/indicator/ca_callbacks.go +++ b/pkg/indicator/ca_callbacks.go @@ -5,11 +5,11 @@ package indicator import () func (inc *CA) OnUpdate(cb func(value float64)) { - inc.UpdateCallbacks = append(inc.UpdateCallbacks, cb) + inc.updateCallbacks = append(inc.updateCallbacks, cb) } func (inc *CA) EmitUpdate(value float64) { - for _, cb := range inc.UpdateCallbacks { + for _, cb := range inc.updateCallbacks { cb(value) } } diff --git a/pkg/indicator/cci.go b/pkg/indicator/cci.go index dd24b46c3..f11f33713 100644 --- a/pkg/indicator/cci.go +++ b/pkg/indicator/cci.go @@ -98,15 +98,3 @@ func (inc *CCI) CalculateAndUpdate(allKLines []types.KLine) { inc.EmitUpdate(inc.Last(0)) } } - -func (inc *CCI) handleKLineWindowUpdate(interval types.Interval, window types.KLineWindow) { - if inc.Interval != interval { - return - } - - inc.CalculateAndUpdate(window) -} - -func (inc *CCI) Bind(updater KLineWindowUpdater) { - updater.OnKLineWindowUpdate(inc.handleKLineWindowUpdate) -} diff --git a/pkg/indicator/cma.go b/pkg/indicator/cma.go index 51043f805..7a4117194 100644 --- a/pkg/indicator/cma.go +++ b/pkg/indicator/cma.go @@ -14,13 +14,14 @@ type CA struct { Interval types.Interval Values floats.Slice length float64 - UpdateCallbacks []func(value float64) + updateCallbacks []func(value float64) } func (inc *CA) Update(x float64) { if len(inc.Values) == 0 { inc.SeriesBase.Series = inc } + newVal := (inc.Values.Last(0)*inc.length + x) / (inc.length + 1.) inc.length += 1 inc.Values.Push(newVal) @@ -54,15 +55,3 @@ func (inc *CA) CalculateAndUpdate(allKLines []types.KLine) { inc.EmitUpdate(inc.Last(0)) } } - -func (inc *CA) handleKLineWindowUpdate(interval types.Interval, window types.KLineWindow) { - if inc.Interval != interval { - return - } - - inc.CalculateAndUpdate(window) -} - -func (inc *CA) Bind(updater KLineWindowUpdater) { - updater.OnKLineWindowUpdate(inc.handleKLineWindowUpdate) -} diff --git a/pkg/indicator/dmi.go b/pkg/indicator/dmi.go index 0bf270477..7b98dbdd9 100644 --- a/pkg/indicator/dmi.go +++ b/pkg/indicator/dmi.go @@ -115,15 +115,3 @@ func (inc *DMI) CalculateAndUpdate(allKLines []types.KLine) { inc.EmitUpdate(inc.DIPlus.Last(0), inc.DIMinus.Last(0), inc.ADX.Last(0)) } } - -func (inc *DMI) handleKLineWindowUpdate(interval types.Interval, window types.KLineWindow) { - if inc.Interval != interval { - return - } - - inc.CalculateAndUpdate(window) -} - -func (inc *DMI) Bind(updater KLineWindowUpdater) { - updater.OnKLineWindowUpdate(inc.handleKLineWindowUpdate) -} diff --git a/pkg/indicator/v2_cma.go b/pkg/indicator/v2_cma.go new file mode 100644 index 000000000..f3c485aff --- /dev/null +++ b/pkg/indicator/v2_cma.go @@ -0,0 +1,23 @@ +package indicator + +type CMAStream struct { + Float64Series +} + +func CMA2(source Float64Source) *CMAStream { + s := &CMAStream{ + Float64Series: NewFloat64Series(), + } + s.Bind(source, s) + return s +} + +func (s *CMAStream) Calculate(x float64) float64 { + l := float64(s.slice.Length()) + cma := (s.slice.Last(0)*l + x) / (l + 1.) + return cma +} + +func (s *CMAStream) Truncate() { + s.slice.Truncate(MaxNumOfEWMA) +}