mirror of
https://github.com/c9s/bbgo.git
synced 2024-11-25 16:25:16 +00:00
47 lines
1.0 KiB
Go
47 lines
1.0 KiB
Go
package elliottwave
|
|
|
|
import (
|
|
"github.com/c9s/bbgo/pkg/fixedpoint"
|
|
"github.com/c9s/bbgo/pkg/types"
|
|
)
|
|
|
|
type HeikinAshi struct {
|
|
Values []types.KLine
|
|
size int
|
|
}
|
|
|
|
func NewHeikinAshi(size int) *HeikinAshi {
|
|
return &HeikinAshi{
|
|
Values: make([]types.KLine, size),
|
|
size: size,
|
|
}
|
|
}
|
|
|
|
func (inc *HeikinAshi) Last() *types.KLine {
|
|
if len(inc.Values) == 0 {
|
|
return &types.KLine{}
|
|
}
|
|
return &inc.Values[len(inc.Values)-1]
|
|
}
|
|
|
|
func (inc *HeikinAshi) Update(kline types.KLine) {
|
|
open := kline.Open
|
|
cloze := kline.Close
|
|
high := kline.High
|
|
low := kline.Low
|
|
lastOpen := inc.Last().Open
|
|
lastClose := inc.Last().Close
|
|
|
|
newClose := open.Add(high).Add(low).Add(cloze).Div(Four)
|
|
newOpen := lastOpen.Add(lastClose).Div(Two)
|
|
|
|
kline.Close = newClose
|
|
kline.Open = newOpen
|
|
kline.High = fixedpoint.Max(fixedpoint.Max(high, newOpen), newClose)
|
|
kline.Low = fixedpoint.Max(fixedpoint.Min(low, newOpen), newClose)
|
|
inc.Values = append(inc.Values, kline)
|
|
if len(inc.Values) > inc.size {
|
|
inc.Values = inc.Values[len(inc.Values)-inc.size:]
|
|
}
|
|
}
|