mirror of
https://github.com/d0zingcat/gocryptotrader.git
synced 2026-05-13 23:16:45 +00:00
* 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>
119 lines
3.7 KiB
Go
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),
|
|
}
|
|
}
|