From 33deaea6e5d9a94462027027332244c9d494ccd2 Mon Sep 17 00:00:00 2001 From: c9s Date: Mon, 8 Jan 2024 17:46:09 +0800 Subject: [PATCH 1/3] bitget: bitget ignore offline symbols --- .../bitget/bitgetapi/v2/get_symbols_request.go | 14 ++++++++------ pkg/exchange/bitget/convert.go | 3 ++- pkg/exchange/bitget/convert_test.go | 12 ++++++------ pkg/exchange/bitget/exchange.go | 5 +++++ 4 files changed, 21 insertions(+), 13 deletions(-) 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/convert.go b/pkg/exchange/bitget/convert.go index 9e6a65504..ae9ae4acc 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 { + if s.Status != v2.SymbolStatusOnline { log.Warnf("The symbol %s is not online", s.Symbol) } + 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) } From cfe3b6466c396bc47e6f5c276dc1aecab5f1b1a4 Mon Sep 17 00:00:00 2001 From: c9s Date: Mon, 8 Jan 2024 17:47:52 +0800 Subject: [PATCH 2/3] update bitget v2 get_symbols_request_requestgen --- .../v2/get_symbols_request_requestgen.go | 22 +++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) 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 } From e358da10ddd229abe55b3b7970b18c56062d254d Mon Sep 17 00:00:00 2001 From: c9s Date: Mon, 8 Jan 2024 18:13:26 +0800 Subject: [PATCH 3/3] bitget: log symbol status --- pkg/exchange/bitget/convert.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/exchange/bitget/convert.go b/pkg/exchange/bitget/convert.go index ae9ae4acc..54ca48498 100644 --- a/pkg/exchange/bitget/convert.go +++ b/pkg/exchange/bitget/convert.go @@ -26,7 +26,7 @@ func toGlobalBalance(asset v2.AccountAsset) types.Balance { func toGlobalMarket(s v2.Symbol) types.Market { if s.Status != v2.SymbolStatusOnline { - log.Warnf("The symbol %s is not online", s.Symbol) + log.Warnf("The market symbol status %s is not online: %s", s.Symbol, s.Status) } return types.Market{