Files
gocryptotrader/exchanges/coinbene/ratelimit.go
Adrian Gallagher 9973523f1e Coinbene: Fix ticker pair parsing (#663)
* Fix coinbene ticker pair parsing

* Update swap path plus add get instruments method

* Fix tests

* Add additional swap ticker fields

* Add endpoint to auth payload request
2021-04-23 11:28:41 +10:00

248 lines
10 KiB
Go

package coinbene
import (
"errors"
"time"
"github.com/thrasher-corp/gocryptotrader/exchanges/request"
"golang.org/x/time/rate"
)
const (
// Contract rate limit time interval and request rates
contractRateInterval = time.Second * 2
orderbookContractReqRate = 20
tickersContractReqRate = 20
klineContractReqRate = 20
tradesContractReqRate = 20
contractInstrumentsReqRate = 20
contractAccountInfoContractReqRate = 10
positionInfoContractReqRate = 10
placeOrderContractReqRate = 20
cancelOrderContractReqRate = 20
getOpenOrdersContractReqRate = 5
openOrdersByPageContractReqRate = 5
getOrderInfoContractReqRate = 10
getClosedOrdersContractReqRate = 5
getClosedOrdersbyPageContractReqRate = 5
cancelMultipleOrdersContractReqRate = 5
getOrderFillsContractReqRate = 10
getFundingRatesContractReqRate = 10
// Spot rate limit time interval and request rates
spotRateInterval = time.Second
getPairsSpotReqRate = 2
getPairsInfoSpotReqRate = 3
getOrderbookSpotReqRate = 6
getTickerListSpotReqRate = 6
getSpecificTickerSpotReqRate = 6
getMarketTradesSpotReqRate = 3
// getKlineSpotReqRate = 1
// getExchangeRateSpotReqRate = 1
getAccountInfoSpotReqRate = 3
queryAccountAssetInfoSpotReqRate = 6
placeOrderSpotReqRate = 6
batchOrderSpotReqRate = 3
queryOpenOrdersSpotReqRate = 3
queryClosedOrdersSpotReqRate = 3
querySpecficOrderSpotReqRate = 6
queryTradeFillsSpotReqRate = 3
cancelOrderSpotReqRate = 6
cancelOrdersBatchSpotReqRate = 3
// Rate limit functionality
contractOrderbook request.EndpointLimit = iota
contractTickers
contractKline
contractTrades
contractInstruments
contractAccountInfo
contractPositionInfo
contractPlaceOrder
contractCancelOrder
contractGetOpenOrders
contractOpenOrdersByPage
contractGetOrderInfo
contractGetClosedOrders
contractGetClosedOrdersbyPage
contractCancelMultipleOrders
contractGetOrderFills
contractGetFundingRates
spotPairs
spotPairInfo
spotOrderbook
spotTickerList
spotSpecificTicker
spotMarketTrades
spotKline // Not implemented yet
spotExchangeRate // Not implemented yet
spotAccountInfo
spotAccountAssetInfo
spotPlaceOrder
spotBatchOrder
spotQueryOpenOrders
spotQueryClosedOrders
spotQuerySpecficOrder
spotQueryTradeFills
spotCancelOrder
spotCancelOrdersBatch
)
// RateLimit implements the request.Limiter interface
type RateLimit struct {
ContractOrderbook *rate.Limiter
ContractTickers *rate.Limiter
ContractKline *rate.Limiter
ContractTrades *rate.Limiter
ContractInstruments *rate.Limiter
ContractAccountInfo *rate.Limiter
ContractPositionInfo *rate.Limiter
ContractPlaceOrder *rate.Limiter
ContractCancelOrder *rate.Limiter
ContractGetOpenOrders *rate.Limiter
ContractOpenOrdersByPage *rate.Limiter
ContractGetOrderInfo *rate.Limiter
ContractGetClosedOrders *rate.Limiter
ContractGetClosedOrdersbyPage *rate.Limiter
ContractCancelMultipleOrders *rate.Limiter
ContractGetOrderFills *rate.Limiter
ContractGetFundingRates *rate.Limiter
SpotPairs *rate.Limiter
SpotPairInfo *rate.Limiter
SpotOrderbook *rate.Limiter
SpotTickerList *rate.Limiter
SpotSpecificTicker *rate.Limiter
SpotMarketTrades *rate.Limiter
// spotKline // Not implemented yet
// spotExchangeRate // Not implemented yet
SpotAccountInfo *rate.Limiter
SpotAccountAssetInfo *rate.Limiter
SpotPlaceOrder *rate.Limiter
SpotBatchOrder *rate.Limiter
SpotQueryOpenOrders *rate.Limiter
SpotQueryClosedOrders *rate.Limiter
SpotQuerySpecficOrder *rate.Limiter
SpotQueryTradeFills *rate.Limiter
SpotCancelOrder *rate.Limiter
SpotCancelOrdersBatch *rate.Limiter
}
// Limit limits outbound requests
func (r *RateLimit) Limit(f request.EndpointLimit) error {
switch f {
case contractOrderbook:
time.Sleep(r.ContractOrderbook.Reserve().Delay())
case contractTickers:
time.Sleep(r.ContractTickers.Reserve().Delay())
case contractKline:
time.Sleep(r.ContractKline.Reserve().Delay())
case contractTrades:
time.Sleep(r.ContractTrades.Reserve().Delay())
case contractInstruments:
time.Sleep(r.ContractInstruments.Reserve().Delay())
case contractAccountInfo:
time.Sleep(r.ContractAccountInfo.Reserve().Delay())
case contractPositionInfo:
time.Sleep(r.ContractPositionInfo.Reserve().Delay())
case contractPlaceOrder:
time.Sleep(r.ContractPlaceOrder.Reserve().Delay())
case contractCancelOrder:
time.Sleep(r.ContractCancelOrder.Reserve().Delay())
case contractGetOpenOrders:
time.Sleep(r.ContractGetOpenOrders.Reserve().Delay())
case contractOpenOrdersByPage:
time.Sleep(r.ContractOpenOrdersByPage.Reserve().Delay())
case contractGetOrderInfo:
time.Sleep(r.ContractGetOrderInfo.Reserve().Delay())
case contractGetClosedOrders:
time.Sleep(r.ContractGetClosedOrders.Reserve().Delay())
case contractGetClosedOrdersbyPage:
time.Sleep(r.ContractGetClosedOrdersbyPage.Reserve().Delay())
case contractCancelMultipleOrders:
time.Sleep(r.ContractCancelMultipleOrders.Reserve().Delay())
case contractGetOrderFills:
time.Sleep(r.ContractGetOrderFills.Reserve().Delay())
case contractGetFundingRates:
time.Sleep(r.ContractGetFundingRates.Reserve().Delay())
case spotPairs:
time.Sleep(r.SpotPairs.Reserve().Delay())
case spotPairInfo:
time.Sleep(r.SpotPairInfo.Reserve().Delay())
case spotOrderbook:
time.Sleep(r.SpotOrderbook.Reserve().Delay())
case spotTickerList:
time.Sleep(r.SpotTickerList.Reserve().Delay())
case spotSpecificTicker:
time.Sleep(r.SpotSpecificTicker.Reserve().Delay())
case spotMarketTrades:
time.Sleep(r.SpotMarketTrades.Reserve().Delay())
// case spotKline: // Not implemented yet
// time.Sleep(r.SpotKline.Reserve().Delay())
// case spotExchangeRate:
// time.Sleep(r.SpotExchangeRate.Reserve().Delay())
case spotAccountInfo:
time.Sleep(r.SpotAccountInfo.Reserve().Delay())
case spotAccountAssetInfo:
time.Sleep(r.SpotAccountAssetInfo.Reserve().Delay())
case spotPlaceOrder:
time.Sleep(r.SpotPlaceOrder.Reserve().Delay())
case spotBatchOrder:
time.Sleep(r.SpotBatchOrder.Reserve().Delay())
case spotQueryOpenOrders:
time.Sleep(r.SpotQueryOpenOrders.Reserve().Delay())
case spotQueryClosedOrders:
time.Sleep(r.SpotQueryClosedOrders.Reserve().Delay())
case spotQuerySpecficOrder:
time.Sleep(r.SpotQuerySpecficOrder.Reserve().Delay())
case spotQueryTradeFills:
time.Sleep(r.SpotQueryTradeFills.Reserve().Delay())
case spotCancelOrder:
time.Sleep(r.SpotCancelOrder.Reserve().Delay())
case spotCancelOrdersBatch:
time.Sleep(r.SpotCancelOrdersBatch.Reserve().Delay())
default:
return errors.New("rate limit error endpoint functionality not set")
}
return nil
}
// SetRateLimit returns the rate limit for the exchange
func SetRateLimit() *RateLimit {
return &RateLimit{
ContractOrderbook: request.NewRateLimit(contractRateInterval, orderbookContractReqRate),
ContractTickers: request.NewRateLimit(contractRateInterval, tickersContractReqRate),
ContractKline: request.NewRateLimit(contractRateInterval, klineContractReqRate),
ContractTrades: request.NewRateLimit(contractRateInterval, tradesContractReqRate),
ContractInstruments: request.NewRateLimit(contractRateInterval, contractInstrumentsReqRate),
ContractAccountInfo: request.NewRateLimit(contractRateInterval, contractAccountInfoContractReqRate),
ContractPositionInfo: request.NewRateLimit(contractRateInterval, positionInfoContractReqRate),
ContractPlaceOrder: request.NewRateLimit(contractRateInterval, placeOrderContractReqRate),
ContractCancelOrder: request.NewRateLimit(contractRateInterval, cancelOrderContractReqRate),
ContractGetOpenOrders: request.NewRateLimit(contractRateInterval, getOpenOrdersContractReqRate),
ContractOpenOrdersByPage: request.NewRateLimit(contractRateInterval, openOrdersByPageContractReqRate),
ContractGetOrderInfo: request.NewRateLimit(contractRateInterval, getOrderInfoContractReqRate),
ContractGetClosedOrders: request.NewRateLimit(contractRateInterval, getClosedOrdersContractReqRate),
ContractGetClosedOrdersbyPage: request.NewRateLimit(contractRateInterval, getClosedOrdersbyPageContractReqRate),
ContractCancelMultipleOrders: request.NewRateLimit(contractRateInterval, cancelMultipleOrdersContractReqRate),
ContractGetOrderFills: request.NewRateLimit(contractRateInterval, getOrderFillsContractReqRate),
ContractGetFundingRates: request.NewRateLimit(contractRateInterval, getFundingRatesContractReqRate),
SpotPairs: request.NewRateLimit(spotRateInterval, getPairsSpotReqRate),
SpotPairInfo: request.NewRateLimit(spotRateInterval, getPairsInfoSpotReqRate),
SpotOrderbook: request.NewRateLimit(spotRateInterval, getOrderbookSpotReqRate),
SpotTickerList: request.NewRateLimit(spotRateInterval, getTickerListSpotReqRate),
SpotSpecificTicker: request.NewRateLimit(spotRateInterval, getSpecificTickerSpotReqRate),
SpotMarketTrades: request.NewRateLimit(spotRateInterval, getMarketTradesSpotReqRate),
SpotAccountInfo: request.NewRateLimit(spotRateInterval, getAccountInfoSpotReqRate),
SpotAccountAssetInfo: request.NewRateLimit(spotRateInterval, queryAccountAssetInfoSpotReqRate),
SpotPlaceOrder: request.NewRateLimit(spotRateInterval, placeOrderSpotReqRate),
SpotBatchOrder: request.NewRateLimit(spotRateInterval, batchOrderSpotReqRate),
SpotQueryOpenOrders: request.NewRateLimit(spotRateInterval, queryOpenOrdersSpotReqRate),
SpotQueryClosedOrders: request.NewRateLimit(spotRateInterval, queryClosedOrdersSpotReqRate),
SpotQuerySpecficOrder: request.NewRateLimit(spotRateInterval, querySpecficOrderSpotReqRate),
SpotQueryTradeFills: request.NewRateLimit(spotRateInterval, queryTradeFillsSpotReqRate),
SpotCancelOrder: request.NewRateLimit(spotRateInterval, cancelOrderSpotReqRate),
SpotCancelOrdersBatch: request.NewRateLimit(spotRateInterval, cancelOrdersBatchSpotReqRate),
}
}