Refactoring the timeout retries into a more general 'retry policy' with
support for retrying on HTTP 429 (Too Many Requests) and other responses
with a `Retry-After` header
The delay between requests is controlled by a combination of a 'backoff'
(currently only a simple linear backoff), and honouring the
`Retry-After` value (longest delay wins)
This makes the 'rate limiter' an optional argument as well, removing the
use of `nil` when one isn't supplied
Signed-off-by: David Ackroyd <daveo.ackroyd@gmail.com>
* Initial rework of rework of requester - WIP
* Implementing and checking rate limits - WIP
* implemented coinbene rate limiting shenanigans
* add in remaining WIP
* fixy
* use authenticated rate limit
* drop ceiling as this can be done with a counter later
* add functionality to struct
* purge config options for rate limiting so as to keep things minimal
* prepare futures and swap rate limiting for implementation
* Address linter issues
* Addressed nits, fixed race
* fix linter issue
* remove global var as this was only setting when newrequester was called
* moved rate limit functionality into its own file
* Update Bitfinex with correct rate limit and test endpoints (WIP)
* finish off bitfinex adjustments
* fixes
* fix linter issues
* slowed rate for coinbasepro
* drop rate limit for huobi as the doc times have intermittent 429 issues.
* Set MACOSX_DEPLOYMENT_TARGET to remove linking warning
* Addr Thrasher nits
* Addr glorious nits
* unexport do request function
* fixed nitorinos
* Fixed something I missed
* move disabled rate limiter into loadexchange and use interface functionality
* Add temp quick fix
* GCTCLI param and linter fixes
* Linter fixes
* Add more basic validation and address codelingo nits
* Add arg number support to cancelOrder and more validity checks
* initial wiring to providegethistoricalcandles
* initial wiring to providegethistoricalcandles
* initial wiring to providegethistoricalcandles
* gethistriccandles work from cli using hard coded inputs
* gethistoriccandles RPC service and CLI working fine for coinbasepro
* fixed unit test
* input check on grpc for gethistoriccandles
* updated deps
* fixed the return value when a method is not yet implemented
* code review: fixed CLI input check and int32->int64
* code review: handling wrong exchange name
* added check on granularity and allowing start and end being empty
* code review: removed currency2
* code review: dependency reverted
* improved func comment
* typo in func comment
* get historic values tests
* unit tests for get historical rates on coinbasepro
* using time format time.RFC3339
* names to camel case and improved comments
* test cleanup
* changed to camel case
* added InArray tests
* dropped not needed string time
* enforced use of int64
* fixed make check
* cleaned up code organisation to be consistent
* fixed Travis remarks
* more Travis remarks
* added comments
* regenerated proto files after merge
* linter fix
* Initial commit setting up a map orderbook system with a buffer. It will write to the buffer, sort apply to main orderbook and then process.
* Moves namespaces again
* Updates orderbook to use a sweet new WebsocketOrderbookUpdate type to handle all updates whether its using ID or not. So good. Adds many tests
* Starting to implement orderbook update handling per exchange. Updates namespaces again. Hopefuylly will find a way to update via ID not timestamp, too many endpoints dont provide update timestamps
* Changes orderbookbuffer to use BufferUpdate type instead of orderbook.Base to achieve more functionality and no need for type conversion functions. Updates tests
* Updates all instances of ws.orderbook.Update. Simplifies some orderbook logic
* Introduces toggleable buffer. Renames orderbooks. Completes implementation for everywhere but OKGroup due to hash calculation
* Implements orderbook update for okgroup, but forgets about the orderbook hash checking
* Fixes okgroup checksum calculation. Fixes linting issue. Removes redundant Kraken tests.
* Introduces sorting toggle and separates from buffer toggle. Uses benchmarks to highlight performance gains
* Fixes Gemini rate limit and parsing. Removes comments and fixes typos
* Fixes bitfinex orderbook processing
* Inbuilt sorting, minor fixes for websocket implementations. Improves test coverage
* Adds surprise LakeBTC websocket support
* Fixes data race
* Fixes rebasing issues due to namespace movements
* Addresses PR nits: moves folder namespace from ws to websocket. Removes line spaces in imports. Fixes lakebtc websocket returns and defer fucntions. Fixes comments
* Adds poloniex orderook sorting support
* Enables bitstamp and hitbtc orderbook sorting. Fixes poloniex's sorting
* Renames namespaces and combines monitor and connection into wshandler. Removes unused SPOT const. Changes how orderbook stuff is loaded. It is done in startup with a setup. Removes exchange name from loadsnapshot as well
* Removes the connection.go from rebasing issues. Removes error response from functions used in goroutines
* Fixes test with exchange name output change
* Fixes issues where copy and paste and replace all were used poorly
* Establishes new websocket functionality. Begins the creation of the websocket request
* Adding a wrapper over gorilla websocket connect,send,receive to handle ID messages. Doesn't work
* Successfully moved exchange_websocket into its own wshandler namespace. oof
* Sets up ZB to use a round trip WS request system
* Adds Kraken ID support to subscriptions. Renames duplicate func name UnsubscribeToChannels to RemoveSubscribedChannels. Adds some helper methods in the WebsocketConn to reduce duplicate code. Cleans up ZB implementation
* Fixes double locking which caused no websocket data to be read. Fixes requestid for kraken subscriptions
* Completes Huobi and Hadax implementation. Extends ZB error handling. Adds GZip support for reading messages
* Adds HitBTC support. Adds GetCurrencies, GetSymbols, GetTrades WS funcs. Adds super fun new parameter to GenerateMessageID for Unix and UnixNano
* Adds GateIO id support
* Adds Coinut support. Prevents nil reference error in constatus when there isnt one
* Standardises all Exchange websockets to use the wshandler websocket. Removes the wsRequestMtx as wshandler handles that now. Makes the Dialer a dialer, its not externally referenced that I can see.
* Fixes issue with coinut implementation. Updates bitmex currencies. Removes redundant log messages which are used to log messages
* Starts testing. Renames files
* Adds tests for websocket connection
* Reverts request.go change
* Linting everything
* Fixes rebase issue
* Final changes. Fixes variable names, removes log.Debug, removes lines, rearranges test types, removes order correlation websocket type
* Final final commit, fixing ZB issues.
* Adds traffic alerts where missed. Changes empty struct pointer addresses to nil instead. Removes empty lines
* Fixed string conversion
* Fixes issue with ZB not sending success codes
* Fixes issue with coinut processing due to nonce handling with subscriptions
* Fixes issue where ZB test failure was not caught. Removes unnecessary error handling from other ZB tests
* Removes unused interface
* Renames wshandler.Init() to wshandler.Run()
* Updates template file
* Capitalises cryptocurrencies in struct. Moves websocketResponseCheckTimeout and websocketResponseMaxLimit into config options. Moves connection configuration to main exchange Setup (where appropriate). Reverts currencylastupdated ticks. Improves reader close error checking
* Fixes two inconsistent websocket delay times
* Creates a default variable for websocket ResponseMaxLimit and ResponseCheckTimeout, then applies it to setdefaults and all tests
* Updates exchange template to set and use default websocket response limits
* First pass adding DumpResponse
* WIP
* Added httpDebug flag to SendPayload
* anx -> coinbase converted
* HTTPDebug flag added to all exchanges
* Updated Alphapoint:
* reworded error message
* Corrected itbit and huobihadax sendpayload
* Removed setting of default value
* don't return body for response as we already get this in verbose mode
* body is now included based on verbose setting
* WIP
* Due to issues with DumpResponse and gzip decoding use raw response from exchange for body output Also adds gzip decoding back as bug fix for OK group exchange
* removed additional new line
* Added URL path to dumpbody display as well
* Updates nonce generation to adhere to fifo channel buffer before request executes by routine
* removed unused variables, lns etc
* Fix requested changes and added in timer that disengages lock if out of scope error occurs
* Fixed woopsy daisy issue
* Add benchmark, reduce time in force to unlock before stack insertion, add nil check for edge case
* Remove unusued waitgroup field
* use return nonce.Value and method, rm redundant nonce code, fix tests.
* Fix linter issue: unnecessary conversion
* Really basic getSimulated fee function everywhere
* Worst case fees for all exchanges
* Adds tests, fixes comment spacing. Adds wrapper logic. Makes test api key var name consistent. Removes some okcoin ETT tests
* Removes redundant functions
* linting issues. Fixes introduces huobi issues
* More linting
* Stops trying to hide ETT problems, uses iota
* Skips ETT tests for now
* Updated SetAPIURL() & UpdateConfig() to use pointers
* Withdraw functions now take a pointer to withdrawrequest struct
* Fund Withdraw is now a pointer
* Moved GetFee functions to use a pointer due to large size of feebuilder struct
* OrderCancellation usage converted to pointer due to size of struct
* merged up upstream/master and changes made to OKgroup code
* GetOrdersRequest usage converted to a pointer
* okgroup pointer migration
* reverted golangci config back to master
* removed old anx benchmark typo
* Initial currency overhaul before service system implementation
* Remove redundant currency string in orderbook.Base
Unexport lastupdated field in orderbook.Base as it was being instantiated multiple times
Add error handling for process orderbook
* Remove redundant currency string in ticker.Price
Unexport lastupdated field in ticker.Price
Add error handling for process ticker function and fix tests
* Phase Two Update
* Update translations to use map type - thankyou to kempeng for spotting this
* Change pair method name from Display -> Format for better readability
* Fixes misspelling and tests
* Implement requested changes from GloriousCode
* Remove reduntant function and streamlined return in currency_translation.go
* Revert pair method naming conventions
* Change currency naming conventions
* Changed code type to exported Item type with underlying string to reduce complexity
* Added interim orderbook process method to orderbook.Base type
* Changed feebuilder struct field to currency.Pair
* Adds fall over system for backup fx providers
* deprecate function and children and fix linter issue with btcmarkets
* Fixed requested changes
* Fix bug and move mtx for rates
* Fixed after rebase oopsies
* Fix linter issues
* Fixes race conditions in testing functions
* Final phase coinmarketcap update
* fix linter issues
* Implement requested changes
* Adds configuration variables to increase/decrease time durations between updating currency file and fetching new currency rates
* Add a collection of tests to improve codecov
* After rebase oopsy fixes for btse
* Fix requested changes
* fix after rebase oopsies and add more efficient comparison checks within currency pair
* Fix linter issues
* Initial commit
* Successful authenticated request implementation.
* Removes data from okcoin, okex. Implements some account okgroup endpoints. Adds tests
* Finishes account API endpoint implementations.
* Implements and adds tests for the following okgroup v3 API endpoints: GetSpotTradingAccounts, GetSpotTradingAccountForCurrency, GetSpotBillDetailsForCurrency, PlaceSpotOrder, PlaceMultipleSpotOrders, CancelSpotOrder, CancelMultipleSpotOrders, GetSpotOrders, GetSpotOpenOrders, GetSpotOrder, GetSpotTransactionDetails, GetSpotTokenPairDetails, GetSpotOrderBook, GetSpotAllTokenPairsInformation, GetSpotAllTokenPairsInformationForCurrency, GetSpotFilledOrdersInformation, GetSpotMarketData
* Implements and adds tests for all margin api endpoints: GetMarginTradingAccounts, GetMarginTradingAccountsForCurrency, GetMarginBillDetails, GetMarginAccountSettings, GetMarginLoanHistory, OpenMarginLoan, RepayMarginLoan, PlaceMarginOrder, PlaceMultipleMarginOrders, CancelMarginOrder, CancelMultipleMarginOrders, GetMarginOrders, GetMarginOpenOrders, GetMarginOrder, GetMarginTransactionDetails. Simplifies some Spot endpoints combining ForCurrency funcs where possible
* Adds all 29 Futures endpoints with tests. Updates comments and naming conventions. Adds standard realordertest func. Adds ability to make public API requests. Adds test purpose comments
* Adds 29 endpoints for SWAP API support. Adds tests for each endpoint. Declares response variables in function declaration. Simplifies URL parameter formatting
* Adds all ETT endpoints with tests
* Creates OKCoin and OKEX struct types. Moves okgroup tests to okcoin and okex exchanges. Updates withdraw fee calculation. Updates exchange.go exchange declaration to point to new types. Streamlines wrapper tests. Begins websocket integration
* Rebase fixes
* Deletes okcoin_types.go, okcoin_wrapper.go, okex_types.go, okex_wrapper.go. Combines okex,okcoin wrappers in okgroup_wrapper.go. Removes boilerplate url.values with new request struct type parsing. Adds github.com/google/go-querystring to go modules. Replaces USDT with USD for OKCoin tests. Moves OKEX specific endpoints (futures, swap & ett) to okex.go. Fixes recieving receiving again
* Maps the wrapper
* Parses json into time.Time instead of string + conversion
* Renames websocket.SetEnabled to websocket.SetWsStatusAndConnection. Maps main spot websocket functions for okgroup. Adds some basic ws tests
* Updates websocket default URLS, adds checksum tests, removes setdefaults from okgroup, adds WebsocketDataWrapper to wrap all okgroup websocket data responses, handles spot, swap, index and futures ticker, candle, trade, orderbook, funding fee websocket responses. Partially implements checksum validation on orderbook data. Fixes all linting issues
* Handles the calculation of okgroup websocket checksums. Adds tests
* Now all orderbook checksums are validated. Cleans up implementations and removes invalid checksum calculator functions. Adds function to parse ordertype. Puts verbose logs behind verbose check
* Removes parallel from okgroup tests. Removes unused code. Adds GetWsChannelWithoutOrderType. Improves handling of WS data types. Adds types for more ws channels. Simplifies update orderbook handling
* updates btse func name
* linting
* Fixes websocket connection issue with tests. Removes test verbosity
* Updates checksum calculation to handle more than 7 decimal places. Adds rate limiters. Uses != "" instead of len > 0. Adds new test to handle checksum calculation with 8 decimal places.
* Removes logging. Fixes orderbook wrapper references
* Adds slightly more robust resubscribe func. Adds websocket tests that can detect websocket errors
* Fixes linting issues
* Adds new WS func IsConnected() to expose ws status. Tests protect against channel timeout
* Adds test comments. Fixes parallel issues for futures tests
* Fixes error output for wrapper function
* Added new base logger
* updated example and test configs
* updated exchange helpers restful router & server
* logPath is now passed to the logger to remove dependency on common package
* updated everything besides exchanges to use new logger
* alphapoint to bitmex done
* updated bitmex bitstamp bittrex btcc and also performance changes to logger
* btcmarkets coinbase coinut exmo gateio wrappers updated
* gateio and gemini logger updated
* hitbtc huobi itbit & kraken updated
* All exchanges updatd
* return correct error for disabled websocket
* don't disconnect client on invalid json
* updated router internal logging
* log.Fatal to t.Error for tests
* Changed from fatal to error failure to set maxprocs
* output ANSI codes for everything but windows for now due to lack of windows support
* added error handling to logger and unit tests
* clear wording on print -> log.print
* added benchmark test
* cleaned up import sections
* Updated logger based on PR requests (added default config options on failure/setting errors)
* ah this should fix travici enc config issue
* Load entire config and clear out logging to hopefully fix travisci issue
* wording & test error handling
* fixed formatting issues based on feedback
* fixed formatting issues based on feedback
* changed CheckDir to use mkdirall instead of mkdir and other changes based on feedback
* Initial broken commit for updating exchanges to store data on whether withdrawals can be handled completely by the API
* Changes to use base exchange method to determine withdrawal permissions using bitshifting
* Adds withdrawal capabilities for alphapoint, anx, binance, bitfinex, bitflyer, bithumb, bitmex, bitstamp, bittrex exchanges
* Adds withdraw capabilities for btcmarkets, coinbasepro, coinut, exmo, gateio, gemini, hitbtc, huobi, hadax
* Adds withdraw capabilities for itbit, kraken, lakebtc, liqui, localbitcoins, okcoin, okex, poloniex, wex, yobit, zb
* Titillating tests & Wonderful wrappers
* Fixes typo, double checks all apis and corrects permissions
* Fixes gemini test
* Fixes incorrect log placement. Removes breaks
* Addresses PR comments. Changes readable function to: FormatWithdrawPermissions, adds new function 'GetWithdrawPermissions' and 'SupportsWithdrawPermissions'. Adds three functions to interface
* Removes unnecessary config_example.json additions
* Fixes bitwise comparisons. Adds more tests to highlight expected outcomes
* Adds some constants for fee types
Adds some fee calculation in an attempt to be generic
Adds fee stuff to Bittrex
Adds fee stuff to bitstamp
* Fixes bitstamp fee calculation
* Tests
Tests all scenarios for GetFeeByType
* Adds method to wrapper
Adds err to response
Checks for err
* Adds support for Bittrex fees
* Adds maker/taker dynamic to fees
Updates tests
Adds bitmex fee support
Removes unused switch case scenarios to not waste space
* Adds bithumb support for fee calculation
* Adds Bitfinex fee support
Adds list of currencies as const strings
Sets up bitflyer
* Fixes arguments
* Greatly expands symbols
Adds Binance fee calculation support
Cleans up previous exchanges
* Fixes errors for fee calculations
* Adds ANX fee support
* Adds btcc fee support
Adds alphapoint fee wrapper support
Renames method to match "enum"
Uses symbols in tests, not inline strings
* Adds support for BTCMarkets fee calculation
Adds new method to retrieve fee amount from BTCMarkets
Adds new fee type struct: FeeBuilder
Updates ANX and BTCMarkets to use new FeeBuilder type struct
Standardises the tests to run when it comes to fee calculation
* Migrates all existing exchange fee to use new feebuilder type struct
Uses standard testing model
* Fixes unit tests
* Updates maker taker fees in test config
* Removes parallel from fee testing
* Removes more parallel from tests
* Adds coinbasepro fee support
* Adds Coinut fee support
* Adds Exmo fee support
Adds maker fee support to coinut
Introduces a type for fees and bank transfers to prevent random strings being used
* Adds partial bitflyer support
Moves bitflyer to feeBuilder struct
* Adds gateio fee support
* Adds Gemini fee support
* Adds hitbtc fee support
* Adds huobi fee support
* Adds HuobiHadax fee support
* Adds itbit fee support
* Adds partial kraken fee support with trading fees
* Finishes basic Kraken fee support
* Adds basic LakeBTC fee support
* Adds basic liqui fee support
* Adds localbitcoins fee support.......
* Adds basic okcoin fee support
* Adds simple OKEX fee support
Adds many new currency symbols
Fixes liqui's fees
* Adds poloniex fee support
* Adds fee support for Yobit
* Adds WEX fee support
* Adds ZB fee support
* Removes bad reference
* Improves accuracy of variable name
* trading fee method names are now consistent
(cherry picked from commit 21c82e8b90cae590cfd73d365d7be39e1a00e973)
* Fixes rebasing issues
* Fixes issues from rebase
Removes "IsTaker" as IsMaker bool can imply taker
Updates tests to actually work.
* Adds a zero to the test
* Fixes bitfinex api endpoints and fixes fee calculations
* Updates btcmarkets trading fee calculation
* Verifies tests with apis for all exchanges except coinbasepro, itbit and bitflyer
Removes taker fee test as taker is default
* Removes redundant all exchange wrapper error checks due to the error checks being redundant
* Addresses review comments:
- Renames variables
- Changes how functions return data
- Fixes typo
* Initial overhaul of websocket connection and feeds
* Added proxy support
* Piped to routines.go
* Added new websocket file in exchanges
Refactored orderbook handling into exchange_websocket.go
Added better error responses for binance_websocket.go
General clean for binance_websocket.go
* General fixes - bitfinex_websocket.go
Refactored orderbook cache code - bitfinex_websocket.go
Removed fatal error with unhandled type - routines.go
* Added general improvements to bitmex_websocket.go
Refactored orderbook handling to exchange_websocket.go
Added variable in Item struct in orderbook.go for looking up orders by ID
* Fix issue when routines are blocked due to Data Handler not started
Updated traffic handler
General fixes for bitstamp_websocket.go
* General fixes for coinbasepro_websocket.go
* General fixes for coinut_websocket.go
Fixed error return in exchange_websocket.go
* Removed comments in coinut_wrapper.go
Refactor orderbook logic from hitbtc_websocket.go to exchange_websocket.go
* General fixes
* Removed comments
General fixes
* Updated routines.go
* After rebase fix
* Fixed update config pairs in okcoin.go
* fixed config currency issue in okcoin.go for okcoin China
* exchange_websocket.go
*Removed unused const dec
*Removed state change routine
*Improved trafficMonitor routine
*Increased verbosity for error returns
*Removed uneeded mutex locks
exchange_websocket_test.go
*Added new tests for websocket and orderbook updating
routines.go
*Removed string cased
* Fixed race conditions on sync.waitgroup in exchanges_websocket.go
* Changes variable name in config.go
* Removes unnecessary comment
* Removes indefinite lock on error return
* Removes unnecessary comment
* Adds support for BTCC websocket
Drops support for BTCC REST
* Rewords comment in exchange_websocket.go
Moves types to poloniex_types.go
* Moves types to coinut_types.go
* Removes uneeded range for accessing array variables for coinbase_websocket.go
Removes comments in coinut_types.go
* Adds verbosity flag to GCT
Suppresses verbose output from routines.go
* Fixes setting proxy for REST and Websocket per exchange
Upgrades error handling
Drops unused *url.Url variable in exchange type
* Adds test for setting proxy
* Fixes bug that closes connection due to incorrect timeout time through a proxy connection
* Clarify verbose flag message
- Modifications made to the request package. Planned improvements will be
sending requests on intervals, rate limiter back off support, dynamic tuning
and requests packaged into a request job group.
- Can modify each exchanges individual HTTP client (e.g timeout and
transport settings).
- Bot now uses an exchange config HTTP timeout value.
- Bot now uses a global HTTP timeout (configurable).
- Batched ticker request support for exchanges.
- Ticker and Orderbook fetching now are spanned accross multiple
go routines and regulated by a sync wait group.
- Fixes hack used to load exchanges, now uses a sync wait group.
- Ticker and Orderbook storage and fetching now uses mutex locks.
- New pair function for finding different pairs between two supplied
pair arrays. This is used for currency pair updates for exchange which
support dynamic updating.
- Shows removal/additions of dynamic updates currencies.