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,43 @@
|
|
|
1
|
+
<!DOCTYPE HTML>
|
|
2
|
+
<html>
|
|
3
|
+
<head>
|
|
4
|
+
<title>CCXT Basic example for the browser</title>
|
|
5
|
+
<script type="text/javascript" src="https://unpkg.com/ccxt"></script>
|
|
6
|
+
<script>
|
|
7
|
+
|
|
8
|
+
document.addEventListener ("DOMContentLoaded", function () {
|
|
9
|
+
|
|
10
|
+
alert ('CCXT' + (ccxt.isBrowser ? ' browser' : '') + ' version ' + ccxt.version);
|
|
11
|
+
|
|
12
|
+
const exchange = new ccxt.coinbasepro ({ enableRateLimit: true })
|
|
13
|
+
const symbol = 'ETH/BTC'
|
|
14
|
+
|
|
15
|
+
exchange.fetchTicker (symbol).then (ticker => {
|
|
16
|
+
|
|
17
|
+
const text = [
|
|
18
|
+
exchange.id,
|
|
19
|
+
symbol,
|
|
20
|
+
JSON.stringify (ticker, undefined, '\n\t')
|
|
21
|
+
]
|
|
22
|
+
|
|
23
|
+
document.getElementById ('content').innerHTML = text.join (' ')
|
|
24
|
+
|
|
25
|
+
}).catch (e => {
|
|
26
|
+
|
|
27
|
+
const text = [
|
|
28
|
+
e.constructor.name,
|
|
29
|
+
e.message,
|
|
30
|
+
]
|
|
31
|
+
|
|
32
|
+
document.getElementById ('content').innerHTML = text.join (' ')
|
|
33
|
+
|
|
34
|
+
})
|
|
35
|
+
|
|
36
|
+
})
|
|
37
|
+
</script>
|
|
38
|
+
</head>
|
|
39
|
+
<body>
|
|
40
|
+
<h1>Hello, CCXT!</h1>
|
|
41
|
+
<pre id="content"></pre>
|
|
42
|
+
</body>
|
|
43
|
+
</html>
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
<!DOCTYPE HTML>
|
|
2
|
+
<html>
|
|
3
|
+
<head>
|
|
4
|
+
<title>CCXT Basic example for the browser</title>
|
|
5
|
+
<script type="text/javascript" src="https://unpkg.com/ccxt"></script>
|
|
6
|
+
<script>
|
|
7
|
+
|
|
8
|
+
document.addEventListener ("DOMContentLoaded", function () {
|
|
9
|
+
|
|
10
|
+
async function main () {
|
|
11
|
+
const exchange = new ccxt.binance ({
|
|
12
|
+
'apiKey': 'YOUR_API_KEY',
|
|
13
|
+
'secret': 'YOUR_API_SECRET',
|
|
14
|
+
'proxyUrl': 'https://cors-anywhere.herokuapp.com/',
|
|
15
|
+
})
|
|
16
|
+
const response = await exchange.fetchBalance ()
|
|
17
|
+
console.log (response)
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
main ()
|
|
21
|
+
})
|
|
22
|
+
</script>
|
|
23
|
+
</head>
|
|
24
|
+
<body>
|
|
25
|
+
<h1>Hello, CCXT!</h1>
|
|
26
|
+
<pre id="content"></pre>
|
|
27
|
+
</body>
|
|
28
|
+
</html>
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
// JavaScript CORS Proxy
|
|
2
|
+
// Save this in a file like cors.js and run with `node cors [port]`
|
|
3
|
+
// It will listen for your requests on the port you pass in command line or port 8080 by default
|
|
4
|
+
const port = (process.argv.length > 2) ? parseInt (process.argv[2]) : 8080 // default
|
|
5
|
+
require ('cors-anywhere').createServer ({
|
|
6
|
+
setHeaders: { 'origin': 'https://www.bitmex.com' }
|
|
7
|
+
}).listen (port, '0.0.0.0')
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
<!DOCTYPE HTML>
|
|
2
|
+
<html>
|
|
3
|
+
<head>
|
|
4
|
+
<title>CCXT Basic example for the browser</title>
|
|
5
|
+
<script type="text/javascript" src="https://unpkg.com/ccxt"></script>
|
|
6
|
+
<script>
|
|
7
|
+
|
|
8
|
+
document.addEventListener ("DOMContentLoaded", function () {
|
|
9
|
+
|
|
10
|
+
alert ('ccxt version ' + ccxt.version);
|
|
11
|
+
|
|
12
|
+
const exchange = new ccxt.bitmex ({
|
|
13
|
+
'proxyUrl': 'http://127.0.0.1:8080/',
|
|
14
|
+
})
|
|
15
|
+
|
|
16
|
+
const symbol = 'BTC/USDT'
|
|
17
|
+
|
|
18
|
+
exchange.fetchTicker (symbol).then (ticker => {
|
|
19
|
+
|
|
20
|
+
const text = [
|
|
21
|
+
exchange.id,
|
|
22
|
+
symbol,
|
|
23
|
+
JSON.stringify (ticker, undefined, '\n\t')
|
|
24
|
+
]
|
|
25
|
+
|
|
26
|
+
document.getElementById ('content').innerHTML = text.join (' ')
|
|
27
|
+
|
|
28
|
+
}).catch (e => {
|
|
29
|
+
|
|
30
|
+
const text = [
|
|
31
|
+
e.constructor.name,
|
|
32
|
+
e.message,
|
|
33
|
+
]
|
|
34
|
+
|
|
35
|
+
document.getElementById ('content').innerHTML = text.join (' ')
|
|
36
|
+
|
|
37
|
+
})
|
|
38
|
+
|
|
39
|
+
})
|
|
40
|
+
</script>
|
|
41
|
+
</head>
|
|
42
|
+
<body>
|
|
43
|
+
<h1>Hello, CCXT!</h1>
|
|
44
|
+
<pre id="content"></pre>
|
|
45
|
+
</body>
|
|
46
|
+
</html>
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
<!DOCTYPE HTML>
|
|
2
|
+
<html>
|
|
3
|
+
<head>
|
|
4
|
+
<title>CCXT Basic example for the browser</title>
|
|
5
|
+
<script type="text/javascript" src="https://unpkg.com/ccxt"></script>
|
|
6
|
+
<script type="text/javascript" src="https://unpkg.com/lightweight-charts@3.4.0/dist/lightweight-charts.standalone.production.js"></script>
|
|
7
|
+
<script>
|
|
8
|
+
|
|
9
|
+
document.addEventListener ("DOMContentLoaded", async function () {
|
|
10
|
+
|
|
11
|
+
try {
|
|
12
|
+
const exchange = new ccxt.coinbasepro ({ enableRateLimit: true });
|
|
13
|
+
const symbol = 'ETH/BTC';
|
|
14
|
+
const timeframe = '1d';
|
|
15
|
+
const since = undefined;
|
|
16
|
+
const limit = 600;
|
|
17
|
+
const config = {
|
|
18
|
+
width: 600,
|
|
19
|
+
height: 300,
|
|
20
|
+
priceScale: {
|
|
21
|
+
position: 'left',
|
|
22
|
+
mode: 1,
|
|
23
|
+
autoScale: true,
|
|
24
|
+
invertScale: false,
|
|
25
|
+
},
|
|
26
|
+
timeScale: {
|
|
27
|
+
fixLeftEdge: true,
|
|
28
|
+
lockVisibleTimeRangeOnResize: true,
|
|
29
|
+
rightBarStaysOnScroll: true,
|
|
30
|
+
visible: true,
|
|
31
|
+
timeVisible: true,
|
|
32
|
+
secondsVisible: true,
|
|
33
|
+
},
|
|
34
|
+
crosshair: {
|
|
35
|
+
mode: window.LightweightCharts.CrosshairMode.Normal,
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
const chart = window.LightweightCharts.createChart(document.body, config);
|
|
39
|
+
const candleSeries = chart.addCandlestickSeries();
|
|
40
|
+
while (true) {
|
|
41
|
+
try {
|
|
42
|
+
const response = await exchange.fetchOHLCV(symbol, timeframe, since, limit);
|
|
43
|
+
const last = response[response.length - 1]
|
|
44
|
+
const [ timestamp, open, high, low, close ] = last;
|
|
45
|
+
const data = response.map (([ timestamp, open, high, low, close ]) => ({ time: exchange.iso8601 (timestamp), open, high, low, close }));
|
|
46
|
+
candleSeries.setData(data);
|
|
47
|
+
} catch (e) {
|
|
48
|
+
console.log (e.constructor.name, e.message);
|
|
49
|
+
}
|
|
50
|
+
await exchange.sleep (1000);
|
|
51
|
+
}
|
|
52
|
+
} catch (e) {
|
|
53
|
+
alert (e.constructor.name + ' ' + e.message);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
})
|
|
57
|
+
</script>
|
|
58
|
+
</head>
|
|
59
|
+
<body>
|
|
60
|
+
</body>
|
|
61
|
+
</html>
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html>
|
|
3
|
+
<body>
|
|
4
|
+
<h2>CCXT running on a Webworker example</h2>
|
|
5
|
+
<p>This example uses a web worker to continuously call <b>fetchTicker</b> on a user-defined exchange, symbol and interval. Then, the web worker reaches back with the results.</p>
|
|
6
|
+
<h3>Parameters</h3>
|
|
7
|
+
<label for="exchange">Exchange:</label>
|
|
8
|
+
<input type="text" id="exchange" name="exchange" ><br><br>
|
|
9
|
+
<label for="symbol">Symbol: </label>
|
|
10
|
+
<input type="text" id="symbol" name="symbol"><br><br>
|
|
11
|
+
<label for="interval">Interval (ms): </label>
|
|
12
|
+
<input type="text" id="interval" name="interval"><br><br>
|
|
13
|
+
<button onclick="startWorker()">Start CCXT worker</button>
|
|
14
|
+
<button onclick="stopWorker()">Stop CCXT worker</button>
|
|
15
|
+
<h3> Received Results:</h3>
|
|
16
|
+
<output id="result"></output>
|
|
17
|
+
<table id="resultsTable" style="left:300px;width:400px; border:1px solid black;" >
|
|
18
|
+
<thead>
|
|
19
|
+
<tr>
|
|
20
|
+
<th>Symbol</th>
|
|
21
|
+
<th>Last Price</th>
|
|
22
|
+
<th>Base Volume</th>
|
|
23
|
+
<th>Exchange Ts</th>
|
|
24
|
+
<th>Local Ts</th>
|
|
25
|
+
</tr>
|
|
26
|
+
</thead>
|
|
27
|
+
<tbody id="tbody">
|
|
28
|
+
</tbody>
|
|
29
|
+
</table>
|
|
30
|
+
</body>
|
|
31
|
+
<script>
|
|
32
|
+
// fill in default values
|
|
33
|
+
document.addEventListener('DOMContentLoaded', function(event) {
|
|
34
|
+
document.getElementById('exchange').value = 'coinbasepro';
|
|
35
|
+
document.getElementById('symbol').value = 'BTC/USDT';
|
|
36
|
+
document.getElementById('interval').value = '1000';
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
var ccxtWorker;
|
|
40
|
+
function startWorker() {
|
|
41
|
+
|
|
42
|
+
if (typeof(Worker) !== "undefined") {
|
|
43
|
+
// if the worker does not exist yet, creates it
|
|
44
|
+
if (typeof(ccxtWorker) == "undefined") {
|
|
45
|
+
ccxtWorker = new Worker("worker.js");
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// reads user-defined parameters
|
|
49
|
+
var exchange = document.getElementById('exchange').value
|
|
50
|
+
var symbol = document.getElementById('symbol').value
|
|
51
|
+
var interval = document.getElementById('interval').value
|
|
52
|
+
|
|
53
|
+
// send a message with those values
|
|
54
|
+
ccxtWorker.postMessage([exchange,symbol, interval]);
|
|
55
|
+
|
|
56
|
+
ccxtWorker.onmessage = function(event) {
|
|
57
|
+
// every time the ccxtworker posts a message
|
|
58
|
+
// this handler will be invoked
|
|
59
|
+
handleReceivedData(event.data)
|
|
60
|
+
};
|
|
61
|
+
} else {
|
|
62
|
+
document.getElementById("result").innerHTML = "Sorry! No Web Worker support.";
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
function handleReceivedData(data) {
|
|
67
|
+
var [symbol, last, baseVolume, timestamp, ourTimestamp] = data;
|
|
68
|
+
var tableRef = document.getElementById('resultsTable');
|
|
69
|
+
var tbody = document.getElementById('tbody');
|
|
70
|
+
row = tbody.insertRow(0);
|
|
71
|
+
|
|
72
|
+
cellSymbol = row.insertCell();
|
|
73
|
+
cellSymbol.innerHTML = symbol;
|
|
74
|
+
|
|
75
|
+
cellPrice = row.insertCell();
|
|
76
|
+
cellPrice.innerHTML = last;
|
|
77
|
+
|
|
78
|
+
cellPrice = row.insertCell();
|
|
79
|
+
cellPrice.innerHTML = baseVolume;
|
|
80
|
+
|
|
81
|
+
cellTimestamp = row.insertCell();
|
|
82
|
+
cellTimestamp.innerHTML = timestamp;
|
|
83
|
+
|
|
84
|
+
cellOurtimestamp = row.insertCell();
|
|
85
|
+
cellOurtimestamp.innerHTML = ourTimestamp;
|
|
86
|
+
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function stopWorker() {
|
|
90
|
+
if (ccxtWorker !== undefined) {
|
|
91
|
+
ccxtWorker.terminate();
|
|
92
|
+
ccxtWorker = undefined;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
</script>
|
|
96
|
+
</body>
|
|
97
|
+
</html>
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
self.importScripts('https://unpkg.com/ccxt@1.79.2/dist/ccxt.browser.js');
|
|
2
|
+
|
|
3
|
+
console.log("Loaded ccxt version:", self.ccxt.version);
|
|
4
|
+
|
|
5
|
+
var exchangeInstance = undefined;
|
|
6
|
+
|
|
7
|
+
// handler of received messages
|
|
8
|
+
self.onmessage = async function handler(msg) {
|
|
9
|
+
await handleMessageFromMain(msg)
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
// get messages from the main script
|
|
13
|
+
async function handleMessageFromMain(msg) {
|
|
14
|
+
console.log(msg.data);
|
|
15
|
+
var [exchange, symbol, interval] = msg.data;
|
|
16
|
+
console.log('Worker received:', symbol,exchange, interval)
|
|
17
|
+
interval = parseInt(interval)
|
|
18
|
+
await processTicker(symbol, exchange)
|
|
19
|
+
// schedule process ticker execution
|
|
20
|
+
setInterval (async () => {
|
|
21
|
+
await processTicker(symbol, exchange)
|
|
22
|
+
}, interval)
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
async function processTicker(symbol, exchangeId) {
|
|
26
|
+
if (exchangeInstance === undefined) {
|
|
27
|
+
exchangeInstance = new ccxt[exchangeId]
|
|
28
|
+
}
|
|
29
|
+
var result = await fetchTicker(symbol)
|
|
30
|
+
var symbol = result['symbol']
|
|
31
|
+
var last = result['last']
|
|
32
|
+
var timestamp = result['timestamp']
|
|
33
|
+
var baseVolume = result['baseVolume']
|
|
34
|
+
var ourTimestamp = Date.now()
|
|
35
|
+
// send the data back to the main script
|
|
36
|
+
postMessage([symbol, last, baseVolume, timestamp, ourTimestamp]);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
async function fetchTicker(symbol){
|
|
40
|
+
// use ccxt to fetch ticker info
|
|
41
|
+
var result = await exchangeInstance.fetchTicker(symbol)
|
|
42
|
+
return result;
|
|
43
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# CCXT JavaScript Examples
|
|
2
|
+
|
|
3
|
+
These examples might require the following super-useful high-quality Node.js modules by [xpl](https://github.com/xpl):
|
|
4
|
+
|
|
5
|
+
- [ansicolor](https://github.com/xpl/ansicolor): A quality JavaScript library for the ANSI color/style management ([ansicolor @ npm](https://npmjs.com/package/ansicolor))
|
|
6
|
+
- [as-table](https://github.com/xpl/as-table): A simple function that prints objects as ASCII tables ([as-table @ npm](https://npmjs.com/package/as-table))
|
|
7
|
+
- [ololog](https://github.com/xpl/ololog): Platform-agnostic logging with blackjack and hookers ([ololog @ npm](https://npmjs.com/package/ololog))
|
|
8
|
+
|
|
9
|
+
All of the modules above are installed with the ccxt library devDependencies by npm automatically.
|
|
10
|
+
|
|
11
|
+
To run the ccxt JavaScript examples from any folder type in console:
|
|
12
|
+
|
|
13
|
+
```shell
|
|
14
|
+
node path/to/example.js # substitute for actual filename here
|
|
15
|
+
```
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
const ccxt = require ('../../ccxt.js');
|
|
4
|
+
|
|
5
|
+
// instantiate the exchange
|
|
6
|
+
let exchange = new ccxt.coinbasepro ({
|
|
7
|
+
'apiKey': 'XXXXXXXXXXXXXX',
|
|
8
|
+
'secret': 'YYYYYYYYYYYYYY',
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
async function checkOrders(){
|
|
12
|
+
try {
|
|
13
|
+
// fetch orders
|
|
14
|
+
let orders = await exchange.fetchOrders ('BTC/USDT');
|
|
15
|
+
// output the result
|
|
16
|
+
console.log (exchange.id, 'fetched orders', orders);
|
|
17
|
+
} catch (e) {
|
|
18
|
+
if (e instanceof ccxt.DDoSProtection || e.message.includes ('ECONNRESET')) {
|
|
19
|
+
console.log ('[DDoS Protection] ' + e.message);
|
|
20
|
+
} else if (e instanceof ccxt.RequestTimeout) {
|
|
21
|
+
console.log ('[Request Timeout] ' + e.message);
|
|
22
|
+
} else if (e instanceof ccxt.AuthenticationError) {
|
|
23
|
+
console.log ('[Authentication Error] ' + e.message);
|
|
24
|
+
} else if (e instanceof ccxt.ExchangeNotAvailable) {
|
|
25
|
+
console.log ('[Exchange Not Available Error] ' + e.message);
|
|
26
|
+
} else if (e instanceof ccxt.ExchangeError) {
|
|
27
|
+
console.log ('[Exchange Error] ' + e.message);
|
|
28
|
+
} else if (e instanceof ccxt.NetworkError) {
|
|
29
|
+
console.log ('[Network Error] ' + e.message);
|
|
30
|
+
} else {
|
|
31
|
+
// you can throw it if you want to stop the execution
|
|
32
|
+
// console.log ('[Exception ' + e.constructor.name + '] ' + e.message);
|
|
33
|
+
throw e;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// for demonstrational purposes, we use 1000 ms interval
|
|
39
|
+
setInterval(checkOrders, 1000);
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
import ccxt from '../../js/ccxt.js';
|
|
4
|
+
|
|
5
|
+
const aggregateOrderBookSide = function (orderbookSide, precision = undefined) {
|
|
6
|
+
const result = []
|
|
7
|
+
const amounts = {}
|
|
8
|
+
for (let i = 0; i < orderbookSide.length; i++) {
|
|
9
|
+
const ask = orderbookSide[i]
|
|
10
|
+
let price = ask[0]
|
|
11
|
+
if (precision !== undefined) {
|
|
12
|
+
price = ccxt.decimalToPrecision (price, ccxt.ROUND, precision, ccxt.TICK_SIZE)
|
|
13
|
+
}
|
|
14
|
+
amounts[price] = (amounts[price] || 0) + ask[1]
|
|
15
|
+
}
|
|
16
|
+
Object.keys (amounts).forEach (price => {
|
|
17
|
+
result.push ([
|
|
18
|
+
parseFloat (price),
|
|
19
|
+
amounts[price]
|
|
20
|
+
])
|
|
21
|
+
})
|
|
22
|
+
return result
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
const aggregateOrderBook = function (orderbook, precision = undefined) {
|
|
26
|
+
let asks = aggregateOrderBookSide(orderbook['asks'], precision)
|
|
27
|
+
let bids = aggregateOrderBookSide(orderbook['bids'], precision)
|
|
28
|
+
return {
|
|
29
|
+
'asks': ccxt.sortBy (asks, 0),
|
|
30
|
+
'bids': ccxt.sortBy (bids, 0, true),
|
|
31
|
+
'timestamp': orderbook['timestamp'],
|
|
32
|
+
'datetime': orderbook['datetime'],
|
|
33
|
+
'nonce': orderbook['nonce'],
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
;(async () => {
|
|
38
|
+
|
|
39
|
+
const exchange = new ccxt.coinbasepro()
|
|
40
|
+
|
|
41
|
+
await exchange.loadMarkets ()
|
|
42
|
+
|
|
43
|
+
// exchange.verbose = true // uncomment for verbose debug output
|
|
44
|
+
|
|
45
|
+
// level 2 (default)
|
|
46
|
+
const orderbook = await exchange.fetchOrderBook('BTC/USD')
|
|
47
|
+
|
|
48
|
+
// or level 3
|
|
49
|
+
// const orderbook = await exchange.fetchOrderBook('BTC/USD', undefined, { 'level': 3 })
|
|
50
|
+
|
|
51
|
+
const step = 0.5 // 0.01, 0.1, 0.5, 1.0, 2.5, 5.0, 10.0
|
|
52
|
+
console.log (aggregateOrderBook (orderbook, step))
|
|
53
|
+
|
|
54
|
+
})();
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
import ccxt from '../../js/ccxt.js';
|
|
4
|
+
import asTable from 'as-table';
|
|
5
|
+
import fs from 'fs';
|
|
6
|
+
import ansicolor from 'ansicolor';
|
|
7
|
+
import ololog from 'ololog';
|
|
8
|
+
|
|
9
|
+
const log = ololog.configure ({ locate: false }), verbose = process.argv.includes ('--verbose'), keysGlobal = 'keys.json', keysLocal = 'keys.local.json', keysFile = fs.existsSync (keysLocal) ? keysLocal : (fs.existsSync (keysGlobal) ? keysGlobal : false), config = keysFile ? require ('../../' + keysFile) : {};
|
|
10
|
+
|
|
11
|
+
let printSupportedExchanges = function () {
|
|
12
|
+
log ('Supported exchanges:', ccxt.exchanges.join (', ').green)
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
let printUsage = function () {
|
|
16
|
+
log ('Usage: node', process.argv[1], 'id1'.green, 'id2'.yellow, 'id3'.blue, '...')
|
|
17
|
+
printSupportedExchanges ()
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
let printExchangeSymbolsAndMarkets = function (exchange) {
|
|
21
|
+
log (getExchangeSymbols (exchange))
|
|
22
|
+
log (getExchangeMarketsTable (exchange))
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
let getExchangeMarketsTable = (exchange) => {
|
|
26
|
+
return asTable.configure ({ delimiter: ' | ' }) (Object.values (markets))
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
let sleep = (ms) => new Promise (resolve => setTimeout (resolve, ms));
|
|
30
|
+
|
|
31
|
+
let proxies = [
|
|
32
|
+
'', // no proxy by default
|
|
33
|
+
'https://crossorigin.me/',
|
|
34
|
+
'https://cors-anywhere.herokuapp.com/',
|
|
35
|
+
]
|
|
36
|
+
|
|
37
|
+
;(async function main () {
|
|
38
|
+
|
|
39
|
+
if (process.argv.length > 3) {
|
|
40
|
+
|
|
41
|
+
let ids = process.argv.slice (2)
|
|
42
|
+
let exchanges = {}
|
|
43
|
+
|
|
44
|
+
log (ids.join (', ').yellow)
|
|
45
|
+
|
|
46
|
+
// load all markets from all exchanges
|
|
47
|
+
for (let id of ids) {
|
|
48
|
+
|
|
49
|
+
let settings = config[id] || {}
|
|
50
|
+
|
|
51
|
+
// instantiate the exchange by id
|
|
52
|
+
let exchange = new ccxt[id] (ccxt.extend ({
|
|
53
|
+
// verbose,
|
|
54
|
+
// 'proxy': 'https://cors-anywhere.herokuapp.com/',
|
|
55
|
+
}, settings))
|
|
56
|
+
|
|
57
|
+
// save it in a dictionary under its id for future use
|
|
58
|
+
exchanges[id] = exchange
|
|
59
|
+
|
|
60
|
+
// load all markets from the exchange
|
|
61
|
+
let markets = await exchange.loadMarkets ()
|
|
62
|
+
|
|
63
|
+
// basic round-robin proxy scheduler
|
|
64
|
+
let currentProxy = 0
|
|
65
|
+
let maxRetries = proxies.length
|
|
66
|
+
|
|
67
|
+
for (let numRetries = 0; numRetries < maxRetries; numRetries++) {
|
|
68
|
+
|
|
69
|
+
try { // try to load exchange markets using current proxy
|
|
70
|
+
|
|
71
|
+
exchange.proxy = proxies[currentProxy]
|
|
72
|
+
await exchange.loadMarkets ()
|
|
73
|
+
|
|
74
|
+
} catch (e) { // rotate proxies in case of connectivity errors, catch all other exceptions
|
|
75
|
+
|
|
76
|
+
// swallow connectivity exceptions only
|
|
77
|
+
if (e instanceof ccxt.DDoSProtection || e.message.includes ('ECONNRESET')) {
|
|
78
|
+
log.bright.yellow ('[DDoS Protection Error] ' + e.message)
|
|
79
|
+
} else if (e instanceof ccxt.RequestTimeout) {
|
|
80
|
+
log.bright.yellow ('[Timeout Error] ' + e.message)
|
|
81
|
+
} else if (e instanceof ccxt.AuthenticationError) {
|
|
82
|
+
log.bright.yellow ('[Authentication Error] ' + e.message)
|
|
83
|
+
} else if (e instanceof ccxt.ExchangeNotAvailable) {
|
|
84
|
+
log.bright.yellow ('[Exchange Not Available Error] ' + e.message)
|
|
85
|
+
} else if (e instanceof ccxt.ExchangeError) {
|
|
86
|
+
log.bright.yellow ('[Exchange Error] ' + e.message)
|
|
87
|
+
} else {
|
|
88
|
+
throw e; // rethrow all other exceptions
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// retry next proxy in round-robin fashion in case of error
|
|
92
|
+
currentProxy = ++currentProxy % proxies.length
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
log (id.green, 'loaded', exchange.symbols.length.toString ().green, 'markets')
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
log ('Loaded all markets'.green)
|
|
100
|
+
|
|
101
|
+
// get all unique symbols
|
|
102
|
+
let uniqueSymbols = ccxt.unique (ccxt.flatten (ids.map (id => exchanges[id].symbols)))
|
|
103
|
+
|
|
104
|
+
// filter out symbols that are not present on at least two exchanges
|
|
105
|
+
let arbitrableSymbols = uniqueSymbols
|
|
106
|
+
.filter (symbol =>
|
|
107
|
+
ids.filter (id =>
|
|
108
|
+
(exchanges[id].symbols.indexOf (symbol) >= 0)).length > 1)
|
|
109
|
+
.sort ((id1, id2) => (id1 > id2) ? 1 : ((id2 > id1) ? -1 : 0))
|
|
110
|
+
|
|
111
|
+
// print a table of arbitrable symbols
|
|
112
|
+
let table = arbitrableSymbols.map (symbol => {
|
|
113
|
+
let row = { symbol }
|
|
114
|
+
for (let id of ids)
|
|
115
|
+
if (exchanges[id].symbols.indexOf (symbol) >= 0)
|
|
116
|
+
row[id] = id
|
|
117
|
+
return row
|
|
118
|
+
})
|
|
119
|
+
|
|
120
|
+
log (asTable.configure ({ delimiter: ' | ' }) (table))
|
|
121
|
+
|
|
122
|
+
} else {
|
|
123
|
+
|
|
124
|
+
printUsage ()
|
|
125
|
+
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
process.exit ()
|
|
129
|
+
|
|
130
|
+
}) ()
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
import ccxt from '../../js/ccxt.js';
|
|
4
|
+
import asciichart from 'asciichart';
|
|
5
|
+
import asTable from 'as-table';
|
|
6
|
+
import ololog from 'ololog'
|
|
7
|
+
import ansicolor from 'ansicolor';
|
|
8
|
+
|
|
9
|
+
const log = ololog.configure ({ locate: false })
|
|
10
|
+
|
|
11
|
+
ansicolor.nice
|
|
12
|
+
|
|
13
|
+
//-----------------------------------------------------------------------------
|
|
14
|
+
|
|
15
|
+
;(async function main () {
|
|
16
|
+
|
|
17
|
+
// experimental, not yet implemented for all exchanges
|
|
18
|
+
// your contributions are welcome ;)
|
|
19
|
+
|
|
20
|
+
const index = 4 // [ timestamp, open, high, low, close, volume ]
|
|
21
|
+
const ohlcv = await new ccxt.okcoin ().fetchOHLCV ('BTC/USD', '15m')
|
|
22
|
+
const lastPrice = ohlcv[ohlcv.length - 1][index] // closing price
|
|
23
|
+
const series = ohlcv.map (x => x[index]) // closing price
|
|
24
|
+
const bitcoinRate = ('₿ = $' + lastPrice).green
|
|
25
|
+
const chart = asciichart.plot (series, { height: 15, padding: ' ' })
|
|
26
|
+
log.yellow ("\n" + chart, bitcoinRate, "\n")
|
|
27
|
+
process.exit ()
|
|
28
|
+
|
|
29
|
+
}) ()
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import ccxt from '../../js/ccxt.js';
|
|
2
|
+
|
|
3
|
+
const id = 'huobipro', exchange = new ccxt[id] ({ enableRateLimit: true }), symbol = 'ETH/BTC';(async function main () {
|
|
4
|
+
|
|
5
|
+
await exchange.loadMarkets ()
|
|
6
|
+
|
|
7
|
+
for (let i = 0; i < 2000; i++) {
|
|
8
|
+
|
|
9
|
+
const orderbook = await exchange.fetchOrderBook (symbol)
|
|
10
|
+
console.log (new Date (), i, symbol, orderbook.asks[0], orderbook.bids[0])
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
}) ()
|