ccxt 4.2.73 → 4.2.74
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 +5 -5
- package/build.sh +1 -1
- package/dist/ccxt.browser.js +181 -100
- package/dist/ccxt.browser.min.js +2 -2
- package/dist/cjs/ccxt.js +1 -1
- package/dist/cjs/src/base/Exchange.js +1 -1
- package/dist/cjs/src/bitget.js +62 -50
- package/dist/cjs/src/bybit.js +90 -30
- package/dist/cjs/src/coinbaseinternational.js +1 -1
- package/dist/cjs/src/htx.js +16 -9
- package/dist/cjs/src/hyperliquid.js +2 -1
- package/dist/cjs/src/pro/krakenfutures.js +8 -7
- package/examples/README.md +308 -0
- package/examples/ccxt.pro/html/watchTicker.html +51 -0
- package/examples/ccxt.pro/js/binance-fetch-balance-snapshot-watch-balance-updates.js +55 -0
- package/examples/ccxt.pro/js/binance-https-proxy.js +48 -0
- package/examples/ccxt.pro/js/binance-watch-ohlcv-many-symbols-continuously.js +38 -0
- package/examples/ccxt.pro/js/binance-watch-ohlcv-many-symbols.js +64 -0
- package/examples/ccxt.pro/js/binance-watch-ticker-many-symbols.js +62 -0
- package/examples/ccxt.pro/js/build-ohlcv-many-symbols.js +68 -0
- package/examples/ccxt.pro/js/calculate-ohlcvs-from-trades-warmup.js +82 -0
- package/examples/ccxt.pro/js/calculate-ohlcvs-from-trades.js +59 -0
- package/examples/ccxt.pro/js/exchange-capabitities.js +72 -0
- package/examples/ccxt.pro/js/exchange-close.js +46 -0
- package/examples/ccxt.pro/js/gateio-swap-watch-many-orderbooks.js +30 -0
- package/examples/ccxt.pro/js/gateio-watch-balance.js +23 -0
- package/examples/ccxt.pro/js/gateio-watch-order-book.js +71 -0
- package/examples/ccxt.pro/js/graceful-shutdown.js +43 -0
- package/examples/ccxt.pro/js/many-exchanges-many-streams.js +37 -0
- package/examples/ccxt.pro/js/okex-create-futures-order.js +48 -0
- package/examples/ccxt.pro/js/okex-watch-balance-and-create-order.js +54 -0
- package/examples/ccxt.pro/js/okx-watch-tickers.js +31 -0
- package/examples/ccxt.pro/js/one-exchange-many-different-streams.js +46 -0
- package/examples/ccxt.pro/js/one-exchange-many-streams-2.js +26 -0
- package/examples/ccxt.pro/js/one-exchange-many-streams.js +28 -0
- package/examples/ccxt.pro/js/socks-binance-watch-orderbook.js +30 -0
- package/examples/ccxt.pro/js/watch-fetch-many-exchanges-many-ordersbooks.js +40 -0
- package/examples/ccxt.pro/js/watch-many-exchanges-many-ordersbooks.js +38 -0
- package/examples/ccxt.pro/js/watch-many-exchanges-many-symbols.js +40 -0
- package/examples/ccxt.pro/js/watch-many-orderbooks.js +27 -0
- package/examples/ccxt.pro/js/watch-new-trades-only.js +43 -0
- package/examples/ccxt.pro/js/watch-new-trades.js +42 -0
- package/examples/ccxt.pro/js/watch-trades-many-symbols.js +29 -0
- package/examples/ccxt.pro/js/watch-vs-fetch.js +29 -0
- package/examples/cs/Examples.sln +22 -0
- package/examples/cs/c#.csproj +19 -0
- package/examples/html/basic-cors-proxy.html +46 -0
- package/examples/html/basic-inheritance.html +47 -0
- package/examples/html/basic-poller.html +52 -0
- package/examples/html/basic-rate-limiting.html +49 -0
- package/examples/html/basic.html +43 -0
- package/examples/html/binance-cors-proxy.html +28 -0
- package/examples/html/bitmex-browser-cors-proxy.js +7 -0
- package/examples/html/bitmex-cors.html +46 -0
- package/examples/html/tradingview-charts.html +61 -0
- package/examples/html/webworker/index.html +97 -0
- package/examples/html/webworker/worker.js +43 -0
- package/examples/js/README.md +15 -0
- package/examples/js/advanced-error-handling.js +39 -0
- package/examples/js/aggregate-orderbook.js +54 -0
- package/examples/js/arbitrage-pairs.js +130 -0
- package/examples/js/basic-chart.js +29 -0
- package/examples/js/basic-orderbook-polling.js +13 -0
- package/examples/js/bcc-vs-bch.js +115 -0
- package/examples/js/binance-fetch-all-deposits.js +45 -0
- package/examples/js/binance-fetch-ohlcv-many-symbols-async-await.js +34 -0
- package/examples/js/binance-fetch-ohlcv-many-symbols-promise-then-callbacks.js +33 -0
- package/examples/js/binance-fetchTicker-delivery-vs-future.js +31 -0
- package/examples/js/binance-futures-transfer-from-sub-account-to-master.js +41 -0
- package/examples/js/binance-margin-stop-order.js +39 -0
- package/examples/js/binance-server-time.js +34 -0
- package/examples/js/binance-universal-transfer.js +16 -0
- package/examples/js/bitfinex-fetch-trades.js +35 -0
- package/examples/js/bitfinex2-fetch-trades.js +35 -0
- package/examples/js/bitmex-browser-cors-proxy.js +7 -0
- package/examples/js/bitpanda-fetchMyTrades-reduce.js +36 -0
- package/examples/js/bitrue-fetch-balance.js +28 -0
- package/examples/js/bitstamp-private-api.js +115 -0
- package/examples/js/bitstamp-public-api.js +39 -0
- package/examples/js/bittrex-balance.js +50 -0
- package/examples/js/bittrex-fetch-closed-orders-history.js +69 -0
- package/examples/js/blockchaincom-withdrawal.js +59 -0
- package/examples/js/build-ohlcv-bars.js +48 -0
- package/examples/js/builtin-rate-limiting-rest-poller.js +25 -0
- package/examples/js/bybit-trailing.js +62 -0
- package/examples/js/bybit-updated.cjs +154 -0
- package/examples/js/cli.js +405 -0
- package/examples/js/coinbase-fetch-all-balances.js +36 -0
- package/examples/js/coinex-fetch-all-deposit-addresses-using-fetchDepositAddress.js +47 -0
- package/examples/js/coinex-futures.js +75 -0
- package/examples/js/coinone-fetch-tickers.js +54 -0
- package/examples/js/coinone-markets.js +16 -0
- package/examples/js/compare-two-exchanges-capabilities.js +36 -0
- package/examples/js/cors-proxy.js +5 -0
- package/examples/js/create-order-handle-errors.js +55 -0
- package/examples/js/create-order-position-with-takeprofit-stoploss.js +71 -0
- package/examples/js/create-order-with-retry.js +65 -0
- package/examples/js/create-order-ws-example.js +25 -0
- package/examples/js/create-orders-example.js +17 -0
- package/examples/js/create-trailing-amount-order.js +36 -0
- package/examples/js/create-trailing-percent-order.js +36 -0
- package/examples/js/credentials.json +5 -0
- package/examples/js/custom-proxy-agent-for-js.js +10 -0
- package/examples/js/custom-proxy-url.js +23 -0
- package/examples/js/delta-maintenance-margin-rate-max-leverage.js +60 -0
- package/examples/js/env-variables.js +26 -0
- package/examples/js/error-handling.js +89 -0
- package/examples/js/exchange-capabilities.js +135 -0
- package/examples/js/exchanges-by-volume.js +60 -0
- package/examples/js/exchanges.js +40 -0
- package/examples/js/fetch-all-balances.js +219 -0
- package/examples/js/fetch-all-tickers-to-files-2.js +53 -0
- package/examples/js/fetch-all-tickers-to-files.js +77 -0
- package/examples/js/fetch-balance.js +28 -0
- package/examples/js/fetch-create-deposit-address.js +101 -0
- package/examples/js/fetch-from-many-exchanges-simultaneously.js +21 -0
- package/examples/js/fetch-funding-rate-history.js +25 -0
- package/examples/js/fetch-futures/prettier.config.js +5 -0
- package/examples/js/fetch-futures/src/index.js +25 -0
- package/examples/js/fetch-ohlcv-from-to-mark-index-premium.js +72 -0
- package/examples/js/fetch-ohlcv-many-exchanges-continuosly.js +39 -0
- package/examples/js/fetch-ohlcv.js +16 -0
- package/examples/js/fetch-okex-futures.js +22 -0
- package/examples/js/fetch-orders.js +27 -0
- package/examples/js/fetch-ticker-from-multiple-exchanges.js +35 -0
- package/examples/js/fetch-ticker-where-available.js +75 -0
- package/examples/js/fetch-tickers/build/index.js +19 -0
- package/examples/js/fetch-tickers/prettier.config.js +5 -0
- package/examples/js/fetch-tickers/src/index.js +17 -0
- package/examples/js/gateio-create-batch-order.js +43 -0
- package/examples/js/gateio-futures.js +49 -0
- package/examples/js/gateio-open-close-contract.js +49 -0
- package/examples/js/gateio-swaps.js +74 -0
- package/examples/js/gdax-fetch-trades-pagination.js +29 -0
- package/examples/js/hitbtc2-withdraw.js +61 -0
- package/examples/js/how-to-import-one-exchange-esm.js +10 -0
- package/examples/js/huobi-futures.js +71 -0
- package/examples/js/huobi-open-close-contract.js +63 -0
- package/examples/js/huobi-swaps.js +70 -0
- package/examples/js/huobipro-market-buy-sell-fetch-trading-limits.js +98 -0
- package/examples/js/hybridCJSExample.cjs +19 -0
- package/examples/js/hybridESMExample.js +19 -0
- package/examples/js/idex-fetch-balance.js +13 -0
- package/examples/js/instantiate-all-at-once.js +46 -0
- package/examples/js/instantiate-all-from-json.js +31 -0
- package/examples/js/kraken-create-and-close-position.js +54 -0
- package/examples/js/kraken-fetch-order-trades.js +33 -0
- package/examples/js/kraken-margin-trading.js +89 -0
- package/examples/js/kucoin-rate-limit.js +38 -0
- package/examples/js/latoken-example.js +108 -0
- package/examples/js/live-orderbook.js +106 -0
- package/examples/js/live-ticker.js +80 -0
- package/examples/js/live-tickers.js +74 -0
- package/examples/js/load-all-contracts.js +41 -0
- package/examples/js/load-all-symbols-at-once.js +69 -0
- package/examples/js/load-all-tickers-at-once.js +91 -0
- package/examples/js/load-markets-to-files.js +57 -0
- package/examples/js/looping-over-all-symbols-of-specific-exchanges.js +61 -0
- package/examples/js/looping-over-specific-symbols-of-all-exchanges.js +91 -0
- package/examples/js/margin-loan-borrow-buy-sell-repay.js +70 -0
- package/examples/js/market-status-and-currency-status.js +29 -0
- package/examples/js/ohlcv-console-chart.js +29 -0
- package/examples/js/okex-fetch-closed-orders-archive.js +31 -0
- package/examples/js/okex-transfer.js +51 -0
- package/examples/js/okx-poll-fetch-my-trades.js +37 -0
- package/examples/js/okx-poll-rate-limit.js +48 -0
- package/examples/js/order-book-extra-level-depth-param.js +20 -0
- package/examples/js/phemex-create-order-position-with-takeprofit-stoploss.js +49 -0
- package/examples/js/poll-ohlcv.js +43 -0
- package/examples/js/poloniex-fetch-order-books.js +35 -0
- package/examples/js/poloniex-limits-amount-min.js +62 -0
- package/examples/js/proxy-round-robin.js +98 -0
- package/examples/js/proxy-usage.js +32 -0
- package/examples/js/sample-local-proxy-server-with-cors.js +12 -0
- package/examples/js/search-all-exchanges.js +159 -0
- package/examples/js/shared-load-markets.js +80 -0
- package/examples/js/sort-swap-markets-by-hourly-price-change.js +55 -0
- package/examples/js/symbols.js +110 -0
- package/examples/js/theocean.js +41 -0
- package/examples/js/tickers.js +106 -0
- package/examples/js/validate-paginated-data.js +61 -0
- package/examples/js/watch-OHLCV-For-Symbols.js +15 -0
- package/examples/js/watch-OHLCV.js +12 -0
- package/examples/js/watch-OrderBook-For-Symbols.js +11 -0
- package/examples/js/watch-Trades-For-Symbols.js +11 -0
- package/examples/js/watch-tickers.js +11 -0
- package/examples/js/watchOHLCVForSymbols.js +15 -0
- package/examples/js/watchOrderBookForSymbols.js +11 -0
- package/examples/js/watchPositions-many-exchanges-continuosly.d.ts +2 -0
- package/examples/js/watchPositions-many-exchanges-continuosly.d.ts.map +1 -0
- package/examples/js/watchPositions-many-exchanges-continuosly.js +49 -0
- package/examples/js/watchPositions.d.ts +2 -0
- package/examples/js/watchPositions.d.ts.map +1 -0
- package/examples/js/watchPositions.js +13 -0
- package/examples/js/watchPositionsForSymbols.d.ts +2 -0
- package/examples/js/watchPositionsForSymbols.d.ts.map +1 -0
- package/examples/js/watchPositionsForSymbols.js +14 -0
- package/examples/js/watchTradesForSymbols.js +11 -0
- package/examples/js/withdraw-from-one-exchange-to-another.js +50 -0
- package/examples/php/README.md +7 -0
- package/examples/py/README.md +15 -0
- package/examples/py/playing_with_ccxt_example.ipynb +222 -0
- package/examples/ts/.eslintrc +111 -0
- package/examples/ts/build-ohlcv-bars.ts +53 -0
- package/examples/ts/cli.ts +397 -0
- package/examples/ts/compare-two-exchanges-capabilities.ts +36 -0
- package/examples/ts/create-order-position-with-takeprofit-stoploss.ts +89 -0
- package/examples/ts/create-order-ws-example.ts +33 -0
- package/examples/ts/create-orders-example.ts +21 -0
- package/examples/ts/create-trailing-amount-order.ts +37 -0
- package/examples/ts/create-trailing-percent-order.ts +37 -0
- package/examples/ts/custom-proxy-agent-for-js.ts +14 -0
- package/examples/ts/fetch-futures/package-lock.json +116 -0
- package/examples/ts/fetch-futures/package.json +34 -0
- package/examples/ts/fetch-futures/prettier.config.js +4 -0
- package/examples/ts/fetch-futures/src/index.ts +28 -0
- package/examples/ts/fetch-futures/tsconfig.json +28 -0
- package/examples/ts/fetch-ohlcv-many-exchanges-continuosly.ts +44 -0
- package/examples/ts/fetch-ohlcv.ts +17 -0
- package/examples/ts/fetch-tickers/package-lock.json +116 -0
- package/examples/ts/fetch-tickers/package.json +34 -0
- package/examples/ts/fetch-tickers/prettier.config.js +4 -0
- package/examples/ts/fetch-tickers/src/index.ts +21 -0
- package/examples/ts/fetch-tickers/tsconfig.json +28 -0
- package/examples/ts/how-to-import-one-exchange-esm.ts +11 -0
- package/examples/ts/kraken-create-and-close-position.ts +69 -0
- package/examples/ts/margin-loan-borrow-buy-sell-repay.ts +72 -0
- package/examples/ts/nextjs-page-router/.eslintrc.json +3 -0
- package/examples/ts/nextjs-page-router/README.md +43 -0
- package/examples/ts/nextjs-page-router/next.config.js +6 -0
- package/examples/ts/nextjs-page-router/package-lock.json +7425 -0
- package/examples/ts/nextjs-page-router/package.json +28 -0
- package/examples/ts/nextjs-page-router/postcss.config.js +6 -0
- package/examples/ts/nextjs-page-router/public/favicon.ico +0 -0
- package/examples/ts/nextjs-page-router/src/pages/_app.tsx +6 -0
- package/examples/ts/nextjs-page-router/src/pages/_document.tsx +13 -0
- package/examples/ts/nextjs-page-router/src/pages/balance.tsx +46 -0
- package/examples/ts/nextjs-page-router/src/pages/index.tsx +8 -0
- package/examples/ts/nextjs-page-router/src/pages/tickers.tsx +61 -0
- package/examples/ts/nextjs-page-router/src/styles/globals.css +27 -0
- package/examples/ts/nextjs-page-router/tailwind.config.ts +20 -0
- package/examples/ts/nextjs-page-router/tsconfig.json +22 -0
- package/examples/ts/phemex-create-order-position-with-takeprofit-stoploss.ts +62 -0
- package/examples/ts/proxy-usage.ts +41 -0
- package/examples/ts/sample-local-proxy-server-with-cors.ts +15 -0
- package/examples/ts/watch-OHLCV-For-Symbols.ts +17 -0
- package/examples/ts/watch-OHLCV.ts +14 -0
- package/examples/ts/watch-OrderBook-For-Symbols.ts +13 -0
- package/examples/ts/watch-Trades-For-Symbols.ts +13 -0
- package/examples/ts/watch-tickers.ts +13 -0
- package/examples/ts/watchPositions-many-exchanges-continuosly.ts +53 -0
- package/examples/ts/watchPositions.ts +15 -0
- package/examples/ts/watchPositionsForSymbols.ts +16 -0
- package/examples/tsconfig.json +27 -0
- package/js/ccxt.d.ts +1 -1
- package/js/ccxt.js +1 -1
- package/js/src/base/Exchange.d.ts +2 -2
- package/js/src/base/Exchange.js +1 -1
- package/js/src/bitget.js +62 -50
- package/js/src/bybit.d.ts +3 -1
- package/js/src/bybit.js +90 -30
- package/js/src/coinbaseinternational.js +1 -1
- package/js/src/htx.js +16 -9
- package/js/src/hyperliquid.js +2 -1
- package/js/src/pro/krakenfutures.js +8 -7
- package/package.json +4 -1
- package/skip-tests.json +214 -424
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
import ccxt from '../../js/ccxt.js';
|
|
4
|
+
import ololog from 'ololog';
|
|
5
|
+
import asTable from 'as-table';
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
const table = asTable.configure ({ delimiter: ' | ' }),
|
|
9
|
+
//-----------------------------------------------------------------------------
|
|
10
|
+
log = ololog.unlimited.noLocate.handleNodeErrors ();(async function main () {
|
|
11
|
+
|
|
12
|
+
const symbol = 'BTC/USDT'
|
|
13
|
+
|
|
14
|
+
const exchange = new ccxt.latoken ({
|
|
15
|
+
'verbose': process.argv.includes ('--verbose'),
|
|
16
|
+
// uncomment and change for your keys to enable private calls
|
|
17
|
+
// 'apiKey': 'YOUR_API_KEY',
|
|
18
|
+
// 'secret': 'YOUR_API_SECRET',
|
|
19
|
+
})
|
|
20
|
+
|
|
21
|
+
await exchange.loadMarkets ()
|
|
22
|
+
|
|
23
|
+
log ('-------------------------------------------------------------------')
|
|
24
|
+
|
|
25
|
+
log (exchange.id, 'has', exchange.has)
|
|
26
|
+
|
|
27
|
+
// public API
|
|
28
|
+
|
|
29
|
+
log ('-------------------------------------------------------------------')
|
|
30
|
+
|
|
31
|
+
const markets = Object.values (exchange.markets)
|
|
32
|
+
log ('Loaded', markets.length, exchange.id, 'markets:')
|
|
33
|
+
log (table (markets.map (x => exchange.omit (x, [ 'info', 'limits', 'precision' ]))))
|
|
34
|
+
|
|
35
|
+
log ('-------------------------------------------------------------------')
|
|
36
|
+
|
|
37
|
+
const currencies = Object.values (exchange.currencies)
|
|
38
|
+
log ('Loaded', currencies.length, exchange.id, 'currencies:')
|
|
39
|
+
log (table (currencies.map (x => exchange.omit (x, [ 'info', 'limits' ]))))
|
|
40
|
+
|
|
41
|
+
log ('-------------------------------------------------------------------')
|
|
42
|
+
|
|
43
|
+
const time = await exchange.fetchTime ()
|
|
44
|
+
log ('Exchange time:', exchange.iso8601 (time))
|
|
45
|
+
|
|
46
|
+
log ('-------------------------------------------------------------------')
|
|
47
|
+
|
|
48
|
+
const ticker = await exchange.fetchTicker (symbol)
|
|
49
|
+
log (ticker)
|
|
50
|
+
|
|
51
|
+
log ('-------------------------------------------------------------------')
|
|
52
|
+
|
|
53
|
+
const tickers = await exchange.fetchTickers ()
|
|
54
|
+
log (table (Object.values (tickers).map (x =>
|
|
55
|
+
exchange.omit (x, [ 'info', 'bid', 'ask', 'bidVolume', 'askVolume', 'timestamp' ]))))
|
|
56
|
+
|
|
57
|
+
log ('-------------------------------------------------------------------')
|
|
58
|
+
|
|
59
|
+
const orderbook = await exchange.fetchOrderBook (symbol)
|
|
60
|
+
log (orderbook)
|
|
61
|
+
|
|
62
|
+
log ('-------------------------------------------------------------------')
|
|
63
|
+
|
|
64
|
+
const trades = await exchange.fetchTrades (symbol)
|
|
65
|
+
log (table (trades.map (x => exchange.omit (x, [ 'info', 'timestamp' ]))))
|
|
66
|
+
|
|
67
|
+
log ('-------------------------------------------------------------------')
|
|
68
|
+
|
|
69
|
+
// private API
|
|
70
|
+
|
|
71
|
+
if (exchange.checkRequiredCredentials (false)) {
|
|
72
|
+
|
|
73
|
+
const balance = await exchange.fetchBalance ()
|
|
74
|
+
log (exchange.omit (balance, [ 'info' ]))
|
|
75
|
+
|
|
76
|
+
log ('-------------------------------------------------------------------')
|
|
77
|
+
|
|
78
|
+
const order = await exchange.createOrder (symbol, 'limit', 'buy', 0.001, 10000)
|
|
79
|
+
log (order)
|
|
80
|
+
|
|
81
|
+
log ('-------------------------------------------------------------------')
|
|
82
|
+
|
|
83
|
+
const openOrders = await exchange.fetchOpenOrders (symbol)
|
|
84
|
+
log (table (openOrders.map (x => exchange.omit (x, [ 'info', 'timestamp' ]))))
|
|
85
|
+
|
|
86
|
+
log ('-------------------------------------------------------------------')
|
|
87
|
+
|
|
88
|
+
const canceled = await exchange.cancelOrder (order['id'], order['symbol'])
|
|
89
|
+
log (canceled)
|
|
90
|
+
|
|
91
|
+
log ('-------------------------------------------------------------------')
|
|
92
|
+
|
|
93
|
+
const closedOrders = await exchange.fetchClosedOrders (symbol)
|
|
94
|
+
log (table (closedOrders.map (x => exchange.omit (x, [ 'info', 'timestamp' ]))))
|
|
95
|
+
|
|
96
|
+
log ('-------------------------------------------------------------------')
|
|
97
|
+
|
|
98
|
+
const canceledOrders = await exchange.fetchCanceledOrders (symbol)
|
|
99
|
+
log (table (canceledOrders.map (x => exchange.omit (x, [ 'info', 'timestamp' ]))))
|
|
100
|
+
|
|
101
|
+
log ('-------------------------------------------------------------------')
|
|
102
|
+
|
|
103
|
+
const myTrades = await exchange.fetchMyTrades (symbol)
|
|
104
|
+
log (table (myTrades.map (x => exchange.omit (x, [ 'info', 'timestamp' ]))))
|
|
105
|
+
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
}) ()
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
import asTable from 'as-table';
|
|
4
|
+
import ololog from 'ololog';
|
|
5
|
+
import ansicolor from 'ansicolor';
|
|
6
|
+
import ccxt from '../../js/ccxt.js';
|
|
7
|
+
|
|
8
|
+
const { noLocate } = ololog;
|
|
9
|
+
const log = noLocate;
|
|
10
|
+
|
|
11
|
+
ansicolor.nice
|
|
12
|
+
|
|
13
|
+
let printSupportedExchanges = function () {
|
|
14
|
+
log ('Supported exchanges:', ccxt.exchanges.join (', ').green)
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
let printUsage = function () {
|
|
18
|
+
log ('Usage: node', process.argv[1], 'exchange'.green, 'symbol'.yellow, 'depth'.cyan)
|
|
19
|
+
printSupportedExchanges ()
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
let printOrderBook = async (id, symbol, depth) => {
|
|
23
|
+
|
|
24
|
+
// check if the exchange is supported by ccxt
|
|
25
|
+
let exchangeFound = ccxt.exchanges.indexOf (id) > -1
|
|
26
|
+
if (exchangeFound) {
|
|
27
|
+
|
|
28
|
+
log ('Instantiating', id.green, 'exchange')
|
|
29
|
+
|
|
30
|
+
// instantiate the exchange by id
|
|
31
|
+
let exchange = new ccxt[id] ()
|
|
32
|
+
|
|
33
|
+
// load all markets from the exchange
|
|
34
|
+
let markets = await exchange.loadMarkets ()
|
|
35
|
+
|
|
36
|
+
// output a list of all market symbols
|
|
37
|
+
// log (id.green, 'has', exchange.symbols.length, 'symbols:', exchange.symbols.join (', ').yellow)
|
|
38
|
+
|
|
39
|
+
if (symbol in exchange.markets) {
|
|
40
|
+
|
|
41
|
+
const market = exchange.markets[symbol]
|
|
42
|
+
const pricePrecision = market.precision ? market.precision.price : 8
|
|
43
|
+
const amountPrecision = market.precision ? market.precision.amount : 8
|
|
44
|
+
|
|
45
|
+
// Object.values (markets).forEach (market => log (market))
|
|
46
|
+
|
|
47
|
+
// make a table of all markets
|
|
48
|
+
// const table = asTable.configure ({ delimiter: ' | ' }) (Object.values (markets))
|
|
49
|
+
// log (table)
|
|
50
|
+
|
|
51
|
+
const priceVolumeHelper = color => ([price, amount]) => ({
|
|
52
|
+
price: price.toFixed (pricePrecision)[color],
|
|
53
|
+
amount: amount.toFixed (amountPrecision)[color],
|
|
54
|
+
' ': ' ',
|
|
55
|
+
})
|
|
56
|
+
|
|
57
|
+
const cursorUp = '\u001b[1A'
|
|
58
|
+
const tableHeight = depth * 2 + 4 // bids + asks + headers
|
|
59
|
+
|
|
60
|
+
log (' ') // empty line
|
|
61
|
+
|
|
62
|
+
while (true) {
|
|
63
|
+
|
|
64
|
+
const orderbook = await exchange.fetchOrderBook (symbol)
|
|
65
|
+
|
|
66
|
+
log (symbol.green, exchange.iso8601 (exchange.milliseconds ()))
|
|
67
|
+
|
|
68
|
+
log (asTable.configure ({ delimiter: ' | '.dim, right: true }) ([
|
|
69
|
+
... orderbook.asks.slice (0, depth).reverse ().map (priceVolumeHelper ('red')),
|
|
70
|
+
// { price: '--------'.dim, amount: '--------'.dim },
|
|
71
|
+
... orderbook.bids.slice (0, depth).map (priceVolumeHelper ('green')),
|
|
72
|
+
]))
|
|
73
|
+
|
|
74
|
+
log (cursorUp.repeat (tableHeight))
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
} else {
|
|
78
|
+
|
|
79
|
+
log.error ('Symbol', symbol.bright, 'not found')
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
} else {
|
|
84
|
+
|
|
85
|
+
log ('Exchange ' + id.red + ' not found')
|
|
86
|
+
printSupportedExchanges ()
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
;(async function main () {
|
|
91
|
+
|
|
92
|
+
if (process.argv.length > 4) {
|
|
93
|
+
|
|
94
|
+
const id = process.argv[2]
|
|
95
|
+
const symbol = process.argv[3].toUpperCase ()
|
|
96
|
+
const depth = parseInt (process.argv[4])
|
|
97
|
+
await printOrderBook (id, symbol, depth)
|
|
98
|
+
|
|
99
|
+
} else {
|
|
100
|
+
|
|
101
|
+
printUsage ()
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
process.exit ()
|
|
105
|
+
|
|
106
|
+
}) ()
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
import asTable from 'as-table';
|
|
4
|
+
import ololog from 'ololog';
|
|
5
|
+
import ansicolor from 'ansicolor';
|
|
6
|
+
import ccxt from '../../js/ccxt.js';
|
|
7
|
+
|
|
8
|
+
const { noLocate } = ololog;
|
|
9
|
+
const log = noLocate;
|
|
10
|
+
|
|
11
|
+
ansicolor.nice
|
|
12
|
+
|
|
13
|
+
let printSupportedExchanges = function () {
|
|
14
|
+
log ('Supported exchanges:', ccxt.exchanges.join (', ').green)
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
let printUsage = function () {
|
|
18
|
+
log ('Usage: node', process.argv[1], 'exchange'.green, 'symbol'.yellow, '[rateLimit]'.magenta)
|
|
19
|
+
printSupportedExchanges ()
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
let printTicker = async (id, symbol, rateLimit = undefined) => {
|
|
23
|
+
|
|
24
|
+
// check if the exchange is supported by ccxt
|
|
25
|
+
let exchangeFound = ccxt.exchanges.indexOf (id) > -1
|
|
26
|
+
if (exchangeFound) {
|
|
27
|
+
|
|
28
|
+
log ('Instantiating', id.green, 'exchange')
|
|
29
|
+
|
|
30
|
+
// instantiate the exchange by id
|
|
31
|
+
let exchange = new ccxt[id] ()
|
|
32
|
+
|
|
33
|
+
exchange.rateLimit = rateLimit ? rateLimit : exchange.rateLimit
|
|
34
|
+
|
|
35
|
+
log.green ('Rate limit:', exchange.rateLimit.toString ().bright)
|
|
36
|
+
|
|
37
|
+
// load all markets from the exchange
|
|
38
|
+
let markets = await exchange.loadMarkets ()
|
|
39
|
+
|
|
40
|
+
if (symbol in exchange.markets) {
|
|
41
|
+
|
|
42
|
+
while (true) {
|
|
43
|
+
|
|
44
|
+
const ticker = await exchange.fetchTicker (symbol)
|
|
45
|
+
|
|
46
|
+
log ('--------------------------------------------------------')
|
|
47
|
+
log (exchange.id.green, symbol.yellow, exchange.iso8601 (exchange.milliseconds ()))
|
|
48
|
+
log (ccxt.omit (ticker, 'info'))
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
} else {
|
|
52
|
+
|
|
53
|
+
log.error ('Symbol', symbol.bright, 'not found')
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
} else {
|
|
58
|
+
|
|
59
|
+
log ('Exchange ' + id.red + ' not found')
|
|
60
|
+
printSupportedExchanges ()
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
;(async function main () {
|
|
65
|
+
|
|
66
|
+
if (process.argv.length > 3) {
|
|
67
|
+
|
|
68
|
+
const id = process.argv[2]
|
|
69
|
+
const symbol = process.argv[3].toUpperCase ()
|
|
70
|
+
const rateLimit = process.argv[4] ? parseInt (process.argv[4]) : undefined
|
|
71
|
+
await printTicker (id, symbol, rateLimit)
|
|
72
|
+
|
|
73
|
+
} else {
|
|
74
|
+
|
|
75
|
+
printUsage ()
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
process.exit ()
|
|
79
|
+
|
|
80
|
+
}) ()
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
import asTable from 'as-table';
|
|
4
|
+
import ololog from 'ololog';
|
|
5
|
+
import ansicolor from 'ansicolor';
|
|
6
|
+
import ccxt from '../../js/ccxt.js';
|
|
7
|
+
|
|
8
|
+
ansicolor.nice
|
|
9
|
+
|
|
10
|
+
const { noLocate } = ololog;
|
|
11
|
+
const log = noLocate;
|
|
12
|
+
|
|
13
|
+
let printSupportedExchanges = function () {
|
|
14
|
+
log ('Supported exchanges:', ccxt.exchanges.join (', ').green)
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
let printUsage = function () {
|
|
18
|
+
log ('Usage: node', process.argv[1], 'exchange'.green)
|
|
19
|
+
printSupportedExchanges ()
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
let printTickers = async (id) => {
|
|
23
|
+
|
|
24
|
+
// check if the exchange is supported by ccxt
|
|
25
|
+
let exchangeFound = ccxt.exchanges.indexOf (id) > -1
|
|
26
|
+
if (exchangeFound) {
|
|
27
|
+
|
|
28
|
+
log ('Instantiating', id.green, 'exchange')
|
|
29
|
+
|
|
30
|
+
// instantiate the exchange by id
|
|
31
|
+
let exchange = new ccxt[id] ()
|
|
32
|
+
|
|
33
|
+
// load all markets from the exchange
|
|
34
|
+
let markets = await exchange.loadMarkets ()
|
|
35
|
+
|
|
36
|
+
while (true) {
|
|
37
|
+
|
|
38
|
+
const tickers = await exchange.fetchTickers ()
|
|
39
|
+
|
|
40
|
+
log ('--------------------------------------------------------')
|
|
41
|
+
log (exchange.id.green, exchange.iso8601 (exchange.milliseconds ()))
|
|
42
|
+
log ('Fetched', Object.values (tickers).length.toString ().green, 'tickers:')
|
|
43
|
+
log (asTable.configure ({ delimiter: ' | '.dim, right: true }) (
|
|
44
|
+
ccxt.sortBy (Object.values (tickers), 'quoteVolume', true)
|
|
45
|
+
.slice (0,20)
|
|
46
|
+
.map (ticker => ({
|
|
47
|
+
symbol: ticker['symbol'],
|
|
48
|
+
price: ticker['last'].toFixed (8),
|
|
49
|
+
datetime: ticker['datetime'],
|
|
50
|
+
}))))
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
} else {
|
|
54
|
+
|
|
55
|
+
log ('Exchange ' + id.red + ' not found')
|
|
56
|
+
printSupportedExchanges ()
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
;(async function main () {
|
|
61
|
+
|
|
62
|
+
if (process.argv.length > 2) {
|
|
63
|
+
|
|
64
|
+
const id = process.argv[2]
|
|
65
|
+
await printTickers (id)
|
|
66
|
+
|
|
67
|
+
} else {
|
|
68
|
+
|
|
69
|
+
printUsage ()
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
process.exit ()
|
|
73
|
+
|
|
74
|
+
}) ()
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
const ccxt = require ('../../ccxt.js')
|
|
4
|
+
|
|
5
|
+
console.log ('CCXT Version:', ccxt.version)
|
|
6
|
+
|
|
7
|
+
async function loadExchange (exchange) {
|
|
8
|
+
try {
|
|
9
|
+
await exchange.loadMarkets ()
|
|
10
|
+
exchange.symbols.map (symbol => {
|
|
11
|
+
const market = exchange.market (symbol)
|
|
12
|
+
if (market['contract']) {
|
|
13
|
+
console.log (exchange.id, 'loaded', market['type'], symbol, 'market')
|
|
14
|
+
}
|
|
15
|
+
})
|
|
16
|
+
} catch (e) {
|
|
17
|
+
console.log (e.constructor.name, e.message)
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
async function loadAllExchanges (exchangeId) {
|
|
22
|
+
try {
|
|
23
|
+
|
|
24
|
+
const exchanges = [];
|
|
25
|
+
[ 'swap', 'future', 'options' ].forEach (defaultType => {
|
|
26
|
+
const exchange = new ccxt[exchangeId]()
|
|
27
|
+
if (exchange.has[defaultType]) {
|
|
28
|
+
exchanges.push (exchange);
|
|
29
|
+
}
|
|
30
|
+
})
|
|
31
|
+
await Promise.all (exchanges.map (exchange => loadExchange (exchange)))
|
|
32
|
+
} catch (e) {
|
|
33
|
+
console.log (e.constructor.name, e.message)
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
async function main () {
|
|
38
|
+
await Promise.all (ccxt.exchanges.map (exchangeId => loadAllExchanges (exchangeId)))
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
main ()
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
import ccxt from '../../js/ccxt.js';
|
|
4
|
+
import asTable from 'as-table';
|
|
5
|
+
import ololog from 'ololog';
|
|
6
|
+
import ansicolor from 'ansicolor';
|
|
7
|
+
const log = ololog.configure ({ locate: false })
|
|
8
|
+
|
|
9
|
+
ansicolor.nice
|
|
10
|
+
|
|
11
|
+
//-----------------------------------------------------------------------------
|
|
12
|
+
|
|
13
|
+
process.on ('uncaughtException', e => { log.bright.red.error (e); process.exit (1) })
|
|
14
|
+
process.on ('unhandledRejection', e => { log.bright.red.error (e); process.exit (1) })
|
|
15
|
+
|
|
16
|
+
//-----------------------------------------------------------------------------
|
|
17
|
+
|
|
18
|
+
let test = async function (exchange) {
|
|
19
|
+
|
|
20
|
+
try {
|
|
21
|
+
|
|
22
|
+
await exchange.loadMarkets ()
|
|
23
|
+
log (exchange.id.green, 'loaded', exchange.symbols.length.toString ().bright.green, 'symbols')
|
|
24
|
+
|
|
25
|
+
} catch (e) {
|
|
26
|
+
|
|
27
|
+
if (e instanceof ccxt.DDoSProtection) {
|
|
28
|
+
log.bright.yellow (exchange.id, '[DDoS Protection] ' + e.message)
|
|
29
|
+
} else if (e instanceof ccxt.RequestTimeout) {
|
|
30
|
+
log.bright.yellow (exchange.id, '[Request Timeout] ' + e.message)
|
|
31
|
+
} else if (e instanceof ccxt.AuthenticationError) {
|
|
32
|
+
log.bright.yellow (exchange.id, '[Authentication Error] ' + e.message)
|
|
33
|
+
} else if (e instanceof ccxt.ExchangeNotAvailable) {
|
|
34
|
+
log.bright.yellow (exchange.id, '[Exchange Not Available] ' + e.message)
|
|
35
|
+
} else if (e instanceof ccxt.ExchangeError) {
|
|
36
|
+
log.bright.yellow (exchange.id, '[Exchange Error] ' + e.message)
|
|
37
|
+
} else if (e instanceof ccxt.NetworkError) {
|
|
38
|
+
log.bright.yellow (exchange.id, '[Network Error] ' + e.message)
|
|
39
|
+
} else {
|
|
40
|
+
throw e
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
//-----------------------------------------------------------------------------
|
|
46
|
+
|
|
47
|
+
let exchanges = []
|
|
48
|
+
|
|
49
|
+
async function main () {
|
|
50
|
+
|
|
51
|
+
// instantiate all exchanges
|
|
52
|
+
await Promise.all (ccxt.exchanges.map (async id => {
|
|
53
|
+
let exchange = new (ccxt)[id] ()
|
|
54
|
+
exchanges.push (exchange)
|
|
55
|
+
await test (exchange)
|
|
56
|
+
}))
|
|
57
|
+
|
|
58
|
+
let succeeded = exchanges.filter (exchange => exchange.markets ? true : false).length.toString ().bright.green
|
|
59
|
+
let failed = exchanges.filter (exchange => exchange.markets ? false : true).length
|
|
60
|
+
let total = ccxt.exchanges.length.toString ().bright.white
|
|
61
|
+
let numSymbols = 0;
|
|
62
|
+
exchanges.map (exchange => {
|
|
63
|
+
numSymbols += exchange.symbols ? exchange.symbols.length : 0;
|
|
64
|
+
})
|
|
65
|
+
log (numSymbols, 'symbols from', succeeded, 'of', total, 'exchanges loaded', ('(' + failed + ' errors)').red)
|
|
66
|
+
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
main ()
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
import ccxt from '../../js/ccxt.js';
|
|
4
|
+
import asTable from 'as-table';
|
|
5
|
+
import ololog from 'ololog';
|
|
6
|
+
import ansicolor from 'ansicolor';
|
|
7
|
+
|
|
8
|
+
const log = ololog.configure ({ locate: false })
|
|
9
|
+
|
|
10
|
+
ansicolor.nice
|
|
11
|
+
|
|
12
|
+
//-----------------------------------------------------------------------------
|
|
13
|
+
|
|
14
|
+
process.on ('uncaughtException', e => { log.bright.red.error (e); process.exit (1) })
|
|
15
|
+
process.on ('unhandledRejection', e => { log.bright.red.error (e); process.exit (1) })
|
|
16
|
+
|
|
17
|
+
//-----------------------------------------------------------------------------
|
|
18
|
+
|
|
19
|
+
let human_value = function (price) {
|
|
20
|
+
return price === undefined ? 'N/A' : price
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
//-----------------------------------------------------------------------------
|
|
24
|
+
|
|
25
|
+
let test = async function (exchange, symbol) {
|
|
26
|
+
|
|
27
|
+
try {
|
|
28
|
+
|
|
29
|
+
await exchange.loadMarkets ()
|
|
30
|
+
|
|
31
|
+
if (symbol in exchange.markets) {
|
|
32
|
+
|
|
33
|
+
let ticker = await exchange.fetchTicker (symbol)
|
|
34
|
+
|
|
35
|
+
log (exchange.id.green, symbol.green, 'ticker',
|
|
36
|
+
ticker['datetime'],
|
|
37
|
+
'high: ' + human_value (ticker['high']),
|
|
38
|
+
'low: ' + human_value (ticker['low']),
|
|
39
|
+
'bid: ' + human_value (ticker['bid']),
|
|
40
|
+
'ask: ' + human_value (ticker['ask']),
|
|
41
|
+
'volume: ' + human_value (ticker['quoteVolume']))
|
|
42
|
+
} else {
|
|
43
|
+
|
|
44
|
+
// do nothing or throw an error
|
|
45
|
+
log.bright.yellow (exchange.id + ' does not have ' + symbol)
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
} catch (e) {
|
|
49
|
+
|
|
50
|
+
if (e instanceof ccxt.DDoSProtection) {
|
|
51
|
+
log.bright.yellow (exchange.id, '[DDoS Protection]')
|
|
52
|
+
} else if (e instanceof ccxt.RequestTimeout) {
|
|
53
|
+
log.bright.yellow (exchange.id, '[Request Timeout]')
|
|
54
|
+
} else if (e instanceof ccxt.AuthenticationError) {
|
|
55
|
+
log.bright.yellow (exchange.id, '[Authentication Error]')
|
|
56
|
+
} else if (e instanceof ccxt.ExchangeNotAvailable) {
|
|
57
|
+
log.bright.yellow (exchange.id, '[Exchange Not Available]')
|
|
58
|
+
} else if (e instanceof ccxt.ExchangeError) {
|
|
59
|
+
log.bright.yellow (exchange.id, '[Exchange Error]')
|
|
60
|
+
} else if (e instanceof ccxt.NetworkError) {
|
|
61
|
+
log.bright.yellow (exchange.id, '[Network Error]')
|
|
62
|
+
} else {
|
|
63
|
+
throw e
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
//-----------------------------------------------------------------------------
|
|
69
|
+
|
|
70
|
+
const symbol = 'BTC/USD'
|
|
71
|
+
|
|
72
|
+
//-----------------------------------------------------------------------------
|
|
73
|
+
|
|
74
|
+
async function main () {
|
|
75
|
+
|
|
76
|
+
let exchanges = []
|
|
77
|
+
|
|
78
|
+
// instantiate all exchanges
|
|
79
|
+
await Promise.all (ccxt.exchanges.map (async id => {
|
|
80
|
+
let exchange = new (ccxt)[id] ()
|
|
81
|
+
exchanges.push (exchange)
|
|
82
|
+
await test (exchange, symbol)
|
|
83
|
+
}))
|
|
84
|
+
|
|
85
|
+
let succeeded = exchanges.filter (exchange => exchange.markets ? true : false).length.toString ().bright.green
|
|
86
|
+
let failed = exchanges.filter (exchange => exchange.markets ? false : true).length
|
|
87
|
+
let total = ccxt.exchanges.length.toString ().bright.white
|
|
88
|
+
console.log (succeeded, 'of', total, 'exchanges loaded', ('(' + failed + ' errors)').red)
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
main ()
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
import ccxt from '../../js/ccxt.js';
|
|
4
|
+
import path from 'path';
|
|
5
|
+
import fs from 'fs';
|
|
6
|
+
|
|
7
|
+
const enableRateLimit = true,
|
|
8
|
+
// exchange defaults
|
|
9
|
+
// ------------------------------------------------------------------------
|
|
10
|
+
// path to your folder, for example '/myproject/markets' or 'C:/myproject/markets'
|
|
11
|
+
options = { enableRateLimit },
|
|
12
|
+
// writes to current working directory if left empty
|
|
13
|
+
// ------------------------------------------------------------------------
|
|
14
|
+
// use a reasonable value for maxConcurrency to avoid network congestion
|
|
15
|
+
// a burst of requests in a short period of time will cause
|
|
16
|
+
// excessive competition for networking resources within the application
|
|
17
|
+
folder = '',
|
|
18
|
+
maxConcurrency = 7;
|
|
19
|
+
|
|
20
|
+
async function main () {
|
|
21
|
+
|
|
22
|
+
const allExchanges = ccxt.exchanges.map (id => {
|
|
23
|
+
try {
|
|
24
|
+
return new ccxt[id] (options)
|
|
25
|
+
} catch (e) {
|
|
26
|
+
console.log ('Failed to initialize', id, e.constructor.name)
|
|
27
|
+
}
|
|
28
|
+
}).filter (x => x)
|
|
29
|
+
, allExchangesByIds = ccxt.indexBy (allExchanges, 'id')
|
|
30
|
+
, exchangeIds = Object.keys (allExchangesByIds)
|
|
31
|
+
|
|
32
|
+
const load = async () => {
|
|
33
|
+
while (exchangeIds.length > 0) {
|
|
34
|
+
const id = exchangeIds.pop ()
|
|
35
|
+
const exchange = allExchangesByIds[id]
|
|
36
|
+
const file = path.join (folder, `saved-markets-${exchange.id}.json`)
|
|
37
|
+
try {
|
|
38
|
+
await exchange.loadMarkets ()
|
|
39
|
+
const { id, markets } = exchange
|
|
40
|
+
await writeFile (file, JSON.stringify ({ id, markets }))
|
|
41
|
+
console.log ('Loaded markets from', id, 'to', file)
|
|
42
|
+
} catch (e) {
|
|
43
|
+
console.log ('Failed to load markets from', id, 'to', file, e.constructor.name)
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
const started = ccxt.milliseconds ()
|
|
49
|
+
const loaders = Array (maxConcurrency).fill ().map (x => load ())
|
|
50
|
+
await Promise.all (loaders)
|
|
51
|
+
const stopped = ccxt.milliseconds ()
|
|
52
|
+
console.log ('Done loading', allExchanges.length, 'exchanges in', ((stopped - started) / 1000).toFixed (2), 'seconds')
|
|
53
|
+
|
|
54
|
+
// other code...
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
main ()
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
import ccxt from '../../js/ccxt.js';
|
|
4
|
+
import asTable from 'as-table';
|
|
5
|
+
import ansicolor from 'ansicolor';
|
|
6
|
+
import ololog from 'ololog';
|
|
7
|
+
|
|
8
|
+
const log = ololog.configure ({ locate: false }), verbose = process.argv.includes ('--verbose');
|
|
9
|
+
|
|
10
|
+
ansicolor.nice
|
|
11
|
+
|
|
12
|
+
//-----------------------------------------------------------------------------
|
|
13
|
+
|
|
14
|
+
;(async () => {
|
|
15
|
+
|
|
16
|
+
const exchanges = [ 'bittrex', 'poloniex', 'hitbtc2' ]
|
|
17
|
+
|
|
18
|
+
for (let exchangeId of exchanges) {
|
|
19
|
+
|
|
20
|
+
// create the exchange instance
|
|
21
|
+
const exchange = new ccxt[exchangeId] ()
|
|
22
|
+
|
|
23
|
+
// preload all markets first, as explained in the Manual:
|
|
24
|
+
// https://github.com/ccxt/ccxt/wiki/Manual#loading-markets
|
|
25
|
+
|
|
26
|
+
// add error/exception handling as required by the Manual:
|
|
27
|
+
// https://github.com/ccxt/ccxt/wiki/Manual#error-handling
|
|
28
|
+
|
|
29
|
+
try {
|
|
30
|
+
|
|
31
|
+
await exchange.loadMarkets ();
|
|
32
|
+
|
|
33
|
+
} catch (e) {
|
|
34
|
+
|
|
35
|
+
log.red ('Could not load markets from', exchange.id + ':', e.constructor.name, e.message)
|
|
36
|
+
|
|
37
|
+
continue; // skip this exchange if markets failed to load
|
|
38
|
+
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
for (let symbol in exchange.markets) {
|
|
42
|
+
|
|
43
|
+
console.log (exchange.id, symbol)
|
|
44
|
+
|
|
45
|
+
// add error/exception handling as required by the Manual:
|
|
46
|
+
// https://github.com/ccxt/ccxt/wiki/Manual#error-handling
|
|
47
|
+
|
|
48
|
+
try { // try fetching the ticker for a symbol existing with that exchange
|
|
49
|
+
|
|
50
|
+
const ticker = await exchange.fetchTicker (symbol)
|
|
51
|
+
log.green (ticker)
|
|
52
|
+
|
|
53
|
+
} catch (e) { // catch the error (if any) and handle it or ignore it
|
|
54
|
+
|
|
55
|
+
log.red ('Could not fetch', symbol, 'ticker from', exchange.id + ':', e.constructor.name, e.message)
|
|
56
|
+
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
}) ()
|