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.
Files changed (267) hide show
  1. package/README.md +5 -5
  2. package/build.sh +1 -1
  3. package/dist/ccxt.browser.js +181 -100
  4. package/dist/ccxt.browser.min.js +2 -2
  5. package/dist/cjs/ccxt.js +1 -1
  6. package/dist/cjs/src/base/Exchange.js +1 -1
  7. package/dist/cjs/src/bitget.js +62 -50
  8. package/dist/cjs/src/bybit.js +90 -30
  9. package/dist/cjs/src/coinbaseinternational.js +1 -1
  10. package/dist/cjs/src/htx.js +16 -9
  11. package/dist/cjs/src/hyperliquid.js +2 -1
  12. package/dist/cjs/src/pro/krakenfutures.js +8 -7
  13. package/examples/README.md +308 -0
  14. package/examples/ccxt.pro/html/watchTicker.html +51 -0
  15. package/examples/ccxt.pro/js/binance-fetch-balance-snapshot-watch-balance-updates.js +55 -0
  16. package/examples/ccxt.pro/js/binance-https-proxy.js +48 -0
  17. package/examples/ccxt.pro/js/binance-watch-ohlcv-many-symbols-continuously.js +38 -0
  18. package/examples/ccxt.pro/js/binance-watch-ohlcv-many-symbols.js +64 -0
  19. package/examples/ccxt.pro/js/binance-watch-ticker-many-symbols.js +62 -0
  20. package/examples/ccxt.pro/js/build-ohlcv-many-symbols.js +68 -0
  21. package/examples/ccxt.pro/js/calculate-ohlcvs-from-trades-warmup.js +82 -0
  22. package/examples/ccxt.pro/js/calculate-ohlcvs-from-trades.js +59 -0
  23. package/examples/ccxt.pro/js/exchange-capabitities.js +72 -0
  24. package/examples/ccxt.pro/js/exchange-close.js +46 -0
  25. package/examples/ccxt.pro/js/gateio-swap-watch-many-orderbooks.js +30 -0
  26. package/examples/ccxt.pro/js/gateio-watch-balance.js +23 -0
  27. package/examples/ccxt.pro/js/gateio-watch-order-book.js +71 -0
  28. package/examples/ccxt.pro/js/graceful-shutdown.js +43 -0
  29. package/examples/ccxt.pro/js/many-exchanges-many-streams.js +37 -0
  30. package/examples/ccxt.pro/js/okex-create-futures-order.js +48 -0
  31. package/examples/ccxt.pro/js/okex-watch-balance-and-create-order.js +54 -0
  32. package/examples/ccxt.pro/js/okx-watch-tickers.js +31 -0
  33. package/examples/ccxt.pro/js/one-exchange-many-different-streams.js +46 -0
  34. package/examples/ccxt.pro/js/one-exchange-many-streams-2.js +26 -0
  35. package/examples/ccxt.pro/js/one-exchange-many-streams.js +28 -0
  36. package/examples/ccxt.pro/js/socks-binance-watch-orderbook.js +30 -0
  37. package/examples/ccxt.pro/js/watch-fetch-many-exchanges-many-ordersbooks.js +40 -0
  38. package/examples/ccxt.pro/js/watch-many-exchanges-many-ordersbooks.js +38 -0
  39. package/examples/ccxt.pro/js/watch-many-exchanges-many-symbols.js +40 -0
  40. package/examples/ccxt.pro/js/watch-many-orderbooks.js +27 -0
  41. package/examples/ccxt.pro/js/watch-new-trades-only.js +43 -0
  42. package/examples/ccxt.pro/js/watch-new-trades.js +42 -0
  43. package/examples/ccxt.pro/js/watch-trades-many-symbols.js +29 -0
  44. package/examples/ccxt.pro/js/watch-vs-fetch.js +29 -0
  45. package/examples/cs/Examples.sln +22 -0
  46. package/examples/cs/c#.csproj +19 -0
  47. package/examples/html/basic-cors-proxy.html +46 -0
  48. package/examples/html/basic-inheritance.html +47 -0
  49. package/examples/html/basic-poller.html +52 -0
  50. package/examples/html/basic-rate-limiting.html +49 -0
  51. package/examples/html/basic.html +43 -0
  52. package/examples/html/binance-cors-proxy.html +28 -0
  53. package/examples/html/bitmex-browser-cors-proxy.js +7 -0
  54. package/examples/html/bitmex-cors.html +46 -0
  55. package/examples/html/tradingview-charts.html +61 -0
  56. package/examples/html/webworker/index.html +97 -0
  57. package/examples/html/webworker/worker.js +43 -0
  58. package/examples/js/README.md +15 -0
  59. package/examples/js/advanced-error-handling.js +39 -0
  60. package/examples/js/aggregate-orderbook.js +54 -0
  61. package/examples/js/arbitrage-pairs.js +130 -0
  62. package/examples/js/basic-chart.js +29 -0
  63. package/examples/js/basic-orderbook-polling.js +13 -0
  64. package/examples/js/bcc-vs-bch.js +115 -0
  65. package/examples/js/binance-fetch-all-deposits.js +45 -0
  66. package/examples/js/binance-fetch-ohlcv-many-symbols-async-await.js +34 -0
  67. package/examples/js/binance-fetch-ohlcv-many-symbols-promise-then-callbacks.js +33 -0
  68. package/examples/js/binance-fetchTicker-delivery-vs-future.js +31 -0
  69. package/examples/js/binance-futures-transfer-from-sub-account-to-master.js +41 -0
  70. package/examples/js/binance-margin-stop-order.js +39 -0
  71. package/examples/js/binance-server-time.js +34 -0
  72. package/examples/js/binance-universal-transfer.js +16 -0
  73. package/examples/js/bitfinex-fetch-trades.js +35 -0
  74. package/examples/js/bitfinex2-fetch-trades.js +35 -0
  75. package/examples/js/bitmex-browser-cors-proxy.js +7 -0
  76. package/examples/js/bitpanda-fetchMyTrades-reduce.js +36 -0
  77. package/examples/js/bitrue-fetch-balance.js +28 -0
  78. package/examples/js/bitstamp-private-api.js +115 -0
  79. package/examples/js/bitstamp-public-api.js +39 -0
  80. package/examples/js/bittrex-balance.js +50 -0
  81. package/examples/js/bittrex-fetch-closed-orders-history.js +69 -0
  82. package/examples/js/blockchaincom-withdrawal.js +59 -0
  83. package/examples/js/build-ohlcv-bars.js +48 -0
  84. package/examples/js/builtin-rate-limiting-rest-poller.js +25 -0
  85. package/examples/js/bybit-trailing.js +62 -0
  86. package/examples/js/bybit-updated.cjs +154 -0
  87. package/examples/js/cli.js +405 -0
  88. package/examples/js/coinbase-fetch-all-balances.js +36 -0
  89. package/examples/js/coinex-fetch-all-deposit-addresses-using-fetchDepositAddress.js +47 -0
  90. package/examples/js/coinex-futures.js +75 -0
  91. package/examples/js/coinone-fetch-tickers.js +54 -0
  92. package/examples/js/coinone-markets.js +16 -0
  93. package/examples/js/compare-two-exchanges-capabilities.js +36 -0
  94. package/examples/js/cors-proxy.js +5 -0
  95. package/examples/js/create-order-handle-errors.js +55 -0
  96. package/examples/js/create-order-position-with-takeprofit-stoploss.js +71 -0
  97. package/examples/js/create-order-with-retry.js +65 -0
  98. package/examples/js/create-order-ws-example.js +25 -0
  99. package/examples/js/create-orders-example.js +17 -0
  100. package/examples/js/create-trailing-amount-order.js +36 -0
  101. package/examples/js/create-trailing-percent-order.js +36 -0
  102. package/examples/js/credentials.json +5 -0
  103. package/examples/js/custom-proxy-agent-for-js.js +10 -0
  104. package/examples/js/custom-proxy-url.js +23 -0
  105. package/examples/js/delta-maintenance-margin-rate-max-leverage.js +60 -0
  106. package/examples/js/env-variables.js +26 -0
  107. package/examples/js/error-handling.js +89 -0
  108. package/examples/js/exchange-capabilities.js +135 -0
  109. package/examples/js/exchanges-by-volume.js +60 -0
  110. package/examples/js/exchanges.js +40 -0
  111. package/examples/js/fetch-all-balances.js +219 -0
  112. package/examples/js/fetch-all-tickers-to-files-2.js +53 -0
  113. package/examples/js/fetch-all-tickers-to-files.js +77 -0
  114. package/examples/js/fetch-balance.js +28 -0
  115. package/examples/js/fetch-create-deposit-address.js +101 -0
  116. package/examples/js/fetch-from-many-exchanges-simultaneously.js +21 -0
  117. package/examples/js/fetch-funding-rate-history.js +25 -0
  118. package/examples/js/fetch-futures/prettier.config.js +5 -0
  119. package/examples/js/fetch-futures/src/index.js +25 -0
  120. package/examples/js/fetch-ohlcv-from-to-mark-index-premium.js +72 -0
  121. package/examples/js/fetch-ohlcv-many-exchanges-continuosly.js +39 -0
  122. package/examples/js/fetch-ohlcv.js +16 -0
  123. package/examples/js/fetch-okex-futures.js +22 -0
  124. package/examples/js/fetch-orders.js +27 -0
  125. package/examples/js/fetch-ticker-from-multiple-exchanges.js +35 -0
  126. package/examples/js/fetch-ticker-where-available.js +75 -0
  127. package/examples/js/fetch-tickers/build/index.js +19 -0
  128. package/examples/js/fetch-tickers/prettier.config.js +5 -0
  129. package/examples/js/fetch-tickers/src/index.js +17 -0
  130. package/examples/js/gateio-create-batch-order.js +43 -0
  131. package/examples/js/gateio-futures.js +49 -0
  132. package/examples/js/gateio-open-close-contract.js +49 -0
  133. package/examples/js/gateio-swaps.js +74 -0
  134. package/examples/js/gdax-fetch-trades-pagination.js +29 -0
  135. package/examples/js/hitbtc2-withdraw.js +61 -0
  136. package/examples/js/how-to-import-one-exchange-esm.js +10 -0
  137. package/examples/js/huobi-futures.js +71 -0
  138. package/examples/js/huobi-open-close-contract.js +63 -0
  139. package/examples/js/huobi-swaps.js +70 -0
  140. package/examples/js/huobipro-market-buy-sell-fetch-trading-limits.js +98 -0
  141. package/examples/js/hybridCJSExample.cjs +19 -0
  142. package/examples/js/hybridESMExample.js +19 -0
  143. package/examples/js/idex-fetch-balance.js +13 -0
  144. package/examples/js/instantiate-all-at-once.js +46 -0
  145. package/examples/js/instantiate-all-from-json.js +31 -0
  146. package/examples/js/kraken-create-and-close-position.js +54 -0
  147. package/examples/js/kraken-fetch-order-trades.js +33 -0
  148. package/examples/js/kraken-margin-trading.js +89 -0
  149. package/examples/js/kucoin-rate-limit.js +38 -0
  150. package/examples/js/latoken-example.js +108 -0
  151. package/examples/js/live-orderbook.js +106 -0
  152. package/examples/js/live-ticker.js +80 -0
  153. package/examples/js/live-tickers.js +74 -0
  154. package/examples/js/load-all-contracts.js +41 -0
  155. package/examples/js/load-all-symbols-at-once.js +69 -0
  156. package/examples/js/load-all-tickers-at-once.js +91 -0
  157. package/examples/js/load-markets-to-files.js +57 -0
  158. package/examples/js/looping-over-all-symbols-of-specific-exchanges.js +61 -0
  159. package/examples/js/looping-over-specific-symbols-of-all-exchanges.js +91 -0
  160. package/examples/js/margin-loan-borrow-buy-sell-repay.js +70 -0
  161. package/examples/js/market-status-and-currency-status.js +29 -0
  162. package/examples/js/ohlcv-console-chart.js +29 -0
  163. package/examples/js/okex-fetch-closed-orders-archive.js +31 -0
  164. package/examples/js/okex-transfer.js +51 -0
  165. package/examples/js/okx-poll-fetch-my-trades.js +37 -0
  166. package/examples/js/okx-poll-rate-limit.js +48 -0
  167. package/examples/js/order-book-extra-level-depth-param.js +20 -0
  168. package/examples/js/phemex-create-order-position-with-takeprofit-stoploss.js +49 -0
  169. package/examples/js/poll-ohlcv.js +43 -0
  170. package/examples/js/poloniex-fetch-order-books.js +35 -0
  171. package/examples/js/poloniex-limits-amount-min.js +62 -0
  172. package/examples/js/proxy-round-robin.js +98 -0
  173. package/examples/js/proxy-usage.js +32 -0
  174. package/examples/js/sample-local-proxy-server-with-cors.js +12 -0
  175. package/examples/js/search-all-exchanges.js +159 -0
  176. package/examples/js/shared-load-markets.js +80 -0
  177. package/examples/js/sort-swap-markets-by-hourly-price-change.js +55 -0
  178. package/examples/js/symbols.js +110 -0
  179. package/examples/js/theocean.js +41 -0
  180. package/examples/js/tickers.js +106 -0
  181. package/examples/js/validate-paginated-data.js +61 -0
  182. package/examples/js/watch-OHLCV-For-Symbols.js +15 -0
  183. package/examples/js/watch-OHLCV.js +12 -0
  184. package/examples/js/watch-OrderBook-For-Symbols.js +11 -0
  185. package/examples/js/watch-Trades-For-Symbols.js +11 -0
  186. package/examples/js/watch-tickers.js +11 -0
  187. package/examples/js/watchOHLCVForSymbols.js +15 -0
  188. package/examples/js/watchOrderBookForSymbols.js +11 -0
  189. package/examples/js/watchPositions-many-exchanges-continuosly.d.ts +2 -0
  190. package/examples/js/watchPositions-many-exchanges-continuosly.d.ts.map +1 -0
  191. package/examples/js/watchPositions-many-exchanges-continuosly.js +49 -0
  192. package/examples/js/watchPositions.d.ts +2 -0
  193. package/examples/js/watchPositions.d.ts.map +1 -0
  194. package/examples/js/watchPositions.js +13 -0
  195. package/examples/js/watchPositionsForSymbols.d.ts +2 -0
  196. package/examples/js/watchPositionsForSymbols.d.ts.map +1 -0
  197. package/examples/js/watchPositionsForSymbols.js +14 -0
  198. package/examples/js/watchTradesForSymbols.js +11 -0
  199. package/examples/js/withdraw-from-one-exchange-to-another.js +50 -0
  200. package/examples/php/README.md +7 -0
  201. package/examples/py/README.md +15 -0
  202. package/examples/py/playing_with_ccxt_example.ipynb +222 -0
  203. package/examples/ts/.eslintrc +111 -0
  204. package/examples/ts/build-ohlcv-bars.ts +53 -0
  205. package/examples/ts/cli.ts +397 -0
  206. package/examples/ts/compare-two-exchanges-capabilities.ts +36 -0
  207. package/examples/ts/create-order-position-with-takeprofit-stoploss.ts +89 -0
  208. package/examples/ts/create-order-ws-example.ts +33 -0
  209. package/examples/ts/create-orders-example.ts +21 -0
  210. package/examples/ts/create-trailing-amount-order.ts +37 -0
  211. package/examples/ts/create-trailing-percent-order.ts +37 -0
  212. package/examples/ts/custom-proxy-agent-for-js.ts +14 -0
  213. package/examples/ts/fetch-futures/package-lock.json +116 -0
  214. package/examples/ts/fetch-futures/package.json +34 -0
  215. package/examples/ts/fetch-futures/prettier.config.js +4 -0
  216. package/examples/ts/fetch-futures/src/index.ts +28 -0
  217. package/examples/ts/fetch-futures/tsconfig.json +28 -0
  218. package/examples/ts/fetch-ohlcv-many-exchanges-continuosly.ts +44 -0
  219. package/examples/ts/fetch-ohlcv.ts +17 -0
  220. package/examples/ts/fetch-tickers/package-lock.json +116 -0
  221. package/examples/ts/fetch-tickers/package.json +34 -0
  222. package/examples/ts/fetch-tickers/prettier.config.js +4 -0
  223. package/examples/ts/fetch-tickers/src/index.ts +21 -0
  224. package/examples/ts/fetch-tickers/tsconfig.json +28 -0
  225. package/examples/ts/how-to-import-one-exchange-esm.ts +11 -0
  226. package/examples/ts/kraken-create-and-close-position.ts +69 -0
  227. package/examples/ts/margin-loan-borrow-buy-sell-repay.ts +72 -0
  228. package/examples/ts/nextjs-page-router/.eslintrc.json +3 -0
  229. package/examples/ts/nextjs-page-router/README.md +43 -0
  230. package/examples/ts/nextjs-page-router/next.config.js +6 -0
  231. package/examples/ts/nextjs-page-router/package-lock.json +7425 -0
  232. package/examples/ts/nextjs-page-router/package.json +28 -0
  233. package/examples/ts/nextjs-page-router/postcss.config.js +6 -0
  234. package/examples/ts/nextjs-page-router/public/favicon.ico +0 -0
  235. package/examples/ts/nextjs-page-router/src/pages/_app.tsx +6 -0
  236. package/examples/ts/nextjs-page-router/src/pages/_document.tsx +13 -0
  237. package/examples/ts/nextjs-page-router/src/pages/balance.tsx +46 -0
  238. package/examples/ts/nextjs-page-router/src/pages/index.tsx +8 -0
  239. package/examples/ts/nextjs-page-router/src/pages/tickers.tsx +61 -0
  240. package/examples/ts/nextjs-page-router/src/styles/globals.css +27 -0
  241. package/examples/ts/nextjs-page-router/tailwind.config.ts +20 -0
  242. package/examples/ts/nextjs-page-router/tsconfig.json +22 -0
  243. package/examples/ts/phemex-create-order-position-with-takeprofit-stoploss.ts +62 -0
  244. package/examples/ts/proxy-usage.ts +41 -0
  245. package/examples/ts/sample-local-proxy-server-with-cors.ts +15 -0
  246. package/examples/ts/watch-OHLCV-For-Symbols.ts +17 -0
  247. package/examples/ts/watch-OHLCV.ts +14 -0
  248. package/examples/ts/watch-OrderBook-For-Symbols.ts +13 -0
  249. package/examples/ts/watch-Trades-For-Symbols.ts +13 -0
  250. package/examples/ts/watch-tickers.ts +13 -0
  251. package/examples/ts/watchPositions-many-exchanges-continuosly.ts +53 -0
  252. package/examples/ts/watchPositions.ts +15 -0
  253. package/examples/ts/watchPositionsForSymbols.ts +16 -0
  254. package/examples/tsconfig.json +27 -0
  255. package/js/ccxt.d.ts +1 -1
  256. package/js/ccxt.js +1 -1
  257. package/js/src/base/Exchange.d.ts +2 -2
  258. package/js/src/base/Exchange.js +1 -1
  259. package/js/src/bitget.js +62 -50
  260. package/js/src/bybit.d.ts +3 -1
  261. package/js/src/bybit.js +90 -30
  262. package/js/src/coinbaseinternational.js +1 -1
  263. package/js/src/htx.js +16 -9
  264. package/js/src/hyperliquid.js +2 -1
  265. package/js/src/pro/krakenfutures.js +8 -7
  266. package/package.json +4 -1
  267. 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()