From 84c3d386ca48a117bdac78837647a3369e63c119 Mon Sep 17 00:00:00 2001 From: c9s Date: Wed, 9 Nov 2022 16:20:40 +0800 Subject: [PATCH] grid2: implement find next higher/lower pin --- pkg/strategy/grid2/grid.go | 28 +++++++++++++++++++++++++ pkg/strategy/grid2/grid_test.go | 36 +++++++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+) diff --git a/pkg/strategy/grid2/grid.go b/pkg/strategy/grid2/grid.go index 35633f633..20aa541b2 100644 --- a/pkg/strategy/grid2/grid.go +++ b/pkg/strategy/grid2/grid.go @@ -86,6 +86,34 @@ func (g *Grid) HasPin(pin Pin) (ok bool) { return ok } +// NextHigherPin finds the next higher pin +func (g *Grid) NextHigherPin(price fixedpoint.Value) (Pin, bool) { + i := g.SearchPin(price) + if i < len(g.Pins) && fixedpoint.Value(g.Pins[i]).Compare(price) == 0 && i+1 < len(g.Pins) { + return g.Pins[i+1], true + } + + return Pin(fixedpoint.Zero), false +} + +// NextLowerPin finds the next lower pin +func (g *Grid) NextLowerPin(price fixedpoint.Value) (Pin, bool) { + i := g.SearchPin(price) + if i < len(g.Pins) && fixedpoint.Value(g.Pins[i]).Compare(price) == 0 && i-1 >= 0 { + return g.Pins[i-1], true + } + + return Pin(fixedpoint.Zero), false +} + +func (g *Grid) SearchPin(price fixedpoint.Value) int { + i := sort.Search(len(g.Pins), func(i int) bool { + a := fixedpoint.Value(g.Pins[i]) + return a.Compare(price) >= 0 + }) + return i +} + func (g *Grid) ExtendUpperPrice(upper fixedpoint.Value) (newPins []Pin) { if upper.Compare(g.UpperPrice) <= 0 { return nil diff --git a/pkg/strategy/grid2/grid_test.go b/pkg/strategy/grid2/grid_test.go index 18e5c8095..742c2116f 100644 --- a/pkg/strategy/grid2/grid_test.go +++ b/pkg/strategy/grid2/grid_test.go @@ -100,6 +100,42 @@ func TestGrid_ExtendLowerPrice(t *testing.T) { } } +func TestGrid_NextLowerPin(t *testing.T) { + upper := number(500.0) + lower := number(100.0) + size := number(4.0) + grid := NewGrid(lower, upper, size, number(0.01)) + t.Logf("pins: %+v", grid.Pins) + + next, ok := grid.NextLowerPin(number(200.0)) + assert.True(t, ok) + assert.Equal(t, Pin(number(100.0)), next) + + next, ok = grid.NextLowerPin(number(150.0)) + assert.False(t, ok) + assert.Equal(t, Pin(fixedpoint.Zero), next) +} + +func TestGrid_NextHigherPin(t *testing.T) { + upper := number(500.0) + lower := number(100.0) + size := number(4.0) + grid := NewGrid(lower, upper, size, number(0.01)) + t.Logf("pins: %+v", grid.Pins) + + next, ok := grid.NextHigherPin(number(100.0)) + assert.True(t, ok) + assert.Equal(t, Pin(number(200.0)), next) + + next, ok = grid.NextHigherPin(number(400.0)) + assert.True(t, ok) + assert.Equal(t, Pin(number(500.0)), next) + + next, ok = grid.NextHigherPin(number(500.0)) + assert.False(t, ok) + assert.Equal(t, Pin(fixedpoint.Zero), next) +} + func Test_calculateArithmeticPins(t *testing.T) { type args struct { lower fixedpoint.Value