diff --git a/exchanges/okx/okx.go b/exchanges/okx/okx.go index eed309a0..6f5d3ebe 100644 --- a/exchanges/okx/okx.go +++ b/exchanges/okx/okx.go @@ -2158,42 +2158,36 @@ func (ok *Okx) GetFee(ctx context.Context, feeBuilder *exchange.FeeBuilder) (flo var fee float64 switch feeBuilder.FeeType { case exchange.CryptocurrencyTradeFee: - var responses []TradeFeeRate uly, err := ok.GetUnderlying(feeBuilder.Pair, asset.Spot) if err != nil { return 0, err } - responses, err = ok.GetTradeFee(ctx, okxInstTypeSpot, uly, "") + responses, err := ok.GetTradeFee(ctx, okxInstTypeSpot, uly, "") if err != nil { return 0, err } else if len(responses) == 0 { return 0, errors.New("no trade fee response found") } if feeBuilder.IsMaker { - if fee, err = strconv.ParseFloat(responses[0].FeeRateMaker, 64); err != nil || fee == 0 { - fee, err = strconv.ParseFloat(responses[0].FeeRateMakerUSDT, 64) - if err != nil { - return fee, err - } + if feeBuilder.Pair.Quote.Equal(currency.USDC) { + fee = responses[0].FeeRateMakerUSDC.Float64() + } else if fee = responses[0].FeeRateMaker.Float64(); fee == 0 { + fee = responses[0].FeeRateMakerUSDT.Float64() } } else { - if fee, err = strconv.ParseFloat(responses[0].FeeRateTaker, 64); err != nil || fee == 0 { - fee, err = strconv.ParseFloat(responses[0].FeeRateTakerUSDT, 64) - if err != nil { - return fee, err - } + if feeBuilder.Pair.Quote.Equal(currency.USDC) { + fee = responses[0].FeeRateTakerUSDC.Float64() + } else if fee = responses[0].FeeRateTaker.Float64(); fee == 0 { + fee = responses[0].FeeRateTakerUSDT.Float64() } } - if fee < 0 { - fee = -fee + if fee != 0 { + fee = -fee // Negative fee rate means commission else rebate. } return fee * feeBuilder.Amount * feeBuilder.PurchasePrice, nil case exchange.OfflineTradeFee: return 0.0015 * feeBuilder.PurchasePrice * feeBuilder.Amount, nil } - if fee < 0 { - fee = 0 - } return fee, nil } diff --git a/exchanges/okx/okx_test.go b/exchanges/okx/okx_test.go index a377d05b..859c47ef 100644 --- a/exchanges/okx/okx_test.go +++ b/exchanges/okx/okx_test.go @@ -1366,7 +1366,7 @@ func TestGetMaximumLoanOfInstrument(t *testing.T) { } } -func TestGetFeeRate(t *testing.T) { +func TestGetTradeFee(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, ok) diff --git a/exchanges/okx/okx_types.go b/exchanges/okx/okx_types.go index 52573723..5d780774 100644 --- a/exchanges/okx/okx_types.go +++ b/exchanges/okx/okx_types.go @@ -5,6 +5,7 @@ import ( "strconv" "time" + "github.com/thrasher-corp/gocryptotrader/common/convert" "github.com/thrasher-corp/gocryptotrader/currency" "github.com/thrasher-corp/gocryptotrader/exchanges/asset" "github.com/thrasher-corp/gocryptotrader/exchanges/kline" @@ -1484,16 +1485,18 @@ type MaximumLoanInstrument struct { // TradeFeeRate holds trade fee rate information for a given instrument type. type TradeFeeRate struct { - Category string `json:"category"` - DeliveryFeeRate string `json:"delivery"` - Exercise string `json:"exercise"` - InstrumentType asset.Item `json:"instType"` - FeeRateLevel string `json:"level"` - FeeRateMaker string `json:"maker"` - FeeRateMakerUSDT string `json:"makerU"` - FeeRateTaker string `json:"taker"` - FeeRateTakerUSDT string `json:"takerU"` - Timestamp okxUnixMilliTime `json:"ts"` + Category string `json:"category"` + DeliveryFeeRate string `json:"delivery"` + Exercise string `json:"exercise"` + InstrumentType asset.Item `json:"instType"` + FeeRateLevel string `json:"level"` + FeeRateMaker convert.StringToFloat64 `json:"maker"` + FeeRateMakerUSDT convert.StringToFloat64 `json:"makerU"` + FeeRateMakerUSDC convert.StringToFloat64 `json:"makerUSDC"` + FeeRateTaker convert.StringToFloat64 `json:"taker"` + FeeRateTakerUSDT convert.StringToFloat64 `json:"takerU"` + FeeRateTakerUSDC convert.StringToFloat64 `json:"takerUSDC"` + Timestamp okxUnixMilliTime `json:"ts"` } // InterestAccruedData represents interest rate accrued response