xdepthmaker: improve and fix order generator

This commit is contained in:
c9s 2024-11-17 17:30:48 +08:00
parent 39b2354f08
commit fa2c0be6a3
No known key found for this signature in database
GPG Key ID: 7385E7E464CB0A54
3 changed files with 19 additions and 13 deletions

View File

@ -1037,11 +1037,17 @@ func (s *Strategy) generateMakerOrders(
} }
if lastMakerPrice.Sign() > 0 && depthPrice.Compare(lastMakerPrice) == 0 { if lastMakerPrice.Sign() > 0 && depthPrice.Compare(lastMakerPrice) == 0 {
switch side { tickSize := s.makerMarket.TickSize
case types.SideTypeBuy: if tickSize.IsZero() {
depthPrice = depthPrice.Sub(s.makerMarket.TickSize.Mul(s.Pips)) s.logger.Warnf("maker market tick size is zero")
case types.SideTypeSell: } else if tickSize.Sign() > 0 {
depthPrice = depthPrice.Add(s.makerMarket.TickSize.Mul(s.Pips)) tickSize = s.makerMarket.TickSize.Mul(s.Pips)
switch side {
case types.SideTypeBuy:
depthPrice = depthPrice.Sub(tickSize)
case types.SideTypeSell:
depthPrice = depthPrice.Add(tickSize)
}
} }
} }
@ -1056,15 +1062,15 @@ func (s *Strategy) generateMakerOrders(
accumulatedBidQuantity = accumulatedBidQuantity.Add(quantity) accumulatedBidQuantity = accumulatedBidQuantity.Add(quantity)
quoteQuantity := fixedpoint.Mul(quantity, depthPrice) quoteQuantity := fixedpoint.Mul(quantity, depthPrice)
quoteQuantity = quoteQuantity.Round(s.makerMarket.PricePrecision, fixedpoint.Up) quoteQuantity = quoteQuantity.Round(s.makerMarket.PricePrecision, fixedpoint.Down)
if !availableSideBalance.Eq(fixedpoint.PosInf) && availableSideBalance.Compare(quoteQuantity) <= 0 { if !availableSideBalance.Eq(fixedpoint.PosInf) && availableSideBalance.Compare(quoteQuantity) <= 0 {
quoteQuantity = availableSideBalance quoteQuantity = availableSideBalance
quantity = quoteQuantity.Div(depthPrice).Round(s.makerMarket.PricePrecision, fixedpoint.Down) quantity = quoteQuantity.Div(depthPrice).Round(s.makerMarket.PricePrecision, fixedpoint.Down)
} }
if quantity.Compare(s.makerMarket.MinQuantity) <= 0 || quoteQuantity.Compare(s.makerMarket.MinNotional) <= 0 { if s.makerMarket.IsDustQuantity(quantity, depthPrice) {
break layerLoop continue layerLoop
} }
availableSideBalance = availableSideBalance.Sub(quoteQuantity) availableSideBalance = availableSideBalance.Sub(quoteQuantity)
@ -1073,19 +1079,17 @@ func (s *Strategy) generateMakerOrders(
case types.SideTypeSell: case types.SideTypeSell:
quantity = quantity.Sub(accumulatedAskQuantity) quantity = quantity.Sub(accumulatedAskQuantity)
quoteQuantity := quantity.Mul(depthPrice)
// balance check // balance check
if !availableSideBalance.Eq(fixedpoint.PosInf) && availableSideBalance.Compare(quantity) <= 0 { if !availableSideBalance.Eq(fixedpoint.PosInf) && availableSideBalance.Compare(quantity) <= 0 {
break layerLoop break layerLoop
} }
if quantity.Compare(s.makerMarket.MinQuantity) <= 0 || quoteQuantity.Compare(s.makerMarket.MinNotional) <= 0 { if s.makerMarket.IsDustQuantity(quantity, depthPrice) {
break layerLoop continue layerLoop
} }
availableSideBalance = availableSideBalance.Sub(quantity) availableSideBalance = availableSideBalance.Sub(quantity)
accumulatedAskQuantity = accumulatedAskQuantity.Add(quantity) accumulatedAskQuantity = accumulatedAskQuantity.Add(quantity)
} }

View File

@ -71,7 +71,7 @@ func TestStrategy_generateMakerOrders(t *testing.T) {
{Side: types.SideTypeBuy, Price: Number("24866.66"), Quantity: Number("0.281715")}, // =~ $7005.3111219, accumulated amount =~ $1000.00 + $7005.3111219 = $8005.3111219 {Side: types.SideTypeBuy, Price: Number("24866.66"), Quantity: Number("0.281715")}, // =~ $7005.3111219, accumulated amount =~ $1000.00 + $7005.3111219 = $8005.3111219
{Side: types.SideTypeBuy, Price: Number("24800"), Quantity: Number("0.283123")}, // =~ $7021.4504, accumulated amount =~ $1000.00 + $7005.3111219 + $7021.4504 = $8005.3111219 + $7021.4504 =~ $15026.7615219 {Side: types.SideTypeBuy, Price: Number("24800"), Quantity: Number("0.283123")}, // =~ $7021.4504, accumulated amount =~ $1000.00 + $7005.3111219 + $7021.4504 = $8005.3111219 + $7021.4504 =~ $15026.7615219
{Side: types.SideTypeSell, Price: Number("25100"), Quantity: Number("0.03984")}, {Side: types.SideTypeSell, Price: Number("25100"), Quantity: Number("0.03984")},
{Side: types.SideTypeSell, Price: Number("25233.33"), Quantity: Number("0.2772")}, {Side: types.SideTypeSell, Price: Number("25233.34"), Quantity: Number("0.2772")},
{Side: types.SideTypeSell, Price: Number("25300"), Quantity: Number("0.275845")}, {Side: types.SideTypeSell, Price: Number("25300"), Quantity: Number("0.275845")},
}, orders) }, orders)
} }

View File

@ -254,6 +254,8 @@ func ParsePriceVolumeSliceJSON(b []byte) (slice PriceVolumeSlice, err error) {
return slice, nil return slice, nil
} }
// AverageDepthPriceByQuote calculates the average price by the required quote depth
// maxLevel is the maximum level to calculate the average price
func (slice PriceVolumeSlice) AverageDepthPriceByQuote(requiredDepthInQuote fixedpoint.Value, maxLevel int) fixedpoint.Value { func (slice PriceVolumeSlice) AverageDepthPriceByQuote(requiredDepthInQuote fixedpoint.Value, maxLevel int) fixedpoint.Value {
if len(slice) == 0 { if len(slice) == 0 {
return fixedpoint.Zero return fixedpoint.Zero