mirror of
https://github.com/d0zingcat/gocryptotrader.git
synced 2026-05-13 23:16:45 +00:00
* initial consolidation of rate limiting code to request package to reduce bespoke code implementation * continued * finish abstraction * lint * exchanges: fix tests * linter: fix * poloniex: fix auth rate limit not being set * ratelimiter: convert from token to weight * glorious: nits addressed with fire * linter: rip * change func name set -> get * fix test * derbit: impl --------- Co-authored-by: Ryan O'Hara-Reid <ryan.oharareid@thrasher.io>
190 lines
9.6 KiB
Go
190 lines
9.6 KiB
Go
package binance
|
|
|
|
import (
|
|
"time"
|
|
|
|
"github.com/thrasher-corp/gocryptotrader/exchanges/request"
|
|
)
|
|
|
|
const (
|
|
// Binance limit rates
|
|
// Global dictates the max rate limit for general request items which is
|
|
// 1200 requests per minute
|
|
spotInterval = time.Minute
|
|
spotRequestRate = 1200
|
|
// Order related limits which are segregated from the global rate limits
|
|
// 100 requests per 10 seconds and max 100000 requests per day.
|
|
spotOrderInterval = 10 * time.Second
|
|
spotOrderRequestRate = 100
|
|
cFuturesInterval = time.Minute
|
|
cFuturesRequestRate = 6000
|
|
cFuturesOrderInterval = time.Minute
|
|
cFuturesOrderRequestRate = 1200
|
|
uFuturesInterval = time.Minute
|
|
uFuturesRequestRate = 2400
|
|
uFuturesOrderInterval = time.Minute
|
|
uFuturesOrderRequestRate = 1200
|
|
)
|
|
|
|
// Binance Spot rate limits
|
|
const (
|
|
spotDefaultRate request.EndpointLimit = iota
|
|
spotExchangeInfo
|
|
spotHistoricalTradesRate
|
|
spotOrderbookDepth500Rate
|
|
spotOrderbookDepth1000Rate
|
|
spotOrderbookDepth5000Rate
|
|
spotOrderbookTickerAllRate
|
|
spotPriceChangeAllRate
|
|
spotSymbolPriceAllRate
|
|
spotOpenOrdersAllRate
|
|
spotOpenOrdersSpecificRate
|
|
spotOrderRate
|
|
spotOrderQueryRate
|
|
spotAllOrdersRate
|
|
spotAccountInformationRate
|
|
uFuturesDefaultRate
|
|
uFuturesHistoricalTradesRate
|
|
uFuturesSymbolOrdersRate
|
|
uFuturesPairOrdersRate
|
|
uFuturesCurrencyForceOrdersRate
|
|
uFuturesAllForceOrdersRate
|
|
uFuturesIncomeHistoryRate
|
|
uFuturesOrderbook50Rate
|
|
uFuturesOrderbook100Rate
|
|
uFuturesOrderbook500Rate
|
|
uFuturesOrderbook1000Rate
|
|
uFuturesKline100Rate
|
|
uFuturesKline500Rate
|
|
uFuturesKline1000Rate
|
|
uFuturesKlineMaxRate
|
|
uFuturesTickerPriceHistoryRate
|
|
uFuturesOrdersDefaultRate
|
|
uFuturesGetAllOrdersRate
|
|
uFuturesAccountInformationRate
|
|
uFuturesOrderbookTickerAllRate
|
|
uFuturesCountdownCancelRate
|
|
uFuturesBatchOrdersRate
|
|
uFuturesGetAllOpenOrdersRate
|
|
cFuturesDefaultRate
|
|
cFuturesHistoricalTradesRate
|
|
cFuturesTickerPriceHistoryRate
|
|
cFuturesIncomeHistoryRate
|
|
cFuturesOrderbook50Rate
|
|
cFuturesOrderbook100Rate
|
|
cFuturesOrderbook500Rate
|
|
cFuturesOrderbook1000Rate
|
|
cFuturesKline500Rate
|
|
cFuturesKline1000Rate
|
|
cFuturesKlineMaxRate
|
|
cFuturesIndexMarkPriceRate
|
|
cFuturesBatchOrdersRate
|
|
cFuturesCancelAllOrdersRate
|
|
cFuturesGetAllOpenOrdersRate
|
|
cFuturesAllForceOrdersRate
|
|
cFuturesCurrencyForceOrdersRate
|
|
cFuturesPairOrdersRate
|
|
cFuturesSymbolOrdersRate
|
|
cFuturesAccountInformationRate
|
|
cFuturesOrderbookTickerAllRate
|
|
cFuturesOrdersDefaultRate
|
|
uFuturesMultiAssetMarginRate
|
|
uFuturesSetMultiAssetMarginRate
|
|
)
|
|
|
|
// GetRateLimits returns the rate limit for the exchange
|
|
func GetRateLimits() request.RateLimitDefinitions {
|
|
spotDefaultLimiter := request.NewRateLimit(spotInterval, spotRequestRate)
|
|
spotOrderLimiter := request.NewRateLimit(spotOrderInterval, spotOrderRequestRate)
|
|
usdMarginedFuturesLimiter := request.NewRateLimit(uFuturesInterval, uFuturesRequestRate)
|
|
usdMarginedFuturesOrdersLimiter := request.NewRateLimit(uFuturesOrderInterval, uFuturesOrderRequestRate)
|
|
coinMarginedFuturesLimiter := request.NewRateLimit(cFuturesInterval, cFuturesRequestRate)
|
|
coinMarginedFuturesOrdersLimiter := request.NewRateLimit(cFuturesOrderInterval, cFuturesOrderRequestRate)
|
|
|
|
return request.RateLimitDefinitions{
|
|
spotDefaultRate: request.GetRateLimiterWithWeight(spotDefaultLimiter, 1),
|
|
spotOrderbookTickerAllRate: request.GetRateLimiterWithWeight(spotDefaultLimiter, 2),
|
|
spotSymbolPriceAllRate: request.GetRateLimiterWithWeight(spotDefaultLimiter, 2),
|
|
spotHistoricalTradesRate: request.GetRateLimiterWithWeight(spotDefaultLimiter, 5),
|
|
spotOrderbookDepth500Rate: request.GetRateLimiterWithWeight(spotDefaultLimiter, 5),
|
|
spotOrderbookDepth1000Rate: request.GetRateLimiterWithWeight(spotDefaultLimiter, 10),
|
|
spotAccountInformationRate: request.GetRateLimiterWithWeight(spotDefaultLimiter, 10),
|
|
spotExchangeInfo: request.GetRateLimiterWithWeight(spotDefaultLimiter, 10),
|
|
spotPriceChangeAllRate: request.GetRateLimiterWithWeight(spotDefaultLimiter, 40),
|
|
spotOrderbookDepth5000Rate: request.GetRateLimiterWithWeight(spotDefaultLimiter, 50),
|
|
spotOrderRate: request.GetRateLimiterWithWeight(spotOrderLimiter, 1),
|
|
spotOrderQueryRate: request.GetRateLimiterWithWeight(spotOrderLimiter, 2),
|
|
spotOpenOrdersSpecificRate: request.GetRateLimiterWithWeight(spotOrderLimiter, 3),
|
|
spotAllOrdersRate: request.GetRateLimiterWithWeight(spotOrderLimiter, 10),
|
|
spotOpenOrdersAllRate: request.GetRateLimiterWithWeight(spotOrderLimiter, 40),
|
|
uFuturesDefaultRate: request.GetRateLimiterWithWeight(usdMarginedFuturesLimiter, 1),
|
|
uFuturesKline100Rate: request.GetRateLimiterWithWeight(usdMarginedFuturesLimiter, 1),
|
|
uFuturesOrderbook50Rate: request.GetRateLimiterWithWeight(usdMarginedFuturesLimiter, 2),
|
|
uFuturesKline500Rate: request.GetRateLimiterWithWeight(usdMarginedFuturesLimiter, 2),
|
|
uFuturesOrderbookTickerAllRate: request.GetRateLimiterWithWeight(usdMarginedFuturesLimiter, 2),
|
|
uFuturesOrderbook100Rate: request.GetRateLimiterWithWeight(usdMarginedFuturesLimiter, 5),
|
|
uFuturesKline1000Rate: request.GetRateLimiterWithWeight(usdMarginedFuturesLimiter, 5),
|
|
uFuturesAccountInformationRate: request.GetRateLimiterWithWeight(usdMarginedFuturesLimiter, 5),
|
|
uFuturesOrderbook500Rate: request.GetRateLimiterWithWeight(usdMarginedFuturesLimiter, 10),
|
|
uFuturesKlineMaxRate: request.GetRateLimiterWithWeight(usdMarginedFuturesLimiter, 10),
|
|
uFuturesOrderbook1000Rate: request.GetRateLimiterWithWeight(usdMarginedFuturesLimiter, 20),
|
|
uFuturesHistoricalTradesRate: request.GetRateLimiterWithWeight(usdMarginedFuturesLimiter, 20),
|
|
uFuturesTickerPriceHistoryRate: request.GetRateLimiterWithWeight(usdMarginedFuturesLimiter, 40),
|
|
uFuturesOrdersDefaultRate: request.GetRateLimiterWithWeight(usdMarginedFuturesOrdersLimiter, 1),
|
|
uFuturesBatchOrdersRate: request.GetRateLimiterWithWeight(usdMarginedFuturesOrdersLimiter, 5),
|
|
uFuturesGetAllOrdersRate: request.GetRateLimiterWithWeight(usdMarginedFuturesOrdersLimiter, 5),
|
|
uFuturesCountdownCancelRate: request.GetRateLimiterWithWeight(usdMarginedFuturesOrdersLimiter, 10),
|
|
uFuturesCurrencyForceOrdersRate: request.GetRateLimiterWithWeight(usdMarginedFuturesOrdersLimiter, 20),
|
|
uFuturesSymbolOrdersRate: request.GetRateLimiterWithWeight(usdMarginedFuturesOrdersLimiter, 20),
|
|
uFuturesIncomeHistoryRate: request.GetRateLimiterWithWeight(usdMarginedFuturesOrdersLimiter, 30),
|
|
uFuturesPairOrdersRate: request.GetRateLimiterWithWeight(usdMarginedFuturesOrdersLimiter, 40),
|
|
uFuturesGetAllOpenOrdersRate: request.GetRateLimiterWithWeight(usdMarginedFuturesOrdersLimiter, 40),
|
|
uFuturesAllForceOrdersRate: request.GetRateLimiterWithWeight(usdMarginedFuturesOrdersLimiter, 50),
|
|
cFuturesDefaultRate: request.GetRateLimiterWithWeight(coinMarginedFuturesLimiter, 1),
|
|
cFuturesKline500Rate: request.GetRateLimiterWithWeight(coinMarginedFuturesLimiter, 2),
|
|
cFuturesOrderbookTickerAllRate: request.GetRateLimiterWithWeight(coinMarginedFuturesLimiter, 2),
|
|
cFuturesKline1000Rate: request.GetRateLimiterWithWeight(coinMarginedFuturesLimiter, 5),
|
|
cFuturesAccountInformationRate: request.GetRateLimiterWithWeight(coinMarginedFuturesLimiter, 5),
|
|
cFuturesKlineMaxRate: request.GetRateLimiterWithWeight(coinMarginedFuturesLimiter, 10),
|
|
cFuturesIndexMarkPriceRate: request.GetRateLimiterWithWeight(coinMarginedFuturesLimiter, 10),
|
|
cFuturesHistoricalTradesRate: request.GetRateLimiterWithWeight(coinMarginedFuturesLimiter, 20),
|
|
cFuturesCurrencyForceOrdersRate: request.GetRateLimiterWithWeight(coinMarginedFuturesLimiter, 20),
|
|
cFuturesTickerPriceHistoryRate: request.GetRateLimiterWithWeight(coinMarginedFuturesLimiter, 40),
|
|
cFuturesAllForceOrdersRate: request.GetRateLimiterWithWeight(coinMarginedFuturesOrdersLimiter, 50),
|
|
cFuturesOrdersDefaultRate: request.GetRateLimiterWithWeight(coinMarginedFuturesOrdersLimiter, 1),
|
|
cFuturesBatchOrdersRate: request.GetRateLimiterWithWeight(coinMarginedFuturesOrdersLimiter, 5),
|
|
cFuturesGetAllOpenOrdersRate: request.GetRateLimiterWithWeight(coinMarginedFuturesOrdersLimiter, 5),
|
|
cFuturesCancelAllOrdersRate: request.GetRateLimiterWithWeight(coinMarginedFuturesOrdersLimiter, 10),
|
|
cFuturesIncomeHistoryRate: request.GetRateLimiterWithWeight(coinMarginedFuturesOrdersLimiter, 20),
|
|
cFuturesSymbolOrdersRate: request.GetRateLimiterWithWeight(coinMarginedFuturesOrdersLimiter, 20),
|
|
cFuturesPairOrdersRate: request.GetRateLimiterWithWeight(coinMarginedFuturesOrdersLimiter, 40),
|
|
cFuturesOrderbook50Rate: request.GetRateLimiterWithWeight(coinMarginedFuturesOrdersLimiter, 2),
|
|
cFuturesOrderbook100Rate: request.GetRateLimiterWithWeight(coinMarginedFuturesOrdersLimiter, 5),
|
|
cFuturesOrderbook500Rate: request.GetRateLimiterWithWeight(coinMarginedFuturesOrdersLimiter, 10),
|
|
cFuturesOrderbook1000Rate: request.GetRateLimiterWithWeight(coinMarginedFuturesOrdersLimiter, 20),
|
|
uFuturesMultiAssetMarginRate: request.GetRateLimiterWithWeight(usdMarginedFuturesLimiter, 30),
|
|
uFuturesSetMultiAssetMarginRate: request.GetRateLimiterWithWeight(usdMarginedFuturesLimiter, 1),
|
|
}
|
|
}
|
|
|
|
func openOrdersLimit(symbol string) request.EndpointLimit {
|
|
if symbol == "" {
|
|
return spotOpenOrdersAllRate
|
|
}
|
|
|
|
return spotOpenOrdersSpecificRate
|
|
}
|
|
|
|
func orderbookLimit(depth int) request.EndpointLimit {
|
|
switch {
|
|
case depth <= 100:
|
|
return spotDefaultRate
|
|
case depth <= 500:
|
|
return spotOrderbookDepth500Rate
|
|
case depth <= 1000:
|
|
return spotOrderbookDepth1000Rate
|
|
}
|
|
|
|
return spotOrderbookDepth5000Rate
|
|
}
|