mirror of
https://github.com/c9s/bbgo.git
synced 2024-11-10 09:11:55 +00:00
Merge pull request #1239 from c9s/c0s/grid2-remove-duplicated-pins
This commit is contained in:
commit
3da7eb0b42
4
.github/workflows/go.yml
vendored
4
.github/workflows/go.yml
vendored
|
@ -4,7 +4,9 @@ on:
|
|||
push:
|
||||
branches: [ main ]
|
||||
pull_request:
|
||||
branches: [ main ]
|
||||
branches:
|
||||
- "main"
|
||||
- "v*"
|
||||
|
||||
jobs:
|
||||
build:
|
||||
|
|
|
@ -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() {
|
||||
|
|
|
@ -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)
|
||||
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user