mirror of
https://github.com/d0zingcat/gocryptotrader.git
synced 2026-05-13 23:16:45 +00:00
* fix whoops * const trafficCheckInterval; rm testmain * y * fix lint * bump time check window * stream: fix intermittant test failures while testing routines and remove code that is not needed. * spells * cant do what I did * protect race due to routine. * update testURL * use mock websocket connection instead of test URL's * linter: fix * remove url because its throwing errors on CI builds * connections drop all the time, don't need to worry about not being able to echo back ws data as it can be easily reviewed _test file side. * remove another superfluous url thats not really set up for this * spawn overwatch routine when there is no errors, inline checker instead of waiting for a time period, add sleep inline with echo handler as this is really quick and wanted to ensure that latency is handing correctly * linter: fixerino uperino * fix ID bug, why I do this, I don't know. * glorious: panix * linter: things * whoops * dont need to make consecutive Unix() calls * websocket: fix potential panic on error and no responses and adding waitForResponses * bybit: enable multiconnection handling across websocket endpoints * rm debug lines * bybit: Add websocket trading functionality across all assets * rm json parser and handle in json package instead * in favour of json package unmarshalling * Add bool ConnectionDoesNotRequireSubscriptions so that we don't need to handle dummy sub * handle pong response * spelling * linter: fix * fix processing issues with tickers * fix processing issues with tickers * linter: fix * linter: fix again * * change field name OutboundRequestSignature to WrapperDefinedConnectionSignature for agnostic inbound and outbound connections. * change method name GetOutboundConnection to GetConnection for agnostic inbound and outbound connections. * drop outbound field map for improved performance just using a range and field check (less complex as well) * change field name connections to connectionToWrapper for better clarity * spells and magic and wands * merge: fixup * linter: fix * spelling: fix * glorious: nits * comparable check for signature * mv err var * rm comment as it does not * update time fields for orderbook latency * fix time conversion * Add func MatchReturnResponses * glorious: nits and stuff * lint: fix * attempt to fix race * linter: fix * fix tests * types/time: strict usage of time type for usage with unix timestamps * fix tests etc * Allow match back with order details * Add time in force values for different order types + extra return information on websocket trading * glorious: nits * gk: nits; engine log cleanup * gk: nits; OCD * gk: nits; move function change file names * gk: nits; 🚀 * gk: nits; convert variadic function and message inspection to interface and include a specific function for that handling so as to not need nil on every call * gk: nits; continued * gk: engine nits; rm loaded exchange * gk: nits; drop WebsocketLoginResponse * stream: Add match method EnsureMatchWithData * gk: nits; rn Inspect to IsFinal * gk: nits; rn to MessageFilter * linter: fix * gateio: update rate limit definitions (cherry-pick) * Add test and missing * Shared REST rate limit definitions with Websocket service, set lookup item to nil for systems that do not require rate limiting; add glorious nit * integrate rate limits for websocket trading spot * bybit: split public and private processing to dedicated handler add supporting function and tests * use correct handler for private inbound connection * bybit/websocket: allow a shared ID between outbound payloads for inbound matching * conform to match upstream changes * standardise names to upstream style * fix wrapper standards test when sending a auth request through a websocket connection * whoops * Update exchanges/gateio/gateio_types.go Co-authored-by: Scott <gloriousCode@users.noreply.github.com> * glorious: nits * linter: fix * linter: overload * whoops * spelling fixes on recent merge * glorious: nits * linter: fix? * glorious: nits * gk: assert errors touched * gk: unexport derive functions * gk: nitssssssss * fix test * gk: nitters v1 * gk: http status * gk/nits: Add getAssetFromFuturesPair * gk: nits single response when submitting * gk: new pair with delimiter in tests * gk: param update slice to slice of pointers * gk: add asset type in params, includes t.Context() for tests * linter: fix * linter: fix * fix merge whoopsie * glorious: nits * gk: nit * linter: fix * glorious: nits * linter/misc: fix and remove meows * linter: fix * misc/linter: fix * change function names * okx: update requestID gen func without func wrapping * RM: functions not needed * Update docs/ADD_NEW_EXCHANGE.md Co-authored-by: Gareth Kirwan <gbjkirwan@gmail.com> * gk: nitsssssss * linter: fix * Update exchanges/bybit/bybit_test.go Co-authored-by: Gareth Kirwan <gbjkirwan@gmail.com> * Update exchanges/bybit/bybit_test.go Co-authored-by: Gareth Kirwan <gbjkirwan@gmail.com> * gk: nit words * cranktakular: nits * websocket: skip connections with subscriptions not required during channel flush * websocket: simplify error handling in FlushChannels using if short * linter: fix * cranktakular: nits and expand coverage * linter: fix? * misc fix * cranktakular: missing nit which I thumbed up but did not do. Sillllllly billlyyyy nilllyyy * fix comments * bybit: fix merge regression on websocket message filter * cranktakular: nits * bybit: Add global rate limits for websocket * ai: nits * linter: fix * cranktakular: purge DCP ref/handling and add another TODO * Update exchanges/bybit/bybit_websocket.go Co-authored-by: Scott <gloriousCode@users.noreply.github.com> * glorious: nits * fix test * fix alignment issue and rm println * Update exchanges/bybit/bybit_websocket.go Co-authored-by: Scott <gloriousCode@users.noreply.github.com> * Update exchanges/bybit/bybit_websocket.go Co-authored-by: Scott <gloriousCode@users.noreply.github.com> * glorious: fix * Update exchanges/bybit/bybit_websocket.go Co-authored-by: Adrian Gallagher <adrian.gallagher@thrasher.io> * bybit: use connection method for segregated match on multi-connection * cleanup after master merge * fix test and config whoops * cranktakular: nits * exchange: add missing tests for base method websocket order funcs * cranktakular: nits and refresh + tests * cranktakular: pedantic nits * linter: fixes * t.Parallel tests * glorious nit * Update exchange/websocket/connection.go Co-authored-by: Gareth Kirwan <gbjkirwan@gmail.com> * gk: nits * boss king: nits * canktakular: nits * Update exchanges/bybit/bybit_websocket.go Co-authored-by: Gareth Kirwan <gbjkirwan@gmail.com> * Update exchanges/bybit/bybit_websocket_requests.go Co-authored-by: Gareth Kirwan <gbjkirwan@gmail.com> * Update exchanges/bybit/bybit_websocket_requests.go Co-authored-by: Gareth Kirwan <gbjkirwan@gmail.com> * Update exchanges/bybit/bybit_websocket_requests.go Co-authored-by: Gareth Kirwan <gbjkirwan@gmail.com> * Update exchanges/bybit/bybit_websocket_requests.go Co-authored-by: Gareth Kirwan <gbjkirwan@gmail.com> * gk: nits * linter: fix * Update exchanges/bybit/bybit.go Co-authored-by: Samuael A. <39623015+samuael@users.noreply.github.com> * Update exchanges/bybit/bybit.go Co-authored-by: Samuael A. <39623015+samuael@users.noreply.github.com> * bossking: nits * gk: much nicer design * gk: revised naming for consideration * gk: nits * gk: nits restrict in configtest.json and not worry about many pairs enabled * rm log * linter: fix * codex: nit * cranktakular: nits * Update exchanges/bybit/bybit_websocket_requests.go Co-authored-by: Scott <gloriousCode@users.noreply.github.com> * Update exchanges/bybit/bybit_websocket_requests.go Co-authored-by: Scott <gloriousCode@users.noreply.github.com> * Update exchanges/bybit/bybit_wrapper.go Co-authored-by: Scott <gloriousCode@users.noreply.github.com> * glorious: nits! * thrasher: nits --------- Co-authored-by: shazbert <ryan.oharareid@thrasher.io> Co-authored-by: Scott <gloriousCode@users.noreply.github.com> Co-authored-by: Gareth Kirwan <gbjkirwan@gmail.com> Co-authored-by: Adrian Gallagher <adrian.gallagher@thrasher.io> Co-authored-by: Samuael A. <39623015+samuael@users.noreply.github.com>
163 lines
8.0 KiB
Go
163 lines
8.0 KiB
Go
package bybit
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"time"
|
|
|
|
"github.com/thrasher-corp/gocryptotrader/exchanges/request"
|
|
)
|
|
|
|
var errUnknownCategory = errors.New("unknown category")
|
|
|
|
const (
|
|
defaultEPL request.EndpointLimit = iota
|
|
createOrderEPL
|
|
createSpotOrderEPL
|
|
amendOrderEPL
|
|
cancelOrderEPL
|
|
cancelSpotEPL
|
|
cancelAllEPL
|
|
cancelAllSpotEPL
|
|
createBatchOrderEPL
|
|
amendBatchOrderEPL
|
|
cancelBatchOrderEPL
|
|
getOrderEPL
|
|
getOrderHistoryEPL
|
|
getPositionListEPL
|
|
getExecutionListEPL
|
|
getPositionClosedPNLEPL
|
|
postPositionSetLeverageEPL
|
|
setPositionTPLSModeEPL
|
|
setPositionRiskLimitEPL
|
|
stopTradingPositionEPL
|
|
getAccountWalletBalanceEPL
|
|
getAccountFeeEPL
|
|
getAssetTransferQueryInfoEPL
|
|
getAssetTransferQueryTransferCoinListEPL
|
|
getAssetTransferCoinListEPL
|
|
getAssetInterTransferListEPL
|
|
getSubMemberListEPL
|
|
getAssetUniversalTransferListEPL
|
|
getAssetAccountCoinBalanceEPL
|
|
getAssetDepositRecordsEPL
|
|
getAssetDepositSubMemberRecordsEPL
|
|
getAssetDepositSubMemberAddressEPL
|
|
getWithdrawRecordsEPL
|
|
getAssetCoinInfoEPL
|
|
getExchangeOrderRecordEPL
|
|
interTransferEPL
|
|
saveTransferSubMemberEPL
|
|
universalTransferEPL
|
|
createWithdrawalEPL
|
|
cancelWithdrawalEPL
|
|
userCreateSubMemberEPL
|
|
userCreateSubAPIKeyEPL
|
|
userFrozenSubMemberEPL
|
|
userUpdateAPIEPL
|
|
userUpdateSubAPIEPL
|
|
userDeleteAPIEPL
|
|
userDeleteSubAPIEPL
|
|
userQuerySubMembersEPL
|
|
userQueryAPIEPL
|
|
getSpotLeverageTokenOrderRecordsEPL
|
|
spotLeverageTokenPurchaseEPL
|
|
spotLeverTokenRedeemEPL
|
|
getSpotCrossMarginTradeLoanInfoEPL
|
|
getSpotCrossMarginTradeAccountEPL
|
|
getSpotCrossMarginTradeOrdersEPL
|
|
getSpotCrossMarginTradeRepayHistoryEPL
|
|
spotCrossMarginTradeLoanEPL
|
|
spotCrossMarginTradeRepayEPL
|
|
spotCrossMarginTradeSwitchEPL
|
|
|
|
wsOrderSpotEPL
|
|
wsOrderInverseEPL
|
|
wsOrderLinearEPL
|
|
wsOrderOptionsEPL
|
|
wsSubscriptionEPL
|
|
)
|
|
|
|
var rateLimits = request.RateLimitDefinitions{
|
|
defaultEPL: request.NewRateLimitWithWeight(time.Second*5, 600, 1), // See: https://bybit-exchange.github.io/docs/v5/rate-limit
|
|
createOrderEPL: request.NewRateLimitWithWeight(time.Second, 10, 10),
|
|
createSpotOrderEPL: request.NewRateLimitWithWeight(time.Second, 20, 20),
|
|
amendOrderEPL: request.NewRateLimitWithWeight(time.Second, 10, 10),
|
|
cancelOrderEPL: request.NewRateLimitWithWeight(time.Second, 10, 10),
|
|
cancelSpotEPL: request.NewRateLimitWithWeight(time.Second, 20, 20),
|
|
cancelAllEPL: request.NewWeightedRateLimitByDuration(time.Second),
|
|
cancelAllSpotEPL: request.NewRateLimitWithWeight(time.Second, 20, 20),
|
|
createBatchOrderEPL: request.NewRateLimitWithWeight(time.Second, 10, 10),
|
|
amendBatchOrderEPL: request.NewRateLimitWithWeight(time.Second, 10, 10),
|
|
cancelBatchOrderEPL: request.NewRateLimitWithWeight(time.Second, 10, 10),
|
|
getOrderEPL: request.NewRateLimitWithWeight(time.Second, 10, 10),
|
|
getOrderHistoryEPL: request.NewRateLimitWithWeight(time.Second, 10, 10),
|
|
getPositionListEPL: request.NewRateLimitWithWeight(time.Second, 10, 10),
|
|
getExecutionListEPL: request.NewRateLimitWithWeight(time.Second, 10, 10),
|
|
getPositionClosedPNLEPL: request.NewRateLimitWithWeight(time.Second, 10, 10),
|
|
postPositionSetLeverageEPL: request.NewRateLimitWithWeight(time.Second, 10, 10),
|
|
setPositionTPLSModeEPL: request.NewRateLimitWithWeight(time.Second, 10, 10),
|
|
setPositionRiskLimitEPL: request.NewRateLimitWithWeight(time.Second, 10, 10),
|
|
stopTradingPositionEPL: request.NewRateLimitWithWeight(time.Second, 10, 10),
|
|
getAccountWalletBalanceEPL: request.NewRateLimitWithWeight(time.Second, 10, 10),
|
|
getAccountFeeEPL: request.NewRateLimitWithWeight(time.Second, 10, 10),
|
|
getAssetTransferQueryInfoEPL: request.NewRateLimitWithWeight(time.Minute, 60, 1),
|
|
getAssetTransferQueryTransferCoinListEPL: request.NewRateLimitWithWeight(time.Minute, 60, 1),
|
|
getAssetTransferCoinListEPL: request.NewRateLimitWithWeight(time.Minute, 60, 1),
|
|
getAssetInterTransferListEPL: request.NewRateLimitWithWeight(time.Minute, 60, 1),
|
|
getSubMemberListEPL: request.NewRateLimitWithWeight(time.Minute, 60, 1),
|
|
getAssetUniversalTransferListEPL: request.NewRateLimitWithWeight(time.Second, 2, 2),
|
|
getAssetAccountCoinBalanceEPL: request.NewRateLimitWithWeight(time.Second, 2, 2),
|
|
getAssetDepositRecordsEPL: request.NewRateLimitWithWeight(time.Minute, 30, 1),
|
|
getAssetDepositSubMemberRecordsEPL: request.NewRateLimitWithWeight(time.Minute, 30, 1),
|
|
getAssetDepositSubMemberAddressEPL: request.NewRateLimitWithWeight(time.Minute, 30, 1),
|
|
getWithdrawRecordsEPL: request.NewRateLimitWithWeight(time.Minute, 30, 1),
|
|
getAssetCoinInfoEPL: request.NewRateLimitWithWeight(time.Minute, 30, 1),
|
|
getExchangeOrderRecordEPL: request.NewRateLimitWithWeight(time.Minute, 30, 1),
|
|
interTransferEPL: request.NewRateLimitWithWeight(time.Minute, 20, 1),
|
|
saveTransferSubMemberEPL: request.NewRateLimitWithWeight(time.Minute, 20, 1),
|
|
universalTransferEPL: request.NewRateLimitWithWeight(time.Second, 5, 5),
|
|
createWithdrawalEPL: request.NewWeightedRateLimitByDuration(time.Second),
|
|
cancelWithdrawalEPL: request.NewRateLimitWithWeight(time.Minute, 60, 1),
|
|
userCreateSubMemberEPL: request.NewRateLimitWithWeight(time.Second, 5, 5),
|
|
userCreateSubAPIKeyEPL: request.NewRateLimitWithWeight(time.Second, 5, 5),
|
|
userFrozenSubMemberEPL: request.NewRateLimitWithWeight(time.Second, 5, 5),
|
|
userUpdateAPIEPL: request.NewRateLimitWithWeight(time.Second, 5, 5),
|
|
userUpdateSubAPIEPL: request.NewRateLimitWithWeight(time.Second, 5, 5),
|
|
userDeleteAPIEPL: request.NewRateLimitWithWeight(time.Second, 5, 5),
|
|
userDeleteSubAPIEPL: request.NewRateLimitWithWeight(time.Second, 5, 5),
|
|
userQuerySubMembersEPL: request.NewRateLimitWithWeight(time.Second, 10, 10),
|
|
userQueryAPIEPL: request.NewRateLimitWithWeight(time.Second, 10, 10),
|
|
getSpotLeverageTokenOrderRecordsEPL: request.NewRateLimitWithWeight(time.Second, 50, 50),
|
|
spotLeverageTokenPurchaseEPL: request.NewRateLimitWithWeight(time.Second, 20, 20),
|
|
spotLeverTokenRedeemEPL: request.NewRateLimitWithWeight(time.Second, 20, 20),
|
|
getSpotCrossMarginTradeLoanInfoEPL: request.NewRateLimitWithWeight(time.Second, 50, 50),
|
|
getSpotCrossMarginTradeAccountEPL: request.NewRateLimitWithWeight(time.Second, 50, 50),
|
|
getSpotCrossMarginTradeOrdersEPL: request.NewRateLimitWithWeight(time.Second, 50, 50),
|
|
getSpotCrossMarginTradeRepayHistoryEPL: request.NewRateLimitWithWeight(time.Second, 50, 50),
|
|
spotCrossMarginTradeLoanEPL: request.NewRateLimitWithWeight(time.Second, 20, 50),
|
|
spotCrossMarginTradeRepayEPL: request.NewRateLimitWithWeight(time.Second, 20, 50),
|
|
spotCrossMarginTradeSwitchEPL: request.NewRateLimitWithWeight(time.Second, 20, 50),
|
|
|
|
wsOrderSpotEPL: request.NewRateLimitWithWeight(time.Second, 20, 1),
|
|
wsOrderInverseEPL: request.NewRateLimitWithWeight(time.Second, 20, 1),
|
|
wsOrderLinearEPL: request.NewRateLimitWithWeight(time.Second, 20, 1),
|
|
wsOrderOptionsEPL: request.NewRateLimitWithWeight(time.Second, 20, 1),
|
|
wsSubscriptionEPL: request.RateLimitNotRequired,
|
|
}
|
|
|
|
func getWSRateLimitEPLByCategory(category string) (request.EndpointLimit, error) {
|
|
switch category {
|
|
case cSpot:
|
|
return wsOrderSpotEPL, nil
|
|
case cInverse:
|
|
return wsOrderInverseEPL, nil
|
|
case cLinear:
|
|
return wsOrderLinearEPL, nil
|
|
case cOption:
|
|
return wsOrderOptionsEPL, nil
|
|
default:
|
|
return 0, fmt.Errorf("%w: %q", errUnknownCategory, category)
|
|
}
|
|
}
|