Merge pull request #1239 from c9s/c0s/grid2-remove-duplicated-pins

This commit is contained in:
c9s 2023-07-23 15:28:21 +08:00 committed by GitHub
commit 3da7eb0b42
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 86 additions and 13 deletions

View File

@ -4,7 +4,9 @@ on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
branches:
- "main"
- "v*"
jobs:
build:

View File

@ -35,28 +35,48 @@ type Grid struct {
type Pin fixedpoint.Value
// filterPrice filters price with the given precision
func filterPrice(p fixedpoint.Value, prec int) fixedpoint.Value {
var pow10 = math.Pow10(prec)
pp := math.Round(p.Float64()*pow10*10.0) / 10.0
pp = math.Trunc(pp) / pow10
pps := strconv.FormatFloat(pp, 'f', prec, 64)
price := fixedpoint.MustNewFromString(pps)
return price
}
func removeDuplicatedPins(pins []Pin) []Pin {
var buckets = map[string]struct{}{}
var out []Pin
for _, pin := range pins {
p := fixedpoint.Value(pin)
if _, exists := buckets[p.String()]; exists {
continue
}
out = append(out, pin)
buckets[p.String()] = struct{}{}
}
return out
}
func calculateArithmeticPins(lower, upper, spread, tickSize fixedpoint.Value) []Pin {
var pins []Pin
// tickSize number is like 0.01, 0.1, 0.001
var ts = tickSize.Float64()
var prec = int(math.Round(math.Log10(ts) * -1.0))
var pow10 = math.Pow10(prec)
for p := lower; p.Compare(upper.Sub(spread)) <= 0; p = p.Add(spread) {
pp := math.Round(p.Float64()*pow10*10.0) / 10.0
pp = math.Trunc(pp) / pow10
pps := strconv.FormatFloat(pp, 'f', prec, 64)
price := fixedpoint.MustNewFromString(pps)
price := filterPrice(p, prec)
pins = append(pins, Pin(price))
}
// this makes sure there is no error at the upper price
pp := math.Round(upper.Float64()*pow10*10.0) / 10.0
pp = math.Trunc(pp) / pow10
pps := strconv.FormatFloat(pp, 'f', prec, 64)
upperPrice := fixedpoint.MustNewFromString(pps)
upperPrice := filterPrice(upper, prec)
pins = append(pins, Pin(upperPrice))
return pins
@ -94,7 +114,7 @@ func (g *Grid) CalculateGeometricPins() {
return nil
}
g.addPins(g.calculator())
g.addPins(removeDuplicatedPins(g.calculator()))
}
func (g *Grid) CalculateArithmeticPins() {

View File

@ -214,3 +214,54 @@ func Test_calculateArithmeticPins(t *testing.T) {
})
}
}
func Test_filterPrice1(t *testing.T) {
type args struct {
p fixedpoint.Value
prec int
}
tests := []struct {
name string
args args
want string
}{
{
name: "basic",
args: args{p: number("31.2222"), prec: 3},
want: "31.222",
},
{
name: "roundup",
args: args{p: number("31.22295"), prec: 3},
want: "31.223",
},
{
name: "roundup2",
args: args{p: number("31.22290"), prec: 3},
want: "31.222",
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
rst := filterPrice(tt.args.p, tt.args.prec)
assert.Equalf(t, tt.want, rst.String(), "filterPrice(%v, %v)", tt.args.p, tt.args.prec)
})
}
}
func Test_removeDuplicatedPins(t *testing.T) {
pins := []Pin{
Pin(number("31.222")),
Pin(number("31.222")),
Pin(number("31.223")),
Pin(number("31.224")),
Pin(number("31.224")),
}
out := removeDuplicatedPins(pins)
assert.Equal(t, []Pin{
Pin(number("31.222")),
Pin(number("31.223")),
Pin(number("31.224")),
}, out)
}