From 9911a4f711daf4bbe649c7bf4bd1ff569c74e430 Mon Sep 17 00:00:00 2001 From: c9s Date: Mon, 12 Aug 2024 15:56:24 +0800 Subject: [PATCH] all: fix converter initialization --- pkg/core/converter.go | 14 ++++++++- pkg/core/tradecollector.go | 47 +++++++++++++++++++++++----- pkg/strategy/xdepthmaker/strategy.go | 4 +++ 3 files changed, 56 insertions(+), 9 deletions(-) diff --git a/pkg/core/converter.go b/pkg/core/converter.go index 6f6578b08..a154e2758 100644 --- a/pkg/core/converter.go +++ b/pkg/core/converter.go @@ -1,6 +1,10 @@ package core -import "github.com/c9s/bbgo/pkg/types" +import ( + "errors" + + "github.com/c9s/bbgo/pkg/types" +) type Converter interface { OrderConverter @@ -53,6 +57,14 @@ func NewSymbolConverter(fromSymbol, toSymbol string) *SymbolConverter { } func (c *SymbolConverter) Initialize() error { + if c.ToSymbol == "" { + return errors.New("toSymbol can not be empty") + } + + if c.FromSymbol == "" { + return errors.New("fromSymbol can not be empty") + } + return nil } diff --git a/pkg/core/tradecollector.go b/pkg/core/tradecollector.go index 7dda8b686..9622e912c 100644 --- a/pkg/core/tradecollector.go +++ b/pkg/core/tradecollector.go @@ -12,28 +12,59 @@ import ( "github.com/c9s/bbgo/pkg/types" ) +type ConverterSetting struct { + SymbolConverter *SymbolConverter `json:"symbolConverter" yaml:"symbolConverter"` +} + +func (s *ConverterSetting) getConverter() Converter { + if s.SymbolConverter != nil { + return s.SymbolConverter + } + + return nil +} + +func (s *ConverterSetting) InitializeConverter() (Converter, error) { + converter := s.getConverter() + if converter == nil { + return nil, nil + } + + logrus.Infof("initializing converter %T ...", converter) + err := converter.Initialize() + return nil, err +} + type ConverterManager struct { - Converters []Converter `json:"converters,omitempty" yaml:"converters,omitempty"` + ConverterSettings []ConverterSetting `json:"converters,omitempty" yaml:"converters,omitempty"` + + converters []Converter } func (c *ConverterManager) Initialize() error { - for _, converter := range c.Converters { - _ = converter + for _, setting := range c.ConverterSettings { + + converter, err := setting.InitializeConverter() + if err != nil { + return err + } + + c.AddConverter(converter) } return nil } func (c *ConverterManager) AddConverter(converter Converter) { - c.Converters = append(c.Converters, converter) + c.converters = append(c.converters, converter) } func (c *ConverterManager) ConvertOrder(order types.Order) types.Order { - if len(c.Converters) == 0 { + if len(c.converters) == 0 { return order } - for _, converter := range c.Converters { + for _, converter := range c.converters { convOrder, err := converter.ConvertOrder(order) if err != nil { logrus.WithError(err).Errorf("converter %+v error, order: %s", converter, order.String()) @@ -47,11 +78,11 @@ func (c *ConverterManager) ConvertOrder(order types.Order) types.Order { } func (c *ConverterManager) ConvertTrade(trade types.Trade) types.Trade { - if len(c.Converters) == 0 { + if len(c.converters) == 0 { return trade } - for _, converter := range c.Converters { + for _, converter := range c.converters { convTrade, err := converter.ConvertTrade(trade) if err != nil { logrus.WithError(err).Errorf("converter %+v error, trade: %s", converter, trade.String()) diff --git a/pkg/strategy/xdepthmaker/strategy.go b/pkg/strategy/xdepthmaker/strategy.go index 9e35997aa..103c50bf4 100644 --- a/pkg/strategy/xdepthmaker/strategy.go +++ b/pkg/strategy/xdepthmaker/strategy.go @@ -82,6 +82,10 @@ func (s *CrossExchangeMarketMakingStrategy) Initialize( return fmt.Errorf("maker session market %s is not defined", symbol) } + if err := s.ConverterManager.Initialize(); err != nil { + return err + } + if s.ProfitStats == nil { s.ProfitStats = types.NewProfitStats(s.makerMarket) }