bbgo: truncate trade buffer if it gets too large

This commit is contained in:
c9s 2023-11-17 17:11:22 +08:00
parent c248b2a323
commit eac0195815
No known key found for this signature in database
GPG Key ID: 7385E7E464CB0A54
3 changed files with 32 additions and 8 deletions

View File

@ -329,6 +329,8 @@ type ServiceConfig struct {
type EnvironmentConfig struct { type EnvironmentConfig struct {
DisableDefaultKLineSubscription bool `json:"disableDefaultKLineSubscription"` DisableDefaultKLineSubscription bool `json:"disableDefaultKLineSubscription"`
DisableHistoryKLinePreload bool `json:"disableHistoryKLinePreload"` DisableHistoryKLinePreload bool `json:"disableHistoryKLinePreload"`
DisableSessionTradeBuffer bool `json:"disableSessionTradeBuffer"`
MaxSessionTradeBufferSize int `json:"maxSessionTradeBufferSize"`
} }
type Config struct { type Config struct {

View File

@ -396,14 +396,27 @@ func (session *ExchangeSession) initSymbol(ctx context.Context, environ *Environ
return fmt.Errorf("market %s is not defined", symbol) return fmt.Errorf("market %s is not defined", symbol)
} }
disableSessionTradeBuffer := environ.environmentConfig != nil && environ.environmentConfig.DisableSessionTradeBuffer
maxSessionTradeBufferSize := 0
if environ.environmentConfig != nil && environ.environmentConfig.MaxSessionTradeBufferSize > 0 {
maxSessionTradeBufferSize = environ.environmentConfig.MaxSessionTradeBufferSize
}
session.Trades[symbol] = &types.TradeSlice{Trades: nil} session.Trades[symbol] = &types.TradeSlice{Trades: nil}
if !disableSessionTradeBuffer {
session.UserDataStream.OnTradeUpdate(func(trade types.Trade) { session.UserDataStream.OnTradeUpdate(func(trade types.Trade) {
if trade.Symbol != symbol { if trade.Symbol != symbol {
return return
} }
session.Trades[symbol].Append(trade) session.Trades[symbol].Append(trade)
if maxSessionTradeBufferSize > 0 {
session.Trades[symbol].Truncate(maxSessionTradeBufferSize)
}
}) })
}
// session wide position // session wide position
position := &types.Position{ position := &types.Position{
@ -416,7 +429,6 @@ func (session *ExchangeSession) initSymbol(ctx context.Context, environ *Environ
orderStore := core.NewOrderStore(symbol) orderStore := core.NewOrderStore(symbol)
orderStore.AddOrderUpdate = true orderStore.AddOrderUpdate = true
orderStore.BindStream(session.UserDataStream) orderStore.BindStream(session.UserDataStream)
session.orderStores[symbol] = orderStore session.orderStores[symbol] = orderStore

View File

@ -47,6 +47,16 @@ func (s *TradeSlice) Append(t Trade) {
s.mu.Unlock() s.mu.Unlock()
} }
func (s *TradeSlice) Truncate(size int) {
s.mu.Lock()
if len(s.Trades) > size {
s.Trades = s.Trades[len(s.Trades)-1-size:]
}
s.mu.Unlock()
}
type Trade struct { type Trade struct {
// GID is the global ID // GID is the global ID
GID int64 `json:"gid" db:"gid"` GID int64 `json:"gid" db:"gid"`