Files
gocryptotrader/exchanges/bybit/ratelimit.go
Jaydeep Rajpurohit 247da918a8 exchanges: Add ByBit support (#887)
* few fixes and add ratelimiter

* adds test

* revert configtest.json changes

* configtest updated

* WIP: adds public endpoint support

* WIP: adds public endpoint support

* adds public endpoint support

* WIP: adds auth. endpoint support

* adds test for auth. endpoint

* fixes

* adds auth. endpoint support

* WIP: ws support

* WIP

* WIP

* WIP

* WIP

* WIP

* WIP

* WIP

* Testing

* Complete WS spot testing

* adds support for ws events

* minor change

* WIP: adds REST support for CoinMarginedFutures

* Fixes

* WIP: adds REST support for CoinMarginedFutures

* Fixes

* improvement in SPOT REST

* Typo fix

* WIP: add REST support for CMF Account API

* minor fixes

* WIP: add support for CMF conditional orders and few minor fixes

* complete support for CMF conditional orders

* adds support for public CMF endpoint

* adds support for CMF position API

* Complete REST CMF support

* WIP

* Testing REST CMF support

* Testing REST CMF support

* Testing REST CMF support completed

* WIP: add support for UMF

* completed non-auth UMF

* WIP: add support for REST Auth. UMF

* WIP: add support for REST Auth. UMF and some improvements

* WIP

* WIP

* WIP

* completed REST UMF

* renaming

* adds REST support for futures

* add testcases for UMF and some optimizations

* add testcases for futures

* Testing UMF, futures and its changes

* Fixes

* Fixes after testing

* WIP

* WIP

* WIP

* completed ws USDT futures support

* WIP: ws support for futures

* fixes in WS futures

* fixes in WS support

* roll back changes made for WS CMF, USDT and Futures

* fixes

* WIP

* WIP

* fixes

* Steps for new PR

* WIP

* WIP

* WIP

* WIP

* complete PR setup

* fixes for successfully running tests

* update in symbol for futures pair in test file

* WIP

* Fixes in test file and other minor fix

* fix testdata/configtest.json

* reset CONTRIBUTORS file

* review changes

* remove unwanted file

* remove redundant code

* improvisation

* adds comment for exported functions

* remove unwanted TODO and commented code

* fix

* improvisation

* fix

* defined errors

* improvisation

* improvisation

* improvisation

* updates test

* adds comment for exported types

* review changes

* review changes

* fix

* fixes

* Changes for making BYBIT compatible with existing code base

* Test file changes

* Changes for making BYBIT compatible with existing code base

* Changes for making BYBIT compatible with existing code base

* fix lint issues

* fix

* review changes

* review changes

* review changes

* review changes

* review changes

* review changes

* review changes

* review changes

* review changes

* review changes

* WIP

* add test cases for new API's

* minor improvements

* add missing API and their tests

* minor fixes

* add bybitTime

* add bybitTimeSec, bybitTimeMilliSec, bybitTimeNanoSec and necessary support

* fix GetTradeHistory function

* error handling

* test fixes

* add GetServerTime API

* adds GetHistoricCandlesExtended and review changes

* test fixes

* minor fix

* integrating CMF Bybit recent change log

* minor fixes

* adds extractCurrencyPair

* minor fixes

* minor fix

* review changes

* adds variable declaration of error

* review commit

* adds embeddable type in API response for all API and integrate it

* fixes

* adds authentication WS connection

* review changes

* review changes

* compatible changes

* adds asset to GetWithdrawalsHistory

* adds asset_type in rpc.proto

* adds asset argument in gctcli withdrawal request command

* improve error handling in exchange API error

* web socket fix

* review changes

* improvements

* improvements

* minor fix

* review changes

* fixing wrapper issues

* fixes

* fixes

* review changes

* add test cases

* fix for GetActiveOrders

* lint fixes

* fixes in websocket

* adds wrapper testcases

* adds wrapper testcases

* adds wrapper testcases

* fixes

* fix issue with GetHistoricCandlesExtended

* fix merge issues

* improving error reporting

* adds wrapper testcases and a minor fix

* gctrpc changes

* adds test cases
fixes in websocket

* review changes for ws

* review changes in WS

* fix gctrpc

* merge fixes

* review changes

* WIP

* updates pair in configs

* adds new asset USDCMarginedFutures

* adds URL const for USDCMarginedFutures

* adds API support

* minor fixes

* adds kline API

* minor fix

* adds API

* adds API

* adds API

* WIP

* WIP

* WIP

* adds support for USDC auth requests to SendAuthHTTPRequest

* adds SendUSDCAuthHTTPRequest

* run test and fix them

* rollback support added for Auth. USDC request inside SendAuthHTTPRequest

* adds API and test cases

* adds API and test cases

* adds APIs and test cases

* adds APIs

* adds rate limit for USDC

* adds USDCMarginedFutures to wrapper

* adds USDC testcases in wrapper and fix few issues

* minor test fixes

* minor test fixes

* fix lint issues

* WIP

* Merge changes

* minor fixes

* remove "else" and optimize

* review changes

* review changes

* review changes

* fix lint issue

* merge fix

* fix test

* fix templates and run them

* changes after merge

* review changes and improvements

* code improvement

* fixes with respect to changes in API response in documentation

* fixed review change in test

* adds check in CancelExistingOrder

* update exchange template

* review changes

* adds GetDepositAddress API

* WIP: adds GetOrderHistory

* complete GetOrderHistory

* fixes

* adds test case

* fixes and add WithdrawFund API

* WIP

* WIP

* updating all SendAuthHTTPRequest call

* adds WithdrawCryptocurrencyFunds

* update test cases

* fix lint issues

* fixes after merge

* adds GetAvailableTransferChains and few fixes

* minor fix in GetDepositAddress

* minor fix with WS ping/pong handling

* add ping handler for WS Auth.

* fix typo mistake

* update doc
2022-08-08 11:29:43 +10:00

404 lines
14 KiB
Go

package bybit
import (
"context"
"fmt"
"time"
"github.com/thrasher-corp/gocryptotrader/exchanges/request"
"golang.org/x/time/rate"
)
const (
spotInterval = time.Second
spotRequestRate = 70
futuresPublicInterval = time.Second
futuresRequestRate = 50
spotPrivateRequestRate = 20
futuresInterval = time.Minute
futuresDefaultRateCount = 100
futuresOrderRate = 100
futuresOrderListRate = 600
futuresExecutionRate = 120
futuresPositionRateCount = 75
futuresPositionListRate = 120
futuresFundingRate = 120
futuresWalletRate = 120
futuresAccountRate = 600
usdcPerpetualPublicRate = 50
usdcPerpetualCancelAllRate = 1
usdcPerpetualPrivateRate = 5
usdcPerpetualInterval = time.Second
)
const (
publicSpotRate request.EndpointLimit = iota
publicFuturesRate
privateSpotRate
cFuturesDefaultRate
cFuturesCancelActiveOrderRate
cFuturesCancelAllActiveOrderRate
cFuturesCreateConditionalOrderRate
cFuturesCancelConditionalOrderRate
cFuturesReplaceActiveOrderRate
cFuturesReplaceConditionalOrderRate
cFuturesCreateOrderRate
cFuturesCancelAllConditionalOrderRate
cFuturesGetActiveOrderRate
cFuturesGetConditionalOrderRate
cFuturesGetRealtimeOrderRate
cFuturesTradeRate
cFuturesSetLeverageRate
cFuturesUpdateMarginRate
cFuturesSetTradingRate
cFuturesSwitchPositionRate
cFuturesGetTradingFeeRate
cFuturesPositionRate
cFuturesWalletBalanceRate
cFuturesLastFundingFeeRate
cFuturesPredictFundingRate
cFuturesWalletFundRecordRate
cFuturesWalletWithdrawalRate
cFuturesAPIKeyInfoRate
uFuturesDefaultRate
uFuturesCreateOrderRate
uFuturesCancelOrderRate
uFuturesCancelAllOrderRate
uFuturesCreateConditionalOrderRate
uFuturesCancelConditionalOrderRate
uFuturesCancelAllConditionalOrderRate
uFuturesSetLeverageRate
uFuturesSwitchMargin
uFuturesSwitchPosition
uFuturesSetMarginRate
uFuturesSetTradingStopRate
uFuturesUpdateMarginRate
uFuturesPositionRate
uFuturesGetClosedTradesRate
uFuturesGetTradesRate
uFuturesGetActiveOrderRate
uFuturesGetActiveRealtimeOrderRate
uFuturesGetConditionalOrderRate
uFuturesGetConditionalRealtimeOrderRate
uFuturesGetMyLastFundingFeeRate
uFuturesPredictFundingRate
futuresDefaultRate
futuresCancelOrderRate
futuresCreateOrderRate
futuresReplaceOrderRate
futuresCancelAllOrderRate
futuresCancelAllConditionalOrderRate
futuresReplaceConditionalOrderRate
futuresCancelConditionalOrderRate
futuresCreateConditionalOrderRate
futuresGetActiveOrderRate
futuresGetConditionalOrderRate
futuresGetActiveRealtimeOrderRate
futuresGetConditionalRealtimeOrderRate
futuresGetTradeRate
futuresSetLeverageRate
futuresUpdateMarginRate
futuresSetTradingStopRate
futuresSwitchPositionModeRate
futuresSwitchMarginRate
futuresSwitchPositionRate
futuresPositionRate
usdcPublicRate
usdcCancelAllOrderRate
usdcPlaceOrderRate
usdcModifyOrderRate
usdcCancelOrderRate
usdcGetOrderRate
usdcGetOrderHistoryRate
usdcGetTradeHistoryRate
usdcGetTransactionRate
usdcGetWalletRate
usdcGetAssetRate
usdcGetMarginRate
usdcGetPositionRate
usdcSetLeverageRate
usdcGetSettlementRate
usdcSetRiskRate
usdcGetPredictedFundingRate
)
// RateLimit implements the request.Limiter interface
type RateLimit struct {
SpotRate *rate.Limiter
FuturesRate *rate.Limiter
PrivateSpotRate *rate.Limiter
CMFuturesDefaultRate *rate.Limiter
CMFuturesOrderRate *rate.Limiter
CMFuturesOrderListRate *rate.Limiter
CMFuturesExecutionRate *rate.Limiter
CMFuturesPositionRate *rate.Limiter
CMFuturesPositionListRate *rate.Limiter
CMFuturesFundingRate *rate.Limiter
CMFuturesWalletRate *rate.Limiter
CMFuturesAccountRate *rate.Limiter
UFuturesDefaultRate *rate.Limiter
UFuturesOrderRate *rate.Limiter
UFuturesPositionRate *rate.Limiter
UFuturesPositionListRate *rate.Limiter
UFuturesOrderListRate *rate.Limiter
UFuturesFundingRate *rate.Limiter
FuturesDefaultRate *rate.Limiter
FuturesOrderRate *rate.Limiter
FuturesOrderListRate *rate.Limiter
FuturesExecutionRate *rate.Limiter
FuturesPositionRate *rate.Limiter
FuturesPositionListRate *rate.Limiter
USDCPublic *rate.Limiter
USDCPlaceOrderRate *rate.Limiter
USDCModifyOrderRate *rate.Limiter
USDCCancelOrderRate *rate.Limiter
USDCCancelAllOrderRate *rate.Limiter
USDCGetOrderRate *rate.Limiter
USDCGetOrderHistoryRate *rate.Limiter
USDCGetTradeHistoryRate *rate.Limiter
USDCGetTransactionRate *rate.Limiter
USDCGetWalletRate *rate.Limiter
USDCGetAssetRate *rate.Limiter
USDCGetMarginRate *rate.Limiter
USDCGetPositionRate *rate.Limiter
USDCSetLeverageRate *rate.Limiter
USDCGetSettlementRate *rate.Limiter
USDCSetRiskRate *rate.Limiter
USDCGetPredictedFundingRate *rate.Limiter
}
// Limit executes rate limiting functionality for Binance
func (r *RateLimit) Limit(ctx context.Context, f request.EndpointLimit) error {
var limiter *rate.Limiter
var tokens int
switch f {
case publicSpotRate:
limiter, tokens = r.SpotRate, 1
case privateSpotRate:
limiter, tokens = r.PrivateSpotRate, 1
case cFuturesDefaultRate:
limiter, tokens = r.CMFuturesDefaultRate, 1
case cFuturesCancelActiveOrderRate, cFuturesCreateConditionalOrderRate, cFuturesCancelConditionalOrderRate, cFuturesReplaceActiveOrderRate,
cFuturesReplaceConditionalOrderRate, cFuturesCreateOrderRate:
limiter, tokens = r.CMFuturesOrderRate, 1
case cFuturesCancelAllActiveOrderRate, cFuturesCancelAllConditionalOrderRate:
limiter, tokens = r.CMFuturesOrderRate, 10
case cFuturesGetActiveOrderRate, cFuturesGetConditionalOrderRate, cFuturesGetRealtimeOrderRate:
limiter, tokens = r.CMFuturesOrderListRate, 1
case cFuturesTradeRate:
limiter, tokens = r.CMFuturesExecutionRate, 1
case cFuturesSetLeverageRate, cFuturesUpdateMarginRate, cFuturesSetTradingRate, cFuturesSwitchPositionRate, cFuturesGetTradingFeeRate:
limiter, tokens = r.CMFuturesPositionRate, 1
case cFuturesPositionRate, cFuturesWalletBalanceRate:
limiter, tokens = r.CMFuturesPositionListRate, 1
case cFuturesLastFundingFeeRate, cFuturesPredictFundingRate:
limiter, tokens = r.CMFuturesFundingRate, 1
case cFuturesWalletFundRecordRate, cFuturesWalletWithdrawalRate:
limiter, tokens = r.CMFuturesWalletRate, 1
case cFuturesAPIKeyInfoRate:
limiter, tokens = r.CMFuturesAccountRate, 1
case uFuturesDefaultRate:
limiter, tokens = r.UFuturesDefaultRate, 1
case uFuturesCreateOrderRate, uFuturesCancelOrderRate, uFuturesCreateConditionalOrderRate, uFuturesCancelConditionalOrderRate:
limiter, tokens = r.UFuturesOrderRate, 1
case uFuturesCancelAllOrderRate, uFuturesCancelAllConditionalOrderRate:
limiter, tokens = r.UFuturesOrderRate, 10
case uFuturesSetLeverageRate, uFuturesSwitchMargin, uFuturesSwitchPosition, uFuturesSetMarginRate, uFuturesSetTradingStopRate, uFuturesUpdateMarginRate:
limiter, tokens = r.UFuturesPositionRate, 1
case uFuturesPositionRate, uFuturesGetClosedTradesRate, uFuturesGetTradesRate:
limiter, tokens = r.UFuturesPositionListRate, 1
case uFuturesGetActiveOrderRate, uFuturesGetActiveRealtimeOrderRate, uFuturesGetConditionalOrderRate, uFuturesGetConditionalRealtimeOrderRate:
limiter, tokens = r.UFuturesOrderListRate, 1
case uFuturesGetMyLastFundingFeeRate, uFuturesPredictFundingRate:
limiter, tokens = r.UFuturesFundingRate, 1
case futuresDefaultRate:
limiter, tokens = r.FuturesDefaultRate, 1
case futuresCancelOrderRate, futuresCreateOrderRate, futuresReplaceOrderRate, futuresReplaceConditionalOrderRate, futuresCancelConditionalOrderRate,
futuresCreateConditionalOrderRate:
limiter, tokens = r.FuturesOrderRate, 1
case futuresCancelAllOrderRate, futuresCancelAllConditionalOrderRate:
limiter, tokens = r.FuturesOrderRate, 10
case futuresGetActiveOrderRate, futuresGetConditionalOrderRate, futuresGetActiveRealtimeOrderRate, futuresGetConditionalRealtimeOrderRate:
limiter, tokens = r.FuturesOrderListRate, 1
case futuresGetTradeRate:
limiter, tokens = r.FuturesExecutionRate, 1
case futuresSetLeverageRate, futuresUpdateMarginRate, futuresSetTradingStopRate, futuresSwitchPositionModeRate, futuresSwitchMarginRate, futuresSwitchPositionRate:
limiter, tokens = r.FuturesPositionRate, 1
case futuresPositionRate:
limiter, tokens = r.FuturesPositionListRate, 1
case usdcPublicRate:
limiter, tokens = r.USDCPublic, 1
case usdcCancelAllOrderRate:
limiter, tokens = r.USDCCancelAllOrderRate, 1
case usdcPlaceOrderRate:
limiter, tokens = r.USDCPlaceOrderRate, 1
case usdcModifyOrderRate:
limiter, tokens = r.USDCModifyOrderRate, 1
case usdcCancelOrderRate:
limiter, tokens = r.USDCCancelOrderRate, 1
case usdcGetOrderRate:
limiter, tokens = r.USDCGetOrderRate, 1
case usdcGetOrderHistoryRate:
limiter, tokens = r.USDCGetOrderHistoryRate, 1
case usdcGetTradeHistoryRate:
limiter, tokens = r.USDCGetTradeHistoryRate, 1
case usdcGetTransactionRate:
limiter, tokens = r.USDCGetTransactionRate, 1
case usdcGetWalletRate:
limiter, tokens = r.USDCGetWalletRate, 1
case usdcGetAssetRate:
limiter, tokens = r.USDCGetAssetRate, 1
case usdcGetMarginRate:
limiter, tokens = r.USDCGetMarginRate, 1
case usdcGetPositionRate:
limiter, tokens = r.USDCGetPositionRate, 1
case usdcSetLeverageRate:
limiter, tokens = r.USDCSetLeverageRate, 1
case usdcGetSettlementRate:
limiter, tokens = r.USDCGetSettlementRate, 1
case usdcSetRiskRate:
limiter, tokens = r.USDCSetRiskRate, 1
case usdcGetPredictedFundingRate:
limiter, tokens = r.USDCGetPredictedFundingRate, 1
default:
limiter, tokens = r.SpotRate, 1
}
var finalDelay time.Duration
var reserves = make([]*rate.Reservation, tokens)
for i := 0; i < tokens; i++ {
// Consume tokens 1 at a time as this avoids needing burst capacity in the limiter,
// which would otherwise allow the rate limit to be exceeded over short periods
reserves[i] = limiter.Reserve()
finalDelay = limiter.Reserve().Delay()
}
if dl, ok := ctx.Deadline(); ok && dl.Before(time.Now().Add(finalDelay)) {
// Cancel all potential reservations to free up rate limiter if deadline
// is exceeded.
for x := range reserves {
reserves[x].Cancel()
}
return fmt.Errorf("rate limit delay of %s will exceed deadline: %w",
finalDelay,
context.DeadlineExceeded)
}
time.Sleep(finalDelay)
return nil
}
// SetRateLimit returns the rate limit for the exchange
func SetRateLimit() *RateLimit {
return &RateLimit{
SpotRate: request.NewRateLimit(spotInterval, spotRequestRate),
FuturesRate: request.NewRateLimit(futuresPublicInterval, futuresRequestRate),
PrivateSpotRate: request.NewRateLimit(spotInterval, spotPrivateRequestRate),
CMFuturesDefaultRate: request.NewRateLimit(futuresInterval, futuresDefaultRateCount),
CMFuturesOrderRate: request.NewRateLimit(futuresInterval, futuresOrderRate),
CMFuturesOrderListRate: request.NewRateLimit(futuresInterval, futuresOrderListRate),
CMFuturesExecutionRate: request.NewRateLimit(futuresInterval, futuresExecutionRate),
CMFuturesPositionRate: request.NewRateLimit(futuresInterval, futuresPositionRateCount),
CMFuturesPositionListRate: request.NewRateLimit(futuresInterval, futuresPositionListRate),
CMFuturesFundingRate: request.NewRateLimit(futuresInterval, futuresFundingRate),
CMFuturesWalletRate: request.NewRateLimit(futuresInterval, futuresWalletRate),
CMFuturesAccountRate: request.NewRateLimit(futuresInterval, futuresAccountRate),
UFuturesDefaultRate: request.NewRateLimit(futuresInterval, futuresDefaultRateCount),
UFuturesOrderRate: request.NewRateLimit(futuresInterval, futuresOrderRate),
UFuturesPositionRate: request.NewRateLimit(futuresInterval, futuresPositionRateCount),
UFuturesPositionListRate: request.NewRateLimit(futuresInterval, futuresPositionListRate),
UFuturesOrderListRate: request.NewRateLimit(futuresInterval, futuresOrderListRate),
UFuturesFundingRate: request.NewRateLimit(futuresInterval, futuresFundingRate),
FuturesDefaultRate: request.NewRateLimit(futuresInterval, futuresDefaultRateCount),
FuturesOrderRate: request.NewRateLimit(futuresInterval, futuresOrderRate),
FuturesOrderListRate: request.NewRateLimit(futuresInterval, futuresOrderListRate),
FuturesExecutionRate: request.NewRateLimit(futuresInterval, futuresExecutionRate),
FuturesPositionRate: request.NewRateLimit(futuresInterval, futuresPositionRateCount),
FuturesPositionListRate: request.NewRateLimit(futuresInterval, futuresPositionListRate),
USDCPublic: request.NewRateLimit(usdcPerpetualInterval, usdcPerpetualPublicRate),
USDCPlaceOrderRate: request.NewRateLimit(usdcPerpetualInterval, usdcPerpetualPrivateRate),
USDCModifyOrderRate: request.NewRateLimit(usdcPerpetualInterval, usdcPerpetualPrivateRate),
USDCCancelOrderRate: request.NewRateLimit(usdcPerpetualInterval, usdcPerpetualPrivateRate),
USDCCancelAllOrderRate: request.NewRateLimit(usdcPerpetualInterval, usdcPerpetualCancelAllRate),
USDCGetOrderRate: request.NewRateLimit(usdcPerpetualInterval, usdcPerpetualPrivateRate),
USDCGetOrderHistoryRate: request.NewRateLimit(usdcPerpetualInterval, usdcPerpetualPrivateRate),
USDCGetTradeHistoryRate: request.NewRateLimit(usdcPerpetualInterval, usdcPerpetualPrivateRate),
USDCGetTransactionRate: request.NewRateLimit(usdcPerpetualInterval, usdcPerpetualPrivateRate),
USDCGetWalletRate: request.NewRateLimit(usdcPerpetualInterval, usdcPerpetualPrivateRate),
USDCGetAssetRate: request.NewRateLimit(usdcPerpetualInterval, usdcPerpetualPrivateRate),
USDCGetMarginRate: request.NewRateLimit(usdcPerpetualInterval, usdcPerpetualPrivateRate),
USDCGetPositionRate: request.NewRateLimit(usdcPerpetualInterval, usdcPerpetualPrivateRate),
USDCSetLeverageRate: request.NewRateLimit(usdcPerpetualInterval, usdcPerpetualPrivateRate),
USDCGetSettlementRate: request.NewRateLimit(usdcPerpetualInterval, usdcPerpetualPrivateRate),
USDCSetRiskRate: request.NewRateLimit(usdcPerpetualInterval, usdcPerpetualPrivateRate),
USDCGetPredictedFundingRate: request.NewRateLimit(usdcPerpetualInterval, usdcPerpetualPrivateRate),
}
}