mirror of
https://github.com/d0zingcat/gocryptotrader.git
synced 2026-05-14 07:26:47 +00:00
* initial concept of a nice validation tester for exchanges * adds some datahandler design * expand testing * more tests and fixes * minor end of day fix for bithumb * fixes implementation issues * more test coverage and improvements, but not sure if i should continue * fix more wrapper implementations * adds error type, more fixes * changes signature, fixes implementations * fixes more wrapper implementations * one more bit * more cleanup * WOW things work? * lintle 1/1337 * mini bump * fixes all linting * neaten * GetOrderInfo+ asset pair fixes+improvements * adds new websocket test * expand ws testing * fix bug, expand tests, improve implementation * code coverage of a lot of new codes * fixes everything * reverts accidental changes * minor fixes from reviewing code * removes Bitfinex cancelBatchOrder implementation * fixes dumb baby typo for babies * mini nit fixes * so many nits to address * addresses all the nits * Titlecase * switcheroo * removes websocket testing for now * fix appveyor, minor test fix * fixes typo, re-kindles killed kode * skip binance wrapper tests when running CI * expired context, huobi okx fixes * kodespull * fix ordering * time fix because why not * fix exmo, others * hopefully this fixes all of my life's problems * last thing today * huobi, more like hypotrophy * golangci-lint, more like mypooroldknee-splint * fix huobi times by removing them * should fix okx currency issues * blocks the application * adds last little contingency for pairs * addresses most nits and new problems * lovely fixed before seeing why okx sucks * fixes issues with okx websocket * the classic receieieivaier * lintle * adds test and fixes existing tests * expands error handling messages during setup * fixes dumb okx bugs introduced * quick fix for lint and exmo * fixes nixes * fix exmo deposit issue * lint * fixes issue with extra asset runs missing * fix surprise race * all the lint and merge fixes * fixes surprise bugs in OKx * fixes issues with times and chains * fixing all the merge stuff * merge fix * rm logs and a panic potential * lovely lint lament * an easy demonstration of scenario, but not of initial purpose * put it in the bin * Revert "put it in the bin" This reverts commit 15c6490f713233d43f10957367fcbf18e3818bdd. * re-add after immediate error popup * fix mini poor test design * okx okay * merge fixes * fixes issues discovered in lovely test * I FORGOT TO COMMIT THIS * nit fixaroonaboo * forgoetten test fix * revert old okx asset intrument work * fixes * revert problems I didnt understand. update bybit * fix merge bugs * test cleanup * further improvements * reshuffle and lint * rm redundant CI_TEST by rm the CI_TEST field that is redundant * path fix * move to its own section, dont run on 32 bit + appveyor * lint * fix lbank * address nits * let it rip * fix failing test time range * niteroo boogaloo * mod tidy, use common.SimpleTimeFormat
153 lines
8.0 KiB
Go
153 lines
8.0 KiB
Go
package exchange
|
|
|
|
import (
|
|
"context"
|
|
"sync"
|
|
"time"
|
|
|
|
"github.com/thrasher-corp/gocryptotrader/config"
|
|
"github.com/thrasher-corp/gocryptotrader/currency"
|
|
"github.com/thrasher-corp/gocryptotrader/exchanges/account"
|
|
"github.com/thrasher-corp/gocryptotrader/exchanges/asset"
|
|
"github.com/thrasher-corp/gocryptotrader/exchanges/currencystate"
|
|
"github.com/thrasher-corp/gocryptotrader/exchanges/deposit"
|
|
"github.com/thrasher-corp/gocryptotrader/exchanges/kline"
|
|
"github.com/thrasher-corp/gocryptotrader/exchanges/margin"
|
|
"github.com/thrasher-corp/gocryptotrader/exchanges/order"
|
|
"github.com/thrasher-corp/gocryptotrader/exchanges/orderbook"
|
|
"github.com/thrasher-corp/gocryptotrader/exchanges/stream"
|
|
"github.com/thrasher-corp/gocryptotrader/exchanges/ticker"
|
|
"github.com/thrasher-corp/gocryptotrader/exchanges/trade"
|
|
"github.com/thrasher-corp/gocryptotrader/portfolio/withdraw"
|
|
)
|
|
|
|
// IBotExchange enforces standard functions for all exchanges supported in
|
|
// GoCryptoTrader
|
|
type IBotExchange interface {
|
|
Setup(exch *config.Exchange) error
|
|
Start(ctx context.Context, wg *sync.WaitGroup) error
|
|
SetDefaults()
|
|
Shutdown() error
|
|
GetName() string
|
|
SetEnabled(bool)
|
|
FetchTicker(ctx context.Context, p currency.Pair, a asset.Item) (*ticker.Price, error)
|
|
UpdateTicker(ctx context.Context, p currency.Pair, a asset.Item) (*ticker.Price, error)
|
|
UpdateTickers(ctx context.Context, a asset.Item) error
|
|
FetchOrderbook(ctx context.Context, p currency.Pair, a asset.Item) (*orderbook.Base, error)
|
|
UpdateOrderbook(ctx context.Context, p currency.Pair, a asset.Item) (*orderbook.Base, error)
|
|
FetchTradablePairs(ctx context.Context, a asset.Item) (currency.Pairs, error)
|
|
UpdateTradablePairs(ctx context.Context, forceUpdate bool) error
|
|
GetEnabledPairs(a asset.Item) (currency.Pairs, error)
|
|
GetAvailablePairs(a asset.Item) (currency.Pairs, error)
|
|
SetPairs(pairs currency.Pairs, a asset.Item, enabled bool) error
|
|
GetAssetTypes(enabled bool) asset.Items
|
|
GetRecentTrades(ctx context.Context, p currency.Pair, a asset.Item) ([]trade.Data, error)
|
|
GetHistoricTrades(ctx context.Context, p currency.Pair, a asset.Item, startTime, endTime time.Time) ([]trade.Data, error)
|
|
GetFeeByType(ctx context.Context, f *FeeBuilder) (float64, error)
|
|
GetLastPairsUpdateTime() int64
|
|
GetWithdrawPermissions() uint32
|
|
FormatWithdrawPermissions() string
|
|
GetAccountFundingHistory(ctx context.Context) ([]FundingHistory, error)
|
|
GetDepositAddress(ctx context.Context, cryptocurrency currency.Code, accountID, chain string) (*deposit.Address, error)
|
|
GetAvailableTransferChains(ctx context.Context, cryptocurrency currency.Code) ([]string, error)
|
|
GetWithdrawalsHistory(ctx context.Context, code currency.Code, a asset.Item) ([]WithdrawalHistory, error)
|
|
WithdrawCryptocurrencyFunds(ctx context.Context, withdrawRequest *withdraw.Request) (*withdraw.ExchangeResponse, error)
|
|
WithdrawFiatFunds(ctx context.Context, withdrawRequest *withdraw.Request) (*withdraw.ExchangeResponse, error)
|
|
WithdrawFiatFundsToInternationalBank(ctx context.Context, withdrawRequest *withdraw.Request) (*withdraw.ExchangeResponse, error)
|
|
SetHTTPClientUserAgent(ua string) error
|
|
GetHTTPClientUserAgent() (string, error)
|
|
SetClientProxyAddress(addr string) error
|
|
GetDefaultConfig(ctx context.Context) (*config.Exchange, error)
|
|
GetBase() *Base
|
|
GetHistoricCandles(ctx context.Context, pair currency.Pair, a asset.Item, interval kline.Interval, start, end time.Time) (*kline.Item, error)
|
|
GetHistoricCandlesExtended(ctx context.Context, pair currency.Pair, a asset.Item, interval kline.Interval, start, end time.Time) (*kline.Item, error)
|
|
DisableRateLimiter() error
|
|
EnableRateLimiter() error
|
|
GetServerTime(ctx context.Context, ai asset.Item) (time.Time, error)
|
|
GetWebsocket() (*stream.Websocket, error)
|
|
SubscribeToWebsocketChannels(channels []stream.ChannelSubscription) error
|
|
UnsubscribeToWebsocketChannels(channels []stream.ChannelSubscription) error
|
|
GetSubscriptions() ([]stream.ChannelSubscription, error)
|
|
FlushWebsocketChannels() error
|
|
AuthenticateWebsocket(ctx context.Context) error
|
|
GetOrderExecutionLimits(a asset.Item, cp currency.Pair) (order.MinMaxLevel, error)
|
|
CheckOrderExecutionLimits(a asset.Item, cp currency.Pair, price, amount float64, orderType order.Type) error
|
|
UpdateOrderExecutionLimits(ctx context.Context, a asset.Item) error
|
|
GetCredentials(ctx context.Context) (*account.Credentials, error)
|
|
|
|
// ValidateAPICredentials function validates the API keys by sending an
|
|
// authenticated REST request. See exchange specific wrapper implementation.
|
|
ValidateAPICredentials(ctx context.Context, a asset.Item) error
|
|
// VerifyAPICredentials determines if the credentials supplied have unset
|
|
// required values. See exchanges/credentials.go Base method for
|
|
// implementation.
|
|
VerifyAPICredentials(creds *account.Credentials) error
|
|
// GetDefaultCredentials returns the exchange.Base api credentials loaded by
|
|
// config.json. See exchanges/credentials.go Base method for implementation.
|
|
GetDefaultCredentials() *account.Credentials
|
|
|
|
FunctionalityChecker
|
|
AccountManagement
|
|
OrderManagement
|
|
CurrencyStateManagement
|
|
FuturesManagement
|
|
}
|
|
|
|
// OrderManagement defines functionality for order management
|
|
type OrderManagement interface {
|
|
SubmitOrder(ctx context.Context, s *order.Submit) (*order.SubmitResponse, error)
|
|
ModifyOrder(ctx context.Context, action *order.Modify) (*order.ModifyResponse, error)
|
|
CancelOrder(ctx context.Context, o *order.Cancel) error
|
|
CancelBatchOrders(ctx context.Context, o []order.Cancel) (*order.CancelBatchResponse, error)
|
|
CancelAllOrders(ctx context.Context, orders *order.Cancel) (order.CancelAllResponse, error)
|
|
GetOrderInfo(ctx context.Context, orderID string, pair currency.Pair, assetType asset.Item) (*order.Detail, error)
|
|
GetActiveOrders(ctx context.Context, getOrdersRequest *order.MultiOrderRequest) (order.FilteredOrders, error)
|
|
GetOrderHistory(ctx context.Context, getOrdersRequest *order.MultiOrderRequest) (order.FilteredOrders, error)
|
|
}
|
|
|
|
// CurrencyStateManagement defines functionality for currency state management
|
|
type CurrencyStateManagement interface {
|
|
GetCurrencyStateSnapshot() ([]currencystate.Snapshot, error)
|
|
UpdateCurrencyStates(ctx context.Context, a asset.Item) error
|
|
CanTradePair(p currency.Pair, a asset.Item) error
|
|
CanTrade(c currency.Code, a asset.Item) error
|
|
CanWithdraw(c currency.Code, a asset.Item) error
|
|
CanDeposit(c currency.Code, a asset.Item) error
|
|
}
|
|
|
|
// AccountManagement defines functionality for exchange account management
|
|
type AccountManagement interface {
|
|
UpdateAccountInfo(ctx context.Context, a asset.Item) (account.Holdings, error)
|
|
FetchAccountInfo(ctx context.Context, a asset.Item) (account.Holdings, error)
|
|
HasAssetTypeAccountSegregation() bool
|
|
}
|
|
|
|
// FunctionalityChecker defines functionality for retrieving exchange
|
|
// support/enabled features
|
|
type FunctionalityChecker interface {
|
|
IsEnabled() bool
|
|
IsAssetWebsocketSupported(a asset.Item) bool
|
|
SupportsAsset(assetType asset.Item) bool
|
|
SupportsREST() bool
|
|
SupportsWithdrawPermissions(permissions uint32) bool
|
|
SupportsRESTTickerBatchUpdates() bool
|
|
IsWebsocketEnabled() bool
|
|
SupportsWebsocket() bool
|
|
SupportsAutoPairUpdates() bool
|
|
IsWebsocketAuthenticationSupported() bool
|
|
IsRESTAuthenticationSupported() bool
|
|
}
|
|
|
|
// FuturesManagement manages futures orders, pnl and collateral calculations
|
|
type FuturesManagement interface {
|
|
GetPositionSummary(context.Context, *order.PositionSummaryRequest) (*order.PositionSummary, error)
|
|
ScaleCollateral(ctx context.Context, calculator *order.CollateralCalculator) (*order.CollateralByCurrency, error)
|
|
CalculateTotalCollateral(context.Context, *order.TotalCollateralCalculator) (*order.TotalCollateralResponse, error)
|
|
GetFuturesPositions(context.Context, *order.PositionsRequest) ([]order.PositionDetails, error)
|
|
GetFundingRates(context.Context, *order.FundingRatesRequest) ([]order.FundingRates, error)
|
|
IsPerpetualFutureCurrency(asset.Item, currency.Pair) (bool, error)
|
|
GetCollateralCurrencyForContract(asset.Item, currency.Pair) (currency.Code, asset.Item, error)
|
|
GetMarginRatesHistory(context.Context, *margin.RateHistoryRequest) (*margin.RateHistoryResponse, error)
|
|
order.PNLCalculation
|
|
}
|