diff --git a/pkg/exchange/bitget/bitgetapi/v2/get_symbols_request.go b/pkg/exchange/bitget/bitgetapi/v2/get_symbols_request.go index cab2ed554..180c6d9d8 100644 --- a/pkg/exchange/bitget/bitgetapi/v2/get_symbols_request.go +++ b/pkg/exchange/bitget/bitgetapi/v2/get_symbols_request.go @@ -12,12 +12,14 @@ import ( type SymbolStatus string const ( - // SymbolOffline represent market is suspended, users cannot trade. - SymbolOffline SymbolStatus = "offline" - // SymbolGray represents market is online, but user trading is not available. - SymbolGray SymbolStatus = "gray" - // SymbolOnline trading begins, users can trade. - SymbolOnline SymbolStatus = "online" + // SymbolStatusOffline represent market is suspended, users cannot trade. + SymbolStatusOffline SymbolStatus = "offline" + + // SymbolStatusGray represents market is online, but user trading is not available. + SymbolStatusGray SymbolStatus = "gray" + + // SymbolStatusOnline trading begins, users can trade. + SymbolStatusOnline SymbolStatus = "online" ) type Symbol struct { diff --git a/pkg/exchange/bitget/bitgetapi/v2/get_symbols_request_requestgen.go b/pkg/exchange/bitget/bitgetapi/v2/get_symbols_request_requestgen.go index 700583094..b91ad44c9 100644 --- a/pkg/exchange/bitget/bitgetapi/v2/get_symbols_request_requestgen.go +++ b/pkg/exchange/bitget/bitgetapi/v2/get_symbols_request_requestgen.go @@ -137,15 +137,29 @@ func (g *GetSymbolsRequest) Do(ctx context.Context) ([]Symbol, error) { } var apiResponse bitgetapi.APIResponse - if err := response.DecodeJSON(&apiResponse); err != nil { - return nil, err + + type responseUnmarshaler interface { + Unmarshal(data []byte) error + } + + if unmarshaler, ok := interface{}(&apiResponse).(responseUnmarshaler); ok { + if err := unmarshaler.Unmarshal(response.Body); err != nil { + return nil, err + } + } else { + // The line below checks the content type, however, some API server might not send the correct content type header, + // Hence, this is commented for backward compatibility + // response.IsJSON() + if err := response.DecodeJSON(&apiResponse); err != nil { + return nil, err + } } type responseValidator interface { Validate() error } - validator, ok := interface{}(apiResponse).(responseValidator) - if ok { + + if validator, ok := interface{}(&apiResponse).(responseValidator); ok { if err := validator.Validate(); err != nil { return nil, err } diff --git a/pkg/exchange/bitget/convert.go b/pkg/exchange/bitget/convert.go index 9e6a65504..54ca48498 100644 --- a/pkg/exchange/bitget/convert.go +++ b/pkg/exchange/bitget/convert.go @@ -25,9 +25,10 @@ func toGlobalBalance(asset v2.AccountAsset) types.Balance { } func toGlobalMarket(s v2.Symbol) types.Market { - if s.Status != v2.SymbolOnline { - log.Warnf("The symbol %s is not online", s.Symbol) + if s.Status != v2.SymbolStatusOnline { + log.Warnf("The market symbol status %s is not online: %s", s.Symbol, s.Status) } + return types.Market{ Symbol: s.Symbol, LocalSymbol: s.Symbol, diff --git a/pkg/exchange/bitget/convert_test.go b/pkg/exchange/bitget/convert_test.go index cf3f0ab94..6f34b5021 100644 --- a/pkg/exchange/bitget/convert_test.go +++ b/pkg/exchange/bitget/convert_test.go @@ -44,7 +44,7 @@ func Test_toGlobalBalance(t *testing.T) { func Test_toGlobalMarket(t *testing.T) { // sample: - //{ + // { // "symbol":"BTCUSDT", // "baseCoin":"BTC", // "quoteCoin":"USDT", @@ -59,7 +59,7 @@ func Test_toGlobalMarket(t *testing.T) { // "minTradeUSDT":"5", // "buyLimitPriceRatio":"0.05", // "sellLimitPriceRatio":"0.05" - //} + // } inst := v2.Symbol{ Symbol: "BTCUSDT", BaseCoin: "BTC", @@ -72,7 +72,7 @@ func Test_toGlobalMarket(t *testing.T) { QuantityPrecision: fixedpoint.NewFromFloat(4), QuotePrecision: fixedpoint.NewFromFloat(6), MinTradeUSDT: fixedpoint.NewFromFloat(5), - Status: v2.SymbolOnline, + Status: v2.SymbolStatusOnline, BuyLimitPriceRatio: fixedpoint.NewFromFloat(0.05), SellLimitPriceRatio: fixedpoint.NewFromFloat(0.05), } @@ -99,7 +99,7 @@ func Test_toGlobalMarket(t *testing.T) { func Test_toGlobalTicker(t *testing.T) { // sample: - //{ + // { // "open":"36465.96", // "symbol":"BTCUSDT", // "high24h":"37040.25", @@ -116,7 +116,7 @@ func Test_toGlobalTicker(t *testing.T) { // "openUtc":"36465.96", // "changeUtc24h":"0.00599", // "change24h":"-0.00426" - //} + // } ticker := v2.Ticker{ Symbol: "BTCUSDT", High24H: fixedpoint.NewFromFloat(24175.65), @@ -540,7 +540,7 @@ func Test_toGlobalTrade(t *testing.T) { // "tradeScope":"taker", // "cTime":"1699020564676", // "uTime":"1699020564687" - //} + // } trade := v2.Trade{ UserId: types.StrInt64(8672173294), Symbol: "APEUSDT", diff --git a/pkg/exchange/bitget/exchange.go b/pkg/exchange/bitget/exchange.go index 894c5fc4e..7d4fc67c9 100644 --- a/pkg/exchange/bitget/exchange.go +++ b/pkg/exchange/bitget/exchange.go @@ -111,6 +111,11 @@ func (e *Exchange) QueryMarkets(ctx context.Context) (types.MarketMap, error) { markets := types.MarketMap{} for _, s := range symbols { + if s.Status == v2.SymbolStatusOffline { + // ignore offline symbols + continue + } + markets[s.Symbol] = toGlobalMarket(s) }