[add] 新增NR和CCI指标
This commit is contained in:
parent
9f5b2c470f
commit
76a133a6b4
8
go.mod
8
go.mod
|
@ -4,8 +4,6 @@ module git.qtrade.icu/lychiyu/bbgo
|
||||||
|
|
||||||
go 1.22.4
|
go 1.22.4
|
||||||
|
|
||||||
toolchain go1.23.0
|
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/DATA-DOG/go-sqlmock v1.5.2
|
github.com/DATA-DOG/go-sqlmock v1.5.2
|
||||||
github.com/Masterminds/squirrel v1.5.4
|
github.com/Masterminds/squirrel v1.5.4
|
||||||
|
@ -50,9 +48,12 @@ require (
|
||||||
github.com/stretchr/testify v1.9.0
|
github.com/stretchr/testify v1.9.0
|
||||||
github.com/valyala/fastjson v1.6.4
|
github.com/valyala/fastjson v1.6.4
|
||||||
github.com/wcharczuk/go-chart/v2 v2.1.1
|
github.com/wcharczuk/go-chart/v2 v2.1.1
|
||||||
|
github.com/webview/webview v0.0.0-20210216142346-e0bfdf0e5d90
|
||||||
github.com/x-cray/logrus-prefixed-formatter v0.5.2
|
github.com/x-cray/logrus-prefixed-formatter v0.5.2
|
||||||
|
github.com/zserge/lorca v0.1.10
|
||||||
go.uber.org/mock v0.4.0
|
go.uber.org/mock v0.4.0
|
||||||
go.uber.org/multierr v1.11.0
|
go.uber.org/multierr v1.11.0
|
||||||
|
golang.org/x/oauth2 v0.21.0
|
||||||
golang.org/x/sync v0.7.0
|
golang.org/x/sync v0.7.0
|
||||||
golang.org/x/time v0.5.0
|
golang.org/x/time v0.5.0
|
||||||
gonum.org/v1/gonum v0.15.0
|
gonum.org/v1/gonum v0.15.0
|
||||||
|
@ -79,6 +80,7 @@ require (
|
||||||
github.com/cloudwego/base64x v0.1.4 // indirect
|
github.com/cloudwego/base64x v0.1.4 // indirect
|
||||||
github.com/cloudwego/iasm v0.2.0 // indirect
|
github.com/cloudwego/iasm v0.2.0 // indirect
|
||||||
github.com/cockroachdb/apd v1.1.0 // indirect
|
github.com/cockroachdb/apd v1.1.0 // indirect
|
||||||
|
github.com/cpuguy83/go-md2man/v2 v2.0.4 // indirect
|
||||||
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
|
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
|
||||||
github.com/denisenkom/go-mssqldb v0.12.3 // indirect
|
github.com/denisenkom/go-mssqldb v0.12.3 // indirect
|
||||||
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
|
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
|
||||||
|
@ -126,6 +128,7 @@ require (
|
||||||
github.com/prometheus/procfs v0.12.0 // indirect
|
github.com/prometheus/procfs v0.12.0 // indirect
|
||||||
github.com/rivo/uniseg v0.4.4 // indirect
|
github.com/rivo/uniseg v0.4.4 // indirect
|
||||||
github.com/rollbar/rollbar-go v1.0.2 // indirect
|
github.com/rollbar/rollbar-go v1.0.2 // indirect
|
||||||
|
github.com/russross/blackfriday/v2 v2.1.0 // indirect
|
||||||
github.com/sagikazarmark/locafero v0.4.0 // indirect
|
github.com/sagikazarmark/locafero v0.4.0 // indirect
|
||||||
github.com/sagikazarmark/slog-shim v0.1.0 // indirect
|
github.com/sagikazarmark/slog-shim v0.1.0 // indirect
|
||||||
github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24 // indirect
|
github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24 // indirect
|
||||||
|
@ -147,7 +150,6 @@ require (
|
||||||
golang.org/x/image v0.14.0 // indirect
|
golang.org/x/image v0.14.0 // indirect
|
||||||
golang.org/x/mod v0.17.0 // indirect
|
golang.org/x/mod v0.17.0 // indirect
|
||||||
golang.org/x/net v0.26.0 // indirect
|
golang.org/x/net v0.26.0 // indirect
|
||||||
golang.org/x/oauth2 v0.21.0 // indirect
|
|
||||||
golang.org/x/sys v0.21.0 // indirect
|
golang.org/x/sys v0.21.0 // indirect
|
||||||
golang.org/x/term v0.21.0 // indirect
|
golang.org/x/term v0.21.0 // indirect
|
||||||
golang.org/x/text v0.16.0 // indirect
|
golang.org/x/text v0.16.0 // indirect
|
||||||
|
|
|
@ -112,3 +112,10 @@ func (i *IndicatorSet) ATRP(interval types.Interval, window int) *indicatorv2.AT
|
||||||
func (i *IndicatorSet) ADX(interval types.Interval, window int) *indicatorv2.ADXStream {
|
func (i *IndicatorSet) ADX(interval types.Interval, window int) *indicatorv2.ADXStream {
|
||||||
return indicatorv2.ADX(i.KLines(interval), window)
|
return indicatorv2.ADX(i.KLines(interval), window)
|
||||||
}
|
}
|
||||||
|
func (i *IndicatorSet) NR(interval types.Interval, nrCount int, strictMode bool) *indicatorv2.NRStrean {
|
||||||
|
return indicatorv2.NR(i.KLines(interval), nrCount, strictMode)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (i *IndicatorSet) CCI(interval types.Interval, window int) *indicatorv2.CCIStream {
|
||||||
|
return indicatorv2.CCI(indicatorv2.HLC3(i.KLines(interval)), window)
|
||||||
|
}
|
||||||
|
|
|
@ -44,7 +44,7 @@ func CCI(source types.Float64Source, window int) *CCIStream {
|
||||||
return s
|
return s
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *CCIStream) Calculate(value float64) float64 {
|
func (s *CCIStream) Calculate1(value float64) float64 {
|
||||||
var tp = value
|
var tp = value
|
||||||
if s.TypicalPrice.Length() > 0 {
|
if s.TypicalPrice.Length() > 0 {
|
||||||
tp = s.TypicalPrice.Last(0) - s.source.Last(s.window) + value
|
tp = s.TypicalPrice.Last(0) - s.source.Last(s.window) + value
|
||||||
|
@ -63,3 +63,20 @@ func (s *CCIStream) Calculate(value float64) float64 {
|
||||||
cci := (value - ma) / (0.015 * md)
|
cci := (value - ma) / (0.015 * md)
|
||||||
return cci
|
return cci
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *CCIStream) Calculate(value float64) float64 {
|
||||||
|
ma := 0.
|
||||||
|
for i := 0; i < s.window; i++ {
|
||||||
|
ma += s.source.Last(i)
|
||||||
|
}
|
||||||
|
ma = ma / float64(s.window)
|
||||||
|
|
||||||
|
md := 0.
|
||||||
|
for i := 0; i < s.window; i++ {
|
||||||
|
md += math.Abs(s.source.Last(i) - ma)
|
||||||
|
}
|
||||||
|
|
||||||
|
md = md / float64(s.window)
|
||||||
|
cci := (value - ma) / (0.015 * md)
|
||||||
|
return cci
|
||||||
|
}
|
||||||
|
|
70
pkg/indicator/v2/nr.go
Normal file
70
pkg/indicator/v2/nr.go
Normal file
|
@ -0,0 +1,70 @@
|
||||||
|
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
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user