diff --git a/exchanges/bithumb/bithumb.go b/exchanges/bithumb/bithumb.go index d1658627..49ebcfbe 100644 --- a/exchanges/bithumb/bithumb.go +++ b/exchanges/bithumb/bithumb.go @@ -132,9 +132,23 @@ func (e *Exchange) GetOrderBook(ctx context.Context, symbol string) (*Orderbook, return nil, errors.New(response.Message) } + response.Data.Bids.FilterZeroQuantities() + response.Data.Asks.FilterZeroQuantities() + return &response, nil } +// FilterZeroQuantities filters out orderbook levels with zero quantity +func (o *OrderbookLevels) FilterZeroQuantities() { + b := (*o)[:0] + for _, x := range *o { + if x.Quantity > 0 { + b = append(b, x) + } + } + *o = b +} + // GetAssetStatus returns the withdrawal and deposit status for the symbol func (e *Exchange) GetAssetStatus(ctx context.Context, symbol string) (*Status, error) { if symbol == "" { diff --git a/exchanges/bithumb/bithumb_test.go b/exchanges/bithumb/bithumb_test.go index 0d45cd01..484da6be 100644 --- a/exchanges/bithumb/bithumb_test.go +++ b/exchanges/bithumb/bithumb_test.go @@ -88,6 +88,22 @@ func TestGetOrderBook(t *testing.T) { assert.NotEmpty(t, ob.Data.PaymentCurrency, "PaymentCurrency should not be empty") } +func TestOrderbookLevelsFilterZeroQuantities(t *testing.T) { + t.Parallel() + bids := OrderbookLevels{ + {Price: 99, Quantity: 0}, + {Price: 98, Quantity: 2}, + } + asks := OrderbookLevels{ + {Price: 100, Quantity: 0}, + {Price: 101, Quantity: 1}, + } + bids.FilterZeroQuantities() + asks.FilterZeroQuantities() + assert.Len(t, asks, 1, "Asks should have 1 item") + assert.Len(t, bids, 1, "Bids should have 1 item") +} + func TestGetTransactionHistory(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, e) diff --git a/exchanges/bithumb/bithumb_types.go b/exchanges/bithumb/bithumb_types.go index 00e58d49..40d5f8aa 100644 --- a/exchanges/bithumb/bithumb_types.go +++ b/exchanges/bithumb/bithumb_types.go @@ -40,17 +40,11 @@ type TickersResponse struct { type Orderbook struct { Status string `json:"status"` Data struct { - Timestamp types.Time `json:"timestamp"` - OrderCurrency string `json:"order_currency"` - PaymentCurrency string `json:"payment_currency"` - Bids []struct { - Quantity float64 `json:"quantity,string"` - Price float64 `json:"price,string"` - } `json:"bids"` - Asks []struct { - Quantity float64 `json:"quantity,string"` - Price float64 `json:"price,string"` - } `json:"asks"` + Timestamp types.Time `json:"timestamp"` + OrderCurrency string `json:"order_currency"` + PaymentCurrency string `json:"payment_currency"` + Bids OrderbookLevels `json:"bids"` + Asks OrderbookLevels `json:"asks"` } `json:"data"` Message string `json:"message"` } @@ -330,3 +324,12 @@ type StatusAll struct { } `json:"data"` Message string `json:"message"` } + +// OrderbookLevel defines a single level in the orderbook +type OrderbookLevel struct { + Quantity float64 `json:"quantity,string"` + Price float64 `json:"price,string"` +} + +// OrderbookLevels defines a slice of OrderbookLevel +type OrderbookLevels []OrderbookLevel