gruelbox / orko

Trade on and script multiple crypto exchanges from a single user interface on desktop and mobile. In development.
GNU Affero General Public License v3.0
179 stars 63 forks source link

[kraken] Kraken support #141

Open badgerwithagun opened 5 years ago

badgerwithagun commented 5 years ago

Which exchange? Kraken: https://www.kraken.com/

XChange and x-change-stream support XChange yes, xchange-stream no (however bounty available for implementation)

Bounty None

Progress

badgerwithagun commented 5 years ago

Beta read-only support provided. Need to test authenticated. No rush to provide streaming support unless there's a particularly strong reason to do so.

badgerwithagun commented 5 years ago

Getting stale nonce issues:

Jan 15 10:28:55: ERROR [2019-01-15 10:28:55,192] com.gruelbox.orko.marketdata.MarketDataSubscriptionManager: Error fetching market data: bitfinex/USD/NEO/OPEN_ORDERS 
Jan 15 10:28:55: ! org.knowm.xchange.exceptions.NonceException: Nonce is too small. 
Jan 15 10:28:55: ! at org.knowm.xchange.bitfinex.v1.service.BitfinexBaseService.handleException(BitfinexBaseService.java:49) 
Jan 15 10:28:55: ! at org.knowm.xchange.bitfinex.v1.service.BitfinexTradeServiceRaw.getBitfinexOpenOrders(BitfinexTradeServiceRaw.java:83) 
Jan 15 10:28:55: ! at org.knowm.xchange.bitfinex.v1.service.BitfinexTradeService.getOpenOrders(BitfinexTradeService.java:53) 
Jan 15 10:28:55: ! at com.gruelbox.orko.marketdata.MarketDataSubscriptionManager.pollAndEmitOpenOrders(MarketDataSubscriptionManager.java:676) 
Jan 15 10:28:55: ! at com.gruelbox.orko.marketdata.MarketDataSubscriptionManager.fetchAndBroadcast(MarketDataSubscriptionManager.java:644) 
Jan 15 10:28:55: ! at com.gruelbox.orko.marketdata.MarketDataSubscriptionManager.pollExchange(MarketDataSubscriptionManager.java:545) 
Jan 15 10:28:55: ! at java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:184) 
Jan 15 10:28:55: ! at java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:948) 
Jan 15 10:28:55: ! at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481) 
Jan 15 10:28:55:  ! at java.util.stream.ForEachOps$ForEachTask.compute(ForEachOps.java:291) 
Jan 15 10:28:55:  ! at java.util.concurrent.CountedCompleter.exec(CountedCompleter.java:731) 
Jan 15 10:28:55:  ! at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289) 
Jan 15 10:28:55:  ! at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1056) 
Jan 15 10:28:55:  ! at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1692) 
Jan 15 10:28:55:  ! at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157) 
badgerwithagun commented 5 years ago

Also looks like SocketTimeoutException is getting wrapped and thus not treated silently:

Feb 26 20:57:35: ERROR [2019-02-26 20:57:35,179] com.gruelbox.orko.marketdata.MarketDataSubscriptionManager: Error fetching data for kraken 
Feb 26 20:57:35: ! java.net.SocketTimeoutException: Read timed out 
Feb 26 20:57:35: ! at java.net.SocketInputStream.socketRead0(Native Method) 
Feb 26 20:57:35: ! at java.net.SocketInputStream.socketRead(SocketInputStream.java:116) 
Feb 26 20:57:35: ! at java.net.SocketInputStream.read(SocketInputStream.java:171) 
Feb 26 20:57:35: ! at java.net.SocketInputStream.read(SocketInputStream.java:141) 
Feb 26 20:57:35: ! at sun.security.ssl.InputRecord.readFully(InputRecord.java:465) 
Feb 26 20:57:35: ! at sun.security.ssl.InputRecord.read(InputRecord.java:503) 
Feb 26 20:57:35: ! at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:975) 
Feb 26 20:57:35: ! at sun.security.ssl.SSLSocketImpl.readDataRecord(SSLSocketImpl.java:933) 
Feb 26 20:57:35: ! at sun.security.ssl.AppInputStream.read(AppInputStream.java:105) 
Feb 26 20:57:35: ! at java.io.BufferedInputStream.fill(BufferedInputStream.java:246) 
Feb 26 20:57:35: ! at java.io.BufferedInputStream.read1(BufferedInputStream.java:286) 
Feb 26 20:57:35: ! at java.io.BufferedInputStream.read(BufferedInputStream.java:345) 
Feb 26 20:57:35: ! at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:735) 
Feb 26 20:57:35: ! at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:678) 
Feb 26 20:57:35: ! at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1587) 
Feb 26 20:57:35: ! at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1492) 
Feb 26 20:57:35: ! at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:480) 
Feb 26 20:57:35: ! at sun.net.www.protocol.https.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:347) 
Feb 26 20:57:35: ! at si.mazi.rescu.HttpTemplate.receive(HttpTemplate.java:122) 
Feb 26 20:57:35: ! at si.mazi.rescu.RestInvocationHandler.receiveAndMap(RestInvocationHandler.java:162) 
Feb 26 20:57:35: ! at si.mazi.rescu.RestInvocationHandler.invoke(RestInvocationHandler.java:119) 
Feb 26 20:57:35: ! ... 14 common frames omitted 
Feb 26 20:57:35: ! Causing: java.lang.reflect.UndeclaredThrowableException: null 
Feb 26 20:57:35: ! at com.sun.proxy.$Proxy108.getTicker(Unknown Source) 
Feb 26 20:57:35: ! at org.knowm.xchange.kraken.service.KrakenMarketDataServiceRaw.getKrakenTicker(KrakenMarketDataServiceRaw.java:48) 
Feb 26 20:57:35: ! at org.knowm.xchange.kraken.service.KrakenMarketDataService.getTicker(KrakenMarketDataService.java:35) 
Feb 26 20:57:35: ! at com.gruelbox.orko.marketdata.MarketDataSubscriptionManager$Poller.pollAndEmitTicker(MarketDataSubscriptionManager.java:916) 
Feb 26 20:57:35: ! at com.gruelbox.orko.marketdata.MarketDataSubscriptionManager$Poller.lambda$fetchAndBroadcast$25(MarketDataSubscriptionManager.java:806) 
Feb 26 20:57:35: ! at com.gruelbox.orko.marketdata.MarketDataSubscriptionManager$Poller.manageExchangeExceptions(MarketDataSubscriptionManager.java:462) 
Feb 26 20:57:35: ! at com.gruelbox.orko.marketdata.MarketDataSubscriptionManager$Poller.fetchAndBroadcast(MarketDataSubscriptionManager.java:801) 
Feb 26 20:57:35: ! at com.gruelbox.orko.marketdata.MarketDataSubscriptionManager$Poller.loop(MarketDataSubscriptionManager.java:443) 
Feb 26 20:57:35: ! at com.gruelbox.orko.marketdata.MarketDataSubscriptionManager$Poller.run(MarketDataSubscriptionManager.java:386) 
Feb 26 20:57:35: ! at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) 
Feb 26 20:57:35: ! at java.util.concurrent.FutureTask.run(FutureTask.java:266) 
Feb 26 20:57:35: ! at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) 
Feb 26 20:57:35: ! at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) 
Feb 26 20:57:35: ! at java.lang.Thread.run(Thread.java:748)
badgerwithagun commented 5 years ago

Now the two issues I'm seeing are what look like XChange bugs:

When fetching trades. Looks like XChange bug

ERROR [2019-03-01 06:08:43,330] com.gruelbox.orko.marketdata.MarketDataSubscriptionManager: Error fetching data for kraken 
 ! si.mazi.rescu.HttpStatusIOException: Unrecognized token 'j': was expecting ('true', 'false' or 'null') 
 !  at [Source: (StringReader); line: 1, column: 595] (through reference chain: org.knowm.xchange.kraken.dto.marketdata.results.KrakenPublicTradesResult["result"]) 
 ! at si.mazi.rescu.ResponseReader.read(ResponseReader.java:104) 
 ! at si.mazi.rescu.RestInvocationHandler.mapInvocationResult(RestInvocationHandler.java:175) 
 ! at si.mazi.rescu.RestInvocationHandler.receiveAndMap(RestInvocationHandler.java:163) 
 ! at si.mazi.rescu.RestInvocationHandler.invoke(RestInvocationHandler.java:119) 
 ! at com.sun.proxy.$Proxy112.getTrades(Unknown Source) 
 ! at org.knowm.xchange.kraken.service.KrakenMarketDataServiceRaw.getKrakenTrades(KrakenMarketDataServiceRaw.java:78) 
 ! at org.knowm.xchange.kraken.service.KrakenMarketDataService.getTrades(KrakenMarketDataService.java:83) 
 ! at com.gruelbox.orko.marketdata.MarketDataSubscriptionManager$Poller.pollAndEmitTrades(MarketDataSubscriptionManager.java:883) 

And

ERROR [2019-03-01 07:15:14,783] com.gruelbox.orko.marketdata.MarketDataSubscriptionManager: Error fetching data for kraken 
! java.io.IOException: Premature EOF 
! at sun.net.www.http.ChunkedInputStream.readAheadBlocking(ChunkedInputStream.java:565) 
! at sun.net.www.http.ChunkedInputStream.readAhead(ChunkedInputStream.java:609) 
! at sun.net.www.http.ChunkedInputStream.read(ChunkedInputStream.java:696) 
! at java.io.FilterInputStream.read(FilterInputStream.java:133) 
! at sun.net.www.protocol.http.HttpURLConnection$HttpInputStream.read(HttpURLConnection.java:3444) 
! at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284) 
! at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326) 
! at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178) 
! at java.io.InputStreamReader.read(InputStreamReader.java:184) 
! at java.io.BufferedReader.fill(BufferedReader.java:161) 
! at java.io.BufferedReader.readLine(BufferedReader.java:324) 
! at java.io.BufferedReader.readLine(BufferedReader.java:389) 
! at si.mazi.rescu.HttpTemplate.readInputStreamAsEncodedString(HttpTemplate.java:231) 
! at si.mazi.rescu.HttpTemplate.receive(HttpTemplate.java:134) 
! at si.mazi.rescu.RestInvocationHandler.receiveAndMap(RestInvocationHandler.java:162) 
! at si.mazi.rescu.RestInvocationHandler.invoke(RestInvocationHandler.java:119) 
! at com.sun.proxy.$Proxy112.getTrades(Unknown Source) 
! at org.knowm.xchange.kraken.service.KrakenMarketDataServiceRaw.getKrakenTrades(KrakenMarketDataServiceRaw.java:78) 
! at org.knowm.xchange.kraken.service.KrakenMarketDataService.getTrades(KrakenMarketDataService.java:83) 
! at com.gruelbox.orko.marketdata.MarketDataSubscriptionManager$Poller.pollAndEmitTrades(MarketDataSubscriptionManager.java:883)
badgerwithagun commented 5 years ago

Looking more stable at the back-end now despite a lot of socket timeouts and premature EOFs (hooray for the tolerance code and automated backoff)

badgerwithagun commented 5 years ago

Damn, looks like market trades don't work at all (all the requests are timing out).

badgerwithagun commented 5 years ago

I started on this, but am no longer actively using Kraken so it's fallen some way down my priority list.

If anyone else wants to pick it up, please do. Happy to give pointers.