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,405 @@
|
|
|
1
|
+
#! /usr/bin/env node
|
|
2
|
+
import fs from 'fs'
|
|
3
|
+
import path from 'path'
|
|
4
|
+
import ansi from 'ansicolor'
|
|
5
|
+
import asTable from 'as-table'
|
|
6
|
+
import ololog from 'ololog'
|
|
7
|
+
import util from 'util'
|
|
8
|
+
import { execSync } from 'child_process'
|
|
9
|
+
import ccxt from '../../js/ccxt.js'
|
|
10
|
+
import { Agent } from 'https'
|
|
11
|
+
|
|
12
|
+
const fsPromises = fs.promises;
|
|
13
|
+
ansi.nice
|
|
14
|
+
const log = ololog.configure ({ locate: false }).unlimited
|
|
15
|
+
const { ExchangeError , NetworkError} = ccxt
|
|
16
|
+
//-----------------------------------------------------------------------------
|
|
17
|
+
|
|
18
|
+
let [processPath, , exchangeId, methodName, ... params] = process.argv.filter (x => !x.startsWith ('--'))
|
|
19
|
+
, verbose = process.argv.includes ('--verbose')
|
|
20
|
+
, debug = process.argv.includes ('--debug')
|
|
21
|
+
, poll = process.argv.includes ('--poll')
|
|
22
|
+
, no_send = process.argv.includes ('--no-send')
|
|
23
|
+
, no_load_markets = process.argv.includes ('--no-load-markets')
|
|
24
|
+
, details = process.argv.includes ('--details')
|
|
25
|
+
, no_table = process.argv.includes ('--no-table')
|
|
26
|
+
, table = process.argv.includes ('--table')
|
|
27
|
+
, iso8601 = process.argv.includes ('--iso8601')
|
|
28
|
+
, cors = process.argv.includes ('--cors')
|
|
29
|
+
, cache_markets = process.argv.includes ('--cache-markets')
|
|
30
|
+
, testnet =
|
|
31
|
+
process.argv.includes ('--test') ||
|
|
32
|
+
process.argv.includes ('--testnet') ||
|
|
33
|
+
process.argv.includes ('--sandbox')
|
|
34
|
+
, signIn = process.argv.includes ('--sign-in') || process.argv.includes ('--signIn')
|
|
35
|
+
, isSpot = process.argv.includes ('--spot')
|
|
36
|
+
, isSwap = process.argv.includes ('--swap')
|
|
37
|
+
, isFuture = process.argv.includes ('--future')
|
|
38
|
+
, isOption = process.argv.includes ('--option')
|
|
39
|
+
, shouldCreateRequestReport = process.argv.includes ('--report')
|
|
40
|
+
, shouldCreateResponseReport = process.argv.includes ('--response')
|
|
41
|
+
, shouldCreateBoth = process.argv.includes ('--static')
|
|
42
|
+
, raw = process.argv.includes ('--raw')
|
|
43
|
+
|
|
44
|
+
//-----------------------------------------------------------------------------
|
|
45
|
+
if (!raw) {
|
|
46
|
+
log ((new Date ()).toISOString())
|
|
47
|
+
log ('Node.js:', process.version)
|
|
48
|
+
log ('CCXT v' + ccxt.version)
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
//-----------------------------------------------------------------------------
|
|
52
|
+
|
|
53
|
+
process.on ('uncaughtException', e => { log.bright.red.error (e); log.red.error (e.message); process.exit (1) })
|
|
54
|
+
process.on ('unhandledRejection', e => { log.bright.red.error (e); log.red.error (e.message); process.exit (1) })
|
|
55
|
+
|
|
56
|
+
//-----------------------------------------------------------------------------
|
|
57
|
+
|
|
58
|
+
// set up keys and settings, if any
|
|
59
|
+
const keysGlobal = path.resolve ('keys.json')
|
|
60
|
+
const keysLocal = path.resolve ('keys.local.json')
|
|
61
|
+
|
|
62
|
+
const keysFile = fs.existsSync (keysLocal) ? keysLocal : keysGlobal
|
|
63
|
+
const settingsFile = fs.readFileSync(keysFile);
|
|
64
|
+
// eslint-disable-next-line import/no-dynamic-require, no-path-concat
|
|
65
|
+
let settings = JSON.parse(settingsFile)
|
|
66
|
+
settings = settings[exchangeId] || {}
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
//-----------------------------------------------------------------------------
|
|
70
|
+
|
|
71
|
+
const timeout = 30000
|
|
72
|
+
let exchange = undefined
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
const httpsAgent = new Agent ({
|
|
77
|
+
ecdhCurve: 'auto',
|
|
78
|
+
keepAlive: true,
|
|
79
|
+
})
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
// check here if we have a arg like this: binance.fetchOrders()
|
|
83
|
+
const callRegex = /\s*(\w+)\s*\.\s*(\w+)\s*\(([^()]*)\)/
|
|
84
|
+
if (callRegex.test (exchangeId)) {
|
|
85
|
+
const res = callRegex.exec (exchangeId);
|
|
86
|
+
exchangeId = res[1];
|
|
87
|
+
methodName = res[2];
|
|
88
|
+
params = res[3].split(",").map(x => x.trim());
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
try {
|
|
92
|
+
if (ccxt.pro.exchanges.includes(exchangeId)) {
|
|
93
|
+
exchange = new (ccxt.pro)[exchangeId] ({ timeout, httpsAgent, ... settings })
|
|
94
|
+
} else {
|
|
95
|
+
exchange = new (ccxt)[exchangeId] ({ timeout, httpsAgent, ... settings })
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
if (exchange === undefined) {
|
|
99
|
+
process.exit ()
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
if (isSpot) {
|
|
103
|
+
exchange.options['defaultType'] = 'spot';
|
|
104
|
+
} else if (isSwap) {
|
|
105
|
+
exchange.options['defaultType'] = 'swap';
|
|
106
|
+
} else if (isFuture) {
|
|
107
|
+
exchange.options['defaultType'] = 'future';
|
|
108
|
+
} else if (isOption) {
|
|
109
|
+
exchange.options['defaultType'] = 'option';
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// check auth keys in env var
|
|
113
|
+
const requiredCredentials = exchange.requiredCredentials;
|
|
114
|
+
for (const [credential, isRequired] of Object.entries (requiredCredentials)) {
|
|
115
|
+
if (isRequired && exchange[credential] === undefined) {
|
|
116
|
+
const credentialEnvName = (exchangeId + '_' + credential).toUpperCase () // example: KRAKEN_APIKEY
|
|
117
|
+
const credentialValue = process.env[credentialEnvName]
|
|
118
|
+
if (credentialValue) {
|
|
119
|
+
exchange[credential] = credentialValue
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
if (testnet) {
|
|
125
|
+
exchange.setSandboxMode (true)
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
} catch (e) {
|
|
129
|
+
|
|
130
|
+
log.red (e)
|
|
131
|
+
printUsage ()
|
|
132
|
+
process.exit ()
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
//-----------------------------------------------------------------------------
|
|
136
|
+
|
|
137
|
+
function createRequestTemplate(exchange, methodName, args, result) {
|
|
138
|
+
const final = {
|
|
139
|
+
'description': 'Fill this with a description of the method call',
|
|
140
|
+
'method': methodName,
|
|
141
|
+
'url': exchange.last_request_url ?? '',
|
|
142
|
+
'input': args,
|
|
143
|
+
'output': exchange.last_request_body ?? undefined
|
|
144
|
+
}
|
|
145
|
+
log('Report: (paste inside static/request/' + exchange.id + '.json ->' + methodName + ')')
|
|
146
|
+
log.green('-------------------------------------------')
|
|
147
|
+
log (JSON.stringify (final, null, 2))
|
|
148
|
+
log.green('-------------------------------------------')
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
//-----------------------------------------------------------------------------
|
|
152
|
+
|
|
153
|
+
function createResponseTemplate(exchange, methodName, args, result) {
|
|
154
|
+
const final = {
|
|
155
|
+
'description': 'Fill this with a description of the method call',
|
|
156
|
+
'method': methodName,
|
|
157
|
+
'input': args,
|
|
158
|
+
'httpResponse': exchange.last_json_response ?? exchange.last_http_response,
|
|
159
|
+
'parsedResponse': result
|
|
160
|
+
}
|
|
161
|
+
log('Report: (paste inside static/response/' + exchange.id + '.json ->' + methodName + ')')
|
|
162
|
+
log.green('-------------------------------------------')
|
|
163
|
+
log (JSON.stringify (final, function(k, v) { return v === undefined ? null : v; }, 2))
|
|
164
|
+
log.green('-------------------------------------------')
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
//-----------------------------------------------------------------------------
|
|
168
|
+
|
|
169
|
+
function printSupportedExchanges () {
|
|
170
|
+
log ('Supported exchanges:', ccxt.exchanges.join (', ').green)
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
//-----------------------------------------------------------------------------
|
|
174
|
+
|
|
175
|
+
function printUsage () {
|
|
176
|
+
log ('This is an example of a basic command-line interface to all exchanges')
|
|
177
|
+
log ('Usage: node', process.argv[1], 'id'.green, 'method'.yellow, '"param1" param2 "param3" param4 ...'.blue)
|
|
178
|
+
log ('Examples:')
|
|
179
|
+
log ('node', process.argv[1], 'okcoin fetchOHLCV BTC/USD 15m')
|
|
180
|
+
log ('node', process.argv[1], 'bitfinex fetchBalance')
|
|
181
|
+
log ('node', process.argv[1], 'kraken fetchOrderBook ETH/BTC')
|
|
182
|
+
printSupportedExchanges ()
|
|
183
|
+
log ('Supported options:')
|
|
184
|
+
log ('--verbose Print verbose output')
|
|
185
|
+
log ('--debug Print debugging output')
|
|
186
|
+
log ('--poll Repeat continuously in rate-limited mode')
|
|
187
|
+
log ('--no-send Print the request but do not actually send it to the exchange (sets verbose and load-markets)')
|
|
188
|
+
log ('--no-load-markets Do not pre-load markets (for debugging)')
|
|
189
|
+
log ('--details Print detailed fetch responses')
|
|
190
|
+
log ('--no-table Do not print the fetch response as a table')
|
|
191
|
+
log ('--table Print the fetch response as a table')
|
|
192
|
+
log ('--iso8601 Print timestamps as ISO8601 datetimes')
|
|
193
|
+
log ('--cors use CORS proxy for debugging')
|
|
194
|
+
log ('--sign-in Call signIn() if any')
|
|
195
|
+
log ('--sandbox Use the exchange sandbox if available, same as --testnet')
|
|
196
|
+
log ('--testnet Use the exchange testnet if available, same as --sandbox')
|
|
197
|
+
log ('--test Use the exchange testnet if available, same as --sandbox')
|
|
198
|
+
log ('--cache-markets Cache the loaded markets in the .cache folder in the current directory')
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
//-----------------------------------------------------------------------------
|
|
202
|
+
|
|
203
|
+
const printHumanReadable = (exchange, result) => {
|
|
204
|
+
if (raw) {
|
|
205
|
+
return log (JSON.stringify(result))
|
|
206
|
+
}
|
|
207
|
+
if (!no_table && Array.isArray (result) || table) {
|
|
208
|
+
result = Object.values (result)
|
|
209
|
+
let arrayOfObjects = (typeof result[0] === 'object')
|
|
210
|
+
|
|
211
|
+
if (details)
|
|
212
|
+
result.forEach (object => {
|
|
213
|
+
if (arrayOfObjects)
|
|
214
|
+
log ('-------------------------------------------')
|
|
215
|
+
log (object)
|
|
216
|
+
})
|
|
217
|
+
|
|
218
|
+
if (arrayOfObjects || table && Array.isArray (result)) {
|
|
219
|
+
const configuredAsTable = asTable.configure ({
|
|
220
|
+
delimiter: ' | '.lightGray.dim,
|
|
221
|
+
right: true,
|
|
222
|
+
title: x => String (x).lightGray,
|
|
223
|
+
dash: '-'.lightGray.dim,
|
|
224
|
+
print: x => {
|
|
225
|
+
if (typeof x === 'object') {
|
|
226
|
+
const j = JSON.stringify (x).trim ()
|
|
227
|
+
if (j.length < 100) return j
|
|
228
|
+
}
|
|
229
|
+
return String (x)
|
|
230
|
+
}
|
|
231
|
+
})
|
|
232
|
+
log (result.length > 0 ? configuredAsTable (result.map (element => {
|
|
233
|
+
let keys = Object.keys (element)
|
|
234
|
+
delete element['info']
|
|
235
|
+
keys.forEach (key => {
|
|
236
|
+
if (!iso8601)
|
|
237
|
+
return element[key]
|
|
238
|
+
try {
|
|
239
|
+
const iso8601 = exchange.iso8601 (element[key])
|
|
240
|
+
if (iso8601.match (/^20[0-9]{2}[-]?/))
|
|
241
|
+
element[key] = iso8601
|
|
242
|
+
else
|
|
243
|
+
throw new Error ('wrong date')
|
|
244
|
+
} catch (e) {
|
|
245
|
+
return element[key]
|
|
246
|
+
}
|
|
247
|
+
})
|
|
248
|
+
return element
|
|
249
|
+
})) : result)
|
|
250
|
+
log (result.length, 'objects');
|
|
251
|
+
} else {
|
|
252
|
+
console.dir (result, { depth: null })
|
|
253
|
+
log (result.length, 'objects');
|
|
254
|
+
}
|
|
255
|
+
} else {
|
|
256
|
+
console.dir (result, { depth: null, maxArrayLength: null })
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
//-----------------------------------------------------------------------------
|
|
261
|
+
|
|
262
|
+
async function run () {
|
|
263
|
+
|
|
264
|
+
|
|
265
|
+
|
|
266
|
+
if (!exchangeId) {
|
|
267
|
+
|
|
268
|
+
printUsage ()
|
|
269
|
+
|
|
270
|
+
} else {
|
|
271
|
+
|
|
272
|
+
let args = params
|
|
273
|
+
.map (s => s.match (/^[0-9]{4}[-][0-9]{2}[-][0-9]{2}[T\s]?[0-9]{2}[:][0-9]{2}[:][0-9]{2}/g) ? exchange.parse8601 (s) : s)
|
|
274
|
+
.map (s => (() => {
|
|
275
|
+
if (s.match ( /^\d+$/g)) return s < Number.MAX_SAFE_INTEGER ? Number (s) : s
|
|
276
|
+
try {return eval ('(() => (' + s + ')) ()') } catch (e) { return s }
|
|
277
|
+
}) ())
|
|
278
|
+
|
|
279
|
+
const www = Array.isArray (exchange.urls.www) ? exchange.urls.www[0] : exchange.urls.www
|
|
280
|
+
|
|
281
|
+
if (cors) {
|
|
282
|
+
exchange.proxy = 'https://cors-anywhere.herokuapp.com/';
|
|
283
|
+
exchange.origin = exchange.uuid ()
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
no_load_markets = no_send ? true : no_load_markets
|
|
287
|
+
|
|
288
|
+
if (debug) {
|
|
289
|
+
exchange.verbose = verbose
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
const path = '.cache/' + exchangeId + '-markets.json'
|
|
293
|
+
|
|
294
|
+
if (!no_load_markets) {
|
|
295
|
+
try {
|
|
296
|
+
await fsPromises.access (path, fs.constants.R_OK)
|
|
297
|
+
exchange.markets = JSON.parse (await fsPromises.readFile (path))
|
|
298
|
+
} catch {
|
|
299
|
+
await exchange.loadMarkets ()
|
|
300
|
+
if (cache_markets) {
|
|
301
|
+
await fsPromises.writeFile (path, JSON.stringify (exchange.markets))
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
if (signIn && exchange.has.signIn) {
|
|
307
|
+
await exchange.signIn ()
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
exchange.verbose = verbose
|
|
311
|
+
|
|
312
|
+
if (no_send) {
|
|
313
|
+
|
|
314
|
+
exchange.verbose = no_send
|
|
315
|
+
exchange.fetch = function fetch (url, method = 'GET', headers = undefined, body = undefined) {
|
|
316
|
+
log.dim.noLocate ('-------------------------------------------')
|
|
317
|
+
log.dim.noLocate (exchange.iso8601 (exchange.milliseconds ()))
|
|
318
|
+
log.green.unlimited ({
|
|
319
|
+
url,
|
|
320
|
+
method,
|
|
321
|
+
headers,
|
|
322
|
+
body,
|
|
323
|
+
})
|
|
324
|
+
process.exit ()
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
if (methodName) {
|
|
329
|
+
|
|
330
|
+
if (typeof exchange[methodName] === 'function') {
|
|
331
|
+
|
|
332
|
+
if (!raw) log (exchange.id + '.' + methodName, '(' + args.join (', ') + ')')
|
|
333
|
+
|
|
334
|
+
let start = exchange.milliseconds ()
|
|
335
|
+
let end = exchange.milliseconds ()
|
|
336
|
+
|
|
337
|
+
let i = 0;
|
|
338
|
+
|
|
339
|
+
let isWsMethod = false
|
|
340
|
+
if (methodName.startsWith("watch")) { // handle WS methods
|
|
341
|
+
isWsMethod = true;
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
while (true) {
|
|
345
|
+
try {
|
|
346
|
+
const result = await exchange[methodName] (... args)
|
|
347
|
+
end = exchange.milliseconds ()
|
|
348
|
+
if (!isWsMethod && !raw) {
|
|
349
|
+
log (exchange.iso8601 (end), 'iteration', i++, 'passed in', end - start, 'ms\n')
|
|
350
|
+
}
|
|
351
|
+
printHumanReadable (exchange, JSON.parse(JSON.stringify(result)))
|
|
352
|
+
if (!isWsMethod && !raw) {
|
|
353
|
+
log (exchange.iso8601 (end), 'iteration', i, 'passed in', end - start, 'ms\n')
|
|
354
|
+
}
|
|
355
|
+
if (shouldCreateRequestReport || shouldCreateBoth) {
|
|
356
|
+
createRequestTemplate(exchange, methodName, args, result)
|
|
357
|
+
}
|
|
358
|
+
if (shouldCreateResponseReport || shouldCreateBoth) {
|
|
359
|
+
createResponseTemplate(exchange, methodName, args, result)
|
|
360
|
+
}
|
|
361
|
+
start = end
|
|
362
|
+
} catch (e) {
|
|
363
|
+
if (e instanceof ExchangeError) {
|
|
364
|
+
log.red (e.constructor.name, e.message)
|
|
365
|
+
} else if (e instanceof NetworkError) {
|
|
366
|
+
log.yellow (e.constructor.name, e.message)
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
log.dim ('---------------------------------------------------')
|
|
370
|
+
|
|
371
|
+
// rethrow for call-stack // other errors
|
|
372
|
+
throw e
|
|
373
|
+
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
if (debug) {
|
|
377
|
+
const keys = Object.keys (httpsAgent.freeSockets)
|
|
378
|
+
const firstKey = keys[0]
|
|
379
|
+
let httpAgent = httpsAgent.freeSockets[firstKey];
|
|
380
|
+
log (firstKey, httpAgent.length)
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
if (!poll && !isWsMethod){
|
|
384
|
+
break
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
} else if (exchange[methodName] === undefined) {
|
|
389
|
+
log.red (exchange.id + '.' + methodName + ': no such property')
|
|
390
|
+
} else {
|
|
391
|
+
printHumanReadable (exchange, exchange[methodName])
|
|
392
|
+
}
|
|
393
|
+
} else {
|
|
394
|
+
log (exchange)
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
//-----------------------------------------------------------------------------
|
|
401
|
+
|
|
402
|
+
run ()
|
|
403
|
+
|
|
404
|
+
export {
|
|
405
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
const ccxt = require ('../../ccxt.js')
|
|
4
|
+
|
|
5
|
+
console.log ('CCXT Version:', ccxt.version)
|
|
6
|
+
|
|
7
|
+
async function fetchAllBalances (exchange) {
|
|
8
|
+
const params = {}
|
|
9
|
+
let balance = {}
|
|
10
|
+
while (true) {
|
|
11
|
+
const response = await exchange.fetchBalance (params)
|
|
12
|
+
balance = exchange.extend (balance, response)
|
|
13
|
+
const info = exchange.safeValue (response, 'info', {})
|
|
14
|
+
const pagination = exchange.safeValue (info, 'pagination', {})
|
|
15
|
+
const startingAfter = exchange.safeString (pagination, 'next_starting_after')
|
|
16
|
+
if (startingAfter !== undefined) {
|
|
17
|
+
params['starting_after'] = startingAfter
|
|
18
|
+
} else {
|
|
19
|
+
break
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
return balance
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
async function main () {
|
|
26
|
+
const exchange = new ccxt.coinbase ({
|
|
27
|
+
apiKey: 'YOUR_API_KEY',
|
|
28
|
+
secret: 'YOUR_API_SECRET',
|
|
29
|
+
})
|
|
30
|
+
const markets = await exchange.loadMarkets ()
|
|
31
|
+
// coinbase.verbose = true // uncomment for debugging purposes if necessary
|
|
32
|
+
const balance = await fetchAllBalances (exchange)
|
|
33
|
+
console.log (balance)
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
main ()
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
const ccxt = require ('../../ccxt')
|
|
4
|
+
|
|
5
|
+
console.log ('CCXT Version:', ccxt.version)
|
|
6
|
+
|
|
7
|
+
// https://github.com/ccxt/ccxt/issues/15405
|
|
8
|
+
|
|
9
|
+
async function main () {
|
|
10
|
+
|
|
11
|
+
const exchange = new ccxt.coinex ({
|
|
12
|
+
'apiKey': 'YOUR_API_KEY',
|
|
13
|
+
'secret': 'YOUR_API_SECRET',
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
// exchange.verbose = true // uncomment for debugging purposes
|
|
17
|
+
|
|
18
|
+
await exchange.loadMarkets ();
|
|
19
|
+
const addresses = {};
|
|
20
|
+
const promises = [];
|
|
21
|
+
|
|
22
|
+
async function fetchDepositAddress (currency, network) {
|
|
23
|
+
try {
|
|
24
|
+
const response = await exchange.fetchDepositAddress(currency, { 'network': network });
|
|
25
|
+
addresses[currency][network] = response['address']
|
|
26
|
+
}
|
|
27
|
+
catch (err) {
|
|
28
|
+
console.error(err)
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const currencies = Object.keys (exchange.currencies);
|
|
33
|
+
|
|
34
|
+
for (const currency of currencies) {
|
|
35
|
+
const networks = Object.keys (exchange.currencies[currency]['networks']);
|
|
36
|
+
for (const network of networks) {
|
|
37
|
+
addresses[currency] = {};
|
|
38
|
+
promises.push (fetchDepositAddress (currency, network));
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
await Promise.all (promises);
|
|
43
|
+
|
|
44
|
+
console.log (addresses)
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
main ();
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const ccxt = require ('../../ccxt');
|
|
4
|
+
|
|
5
|
+
console.log ('CCXT Version:', ccxt.version)
|
|
6
|
+
|
|
7
|
+
let exchange = new ccxt.coinex({
|
|
8
|
+
'apiKey': 'YOUR_API_KEY',
|
|
9
|
+
'secret': 'YOUR_SECRET_KEY',
|
|
10
|
+
})
|
|
11
|
+
|
|
12
|
+
// Example 1 :: Swap : fetch balance, create a limit swap order with leverage
|
|
13
|
+
async function example1 () {
|
|
14
|
+
exchange['options']['defaultType'] = 'swap';
|
|
15
|
+
exchange.options['defaultMarginMode'] = 'cross' // or isolated
|
|
16
|
+
await exchange.loadMarkets ();
|
|
17
|
+
|
|
18
|
+
const symbol = 'ADA/USDT:USDT';
|
|
19
|
+
|
|
20
|
+
// fetchBalance
|
|
21
|
+
const balance = await exchange.fetchBalance ();
|
|
22
|
+
console.log (balance)
|
|
23
|
+
|
|
24
|
+
// set the desired leverage (has to be made before placing the order and for a specific symbol)
|
|
25
|
+
const leverage = 8;
|
|
26
|
+
const leverage_response = await exchange.setLeverage(leverage, symbol)
|
|
27
|
+
|
|
28
|
+
// create limit order
|
|
29
|
+
const amount = 50;
|
|
30
|
+
const price = 0.3 // adjust this accordingly
|
|
31
|
+
const createOrder = await exchange.createOrder (symbol, 'limit', 'buy', amount, price);
|
|
32
|
+
console.log ('Created order id:', createOrder['id'])
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// Example 2 :: Swap :: open a position and close it
|
|
36
|
+
async function example2 () {
|
|
37
|
+
exchange['options']['defaultType'] = 'swap';
|
|
38
|
+
exchange.options['defaultMarginMode'] = 'cross' // or isolated
|
|
39
|
+
await exchange.loadMarkets ();
|
|
40
|
+
|
|
41
|
+
const symbol = 'ADA/USDT:USDT';
|
|
42
|
+
|
|
43
|
+
// fetchBalance
|
|
44
|
+
const balance = await exchange.fetchBalance ();
|
|
45
|
+
console.log (balance)
|
|
46
|
+
|
|
47
|
+
// set the desired leverage (has to be made before placing the order and for a specific symbol)
|
|
48
|
+
const leverage = 8;
|
|
49
|
+
const leverage_response = await exchange.setLeverage(leverage, symbol)
|
|
50
|
+
|
|
51
|
+
// create market order and open position
|
|
52
|
+
const amount = 50;
|
|
53
|
+
const createOrder = await exchange.createOrder (symbol, 'market', 'buy', amount);
|
|
54
|
+
console.log ('Created order id:', createOrder['id'])
|
|
55
|
+
|
|
56
|
+
// check if the order was filled and the position opened
|
|
57
|
+
const position = await exchange.fetchPositions (symbol);
|
|
58
|
+
console.log (position)
|
|
59
|
+
|
|
60
|
+
// close position (assuming it was already opened) by issuing an order in the opposite direction
|
|
61
|
+
const params = {
|
|
62
|
+
'reduce_only': true
|
|
63
|
+
}
|
|
64
|
+
const closePositionOrder = await exchange.createOrder (symbol, 'market', 'sell', amount, undefined, params);
|
|
65
|
+
console.log (closePositionOrder);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// -----------------------------------------------------------------------------------------
|
|
69
|
+
|
|
70
|
+
async function main () {
|
|
71
|
+
await example1 ();
|
|
72
|
+
await example2 ();
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
main ();
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
import { nice as ansi } from 'ansicolor';
|
|
4
|
+
import ololog from 'ololog';
|
|
5
|
+
import asTable from 'as-table';
|
|
6
|
+
|
|
7
|
+
import ccxt from '../../js/ccxt.js';
|
|
8
|
+
|
|
9
|
+
const { noLocate } = ololog;
|
|
10
|
+
const log = noLocate;
|
|
11
|
+
|
|
12
|
+
const table = asTable.configure ({
|
|
13
|
+
delimiter: ' | '.dim,
|
|
14
|
+
right: true,
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
const exchange = new ccxt.coinone ({
|
|
18
|
+
'verbose': process.argv.includes ('--verbose'),
|
|
19
|
+
})
|
|
20
|
+
|
|
21
|
+
let printTickersAsTable = function (exchange, tickers) {
|
|
22
|
+
log (exchange.id.green, exchange.iso8601 (exchange.milliseconds ()))
|
|
23
|
+
log ('Fetched', Object.values (tickers).length.toString ().green, 'tickers:')
|
|
24
|
+
log (table (ccxt.sortBy (Object.values (tickers), 'symbol', false)))
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
async function fetchAllAndPrint () {
|
|
28
|
+
const tickers = await exchange.fetchTickers ()
|
|
29
|
+
log ('---------------------------------------- fetchTickers ----------------------------------------')
|
|
30
|
+
printTickersAsTable (exchange, tickers)
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
async function fetchOneByOneAndPrint () {
|
|
34
|
+
const markets = await exchange.loadMarkets ()
|
|
35
|
+
const symbols = Object.keys (markets)
|
|
36
|
+
const tickers = []
|
|
37
|
+
|
|
38
|
+
log ('---------------------------------------- fetchTicker (one by one) ----------------------------------------')
|
|
39
|
+
|
|
40
|
+
for (let i = 0; i < symbols.length; i++) {
|
|
41
|
+
const ticker = await exchange.fetchTicker (symbols[i])
|
|
42
|
+
tickers.push (ticker)
|
|
43
|
+
log (`${i+1} / ${symbols.length}`)
|
|
44
|
+
log ('\u001b[1A'.repeat (2)) // cursor up
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
printTickersAsTable (exchange, tickers)
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
(async () => {
|
|
51
|
+
await fetchAllAndPrint ()
|
|
52
|
+
log ('\n')
|
|
53
|
+
await fetchOneByOneAndPrint ()
|
|
54
|
+
}) ()
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
import log from 'ololog';
|
|
4
|
+
import ccxt from '../../js/ccxt.js';
|
|
5
|
+
|
|
6
|
+
const exchange = new ccxt.coinone ({
|
|
7
|
+
'verbose': process.argv.includes ('--verbose'),
|
|
8
|
+
})
|
|
9
|
+
|
|
10
|
+
;(async function main () {
|
|
11
|
+
|
|
12
|
+
const markets = await exchange.loadMarkets ()
|
|
13
|
+
log (markets)
|
|
14
|
+
log ('\n' + exchange['name'] + ' supports ' + Object.keys (markets).length + ' pairs')
|
|
15
|
+
|
|
16
|
+
}) ()
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import ccxt from '../../js/ccxt.js';
|
|
2
|
+
// AUTO-TRANSPILE //
|
|
3
|
+
async function example() {
|
|
4
|
+
const prefix = '-';
|
|
5
|
+
const exchange_1 = new ccxt.okx();
|
|
6
|
+
const exchange_2 = new ccxt.htx();
|
|
7
|
+
const keys_1 = Object.keys(exchange_1.has);
|
|
8
|
+
const keys_2 = Object.keys(exchange_2.has);
|
|
9
|
+
// check missing from exchange-1
|
|
10
|
+
console.log('### checking missing functionalities from exchange-1:', exchange_1.id);
|
|
11
|
+
for (let i = 0; i < keys_2.length; i++) {
|
|
12
|
+
const key = keys_2[i];
|
|
13
|
+
if (exchange_2.has[key]) {
|
|
14
|
+
if (!keys_1.includes(key)) {
|
|
15
|
+
console.log(prefix, key, 'does not exist in', exchange_1.id, 'as opposed to', exchange_2.id);
|
|
16
|
+
}
|
|
17
|
+
else if (exchange_2.has[key] !== exchange_1.has[key]) {
|
|
18
|
+
console.log(prefix, key, '> ', exchange_1.id, ':', exchange_1.has[key], ',', exchange_2.id, ':', exchange_2.has[key]);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
// check missing from exchange-2
|
|
23
|
+
console.log('### checking missing functionalities from exchange-2:', exchange_2.id);
|
|
24
|
+
for (let i = 0; i < keys_1.length; i++) {
|
|
25
|
+
const key = keys_1[i];
|
|
26
|
+
if (exchange_1.has[key]) {
|
|
27
|
+
if (!keys_2.includes(key)) {
|
|
28
|
+
console.log(prefix, key, 'does not exist in', exchange_2.id, 'as opposed to', exchange_1.id);
|
|
29
|
+
}
|
|
30
|
+
else if (exchange_1.has[key] !== exchange_2.has[key]) {
|
|
31
|
+
console.log(prefix, key, '> ', exchange_2.id, ':', exchange_2.has[key], ',', exchange_1.id, ':', exchange_1.has[key]);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
await example();
|
|
@@ -0,0 +1,5 @@
|
|
|
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
|
+
let port = (process.argv.length > 2) ? parseInt (process.argv[2]) : 8080 // default
|
|
5
|
+
require ('cors-anywhere').createServer ().listen (port, '0.0.0.0')
|