mirror of
https://github.com/c9s/bbgo.git
synced 2024-11-25 08:15:15 +00:00
update adx indicator and test case
This commit is contained in:
parent
474a8ab864
commit
e632fa087e
|
@ -8,7 +8,8 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
type ADXStream struct {
|
type ADXStream struct {
|
||||||
*types.Float64Series
|
*RMAStream
|
||||||
|
|
||||||
Plus, Minus *types.Float64Series
|
Plus, Minus *types.Float64Series
|
||||||
|
|
||||||
window int
|
window int
|
||||||
|
@ -19,45 +20,47 @@ func ADX(source KLineSubscription, window int) *ADXStream {
|
||||||
var (
|
var (
|
||||||
atr = ATR2(source, window)
|
atr = ATR2(source, window)
|
||||||
dmp = types.NewFloat64Series()
|
dmp = types.NewFloat64Series()
|
||||||
dmm = types.NewFloat64Series()
|
dmn = types.NewFloat64Series()
|
||||||
adx = types.NewFloat64Series()
|
adx = types.NewFloat64Series()
|
||||||
sdmp = RMA2(dmp, window, true)
|
sdmp = RMA2(dmp, window, true)
|
||||||
sdmm = RMA2(dmm, window, true)
|
sdmn = RMA2(dmn, window, true)
|
||||||
sadx = RMA2(adx, window, true)
|
|
||||||
s = &ADXStream{
|
s = &ADXStream{
|
||||||
window: window,
|
window: window,
|
||||||
Plus: types.NewFloat64Series(),
|
Plus: types.NewFloat64Series(),
|
||||||
Minus: types.NewFloat64Series(),
|
Minus: types.NewFloat64Series(),
|
||||||
Float64Series: types.NewFloat64Series(),
|
prevHigh: fixedpoint.Zero,
|
||||||
prevHigh: fixedpoint.Zero,
|
prevLow: fixedpoint.Zero,
|
||||||
prevLow: fixedpoint.Zero,
|
RMAStream: RMA2(adx, window, true),
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
source.AddSubscriber(func(k types.KLine) {
|
source.AddSubscriber(func(k types.KLine) {
|
||||||
up, down := k.High.Sub(s.prevHigh), -k.Low.Sub(s.prevLow)
|
if s.prevHigh.IsZero() || s.prevLow.IsZero() {
|
||||||
if up.Compare(down) > 0 && up > 0 {
|
s.prevHigh, s.prevLow = k.High, k.Low
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
up, dn := k.High.Sub(s.prevHigh), s.prevLow.Sub(k.Low)
|
||||||
|
if up.Compare(dn) > 0 && up > 0 {
|
||||||
dmp.PushAndEmit(up.Float64())
|
dmp.PushAndEmit(up.Float64())
|
||||||
} else {
|
} else {
|
||||||
dmp.PushAndEmit(0.0)
|
dmp.PushAndEmit(0.0)
|
||||||
}
|
}
|
||||||
|
if dn.Compare(up) > 0 && dn > 0 {
|
||||||
if down.Compare(up) > 0 && down > 0 {
|
dmn.PushAndEmit(dn.Float64())
|
||||||
dmm.PushAndEmit(down.Float64())
|
|
||||||
} else {
|
} else {
|
||||||
dmm.PushAndEmit(0.0)
|
dmn.PushAndEmit(0.0)
|
||||||
}
|
}
|
||||||
|
|
||||||
s.Plus.PushAndEmit(sdmp.Last(0) / atr.Last(0) * 100)
|
s.Plus.PushAndEmit(sdmp.Last(0) * 100 / atr.Last(0))
|
||||||
s.Minus.PushAndEmit(sdmm.Last(0) / atr.Last(0) * 100)
|
s.Minus.PushAndEmit(sdmn.Last(0) * 100 / atr.Last(0))
|
||||||
|
dx := math.Abs(s.Plus.Last(0)-s.Minus.Last(0)) / (s.Plus.Last(0) + s.Minus.Last(0))
|
||||||
sum := s.Plus.Last(0) + s.Minus.Last(0)
|
if !math.IsNaN(dx) {
|
||||||
if sum == 0 {
|
adx.PushAndEmit(dx * 100.0)
|
||||||
sum = 1
|
} else {
|
||||||
|
adx.PushAndEmit(0.0)
|
||||||
}
|
}
|
||||||
adx.PushAndEmit(math.Abs(s.Plus.Last(0)-s.Minus.Last(0)) / sum)
|
|
||||||
|
|
||||||
s.PushAndEmit(sadx.Last(0) * 100)
|
|
||||||
s.prevHigh, s.prevLow = k.High, k.Low
|
s.prevHigh, s.prevLow = k.High, k.Low
|
||||||
s.Truncate()
|
s.Truncate()
|
||||||
})
|
})
|
||||||
|
|
|
@ -11,9 +11,9 @@ import (
|
||||||
|
|
||||||
func Test_ADX(t *testing.T) {
|
func Test_ADX(t *testing.T) {
|
||||||
var bytes = []byte(`{
|
var bytes = []byte(`{
|
||||||
"high": [40145.0, 40186.36, 40196.39, 40344.6, 40245.48, 40273.24, 40464.0, 40699.0, 40627.48, 40436.31, 40370.0, 40376.8, 40227.03, 40056.52, 39721.7, 39597.94, 39750.15, 39927.0, 40289.02, 40189.0],
|
"high": [40145.0, 40186.36, 40196.39, 40344.6, 40245.48, 40273.24, 40464.0, 40699.0, 40627.48, 40436.31, 40370.0, 40376.8, 40227.03, 40056.52, 39721.7, 39597.94, 39750.15, 39927.0, 40289.02, 40189.0],
|
||||||
"low": [39870.71, 39834.98, 39866.31, 40108.31, 40016.09, 40094.66, 40105.0, 40196.48, 40154.99, 39800.0, 39959.21, 39922.98, 39940.02, 39632.0, 39261.39, 39254.63, 39473.91, 39555.51, 39819.0, 40006.84],
|
"low": [39870.71, 39834.98, 39866.31, 40108.31, 40016.09, 40094.66, 40105.0, 40196.48, 40154.99, 39800.0, 39959.21, 39922.98, 39940.02, 39632.0, 39261.39, 39254.63, 39473.91, 39555.51, 39819.0, 40006.84],
|
||||||
"close": [40105.78, 39935.23, 40183.97, 40182.03, 40212.26, 40149.99, 40378.0, 40618.37, 40401.03, 39990.39, 40179.13, 40097.23, 40014.72, 39667.85, 39303.1, 39519.99, 39693.79, 39827.96, 40074.94, 40059.84]
|
"close": [40105.78, 39935.23, 40183.97, 40182.03, 40212.26, 40149.99, 40378.0, 40618.37, 40401.03, 39990.39, 40179.13, 40097.23, 40014.72, 39667.85, 39303.1, 39519.99,39693.79, 39827.96, 40074.94, 40059.84]
|
||||||
}`)
|
}`)
|
||||||
|
|
||||||
var buildKLines = func(bytes []byte) (kLines []types.KLine) {
|
var buildKLines = func(bytes []byte) (kLines []types.KLine) {
|
||||||
|
@ -36,7 +36,7 @@ func Test_ADX(t *testing.T) {
|
||||||
name: "test_binance_btcusdt_1h",
|
name: "test_binance_btcusdt_1h",
|
||||||
kLines: buildKLines(bytes),
|
kLines: buildKLines(bytes),
|
||||||
window: 7,
|
window: 7,
|
||||||
want: 31.895091,
|
want: 34.83952,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user