Files
gocryptotrader/exchanges/huobi/ratelimit.go
Ryan O'Hara-Reid 0a84c5d97a Request package update & rate limit system expansion (#413)
* Initial rework of rework of requester - WIP

* Implementing and checking rate limits - WIP

* implemented coinbene rate limiting shenanigans

* add in remaining WIP

* fixy

* use authenticated rate limit

* drop ceiling as this can be done with a counter later

* add functionality to struct

* purge config options for rate limiting so as to keep things minimal

* prepare futures and swap rate limiting for implementation

* Address linter issues

* Addressed nits, fixed race

* fix linter issue

* remove global var as this was only setting when newrequester was called

* moved rate limit functionality into its own file

* Update Bitfinex with correct rate limit and test endpoints (WIP)

* finish off bitfinex adjustments

* fixes

* fix linter issues

* slowed rate for coinbasepro

* drop rate limit for huobi as the doc times have intermittent 429 issues.

* Set MACOSX_DEPLOYMENT_TARGET to remove linking warning

* Addr Thrasher nits

* Addr glorious nits

* unexport do request function

* fixed nitorinos

* Fixed something I missed

* move disabled rate limiter into loadexchange and use interface functionality

* Add temp quick fix
2020-02-06 11:44:28 +11:00

75 lines
2.2 KiB
Go

package huobi
import (
"time"
"github.com/thrasher-corp/gocryptotrader/exchanges/request"
"golang.org/x/time/rate"
)
const (
// Huobi rate limits per API Key
huobiSpotRateInterval = time.Second * 1
huobiSpotRequestRate = 7
huobiFuturesRateInterval = time.Second * 3
huobiFuturesAuthRequestRate = 30
// Non market-request public interface rate
huobiFuturesUnAuthRequestRate = 60
huobiFuturesTransferRateInterval = time.Second * 3
huobiFuturesTransferReqRate = 10
huobiSwapRateInterval = time.Second * 3
huobiSwapAuthRequestRate = 30
huobiSwapUnauthRequestRate = 60
huobiFuturesAuth request.EndpointLimit = iota
huobiFuturesUnAuth
huobiFuturesTransfer
huobiSwapAuth
huobiSwapUnauth
)
// RateLimit implements the request.Limiter interface
type RateLimit struct {
Spot *rate.Limiter
FuturesAuth *rate.Limiter
FuturesUnauth *rate.Limiter
SwapAuth *rate.Limiter
SwapUnauth *rate.Limiter
FuturesXfer *rate.Limiter
}
// Limit limits outbound requests
func (r *RateLimit) Limit(f request.EndpointLimit) error {
switch f {
// TODO: Add futures and swap functionality
case huobiFuturesAuth:
time.Sleep(r.FuturesAuth.Reserve().Delay())
case huobiFuturesUnAuth:
time.Sleep(r.FuturesUnauth.Reserve().Delay())
case huobiFuturesTransfer:
time.Sleep(r.FuturesXfer.Reserve().Delay())
case huobiSwapAuth:
time.Sleep(r.SwapAuth.Reserve().Delay())
case huobiSwapUnauth:
time.Sleep(r.SwapUnauth.Reserve().Delay())
default:
// Spot calls
time.Sleep(r.Spot.Reserve().Delay())
}
return nil
}
// SetRateLimit returns the rate limit for the exchange
func SetRateLimit() *RateLimit {
return &RateLimit{
Spot: request.NewRateLimit(huobiSpotRateInterval, huobiSpotRequestRate),
FuturesAuth: request.NewRateLimit(huobiFuturesRateInterval, huobiFuturesAuthRequestRate),
FuturesUnauth: request.NewRateLimit(huobiFuturesRateInterval, huobiFuturesUnAuthRequestRate),
SwapAuth: request.NewRateLimit(huobiSwapRateInterval, huobiSwapAuthRequestRate),
SwapUnauth: request.NewRateLimit(huobiSwapRateInterval, huobiSwapUnauthRequestRate),
FuturesXfer: request.NewRateLimit(huobiFuturesTransferRateInterval, huobiFuturesTransferReqRate),
}
}