package indicatorv2 import ( "git.qtrade.icu/lychiyu/qbtrade/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 }