ccxt 4.2.84 → 4.2.86

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 (168) hide show
  1. package/README.md +5 -5
  2. package/dist/ccxt.browser.js +1226 -1104
  3. package/dist/ccxt.browser.min.js +4 -4
  4. package/dist/cjs/ccxt.js +1 -1
  5. package/dist/cjs/src/ace.js +5 -5
  6. package/dist/cjs/src/ascendex.js +8 -8
  7. package/dist/cjs/src/base/Exchange.js +76 -14
  8. package/dist/cjs/src/bigone.js +12 -12
  9. package/dist/cjs/src/binance.js +23 -35
  10. package/dist/cjs/src/bingx.js +47 -28
  11. package/dist/cjs/src/bit2c.js +1 -1
  12. package/dist/cjs/src/bitbank.js +27 -31
  13. package/dist/cjs/src/bitbns.js +5 -5
  14. package/dist/cjs/src/bitfinex.js +1 -1
  15. package/dist/cjs/src/bitfinex2.js +1 -1
  16. package/dist/cjs/src/bitget.js +30 -24
  17. package/dist/cjs/src/bithumb.js +5 -5
  18. package/dist/cjs/src/bitmart.js +16 -16
  19. package/dist/cjs/src/bitopro.js +1 -1
  20. package/dist/cjs/src/bitrue.js +4 -4
  21. package/dist/cjs/src/bitso.js +5 -5
  22. package/dist/cjs/src/bitstamp.js +1 -1
  23. package/dist/cjs/src/bitteam.js +8 -8
  24. package/dist/cjs/src/bl3p.js +1 -1
  25. package/dist/cjs/src/btcturk.js +6 -6
  26. package/dist/cjs/src/bybit.js +31 -95
  27. package/dist/cjs/src/coincheck.js +4 -4
  28. package/dist/cjs/src/coinex.js +408 -262
  29. package/dist/cjs/src/coinlist.js +7 -7
  30. package/dist/cjs/src/coinmate.js +4 -4
  31. package/dist/cjs/src/coinmetro.js +3 -3
  32. package/dist/cjs/src/coinone.js +5 -5
  33. package/dist/cjs/src/coinspot.js +2 -2
  34. package/dist/cjs/src/cryptocom.js +17 -17
  35. package/dist/cjs/src/currencycom.js +1 -1
  36. package/dist/cjs/src/delta.js +0 -8
  37. package/dist/cjs/src/deribit.js +16 -92
  38. package/dist/cjs/src/digifinex.js +8 -8
  39. package/dist/cjs/src/exmo.js +8 -8
  40. package/dist/cjs/src/gate.js +0 -8
  41. package/dist/cjs/src/hitbtc.js +5 -4
  42. package/dist/cjs/src/hollaex.js +7 -7
  43. package/dist/cjs/src/htx.js +7 -7
  44. package/dist/cjs/src/huobijp.js +3 -3
  45. package/dist/cjs/src/idex.js +12 -13
  46. package/dist/cjs/src/independentreserve.js +2 -2
  47. package/dist/cjs/src/indodax.js +2 -2
  48. package/dist/cjs/src/kraken.js +8 -8
  49. package/dist/cjs/src/krakenfutures.js +6 -6
  50. package/dist/cjs/src/kucoin.js +5 -1
  51. package/dist/cjs/src/kucoinfutures.js +8 -8
  52. package/dist/cjs/src/kuna.js +16 -16
  53. package/dist/cjs/src/latoken.js +2 -2
  54. package/dist/cjs/src/lbank.js +10 -10
  55. package/dist/cjs/src/luno.js +4 -4
  56. package/dist/cjs/src/mercado.js +5 -5
  57. package/dist/cjs/src/mexc.js +6 -6
  58. package/dist/cjs/src/ndax.js +1 -1
  59. package/dist/cjs/src/novadax.js +9 -9
  60. package/dist/cjs/src/oceanex.js +7 -7
  61. package/dist/cjs/src/okcoin.js +16 -14
  62. package/dist/cjs/src/okx.js +23 -31
  63. package/dist/cjs/src/onetrading.js +4 -4
  64. package/dist/cjs/src/p2b.js +7 -7
  65. package/dist/cjs/src/phemex.js +12 -12
  66. package/dist/cjs/src/poloniexfutures.js +5 -5
  67. package/dist/cjs/src/pro/binance.js +167 -121
  68. package/dist/cjs/src/pro/bitget.js +1 -0
  69. package/dist/cjs/src/pro/kucoin.js +6 -7
  70. package/dist/cjs/src/pro/okx.js +19 -2
  71. package/dist/cjs/src/probit.js +11 -11
  72. package/dist/cjs/src/timex.js +7 -7
  73. package/dist/cjs/src/tokocrypto.js +9 -9
  74. package/dist/cjs/src/wavesexchange.js +3 -3
  75. package/dist/cjs/src/whitebit.js +5 -5
  76. package/dist/cjs/src/woo.js +1 -1
  77. package/dist/cjs/src/zaif.js +1 -1
  78. package/dist/cjs/src/zonda.js +7 -7
  79. package/examples/js/cli.js +0 -1
  80. package/examples/ts/cli.ts +0 -1
  81. package/js/ccxt.d.ts +1 -1
  82. package/js/ccxt.js +1 -1
  83. package/js/src/abstract/coinex.d.ts +232 -123
  84. package/js/src/ace.js +5 -5
  85. package/js/src/ascendex.js +8 -8
  86. package/js/src/base/Exchange.d.ts +13 -12
  87. package/js/src/base/Exchange.js +76 -14
  88. package/js/src/bigone.js +12 -12
  89. package/js/src/binance.d.ts +0 -1
  90. package/js/src/binance.js +23 -35
  91. package/js/src/bingx.js +47 -28
  92. package/js/src/bit2c.js +1 -1
  93. package/js/src/bitbank.js +27 -31
  94. package/js/src/bitbns.js +5 -5
  95. package/js/src/bitfinex.js +1 -1
  96. package/js/src/bitfinex2.js +1 -1
  97. package/js/src/bitget.js +30 -24
  98. package/js/src/bithumb.js +5 -5
  99. package/js/src/bitmart.js +16 -16
  100. package/js/src/bitopro.js +1 -1
  101. package/js/src/bitrue.js +4 -4
  102. package/js/src/bitso.js +5 -5
  103. package/js/src/bitstamp.js +1 -1
  104. package/js/src/bitteam.js +8 -8
  105. package/js/src/bl3p.js +1 -1
  106. package/js/src/btcturk.js +6 -6
  107. package/js/src/bybit.d.ts +0 -3
  108. package/js/src/bybit.js +31 -95
  109. package/js/src/coincheck.js +4 -4
  110. package/js/src/coinex.d.ts +1 -1
  111. package/js/src/coinex.js +408 -262
  112. package/js/src/coinlist.js +7 -7
  113. package/js/src/coinmate.js +4 -4
  114. package/js/src/coinmetro.js +3 -3
  115. package/js/src/coinone.js +5 -5
  116. package/js/src/coinspot.js +2 -2
  117. package/js/src/cryptocom.js +17 -17
  118. package/js/src/currencycom.js +1 -1
  119. package/js/src/delta.d.ts +0 -1
  120. package/js/src/delta.js +0 -8
  121. package/js/src/deribit.d.ts +0 -3
  122. package/js/src/deribit.js +16 -92
  123. package/js/src/digifinex.js +8 -8
  124. package/js/src/exmo.js +8 -8
  125. package/js/src/gate.d.ts +0 -1
  126. package/js/src/gate.js +0 -8
  127. package/js/src/hitbtc.js +5 -4
  128. package/js/src/hollaex.js +7 -7
  129. package/js/src/htx.js +7 -7
  130. package/js/src/huobijp.js +3 -3
  131. package/js/src/idex.js +12 -13
  132. package/js/src/independentreserve.js +2 -2
  133. package/js/src/indodax.js +2 -2
  134. package/js/src/kraken.js +8 -8
  135. package/js/src/krakenfutures.js +6 -6
  136. package/js/src/kucoin.js +5 -1
  137. package/js/src/kucoinfutures.js +8 -8
  138. package/js/src/kuna.js +16 -16
  139. package/js/src/latoken.js +2 -2
  140. package/js/src/lbank.js +10 -10
  141. package/js/src/luno.js +4 -4
  142. package/js/src/mercado.js +5 -5
  143. package/js/src/mexc.js +6 -6
  144. package/js/src/ndax.js +1 -1
  145. package/js/src/novadax.js +9 -9
  146. package/js/src/oceanex.js +7 -7
  147. package/js/src/okcoin.js +16 -14
  148. package/js/src/okx.d.ts +0 -1
  149. package/js/src/okx.js +23 -31
  150. package/js/src/onetrading.js +4 -4
  151. package/js/src/p2b.js +7 -7
  152. package/js/src/phemex.js +12 -12
  153. package/js/src/poloniexfutures.js +5 -5
  154. package/js/src/pro/binance.d.ts +5 -1
  155. package/js/src/pro/binance.js +168 -122
  156. package/js/src/pro/bitget.js +1 -0
  157. package/js/src/pro/kucoin.js +6 -7
  158. package/js/src/pro/okx.js +19 -2
  159. package/js/src/probit.js +11 -11
  160. package/js/src/timex.js +7 -7
  161. package/js/src/tokocrypto.js +9 -9
  162. package/js/src/wavesexchange.js +3 -3
  163. package/js/src/whitebit.js +5 -5
  164. package/js/src/woo.js +1 -1
  165. package/js/src/zaif.js +1 -1
  166. package/js/src/zonda.js +7 -7
  167. package/package.json +1 -1
  168. package/skip-tests.json +4 -0
@@ -7,7 +7,7 @@
7
7
  // ----------------------------------------------------------------------------
8
8
  import binanceRest from '../binance.js';
9
9
  import { Precise } from '../base/Precise.js';
10
- import { ExchangeError, ArgumentsRequired, BadRequest } from '../base/errors.js';
10
+ import { ExchangeError, ArgumentsRequired, BadRequest, NotSupported } from '../base/errors.js';
11
11
  import { ArrayCache, ArrayCacheByTimestamp, ArrayCacheBySymbolById, ArrayCacheBySymbolBySide } from '../base/ws/Cache.js';
12
12
  import { sha256 } from '../static_dependencies/noble-hashes/sha256.js';
13
13
  import { rsa } from '../base/functions/rsa.js';
@@ -20,6 +20,7 @@ export default class binance extends binanceRest {
20
20
  'has': {
21
21
  'ws': true,
22
22
  'watchBalance': true,
23
+ 'watchBidsAsks': true,
23
24
  'watchMyTrades': true,
24
25
  'watchOHLCV': true,
25
26
  'watchOHLCVForSymbols': false,
@@ -101,10 +102,10 @@ export default class binance extends binanceRest {
101
102
  'name': 'trade', // 'trade' or 'aggTrade'
102
103
  },
103
104
  'watchTicker': {
104
- 'name': 'ticker', // ticker = 1000ms L1+OHLCV, bookTicker = real-time L1
105
+ 'name': 'ticker', // ticker or miniTicker or ticker_<window_size>
105
106
  },
106
107
  'watchTickers': {
107
- 'name': 'ticker', // ticker or miniTicker or bookTicker
108
+ 'name': 'ticker', // ticker or miniTicker or ticker_<window_size>
108
109
  },
109
110
  'watchOHLCV': {
110
111
  'name': 'kline', // or indexPriceKline or markPriceKline (coin-m futures)
@@ -125,6 +126,15 @@ export default class binance extends binanceRest {
125
126
  'ws': {
126
127
  'cost': 5,
127
128
  },
129
+ 'tickerChannelsMap': {
130
+ '24hrTicker': 'ticker',
131
+ '24hrMiniTicker': 'miniTicker',
132
+ // rolling window tickers
133
+ '1hTicker': 'ticker_1h',
134
+ '4hTicker': 'ticker_4h',
135
+ '1dTicker': 'ticker_1d',
136
+ 'bookTicker': 'bookTicker',
137
+ },
128
138
  },
129
139
  });
130
140
  }
@@ -938,34 +948,13 @@ export default class binance extends binanceRest {
938
948
  * @description watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
939
949
  * @param {string} symbol unified symbol of the market to fetch the ticker for
940
950
  * @param {object} [params] extra parameters specific to the exchange API endpoint
941
- * @param {string} [params.name] stream to use can be ticker or bookTicker
951
+ * @param {string} [params.name] stream to use can be ticker or miniTicker
942
952
  * @returns {object} a [ticker structure]{@link https://docs.ccxt.com/#/?id=ticker-structure}
943
953
  */
944
954
  await this.loadMarkets();
945
- const market = this.market(symbol);
946
- const marketId = market['lowercaseId'];
947
- let type = market['type'];
948
- if (market['contract']) {
949
- type = market['linear'] ? 'future' : 'delivery';
950
- }
951
- const options = this.safeValue(this.options, 'watchTicker', {});
952
- let name = this.safeString(options, 'name', 'ticker');
953
- name = this.safeString(params, 'name', name);
954
- params = this.omit(params, 'name');
955
- const messageHash = marketId + '@' + name;
956
- const url = this.urls['api']['ws'][type] + '/' + this.stream(type, messageHash);
957
- const requestId = this.requestId(url);
958
- const request = {
959
- 'method': 'SUBSCRIBE',
960
- 'params': [
961
- messageHash,
962
- ],
963
- 'id': requestId,
964
- };
965
- const subscribe = {
966
- 'id': requestId,
967
- };
968
- return await this.watch(url, messageHash, this.extend(request, params), messageHash, subscribe);
955
+ symbol = this.symbol(symbol);
956
+ const tickers = await this.watchTickers([symbol], this.extend(params, { 'callerMethodName': 'watchTicker' }));
957
+ return tickers[symbol];
969
958
  }
970
959
  async watchTickers(symbols = undefined, params = {}) {
971
960
  /**
@@ -976,61 +965,108 @@ export default class binance extends binanceRest {
976
965
  * @param {object} [params] extra parameters specific to the exchange API endpoint
977
966
  * @returns {object} a [ticker structure]{@link https://docs.ccxt.com/#/?id=ticker-structure}
978
967
  */
979
- await this.loadMarkets();
980
- symbols = this.marketSymbols(symbols, undefined, true, true, true);
981
- const marketIds = this.marketIds(symbols);
982
- let market = undefined;
983
- let type = undefined;
984
- if (symbols !== undefined) {
985
- market = this.market(symbols[0]);
968
+ let channelName = undefined;
969
+ [channelName, params] = this.handleOptionAndParams(params, 'watchTickers', 'name', 'ticker');
970
+ if (channelName === 'bookTicker') {
971
+ throw new BadRequest(this.id + ' deprecation notice - to subscribe for bids-asks, use watch_bids_asks() method instead');
986
972
  }
987
- [type, params] = this.handleMarketTypeAndParams('watchTickers', market, params);
973
+ const newTickers = await this.watchMultiTickerHelper('watchTickers', channelName, symbols, params);
974
+ if (this.newUpdates) {
975
+ return newTickers;
976
+ }
977
+ return this.filterByArray(this.tickers, 'symbol', symbols);
978
+ }
979
+ async watchBidsAsks(symbols = undefined, params = {}) {
980
+ /**
981
+ * @method
982
+ * @name binance#watchBidsAsks
983
+ * @see https://binance-docs.github.io/apidocs/spot/en/#individual-symbol-book-ticker-streams
984
+ * @see https://binance-docs.github.io/apidocs/futures/en/#all-book-tickers-stream
985
+ * @see https://binance-docs.github.io/apidocs/delivery/en/#all-book-tickers-stream
986
+ * @description watches best bid & ask for symbols
987
+ * @param {string[]} symbols unified symbol of the market to fetch the ticker for
988
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
989
+ * @returns {object} a [ticker structure]{@link https://docs.ccxt.com/#/?id=ticker-structure}
990
+ */
991
+ const result = await this.watchMultiTickerHelper('watchBidsAsks', 'bookTicker', symbols, params);
992
+ if (this.newUpdates) {
993
+ return result;
994
+ }
995
+ return this.filterByArray(this.tickers, 'symbol', symbols);
996
+ }
997
+ async watchMultiTickerHelper(methodName, channelName, symbols = undefined, params = {}) {
998
+ await this.loadMarkets();
999
+ symbols = this.marketSymbols(symbols, undefined, true, false, true);
1000
+ let firstMarket = undefined;
1001
+ let marketType = undefined;
1002
+ const symbolsDefined = (symbols !== undefined);
1003
+ if (symbolsDefined) {
1004
+ firstMarket = this.market(symbols[0]);
1005
+ }
1006
+ [marketType, params] = this.handleMarketTypeAndParams(methodName, firstMarket, params);
988
1007
  let subType = undefined;
989
- [subType, params] = this.handleSubTypeAndParams('watchTickers', market, params);
990
- if (this.isLinear(type, subType)) {
991
- type = 'future';
1008
+ [subType, params] = this.handleSubTypeAndParams(methodName, firstMarket, params);
1009
+ let rawMarketType = undefined;
1010
+ if (this.isLinear(marketType, subType)) {
1011
+ rawMarketType = 'future';
992
1012
  }
993
- else if (this.isInverse(type, subType)) {
994
- type = 'delivery';
1013
+ else if (this.isInverse(marketType, subType)) {
1014
+ rawMarketType = 'delivery';
995
1015
  }
996
- const options = this.safeValue(this.options, 'watchTickers', {});
997
- let name = this.safeString(options, 'name', 'ticker');
998
- name = this.safeString(params, 'name', name);
999
- params = this.omit(params, 'name');
1000
- let wsParams = [];
1001
- let messageHash = 'tickers';
1002
- if (symbols !== undefined) {
1003
- messageHash = 'tickers::' + symbols.join(',');
1016
+ else if (marketType === 'spot') {
1017
+ rawMarketType = marketType;
1004
1018
  }
1005
- if (name === 'bookTicker') {
1006
- if (marketIds === undefined) {
1007
- throw new ArgumentsRequired(this.id + ' watchTickers() requires symbols for bookTicker');
1008
- }
1009
- // simulate watchTickers with subscribe multiple individual bookTicker topic
1010
- for (let i = 0; i < marketIds.length; i++) {
1011
- wsParams.push(marketIds[i].toLowerCase() + '@bookTicker');
1019
+ else {
1020
+ throw new NotSupported(this.id + ' ' + methodName + '() does not support options markets');
1021
+ }
1022
+ const isBidAsk = (channelName === 'bookTicker');
1023
+ const subscriptionArgs = [];
1024
+ const messageHashes = [];
1025
+ if (symbolsDefined) {
1026
+ for (let i = 0; i < symbols.length; i++) {
1027
+ const symbol = symbols[i];
1028
+ const market = this.market(symbol);
1029
+ subscriptionArgs.push(market['lowercaseId'] + '@' + channelName);
1030
+ messageHashes.push(this.getMessageHash(channelName, market['symbol'], isBidAsk));
1012
1031
  }
1013
1032
  }
1014
1033
  else {
1015
- wsParams = [
1016
- '!' + name + '@arr',
1017
- ];
1034
+ if (isBidAsk) {
1035
+ if (marketType === 'spot') {
1036
+ throw new ArgumentsRequired(this.id + ' ' + methodName + '() requires symbols for this channel for spot markets');
1037
+ }
1038
+ subscriptionArgs.push('!' + channelName);
1039
+ }
1040
+ else {
1041
+ subscriptionArgs.push('!' + channelName + '@arr');
1042
+ }
1043
+ messageHashes.push(this.getMessageHash(channelName, undefined, isBidAsk));
1018
1044
  }
1019
- const url = this.urls['api']['ws'][type] + '/' + this.stream(type, messageHash);
1045
+ let streamHash = channelName;
1046
+ if (symbolsDefined) {
1047
+ streamHash = channelName + '::' + symbols.join(',');
1048
+ }
1049
+ const url = this.urls['api']['ws'][rawMarketType] + '/' + this.stream(rawMarketType, streamHash);
1020
1050
  const requestId = this.requestId(url);
1021
1051
  const request = {
1022
1052
  'method': 'SUBSCRIBE',
1023
- 'params': wsParams,
1053
+ 'params': subscriptionArgs,
1024
1054
  'id': requestId,
1025
1055
  };
1026
1056
  const subscribe = {
1027
1057
  'id': requestId,
1028
1058
  };
1029
- const newTickers = await this.watch(url, messageHash, this.extend(request, params), messageHash, subscribe);
1030
- if (this.newUpdates) {
1031
- return newTickers;
1059
+ const result = await this.watchMultiple(url, messageHashes, this.deepExtend(request, params), subscriptionArgs, subscribe);
1060
+ // for efficiency, we have two type of returned structure here - if symbols array was provided, then individual
1061
+ // ticker dict comes in, otherwise all-tickers dict comes in
1062
+ if (!symbolsDefined) {
1063
+ return result;
1064
+ }
1065
+ else {
1066
+ const newDict = {};
1067
+ newDict[result['symbol']] = result;
1068
+ return newDict;
1032
1069
  }
1033
- return this.filterByArray(this.tickers, 'symbol', symbols);
1034
1070
  }
1035
1071
  parseWsTicker(message, marketType) {
1036
1072
  //
@@ -1114,11 +1150,24 @@ export default class binance extends binanceRest {
1114
1150
  'info': message,
1115
1151
  }, market);
1116
1152
  }
1117
- handleTicker(client, message) {
1153
+ handleBidsAsks(client, message) {
1154
+ //
1155
+ // arrives one symbol dict or array of symbol dicts
1156
+ //
1157
+ // {
1158
+ // "u": 7488717758,
1159
+ // "s": "BTCUSDT",
1160
+ // "b": "28621.74000000",
1161
+ // "B": "1.43278800",
1162
+ // "a": "28621.75000000",
1163
+ // "A": "2.52500800"
1164
+ // }
1165
+ //
1166
+ this.handleTickersAndBidsAsks(client, message, 'bidasks');
1167
+ }
1168
+ handleTickers(client, message) {
1118
1169
  //
1119
- // 24hr rolling window ticker statistics for a single symbol
1120
- // These are NOT the statistics of the UTC day, but a 24hr rolling window for the previous 24hrs
1121
- // Update Speed 1000ms
1170
+ // arrives one symbol dict or array of symbol dicts
1122
1171
  //
1123
1172
  // {
1124
1173
  // "e": "24hrTicker", // event type
@@ -1146,39 +1195,14 @@ export default class binance extends binanceRest {
1146
1195
  // "n": 163222, // total number of trades
1147
1196
  // }
1148
1197
  //
1149
- let event = this.safeString(message, 'e', 'bookTicker');
1150
- if (event === '24hrTicker') {
1151
- event = 'ticker';
1152
- }
1153
- else if (event === '24hrMiniTicker') {
1154
- event = 'miniTicker';
1155
- }
1156
- const wsMarketId = this.safeStringLower(message, 's');
1157
- const messageHash = wsMarketId + '@' + event;
1158
- const isSpot = ((client.url.indexOf('/stream') > -1) || (client.url.indexOf('/testnet.binance') > -1));
1159
- const marketType = (isSpot) ? 'spot' : 'contract';
1160
- const result = this.parseWsTicker(message, marketType);
1161
- const symbol = result['symbol'];
1162
- this.tickers[symbol] = result;
1163
- client.resolve(result, messageHash);
1164
- if (event === 'bookTicker') {
1165
- // watch bookTickers
1166
- client.resolve(result, '!' + 'bookTicker@arr');
1167
- const messageHashes = this.findMessageHashes(client, 'tickers::');
1168
- for (let i = 0; i < messageHashes.length; i++) {
1169
- const currentMessageHash = messageHashes[i];
1170
- const parts = currentMessageHash.split('::');
1171
- const symbolsString = parts[1];
1172
- const symbols = symbolsString.split(',');
1173
- if (this.inArray(symbol, symbols)) {
1174
- client.resolve(result, currentMessageHash);
1175
- }
1176
- }
1177
- }
1198
+ this.handleTickersAndBidsAsks(client, message, 'tickers');
1178
1199
  }
1179
- handleTickers(client, message) {
1200
+ handleTickersAndBidsAsks(client, message, methodType) {
1180
1201
  const isSpot = ((client.url.indexOf('/stream') > -1) || (client.url.indexOf('/testnet.binance') > -1));
1181
1202
  const marketType = (isSpot) ? 'spot' : 'contract';
1203
+ const isBidAsk = (methodType === 'bidasks');
1204
+ let channelName = undefined;
1205
+ const resolvedMessageHashes = [];
1182
1206
  let rawTickers = [];
1183
1207
  const newTickers = {};
1184
1208
  if (Array.isArray(message)) {
@@ -1189,25 +1213,42 @@ export default class binance extends binanceRest {
1189
1213
  }
1190
1214
  for (let i = 0; i < rawTickers.length; i++) {
1191
1215
  const ticker = rawTickers[i];
1192
- const result = this.parseWsTicker(ticker, marketType);
1193
- const symbol = result['symbol'];
1194
- this.tickers[symbol] = result;
1195
- newTickers[symbol] = result;
1196
- }
1197
- const messageHashes = this.findMessageHashes(client, 'tickers::');
1198
- for (let i = 0; i < messageHashes.length; i++) {
1199
- const messageHash = messageHashes[i];
1200
- const parts = messageHash.split('::');
1201
- const symbolsString = parts[1];
1202
- const symbols = symbolsString.split(',');
1203
- const tickers = this.filterByArray(newTickers, 'symbol', symbols);
1204
- const tickersSymbols = Object.keys(tickers);
1205
- const numTickers = tickersSymbols.length;
1206
- if (numTickers > 0) {
1207
- client.resolve(tickers, messageHash);
1216
+ let event = this.safeString(ticker, 'e');
1217
+ if (isBidAsk) {
1218
+ event = 'bookTicker'; // as noted in `handleMessage`, bookTicker doesn't have identifier, so manually set here
1219
+ }
1220
+ channelName = this.safeString(this.options['tickerChannelsMap'], event, event);
1221
+ if (channelName === undefined) {
1222
+ continue;
1223
+ }
1224
+ const parsedTicker = this.parseWsTicker(ticker, marketType);
1225
+ const symbol = parsedTicker['symbol'];
1226
+ newTickers[symbol] = parsedTicker;
1227
+ if (isBidAsk) {
1228
+ this.bidsasks[symbol] = parsedTicker;
1229
+ }
1230
+ else {
1231
+ this.tickers[symbol] = parsedTicker;
1208
1232
  }
1233
+ const messageHash = this.getMessageHash(channelName, symbol, isBidAsk);
1234
+ resolvedMessageHashes.push(messageHash);
1235
+ client.resolve(parsedTicker, messageHash);
1236
+ }
1237
+ // resolve batch endpoint
1238
+ const length = resolvedMessageHashes.length;
1239
+ if (length > 0) {
1240
+ const batchMessageHash = this.getMessageHash(channelName, undefined, isBidAsk);
1241
+ client.resolve(newTickers, batchMessageHash);
1242
+ }
1243
+ }
1244
+ getMessageHash(channelName, symbol, isBidAsk) {
1245
+ const prefix = isBidAsk ? 'bidask' : 'ticker';
1246
+ if (symbol !== undefined) {
1247
+ return prefix + ':' + channelName + '@' + symbol;
1248
+ }
1249
+ else {
1250
+ return prefix + 's' + ':' + channelName;
1209
1251
  }
1210
- client.resolve(newTickers, 'tickers');
1211
1252
  }
1212
1253
  signParams(params = {}) {
1213
1254
  this.checkRequiredCredentials();
@@ -3012,11 +3053,17 @@ export default class binance extends binanceRest {
3012
3053
  'kline': this.handleOHLCV,
3013
3054
  'markPrice_kline': this.handleOHLCV,
3014
3055
  'indexPrice_kline': this.handleOHLCV,
3056
+ '1hTicker@arr': this.handleTickers,
3057
+ '4hTicker@arr': this.handleTickers,
3058
+ '1dTicker@arr': this.handleTickers,
3015
3059
  '24hrTicker@arr': this.handleTickers,
3016
3060
  '24hrMiniTicker@arr': this.handleTickers,
3017
- '24hrTicker': this.handleTicker,
3018
- '24hrMiniTicker': this.handleTicker,
3019
- 'bookTicker': this.handleTicker,
3061
+ '1hTicker': this.handleTickers,
3062
+ '4hTicker': this.handleTickers,
3063
+ '1dTicker': this.handleTickers,
3064
+ '24hrTicker': this.handleTickers,
3065
+ '24hrMiniTicker': this.handleTickers,
3066
+ 'bookTicker': this.handleBidsAsks,
3020
3067
  'outboundAccountPosition': this.handleBalance,
3021
3068
  'balanceUpdate': this.handleBalance,
3022
3069
  'ACCOUNT_UPDATE': this.handleAcountUpdate,
@@ -3046,9 +3093,8 @@ export default class binance extends binanceRest {
3046
3093
  // "A": "2.52500800"
3047
3094
  // }
3048
3095
  //
3049
- if (event === undefined) {
3050
- this.handleTicker(client, message);
3051
- this.handleTickers(client, message);
3096
+ if (event === undefined && ('a' in message) && ('b' in message)) {
3097
+ this.handleBidsAsks(client, message);
3052
3098
  }
3053
3099
  }
3054
3100
  else {
@@ -86,6 +86,7 @@ export default class bitget extends bitgetRest {
86
86
  '30015': AuthenticationError,
87
87
  '30016': BadRequest, // { event: 'error', code: 30016, msg: 'Param error' }
88
88
  },
89
+ 'broad': {},
89
90
  },
90
91
  },
91
92
  });
@@ -890,18 +890,17 @@ export default class kucoin extends kucoinRest {
890
890
  return this.filterBySymbolSinceLimit(trades, symbol, since, limit, true);
891
891
  }
892
892
  handleMyTrade(client, message) {
893
- let trades = this.myTrades;
894
- if (trades === undefined) {
893
+ if (this.myTrades === undefined) {
895
894
  const limit = this.safeInteger(this.options, 'tradesLimit', 1000);
896
- trades = new ArrayCacheBySymbolById(limit);
895
+ this.myTrades = new ArrayCacheBySymbolById(limit);
897
896
  }
898
- const data = this.safeValue(message, 'data');
897
+ const data = this.safeDict(message, 'data');
899
898
  const parsed = this.parseWsTrade(data);
900
- trades.append(parsed);
899
+ this.myTrades.append(parsed);
901
900
  const messageHash = 'myTrades';
902
- client.resolve(trades, messageHash);
901
+ client.resolve(this.myTrades, messageHash);
903
902
  const symbolSpecificMessageHash = messageHash + ':' + parsed['symbol'];
904
- client.resolve(trades, symbolSpecificMessageHash);
903
+ client.resolve(this.myTrades, symbolSpecificMessageHash);
905
904
  }
906
905
  parseWsTrade(trade, market = undefined) {
907
906
  //
package/js/src/pro/okx.js CHANGED
@@ -490,14 +490,31 @@ export default class okx extends okxRest {
490
490
  * @name okx#watchOrderBookForSymbols
491
491
  * @description watches information on open orders with bid (buy) and ask (sell) prices, volumes and other data
492
492
  * @param {string[]} symbols unified array of symbols
493
- * @param {int} [limit] the maximum amount of order book entries to return
493
+ * @param {int} [limit] 1,5, 400, 50 (l2-tbt, vip4+) or 40000 (vip5+) the maximum amount of order book entries to return
494
494
  * @param {object} [params] extra parameters specific to the exchange API endpoint
495
495
  * @returns {object} A dictionary of [order book structures]{@link https://docs.ccxt.com/#/?id=order-book-structure} indexed by market symbols
496
496
  */
497
497
  await this.loadMarkets();
498
498
  symbols = this.marketSymbols(symbols);
499
499
  const options = this.safeValue(this.options, 'watchOrderBook', {});
500
- const depth = this.safeString(options, 'depth', 'books');
500
+ let depth = this.safeString(options, 'depth', 'books');
501
+ if (limit !== undefined) {
502
+ if (limit === 1) {
503
+ depth = 'bbo-tbt';
504
+ }
505
+ else if (limit > 1 && limit <= 5) {
506
+ depth = 'books5';
507
+ }
508
+ else if (limit === 400) {
509
+ depth = 'books';
510
+ }
511
+ else if (limit === 50) {
512
+ depth = 'books50-l2-tbt'; // Make sure you have VIP4 and above
513
+ }
514
+ else if (limit === 4000) {
515
+ depth = 'books-l2-tbt'; // Make sure you have VIP5 and above
516
+ }
517
+ }
501
518
  if ((depth === 'books-l2-tbt') || (depth === 'books50-l2-tbt')) {
502
519
  await this.authenticate({ 'access': 'public' });
503
520
  }
package/js/src/probit.js CHANGED
@@ -624,7 +624,7 @@ export default class probit extends Exchange {
624
624
  // ]
625
625
  // }
626
626
  //
627
- const data = this.safeValue(response, 'data', []);
627
+ const data = this.safeList(response, 'data', []);
628
628
  return this.parseTickers(data, symbols);
629
629
  }
630
630
  async fetchTicker(symbol, params = {}) {
@@ -760,7 +760,7 @@ export default class probit extends Exchange {
760
760
  // ]
761
761
  // }
762
762
  //
763
- const data = this.safeValue(response, 'data', []);
763
+ const data = this.safeList(response, 'data', []);
764
764
  return this.parseTrades(data, market, since, limit);
765
765
  }
766
766
  async fetchTrades(symbol, since = undefined, limit = undefined, params = {}) {
@@ -814,7 +814,7 @@ export default class probit extends Exchange {
814
814
  // ]
815
815
  // }
816
816
  //
817
- const data = this.safeValue(response, 'data', []);
817
+ const data = this.safeList(response, 'data', []);
818
818
  return this.parseTrades(data, market, since, limit);
819
819
  }
820
820
  parseTrade(trade, market = undefined) {
@@ -1002,7 +1002,7 @@ export default class probit extends Exchange {
1002
1002
  // ]
1003
1003
  // }
1004
1004
  //
1005
- const data = this.safeValue(response, 'data', []);
1005
+ const data = this.safeList(response, 'data', []);
1006
1006
  return this.parseOHLCVs(data, market, timeframe, since, limit);
1007
1007
  }
1008
1008
  parseOHLCV(ohlcv, market = undefined) {
@@ -1049,7 +1049,7 @@ export default class probit extends Exchange {
1049
1049
  request['market_id'] = market['id'];
1050
1050
  }
1051
1051
  const response = await this.privateGetOpenOrder(this.extend(request, params));
1052
- const data = this.safeValue(response, 'data');
1052
+ const data = this.safeList(response, 'data');
1053
1053
  return this.parseOrders(data, market, since, limit);
1054
1054
  }
1055
1055
  async fetchClosedOrders(symbol = undefined, since = undefined, limit = undefined, params = {}) {
@@ -1082,7 +1082,7 @@ export default class probit extends Exchange {
1082
1082
  request['limit'] = limit;
1083
1083
  }
1084
1084
  const response = await this.privateGetOrderHistory(this.extend(request, params));
1085
- const data = this.safeValue(response, 'data');
1085
+ const data = this.safeList(response, 'data');
1086
1086
  return this.parseOrders(data, market, since, limit);
1087
1087
  }
1088
1088
  async fetchOrder(id, symbol = undefined, params = {}) {
@@ -1113,7 +1113,7 @@ export default class probit extends Exchange {
1113
1113
  const query = this.omit(params, ['clientOrderId', 'client_order_id']);
1114
1114
  const response = await this.privateGetOrder(this.extend(request, query));
1115
1115
  const data = this.safeValue(response, 'data', []);
1116
- const order = this.safeValue(data, 0);
1116
+ const order = this.safeDict(data, 0);
1117
1117
  return this.parseOrder(order, market);
1118
1118
  }
1119
1119
  parseOrderStatus(status) {
@@ -1312,7 +1312,7 @@ export default class probit extends Exchange {
1312
1312
  'order_id': id,
1313
1313
  };
1314
1314
  const response = await this.privatePostCancelOrder(this.extend(request, params));
1315
- const data = this.safeValue(response, 'data');
1315
+ const data = this.safeDict(response, 'data');
1316
1316
  return this.parseOrder(data);
1317
1317
  }
1318
1318
  parseDepositAddress(depositAddress, currency = undefined) {
@@ -1406,7 +1406,7 @@ export default class probit extends Exchange {
1406
1406
  request['currency_id'] = codes.join(',');
1407
1407
  }
1408
1408
  const response = await this.privateGetDepositAddress(this.extend(request, params));
1409
- const data = this.safeValue(response, 'data', []);
1409
+ const data = this.safeList(response, 'data', []);
1410
1410
  return this.parseDepositAddresses(data, codes);
1411
1411
  }
1412
1412
  async withdraw(code, amount, address, tag = undefined, params = {}) {
@@ -1453,7 +1453,7 @@ export default class probit extends Exchange {
1453
1453
  params = this.omit(params, 'network');
1454
1454
  }
1455
1455
  const response = await this.privatePostWithdrawal(this.extend(request, params));
1456
- const data = this.safeValue(response, 'data');
1456
+ const data = this.safeDict(response, 'data');
1457
1457
  return this.parseTransaction(data, currency);
1458
1458
  }
1459
1459
  async fetchDeposits(code = undefined, since = undefined, limit = undefined, params = {}) {
@@ -1703,7 +1703,7 @@ export default class probit extends Exchange {
1703
1703
  // ]
1704
1704
  // }
1705
1705
  //
1706
- const data = this.safeValue(response, 'data');
1706
+ const data = this.safeList(response, 'data');
1707
1707
  return this.parseDepositWithdrawFees(data, codes, 'id');
1708
1708
  }
1709
1709
  parseDepositWithdrawFee(fee, currency = undefined) {
package/js/src/timex.js CHANGED
@@ -549,7 +549,7 @@ export default class timex extends Exchange {
549
549
  // }
550
550
  // ]
551
551
  //
552
- const ticker = this.safeValue(response, 0);
552
+ const ticker = this.safeDict(response, 0);
553
553
  return this.parseTicker(ticker, market);
554
554
  }
555
555
  async fetchOrderBook(symbol, limit = undefined, params = {}) {
@@ -810,7 +810,7 @@ export default class timex extends Exchange {
810
810
  // }
811
811
  //
812
812
  const orders = this.safeValue(response, 'orders', []);
813
- const order = this.safeValue(orders, 0, {});
813
+ const order = this.safeDict(orders, 0, {});
814
814
  return this.parseOrder(order, market);
815
815
  }
816
816
  async editOrder(id, symbol, type, side, amount = undefined, price = undefined, params = {}) {
@@ -861,7 +861,7 @@ export default class timex extends Exchange {
861
861
  }
862
862
  const orders = this.safeValue(response, 'changedOrders', []);
863
863
  const firstOrder = this.safeValue(orders, 0, {});
864
- const order = this.safeValue(firstOrder, 'newOrder', {});
864
+ const order = this.safeDict(firstOrder, 'newOrder', {});
865
865
  return this.parseOrder(order, market);
866
866
  }
867
867
  async cancelOrder(id, symbol = undefined, params = {}) {
@@ -969,7 +969,7 @@ export default class timex extends Exchange {
969
969
  // }
970
970
  //
971
971
  const order = this.safeValue(response, 'order', {});
972
- const trades = this.safeValue(response, 'trades', []);
972
+ const trades = this.safeList(response, 'trades', []);
973
973
  return this.parseOrder(this.extend(order, { 'trades': trades }));
974
974
  }
975
975
  async fetchOpenOrders(symbol = undefined, since = undefined, limit = undefined, params = {}) {
@@ -1024,7 +1024,7 @@ export default class timex extends Exchange {
1024
1024
  // ]
1025
1025
  // }
1026
1026
  //
1027
- const orders = this.safeValue(response, 'orders', []);
1027
+ const orders = this.safeList(response, 'orders', []);
1028
1028
  return this.parseOrders(orders, market, since, limit);
1029
1029
  }
1030
1030
  async fetchClosedOrders(symbol = undefined, since = undefined, limit = undefined, params = {}) {
@@ -1084,7 +1084,7 @@ export default class timex extends Exchange {
1084
1084
  // ]
1085
1085
  // }
1086
1086
  //
1087
- const orders = this.safeValue(response, 'orders', []);
1087
+ const orders = this.safeList(response, 'orders', []);
1088
1088
  return this.parseOrders(orders, market, since, limit);
1089
1089
  }
1090
1090
  async fetchMyTrades(symbol = undefined, since = undefined, limit = undefined, params = {}) {
@@ -1147,7 +1147,7 @@ export default class timex extends Exchange {
1147
1147
  // ]
1148
1148
  // }
1149
1149
  //
1150
- const trades = this.safeValue(response, 'trades', []);
1150
+ const trades = this.safeList(response, 'trades', []);
1151
1151
  return this.parseTrades(trades, market, since, limit);
1152
1152
  }
1153
1153
  parseTradingFee(fee, market = undefined) {