Files
gocryptotrader/exchanges/gateio/ratelimiter.go
Samuael A 3eac6d12bd exchanges: Update GateIO exchange to V4 (#1058)
* Adding Public Endpoints and test functions

* Adding public endpoints and test functions

* Adding private spot endpoints

* Adding private endpoints and corresponding tests for margin

* Adding Margin Private endpoints

* Adding cross margin and flash swap endpoints

* Adding futures private endpoints

* Adding futures private endpoints and corresponding tests

* Adding Options and SubAccount endpoints and their unit tests

* Adding Wrapper functions

* Complete wrapper functions and corresponding unit test functions

* Fixing wrapper issues and adding websocket functions

* Update of Spot websocket and adding futures websocket handlers

* completed futures WS push data endpoints

* Completed Options websocket endpoints

* Adding websocket support for delivery futures and slight update on endpoint funcs

* Added Delivery websocket support and fix linter issues

* Update on Unit tests

* fix slight currency format error

* Fix slight endpoint tempos

* Update on conditional statements and unit tests issues

* fixing slight tempos

* Slight model and websocket data push method change

* Fix unit test tempos and updating models

* Fix on code structures and update on unit tests

* Slight code fix

* Remove print statements

* Update on tradable pairs fetch eps

* Fix websocket tempos

* Adding types to websocket routine manager

* Fix slight issues

* Slight fixes

* Updating wrapper funcs and models

* Slight update

* Update on test

* Update on tradable pairs

* update conditional statements

* Fixing slight issues

* Updating unit tests

* Minor fixes depending review comments

* Remove redundant method declaration

* Adding missing intervals

* Updating fetch tradable pairs

* update tradable pairs issues

* Addressing small tempos

* Slight fix on ticker

* Minor Fixes

* Minor review comment fixes

* Unit test and minor code updates

* Slight code updates

* Minor updates depending review comments

* Fixes

* Updating incoming message matcher

* Fix missing merge issue

* Fix minor wrapper issues

* Updating ratelimit and other issues

* Updating endpoint models and adding missing eps

* Update on code structure and models

* Minor codespell fixes

* Minor update on models

* fix unit test panic

* Minor race fix

* Fix issues in generating signature and unit tests

* Minor update on wrapper and unit tests

* Minor fix on wrapper

* Mini linter issues fix

* Minor fix

* endpoint fixes and slight update

* Minor fixes

* Updating exchange functions and unit tests

* Unit test and wrapper updates

* Remove options candlestick support

* Minor unit test and wrapper fix

* Unit test update

* minor fix on unit test and wrapper

* endpoints constants name change

* Add minor wrapper issues

* endpoint constants update

* endpoint url updates

* Updating subscriptions

* fixing dual mode endpoint methods

* minor fix

* rm small tempo

* Update on websocket orderbook handling

* Orderbook and currency pair update

* fix linter and test issues

* minor helper function update

* Fix wrapper coverage and wrapper issues

* delete unused variables

* Minor fix on ReadData() call

* separating websocket handlers

* separating websocket handlers

* Minor fix on enabled pair

* minor fix

* check instrument availability in spot

* create a separate subscriber for sake of multiple websocket connection

* linter fix

* minor websocket and gateio endpoints fix

* fix nil pointer exception

* minor fixes

* spelling fix decerializes -> deserializes

* fix Bitfinex unit test issues

* minor unknown currency pair labling fix

* minor currency pair handling fix

* slight update on GetDepositAddress wrapper unit test

* setting max request job to 200

* fixing numerical and timestamp type convert

* fix value overflow error

* change method of parsing orderbook price

* unifying timestamp conversion types to gateioTime

---------

Co-authored-by: Samuael Adnew <samuaelad@Samuaels-MacBook-Air.local>
2023-05-30 14:03:53 +10:00

119 lines
3.7 KiB
Go

package gateio
import (
"context"
"fmt"
"time"
"github.com/thrasher-corp/gocryptotrader/exchanges/request"
"golang.org/x/time/rate"
)
// GateIO endpoints limits.
const (
spotDefaultEPL request.EndpointLimit = iota
spotPrivateEPL
spotPlaceOrdersEPL
spotCancelOrdersEPL
perpetualSwapDefaultEPL
perpetualSwapPlaceOrdersEPL
perpetualSwapPrivateEPL
perpetualSwapCancelOrdersEPL
walletEPL
withdrawalEPL
// Request rates per interval
spotPublicRate = 900
spotPrivateRate = 900
spotPlaceOrdersRate = 10
spotCancelOrdersRate = 500
perpetualSwapPublicRate = 300
perpetualSwapPlaceOrdersRate = 100
perpetualSwapPrivateRate = 400
perpetualSwapCancelOrdersRate = 400
walletRate = 200
withdrawalRate = 1
// interval
oneSecondInterval = time.Second
threeSecondsInterval = time.Second * 3
)
// RateLimitter represents a rate limiter structure for gateIO endpoints.
type RateLimitter struct {
SpotDefault *rate.Limiter
SpotPrivate *rate.Limiter
SpotPlaceOrders *rate.Limiter
SpotCancelOrders *rate.Limiter
PerpetualSwapDefault *rate.Limiter
PerpetualSwapPlaceOrders *rate.Limiter
PerpetualSwapPrivate *rate.Limiter
PerpetualSwapCancelOrders *rate.Limiter
Wallet *rate.Limiter
Withdrawal *rate.Limiter
}
// Limit executes rate limiting functionality
// implements the request.Limiter interface
func (r *RateLimitter) Limit(ctx context.Context, epl request.EndpointLimit) error {
var limiter *rate.Limiter
var tokens int
switch epl {
case spotDefaultEPL:
limiter, tokens = r.SpotDefault, 1
case spotPrivateEPL:
return r.SpotPrivate.Wait(ctx)
case spotPlaceOrdersEPL:
return r.SpotPlaceOrders.Wait(ctx)
case spotCancelOrdersEPL:
return r.SpotCancelOrders.Wait(ctx)
case perpetualSwapDefaultEPL:
limiter, tokens = r.PerpetualSwapDefault, 1
case perpetualSwapPlaceOrdersEPL:
return r.PerpetualSwapPlaceOrders.Wait(ctx)
case perpetualSwapPrivateEPL:
return r.PerpetualSwapPrivate.Wait(ctx)
case perpetualSwapCancelOrdersEPL:
return r.PerpetualSwapCancelOrders.Wait(ctx)
case walletEPL:
return r.Wallet.Wait(ctx)
case withdrawalEPL:
return r.Withdrawal.Wait(ctx)
default:
}
var finalDelay time.Duration
var reserves = make([]*rate.Reservation, tokens)
for i := 0; i < tokens; i++ {
reserves[i] = limiter.Reserve()
finalDelay = reserves[i].Delay()
}
if dl, ok := ctx.Deadline(); ok && dl.Before(time.Now().Add(finalDelay)) {
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 limiter for the exchange
func SetRateLimit() *RateLimitter {
return &RateLimitter{
SpotDefault: request.NewRateLimit(oneSecondInterval, spotPublicRate),
SpotPrivate: request.NewRateLimit(oneSecondInterval, spotPrivateRate),
SpotPlaceOrders: request.NewRateLimit(oneSecondInterval, spotPlaceOrdersRate),
SpotCancelOrders: request.NewRateLimit(oneSecondInterval, spotCancelOrdersRate),
PerpetualSwapDefault: request.NewRateLimit(oneSecondInterval, perpetualSwapPublicRate),
PerpetualSwapPlaceOrders: request.NewRateLimit(oneSecondInterval, perpetualSwapPlaceOrdersRate),
PerpetualSwapPrivate: request.NewRateLimit(oneSecondInterval, perpetualSwapPrivateRate),
PerpetualSwapCancelOrders: request.NewRateLimit(oneSecondInterval, perpetualSwapCancelOrdersRate),
Wallet: request.NewRateLimit(oneSecondInterval, walletRate),
Withdrawal: request.NewRateLimit(threeSecondsInterval, withdrawalRate),
}
}