ccxt 4.2.72 → 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 +124 -122
- package/build.sh +2 -2
- package/dist/ccxt.browser.js +3277 -460
- package/dist/ccxt.browser.min.js +4 -4
- package/dist/cjs/ccxt.js +6 -1
- package/dist/cjs/src/abstract/coinbaseinternational.js +9 -0
- package/dist/cjs/src/base/Exchange.js +31 -7
- package/dist/cjs/src/bitget.js +62 -50
- package/dist/cjs/src/btcturk.js +3 -3
- package/dist/cjs/src/bybit.js +90 -30
- package/dist/cjs/src/coinbaseinternational.js +2019 -0
- package/dist/cjs/src/gate.js +1 -1
- package/dist/cjs/src/htx.js +16 -9
- package/dist/cjs/src/hyperliquid.js +9 -2
- package/dist/cjs/src/mexc.js +1 -1
- package/dist/cjs/src/okx.js +1 -1
- package/dist/cjs/src/pro/coinbaseinternational.js +645 -0
- 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 +8 -2
- package/js/ccxt.js +6 -2
- package/js/src/abstract/coinbaseinternational.d.ts +42 -0
- package/js/src/abstract/coinbaseinternational.js +11 -0
- package/js/src/ace.d.ts +2 -2
- package/js/src/alpaca.d.ts +2 -2
- package/js/src/ascendex.d.ts +3 -3
- package/js/src/base/Exchange.d.ts +27 -24
- package/js/src/base/Exchange.js +31 -7
- package/js/src/bigone.d.ts +2 -2
- package/js/src/binance.d.ts +7 -7
- package/js/src/bingx.d.ts +4 -4
- package/js/src/bit2c.d.ts +2 -2
- package/js/src/bitbank.d.ts +2 -2
- package/js/src/bitbns.d.ts +2 -2
- package/js/src/bitfinex.d.ts +3 -3
- package/js/src/bitfinex2.d.ts +4 -4
- package/js/src/bitflyer.d.ts +2 -2
- package/js/src/bitget.d.ts +4 -4
- package/js/src/bitget.js +62 -50
- package/js/src/bithumb.d.ts +2 -2
- package/js/src/bitmart.d.ts +4 -4
- package/js/src/bitmex.d.ts +3 -3
- package/js/src/bitopro.d.ts +2 -2
- package/js/src/bitrue.d.ts +2 -2
- package/js/src/bitso.d.ts +2 -2
- package/js/src/bitstamp.d.ts +2 -2
- package/js/src/bitteam.d.ts +2 -2
- package/js/src/bitvavo.d.ts +4 -4
- package/js/src/bl3p.d.ts +2 -2
- package/js/src/blockchaincom.d.ts +2 -2
- package/js/src/blofin.d.ts +4 -4
- package/js/src/btcalpha.d.ts +2 -2
- package/js/src/btcbox.d.ts +2 -2
- package/js/src/btcmarkets.d.ts +2 -2
- package/js/src/btcturk.d.ts +2 -2
- package/js/src/btcturk.js +3 -3
- package/js/src/bybit.d.ts +8 -6
- package/js/src/bybit.js +90 -30
- package/js/src/cex.d.ts +3 -3
- package/js/src/coinbase.d.ts +3 -3
- package/js/src/coinbaseinternational.d.ts +146 -0
- package/js/src/coinbaseinternational.js +2020 -0
- package/js/src/coinbasepro.d.ts +2 -2
- package/js/src/coincheck.d.ts +2 -2
- package/js/src/coinex.d.ts +4 -4
- package/js/src/coinlist.d.ts +3 -3
- package/js/src/coinmate.d.ts +2 -2
- package/js/src/coinmetro.d.ts +2 -2
- package/js/src/coinone.d.ts +2 -2
- package/js/src/coinsph.d.ts +2 -2
- package/js/src/coinspot.d.ts +2 -2
- package/js/src/cryptocom.d.ts +4 -4
- package/js/src/currencycom.d.ts +2 -2
- package/js/src/delta.d.ts +3 -3
- package/js/src/deribit.d.ts +3 -3
- package/js/src/digifinex.d.ts +3 -3
- package/js/src/exmo.d.ts +3 -3
- package/js/src/gate.d.ts +4 -4
- package/js/src/gate.js +1 -1
- package/js/src/gemini.d.ts +2 -2
- package/js/src/hitbtc.d.ts +4 -4
- package/js/src/hollaex.d.ts +2 -2
- package/js/src/htx.d.ts +5 -5
- package/js/src/htx.js +16 -9
- package/js/src/huobijp.d.ts +2 -2
- package/js/src/hyperliquid.d.ts +4 -3
- package/js/src/hyperliquid.js +10 -3
- package/js/src/idex.d.ts +2 -2
- package/js/src/independentreserve.d.ts +2 -2
- package/js/src/indodax.d.ts +2 -2
- package/js/src/kraken.d.ts +3 -3
- package/js/src/krakenfutures.d.ts +4 -4
- package/js/src/kucoin.d.ts +4 -4
- package/js/src/kucoinfutures.d.ts +3 -3
- package/js/src/kuna.d.ts +2 -2
- package/js/src/latoken.d.ts +2 -2
- package/js/src/lbank.d.ts +2 -2
- package/js/src/luno.d.ts +2 -2
- package/js/src/lykke.d.ts +2 -2
- package/js/src/mercado.d.ts +2 -2
- package/js/src/mexc.d.ts +2 -2
- package/js/src/mexc.js +1 -1
- package/js/src/ndax.d.ts +3 -3
- package/js/src/novadax.d.ts +2 -2
- package/js/src/oceanex.d.ts +2 -2
- package/js/src/okcoin.d.ts +3 -3
- package/js/src/okx.d.ts +4 -4
- package/js/src/okx.js +1 -1
- package/js/src/onetrading.d.ts +2 -2
- package/js/src/p2b.d.ts +2 -2
- package/js/src/paymium.d.ts +2 -2
- package/js/src/phemex.d.ts +3 -3
- package/js/src/poloniex.d.ts +3 -3
- package/js/src/poloniexfutures.d.ts +2 -2
- package/js/src/pro/binance.d.ts +3 -3
- package/js/src/pro/bitvavo.d.ts +3 -3
- package/js/src/pro/cex.d.ts +3 -3
- package/js/src/pro/coinbaseinternational.d.ts +28 -0
- package/js/src/pro/coinbaseinternational.js +646 -0
- package/js/src/pro/cryptocom.d.ts +2 -2
- package/js/src/pro/hitbtc.d.ts +2 -2
- package/js/src/pro/kraken.d.ts +3 -3
- package/js/src/pro/krakenfutures.js +8 -7
- package/js/src/pro/okx.d.ts +3 -3
- package/js/src/pro/poloniex.d.ts +2 -2
- package/js/src/probit.d.ts +2 -2
- package/js/src/timex.d.ts +3 -3
- package/js/src/tokocrypto.d.ts +2 -2
- package/js/src/upbit.d.ts +2 -2
- package/js/src/wavesexchange.d.ts +2 -2
- package/js/src/wazirx.d.ts +2 -2
- package/js/src/whitebit.d.ts +2 -2
- package/js/src/woo.d.ts +5 -5
- package/js/src/yobit.d.ts +2 -2
- package/js/src/zaif.d.ts +2 -2
- package/js/src/zonda.d.ts +2 -2
- package/package.json +4 -1
- package/skip-tests.json +227 -424
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
// ----------------------------------------------------------------------------
|
|
4
|
+
|
|
5
|
+
import ccxt from '../../js/ccxt.js';
|
|
6
|
+
|
|
7
|
+
// ----------------------------------------------------------------------------
|
|
8
|
+
|
|
9
|
+
(async () => {
|
|
10
|
+
|
|
11
|
+
const exchange = new ccxt.bittrex ({
|
|
12
|
+
'apiKey': 'YOUR_API_KEY',
|
|
13
|
+
'secret': 'YOUR_SECRET_KEY',
|
|
14
|
+
'verbose': false, // set to true to see more debugging output
|
|
15
|
+
'timeout': 60000,
|
|
16
|
+
})
|
|
17
|
+
|
|
18
|
+
// try to load markets first, retry on request timeouts until it succeeds:
|
|
19
|
+
|
|
20
|
+
while (true) {
|
|
21
|
+
|
|
22
|
+
try {
|
|
23
|
+
|
|
24
|
+
await exchange.loadMarkets ();
|
|
25
|
+
break;
|
|
26
|
+
|
|
27
|
+
} catch (e) {
|
|
28
|
+
|
|
29
|
+
if (e instanceof ccxt.RequestTimeout)
|
|
30
|
+
console.log (exchange.iso8601 (Date.now ()), e.constructor.name, e.message)
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const symbol = 'ETH/BTC'
|
|
35
|
+
const orderType = 'limit'
|
|
36
|
+
const side = 'sell'
|
|
37
|
+
const amount = 0.321;
|
|
38
|
+
const price = 0.123;
|
|
39
|
+
|
|
40
|
+
// try just one attempt to create an order
|
|
41
|
+
|
|
42
|
+
try {
|
|
43
|
+
|
|
44
|
+
const response = await exchange.createOrder (symbol, orderType, side, amount, price);
|
|
45
|
+
console.log (response);
|
|
46
|
+
console.log ('Succeeded');
|
|
47
|
+
|
|
48
|
+
} catch (e) {
|
|
49
|
+
|
|
50
|
+
console.log (exchange.iso8601 (Date.now ()), e.constructor.name, e.message)
|
|
51
|
+
console.log ('Failed');
|
|
52
|
+
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
}) ()
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
// @ts-nocheck
|
|
2
|
+
import ccxt from '../../js/ccxt.js';
|
|
3
|
+
// AUTO-TRANSPILE //
|
|
4
|
+
console.log('CCXT Version:', ccxt.version);
|
|
5
|
+
// ------------------------------------------------------------------------------
|
|
6
|
+
async function example() {
|
|
7
|
+
// at this moment, only OKX support embedded stop-loss & take-profit orders in unified manner. other exchanges are being added actively and will be available soon.
|
|
8
|
+
const exchange = new ccxt.okx({
|
|
9
|
+
"apiKey": "YOUR_API_KEY",
|
|
10
|
+
"secret": "YOUR_API_SECRET",
|
|
11
|
+
"password": "YOUR_API_PASSWORD", // if exchange does not require password, comment out this line
|
|
12
|
+
});
|
|
13
|
+
const symbol = 'DOGE/USDT:USDT';
|
|
14
|
+
const side = 'buy'; // 'buy' | 'sell'
|
|
15
|
+
const order_type = 'limit'; // 'market' | 'limit'
|
|
16
|
+
const amount = 1; // how many contracts (see `market(symbol).contractSize` to find out coin portion per one contract)
|
|
17
|
+
await exchange.loadMarkets();
|
|
18
|
+
const market = exchange.market(symbol);
|
|
19
|
+
const ticker = await exchange.fetchTicker(symbol);
|
|
20
|
+
const last_price = ticker['last'];
|
|
21
|
+
const ask_price = ticker['ask'];
|
|
22
|
+
const bid_price = ticker['bid'];
|
|
23
|
+
// if order_type is 'market', then price is not needed
|
|
24
|
+
let price = undefined;
|
|
25
|
+
// if order_type is 'limit', then set a price at your desired level
|
|
26
|
+
if (order_type === 'limit') {
|
|
27
|
+
price = (side === 'buy') ? bid_price * 0.95 : ask_price * 1.05; // i.e. 5% from current price
|
|
28
|
+
}
|
|
29
|
+
// set trigger price for stop-loss/take-profit to 2% from current price
|
|
30
|
+
// (note, across different exchanges "trigger" price can be also mentioned with different synonyms, like "activation price", "stop price", "conditional price", etc. )
|
|
31
|
+
const stop_loss_trigger_price = (order_type === 'market' ? last_price : price) * (side === 'buy' ? 0.98 : 1.02);
|
|
32
|
+
const take_profit_trigger_price = (order_type === 'market' ? last_price : price) * (side === 'buy' ? 1.02 : 0.98);
|
|
33
|
+
// when symbol's price reaches your predefined "trigger price", stop-loss order would be activated as a "market order". but if you want it to be activated as a "limit order", then set a 'price' parameter for it
|
|
34
|
+
const params = {
|
|
35
|
+
'stopLoss': {
|
|
36
|
+
'triggerPrice': stop_loss_trigger_price,
|
|
37
|
+
// set a 'price' to act as limit order, otherwise remove it for a market order
|
|
38
|
+
'price': stop_loss_trigger_price * 0.98,
|
|
39
|
+
},
|
|
40
|
+
'takeProfit': {
|
|
41
|
+
'triggerPrice': take_profit_trigger_price,
|
|
42
|
+
// set a 'price' to act as limit order, otherwise remove it for a market order
|
|
43
|
+
'price': take_profit_trigger_price * 0.98,
|
|
44
|
+
},
|
|
45
|
+
// note that some exchanges might require some exchange specific parameter when opening a position, i.e.:
|
|
46
|
+
// 'posSide': 'long', // for phemex hedge-mode api
|
|
47
|
+
};
|
|
48
|
+
const position_amount = market['contractSize'] * amount;
|
|
49
|
+
const position_value = position_amount * last_price;
|
|
50
|
+
// log
|
|
51
|
+
console.log('Going to open a position', 'for', amount, 'contracts worth', position_amount, market['base'], '~', position_value, market['settle'], 'using', side, order_type, 'order (', (order_type === 'limit' ? exchange.priceToPrecision(symbol, price) : ''), '), using the following params:');
|
|
52
|
+
console.log(params);
|
|
53
|
+
console.log('-----------------------------------------------------------------------');
|
|
54
|
+
// exchange.verbose = True // uncomment for debugging purposes if necessary
|
|
55
|
+
try {
|
|
56
|
+
const created_order = await exchange.createOrder(symbol, order_type, side, amount, price, params);
|
|
57
|
+
console.log("Created an order", created_order);
|
|
58
|
+
// Fetch all your open orders for this symbol
|
|
59
|
+
// - use 'fetchOpenOrders' or 'fetchOrders' and filter with 'open' status
|
|
60
|
+
// - note, that some exchanges might return one order object with embedded stoploss/takeprofit fields, while other exchanges might have separate stoploss/takeprofit order objects
|
|
61
|
+
const all_open_orders = await exchange.fetchOpenOrders(symbol);
|
|
62
|
+
console.log("Fetched all your orders for this symbol", all_open_orders);
|
|
63
|
+
// To cancel a limit order, use "exchange.cancel_order(created_order['id'], symbol)""
|
|
64
|
+
}
|
|
65
|
+
catch (e) {
|
|
66
|
+
console.log(e.toString());
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
await example();
|
|
70
|
+
// NOTES:
|
|
71
|
+
// - Sometimes you might experience, when their stop-loss/take-profit order might not become activated, even though on chart the price had crossed that "trigger-price" order was not executed . That happens because some exchange might be using mark-price (instead of last-price) as a reference-price, so that mark-price might reach your trigger-price and it would activate your SL/TP order (even though on your symbol's chart you are viewing the "last-price" by default, which could have different movements than the mark-price).
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
import ccxt from '../../js/ccxt.js';
|
|
4
|
+
|
|
5
|
+
// ----------------------------------------------------------------------------
|
|
6
|
+
|
|
7
|
+
const tryToCreateOrder = async function (exchange, symbol, type, side, amount, price, params) {
|
|
8
|
+
|
|
9
|
+
try {
|
|
10
|
+
|
|
11
|
+
const order = await exchange.createOrder (symbol, type, side, amount, price, params)
|
|
12
|
+
return order
|
|
13
|
+
|
|
14
|
+
} catch (e) {
|
|
15
|
+
|
|
16
|
+
console.log (e.constructor.name, e.message)
|
|
17
|
+
|
|
18
|
+
if (e instanceof ccxt.NetworkError) {
|
|
19
|
+
|
|
20
|
+
// retry on networking errors
|
|
21
|
+
return false
|
|
22
|
+
|
|
23
|
+
} else {
|
|
24
|
+
|
|
25
|
+
throw e // break on all other exceptions
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// ----------------------------------------------------------------------------
|
|
31
|
+
|
|
32
|
+
const exchange = new ccxt.bytetrade ({
|
|
33
|
+
'apiKey': 'classic123', // edit here
|
|
34
|
+
'secret': 'ebcefff7de475ffe15e864ca3e3e410edf7e94fffd1f9af34edf9434e2bfff1b', // edit here
|
|
35
|
+
})
|
|
36
|
+
|
|
37
|
+
//
|
|
38
|
+
// make a classic bytetrade account - one that is linked to an email or phone number
|
|
39
|
+
// then click on your username in the top right and then export
|
|
40
|
+
// you will get a file like this:
|
|
41
|
+
//
|
|
42
|
+
// future garage icon motion panda garage motion task science head garage notable
|
|
43
|
+
// ebcefff7de475ffe15e864ca3e3e410edf7e94fffd1f9af34edf9434e2bfff1b
|
|
44
|
+
// classic123
|
|
45
|
+
//
|
|
46
|
+
// the second line is your secret and the third line is your apiKey
|
|
47
|
+
//
|
|
48
|
+
|
|
49
|
+
const symbol = 'XRP/USDT' // edit here
|
|
50
|
+
const type = 'limit ' // edit here
|
|
51
|
+
const side = 'buy' // edit here
|
|
52
|
+
const amount = 10 // edit here
|
|
53
|
+
const price = 1 // edit here
|
|
54
|
+
const params = {} // edit here
|
|
55
|
+
|
|
56
|
+
;(async () => {
|
|
57
|
+
let order = false
|
|
58
|
+
while (true) {
|
|
59
|
+
order = await tryToCreateOrder (exchange, symbol, type, side, amount, price, params)
|
|
60
|
+
if (order !== false) {
|
|
61
|
+
break
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
console.log (order)
|
|
65
|
+
}) ()
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import ccxt from '../../js/ccxt.js';
|
|
2
|
+
// AUTO-TRANSPILE //
|
|
3
|
+
async function example() {
|
|
4
|
+
const exchange = new ccxt.pro.binance({
|
|
5
|
+
'apiKey': 'MY_API_KEY',
|
|
6
|
+
'secret': 'MY_SECRET',
|
|
7
|
+
});
|
|
8
|
+
exchange.setSandboxMode(true);
|
|
9
|
+
exchange.verbose = true; // uncomment for debugging purposes if necessary
|
|
10
|
+
// load markets
|
|
11
|
+
await exchange.loadMarkets();
|
|
12
|
+
const symbol = 'ETH/USDT';
|
|
13
|
+
const type = 'limit';
|
|
14
|
+
const side = 'buy';
|
|
15
|
+
const amount = 0.01;
|
|
16
|
+
let price = 1000;
|
|
17
|
+
let orders = [];
|
|
18
|
+
for (let i = 1; i < 5; i++) {
|
|
19
|
+
const response = await exchange.createOrderWs(symbol, type, side, amount, price);
|
|
20
|
+
price += i;
|
|
21
|
+
orders.push(response);
|
|
22
|
+
}
|
|
23
|
+
console.log(orders);
|
|
24
|
+
}
|
|
25
|
+
await example();
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import ccxt from '../../js/ccxt.js';
|
|
2
|
+
// AUTO-TRANSPILE //
|
|
3
|
+
async function example() {
|
|
4
|
+
const exchange = new ccxt.binance({
|
|
5
|
+
'apiKey': 'MY_API_KEY',
|
|
6
|
+
'secret': 'MY_SECRET',
|
|
7
|
+
});
|
|
8
|
+
exchange.setSandboxMode(true);
|
|
9
|
+
await exchange.loadMarkets();
|
|
10
|
+
exchange.verbose = true; // uncomment for debugging purposes if necessary
|
|
11
|
+
const orders = await exchange.createOrders([
|
|
12
|
+
{ 'symbol': 'LTC/USDT:USDT', 'type': 'limit', 'side': 'buy', 'amount': 10, 'price': 55 },
|
|
13
|
+
{ 'symbol': 'ETH/USDT:USDT', 'type': 'market', 'side': 'buy', 'amount': 0.5 },
|
|
14
|
+
]);
|
|
15
|
+
console.log(orders);
|
|
16
|
+
}
|
|
17
|
+
await example();
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import ccxt from '../../js/ccxt.js';
|
|
2
|
+
// AUTO-TRANSPILE //
|
|
3
|
+
async function example() {
|
|
4
|
+
const exchange = new ccxt.bingx({
|
|
5
|
+
'apiKey': 'MY_API_KEY',
|
|
6
|
+
'secret': 'MY_SECRET',
|
|
7
|
+
});
|
|
8
|
+
// exchange.setSandboxMode (true);
|
|
9
|
+
// exchange.verbose = true; // uncomment for debugging purposes if necessary
|
|
10
|
+
await exchange.loadMarkets();
|
|
11
|
+
const symbol = 'BTC/USDT:USDT';
|
|
12
|
+
const order_type = 'market';
|
|
13
|
+
const side = 'sell';
|
|
14
|
+
const amount = 0.0001;
|
|
15
|
+
const price = undefined;
|
|
16
|
+
const reduceOnly = true;
|
|
17
|
+
const trailingAmount = 100;
|
|
18
|
+
// const trailingTriggerPrice = undefined; // not supported on all exchanges
|
|
19
|
+
const params = {
|
|
20
|
+
'reduceOnly': reduceOnly,
|
|
21
|
+
'trailingAmount': trailingAmount,
|
|
22
|
+
// 'trailingTriggerPrice': trailingTriggerPrice,
|
|
23
|
+
};
|
|
24
|
+
try {
|
|
25
|
+
const create_order = await exchange.createOrder(symbol, order_type, side, amount, price, params);
|
|
26
|
+
// Alternatively use the createTrailingAmountOrder method:
|
|
27
|
+
// const create_order = await exchange.createTrailingAmountOrder (symbol, order_type, side, amount, price, trailingAmount, trailingTriggerPrice, {
|
|
28
|
+
// 'reduceOnly': reduceOnly,
|
|
29
|
+
// });
|
|
30
|
+
console.log(create_order);
|
|
31
|
+
}
|
|
32
|
+
catch (e) {
|
|
33
|
+
console.log(e.toString());
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
await example();
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import ccxt from '../../js/ccxt.js';
|
|
2
|
+
// AUTO-TRANSPILE //
|
|
3
|
+
async function example() {
|
|
4
|
+
const exchange = new ccxt.bingx({
|
|
5
|
+
'apiKey': 'MY_API_KEY',
|
|
6
|
+
'secret': 'MY_SECRET',
|
|
7
|
+
});
|
|
8
|
+
// exchange.setSandboxMode (true);
|
|
9
|
+
// exchange.verbose = true; // uncomment for debugging purposes if necessary
|
|
10
|
+
await exchange.loadMarkets();
|
|
11
|
+
const symbol = 'BTC/USDT:USDT';
|
|
12
|
+
const order_type = 'market';
|
|
13
|
+
const side = 'sell';
|
|
14
|
+
const amount = 0.0001;
|
|
15
|
+
const price = undefined;
|
|
16
|
+
const reduceOnly = true;
|
|
17
|
+
const trailingPercent = 10;
|
|
18
|
+
// const trailingTriggerPrice = undefined; // not supported on all exchanges
|
|
19
|
+
const params = {
|
|
20
|
+
'reduceOnly': reduceOnly,
|
|
21
|
+
'trailingPercent': trailingPercent,
|
|
22
|
+
// 'trailingTriggerPrice': trailingTriggerPrice,
|
|
23
|
+
};
|
|
24
|
+
try {
|
|
25
|
+
const create_order = await exchange.createOrder(symbol, order_type, side, amount, price, params);
|
|
26
|
+
// Alternatively use the createTrailingAmountOrder method:
|
|
27
|
+
// const create_order = await exchange.createTrailingPercentOrder (symbol, order_type, side, amount, price, trailingPercent, trailingTriggerPrice, {
|
|
28
|
+
// 'reduceOnly': reduceOnly,
|
|
29
|
+
// });
|
|
30
|
+
console.log(create_order);
|
|
31
|
+
}
|
|
32
|
+
catch (e) {
|
|
33
|
+
console.log(e.toString());
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
await example();
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
{
|
|
2
|
+
"hitbtc": { "apiKey": "b6aad581670b30fb25d1c91cdbe8ca5c", "secret": "fa394ced37a488f9b5826a2d9ce39ae3" },
|
|
3
|
+
"bitso": { "apiKey": "xZnHRmdlgJ", "secret": "e156bb7f7ab3a831afbc7a80f7866b9e" },
|
|
4
|
+
"coincheck": { "apiKey": "dCyzY2T6w0DFhaco", "secret": "JpI0eMmxfa0tEpk3X-dNwyclSASJkl-S" }
|
|
5
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
// @ts-nocheck
|
|
2
|
+
// to set custom "proxy-agent" for ccxt
|
|
3
|
+
import ccxt from 'ccxt';
|
|
4
|
+
import HttpProxyAgent from 'http-proxy-agent';
|
|
5
|
+
const proxy = 'http://1.2.3.4:5678';
|
|
6
|
+
const agent = new HttpProxyAgent(proxy); // or HttpsProxyAgent if you need http
|
|
7
|
+
// then pass it through constructor:
|
|
8
|
+
const kraken = new ccxt.kraken({ agent });
|
|
9
|
+
// or set it later:
|
|
10
|
+
kraken.agent = agent;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
import ccxt from '../../js/ccxt.js';
|
|
4
|
+
|
|
5
|
+
(async function main () {
|
|
6
|
+
|
|
7
|
+
const kraken1 = new ccxt.kraken ({
|
|
8
|
+
proxy: function (url) {
|
|
9
|
+
return 'https://example.com/?url=' + encodeURIComponent (url)
|
|
10
|
+
},
|
|
11
|
+
})
|
|
12
|
+
|
|
13
|
+
console.log (await kraken1.loadMarkets ())
|
|
14
|
+
|
|
15
|
+
const kraken2 = new ccxt.kraken ({
|
|
16
|
+
proxy: function (url) {
|
|
17
|
+
return 'https://cors-anywhere.herokuapp.com/' + url
|
|
18
|
+
},
|
|
19
|
+
})
|
|
20
|
+
|
|
21
|
+
console.log (await kraken2.loadMarkets ())
|
|
22
|
+
|
|
23
|
+
}) ()
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import ccxt from '../../js/ccxt.js';
|
|
2
|
+
|
|
3
|
+
console.log ('CCXT Version:', ccxt.version);
|
|
4
|
+
|
|
5
|
+
function getMaxLeverage (market, positionSize) {
|
|
6
|
+
/**
|
|
7
|
+
* @description Equation taken from https://www.delta.exchange/contracts/
|
|
8
|
+
* @param {object} market CCXT market
|
|
9
|
+
* @param {float} positionSize The value of the position in quote currency
|
|
10
|
+
* @returns The maximum leverage available for the market for the given position size
|
|
11
|
+
*/
|
|
12
|
+
const info = market['info'];
|
|
13
|
+
const maxLeverageNotional = Number (info['max_leverage_notional']);
|
|
14
|
+
const initialMarginScalingFactor = Number (info['initial_margin_scaling_factor']);
|
|
15
|
+
let initialMargin = Number (info['initial_margin']);
|
|
16
|
+
|
|
17
|
+
if (positionSize <= maxLeverageNotional) {
|
|
18
|
+
const initialMarginRatio = initialMargin / 100;
|
|
19
|
+
return 1 / initialMarginRatio;
|
|
20
|
+
} else {
|
|
21
|
+
initialMargin = initialMargin + (initialMarginScalingFactor * (positionSize - maxLeverageNotional));
|
|
22
|
+
const initialMarginRatio = initialMargin / 100;
|
|
23
|
+
return 1 / initialMarginRatio;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function getMaintenanceMarginRate (market, positionSize) {
|
|
28
|
+
/**
|
|
29
|
+
* @description Equation taken from https://www.delta.exchange/contracts/
|
|
30
|
+
* @param {object} market CCXT market
|
|
31
|
+
* @param {float} positionSize The value of the position in quote currency
|
|
32
|
+
* @returns The maintenance margin rate as a percentage for the market with the given position size
|
|
33
|
+
*/
|
|
34
|
+
const info = market['info'];
|
|
35
|
+
const maxLeverageNotional = Number (info['max_leverage_notional']);
|
|
36
|
+
const maintenanceMarginScalingFactor = Number (info['maintenance_margin_scaling_factor']);
|
|
37
|
+
const maintenanceMargin = Number (info['maintenance_margin']);
|
|
38
|
+
|
|
39
|
+
if (positionSize <= maxLeverageNotional) {
|
|
40
|
+
return maintenanceMargin;
|
|
41
|
+
} else {
|
|
42
|
+
return maintenanceMargin + (maintenanceMarginScalingFactor * (positionSize - maxLeverageNotional));
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
async function main () {
|
|
47
|
+
|
|
48
|
+
const exchange = new ccxt.delta();
|
|
49
|
+
await exchange.loadMarkets ();
|
|
50
|
+
|
|
51
|
+
const symbol = 'ADA/USDT:USDT';
|
|
52
|
+
const market = exchange.market (symbol);
|
|
53
|
+
|
|
54
|
+
// Gets the maximum leverage and maintenance margin rate for a position worth 100,000 USDT on the ADA/USDT:USDT market
|
|
55
|
+
const maxLeverage = getMaxLeverage(market, 100000);
|
|
56
|
+
const maintenanceMarginRate = getMaintenanceMarginRate(market, 100000);
|
|
57
|
+
console.log(maxLeverage, maintenanceMarginRate);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
main ()
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
// ----------------------------------------------------------------------------
|
|
4
|
+
|
|
5
|
+
import ccxt from '../../js/ccxt.js';
|
|
6
|
+
import ololog from 'ololog'
|
|
7
|
+
|
|
8
|
+
// ----------------------------------------------------------------------------
|
|
9
|
+
|
|
10
|
+
const log = ololog.configure.handleNodeErrors (), asTable = require("as-table").configure({ delimiter: " | " });
|
|
11
|
+
|
|
12
|
+
// ----------------------------------------------------------------------------
|
|
13
|
+
|
|
14
|
+
(async () => {
|
|
15
|
+
|
|
16
|
+
const exchange = new ccxt.coinbase ({
|
|
17
|
+
verbose: process.argv.includes ('--verbose'),
|
|
18
|
+
timeout: 60000,
|
|
19
|
+
apiKey: process.env.KEY,
|
|
20
|
+
secret: process.env.SECRET
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
const balance = await exchange.fetchBalance ()
|
|
24
|
+
log.green (balance)
|
|
25
|
+
|
|
26
|
+
})()
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
import ccxt from '../../js/ccxt.js';
|
|
4
|
+
|
|
5
|
+
const verbose = process.argv.includes ('--verbose');
|
|
6
|
+
|
|
7
|
+
//-----------------------------------------------------------------------------
|
|
8
|
+
|
|
9
|
+
const printSupportedExchanges = () => console.log ('Supported exchanges:', ccxt.exchanges.join (', '))
|
|
10
|
+
|
|
11
|
+
const printUsage = () => {
|
|
12
|
+
console.log ('Usage: node', process.argv[1], 'id'.green)
|
|
13
|
+
printSupportedExchanges ()
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
const run = async (id) => {
|
|
17
|
+
|
|
18
|
+
// check if the exchange is supported by ccxt
|
|
19
|
+
const exchangeFound = ccxt.exchanges.indexOf (id) > -1
|
|
20
|
+
|
|
21
|
+
if (exchangeFound) {
|
|
22
|
+
|
|
23
|
+
console.log ('Instantiating', id, 'exchange')
|
|
24
|
+
|
|
25
|
+
// instantiate the exchange by id
|
|
26
|
+
const exchange = new ccxt[id] ({ verbose })
|
|
27
|
+
|
|
28
|
+
// try to load markets and catch the errors if any
|
|
29
|
+
try {
|
|
30
|
+
|
|
31
|
+
await exchange.loadMarkets ()
|
|
32
|
+
|
|
33
|
+
} catch (e) {
|
|
34
|
+
|
|
35
|
+
if (e instanceof ccxt.NetworkError) {
|
|
36
|
+
console.log (exchange.id, 'loadMarkets failed due to a network error:', e.message)
|
|
37
|
+
} else if (e instanceof ccxt.ExchangeError) {
|
|
38
|
+
console.log (exchange.id, 'loadMarkets failed due to exchange error:', e.message)
|
|
39
|
+
} else {
|
|
40
|
+
console.log (exchange.id, 'loadMarkets failed with:', e.message)
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// rethrow the error "higher up" the call chain
|
|
44
|
+
throw e
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// try to fetch a ticker and catch the errors if any
|
|
48
|
+
try {
|
|
49
|
+
|
|
50
|
+
const symbol = 'ETH/BTC'
|
|
51
|
+
const response = await exchange.fetchTicker (symbol)
|
|
52
|
+
console.log (response)
|
|
53
|
+
|
|
54
|
+
} catch (e) {
|
|
55
|
+
|
|
56
|
+
if (e instanceof ccxt.NetworkError) {
|
|
57
|
+
console.log (exchange.id, 'fetchTicker failed due to a network error:', e.message)
|
|
58
|
+
} else if (e instanceof ccxt.ExchangeError) {
|
|
59
|
+
console.log (exchange.id, 'fetchTicker failed due to exchange error:', e.message)
|
|
60
|
+
} else {
|
|
61
|
+
console.log (exchange.id, 'fetchTicker failed with:', e.message)
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// rethrow the error "higher up" the call chain
|
|
65
|
+
throw e
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
} else {
|
|
69
|
+
|
|
70
|
+
console.log ('Exchange', id, 'not found')
|
|
71
|
+
printSupportedExchanges ()
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
;(async function main () {
|
|
76
|
+
|
|
77
|
+
if (process.argv.length > 2) {
|
|
78
|
+
|
|
79
|
+
let id = process.argv[2]
|
|
80
|
+
await run (id)
|
|
81
|
+
|
|
82
|
+
} else {
|
|
83
|
+
|
|
84
|
+
printUsage ()
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
process.exit ()
|
|
88
|
+
|
|
89
|
+
}) ()
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
import ccxt from '../../js/ccxt.js';
|
|
4
|
+
import ololog from 'ololog';
|
|
5
|
+
import ansicolor from 'ansicolor';
|
|
6
|
+
import asTable from 'as-table';
|
|
7
|
+
|
|
8
|
+
const { noLocate } = ololog;
|
|
9
|
+
const log = noLocate;
|
|
10
|
+
|
|
11
|
+
ansicolor.nice
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
const csv = process.argv.includes ('--csv'), delimiter = csv ? ',' : '|', asTableConfig = { delimiter: ' ' + delimiter + ' ', /* print: require ('string.ify').noPretty */ }
|
|
16
|
+
|
|
17
|
+
asTable.configure (asTableConfig);
|
|
18
|
+
|
|
19
|
+
const sortCertified = process.argv.includes ('--sort-certified') || process.argv.includes ('--certified')
|
|
20
|
+
const exchangesArgument = process.argv.find (arg => arg.startsWith ('--exchanges='))
|
|
21
|
+
const exchangesArgumentParts = exchangesArgument ? exchangesArgument.split ('=') : []
|
|
22
|
+
const selectedExchanges = (exchangesArgumentParts.length > 1) ? exchangesArgumentParts[1].split (',') : []
|
|
23
|
+
|
|
24
|
+
console.log (ccxt.iso8601 (ccxt.milliseconds ()))
|
|
25
|
+
console.log ('CCXT v' + ccxt.version)
|
|
26
|
+
|
|
27
|
+
async function main () {
|
|
28
|
+
|
|
29
|
+
let total = 0
|
|
30
|
+
let notImplemented = 0
|
|
31
|
+
let inexistentApi = 0
|
|
32
|
+
let implemented = 0
|
|
33
|
+
let emulated = 0
|
|
34
|
+
|
|
35
|
+
const exchangeNames = ccxt.exchanges
|
|
36
|
+
let exchanges = exchangeNames.map (id => new ccxt[id] ())
|
|
37
|
+
exchanges = exchanges.map (exchange => exchange.pro ? new ccxt.pro[exchange.id] () : exchange)
|
|
38
|
+
if (sortCertified) {
|
|
39
|
+
exchanges.sort((a, b) => {
|
|
40
|
+
if (a.certified && !b.certified) {
|
|
41
|
+
return -1;
|
|
42
|
+
} else if (!a.certified && b.certified) {
|
|
43
|
+
return 1;
|
|
44
|
+
} else {
|
|
45
|
+
return 0;
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
const metainfo = ccxt.flatten (exchanges.map (exchange => Object.keys (exchange.has)))
|
|
50
|
+
const reduced = metainfo.reduce ((previous, current) => {
|
|
51
|
+
previous[current] = (previous[current] || 0) + 1
|
|
52
|
+
return previous
|
|
53
|
+
}, {})
|
|
54
|
+
const unified = Object.entries (reduced).filter (([ _, count ]) => count > 1)
|
|
55
|
+
const methods = unified.map (([ method, _ ]) => method).sort ()
|
|
56
|
+
if (selectedExchanges.length > 0) {
|
|
57
|
+
exchanges = exchanges.filter ((exchange) => selectedExchanges.includes(exchange.id))
|
|
58
|
+
}
|
|
59
|
+
const table = asTable (exchanges.map (exchange => {
|
|
60
|
+
let result = {};
|
|
61
|
+
const basics = [
|
|
62
|
+
'CORS',
|
|
63
|
+
'spot',
|
|
64
|
+
'margin',
|
|
65
|
+
'swap',
|
|
66
|
+
'future',
|
|
67
|
+
'option',
|
|
68
|
+
];
|
|
69
|
+
|
|
70
|
+
ccxt.unique (basics.concat (methods)).forEach (key => {
|
|
71
|
+
|
|
72
|
+
total += 1
|
|
73
|
+
|
|
74
|
+
let coloredString = '';
|
|
75
|
+
|
|
76
|
+
const feature = exchange.has[key]
|
|
77
|
+
const isFunction = (typeof exchange[key] === 'function')
|
|
78
|
+
const isBasic = basics.includes (key)
|
|
79
|
+
|
|
80
|
+
if (feature === false) {
|
|
81
|
+
// if explicitly set to 'false' in exchange.has (to exclude mistake, we check if it's undefined too)
|
|
82
|
+
coloredString = exchange.id.red.dim
|
|
83
|
+
inexistentApi += 1
|
|
84
|
+
} else if (feature === 'emulated') {
|
|
85
|
+
// if explicitly set to 'emulated' in exchange.has
|
|
86
|
+
coloredString = exchange.id.yellow
|
|
87
|
+
emulated += 1
|
|
88
|
+
} else if (feature) {
|
|
89
|
+
if (isBasic) {
|
|
90
|
+
// if neither 'false' nor 'emulated', and if method exists
|
|
91
|
+
coloredString = exchange.id.green
|
|
92
|
+
implemented += 1
|
|
93
|
+
} else {
|
|
94
|
+
if (isFunction) {
|
|
95
|
+
coloredString = exchange.id.green
|
|
96
|
+
implemented += 1
|
|
97
|
+
} else {
|
|
98
|
+
// the feature is available in exchange.has and not implemented
|
|
99
|
+
// this is an error
|
|
100
|
+
coloredString = exchange.id.lightMagenta
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
} else {
|
|
104
|
+
coloredString = exchange.id.lightRed
|
|
105
|
+
notImplemented += 1
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
result[key] = coloredString
|
|
109
|
+
})
|
|
110
|
+
|
|
111
|
+
return result
|
|
112
|
+
}))
|
|
113
|
+
|
|
114
|
+
if (csv) {
|
|
115
|
+
let lines = table.split ("\n")
|
|
116
|
+
lines = lines.slice (0, 1).concat (lines.slice (2))
|
|
117
|
+
log (lines.join ("\n"))
|
|
118
|
+
} else {
|
|
119
|
+
log (table)
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
log ('Summary: ',
|
|
123
|
+
ccxt.exchanges.length.toString (), 'exchanges; ',
|
|
124
|
+
'Methods [' + total.toString () + ' total]: ',
|
|
125
|
+
implemented.toString ().green, 'implemented,',
|
|
126
|
+
emulated.toString ().yellow, 'emulated,',
|
|
127
|
+
(inexistentApi.toString ().red.dim), 'inexistentApi,',
|
|
128
|
+
(notImplemented.toString ().lightRed), 'notImplemented',
|
|
129
|
+
)
|
|
130
|
+
|
|
131
|
+
log("\nMessy? Try piping to less (e.g. node script.js | less -S -R)\n".red)
|
|
132
|
+
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
main ()
|