From 2b3c63c5b3a1f0d2429285bd35eca3ccee0d189a Mon Sep 17 00:00:00 2001 From: Gareth Kirwan Date: Thu, 28 Dec 2023 04:55:23 +0100 Subject: [PATCH] Exchanges: Convert bespoke Number types to types.Number (#1429) * Kucoin: Rename WsSpotTicker => WsSnapshot * Kucoin: Replace kucoinNumber => types.Number * Okcoin: Convert to types.Number * Gateio: Convert to types.Number * Okx: Convert to types.Number --- exchanges/gateio/gateio_convert.go | 30 ---- exchanges/gateio/gateio_test.go | 39 ---- exchanges/gateio/gateio_types.go | 258 +++++++++++++-------------- exchanges/kucoin/kucoin_convert.go | 41 ----- exchanges/kucoin/kucoin_test.go | 56 ------ exchanges/kucoin/kucoin_types.go | 21 +-- exchanges/kucoin/kucoin_websocket.go | 2 +- exchanges/okcoin/okcoin_convert.go | 39 ---- exchanges/okcoin/okcoin_test.go | 22 --- exchanges/okcoin/okcoin_types.go | 128 ++++++------- exchanges/okcoin/okcoin_websocket.go | 3 +- exchanges/okx/okx_type_convert.go | 29 --- exchanges/okx/okx_types.go | 244 ++++++++++++------------- types/number.go | 5 + 14 files changed, 334 insertions(+), 583 deletions(-) diff --git a/exchanges/gateio/gateio_convert.go b/exchanges/gateio/gateio_convert.go index 0bf3475c9bf..d1b3eb05180 100644 --- a/exchanges/gateio/gateio_convert.go +++ b/exchanges/gateio/gateio_convert.go @@ -51,33 +51,3 @@ func (a *gateioTime) UnmarshalJSON(data []byte) error { // Time represents a time instance. func (a gateioTime) Time() time.Time { return time.Time(a) } - -type gateioNumericalValue float64 - -// UnmarshalJSON is custom type json unmarshaller for gateioNumericalValue -func (a *gateioNumericalValue) UnmarshalJSON(data []byte) error { - var num interface{} - err := json.Unmarshal(data, &num) - if err != nil { - return err - } - - switch d := num.(type) { - case float64: - *a = gateioNumericalValue(d) - case string: - if d == "" { - *a = gateioNumericalValue(0) - return nil - } - convNum, err := strconv.ParseFloat(d, 64) - if err != nil { - return err - } - *a = gateioNumericalValue(convNum) - } - return nil -} - -// Float64 returns float64 value from gateioNumericalValue instance. -func (a gateioNumericalValue) Float64() float64 { return float64(a) } diff --git a/exchanges/gateio/gateio_test.go b/exchanges/gateio/gateio_test.go index 8532a86b451..5aa8f2c7b29 100644 --- a/exchanges/gateio/gateio_test.go +++ b/exchanges/gateio/gateio_test.go @@ -3307,45 +3307,6 @@ func TestParseGateioTimeUnmarshal(t *testing.T) { } } -func TestGateioNumericalValue(t *testing.T) { - t.Parallel() - in := &struct { - Number gateioNumericalValue `json:"number"` - }{} - - numberJSON := `{"number":123442.231}` - err := json.Unmarshal([]byte(numberJSON), in) - if err != nil { - t.Fatal(err) - } else if in.Number != 123442.231 { - t.Fatalf("found %f, but expected %f", in.Number, 123442.231) - } - - numberJSON = `{"number":"123442.231"}` - err = json.Unmarshal([]byte(numberJSON), in) - if err != nil { - t.Fatal(err) - } else if in.Number != 123442.231 { - t.Fatalf("found %f, but expected %s", in.Number, "123442.231") - } - - numberJSON = `{"number":""}` - err = json.Unmarshal([]byte(numberJSON), in) - if err != nil { - t.Fatal(err) - } else if in.Number != 0 { - t.Fatalf("found %f, but expected %d", in.Number, 0) - } - - numberJSON = `{"number":0}` - err = json.Unmarshal([]byte(numberJSON), in) - if err != nil { - t.Fatal(err) - } else if in.Number != 0 { - t.Fatalf("found %f, but expected %d", in.Number, 0) - } -} - func TestUpdateOrderExecutionLimits(t *testing.T) { t.Parallel() diff --git a/exchanges/gateio/gateio_types.go b/exchanges/gateio/gateio_types.go index 36741d5b027..ec3626d10a5 100644 --- a/exchanges/gateio/gateio_types.go +++ b/exchanges/gateio/gateio_types.go @@ -492,36 +492,36 @@ type CurrencyInfo struct { // CurrencyPairDetail represents a single currency pair detail. type CurrencyPairDetail struct { - ID string `json:"id"` - Base string `json:"base"` - Quote string `json:"quote"` - TradingFee gateioNumericalValue `json:"fee"` - MinBaseAmount gateioNumericalValue `json:"min_base_amount"` - MinQuoteAmount gateioNumericalValue `json:"min_quote_amount"` - AmountPrecision float64 `json:"amount_precision"` // Amount scale - Precision float64 `json:"precision"` // Price scale - TradeStatus string `json:"trade_status"` - SellStart float64 `json:"sell_start"` - BuyStart float64 `json:"buy_start"` + ID string `json:"id"` + Base string `json:"base"` + Quote string `json:"quote"` + TradingFee types.Number `json:"fee"` + MinBaseAmount types.Number `json:"min_base_amount"` + MinQuoteAmount types.Number `json:"min_quote_amount"` + AmountPrecision float64 `json:"amount_precision"` // Amount scale + Precision float64 `json:"precision"` // Price scale + TradeStatus string `json:"trade_status"` + SellStart float64 `json:"sell_start"` + BuyStart float64 `json:"buy_start"` } // Ticker holds detail ticker information for a currency pair type Ticker struct { - CurrencyPair string `json:"currency_pair"` - Last gateioNumericalValue `json:"last"` - LowestAsk gateioNumericalValue `json:"lowest_ask"` - HighestBid gateioNumericalValue `json:"highest_bid"` - ChangePercentage string `json:"change_percentage"` - ChangeUtc0 string `json:"change_utc0"` - ChangeUtc8 string `json:"change_utc8"` - BaseVolume gateioNumericalValue `json:"base_volume"` - QuoteVolume gateioNumericalValue `json:"quote_volume"` - High24H gateioNumericalValue `json:"high_24h"` - Low24H gateioNumericalValue `json:"low_24h"` - EtfNetValue string `json:"etf_net_value"` - EtfPreNetValue string `json:"etf_pre_net_value"` - EtfPreTimestamp gateioTime `json:"etf_pre_timestamp"` - EtfLeverage gateioNumericalValue `json:"etf_leverage"` + CurrencyPair string `json:"currency_pair"` + Last types.Number `json:"last"` + LowestAsk types.Number `json:"lowest_ask"` + HighestBid types.Number `json:"highest_bid"` + ChangePercentage string `json:"change_percentage"` + ChangeUtc0 string `json:"change_utc0"` + ChangeUtc8 string `json:"change_utc8"` + BaseVolume types.Number `json:"base_volume"` + QuoteVolume types.Number `json:"quote_volume"` + High24H types.Number `json:"high_24h"` + Low24H types.Number `json:"low_24h"` + EtfNetValue string `json:"etf_net_value"` + EtfPreNetValue string `json:"etf_pre_net_value"` + EtfPreTimestamp gateioTime `json:"etf_pre_timestamp"` + EtfLeverage types.Number `json:"etf_leverage"` } // OrderbookData holds orderbook ask and bid datas. @@ -552,7 +552,7 @@ func (a *OrderbookData) MakeOrderbook() (*Orderbook, error) { return nil, err } ob.Asks[x] = OrderbookItem{ - Price: gateioNumericalValue(price), + Price: types.Number(price), Amount: amount, } } @@ -566,7 +566,7 @@ func (a *OrderbookData) MakeOrderbook() (*Orderbook, error) { return nil, err } ob.Bids[x] = OrderbookItem{ - Price: gateioNumericalValue(price), + Price: types.Number(price), Amount: amount, } } @@ -575,8 +575,8 @@ func (a *OrderbookData) MakeOrderbook() (*Orderbook, error) { // OrderbookItem stores an orderbook item type OrderbookItem struct { - Price gateioNumericalValue `json:"p"` - Amount float64 `json:"s"` + Price types.Number `json:"p"` + Amount float64 `json:"s"` } // Orderbook stores the orderbook data @@ -744,8 +744,8 @@ type FuturesTicker struct { // FuturesFundingRate represents futures funding rate response. type FuturesFundingRate struct { - Timestamp gateioTime `json:"t"` - Rate gateioNumericalValue `json:"r"` + Timestamp gateioTime `json:"t"` + Rate types.Number `json:"r"` } // InsuranceBalance represents futures insurance balance item. @@ -783,18 +783,18 @@ type IndexConstituent struct { // LiquidationHistory represents liquidation history for a specifies settle. type LiquidationHistory struct { - Time gateioTime `json:"time"` - Contract string `json:"contract"` - Size int64 `json:"size"` - Leverage string `json:"leverage"` - Margin string `json:"margin"` - EntryPrice types.Number `json:"entry_price"` - LiquidationPrice gateioNumericalValue `json:"liq_price"` - MarkPrice types.Number `json:"mark_price"` - OrderID int64 `json:"order_id"` - OrderPrice types.Number `json:"order_price"` - FillPrice types.Number `json:"fill_price"` - Left int64 `json:"left"` + Time gateioTime `json:"time"` + Contract string `json:"contract"` + Size int64 `json:"size"` + Leverage string `json:"leverage"` + Margin string `json:"margin"` + EntryPrice types.Number `json:"entry_price"` + LiquidationPrice types.Number `json:"liq_price"` + MarkPrice types.Number `json:"mark_price"` + OrderID int64 `json:"order_id"` + OrderPrice types.Number `json:"order_price"` + FillPrice types.Number `json:"fill_price"` + Left int64 `json:"left"` } // DeliveryContract represents a delivery contract instance detail. @@ -888,12 +888,12 @@ type OptionContract struct { // OptionSettlement list settlement history type OptionSettlement struct { - Timestamp gateioTime `json:"time"` - Profit gateioNumericalValue `json:"profit"` - Fee gateioNumericalValue `json:"fee"` - SettlePrice types.Number `json:"settle_price"` - Contract string `json:"contract"` - StrikePrice types.Number `json:"strike_price"` + Timestamp gateioTime `json:"time"` + Profit types.Number `json:"profit"` + Fee types.Number `json:"fee"` + SettlePrice types.Number `json:"settle_price"` + Contract string `json:"contract"` + StrikePrice types.Number `json:"strike_price"` } // SwapCurrencies represents Flash Swap supported currencies @@ -919,26 +919,26 @@ type MyOptionSettlement struct { // OptionsTicker represents tickers of options contracts type OptionsTicker struct { - Name currency.Pair `json:"name"` - LastPrice gateioNumericalValue `json:"last_price"` - MarkPrice gateioNumericalValue `json:"mark_price"` - PositionSize float64 `json:"position_size"` - Ask1Size float64 `json:"ask1_size"` - Ask1Price types.Number `json:"ask1_price"` - Bid1Size float64 `json:"bid1_size"` - Bid1Price types.Number `json:"bid1_price"` - Vega string `json:"vega"` - Theta string `json:"theta"` - Rho string `json:"rho"` - Gamma string `json:"gamma"` - Delta string `json:"delta"` - MarkImpliedVolatility gateioNumericalValue `json:"mark_iv"` - BidImpliedVolatility gateioNumericalValue `json:"bid_iv"` - AskImpliedVolatility gateioNumericalValue `json:"ask_iv"` - Leverage gateioNumericalValue `json:"leverage"` + Name currency.Pair `json:"name"` + LastPrice types.Number `json:"last_price"` + MarkPrice types.Number `json:"mark_price"` + PositionSize float64 `json:"position_size"` + Ask1Size float64 `json:"ask1_size"` + Ask1Price types.Number `json:"ask1_price"` + Bid1Size float64 `json:"bid1_size"` + Bid1Price types.Number `json:"bid1_price"` + Vega string `json:"vega"` + Theta string `json:"theta"` + Rho string `json:"rho"` + Gamma string `json:"gamma"` + Delta string `json:"delta"` + MarkImpliedVolatility types.Number `json:"mark_iv"` + BidImpliedVolatility types.Number `json:"bid_iv"` + AskImpliedVolatility types.Number `json:"ask_iv"` + Leverage types.Number `json:"leverage"` // Added fields for the websocket - IndexPrice gateioNumericalValue `json:"index_price"` + IndexPrice types.Number `json:"index_price"` } // OptionsUnderlyingTicker represents underlying ticker @@ -1389,39 +1389,39 @@ type CreateOrderRequestData struct { // SpotOrder represents create order response. type SpotOrder struct { - OrderID string `json:"id,omitempty"` - Text string `json:"text,omitempty"` - Succeeded bool `json:"succeeded"` - ErrorLabel string `json:"label,omitempty"` - Message string `json:"message,omitempty"` - CreateTime gateioTime `json:"create_time,omitempty"` - CreateTimeMs gateioTime `json:"create_time_ms,omitempty"` - UpdateTime gateioTime `json:"update_time,omitempty"` - UpdateTimeMs gateioTime `json:"update_time_ms,omitempty"` - CurrencyPair string `json:"currency_pair,omitempty"` - Status string `json:"status,omitempty"` - Type string `json:"type,omitempty"` - Account string `json:"account,omitempty"` - Side string `json:"side,omitempty"` - Amount types.Number `json:"amount,omitempty"` - Price types.Number `json:"price,omitempty"` - TimeInForce string `json:"time_in_force,omitempty"` - Iceberg string `json:"iceberg,omitempty"` - AutoRepay bool `json:"auto_repay"` - AutoBorrow bool `json:"auto_borrow"` - Left gateioNumericalValue `json:"left"` - AverageFillPrice types.Number `json:"avg_deal_price"` - FeeDeducted types.Number `json:"fee"` - FeeCurrency string `json:"fee_currency"` - FillPrice types.Number `json:"fill_price"` // Total filled in quote currency. Deprecated in favor of filled_total - FilledTotal types.Number `json:"filled_total"` // Total filled in quote currency - PointFee types.Number `json:"point_fee"` - GtFee string `json:"gt_fee,omitempty"` - GtDiscount bool `json:"gt_discount"` - GtMakerFee types.Number `json:"gt_maker_fee"` - GtTakerFee types.Number `json:"gt_taker_fee"` - RebatedFee types.Number `json:"rebated_fee"` - RebatedFeeCurrency string `json:"rebated_fee_currency"` + OrderID string `json:"id,omitempty"` + Text string `json:"text,omitempty"` + Succeeded bool `json:"succeeded"` + ErrorLabel string `json:"label,omitempty"` + Message string `json:"message,omitempty"` + CreateTime gateioTime `json:"create_time,omitempty"` + CreateTimeMs gateioTime `json:"create_time_ms,omitempty"` + UpdateTime gateioTime `json:"update_time,omitempty"` + UpdateTimeMs gateioTime `json:"update_time_ms,omitempty"` + CurrencyPair string `json:"currency_pair,omitempty"` + Status string `json:"status,omitempty"` + Type string `json:"type,omitempty"` + Account string `json:"account,omitempty"` + Side string `json:"side,omitempty"` + Amount types.Number `json:"amount,omitempty"` + Price types.Number `json:"price,omitempty"` + TimeInForce string `json:"time_in_force,omitempty"` + Iceberg string `json:"iceberg,omitempty"` + AutoRepay bool `json:"auto_repay"` + AutoBorrow bool `json:"auto_borrow"` + Left types.Number `json:"left"` + AverageFillPrice types.Number `json:"avg_deal_price"` + FeeDeducted types.Number `json:"fee"` + FeeCurrency string `json:"fee_currency"` + FillPrice types.Number `json:"fill_price"` // Total filled in quote currency. Deprecated in favor of filled_total + FilledTotal types.Number `json:"filled_total"` // Total filled in quote currency + PointFee types.Number `json:"point_fee"` + GtFee string `json:"gt_fee,omitempty"` + GtDiscount bool `json:"gt_discount"` + GtMakerFee types.Number `json:"gt_maker_fee"` + GtTakerFee types.Number `json:"gt_taker_fee"` + RebatedFee types.Number `json:"rebated_fee"` + RebatedFeeCurrency string `json:"rebated_fee_currency"` } // SpotOrdersDetail represents list of orders for specific currency pair @@ -2067,34 +2067,34 @@ type WsOrderbookSnapshot struct { // WsSpotOrder represents an order push data through the websocket channel. type WsSpotOrder struct { - ID string `json:"id,omitempty"` - User int64 `json:"user"` - Text string `json:"text,omitempty"` - Succeeded bool `json:"succeeded,omitempty"` - Label string `json:"label,omitempty"` - Message string `json:"message,omitempty"` - CurrencyPair currency.Pair `json:"currency_pair,omitempty"` - Type string `json:"type,omitempty"` - Account string `json:"account,omitempty"` - Side string `json:"side,omitempty"` - Amount types.Number `json:"amount,omitempty"` - Price types.Number `json:"price,omitempty"` - TimeInForce string `json:"time_in_force,omitempty"` - Iceberg string `json:"iceberg,omitempty"` - Left gateioNumericalValue `json:"left,omitempty"` - FilledTotal types.Number `json:"filled_total,omitempty"` - Fee types.Number `json:"fee,omitempty"` - FeeCurrency string `json:"fee_currency,omitempty"` - PointFee string `json:"point_fee,omitempty"` - GtFee string `json:"gt_fee,omitempty"` - GtDiscount bool `json:"gt_discount,omitempty"` - RebatedFee string `json:"rebated_fee,omitempty"` - RebatedFeeCurrency string `json:"rebated_fee_currency,omitempty"` - Event string `json:"event"` - CreateTime gateioTime `json:"create_time,omitempty"` - CreateTimeMs gateioTime `json:"create_time_ms,omitempty"` - UpdateTime gateioTime `json:"update_time,omitempty"` - UpdateTimeMs gateioTime `json:"update_time_ms,omitempty"` + ID string `json:"id,omitempty"` + User int64 `json:"user"` + Text string `json:"text,omitempty"` + Succeeded bool `json:"succeeded,omitempty"` + Label string `json:"label,omitempty"` + Message string `json:"message,omitempty"` + CurrencyPair currency.Pair `json:"currency_pair,omitempty"` + Type string `json:"type,omitempty"` + Account string `json:"account,omitempty"` + Side string `json:"side,omitempty"` + Amount types.Number `json:"amount,omitempty"` + Price types.Number `json:"price,omitempty"` + TimeInForce string `json:"time_in_force,omitempty"` + Iceberg string `json:"iceberg,omitempty"` + Left types.Number `json:"left,omitempty"` + FilledTotal types.Number `json:"filled_total,omitempty"` + Fee types.Number `json:"fee,omitempty"` + FeeCurrency string `json:"fee_currency,omitempty"` + PointFee string `json:"point_fee,omitempty"` + GtFee string `json:"gt_fee,omitempty"` + GtDiscount bool `json:"gt_discount,omitempty"` + RebatedFee string `json:"rebated_fee,omitempty"` + RebatedFeeCurrency string `json:"rebated_fee_currency,omitempty"` + Event string `json:"event"` + CreateTime gateioTime `json:"create_time,omitempty"` + CreateTimeMs gateioTime `json:"create_time_ms,omitempty"` + UpdateTime gateioTime `json:"update_time,omitempty"` + UpdateTimeMs gateioTime `json:"update_time_ms,omitempty"` } // WsUserPersonalTrade represents a user's personal trade pushed through the websocket connection. diff --git a/exchanges/kucoin/kucoin_convert.go b/exchanges/kucoin/kucoin_convert.go index 098476a1b90..83b8bd5d5ae 100644 --- a/exchanges/kucoin/kucoin_convert.go +++ b/exchanges/kucoin/kucoin_convert.go @@ -3,7 +3,6 @@ package kucoin import ( "encoding/json" "fmt" - "strconv" ) // UnmarshalJSON valid data to SubAccountsResponse of return nil if the data is empty list. @@ -25,43 +24,3 @@ func (a *SubAccountsResponse) UnmarshalJSON(data []byte) error { } return fmt.Errorf("%w can not unmarshal to SubAccountsResponse", errMalformedData) } - -// kucoinNumber unmarshals and extract numeric value from a byte slice. -type kucoinNumber float64 - -// Float64 returns an float64 value from kucoinNumeric instance -func (a *kucoinNumber) Float64() float64 { - return float64(*a) -} - -// UnmarshalJSON decerializes integer and string data having an integer value to int64 -func (a *kucoinNumber) UnmarshalJSON(data []byte) error { - var value interface{} - err := json.Unmarshal(data, &value) - if err != nil { - return err - } - switch val := value.(type) { - case float64: - *a = kucoinNumber(val) - case float32: - *a = kucoinNumber(val) - case string: - if val == "" { - *a = kucoinNumber(0) // setting empty string value to zero to reset previous value if exist. - return nil - } - value, err := strconv.ParseFloat(val, 64) - if err != nil { - return err - } - *a = kucoinNumber(value) - case int64: - *a = kucoinNumber(val) - case int32: - *a = kucoinNumber(val) - default: - return fmt.Errorf("unsupported input numeric type %T", value) - } - return nil -} diff --git a/exchanges/kucoin/kucoin_test.go b/exchanges/kucoin/kucoin_test.go index 81da311bad2..46e8d603e6d 100644 --- a/exchanges/kucoin/kucoin_test.go +++ b/exchanges/kucoin/kucoin_test.go @@ -2315,62 +2315,6 @@ func TestFetchAccountInfo(t *testing.T) { } } -func TestKucoinNumberUnmarshal(t *testing.T) { - t.Parallel() - data := &struct { - Number kucoinNumber `json:"number"` - }{} - data1 := `{"number": 123.33}` - err := json.Unmarshal([]byte(data1), &data) - if err != nil { - t.Fatal(err) - } else if data.Number.Float64() != 123.33 { - t.Errorf("expecting %.2f, got %.2f", 123.33, data.Number) - } - data2 := `{"number": "123.33"}` - err = json.Unmarshal([]byte(data2), &data) - if err != nil { - t.Fatal(err) - } else if data.Number.Float64() != 123.33 { - t.Errorf("expecting %.2f, got %.2f", 123.33, data.Number) - } - data3 := `{"number": ""}` - err = json.Unmarshal([]byte(data3), &data) - if err != nil { - t.Fatal(err) - } else if data.Number.Float64() != 0 { - t.Errorf("expecting %d, got %.2f", 0, data.Number) - } - data4 := `{"number": "123"}` - err = json.Unmarshal([]byte(data4), &data) - if err != nil { - t.Fatal(err) - } else if data.Number.Float64() != 123 { - t.Errorf("expecting %d, got %.2f", 123, data.Number) - } - data5 := `{"number": 0}` - err = json.Unmarshal([]byte(data5), &data) - if err != nil { - t.Fatal(err) - } else if data.Number.Float64() != 0 { - t.Errorf("expecting %d, got %.2f", 0, data.Number) - } - data6 := `{"number": 123789}` - err = json.Unmarshal([]byte(data6), &data) - if err != nil { - t.Fatal(err) - } else if data.Number.Float64() != 123789 { - t.Errorf("expecting %d, got %.2f", 123789, data.Number) - } - data7 := `{"number": 12321312312312312}` - err = json.Unmarshal([]byte(data7), &data) - if err != nil { - t.Fatal(err) - } else if data.Number.Float64() != float64(12321312312312312) { - t.Errorf("expecting %.f, got %.2f", float64(12321312312312312), data.Number) - } -} - func TestUpdateAccountInfo(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, ku) diff --git a/exchanges/kucoin/kucoin_types.go b/exchanges/kucoin/kucoin_types.go index 45419bc01b3..9528b7038ec 100644 --- a/exchanges/kucoin/kucoin_types.go +++ b/exchanges/kucoin/kucoin_types.go @@ -11,6 +11,7 @@ import ( "github.com/thrasher-corp/gocryptotrader/common/convert" "github.com/thrasher-corp/gocryptotrader/currency" "github.com/thrasher-corp/gocryptotrader/exchanges/orderbook" + "github.com/thrasher-corp/gocryptotrader/types" ) var ( @@ -810,15 +811,15 @@ type WsTicker struct { Timestamp convert.ExchangeTime `json:"time"` } -// WsSpotTicker represents a spot ticker push data. -type WsSpotTicker struct { - Sequence kucoinNumber `json:"sequence"` - Data WsSpotTickerDetail `json:"data"` +// WsSnapshot represents a spot ticker push data. +type WsSnapshot struct { + Sequence types.Number `json:"sequence"` + Data WsSnapshotDetail `json:"data"` } -// WsSpotTickerDetail represents the detail of a spot ticker data. +// WsSnapshotDetail represents the detail of a spot ticker data. // This represents all websocket ticker information pushed as a result of subscription to /market/snapshot:{symbol}, and /market/snapshot:{currency,market} -type WsSpotTickerDetail struct { +type WsSnapshotDetail struct { AveragePrice float64 `json:"averagePrice"` BaseCurrency string `json:"baseCurrency"` Board int64 `json:"board"` @@ -1070,8 +1071,8 @@ type WsFuturesTicker struct { FilledSize float64 `json:"size"` TradeID string `json:"tradeId"` BestBidSize float64 `json:"bestBidSize"` - BestBidPrice kucoinNumber `json:"bestBidPrice"` - BestAskPrice kucoinNumber `json:"bestAskPrice"` + BestBidPrice types.Number `json:"bestBidPrice"` + BestAskPrice types.Number `json:"bestAskPrice"` BestAskSize float64 `json:"bestAskSize"` FilledTime convert.ExchangeTime `json:"ts"` } @@ -1112,8 +1113,8 @@ type WsOrderbookLevel5 struct { type WsOrderbookLevel5Response struct { Timestamp convert.ExchangeTime `json:"timestamp"` Sequence int64 `json:"sequence"` - Bids [][2]kucoinNumber `json:"bids"` - Asks [][2]kucoinNumber `json:"asks"` + Bids [][2]types.Number `json:"bids"` + Asks [][2]types.Number `json:"asks"` PushTimestamp convert.ExchangeTime `json:"ts"` } diff --git a/exchanges/kucoin/kucoin_websocket.go b/exchanges/kucoin/kucoin_websocket.go index a8fbfdc2b7d..b6093005ead 100644 --- a/exchanges/kucoin/kucoin_websocket.go +++ b/exchanges/kucoin/kucoin_websocket.go @@ -888,7 +888,7 @@ func (ku *Kucoin) processOrderbook(respData []byte, symbol string) error { } func (ku *Kucoin) processMarketSnapshot(respData []byte) error { - response := WsSpotTicker{} + response := WsSnapshot{} err := json.Unmarshal(respData, &response) if err != nil { return err diff --git a/exchanges/okcoin/okcoin_convert.go b/exchanges/okcoin/okcoin_convert.go index 212bb0f6292..d13aa16e598 100644 --- a/exchanges/okcoin/okcoin_convert.go +++ b/exchanges/okcoin/okcoin_convert.go @@ -48,42 +48,3 @@ func (o *okcoinTime) UnmarshalJSON(data []byte) error { func (o *okcoinTime) Time() time.Time { return time.Time(*o) } - -type okcoinNumber float64 - -// UnmarshalJSON a custom JSON deserialization function for numeric values to okcoinNumber instance. -func (a *okcoinNumber) UnmarshalJSON(data []byte) error { - var value interface{} - err := json.Unmarshal(data, &value) - if err != nil { - return err - } - switch val := value.(type) { - case string: - if val == "" { - *a = okcoinNumber(0) - return nil - } - floatValue, err := strconv.ParseFloat(val, 64) - if err != nil { - return err - } - *a = okcoinNumber(floatValue) - case float64: - *a = okcoinNumber(val) - case int64: - *a = okcoinNumber(val) - case int32: - *a = okcoinNumber(int64(val)) - } - return nil -} - -// Float64 returns a float64 value from okcoinNumber instance. -func (a okcoinNumber) Float64() float64 { return float64(a) } - -// Int64 returns a int64 value from okcoinNumber instance. -func (a okcoinNumber) Int64() int64 { return int64(a) } - -// String returns string wrapped float64 value from okcoinNumber instance. -func (a okcoinNumber) String() string { return strconv.FormatFloat(float64(a), 'f', -1, 64) } diff --git a/exchanges/okcoin/okcoin_test.go b/exchanges/okcoin/okcoin_test.go index 9f919d932f8..3a74a27a520 100644 --- a/exchanges/okcoin/okcoin_test.go +++ b/exchanges/okcoin/okcoin_test.go @@ -2,7 +2,6 @@ package okcoin import ( "context" - "encoding/json" "errors" "log" "os" @@ -1768,27 +1767,6 @@ func (o *Okcoin) populateTradablePairs(ctx context.Context) error { return nil } -func TestOKCOINNumberUnmarshal(t *testing.T) { - type testNumberHolder struct { - Numb okcoinNumber `json:"numb"` - } - var val testNumberHolder - data1 := `{ "numb":"12345.65" }` - err := json.Unmarshal([]byte(data1), &val) - if err != nil { - t.Error(err) - } else if val.Numb.Float64() != 12345.65 { - t.Errorf("found %.2f, but found %.2f", val.Numb.Float64(), 12345.65) - } - data2 := `{ "numb":"" }` - err = json.Unmarshal([]byte(data2), &val) - if err != nil { - t.Error(err) - } else if val.Numb.Float64() != 0 { - t.Errorf("found %.2f, but found %d", val.Numb.Float64(), 0) - } -} - func TestGetSubAccounts(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, o) diff --git a/exchanges/okcoin/okcoin_types.go b/exchanges/okcoin/okcoin_types.go index 634fba028c7..4b4cf55d36f 100644 --- a/exchanges/okcoin/okcoin_types.go +++ b/exchanges/okcoin/okcoin_types.go @@ -160,13 +160,13 @@ type WebsocketOrderbookResponse struct { // WebsocketOrderBook holds orderbook data type WebsocketOrderBook struct { Checksum int64 `json:"checksum"` - Asks [][2]okcoinNumber `json:"asks"` // [ Price, Quantity, depreciated, number of orders at the price ] - Bids [][2]okcoinNumber `json:"bids"` // [ Price, Quantity, depreciated, number of orders at the price ] + Asks [][2]types.Number `json:"asks"` // [ Price, Quantity, depreciated, number of orders at the price ] + Bids [][2]types.Number `json:"bids"` // [ Price, Quantity, depreciated, number of orders at the price ] Timestamp okcoinTime `json:"ts"` } func (a *WebsocketOrderBook) prepareOrderbook() { - asks := [][2]okcoinNumber{} + asks := [][2]types.Number{} for x := range a.Asks { if len(asks) > 0 && asks[len(asks)-1][0].Float64() == a.Asks[x][0].Float64() { if a.Asks[x][1].Float64() != 0 { @@ -180,7 +180,7 @@ func (a *WebsocketOrderBook) prepareOrderbook() { asks = append(asks, a.Asks[x]) } a.Asks = asks - bids := [][2]okcoinNumber{} + bids := [][2]types.Number{} for x := range a.Bids { if len(bids) > 0 && bids[len(bids)-1][0].Float64() == a.Bids[x][0].Float64() { if a.Bids[x][1].Float64() != 0 { @@ -248,7 +248,7 @@ type WebsocketAccount struct { Data []struct { AdjustedEquity string `json:"adjEq"` Details []struct { - AvailableBalance okcoinNumber `json:"availBal"` + AvailableBalance types.Number `json:"availBal"` AvailableEquity types.Number `json:"availEq"` CashBalance types.Number `json:"cashBal"` Currency string `json:"ccy"` @@ -411,8 +411,8 @@ type WebsocketAdvancedAlgoOrder struct { PushTime okcoinTime `json:"pTime"` PosSide string `json:"posSide"` PriceLimit types.Number `json:"pxLimit"` - PriceSpread okcoinNumber `json:"pxSpread"` - PriceVar okcoinNumber `json:"pxVar"` + PriceSpread types.Number `json:"pxSpread"` + PriceVar types.Number `json:"pxVar"` Side string `json:"side"` StopLossOrdPrice string `json:"slOrdPx"` StopLossTriggerPrice string `json:"slTriggerPx"` @@ -559,19 +559,19 @@ type Instrument struct { Leverage types.Number `json:"lever"` ListTime okcoinTime `json:"listTime"` LotSize types.Number `json:"lotSz"` - MaxIcebergSz okcoinNumber `json:"maxIcebergSz"` - MaxLimitSize okcoinNumber `json:"maxLmtSz"` - MaxMarketSize okcoinNumber `json:"maxMktSz"` - MaxStopSize okcoinNumber `json:"maxStopSz"` - MaxTwapSize okcoinNumber `json:"maxTwapSz"` - MaxTriggerSize okcoinNumber `json:"maxTriggerSz"` - MinSize okcoinNumber `json:"minSz"` // Minimum order size + MaxIcebergSz types.Number `json:"maxIcebergSz"` + MaxLimitSize types.Number `json:"maxLmtSz"` + MaxMarketSize types.Number `json:"maxMktSz"` + MaxStopSize types.Number `json:"maxStopSz"` + MaxTwapSize types.Number `json:"maxTwapSz"` + MaxTriggerSize types.Number `json:"maxTriggerSz"` + MinSize types.Number `json:"minSz"` // Minimum order size QuoteCurrency string `json:"quoteCcy"` OptionType string `json:"optType"` SettleCurrency string `json:"settleCcy"` State string `json:"state"` - StrikePrice okcoinNumber `json:"stk"` - TickSize okcoinNumber `json:"tickSz"` + StrikePrice types.Number `json:"stk"` + TickSize types.Number `json:"tickSz"` Underlying string `json:"uly"` } @@ -812,7 +812,7 @@ type WithdrawalRequest struct { // WithdrawalResponse represents withdrawal of tokens response. type WithdrawalResponse struct { - Amt okcoinNumber `json:"amt"` + Amt types.Number `json:"amt"` WdID string `json:"wdId"` Currency string `json:"ccy"` ClientID string `json:"clientId"` @@ -860,26 +860,26 @@ type WithdrawalOrderItem struct { type AccountBalanceInformation struct { AdjustedEquity string `json:"adjEq"` // Adjusted / Effective equity in USD . Not enabled. Please disregard. Details []struct { - AvailableBalance okcoinNumber `json:"availBal"` + AvailableBalance types.Number `json:"availBal"` AvailableEquity types.Number `json:"availEq"` CashBalance types.Number `json:"cashBal"` Currency string `json:"ccy"` CrossLiability string `json:"crossLiab"` DiscountEquity string `json:"disEq"` - Equity okcoinNumber `json:"eq"` - EquityUsd okcoinNumber `json:"eqUsd"` - FixedBalance okcoinNumber `json:"fixedBal"` - FrozenBalance okcoinNumber `json:"frozenBal"` - Interest okcoinNumber `json:"interest"` - IsolatedEquity okcoinNumber `json:"isoEq"` - IsolatedLiability okcoinNumber `json:"isoLiab"` + Equity types.Number `json:"eq"` + EquityUsd types.Number `json:"eqUsd"` + FixedBalance types.Number `json:"fixedBal"` + FrozenBalance types.Number `json:"frozenBal"` + Interest types.Number `json:"interest"` + IsolatedEquity types.Number `json:"isoEq"` + IsolatedLiability types.Number `json:"isoLiab"` IsolatedUpl string `json:"isoUpl"` // Isolated unrealized profit and loss of the currency. Not enabled. Please disregard. - Liability okcoinNumber `json:"liab"` - MaxLoan okcoinNumber `json:"maxLoan"` - MarginRatio okcoinNumber `json:"mgnRatio"` - NotionalLever okcoinNumber `json:"notionalLever"` - OrderFrozen okcoinNumber `json:"ordFrozen"` - SpotInUseAmount okcoinNumber `json:"spotInUseAmt"` + Liability types.Number `json:"liab"` + MaxLoan types.Number `json:"maxLoan"` + MarginRatio types.Number `json:"mgnRatio"` + NotionalLever types.Number `json:"notionalLever"` + OrderFrozen types.Number `json:"ordFrozen"` + SpotInUseAmount types.Number `json:"spotInUseAmt"` StrategyEquity string `json:"stgyEq"` Twap string `json:"twap"` UpdateTime okcoinTime `json:"uTime"` @@ -888,7 +888,7 @@ type AccountBalanceInformation struct { } `json:"details"` IMR string `json:"imr"` // Frozen equity for open positions and pending orders in USD. IsolatedEquity string `json:"isoEq"` - MarginRatio okcoinNumber `json:"mgnRatio"` + MarginRatio types.Number `json:"mgnRatio"` Mmr string `json:"mmr"` // Maintenance margin requirement in USD. NotionalUsd types.Number `json:"notionalUsd"` OrdFroz string `json:"ordFroz"` @@ -903,7 +903,7 @@ type BillsDetail struct { BillID string `json:"billId"` Currency string `json:"ccy"` ExecType string `json:"execType"` - Fee okcoinNumber `json:"fee"` + Fee types.Number `json:"fee"` From string `json:"from"` InstrumentID string `json:"instId"` InstrumentType string `json:"instType"` @@ -979,11 +979,11 @@ type AvailableRFQPair struct { Instruments []struct { BaseCurrency string `json:"baseCcy"` BaseCurrencyIcon string `json:"baseCcyIcon"` - BaseSingleMin okcoinNumber `json:"baseSingleMin"` + BaseSingleMin types.Number `json:"baseSingleMin"` InstrumentID string `json:"instId"` QuoteCurrency string `json:"quoteCcy"` QuoteCurrencyIcon string `json:"quoteCcyIcon"` - QuoteSingleMin okcoinNumber `json:"quoteSingleMin"` + QuoteSingleMin types.Number `json:"quoteSingleMin"` } `json:"instruments"` Timestamp okcoinTime `json:"ts"` } @@ -1151,11 +1151,11 @@ type ChannelInfo struct { ChannelID string `json:"chanId"` Currency string `json:"ccy"` DepositQuota string `json:"depQuota"` - MinDeposit okcoinNumber `json:"minDep"` - WithdrawalQuota okcoinNumber `json:"wdQuota"` - MinWithdrawal okcoinNumber `json:"minWd"` - UsedWithdrawalQuota okcoinNumber `json:"usedWdQuota"` - ValidWithdrawalQuota okcoinNumber `json:"validWdQuota"` + MinDeposit types.Number `json:"minDep"` + WithdrawalQuota types.Number `json:"wdQuota"` + MinWithdrawal types.Number `json:"minWd"` + UsedWithdrawalQuota types.Number `json:"usedWdQuota"` + ValidWithdrawalQuota types.Number `json:"validWdQuota"` BankAccountInfo []struct { BankAccountName string `json:"bankAcctName"` BankAccountNumber string `json:"bankAcctNum"` @@ -1237,25 +1237,25 @@ type TradeOrder struct { Category string `json:"category"` Currency string `json:"ccy"` ClientOrdID string `json:"clOrdId"` - Fee okcoinNumber `json:"fee"` + Fee types.Number `json:"fee"` FeeCurrency string `json:"feeCcy"` FillPrice types.Number `json:"fillPx"` FillSize types.Number `json:"fillSz"` FillTime okcoinTime `json:"fillTime"` InstrumentID string `json:"instId"` InstrumentType string `json:"instType"` - Leverage okcoinNumber `json:"lever"` + Leverage types.Number `json:"lever"` OrderID string `json:"ordId"` OrderType string `json:"ordType"` ProfitAndLoss types.Number `json:"pnl"` PosSide string `json:"posSide"` Price types.Number `json:"px"` - Rebate okcoinNumber `json:"rebate"` + Rebate types.Number `json:"rebate"` RebateCurrency string `json:"rebateCcy"` ReduceOnly bool `json:"reduceOnly,string"` Side string `json:"side"` - StopLossOrdPrice okcoinNumber `json:"slOrdPx"` - StopLossTriggerPrice okcoinNumber `json:"slTriggerPx"` + StopLossOrdPrice types.Number `json:"slOrdPx"` + StopLossTriggerPrice types.Number `json:"slTriggerPx"` StopLossTriggerPriceType string `json:"slTriggerPxType"` Source string `json:"source"` State string `json:"state"` @@ -1263,8 +1263,8 @@ type TradeOrder struct { Tag string `json:"tag"` TradeMode string `json:"tdMode"` TargetCurrency string `json:"tgtCcy"` - TakeProfitOrderPrice okcoinNumber `json:"tpOrdPx"` - TakeProfitTriggerPrice okcoinNumber `json:"tpTriggerPx"` + TakeProfitOrderPrice types.Number `json:"tpOrdPx"` + TakeProfitTriggerPrice types.Number `json:"tpTriggerPx"` TakeProfitTriggerPriceType string `json:"tpTriggerPxType"` TradeID string `json:"tradeId"` UpdateTime okcoinTime `json:"uTime"` @@ -1285,7 +1285,7 @@ type TransactionFillItem struct { PosSide string `json:"posSide"` ExecType string `json:"execType"` FeeCurrency string `json:"feeCcy"` - Fee okcoinNumber `json:"fee"` + Fee types.Number `json:"fee"` Timestamp okcoinTime `json:"ts"` } @@ -1341,42 +1341,42 @@ type CancelAlgoOrderRequestParam struct { // AlgoOrderDetail represents an algo-order detailed information type AlgoOrderDetail struct { - ActivePrice okcoinNumber `json:"activePx"` - ActualPrice okcoinNumber `json:"actualPx"` + ActivePrice types.Number `json:"activePx"` + ActualPrice types.Number `json:"actualPx"` ActualSide string `json:"actualSide"` - ActualSize okcoinNumber `json:"actualSz"` + ActualSize types.Number `json:"actualSz"` AlgoID string `json:"algoId"` CreateTime okcoinTime `json:"cTime"` - CallbackRatio okcoinNumber `json:"callbackRatio"` + CallbackRatio types.Number `json:"callbackRatio"` CallbackSpread string `json:"callbackSpread"` Currency string `json:"ccy"` ClientOrderID string `json:"clOrdId"` InstrumentID string `json:"instId"` InstrumentType string `json:"instType"` Leverage types.Number `json:"lever"` - MoveTriggerPrice okcoinNumber `json:"moveTriggerPx"` + MoveTriggerPrice types.Number `json:"moveTriggerPx"` OrderID string `json:"ordId"` - OrdPrice okcoinNumber `json:"ordPx"` + OrdPrice types.Number `json:"ordPx"` OrderType string `json:"ordType"` PosSide string `json:"posSide"` - PriceLimit okcoinNumber `json:"pxLimit"` - PriceSpread okcoinNumber `json:"pxSpread"` - PriceVar okcoinNumber `json:"pxVar"` + PriceLimit types.Number `json:"pxLimit"` + PriceSpread types.Number `json:"pxSpread"` + PriceVar types.Number `json:"pxVar"` Side string `json:"side"` - StopLossOrdPrice okcoinNumber `json:"slOrdPx"` - StopLossTriggerPrice okcoinNumber `json:"slTriggerPx"` + StopLossOrdPrice types.Number `json:"slOrdPx"` + StopLossTriggerPrice types.Number `json:"slTriggerPx"` StopLossTriggerPriceType string `json:"slTriggerPxType"` State string `json:"state"` - Size okcoinNumber `json:"sz"` - SizeLimit okcoinNumber `json:"szLimit"` + Size types.Number `json:"sz"` + SizeLimit types.Number `json:"szLimit"` Tag string `json:"tag"` TdMode string `json:"tdMode"` TgtCcy string `json:"tgtCcy"` TimeInterval string `json:"timeInterval"` - TpOrdPrice okcoinNumber `json:"tpOrdPx"` - TpTriggerPrice okcoinNumber `json:"tpTriggerPx"` + TpOrdPrice types.Number `json:"tpOrdPx"` + TpTriggerPrice types.Number `json:"tpTriggerPx"` TpTriggerPriceType string `json:"tpTriggerPxType"` - TriggerPrice okcoinNumber `json:"triggerPx"` + TriggerPrice types.Number `json:"triggerPx"` TriggerPriceType string `json:"triggerPxType"` TriggerTime okcoinTime `json:"triggerTime"` } diff --git a/exchanges/okcoin/okcoin_websocket.go b/exchanges/okcoin/okcoin_websocket.go index 1d058501d64..3bfc64c24de 100644 --- a/exchanges/okcoin/okcoin_websocket.go +++ b/exchanges/okcoin/okcoin_websocket.go @@ -24,6 +24,7 @@ import ( "github.com/thrasher-corp/gocryptotrader/exchanges/ticker" "github.com/thrasher-corp/gocryptotrader/exchanges/trade" "github.com/thrasher-corp/gocryptotrader/log" + "github.com/thrasher-corp/gocryptotrader/types" ) const ( @@ -695,7 +696,7 @@ func (o *Okcoin) wsProcessCandles(respRaw []byte) error { // AppendWsOrderbookItems adds websocket orderbook data bid/asks into an // orderbook item array -func (o *Okcoin) AppendWsOrderbookItems(entries [][2]okcoinNumber) ([]orderbook.Item, error) { +func (o *Okcoin) AppendWsOrderbookItems(entries [][2]types.Number) ([]orderbook.Item, error) { items := make([]orderbook.Item, len(entries)) for j := range entries { amount := entries[j][1].Float64() diff --git a/exchanges/okx/okx_type_convert.go b/exchanges/okx/okx_type_convert.go index 89c5db9f20b..791b9c680de 100644 --- a/exchanges/okx/okx_type_convert.go +++ b/exchanges/okx/okx_type_convert.go @@ -9,35 +9,6 @@ import ( "github.com/thrasher-corp/gocryptotrader/exchanges/order" ) -type okxNumericalValue float64 - -// UnmarshalJSON is custom type json unmarshaller for okxNumericalValue -func (a *okxNumericalValue) UnmarshalJSON(data []byte) error { - var num interface{} - err := json.Unmarshal(data, &num) - if err != nil { - return err - } - - switch d := num.(type) { - case float64: - *a = okxNumericalValue(d) - case string: - if d == "" { - return nil - } - convNum, err := strconv.ParseFloat(d, 64) - if err != nil { - return err - } - *a = okxNumericalValue(convNum) - } - return nil -} - -// Float64 returns a float64 value for okxNumericalValue -func (a *okxNumericalValue) Float64() float64 { return float64(*a) } - type okxUnixMilliTime int64 // UnmarshalJSON deserializes byte data to okxunixMilliTime instance. diff --git a/exchanges/okx/okx_types.go b/exchanges/okx/okx_types.go index 6fb19fb4b7c..e87b1a68648 100644 --- a/exchanges/okx/okx_types.go +++ b/exchanges/okx/okx_types.go @@ -76,19 +76,19 @@ var testNetVal = testNetKey("testnet") // TickerResponse represents the market data endpoint ticker detail type TickerResponse struct { - InstrumentType string `json:"instType"` - InstrumentID string `json:"instId"` - LastTradePrice okxNumericalValue `json:"last"` - LastTradeSize okxNumericalValue `json:"lastSz"` - BestAskPrice okxNumericalValue `json:"askPx"` - BestAskSize okxNumericalValue `json:"askSz"` - BestBidPrice okxNumericalValue `json:"bidPx"` - BestBidSize okxNumericalValue `json:"bidSz"` - Open24H okxNumericalValue `json:"open24h"` - High24H okxNumericalValue `json:"high24h"` - Low24H okxNumericalValue `json:"low24h"` - VolCcy24H okxNumericalValue `json:"volCcy24h"` - Vol24H okxNumericalValue `json:"vol24h"` + InstrumentType string `json:"instType"` + InstrumentID string `json:"instId"` + LastTradePrice types.Number `json:"last"` + LastTradeSize types.Number `json:"lastSz"` + BestAskPrice types.Number `json:"askPx"` + BestAskSize types.Number `json:"askSz"` + BestBidPrice types.Number `json:"bidPx"` + BestBidSize types.Number `json:"bidSz"` + Open24H types.Number `json:"open24h"` + High24H types.Number `json:"high24h"` + Low24H types.Number `json:"low24h"` + VolCcy24H types.Number `json:"volCcy24h"` + Vol24H types.Number `json:"vol24h"` OpenPriceInUTC0 string `json:"sodUtc0"` OpenPriceInUTC8 string `json:"sodUtc8"` @@ -237,11 +237,11 @@ type TradeResponse struct { // TradingVolumeIn24HR response model. type TradingVolumeIn24HR struct { - BlockVolumeInCNY okxNumericalValue `json:"blockVolCny"` - BlockVolumeInUSD okxNumericalValue `json:"blockVolUsd"` - TradingVolumeInUSD types.Number `json:"volUsd"` - TradingVolumeInCny types.Number `json:"volCny"` - Timestamp okxUnixMilliTime `json:"ts"` + BlockVolumeInCNY types.Number `json:"blockVolCny"` + BlockVolumeInUSD types.Number `json:"blockVolUsd"` + TradingVolumeInUSD types.Number `json:"volUsd"` + TradingVolumeInCny types.Number `json:"volCny"` + Timestamp okxUnixMilliTime `json:"ts"` } // OracleSmartContractResponse returns the crypto price of signing using Open Oracle smart contract. @@ -395,9 +395,9 @@ type DiscountRate struct { // DiscountRateInfoItem represents discount info list item for discount rate response type DiscountRateInfoItem struct { - DiscountRate string `json:"discountRate"` - MaxAmount okxNumericalValue `json:"maxAmt"` - MinAmount okxNumericalValue `json:"minAmt"` + DiscountRate string `json:"discountRate"` + MaxAmount types.Number `json:"maxAmt"` + MinAmount types.Number `json:"minAmt"` } // ServerTime returning the server time instance. @@ -658,42 +658,42 @@ type OrderDetailRequestParam struct { // OrderDetail returns a order detail information type OrderDetail struct { - InstrumentType string `json:"instType"` - InstrumentID string `json:"instId"` - Currency string `json:"ccy"` - OrderID string `json:"ordId"` - ClientOrderID string `json:"clOrdId"` - Tag string `json:"tag"` - ProfitAndLoss string `json:"pnl"` - OrderType string `json:"ordType"` - Side order.Side `json:"side"` - PositionSide string `json:"posSide"` - TradeMode string `json:"tdMode"` - TradeID string `json:"tradeId"` - FillTime time.Time `json:"fillTime"` - Source string `json:"source"` - State string `json:"state"` - TakeProfitTriggerPriceType string `json:"tpTriggerPxType"` - StopLossTriggerPriceType string `json:"slTriggerPxType"` - StopLossOrdPx string `json:"slOrdPx"` - RebateCurrency string `json:"rebateCcy"` - QuantityType string `json:"tgtCcy"` // base_ccy and quote_ccy - Category string `json:"category"` // normal, twap, adl, full_liquidation, partial_liquidation, delivery, ddh - AccumulatedFillSize okxNumericalValue `json:"accFillSz"` - FillPrice okxNumericalValue `json:"fillPx"` - FillSize okxNumericalValue `json:"fillSz"` - RebateAmount okxNumericalValue `json:"rebate"` - FeeCurrency string `json:"feeCcy"` - TransactionFee okxNumericalValue `json:"fee"` - AveragePrice okxNumericalValue `json:"avgPx"` - Leverage okxNumericalValue `json:"lever"` - Price okxNumericalValue `json:"px"` - Size okxNumericalValue `json:"sz"` - TakeProfitTriggerPrice okxNumericalValue `json:"tpTriggerPx"` - TakeProfitOrderPrice okxNumericalValue `json:"tpOrdPx"` - StopLossTriggerPrice okxNumericalValue `json:"slTriggerPx"` - UpdateTime time.Time `json:"uTime"` - CreationTime time.Time `json:"cTime"` + InstrumentType string `json:"instType"` + InstrumentID string `json:"instId"` + Currency string `json:"ccy"` + OrderID string `json:"ordId"` + ClientOrderID string `json:"clOrdId"` + Tag string `json:"tag"` + ProfitAndLoss string `json:"pnl"` + OrderType string `json:"ordType"` + Side order.Side `json:"side"` + PositionSide string `json:"posSide"` + TradeMode string `json:"tdMode"` + TradeID string `json:"tradeId"` + FillTime time.Time `json:"fillTime"` + Source string `json:"source"` + State string `json:"state"` + TakeProfitTriggerPriceType string `json:"tpTriggerPxType"` + StopLossTriggerPriceType string `json:"slTriggerPxType"` + StopLossOrdPx string `json:"slOrdPx"` + RebateCurrency string `json:"rebateCcy"` + QuantityType string `json:"tgtCcy"` // base_ccy and quote_ccy + Category string `json:"category"` // normal, twap, adl, full_liquidation, partial_liquidation, delivery, ddh + AccumulatedFillSize types.Number `json:"accFillSz"` + FillPrice types.Number `json:"fillPx"` + FillSize types.Number `json:"fillSz"` + RebateAmount types.Number `json:"rebate"` + FeeCurrency string `json:"feeCcy"` + TransactionFee types.Number `json:"fee"` + AveragePrice types.Number `json:"avgPx"` + Leverage types.Number `json:"lever"` + Price types.Number `json:"px"` + Size types.Number `json:"sz"` + TakeProfitTriggerPrice types.Number `json:"tpTriggerPx"` + TakeProfitOrderPrice types.Number `json:"tpOrdPx"` + StopLossTriggerPrice types.Number `json:"slTriggerPx"` + UpdateTime time.Time `json:"uTime"` + CreationTime time.Time `json:"cTime"` } // OrderListRequestParams represents order list requesting parameters. @@ -1118,12 +1118,12 @@ type LendingHistory struct { // PublicBorrowInfo holds a currency's borrow info. type PublicBorrowInfo struct { - Currency string `json:"ccy"` - AverageAmount okxNumericalValue `json:"avgAmt"` - AverageAmountUSD okxNumericalValue `json:"avgAmtUsd"` - AverageRate okxNumericalValue `json:"avgRate"` - PreviousRate okxNumericalValue `json:"preRate"` - EstimatedRate okxNumericalValue `json:"estRate"` + Currency string `json:"ccy"` + AverageAmount types.Number `json:"avgAmt"` + AverageAmountUSD types.Number `json:"avgAmtUsd"` + AverageRate types.Number `json:"avgRate"` + PreviousRate types.Number `json:"preRate"` + EstimatedRate types.Number `json:"estRate"` } // PublicBorrowHistory holds a currencies borrow history. @@ -1136,9 +1136,9 @@ type PublicBorrowHistory struct { // ConvertCurrency represents currency conversion detailed data. type ConvertCurrency struct { - Currency string `json:"currency"` - Min okxNumericalValue `json:"min"` - Max okxNumericalValue `json:"max"` + Currency string `json:"currency"` + Min types.Number `json:"min"` + Max types.Number `json:"max"` } // ConvertCurrencyPair holds information related to conversion between two pairs. @@ -1224,16 +1224,16 @@ type ConvertHistory struct { // Account holds currency account balance and related information type Account struct { - AdjEq okxNumericalValue `json:"adjEq"` - Details []AccountDetail `json:"details"` - Imr okxNumericalValue `json:"imr"` // Frozen equity for open positions and pending orders in USD level Applicable to Multi-currency margin and Portfolio margin - IsoEq okxNumericalValue `json:"isoEq"` - MgnRatio okxNumericalValue `json:"mgnRatio"` - Mmr okxNumericalValue `json:"mmr"` // Maintenance margin requirement in USD level Applicable to Multi-currency margin and Portfolio margin - NotionalUsd okxNumericalValue `json:"notionalUsd"` - OrdFroz okxNumericalValue `json:"ordFroz"` // Margin frozen for pending orders in USD level Applicable to Multi-currency margin and Portfolio margin - TotalEquity okxNumericalValue `json:"totalEq"` // Total Equity in USD level - UpdateTime okxUnixMilliTime `json:"uTime"` // UpdateTime + AdjEq types.Number `json:"adjEq"` + Details []AccountDetail `json:"details"` + Imr types.Number `json:"imr"` // Frozen equity for open positions and pending orders in USD level Applicable to Multi-currency margin and Portfolio margin + IsoEq types.Number `json:"isoEq"` + MgnRatio types.Number `json:"mgnRatio"` + Mmr types.Number `json:"mmr"` // Maintenance margin requirement in USD level Applicable to Multi-currency margin and Portfolio margin + NotionalUsd types.Number `json:"notionalUsd"` + OrdFroz types.Number `json:"ordFroz"` // Margin frozen for pending orders in USD level Applicable to Multi-currency margin and Portfolio margin + TotalEquity types.Number `json:"totalEq"` // Total Equity in USD level + UpdateTime okxUnixMilliTime `json:"uTime"` // UpdateTime } // AccountDetail account detail information. @@ -1380,26 +1380,26 @@ type BillsDetailQueryParameter struct { // BillsDetailResponse represents account bills information. type BillsDetailResponse struct { - Balance okxNumericalValue `json:"bal"` - BalanceChange string `json:"balChg"` - BillID string `json:"billId"` - Currency string `json:"ccy"` - ExecType string `json:"execType"` // Order flow type, T:taker M:maker - Fee types.Number `json:"fee"` // Fee Negative number represents the user transaction fee charged by the platform. Positive number represents rebate. - From string `json:"from"` // The remitting account 6: FUNDING 18: Trading account When bill type is not transfer, the field returns "". - InstrumentID string `json:"instId"` - InstrumentType asset.Item `json:"instType"` - MarginMode string `json:"mgnMode"` - Notes string `json:"notes"` // notes When bill type is not transfer, the field returns "". - OrderID string `json:"ordId"` - ProfitAndLoss types.Number `json:"pnl"` - PositionLevelBalance types.Number `json:"posBal"` - PositionLevelBalanceChange types.Number `json:"posBalChg"` - SubType string `json:"subType"` - Size types.Number `json:"sz"` - To string `json:"to"` - Timestamp okxUnixMilliTime `json:"ts"` - Type string `json:"type"` + Balance types.Number `json:"bal"` + BalanceChange string `json:"balChg"` + BillID string `json:"billId"` + Currency string `json:"ccy"` + ExecType string `json:"execType"` // Order flow type, T:taker M:maker + Fee types.Number `json:"fee"` // Fee Negative number represents the user transaction fee charged by the platform. Positive number represents rebate. + From string `json:"from"` // The remitting account 6: FUNDING 18: Trading account When bill type is not transfer, the field returns "". + InstrumentID string `json:"instId"` + InstrumentType asset.Item `json:"instType"` + MarginMode string `json:"mgnMode"` + Notes string `json:"notes"` // notes When bill type is not transfer, the field returns "". + OrderID string `json:"ordId"` + ProfitAndLoss types.Number `json:"pnl"` + PositionLevelBalance types.Number `json:"posBal"` + PositionLevelBalanceChange types.Number `json:"posBalChg"` + SubType string `json:"subType"` + Size types.Number `json:"sz"` + To string `json:"to"` + Timestamp okxUnixMilliTime `json:"ts"` + Type string `json:"type"` } // AccountConfigurationResponse represents account configuration response. @@ -1431,10 +1431,10 @@ type SetLeverageInput struct { // SetLeverageResponse represents set leverage response type SetLeverageResponse struct { - Leverage okxNumericalValue `json:"lever"` - MarginMode string `json:"mgnMode"` // Margin Mode "cross" and "isolated" - InstrumentID string `json:"instId"` - PositionSide string `json:"posSide"` // "long", "short", and "net" + Leverage types.Number `json:"lever"` + MarginMode string `json:"mgnMode"` // Margin Mode "cross" and "isolated" + InstrumentID string `json:"instId"` + PositionSide string `json:"posSide"` // "long", "short", and "net" } // MaximumBuyAndSell get maximum buy , sell amount or open amount @@ -1465,20 +1465,20 @@ type IncreaseDecreaseMarginInput struct { // IncreaseDecreaseMargin represents increase or decrease the margin of the isolated position response type IncreaseDecreaseMargin struct { - Amount okxNumericalValue `json:"amt"` - Ccy string `json:"ccy"` - InstrumentID string `json:"instId"` - Leverage okxNumericalValue `json:"leverage"` - PosSide string `json:"posSide"` - Type string `json:"type"` + Amount types.Number `json:"amt"` + Ccy string `json:"ccy"` + InstrumentID string `json:"instId"` + Leverage types.Number `json:"leverage"` + PosSide string `json:"posSide"` + Type string `json:"type"` } // LeverageResponse instrument id leverage response. type LeverageResponse struct { - InstrumentID string `json:"instId"` - MarginMode string `json:"mgnMode"` - PositionSide string `json:"posSide"` - Leverage okxNumericalValue `json:"lever"` + InstrumentID string `json:"instId"` + MarginMode string `json:"mgnMode"` + PositionSide string `json:"posSide"` + Leverage types.Number `json:"lever"` } // MaximumLoanInstrument represents maximum loan of an instrument id. @@ -2991,13 +2991,13 @@ type TradeOneClickRepayParam struct { // CurrencyOneClickRepay represents one click repay currency type CurrencyOneClickRepay struct { - DebtCurrency string `json:"debtCcy"` - FillFromSize okxNumericalValue `json:"fillFromSz"` - FillRepaySize okxNumericalValue `json:"fillRepaySz"` - FillToSize types.Number `json:"fillToSz"` - RepayCurrency string `json:"repayCcy"` - Status string `json:"status"` - UpdateTime time.Time `json:"uTime"` + DebtCurrency string `json:"debtCcy"` + FillFromSize types.Number `json:"fillFromSz"` + FillRepaySize types.Number `json:"fillRepaySz"` + FillToSize types.Number `json:"fillToSz"` + RepayCurrency string `json:"repayCcy"` + Status string `json:"status"` + UpdateTime time.Time `json:"uTime"` } // SetQuoteProductParam represents set quote product request param @@ -3084,7 +3084,7 @@ type Offer struct { ProtocolType string `json:"protocolType"` EarningCcy []string `json:"earningCcy"` Term string `json:"term"` - Apy okxNumericalValue `json:"apy"` + Apy types.Number `json:"apy"` EarlyRedeem bool `json:"earlyRedeem"` InvestData []OfferInvestData `json:"investData"` EarningData []struct { @@ -3095,10 +3095,10 @@ type Offer struct { // OfferInvestData represents currencies invest data information for an offer type OfferInvestData struct { - Currency string `json:"ccy"` - Balance okxNumericalValue `json:"bal"` - MinimumAmount okxNumericalValue `json:"minAmt"` - MaximumAmount okxNumericalValue `json:"maxAmt"` + Currency string `json:"ccy"` + Balance types.Number `json:"bal"` + MinimumAmount types.Number `json:"minAmt"` + MaximumAmount types.Number `json:"maxAmt"` } // PurchaseRequestParam represents purchase request param specific product diff --git a/types/number.go b/types/number.go index c12a01bf223..452760fe760 100644 --- a/types/number.go +++ b/types/number.go @@ -71,3 +71,8 @@ func (f Number) Int64() int64 { func (f Number) Decimal() decimal.Decimal { return decimal.NewFromFloat(float64(f)) } + +// String returns a string representation of the number +func (f Number) String() string { + return strconv.FormatFloat(float64(f), 'f', -1, 64) +}