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,68 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const ccxt = require ('ccxt');
|
|
4
|
+
const asTable = require ('as-table').configure ({ delimiter: ' | ' })
|
|
5
|
+
|
|
6
|
+
console.log ('CCXT Version:', ccxt.version)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
async function loop (exchange, symbol, timeframe, completeCandlesOnly = false) {
|
|
10
|
+
const durationInSeconds = exchange.parseTimeframe (timeframe)
|
|
11
|
+
const durationInMs = durationInSeconds * 1000
|
|
12
|
+
while (true) {
|
|
13
|
+
try {
|
|
14
|
+
const trades = await exchange.watchTrades (symbol)
|
|
15
|
+
if (trades.length > 0) {
|
|
16
|
+
const currentMinute = parseInt (exchange.milliseconds () / durationInMs)
|
|
17
|
+
let ohlcvc = exchange.buildOHLCVC (trades, timeframe)
|
|
18
|
+
if (completeCandlesOnly) {
|
|
19
|
+
ohlcvc = ohlcvc.filter (candle => parseInt (candle[0] / durationInMs) < currentMinute)
|
|
20
|
+
}
|
|
21
|
+
if (ohlcvc.length > 0) {
|
|
22
|
+
console.log("Symbol:", symbol, "timeframe:", timeframe);
|
|
23
|
+
console.log ('-----------------------------------------------------------')
|
|
24
|
+
console.log (asTable (ohlcvc))
|
|
25
|
+
console.log ('-----------------------------------------------------------')
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
} catch (e) {
|
|
29
|
+
console.log (symbol, e)
|
|
30
|
+
// do nothing and retry on next loop iteration
|
|
31
|
+
// throw e // uncomment to break all loops in case of an error in any one of them
|
|
32
|
+
// break // you can also break just this one loop if it fails
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
async function main () {
|
|
38
|
+
// select the exchange
|
|
39
|
+
const exchange = new ccxt.pro.ftx ()
|
|
40
|
+
|
|
41
|
+
if (exchange.has['watchTrades']) {
|
|
42
|
+
await exchange.loadMarkets ()
|
|
43
|
+
// Change this value accordingly
|
|
44
|
+
const timeframe = '1m'
|
|
45
|
+
|
|
46
|
+
const allSymbols = exchange.symbols;
|
|
47
|
+
|
|
48
|
+
// arbitrary n symbols
|
|
49
|
+
const limit = 5;
|
|
50
|
+
// const selectedSymbols = allSymbols.slice(0, limit);
|
|
51
|
+
// you can also specify the symbols manually
|
|
52
|
+
// example:
|
|
53
|
+
// const selectedSymbols = ['BTC/USDT', 'LTC/USDT']
|
|
54
|
+
|
|
55
|
+
console.log(selectedSymbols);
|
|
56
|
+
|
|
57
|
+
// Use this variable to choose if only complete candles
|
|
58
|
+
// should be considered
|
|
59
|
+
const completeCandlesOnly = true
|
|
60
|
+
|
|
61
|
+
await Promise.all (selectedSymbols.map (symbol => loop (exchange, symbol, timeframe, completeCandlesOnly)))
|
|
62
|
+
|
|
63
|
+
} else {
|
|
64
|
+
console.log (exchange.id, 'does not support watchTrades yet')
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
main ()
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const ccxt = require ('../../../ccxt');
|
|
4
|
+
|
|
5
|
+
console.log ('CCXT Version:', ccxt.version)
|
|
6
|
+
|
|
7
|
+
let ohlcvs = {}
|
|
8
|
+
|
|
9
|
+
async function log (exchange, symbol, timeframe) {
|
|
10
|
+
const market = exchange.market (symbol)
|
|
11
|
+
const duration = exchange.parseTimeframe (timeframe) * 1000
|
|
12
|
+
console.log (exchange.iso8601 (exchange.milliseconds ()), 'Warming up, waiting for at least one trade...')
|
|
13
|
+
while (!Object.keys (ohlcvs).length) {
|
|
14
|
+
await exchange.throttle (1)
|
|
15
|
+
}
|
|
16
|
+
let now = exchange.milliseconds ()
|
|
17
|
+
const start = (parseInt (now / duration) + 1) * duration
|
|
18
|
+
console.log (exchange.iso8601 (exchange.milliseconds ()), 'Trades started arriving, waiting till', exchange.iso8601 (start))
|
|
19
|
+
await exchange.sleep (start - now)
|
|
20
|
+
console.log (exchange.iso8601 (exchange.milliseconds ()), 'Done warming up')
|
|
21
|
+
for (let i = 0;; i++) {
|
|
22
|
+
now = exchange.milliseconds ()
|
|
23
|
+
let candle = Object.values (ohlcvs)[0]
|
|
24
|
+
console.log ('')
|
|
25
|
+
console.log (exchange.iso8601 (now), '------------------------------------------------------')
|
|
26
|
+
console.log ('Datetime ', 'Timestamp ', ... [ 'Open', 'High', 'Low', 'Close', market['base'], market['quote'] ].map (x => x.toString ().padEnd (10, ' ')))
|
|
27
|
+
for (let j = start; j < now; j += duration) {
|
|
28
|
+
if (!(j in ohlcvs)) {
|
|
29
|
+
ohlcvs[j] = [ j, candle[4], candle[4], candle[4], candle[4], 0, 0 ]
|
|
30
|
+
}
|
|
31
|
+
candle = exchange.safeValue (ohlcvs, j);
|
|
32
|
+
console.log (exchange.iso8601 (j), ... candle.map (x => x.toString ().padEnd (10, ' ')))
|
|
33
|
+
}
|
|
34
|
+
ohlcvs = exchange.indexBy (Object.values (ohlcvs).slice (-1000), 0)
|
|
35
|
+
await exchange.sleep(1000)
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
async function watch (exchange, symbol, timeframe) {
|
|
40
|
+
console.log ('Starting', exchange.id, symbol)
|
|
41
|
+
const duration = exchange.parseTimeframe (timeframe) * 1000
|
|
42
|
+
while (true) {
|
|
43
|
+
try {
|
|
44
|
+
const trades = await exchange.watchTrades(symbol)
|
|
45
|
+
for (const trade of trades) {
|
|
46
|
+
const timestamp = parseInt(trade['timestamp'] / duration) * duration
|
|
47
|
+
let candle = exchange.safe_value(ohlcvs, timestamp)
|
|
48
|
+
if (candle) {
|
|
49
|
+
candle[2] = Math.max(trade['price'], candle[2])
|
|
50
|
+
candle[3] = Math.min(trade['price'], candle[3])
|
|
51
|
+
candle[4] = trade['price']
|
|
52
|
+
candle[5] = exchange.parseNumber(exchange.amountToPrecision(symbol, trade['amount'] + candle[5]))
|
|
53
|
+
candle[6] = exchange.parseNumber(exchange.costToPrecision(symbol, trade['cost'] + candle[6]))
|
|
54
|
+
} else {
|
|
55
|
+
candle = [
|
|
56
|
+
timestamp,
|
|
57
|
+
trade['price'],
|
|
58
|
+
trade['price'],
|
|
59
|
+
trade['price'],
|
|
60
|
+
trade['price'],
|
|
61
|
+
exchange.parseNumber(exchange.amountToPrecision(symbol, trade['amount'])),
|
|
62
|
+
exchange.parseNumber(exchange.costToPrecision(symbol, trade['cost'])),
|
|
63
|
+
]
|
|
64
|
+
}
|
|
65
|
+
ohlcvs[timestamp] = candle
|
|
66
|
+
}
|
|
67
|
+
} catch (e) {
|
|
68
|
+
console.log (e.constructor.name, e.message)
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
async function main() {
|
|
74
|
+
const symbol = 'BTC/USDT'
|
|
75
|
+
const exchange = new ccxt.pro.binance ({ 'newUpdates': true })
|
|
76
|
+
await exchange.loadMarkets ()
|
|
77
|
+
const timeframe = '1m'
|
|
78
|
+
await Promise.all ([ watch (exchange, symbol, timeframe), log (exchange, symbol, timeframe) ])
|
|
79
|
+
await exchange.close ()
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
main()
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const ccxt = require ('../../../ccxt');
|
|
4
|
+
|
|
5
|
+
console.log ('CCXT Version:', ccxt.version)
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
async function main() {
|
|
9
|
+
let ohlcvs = {}
|
|
10
|
+
const symbol = 'BTC/USDT'
|
|
11
|
+
const exchange = new ccxt.pro.binance ({ 'newUpdates': true })
|
|
12
|
+
await exchange.loadMarkets ()
|
|
13
|
+
const market = exchange.market (symbol)
|
|
14
|
+
const timeframe = '1m'
|
|
15
|
+
const duration = exchange.parseTimeframe (timeframe) * 1000
|
|
16
|
+
console.log ('Starting', exchange.id, symbol)
|
|
17
|
+
while (true) {
|
|
18
|
+
try {
|
|
19
|
+
const trades = await exchange.watchTrades(symbol)
|
|
20
|
+
for (const trade of trades) {
|
|
21
|
+
const timestamp = parseInt(trade['timestamp'] / duration) * duration
|
|
22
|
+
let candle = exchange.safe_value(ohlcvs, timestamp)
|
|
23
|
+
if (candle) {
|
|
24
|
+
candle[2] = Math.max(trade['price'], candle[2])
|
|
25
|
+
candle[3] = Math.min(trade['price'], candle[3])
|
|
26
|
+
candle[4] = trade['price']
|
|
27
|
+
candle[5] = exchange.parseNumber(exchange.amountToPrecision(symbol, trade['amount'] + candle[5]))
|
|
28
|
+
candle[6] = exchange.parseNumber(exchange.costToPrecision(symbol, trade['cost'] + candle[6]))
|
|
29
|
+
} else {
|
|
30
|
+
candle = [
|
|
31
|
+
timestamp,
|
|
32
|
+
trade['price'],
|
|
33
|
+
trade['price'],
|
|
34
|
+
trade['price'],
|
|
35
|
+
trade['price'],
|
|
36
|
+
exchange.parseNumber(exchange.amountToPrecision(symbol, trade['amount'])),
|
|
37
|
+
exchange.parseNumber(exchange.costToPrecision(symbol, trade['cost'])),
|
|
38
|
+
]
|
|
39
|
+
}
|
|
40
|
+
ohlcvs[timestamp] = candle
|
|
41
|
+
}
|
|
42
|
+
console.log ('')
|
|
43
|
+
console.log (exchange.iso8601 (exchange.milliseconds ()), '------------------------------------------------------')
|
|
44
|
+
const values = Object.values (ohlcvs).slice (-1000)
|
|
45
|
+
ohlcvs = exchange.indexBy (values, 0)
|
|
46
|
+
console.log ('Datetime ', 'Timestamp ', ... [ 'Open', 'High', 'Low', 'Close', market['base'], market['quote'] ].map (x => x.toString ().padEnd (10, ' ')))
|
|
47
|
+
for (let i = 0; i < values.length; i++) {
|
|
48
|
+
const candle = values[i]
|
|
49
|
+
console.log (exchange.iso8601 (candle[0]), ... candle.map (x => x.toString ().padEnd (10, ' ')))
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
} catch (e) {
|
|
53
|
+
console.log (e.constructor.name, e.message)
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
await exchange.close ()
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
main()
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/* ------------------------------------------------------------------------ */
|
|
4
|
+
|
|
5
|
+
const ccxt = require ('../../../ccxt.js').pro
|
|
6
|
+
, asTable = require ('as-table') // .configure ({ print: require ('string.ify').noPretty })
|
|
7
|
+
, log = require ('ololog').noLocate
|
|
8
|
+
, ansi = require ('ansicolor').nice
|
|
9
|
+
|
|
10
|
+
;(async function test () {
|
|
11
|
+
|
|
12
|
+
let total = 0
|
|
13
|
+
let missing = 0
|
|
14
|
+
let implemented = 0
|
|
15
|
+
let emulated = 0
|
|
16
|
+
|
|
17
|
+
const exchanges = ccxt.exchanges
|
|
18
|
+
.map (id => new ccxt[id]())
|
|
19
|
+
.filter (exchange => exchange.has.ws)
|
|
20
|
+
|
|
21
|
+
log (
|
|
22
|
+
asTable (
|
|
23
|
+
exchanges
|
|
24
|
+
.map (exchange => {
|
|
25
|
+
|
|
26
|
+
let result = {};
|
|
27
|
+
|
|
28
|
+
[
|
|
29
|
+
'ws',
|
|
30
|
+
'watchOrderBook',
|
|
31
|
+
'watchTicker',
|
|
32
|
+
'watchTrades',
|
|
33
|
+
'watchOHLCV',
|
|
34
|
+
'watchBalance',
|
|
35
|
+
'watchOrders',
|
|
36
|
+
'watchMyTrades',
|
|
37
|
+
|
|
38
|
+
].forEach (key => {
|
|
39
|
+
|
|
40
|
+
total += 1
|
|
41
|
+
|
|
42
|
+
let capability = (key in exchange.has) ?
|
|
43
|
+
exchange.has[key].toString () :
|
|
44
|
+
'undefined'
|
|
45
|
+
|
|
46
|
+
if (!exchange.has[key]) {
|
|
47
|
+
capability = exchange.id.red.dim
|
|
48
|
+
missing += 1
|
|
49
|
+
} else if (exchange.has[key] === 'emulated') {
|
|
50
|
+
capability = exchange.id.yellow
|
|
51
|
+
emulated += 1
|
|
52
|
+
} else {
|
|
53
|
+
capability = exchange.id.green
|
|
54
|
+
implemented += 1
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
result[key] = capability
|
|
58
|
+
})
|
|
59
|
+
|
|
60
|
+
return result
|
|
61
|
+
})
|
|
62
|
+
)
|
|
63
|
+
)
|
|
64
|
+
|
|
65
|
+
log ('Summary:',
|
|
66
|
+
exchanges.length.toString ().green, 'exchanges,',
|
|
67
|
+
implemented.toString ().green, 'methods implemented,',
|
|
68
|
+
emulated.toString ().yellow, 'emulated,',
|
|
69
|
+
missing.toString ().red, 'missing,',
|
|
70
|
+
total.toString (), 'total')
|
|
71
|
+
|
|
72
|
+
}) ()
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const ccxt = require ('../../../ccxt')
|
|
4
|
+
|
|
5
|
+
console.log ("CCXT Pro Version:", ccxt.version)
|
|
6
|
+
|
|
7
|
+
const orderbooks = {}
|
|
8
|
+
|
|
9
|
+
let run = true
|
|
10
|
+
|
|
11
|
+
async function watchOrderBook (exchange, symbol) {
|
|
12
|
+
while (run) {
|
|
13
|
+
try {
|
|
14
|
+
const orderbook = await exchange.watchOrderBook (symbol)
|
|
15
|
+
orderbooks[symbol] = orderbook
|
|
16
|
+
console.log (exchange.iso8601 (exchange.milliseconds ()), orderbook['datetime'], orderbook['nonce'], symbol, orderbook['asks'][0], orderbook['bids'][0])
|
|
17
|
+
} catch (e) {
|
|
18
|
+
console.log (e.constructor.name, e.message)
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
async function stop (exchange) {
|
|
25
|
+
await exchange.sleep (10000)
|
|
26
|
+
run = false
|
|
27
|
+
await exchange.close ()
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
async function main () {
|
|
32
|
+
const exchange = new ccxt.pro.binance ()
|
|
33
|
+
await exchange.loadMarkets ()
|
|
34
|
+
exchange.verbose = true
|
|
35
|
+
const symbols = [
|
|
36
|
+
'BTC/USDT',
|
|
37
|
+
'ETH/USDT',
|
|
38
|
+
]
|
|
39
|
+
stop (exchange).then (() => {})
|
|
40
|
+
await Promise.all (symbols.map (symbol => watchOrderBook (exchange, symbol)))
|
|
41
|
+
console.log ('Sleeping for a moment...')
|
|
42
|
+
await exchange.sleep (10000)
|
|
43
|
+
console.log ('Done')
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
main ()
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const ccxt = require ('ccxt')
|
|
4
|
+
|
|
5
|
+
console.log ("CCXT Pro Version:", ccxt.version)
|
|
6
|
+
|
|
7
|
+
async function loop (exchange, method, symbol) {
|
|
8
|
+
while (true) {
|
|
9
|
+
try {
|
|
10
|
+
const orderbook = await exchange[method] (symbol)
|
|
11
|
+
console.log (exchange.iso8601 (exchange.milliseconds ()), orderbook['datetime'], orderbook['nonce'], symbol, orderbook['asks'][0], orderbook['bids'][0])
|
|
12
|
+
} catch (e) {
|
|
13
|
+
console.log (e.constructor.name, e.message)
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
async function main () {
|
|
19
|
+
const exchange = new ccxt.pro.gateio ({
|
|
20
|
+
'options': {'defaultType':'swap'}
|
|
21
|
+
})
|
|
22
|
+
await exchange.loadMarkets ()
|
|
23
|
+
// exchange.verbose = true // uncomment for debugging purposes if necessary
|
|
24
|
+
const symbols = [
|
|
25
|
+
'ANC/USDT:USDT',
|
|
26
|
+
]
|
|
27
|
+
await Promise.all (symbols.map (symbol => loop (exchange, 'fetchOrderBook', symbol)))
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
main ()
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
const ccxt = require ('../../../ccxt')
|
|
2
|
+
|
|
3
|
+
console.log ('CCXT Pro version:', ccxt.version)
|
|
4
|
+
|
|
5
|
+
async function main () {
|
|
6
|
+
const exchange = new ccxt.pro.gateio ({
|
|
7
|
+
'apiKey': 'YOUR_API_KEY',
|
|
8
|
+
'secret': 'YOUR_SECRET',
|
|
9
|
+
})
|
|
10
|
+
await exchange.loadMarkets ()
|
|
11
|
+
exchange.verbose = true
|
|
12
|
+
while (true) {
|
|
13
|
+
try {
|
|
14
|
+
const response = await exchange.watchBalance ()
|
|
15
|
+
console.log (new Date (), response)
|
|
16
|
+
} catch (e) {
|
|
17
|
+
console.log (e.constructor.name, e.message)
|
|
18
|
+
await exchange.sleep (1000)
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
main ()
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const ccxt = require ('ccxt')
|
|
4
|
+
|
|
5
|
+
console.log ("CCXT Pro Version:", ccxt.version)
|
|
6
|
+
|
|
7
|
+
const orderbooks = {}
|
|
8
|
+
|
|
9
|
+
async function watchAllSymbols (exchange, symbols) {
|
|
10
|
+
while (true) {
|
|
11
|
+
const keys = Object.keys (orderbooks);
|
|
12
|
+
if (symbols.length === keys.length) {
|
|
13
|
+
console.log ('\n\n\n\n\n')
|
|
14
|
+
console.log ('----------------------------------------------------')
|
|
15
|
+
console.log ('All orderbooks received at least one update:');
|
|
16
|
+
for (let i = 0; i < symbols.length; i++) {
|
|
17
|
+
const symbol = symbols[i]
|
|
18
|
+
const orderbook = orderbooks[symbol]
|
|
19
|
+
console.log (exchange.iso8601 (exchange.milliseconds ()), orderbook['datetime'], orderbook['nonce'], symbol, orderbook['asks'][0], orderbook['bids'][0])
|
|
20
|
+
}
|
|
21
|
+
console.log ('----------------------------------------------------')
|
|
22
|
+
console.log ('\n\n\n\n\n')
|
|
23
|
+
// process.exit () // stop here if you want
|
|
24
|
+
break
|
|
25
|
+
} else {
|
|
26
|
+
await exchange.sleep (1000);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
async function watchOrderBook (exchange, symbol) {
|
|
32
|
+
while (true) {
|
|
33
|
+
try {
|
|
34
|
+
const orderbook = await exchange.watchOrderBook (symbol)
|
|
35
|
+
orderbooks[symbol] = orderbook
|
|
36
|
+
console.log (exchange.iso8601 (exchange.milliseconds ()), orderbook['datetime'], orderbook['nonce'], symbol, orderbook['asks'][0], orderbook['bids'][0])
|
|
37
|
+
} catch (e) {
|
|
38
|
+
console.log (e.constructor.name, e.message)
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
async function main () {
|
|
44
|
+
const exchange = new ccxt.pro.gateio ({
|
|
45
|
+
'options': {
|
|
46
|
+
'defaultType': 'swap',
|
|
47
|
+
},
|
|
48
|
+
})
|
|
49
|
+
await exchange.loadMarkets ()
|
|
50
|
+
// exchange.verbose = true // uncomment for debugging purposes if necessary
|
|
51
|
+
const symbols = [
|
|
52
|
+
// 'SOS/USDT:USDT',
|
|
53
|
+
// 'JASMY/USDT:USDT',
|
|
54
|
+
// 'SLP/USDT:USDT',
|
|
55
|
+
'ACH/USDT:USDT',
|
|
56
|
+
'MKISHU/USDT:USDT',
|
|
57
|
+
// 'GMT/USDT:USDT',
|
|
58
|
+
// 'ASTR/USDT:USDT',
|
|
59
|
+
'RAMP/USDT:USDT',
|
|
60
|
+
'RSR/USDT:USDT',
|
|
61
|
+
// 'RACA/USDT:USDT',
|
|
62
|
+
// 'ROOK/USDT:USDT',
|
|
63
|
+
// 'ROSE/USDT:USDT',
|
|
64
|
+
]
|
|
65
|
+
await Promise.all ([
|
|
66
|
+
watchAllSymbols (exchange, symbols),
|
|
67
|
+
... symbols.map (symbol => watchOrderBook (exchange, symbol))
|
|
68
|
+
])
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
main ()
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const ccxt = require ('../../../ccxt');
|
|
4
|
+
|
|
5
|
+
let stop = false
|
|
6
|
+
|
|
7
|
+
async function shutdown (milliseconds) {
|
|
8
|
+
await ccxt.sleep (10000)
|
|
9
|
+
stop = true
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
async function watchOrderBook (exchangeId, symbol) {
|
|
13
|
+
|
|
14
|
+
const exchange = new ccxt.pro[exchangeId] ()
|
|
15
|
+
await exchange.loadMarkets ()
|
|
16
|
+
// exchange.verbose = true
|
|
17
|
+
while (!stop) {
|
|
18
|
+
try {
|
|
19
|
+
const orderbook = await exchange.watchOrderBook (symbol)
|
|
20
|
+
console.log (new Date (), exchange.id, symbol, orderbook['asks'][0], orderbook['bids'][0])
|
|
21
|
+
} catch (e) {
|
|
22
|
+
console.log (symbol, e)
|
|
23
|
+
stop = true
|
|
24
|
+
break
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
await exchange.close ()
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
async function main () {
|
|
31
|
+
const streams = {
|
|
32
|
+
'binance': 'BTC/USDT',
|
|
33
|
+
'ftx': 'BTC/USDT',
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
await Promise.all ([
|
|
37
|
+
shutdown (10000),
|
|
38
|
+
... Object.entries (streams).map (([ exchangeId, symbol ]) => watchOrderBook (exchangeId, symbol))
|
|
39
|
+
])
|
|
40
|
+
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
main()
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const ccxt = require ('../../../ccxt');
|
|
4
|
+
|
|
5
|
+
(async () => {
|
|
6
|
+
|
|
7
|
+
const streams = {
|
|
8
|
+
'binance': 'BTC/USDT',
|
|
9
|
+
'bittrex': 'BTC/USDT',
|
|
10
|
+
'poloniex': 'BTC/USDT',
|
|
11
|
+
'bitfinex': 'BTC/USDT',
|
|
12
|
+
'hitbtc': 'BTC/USDT',
|
|
13
|
+
'upbit': 'BTC/USDT',
|
|
14
|
+
'coinbasepro': 'BTC/USD',
|
|
15
|
+
'ftx': 'BTC/USDT',
|
|
16
|
+
'okex': 'BTC/USDT',
|
|
17
|
+
'gateio': 'BTC/USDT',
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
await Promise.all (Object.keys (streams).map (exchangeId =>
|
|
21
|
+
|
|
22
|
+
(async () => {
|
|
23
|
+
|
|
24
|
+
const exchange = new ccxt.pro[exchangeId] ({ enableRateLimit: true })
|
|
25
|
+
const symbol = streams[exchangeId]
|
|
26
|
+
while (true) {
|
|
27
|
+
try {
|
|
28
|
+
const orderbook = await exchange.watchOrderBook (symbol)
|
|
29
|
+
console.log (new Date (), exchange.id, symbol, orderbook['asks'][0], orderbook['bids'][0])
|
|
30
|
+
} catch (e) {
|
|
31
|
+
console.log (symbol, e)
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
}) ())
|
|
36
|
+
)
|
|
37
|
+
}) ()
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const ccxt = require ('ccxt')
|
|
4
|
+
, exchange = new ccxt.okex ({
|
|
5
|
+
apiKey: 'YOUR_API_KEY',
|
|
6
|
+
secret: 'YOUR_API_SECRET',
|
|
7
|
+
password: 'YOUR_API_PASSWORD',
|
|
8
|
+
enableRateLimit: true,
|
|
9
|
+
options: { defaultType: 'futures' },
|
|
10
|
+
})
|
|
11
|
+
, symbol = 'BTC/USDT:USDT-201225'
|
|
12
|
+
, amount = 1 // how may contracts
|
|
13
|
+
, price = undefined // or your limit price
|
|
14
|
+
, side = 'buy' // or 'sell'
|
|
15
|
+
, type = '1' // 1 open long, 2 open short, 3 close long, 4 close short for futures
|
|
16
|
+
, order_type = '4' // 0 = limit order, 4 = market order
|
|
17
|
+
|
|
18
|
+
console.log ('CCXT Pro Version: ', ccxt.version)
|
|
19
|
+
|
|
20
|
+
async function main () {
|
|
21
|
+
|
|
22
|
+
try {
|
|
23
|
+
|
|
24
|
+
await exchange.loadMarkets ()
|
|
25
|
+
|
|
26
|
+
// exchange.verbose = true // uncomment for debugging
|
|
27
|
+
// open long market price order
|
|
28
|
+
const order = await exchange.createOrder(symbol, 'market', side, amount, price, { type });
|
|
29
|
+
// --------------------------------------------------------------------
|
|
30
|
+
// open long market price order
|
|
31
|
+
// const order = await exchange.createOrder(symbol, type, side, amount, price, { order_type });
|
|
32
|
+
// --------------------------------------------------------------------
|
|
33
|
+
// close short market price order
|
|
34
|
+
// const order = await exchange.createOrder(symbol, 'market', side, amount, price, { type, order_type });
|
|
35
|
+
// --------------------------------------------------------------------
|
|
36
|
+
// close short market price order
|
|
37
|
+
// const order = await exchange.createOrder(symbol, '4', side, amount, price, { order_type });
|
|
38
|
+
// ...
|
|
39
|
+
|
|
40
|
+
console.log (order)
|
|
41
|
+
|
|
42
|
+
} catch (e) {
|
|
43
|
+
|
|
44
|
+
console.log (e.constructor.name, e.message)
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
main ()
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
const ccxt = require ('ccxt')
|
|
2
|
+
|
|
3
|
+
console.log ('Node.js:', process.version)
|
|
4
|
+
console.log ('CCXT Pro v' + ccxt.version)
|
|
5
|
+
|
|
6
|
+
const exchange = new ccxt.pro.okex ({
|
|
7
|
+
'apiKey': 'YOUR_API_KEY',
|
|
8
|
+
'secret': 'YOUR_API_SECRET',
|
|
9
|
+
'password': 'YOUR_API_PASWORD'
|
|
10
|
+
})
|
|
11
|
+
|
|
12
|
+
async function watchBalance (code) {
|
|
13
|
+
|
|
14
|
+
while (true) {
|
|
15
|
+
const balance = await exchange.watchBalance ({
|
|
16
|
+
'code': code,
|
|
17
|
+
})
|
|
18
|
+
console.log ('New', code, 'balance is: ', balance[code])
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
async function createOrder (symbol, type, side, amount, price = undefined, params = {}) {
|
|
23
|
+
|
|
24
|
+
console.log ('Creating', symbol, type, 'order')
|
|
25
|
+
const order = await exchange.createOrder (symbol, type, side, amount, price, params);
|
|
26
|
+
console.log (symbol, type, side, 'order created')
|
|
27
|
+
console.log (order)
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
;(async () => {
|
|
31
|
+
|
|
32
|
+
await exchange.loadMarkets ()
|
|
33
|
+
console.log (exchange.id, 'markets loaded')
|
|
34
|
+
|
|
35
|
+
const symbol = 'ETH/USDT'
|
|
36
|
+
const market = exchange.market (symbol)
|
|
37
|
+
const quote = market['quote']
|
|
38
|
+
|
|
39
|
+
// run in parallel without await
|
|
40
|
+
console.log ('Watching', quote, 'balance')
|
|
41
|
+
watchBalance (quote)
|
|
42
|
+
|
|
43
|
+
// wait a bit to allow it to subscribe
|
|
44
|
+
await exchange.sleep (3000)
|
|
45
|
+
|
|
46
|
+
const ticker = await exchange.watchTicker (symbol)
|
|
47
|
+
const type = 'market'
|
|
48
|
+
const side = 'buy'
|
|
49
|
+
const amount = 0.1
|
|
50
|
+
const price = ticker['bid']
|
|
51
|
+
|
|
52
|
+
await createOrder (symbol, type, side, amount, price)
|
|
53
|
+
|
|
54
|
+
}) ()
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import ccxt from '../../../js/ccxt.js';
|
|
2
|
+
|
|
3
|
+
async function main() {
|
|
4
|
+
const exchange = new ccxt.pro.okx()
|
|
5
|
+
await exchange.loadMarkets()
|
|
6
|
+
// exchange.verbose = true
|
|
7
|
+
while (true) {
|
|
8
|
+
try {
|
|
9
|
+
|
|
10
|
+
// don't do this, specify a list of symbols to watch for watchTickers
|
|
11
|
+
// or a very large subscription message will crash your WS connection
|
|
12
|
+
// const tickers = await exchange.watchTickers ()
|
|
13
|
+
|
|
14
|
+
// do this instead
|
|
15
|
+
const symbols = [
|
|
16
|
+
'ETH/BTC',
|
|
17
|
+
'BTC/USDT',
|
|
18
|
+
'ETH/USDT',
|
|
19
|
+
// ...
|
|
20
|
+
]
|
|
21
|
+
const tickers = await exchange.watchTickers (symbols)
|
|
22
|
+
symbols = Object.keys(tickers)
|
|
23
|
+
console.log (new Date(), 'received', symbols.length, 'symbols', ... symbols.slice(0,5).join(', '), '...')
|
|
24
|
+
} catch (e) {
|
|
25
|
+
console.log (new Date(), e.constructor.name, e.message)
|
|
26
|
+
break
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
main()
|