From e632fa087e5acc0a1c8be72ba63357433778f8f6 Mon Sep 17 00:00:00 2001 From: anywhy Date: Sat, 23 Mar 2024 16:16:05 +0800 Subject: [PATCH] update adx indicator and test case --- pkg/indicator/v2/adx.go | 51 +++++++++++++++++++----------------- pkg/indicator/v2/adx_test.go | 8 +++--- 2 files changed, 31 insertions(+), 28 deletions(-) diff --git a/pkg/indicator/v2/adx.go b/pkg/indicator/v2/adx.go index be2a4bcb5..eb9920b02 100644 --- a/pkg/indicator/v2/adx.go +++ b/pkg/indicator/v2/adx.go @@ -8,7 +8,8 @@ import ( ) type ADXStream struct { - *types.Float64Series + *RMAStream + Plus, Minus *types.Float64Series window int @@ -19,45 +20,47 @@ func ADX(source KLineSubscription, window int) *ADXStream { var ( atr = ATR2(source, window) dmp = types.NewFloat64Series() - dmm = types.NewFloat64Series() + dmn = types.NewFloat64Series() adx = types.NewFloat64Series() sdmp = RMA2(dmp, window, true) - sdmm = RMA2(dmm, window, true) - sadx = RMA2(adx, window, true) + sdmn = RMA2(dmn, window, true) s = &ADXStream{ - window: window, - Plus: types.NewFloat64Series(), - Minus: types.NewFloat64Series(), - Float64Series: types.NewFloat64Series(), - prevHigh: fixedpoint.Zero, - prevLow: fixedpoint.Zero, + window: window, + Plus: types.NewFloat64Series(), + Minus: types.NewFloat64Series(), + prevHigh: fixedpoint.Zero, + prevLow: fixedpoint.Zero, + RMAStream: RMA2(adx, window, true), } ) source.AddSubscriber(func(k types.KLine) { - up, down := k.High.Sub(s.prevHigh), -k.Low.Sub(s.prevLow) - if up.Compare(down) > 0 && up > 0 { + if s.prevHigh.IsZero() || s.prevLow.IsZero() { + 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()) } else { dmp.PushAndEmit(0.0) } - - if down.Compare(up) > 0 && down > 0 { - dmm.PushAndEmit(down.Float64()) + if dn.Compare(up) > 0 && dn > 0 { + dmn.PushAndEmit(dn.Float64()) } else { - dmm.PushAndEmit(0.0) + dmn.PushAndEmit(0.0) } - s.Plus.PushAndEmit(sdmp.Last(0) / atr.Last(0) * 100) - s.Minus.PushAndEmit(sdmm.Last(0) / atr.Last(0) * 100) - - sum := s.Plus.Last(0) + s.Minus.Last(0) - if sum == 0 { - sum = 1 + s.Plus.PushAndEmit(sdmp.Last(0) * 100 / atr.Last(0)) + 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)) + if !math.IsNaN(dx) { + adx.PushAndEmit(dx * 100.0) + } 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.Truncate() }) diff --git a/pkg/indicator/v2/adx_test.go b/pkg/indicator/v2/adx_test.go index 22cc7bc7b..4b56e6058 100644 --- a/pkg/indicator/v2/adx_test.go +++ b/pkg/indicator/v2/adx_test.go @@ -11,9 +11,9 @@ import ( func Test_ADX(t *testing.T) { 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], - "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] + "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], + "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) { @@ -36,7 +36,7 @@ func Test_ADX(t *testing.T) { name: "test_binance_btcusdt_1h", kLines: buildKLines(bytes), window: 7, - want: 31.895091, + want: 34.83952, }, }