71 lines
1.3 KiB
Go
71 lines
1.3 KiB
Go
package indicatorv2
|
|
|
|
import (
|
|
"git.qtrade.icu/lychiyu/bbgo/pkg/types"
|
|
)
|
|
|
|
type NRStrean struct {
|
|
*types.Float64Series
|
|
nrCount int
|
|
|
|
kLines []types.KLine
|
|
strictMode bool
|
|
NrKLine types.KLine
|
|
}
|
|
|
|
func NR(source KLineSubscription, nrCount int, strictMode bool) *NRStrean {
|
|
|
|
s := &NRStrean{
|
|
nrCount: nrCount,
|
|
Float64Series: types.NewFloat64Series(),
|
|
}
|
|
source.AddSubscriber(func(k types.KLine) {
|
|
s.calculateAndPush(k)
|
|
})
|
|
return s
|
|
}
|
|
|
|
func (s *NRStrean) calculateAndPush(k types.KLine) {
|
|
|
|
s.kLines = append(s.kLines, k)
|
|
if len(s.kLines) < s.nrCount {
|
|
return
|
|
}
|
|
|
|
nr := s.kLines[len(s.kLines)-1]
|
|
preNr := s.kLines[len(s.kLines)-2]
|
|
isNR := true
|
|
|
|
if preNr.High < nr.High || preNr.Low > nr.Low {
|
|
isNR = false
|
|
return
|
|
}
|
|
|
|
for i := len(s.kLines) - s.nrCount; i < len(s.kLines); i++ {
|
|
// 这种是所有的kline都要高于nr
|
|
//if s.CalKLines[i].High > nr.High || s.CalKLines[i].Low < nr.Low {
|
|
// isNR = false
|
|
// break
|
|
//}
|
|
if s.strictMode {
|
|
if s.kLines[i].High-s.kLines[i].Low < nr.High-nr.Low {
|
|
isNR = false
|
|
break
|
|
}
|
|
} else {
|
|
if (s.kLines[i].High-s.kLines[i].Low)/s.kLines[i].Low < (nr.High-nr.Low)/nr.Low {
|
|
isNR = false
|
|
break
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
if isNR {
|
|
s.NrKLine = nr
|
|
s.PushAndEmit(nr.High.Float64())
|
|
}
|
|
|
|
return
|
|
}
|