mirror of
https://github.com/c9s/bbgo.git
synced 2024-11-26 08:45:16 +00:00
xmaker: add price quoting protection
This commit is contained in:
parent
0e927a9a06
commit
7195c6ed27
|
@ -22,6 +22,8 @@ import (
|
||||||
|
|
||||||
var defaultMargin = fixedpoint.NewFromFloat(0.003)
|
var defaultMargin = fixedpoint.NewFromFloat(0.003)
|
||||||
|
|
||||||
|
const priceNotUpdatingTimeout = 30 * time.Second
|
||||||
|
|
||||||
const ID = "xmaker"
|
const ID = "xmaker"
|
||||||
|
|
||||||
const stateKey = "state-v1"
|
const stateKey = "state-v1"
|
||||||
|
@ -105,6 +107,9 @@ type Strategy struct {
|
||||||
orderStore *bbgo.OrderStore
|
orderStore *bbgo.OrderStore
|
||||||
tradeCollector *bbgo.TradeCollector
|
tradeCollector *bbgo.TradeCollector
|
||||||
|
|
||||||
|
lastBidPrice, lastAskPrice fixedpoint.Value
|
||||||
|
lastBidPriceTime, lastAskPriceTime time.Time
|
||||||
|
|
||||||
lastPrice float64
|
lastPrice float64
|
||||||
groupID uint32
|
groupID uint32
|
||||||
|
|
||||||
|
@ -185,6 +190,42 @@ func (s *Strategy) updateQuote(ctx context.Context, orderExecutionRouter bbgo.Or
|
||||||
// use mid-price for the last price
|
// use mid-price for the last price
|
||||||
s.lastPrice = (bestBid.Price + bestAsk.Price).Float64() / 2
|
s.lastPrice = (bestBid.Price + bestAsk.Price).Float64() / 2
|
||||||
|
|
||||||
|
if s.lastBidPrice == 0 {
|
||||||
|
s.lastBidPrice = bestBid.Price
|
||||||
|
s.lastBidPriceTime = time.Now()
|
||||||
|
} else if s.lastBidPrice != bestBid.Price {
|
||||||
|
s.lastBidPrice = bestAsk.Price
|
||||||
|
s.lastBidPriceTime = time.Now()
|
||||||
|
} else {
|
||||||
|
// same price, check time
|
||||||
|
if time.Since(s.lastBidPriceTime) > priceNotUpdatingTimeout {
|
||||||
|
log.Errorf("%s bid price %f has not been updating for %s, last update: %s, skip quoting",
|
||||||
|
s.Symbol,
|
||||||
|
s.lastBidPrice.Float64(),
|
||||||
|
priceNotUpdatingTimeout,
|
||||||
|
s.lastBidPriceTime)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if s.lastAskPrice == 0 {
|
||||||
|
s.lastAskPrice = bestAsk.Price
|
||||||
|
s.lastAskPriceTime = time.Now()
|
||||||
|
} else if s.lastAskPrice != bestAsk.Price {
|
||||||
|
s.lastAskPrice = bestAsk.Price
|
||||||
|
s.lastAskPriceTime = time.Now()
|
||||||
|
} else {
|
||||||
|
// same price, check time
|
||||||
|
if time.Since(s.lastAskPriceTime) > priceNotUpdatingTimeout {
|
||||||
|
log.Errorf("%s ask price %f has not been updating for %s, last update: %s, skip quoting",
|
||||||
|
s.Symbol,
|
||||||
|
s.lastAskPrice.Float64(),
|
||||||
|
priceNotUpdatingTimeout,
|
||||||
|
s.lastAskPriceTime)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
sourceBook := s.book.CopyDepth(20)
|
sourceBook := s.book.CopyDepth(20)
|
||||||
if valid, err := sourceBook.IsValid(); !valid {
|
if valid, err := sourceBook.IsValid(); !valid {
|
||||||
log.WithError(err).Errorf("%s invalid copied order book, skip quoting: %v", s.Symbol, err)
|
log.WithError(err).Errorf("%s invalid copied order book, skip quoting: %v", s.Symbol, err)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user