2024-09-27 09:53:21 +00:00
|
|
|
package bbgo
|
2024-08-18 05:16:55 +00:00
|
|
|
|
|
|
|
import (
|
|
|
|
"time"
|
|
|
|
|
2024-09-27 12:00:48 +00:00
|
|
|
"github.com/c9s/bbgo/pkg/fixedpoint"
|
2024-08-18 05:16:55 +00:00
|
|
|
"github.com/c9s/bbgo/pkg/types"
|
|
|
|
)
|
|
|
|
|
|
|
|
// BboMonitor monitors the best bid and ask price and volume.
|
|
|
|
//
|
|
|
|
//go:generate callbackgen -type BboMonitor
|
|
|
|
type BboMonitor struct {
|
|
|
|
Bid types.PriceVolume
|
|
|
|
Ask types.PriceVolume
|
|
|
|
UpdatedTime time.Time
|
|
|
|
|
2024-09-27 12:00:48 +00:00
|
|
|
priceImpactRatio fixedpoint.Value
|
|
|
|
|
2024-08-18 05:16:55 +00:00
|
|
|
updateCallbacks []func(bid, ask types.PriceVolume)
|
|
|
|
}
|
|
|
|
|
|
|
|
func NewBboMonitor() *BboMonitor {
|
|
|
|
return &BboMonitor{}
|
|
|
|
}
|
|
|
|
|
2024-09-27 12:00:48 +00:00
|
|
|
func (m *BboMonitor) SetPriceImpactRatio(ratio fixedpoint.Value) {
|
|
|
|
m.priceImpactRatio = ratio
|
|
|
|
}
|
|
|
|
|
2024-08-20 09:47:39 +00:00
|
|
|
func (m *BboMonitor) UpdateFromBook(book *types.StreamOrderBook) bool {
|
2024-08-18 05:16:55 +00:00
|
|
|
bestBid, ok1 := book.BestBid()
|
|
|
|
bestAsk, ok2 := book.BestAsk()
|
|
|
|
if !ok1 || !ok2 {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
|
|
|
return m.Update(bestBid, bestAsk, book.LastUpdateTime())
|
|
|
|
}
|
|
|
|
|
|
|
|
func (m *BboMonitor) Update(bid, ask types.PriceVolume, t time.Time) bool {
|
|
|
|
changed := false
|
|
|
|
if m.Bid.Price.Compare(bid.Price) != 0 || m.Bid.Volume.Compare(bid.Volume) != 0 {
|
2024-09-27 12:00:48 +00:00
|
|
|
if m.priceImpactRatio.IsZero() {
|
|
|
|
changed = true
|
|
|
|
} else {
|
|
|
|
if bid.Price.Sub(m.Bid.Price).Abs().Div(m.Bid.Price).Compare(m.priceImpactRatio) >= 0 {
|
|
|
|
changed = true
|
|
|
|
}
|
|
|
|
}
|
2024-08-18 05:16:55 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if m.Ask.Price.Compare(ask.Price) != 0 || m.Ask.Volume.Compare(ask.Volume) != 0 {
|
2024-09-27 12:00:48 +00:00
|
|
|
if m.priceImpactRatio.IsZero() {
|
|
|
|
changed = true
|
|
|
|
} else {
|
|
|
|
if ask.Price.Sub(m.Ask.Price).Abs().Div(m.Ask.Price).Compare(m.priceImpactRatio) >= 0 {
|
|
|
|
changed = true
|
|
|
|
}
|
|
|
|
}
|
2024-08-18 05:16:55 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
m.Bid = bid
|
|
|
|
m.Ask = ask
|
|
|
|
m.UpdatedTime = t
|
|
|
|
|
|
|
|
if changed {
|
|
|
|
m.EmitUpdate(bid, ask)
|
|
|
|
}
|
|
|
|
|
|
|
|
return changed
|
|
|
|
}
|