mirror of
https://github.com/c9s/bbgo.git
synced 2024-11-22 23:05:15 +00:00
74 lines
1.5 KiB
Go
74 lines
1.5 KiB
Go
package indicator
|
|
|
|
import (
|
|
"github.com/c9s/bbgo/pkg/datatype/floats"
|
|
"github.com/c9s/bbgo/pkg/types"
|
|
)
|
|
|
|
type Float64Series struct {
|
|
types.SeriesBase
|
|
Float64Updater
|
|
slice floats.Slice
|
|
}
|
|
|
|
func NewFloat64Series(v ...float64) *Float64Series {
|
|
s := &Float64Series{}
|
|
s.slice = v
|
|
s.SeriesBase.Series = s.slice
|
|
return s
|
|
}
|
|
|
|
func (f *Float64Series) Last(i int) float64 {
|
|
return f.slice.Last(i)
|
|
}
|
|
|
|
func (f *Float64Series) Index(i int) float64 {
|
|
return f.Last(i)
|
|
}
|
|
|
|
func (f *Float64Series) Length() int {
|
|
return len(f.slice)
|
|
}
|
|
|
|
func (f *Float64Series) Slice() floats.Slice {
|
|
return f.slice
|
|
}
|
|
|
|
func (f *Float64Series) PushAndEmit(x float64) {
|
|
f.slice.Push(x)
|
|
f.EmitUpdate(x)
|
|
}
|
|
|
|
func (f *Float64Series) Subscribe(source Float64Source, c func(x float64)) {
|
|
if sub, ok := source.(Float64Subscription); ok {
|
|
sub.AddSubscriber(c)
|
|
} else {
|
|
source.OnUpdate(c)
|
|
}
|
|
}
|
|
|
|
// Bind binds the source event to the target (Float64Calculator)
|
|
// A Float64Calculator should be able to calculate the float64 result from a single float64 argument input
|
|
func (f *Float64Series) Bind(source Float64Source, target Float64Calculator) {
|
|
var c func(x float64)
|
|
|
|
// optimize the truncation check
|
|
trc, canTruncate := target.(Float64Truncator)
|
|
if canTruncate {
|
|
c = func(x float64) {
|
|
y := target.Calculate(x)
|
|
target.PushAndEmit(y)
|
|
trc.Truncate()
|
|
}
|
|
} else {
|
|
c = func(x float64) {
|
|
y := target.Calculate(x)
|
|
target.PushAndEmit(y)
|
|
}
|
|
}
|
|
|
|
if source != nil {
|
|
f.Subscribe(source, c)
|
|
}
|
|
}
|