mirror of
https://github.com/c9s/bbgo.git
synced 2024-11-10 01:01:56 +00:00
grid2: refactor check spread
This commit is contained in:
parent
02bebe8ed1
commit
489b025702
|
@ -36,7 +36,7 @@ exchangeStrategies:
|
|||
symbol: BTCUSDT
|
||||
upperPrice: 18_000.0
|
||||
lowerPrice: 16_000.0
|
||||
gridNumber: 200
|
||||
gridNumber: 100
|
||||
|
||||
## compound is used for buying more inventory when the profit is made by the filled SELL order.
|
||||
## when compound is disabled, fixed quantity is used for each grid order.
|
||||
|
@ -70,12 +70,12 @@ exchangeStrategies:
|
|||
# amount: 10.0
|
||||
|
||||
## 2) fixed quantity: it will use your balance to place orders with the fixed quantity. e.g. 0.001 BTC
|
||||
# quantity: 0.001
|
||||
quantity: 0.001
|
||||
|
||||
## 3) quoteInvestment and baseInvestment: when using quoteInvestment, the strategy will automatically calculate your best quantity for the whole grid.
|
||||
## quoteInvestment is required, and baseInvestment is optional (could be zero)
|
||||
## if you have existing BTC position and want to reuse it you can set the baseInvestment.
|
||||
quoteInvestment: 10_000
|
||||
# quoteInvestment: 10_000
|
||||
# baseInvestment: 1.0
|
||||
|
||||
feeRate: 0.075%
|
||||
|
|
|
@ -136,17 +136,8 @@ func (s *Strategy) Validate() error {
|
|||
s.FeeRate = fixedpoint.NewFromFloat(0.1 * 0.01) // 0.1%, 0.075% with BNB
|
||||
}
|
||||
|
||||
if !s.ProfitSpread.IsZero() {
|
||||
// the min fee rate from 2 maker/taker orders (with 0.1 rate for profit)
|
||||
gridFeeRate := s.FeeRate.Mul(fixedpoint.NewFromFloat(2.01))
|
||||
|
||||
if s.ProfitSpread.Div(s.LowerPrice).Compare(gridFeeRate) < 0 {
|
||||
return fmt.Errorf("profitSpread %f %s is too small for lower price, less than the fee rate: %s", s.ProfitSpread.Float64(), s.ProfitSpread.Div(s.LowerPrice).Percentage(), s.FeeRate.Percentage())
|
||||
}
|
||||
|
||||
if s.ProfitSpread.Div(s.UpperPrice).Compare(gridFeeRate) < 0 {
|
||||
return fmt.Errorf("profitSpread %f %s is too small for upper price, less than the fee rate: %s", s.ProfitSpread.Float64(), s.ProfitSpread.Div(s.UpperPrice).Percentage(), s.FeeRate.Percentage())
|
||||
}
|
||||
if err := s.checkSpread(); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if err := s.QuantityOrAmount.Validate(); err != nil {
|
||||
|
@ -171,6 +162,32 @@ func (s *Strategy) InstanceID() string {
|
|||
return fmt.Sprintf("%s-%s-%d-%d-%d", ID, s.Symbol, s.GridNum, s.UpperPrice.Int(), s.LowerPrice.Int())
|
||||
}
|
||||
|
||||
func (s *Strategy) checkSpread() error {
|
||||
gridNum := fixedpoint.NewFromInt(s.GridNum)
|
||||
spread := s.ProfitSpread
|
||||
if spread.IsZero() {
|
||||
spread = s.UpperPrice.Sub(s.LowerPrice).Div(gridNum)
|
||||
}
|
||||
|
||||
feeRate := s.FeeRate
|
||||
if feeRate.IsZero() {
|
||||
feeRate = fixedpoint.NewFromFloat(0.075 * 0.01)
|
||||
}
|
||||
|
||||
// the min fee rate from 2 maker/taker orders (with 0.1 rate for profit)
|
||||
gridFeeRate := feeRate.Mul(fixedpoint.NewFromFloat(2.01))
|
||||
|
||||
if spread.Div(s.LowerPrice).Compare(gridFeeRate) < 0 {
|
||||
return fmt.Errorf("profitSpread %f %s is too small for lower price, less than the grid fee rate: %s", spread.Float64(), spread.Div(s.LowerPrice).Percentage(), gridFeeRate.Percentage())
|
||||
}
|
||||
|
||||
if spread.Div(s.UpperPrice).Compare(gridFeeRate) < 0 {
|
||||
return fmt.Errorf("profitSpread %f %s is too small for upper price, less than the grid fee rate: %s", spread.Float64(), spread.Div(s.UpperPrice).Percentage(), gridFeeRate.Percentage())
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *Strategy) handleOrderCanceled(o types.Order) {
|
||||
s.logger.Infof("GRID ORDER CANCELED: %s", o.String())
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user