diff --git a/pkg/core/tradecollector.go b/pkg/core/tradecollector.go index 9622e912c..ed581704f 100644 --- a/pkg/core/tradecollector.go +++ b/pkg/core/tradecollector.go @@ -32,9 +32,11 @@ func (s *ConverterSetting) InitializeConverter() (Converter, error) { logrus.Infof("initializing converter %T ...", converter) err := converter.Initialize() - return nil, err + return converter, err } +// ConverterManager manages the converters for trade conversion +// It can be used to convert the trade symbol into the target symbol, or convert the price, volume into different units. type ConverterManager struct { ConverterSettings []ConverterSetting `json:"converters,omitempty" yaml:"converters,omitempty"` @@ -43,15 +45,18 @@ type ConverterManager struct { func (c *ConverterManager) Initialize() error { for _, setting := range c.ConverterSettings { - converter, err := setting.InitializeConverter() if err != nil { return err } - c.AddConverter(converter) + if converter != nil { + c.AddConverter(converter) + } } + numConverters := len(c.converters) + logrus.Infof("%d converters loaded", numConverters) return nil } diff --git a/pkg/core/tradecollector_test.go b/pkg/core/tradecollector_test.go index 0b1f8772f..8f9ccf841 100644 --- a/pkg/core/tradecollector_test.go +++ b/pkg/core/tradecollector_test.go @@ -9,6 +9,28 @@ import ( "github.com/c9s/bbgo/pkg/types" ) +func TestTradeCollector_NilConvertManager(t *testing.T) { + symbol := "BTCUSDT" + position := types.NewPosition(symbol, "BTC", "USDT") + orderStore := NewOrderStore(symbol) + collector := NewTradeCollector(symbol, position, orderStore) + + trade := types.Trade{ + ID: 1, + OrderID: 399, + Exchange: types.ExchangeBinance, + Price: fixedpoint.NewFromInt(40000), + Quantity: fixedpoint.One, + QuoteQuantity: fixedpoint.NewFromInt(40000), + Symbol: "BTCUSDT", + Side: types.SideTypeBuy, + IsBuyer: true, + } + + trade = collector.ConvertTrade(trade) + assert.Equal(t, "BTCUSDT", trade.Symbol) +} + func TestTradeCollector_ShouldNotCountDuplicatedTrade(t *testing.T) { symbol := "BTCUSDT" position := types.NewPosition(symbol, "BTC", "USDT") diff --git a/pkg/types/position.go b/pkg/types/position.go index d0b37f031..2d71ee740 100644 --- a/pkg/types/position.go +++ b/pkg/types/position.go @@ -190,6 +190,7 @@ func (p *Position) NewMarketCloseOrder(percentage fixedpoint.Value) *SubmitOrder } } +// IsDust checks if the position is dust, the first argument is the price to calculate the dust quantity func (p *Position) IsDust(a ...fixedpoint.Value) bool { price := p.AverageCost if len(a) > 0 { @@ -448,6 +449,7 @@ func (p *Position) String() string { ) } +// BindStream binds the trade update callback and update the position func (p *Position) BindStream(stream Stream) { stream.OnTradeUpdate(func(trade Trade) { if p.Symbol == trade.Symbol { @@ -540,7 +542,7 @@ func (p *Position) AddTrade(td Trade) (profit fixedpoint.Value, netProfit fixedp p.addTradeFee(td) // Base > 0 means we're in long position - // Base < 0 means we're in short position + // Base < 0 means we're in short position switch td.Side { case SideTypeBuy: