ccxt 4.5.55 → 4.5.56
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +209 -5
- package/dist/ccxt.browser.min.js +3 -3
- package/dist/cjs/ccxt.js +1 -1
- package/dist/cjs/src/aftermath.js +10 -5
- package/dist/cjs/src/alpaca.js +2 -2
- package/dist/cjs/src/apex.js +25 -16
- package/dist/cjs/src/arkham.js +7 -4
- package/dist/cjs/src/ascendex.js +6 -3
- package/dist/cjs/src/base/Exchange.js +3 -3
- package/dist/cjs/src/bigone.js +7 -4
- package/dist/cjs/src/binance.js +4 -4
- package/dist/cjs/src/bingx.js +4 -4
- package/dist/cjs/src/bitflyer.js +2 -1
- package/dist/cjs/src/bitget.js +14 -3
- package/dist/cjs/src/bitmart.js +5 -4
- package/dist/cjs/src/bitmex.js +7 -4
- package/dist/cjs/src/bitopro.js +1 -1
- package/dist/cjs/src/bitrue.js +2 -1
- package/dist/cjs/src/bitso.js +6 -3
- package/dist/cjs/src/bitstamp.js +5 -3
- package/dist/cjs/src/bittrade.js +2 -1
- package/dist/cjs/src/blofin.js +2 -1
- package/dist/cjs/src/bybit.js +19 -17
- package/dist/cjs/src/bybiteu.js +1 -0
- package/dist/cjs/src/coinbaseexchange.js +2 -1
- package/dist/cjs/src/coinbaseinternational.js +15 -9
- package/dist/cjs/src/coinex.js +5 -3
- package/dist/cjs/src/coinsph.js +4 -4
- package/dist/cjs/src/cryptocom.js +6 -6
- package/dist/cjs/src/deepcoin.js +6 -3
- package/dist/cjs/src/delta.js +2 -1
- package/dist/cjs/src/deribit.js +4 -2
- package/dist/cjs/src/derive.js +5 -3
- package/dist/cjs/src/digifinex.js +2 -1
- package/dist/cjs/src/exmo.js +12 -39
- package/dist/cjs/src/foxbit.js +1 -1
- package/dist/cjs/src/gemini.js +4 -2
- package/dist/cjs/src/grvt.js +13 -7
- package/dist/cjs/src/hashkey.js +4 -4
- package/dist/cjs/src/hibachi.js +1 -1
- package/dist/cjs/src/hitbtc.js +2 -1
- package/dist/cjs/src/htx.js +9 -5
- package/dist/cjs/src/hyperliquid.js +19 -13
- package/dist/cjs/src/indodax.js +2 -1
- package/dist/cjs/src/kraken.js +14 -13
- package/dist/cjs/src/krakenfutures.js +2 -1
- package/dist/cjs/src/lbank.js +8 -4
- package/dist/cjs/src/lighter.js +1 -1
- package/dist/cjs/src/luno.js +1 -1
- package/dist/cjs/src/mercado.js +2 -1
- package/dist/cjs/src/mexc.js +24 -14
- package/dist/cjs/src/modetrade.js +1 -1
- package/dist/cjs/src/okx.js +6 -3
- package/dist/cjs/src/oxfun.js +5 -3
- package/dist/cjs/src/p2b.js +8 -4
- package/dist/cjs/src/paradex.js +3 -2
- package/dist/cjs/src/phemex.js +4 -2
- package/dist/cjs/src/poloniex.js +2 -1
- package/dist/cjs/src/pro/apex.js +10 -1
- package/dist/cjs/src/pro/aster.js +10 -9
- package/dist/cjs/src/pro/binance.js +3 -3
- package/dist/cjs/src/pro/bingx.js +7 -2
- package/dist/cjs/src/pro/bitmart.js +10 -0
- package/dist/cjs/src/pro/bitmex.js +1 -1
- package/dist/cjs/src/pro/grvt.js +8 -0
- package/dist/cjs/src/pro/htx.js +4 -4
- package/dist/cjs/src/pro/krakenfutures.js +16 -4
- package/dist/cjs/src/pro/modetrade.js +3 -3
- package/dist/cjs/src/pro/okx.js +4 -4
- package/dist/cjs/src/pro/oxfun.js +4 -4
- package/dist/cjs/src/pro/woo.js +4 -4
- package/dist/cjs/src/pro/woofipro.js +3 -3
- package/dist/cjs/src/pro/xt.js +1 -1
- package/dist/cjs/src/toobit.js +1 -1
- package/dist/cjs/src/woo.js +1 -1
- package/dist/cjs/src/woofipro.js +1 -1
- package/dist/cjs/src/xt.js +2 -1
- package/dist/cjs/src/yobit.js +4 -2
- package/dist/cjs/src/zebpay.js +3 -3
- package/js/ccxt.d.ts +1 -1
- package/js/ccxt.js +1 -1
- package/js/src/abstract/mexc.d.ts +1 -0
- package/js/src/aftermath.js +10 -5
- package/js/src/alpaca.js +2 -2
- package/js/src/apex.d.ts +1 -1
- package/js/src/apex.js +25 -16
- package/js/src/arkham.js +7 -4
- package/js/src/ascendex.js +6 -3
- package/js/src/base/Exchange.js +3 -3
- package/js/src/bigone.js +7 -4
- package/js/src/binance.js +4 -4
- package/js/src/bingx.js +4 -4
- package/js/src/bitflyer.js +2 -1
- package/js/src/bitget.js +14 -3
- package/js/src/bitmart.js +5 -4
- package/js/src/bitmex.js +7 -4
- package/js/src/bitopro.js +1 -1
- package/js/src/bitrue.js +2 -1
- package/js/src/bitso.js +6 -3
- package/js/src/bitstamp.js +5 -3
- package/js/src/bittrade.js +2 -1
- package/js/src/blofin.js +2 -1
- package/js/src/bybit.d.ts +1 -1
- package/js/src/bybit.js +19 -17
- package/js/src/bybiteu.js +1 -0
- package/js/src/coinbaseexchange.js +2 -1
- package/js/src/coinbaseinternational.d.ts +1 -1
- package/js/src/coinbaseinternational.js +15 -9
- package/js/src/coinex.d.ts +1 -1
- package/js/src/coinex.js +5 -3
- package/js/src/coinsph.js +4 -4
- package/js/src/cryptocom.js +6 -6
- package/js/src/deepcoin.js +6 -3
- package/js/src/delta.js +2 -1
- package/js/src/deribit.js +4 -2
- package/js/src/derive.js +5 -3
- package/js/src/digifinex.js +2 -1
- package/js/src/exmo.js +12 -39
- package/js/src/foxbit.js +1 -1
- package/js/src/gemini.js +4 -2
- package/js/src/grvt.d.ts +1 -1
- package/js/src/grvt.js +13 -7
- package/js/src/hashkey.js +4 -4
- package/js/src/hibachi.d.ts +1 -1
- package/js/src/hibachi.js +1 -1
- package/js/src/hitbtc.js +2 -1
- package/js/src/htx.js +9 -5
- package/js/src/hyperliquid.d.ts +4 -4
- package/js/src/hyperliquid.js +19 -13
- package/js/src/indodax.js +2 -1
- package/js/src/kraken.js +14 -13
- package/js/src/krakenfutures.js +2 -1
- package/js/src/lbank.js +8 -4
- package/js/src/lighter.d.ts +1 -1
- package/js/src/lighter.js +1 -1
- package/js/src/luno.js +1 -1
- package/js/src/mercado.js +2 -1
- package/js/src/mexc.d.ts +2 -2
- package/js/src/mexc.js +24 -14
- package/js/src/modetrade.js +1 -1
- package/js/src/okx.js +6 -3
- package/js/src/oxfun.js +5 -3
- package/js/src/p2b.js +8 -4
- package/js/src/paradex.js +3 -2
- package/js/src/phemex.js +4 -2
- package/js/src/poloniex.js +2 -1
- package/js/src/pro/apex.js +10 -1
- package/js/src/pro/aster.js +10 -9
- package/js/src/pro/binance.d.ts +1 -1
- package/js/src/pro/binance.js +3 -3
- package/js/src/pro/bingx.js +7 -2
- package/js/src/pro/bitmart.js +10 -0
- package/js/src/pro/bitmex.js +1 -1
- package/js/src/pro/grvt.js +8 -0
- package/js/src/pro/htx.d.ts +4 -4
- package/js/src/pro/htx.js +4 -4
- package/js/src/pro/krakenfutures.d.ts +4 -4
- package/js/src/pro/krakenfutures.js +16 -4
- package/js/src/pro/modetrade.d.ts +3 -3
- package/js/src/pro/modetrade.js +3 -3
- package/js/src/pro/okx.d.ts +4 -4
- package/js/src/pro/okx.js +4 -4
- package/js/src/pro/oxfun.d.ts +4 -4
- package/js/src/pro/oxfun.js +4 -4
- package/js/src/pro/woo.d.ts +4 -4
- package/js/src/pro/woo.js +4 -4
- package/js/src/pro/woofipro.d.ts +3 -3
- package/js/src/pro/woofipro.js +3 -3
- package/js/src/pro/xt.js +1 -1
- package/js/src/toobit.d.ts +1 -1
- package/js/src/toobit.js +1 -1
- package/js/src/woo.js +1 -1
- package/js/src/woofipro.js +1 -1
- package/js/src/xt.js +2 -1
- package/js/src/yobit.js +4 -2
- package/js/src/zebpay.js +3 -3
- package/package.json +21 -7
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
[](https://www.npmjs.com/package/ccxt) [](https://npmjs.com/package/ccxt) [](https://pypi.python.org/pypi/ccxt) [](https://www.nuget.org/packages/ccxt) [](https://godoc.org/github.com/ccxt/ccxt/go/v4) [](https://discord.gg/ccxt) [](https://github.com/ccxt/ccxt/wiki/Exchange-Markets) [](https://x.com/ccxt_official)
|
|
4
4
|
|
|
5
|
-
A cryptocurrency trading API with more than 100 exchanges in JavaScript / TypeScript / Python / C# / PHP / Go.
|
|
5
|
+
A cryptocurrency trading API with more than 100 exchanges in JavaScript / TypeScript / Python / C# / PHP / Go / Java.
|
|
6
6
|
|
|
7
7
|
### [Install](#install) · [Usage](#usage) · [Manual](https://github.com/ccxt/ccxt/wiki) · [FAQ](https://github.com/ccxt/ccxt/wiki/FAQ) · [Examples](https://github.com/ccxt/ccxt/tree/master/examples) · [Contributing](https://github.com/ccxt/ccxt/blob/master/CONTRIBUTING.md) · [Disclaimer](#disclaimer) · [Social](#social)
|
|
8
8
|
|
|
@@ -16,7 +16,7 @@ Current feature list:
|
|
|
16
16
|
- fully implemented public and private APIs
|
|
17
17
|
- optional normalized data for cross-exchange analytics and arbitrage
|
|
18
18
|
- an out of the box unified API that is extremely easy to integrate
|
|
19
|
-
- works in Node 10.4+, Python 3, PHP 8.1+, netstandard2.0/2.1, Go 1.20+ and web browsers
|
|
19
|
+
- works in Node 10.4+, Python 3, PHP 8.1+, netstandard2.0/2.1, Go 1.20+, Java 21+ and web browsers
|
|
20
20
|
|
|
21
21
|
## See Also
|
|
22
22
|
|
|
@@ -198,6 +198,7 @@ The easiest way to install the CCXT library is to use a package manager:
|
|
|
198
198
|
- [ccxt in **Packagist/Composer**](https://packagist.org/packages/ccxt/ccxt) (PHP 8.1+)
|
|
199
199
|
- [ccxt in **Nuget**](https://www.nuget.org/packages/ccxt) (netstandard 2.0)
|
|
200
200
|
- [ccxt in **GO**](https://pkg.go.dev/github.com/ccxt/ccxt/go/v4)
|
|
201
|
+
- ccxt in **Java** (Java 21+, Gradle)
|
|
201
202
|
|
|
202
203
|
This library is shipped as an all-in-one module implementation with minimalistic dependencies and requirements:
|
|
203
204
|
|
|
@@ -206,6 +207,7 @@ This library is shipped as an all-in-one module implementation with minimalistic
|
|
|
206
207
|
- [php/](https://github.com/ccxt/ccxt/blob/master/php/) in PHP (generated from TS)
|
|
207
208
|
- [cs/](https://github.com/ccxt/ccxt/blob/master/cs/) in C# (generated from TS)
|
|
208
209
|
- [go/](https://github.com/ccxt/ccxt/blob/master/go/) in Go (generated from TS)
|
|
210
|
+
- [java/](https://github.com/ccxt/ccxt/blob/master/java/) in Java (generated from TS)
|
|
209
211
|
|
|
210
212
|
You can also clone it into your project directory from [ccxt GitHub repository](https://github.com/ccxt/ccxt):
|
|
211
213
|
|
|
@@ -242,13 +244,13 @@ console.log(version, Object.keys(exchanges));
|
|
|
242
244
|
|
|
243
245
|
All-in-one browser bundle (dependencies included), served from a CDN of your choice:
|
|
244
246
|
|
|
245
|
-
* jsDelivr: https://cdn.jsdelivr.net/npm/ccxt@4.5.
|
|
246
|
-
* unpkg: https://unpkg.com/ccxt@4.5.
|
|
247
|
+
* jsDelivr: https://cdn.jsdelivr.net/npm/ccxt@4.5.56/dist/ccxt.browser.min.js
|
|
248
|
+
* unpkg: https://unpkg.com/ccxt@4.5.56/dist/ccxt.browser.min.js
|
|
247
249
|
|
|
248
250
|
CDNs are not updated in real-time and may have delays. Defaulting to the most recent version without specifying the version number is not recommended. Please, keep in mind that we are not responsible for the correct operation of those CDN servers.
|
|
249
251
|
|
|
250
252
|
```HTML
|
|
251
|
-
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/ccxt@4.5.
|
|
253
|
+
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/ccxt@4.5.56/dist/ccxt.browser.min.js"></script>
|
|
252
254
|
```
|
|
253
255
|
|
|
254
256
|
Creates a global `ccxt` object:
|
|
@@ -337,6 +339,65 @@ import "ccxt"
|
|
|
337
339
|
fmt.Println(ccxt.Exchanges)
|
|
338
340
|
```
|
|
339
341
|
|
|
342
|
+
### Java
|
|
343
|
+
|
|
344
|
+
Java version of CCXT requires Java 21+ and uses Gradle as its build system.
|
|
345
|
+
|
|
346
|
+
Add the CCXT library as a local dependency in your `build.gradle.kts`:
|
|
347
|
+
|
|
348
|
+
```kotlin
|
|
349
|
+
dependencies {
|
|
350
|
+
implementation("io.github.ccxt:ccxt:4.5.52")
|
|
351
|
+
}
|
|
352
|
+
```
|
|
353
|
+
|
|
354
|
+
Or clone and build from source:
|
|
355
|
+
|
|
356
|
+
```shell
|
|
357
|
+
git clone https://github.com/ccxt/ccxt.git --depth 1
|
|
358
|
+
cd ccxt/java
|
|
359
|
+
./gradlew :lib:build
|
|
360
|
+
```
|
|
361
|
+
|
|
362
|
+
```Java
|
|
363
|
+
import io.github.ccxt.exchanges.Binance;
|
|
364
|
+
import io.github.ccxt.types.Ticker;
|
|
365
|
+
|
|
366
|
+
Binance exchange = new Binance();
|
|
367
|
+
exchange.loadMarkets(false);
|
|
368
|
+
|
|
369
|
+
Ticker ticker = exchange.fetchTicker("BTC/USDT");
|
|
370
|
+
System.out.println(ticker.symbol + " " + ticker.last);
|
|
371
|
+
```
|
|
372
|
+
|
|
373
|
+
Each exchange has its own typed subclass with strongly-typed return values. Every typed method ships both a blocking sync and a non-blocking `CompletableFuture`-returning async overload — pick the idiom that fits your call site:
|
|
374
|
+
|
|
375
|
+
```Java
|
|
376
|
+
// Sync — blocks until the response arrives
|
|
377
|
+
Ticker ticker = exchange.fetchTicker("BTC/USDT");
|
|
378
|
+
|
|
379
|
+
// Async — returns immediately, completes when the response arrives
|
|
380
|
+
CompletableFuture<Ticker> future = exchange.fetchTickerAsync("BTC/USDT", null);
|
|
381
|
+
future.thenAccept(t -> System.out.println(t.last));
|
|
382
|
+
```
|
|
383
|
+
|
|
384
|
+
WebSocket support is available via the pro exchange classes, with the same sync/async symmetry — `watchTicker` blocks for one update; `watchTickerAsync` returns a `CompletableFuture<Ticker>` you can compose:
|
|
385
|
+
|
|
386
|
+
```Java
|
|
387
|
+
import io.github.ccxt.exchanges.pro.Binance;
|
|
388
|
+
|
|
389
|
+
var exchange = new Binance();
|
|
390
|
+
exchange.loadMarkets(false);
|
|
391
|
+
|
|
392
|
+
// Sync — blocks for one update
|
|
393
|
+
Ticker tick = exchange.watchTicker("BTC/USDT");
|
|
394
|
+
|
|
395
|
+
// Async — returns a typed CompletableFuture (composable with allOf, anyOf, etc.)
|
|
396
|
+
CompletableFuture<Ticker> future = exchange.watchTickerAsync("BTC/USDT", null);
|
|
397
|
+
```
|
|
398
|
+
|
|
399
|
+
See [java/examples/](https://github.com/ccxt/ccxt/tree/master/java/examples) for more usage examples.
|
|
400
|
+
|
|
340
401
|
### Docker
|
|
341
402
|
|
|
342
403
|
You can get CCXT installed in a container along with all the supported languages and dependencies. This may be useful if you want to contribute to CCXT (e.g. run the build scripts and tests — please see the [Contributing](https://github.com/ccxt/ccxt/blob/master/CONTRIBUTING.md) document for the details on that).
|
|
@@ -645,6 +706,149 @@ Lastly, just because the signature dictates that some argument like `symbol` is
|
|
|
645
706
|
|
|
646
707
|
You can check different examples in the `examples/go` folder.
|
|
647
708
|
|
|
709
|
+
### Java
|
|
710
|
+
|
|
711
|
+
```Java
|
|
712
|
+
import io.github.ccxt.exchanges.Kraken;
|
|
713
|
+
import io.github.ccxt.exchanges.Bitfinex;
|
|
714
|
+
import io.github.ccxt.exchanges.Binance;
|
|
715
|
+
import io.github.ccxt.types.*;
|
|
716
|
+
|
|
717
|
+
import java.util.HashMap;
|
|
718
|
+
import java.util.Map;
|
|
719
|
+
|
|
720
|
+
public class Example {
|
|
721
|
+
public static void main(String[] args) {
|
|
722
|
+
// Create exchange instances
|
|
723
|
+
Kraken kraken = new Kraken();
|
|
724
|
+
Bitfinex bitfinex = new Bitfinex();
|
|
725
|
+
|
|
726
|
+
Map<String, Object> config = new HashMap<>();
|
|
727
|
+
config.put("apiKey", "YOUR_API_KEY");
|
|
728
|
+
config.put("secret", "YOUR_SECRET");
|
|
729
|
+
Binance binance = new Binance(config);
|
|
730
|
+
|
|
731
|
+
// Load markets
|
|
732
|
+
kraken.loadMarkets(false);
|
|
733
|
+
binance.loadMarkets(false);
|
|
734
|
+
|
|
735
|
+
// Public API
|
|
736
|
+
OrderBook orderBook = kraken.fetchOrderBook("BTC/USDT");
|
|
737
|
+
Ticker ticker = bitfinex.fetchTicker("BTC/USD");
|
|
738
|
+
System.out.println(ticker.symbol + " last=" + ticker.last);
|
|
739
|
+
|
|
740
|
+
// Fetch OHLCV
|
|
741
|
+
var candles = binance.fetchOHLCV("BTC/USDT", "1h", null, 10L, null);
|
|
742
|
+
System.out.println("Got " + candles.size() + " candles");
|
|
743
|
+
|
|
744
|
+
// Private API (requires API keys)
|
|
745
|
+
Balances balance = binance.fetchBalance();
|
|
746
|
+
System.out.println("BTC free: " + balance.free.get("BTC"));
|
|
747
|
+
|
|
748
|
+
// Place a limit buy order
|
|
749
|
+
Order order = binance.createLimitBuyOrder("BTC/USDT", 0.001, 50000.0);
|
|
750
|
+
System.out.println("Order id: " + order.id + " status: " + order.status);
|
|
751
|
+
|
|
752
|
+
// Cancel it
|
|
753
|
+
binance.cancelOrder(order.id, "BTC/USDT", null);
|
|
754
|
+
}
|
|
755
|
+
}
|
|
756
|
+
```
|
|
757
|
+
|
|
758
|
+
#### Async
|
|
759
|
+
|
|
760
|
+
All methods are also available as async variants returning `CompletableFuture`:
|
|
761
|
+
|
|
762
|
+
```Java
|
|
763
|
+
import java.util.concurrent.CompletableFuture;
|
|
764
|
+
|
|
765
|
+
// Fire multiple requests concurrently
|
|
766
|
+
CompletableFuture<Ticker> btc = binance.fetchTickerAsync("BTC/USDT", null);
|
|
767
|
+
CompletableFuture<Ticker> eth = binance.fetchTickerAsync("ETH/USDT", null);
|
|
768
|
+
CompletableFuture.allOf(btc, eth).join();
|
|
769
|
+
System.out.println("BTC: " + btc.get().last + " ETH: " + eth.get().last);
|
|
770
|
+
```
|
|
771
|
+
|
|
772
|
+
#### Error handling
|
|
773
|
+
|
|
774
|
+
Typed sync methods throw the underlying ccxt error directly — no `CompletionException`
|
|
775
|
+
unwrap needed. Catch exceptions in standard JDK order (most-specific first), like you
|
|
776
|
+
would with any other Java library:
|
|
777
|
+
|
|
778
|
+
```Java
|
|
779
|
+
import io.github.ccxt.errors.*;
|
|
780
|
+
import io.github.ccxt.exchanges.Binance;
|
|
781
|
+
import io.github.ccxt.types.Order;
|
|
782
|
+
|
|
783
|
+
Binance binance = new Binance(Map.of("apiKey", "...", "secret", "..."));
|
|
784
|
+
try {
|
|
785
|
+
Order order = binance.createOrder("BTC/USDT", "limit", "buy", 0.001, 50000.0);
|
|
786
|
+
} catch (InsufficientFunds e) {
|
|
787
|
+
// user error — show balance, don't retry
|
|
788
|
+
} catch (InvalidOrder e) { // covers OrderNotFound, DuplicateOrderId, …
|
|
789
|
+
// user error — fix params
|
|
790
|
+
} catch (AuthenticationError e) { // covers PermissionDenied, AccountSuspended
|
|
791
|
+
// refresh credentials
|
|
792
|
+
} catch (RateLimitExceeded | DDoSProtection e) { // multi-catch (Java 7+)
|
|
793
|
+
Thread.sleep(30_000);
|
|
794
|
+
} catch (NetworkError e) { // RequestTimeout, ExchangeNotAvailable, …
|
|
795
|
+
Thread.sleep(2_000); // transient — retry
|
|
796
|
+
} catch (ExchangeError e) { // any other exchange-side error
|
|
797
|
+
// exchange refused
|
|
798
|
+
} catch (BaseError e) { // ccxt catch-all
|
|
799
|
+
// unknown ccxt error
|
|
800
|
+
}
|
|
801
|
+
```
|
|
802
|
+
|
|
803
|
+
For async methods, `CompletableFuture` wraps thrown errors in `CompletionException`
|
|
804
|
+
(JDK behaviour). Use `Helpers.unwrap()` inside `.exceptionally(...)` to peel the wrap
|
|
805
|
+
and pattern-match the real cause:
|
|
806
|
+
|
|
807
|
+
```Java
|
|
808
|
+
import io.github.ccxt.Helpers;
|
|
809
|
+
|
|
810
|
+
binance.createOrderAsync("BTC/USDT", "limit", "buy", 0.001, 50000.0)
|
|
811
|
+
.thenAccept(order -> log.info("placed " + order.id))
|
|
812
|
+
.exceptionally(throwable -> {
|
|
813
|
+
Throwable cause = Helpers.unwrap(throwable);
|
|
814
|
+
return switch (cause) {
|
|
815
|
+
case InsufficientFunds e -> { notifyUser(e); yield null; }
|
|
816
|
+
case AuthenticationError e -> { refreshCreds(); yield null; }
|
|
817
|
+
case RateLimitExceeded e -> { scheduleRetry(); yield null; }
|
|
818
|
+
case NetworkError e -> { scheduleRetry(); yield null; }
|
|
819
|
+
case BaseError e -> { log.error("ccxt", e); yield null; }
|
|
820
|
+
default -> throw new java.util.concurrent.CompletionException(cause);
|
|
821
|
+
};
|
|
822
|
+
});
|
|
823
|
+
```
|
|
824
|
+
|
|
825
|
+
The full hierarchy lives under `io.github.ccxt.errors` — see the [Error Handling
|
|
826
|
+
section of the Manual](https://github.com/ccxt/ccxt/wiki/Manual#error-handling)
|
|
827
|
+
for the complete tree (NetworkError vs ExchangeError, retry-safe vs user-error
|
|
828
|
+
categories, etc.).
|
|
829
|
+
|
|
830
|
+
#### WebSocket
|
|
831
|
+
|
|
832
|
+
WebSocket support is available via the pro exchange classes:
|
|
833
|
+
|
|
834
|
+
```Java
|
|
835
|
+
import io.github.ccxt.Exchange;
|
|
836
|
+
import io.github.ccxt.exchanges.pro.Binance;
|
|
837
|
+
|
|
838
|
+
import java.util.concurrent.TimeUnit;
|
|
839
|
+
|
|
840
|
+
Exchange exchange = new Binance();
|
|
841
|
+
exchange.loadMarkets().join();
|
|
842
|
+
|
|
843
|
+
// Stream live ticker updates
|
|
844
|
+
for (int i = 0; i < 10; i++) {
|
|
845
|
+
Object ticker = exchange.watchTicker("BTC/USDT").get(30, TimeUnit.SECONDS);
|
|
846
|
+
System.out.println(ticker);
|
|
847
|
+
}
|
|
848
|
+
```
|
|
849
|
+
|
|
850
|
+
You can check different examples in the `java/examples` folder.
|
|
851
|
+
|
|
648
852
|
## Rate limiting
|
|
649
853
|
|
|
650
854
|
Crypto exchanges enforce rate limits to protect their infrastructure, ensure fair usage across all clients, and prevent abuse that could degrade performance or availability for other users. That means you can't make an unlimited amount of requests to the exchange, there is a rate that needs to be respected.
|