* currency/manager: remove deadlock potential in concurrent operations
* fix kucoin test, lets see what this does shalllllll weeeeee.
* another fix in the deep dark depths
---------
Co-authored-by: Ryan O'Hara-Reid <ryan.oharareid@thrasher.io>
* Tests: Move and simplify TestFixtureToDataHandler
* Currency: Fix PairsManager.Load breaking matcher
* Tests: Add multi-instance cache to UpdatePairsOnce
* Kraken: Fix TestUpdateTickers race error
Calling StorePairs on global instance can lead to race
* Bitfinex: Fix TestUpdateTickers racing intermittently
* Currency: Fix concurrent access to PM formats
* Currency: Fix SupportsAsset implementation
This should delegate entirely to PairManager's IsAssetSupported
* Okx: Fix PM intrusion, rm GetPairFromInstrumentID
* Exchange: Fix SetGlobalPairsManager to set asset enabled
* Bitflyer: Fix race on set TestGetCurrURL
TestGetCurrencyTradeURL would fail sometimes due to sequencing of
enabling futures but not having pairs for it.
* Tests: Simplify usage pattern for FixtureToDH
* initial purge and benchmarks proof before rn overhaul
* rn LinkedList -> Tranche(s) and purge references
* roll out acrost exchanges
* linterino
* rn silly billy label
* linter strikes AAAAAGAIN!
* fix some things
* rm comment
* Add actual comparison from master to branch benchmark for sorting algorithms
* lower case via git mv YAAY!
* drop code
* convert type name
* glorious: nits
---------
Co-authored-by: Ryan O'Hara-Reid <ryan.oharareid@thrasher.io>
* Test: Internal exchange coverage
* Tests: Rename exchange.TestInstance to Setup
This package function is either going to be imported and used as just exchange.Setup,
or more likely testexch.Setup.
This removes the Stutter of having
internal/testing/exchange.TestInstance which is implicit given the
package path
* qa: Enforce JSON lint for GCT configs
* Makefile/GHA: Make output more verbose on success, clean duplicate PHONY and rid excess newlines
* Makefile: Use printf for OS cross-compatibility output
* gateio: fix spot deployment issue
* fix status bug add test
* to actual return type
* fix linter
* ch type
* glorious: nits
* rm space
* glorious: nits
---------
Co-authored-by: Ryan O'Hara-Reid <ryan.oharareid@thrasher.io>
* Currency: Remove Pair Index formatting/parsing
This feature was originally for exchanges with only one pair (e.g. KRW) which made parsing easier.
However there's no examples of this left, and we can reduce complexity
overall by removing it.
* Exchange: Partial assertify tests and fixes
* Currency: Fix panic on a delimiterless small currency
* Kraken: Fix wsCancelOrders not erroring order id
We were using the "cancel many" facility of the Kraken api.
However since that doesn't actually report errors individually, it seems
saner to just multiplex over it.
We were going to get N+ responses anyway. Might as well send N+ requests
* Common: Add ErrorCollector and methods
* improv. timed mutex
* Add all protection back in and jankyness because races. :'(
* Add intial benchmarkeroos
* Add master benchmarks
* goodness me
* what?
* what again?
* glorious: nits
* just a swaperino instead
* clean up package nonce so that we only need to aquire mutex once
* unlock before checking master
* commentary
* wha
* more comment
* ch comment
* nonce: Allow for broad customisation externally with a ~2ns overhead
* glorious: nits maybe works?
---------
Co-authored-by: Ryan O'Hara-Reid <ryan.oharareid@thrasher.io>
* Shift wrapper function GetDefaultConfig to exchange.Base method definition, to ensure set defaults doesn't get called twice and to reduce code
* rm alphapoint bootstrap method as is defined as exchange.Base method
* add tests
* glorious: make it a function and make it IBOTEXCHANGE
---------
Co-authored-by: shazbert <ryan.oharareid@thrasher.io>
* improv. timed mutex
* Add all protection back in and jankyness because races. :'(
* Add intial benchmarkeroos
* Add master benchmarks
* goodness me
* what?
* what again?
* glorious: nits
* just a swaperino instead
---------
Co-authored-by: Ryan O'Hara-Reid <ryan.oharareid@thrasher.io>
WsConnect is calling GetInstruments, and when that fails, erroring out
and not subscribing to anything.
The response to get instruments is an object {}, which skips the
IncomingWithData check in wsReadData for arrays [].
The check in wsHandleData depended on client_ord_id, but I figure so
long as there's a nonce which matches, we can palm it off.
This results simutaneously in having to move the login handler back to
it's waiting nonce-parser, and also simplifying/deduping it.
Failed again due to kraken re-setting limits due to price increases.
Switch from specific PriceStepIncrementSize and MinimumBaseAmount to just ensuring they are positive so we don't have to do this again
* Websocket: Prevent panic on Disconnect/Connect
Previously we'd set the websocket to disconnected when *either* of the
Conn/AuthConn got a disconnect message.
This meant that:
* The other connection was still functioning
* A user would be free to call Connect()
* wsReadData() may not have exited
Any call to Connect would be acceptable, and we'd probably get a panic
from the underlying shared/re-used gorilla websocket:
`panic: runtime error: slice bounds out of range [:13501] with capacity 8192`
when a new wsReadData goro is started and the old tries to ReadMessage
as well, overallocating the buffer.
This wouldn't normally occur because trafficMonitor would see traffic
(on either connection) and then set the websocket to being connected
again.
The solution is to treat a Disconnect on either websocket as a call to
Shutdown the whole websocket, and then trafficMonitor can reconnect it
properly.
Unit Testing for this has been difficult. So far I've had to rely on a
disruption inside websocket's connectionMonitor itself to reproduce the
panic, but from there it's been very consistent.
* Websocket: Fix race on DataHandler during shutdown
Previously we would encounter situations where shutdown would race and
fail TestConnectionMessageErrors, demonstrating that consumers might not
be told why their connection is closing.
* Do not drain DataHandler on dataMonitor shutdown
Consumers should be allowed to process whatever messages were in flight
prior to a socket shutdown
* Ensure all DataHandler messages are sent to ToRoutine before shutdown
This avoids a race where we'd read a message from DataHandler, but then
process a shutdown before trying to relay it. The relay is non-blocking
anyway, so we can trust that we'd pick up the Shutdown during the next
loop.
* Send errors to DataHandler before starting a shutdown
This just reduces the chance of a race on shutdown processing
* Websocket: Log counter of dropped messages
* gateio: fix unmarshal bug and update fields
* gateio: fix wrapper function function, add helper methods
* update order types and add kucoin wrapper fix
* currency pairs
* Add tests
* gateio; inspect error and continue for no funds in account, kucoin: fetch all settlement amounts
* futures: order fixit
* finish off gateio updates for market orders
* cute line
* Update exchanges/kucoin/kucoin_wrapper.go
Co-authored-by: Scott <gloriousCode@users.noreply.github.com>
* Update exchanges/kucoin/kucoin_wrapper.go
Co-authored-by: Scott <gloriousCode@users.noreply.github.com>
* Update exchanges/gateio/gateio.go
Co-authored-by: Scott <gloriousCode@users.noreply.github.com>
* Update exchanges/gateio/gateio_wrapper.go
Co-authored-by: Scott <gloriousCode@users.noreply.github.com>
* Update exchanges/gateio/gateio_wrapper.go
Co-authored-by: Scott <gloriousCode@users.noreply.github.com>
* glorious: nits
* glorious: nits - filter by pair match and fix bug where the endpoint returns details instead of message
* Add fix for leverage check (non-merge) my ip has been blocked from gateio still... scammmmmmmm
* glorious: nitters
* Update exchanges/gateio/gateio_test.go
Co-authored-by: Adrian Gallagher <adrian.gallagher@thrasher.io>
* Update exchanges/gateio/gateio_test.go
Co-authored-by: Adrian Gallagher <adrian.gallagher@thrasher.io>
* Update exchanges/gateio/gateio_test.go
Co-authored-by: Adrian Gallagher <adrian.gallagher@thrasher.io>
---------
Co-authored-by: Ryan O'Hara-Reid <ryan.oharareid@thrasher.io>
Co-authored-by: Scott <gloriousCode@users.noreply.github.com>
Co-authored-by: Adrian Gallagher <adrian.gallagher@thrasher.io>