ccxt 4.4.6 → 4.4.8

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 (55) hide show
  1. package/README.md +3 -3
  2. package/dist/ccxt.browser.min.js +2 -2
  3. package/dist/cjs/ccxt.js +1 -1
  4. package/dist/cjs/src/base/Exchange.js +21 -2
  5. package/dist/cjs/src/binance.js +51 -12
  6. package/dist/cjs/src/bingx.js +3 -0
  7. package/dist/cjs/src/bitget.js +10 -6
  8. package/dist/cjs/src/bitmart.js +124 -1
  9. package/dist/cjs/src/bybit.js +377 -10
  10. package/dist/cjs/src/gate.js +3 -0
  11. package/dist/cjs/src/htx.js +22 -0
  12. package/dist/cjs/src/kucoin.js +2 -2
  13. package/dist/cjs/src/mexc.js +97 -13
  14. package/dist/cjs/src/okx.js +4 -0
  15. package/dist/cjs/src/pro/bitget.js +66 -0
  16. package/dist/cjs/src/pro/bitmart.js +81 -0
  17. package/dist/cjs/src/pro/bitvavo.js +92 -1
  18. package/dist/cjs/src/pro/blofin.js +64 -0
  19. package/dist/cjs/src/pro/okx.js +11 -5
  20. package/examples/js/cli.js +2 -0
  21. package/js/ccxt.d.ts +1 -1
  22. package/js/ccxt.js +1 -1
  23. package/js/src/abstract/binance.d.ts +1 -0
  24. package/js/src/abstract/binancecoinm.d.ts +1 -0
  25. package/js/src/abstract/binanceus.d.ts +1 -0
  26. package/js/src/abstract/binanceusdm.d.ts +1 -0
  27. package/js/src/abstract/bybit.d.ts +5 -0
  28. package/js/src/abstract/okx.d.ts +2 -0
  29. package/js/src/base/Exchange.d.ts +4 -0
  30. package/js/src/base/Exchange.js +21 -2
  31. package/js/src/binance.d.ts +15 -15
  32. package/js/src/binance.js +51 -12
  33. package/js/src/bingx.js +3 -0
  34. package/js/src/bitget.js +10 -6
  35. package/js/src/bitmart.d.ts +1 -0
  36. package/js/src/bitmart.js +124 -1
  37. package/js/src/bybit.d.ts +7 -1
  38. package/js/src/bybit.js +377 -10
  39. package/js/src/gate.js +3 -0
  40. package/js/src/htx.js +22 -0
  41. package/js/src/kucoin.js +2 -2
  42. package/js/src/mexc.d.ts +2 -0
  43. package/js/src/mexc.js +97 -13
  44. package/js/src/okx.js +4 -0
  45. package/js/src/pro/bitget.d.ts +3 -0
  46. package/js/src/pro/bitget.js +66 -0
  47. package/js/src/pro/bitmart.d.ts +3 -0
  48. package/js/src/pro/bitmart.js +81 -0
  49. package/js/src/pro/bitvavo.d.ts +7 -2
  50. package/js/src/pro/bitvavo.js +92 -1
  51. package/js/src/pro/blofin.d.ts +3 -0
  52. package/js/src/pro/blofin.js +64 -0
  53. package/js/src/pro/okx.d.ts +1 -0
  54. package/js/src/pro/okx.js +11 -5
  55. package/package.json +1 -1
@@ -21,6 +21,7 @@ export default class blofin extends blofinRest {
21
21
  'watchOrderBookForSymbols': true,
22
22
  'watchTicker': true,
23
23
  'watchTickers': true,
24
+ 'watchBidsAsks': true,
24
25
  'watchOHLCV': true,
25
26
  'watchOHLCVForSymbols': true,
26
27
  'watchOrders': true,
@@ -273,6 +274,7 @@ export default class blofin extends blofinRest {
273
274
  // ],
274
275
  // }
275
276
  //
277
+ this.handleBidAsk(client, message);
276
278
  const arg = this.safeDict(message, 'arg');
277
279
  const channelName = this.safeString(arg, 'channel');
278
280
  const data = this.safeList(message, 'data');
@@ -287,6 +289,68 @@ export default class blofin extends blofinRest {
287
289
  parseWsTicker(ticker, market = undefined) {
288
290
  return this.parseTicker(ticker, market);
289
291
  }
292
+ async watchBidsAsks(symbols = undefined, params = {}) {
293
+ /**
294
+ * @method
295
+ * @name blofin#watchBidsAsks
296
+ * @description watches best bid & ask for symbols
297
+ * @see https://docs.blofin.com/index.html#ws-tickers-channel
298
+ * @param {string[]} symbols unified symbol of the market to fetch the ticker for
299
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
300
+ * @returns {object} a [ticker structure]{@link https://docs.ccxt.com/#/?id=ticker-structure}
301
+ */
302
+ await this.loadMarkets();
303
+ symbols = this.marketSymbols(symbols, undefined, false);
304
+ const firstMarket = this.market(symbols[0]);
305
+ const channel = 'tickers';
306
+ let marketType = undefined;
307
+ [marketType, params] = this.handleMarketTypeAndParams('watchBidsAsks', firstMarket, params);
308
+ const url = this.implodeHostname(this.urls['api']['ws'][marketType]['public']);
309
+ const messageHashes = [];
310
+ const args = [];
311
+ for (let i = 0; i < symbols.length; i++) {
312
+ const market = this.market(symbols[i]);
313
+ messageHashes.push('bidask:' + market['symbol']);
314
+ args.push({
315
+ 'channel': channel,
316
+ 'instId': market['id'],
317
+ });
318
+ }
319
+ const request = this.getSubscriptionRequest(args);
320
+ const ticker = await this.watchMultiple(url, messageHashes, this.deepExtend(request, params), messageHashes);
321
+ if (this.newUpdates) {
322
+ const tickers = {};
323
+ tickers[ticker['symbol']] = ticker;
324
+ return tickers;
325
+ }
326
+ return this.filterByArray(this.bidsasks, 'symbol', symbols);
327
+ }
328
+ handleBidAsk(client, message) {
329
+ const data = this.safeList(message, 'data');
330
+ for (let i = 0; i < data.length; i++) {
331
+ const ticker = this.parseWsBidAsk(data[i]);
332
+ const symbol = ticker['symbol'];
333
+ const messageHash = 'bidask:' + symbol;
334
+ this.bidsasks[symbol] = ticker;
335
+ client.resolve(ticker, messageHash);
336
+ }
337
+ }
338
+ parseWsBidAsk(ticker, market = undefined) {
339
+ const marketId = this.safeString(ticker, 'instId');
340
+ market = this.safeMarket(marketId, market, '-');
341
+ const symbol = this.safeString(market, 'symbol');
342
+ const timestamp = this.safeInteger(ticker, 'ts');
343
+ return this.safeTicker({
344
+ 'symbol': symbol,
345
+ 'timestamp': timestamp,
346
+ 'datetime': this.iso8601(timestamp),
347
+ 'ask': this.safeString(ticker, 'askPrice'),
348
+ 'askVolume': this.safeString(ticker, 'askSize'),
349
+ 'bid': this.safeString(ticker, 'bidPrice'),
350
+ 'bidVolume': this.safeString(ticker, 'bidSize'),
351
+ 'info': ticker,
352
+ }, market);
353
+ }
290
354
  async watchOHLCV(symbol, timeframe = '1m', since = undefined, limit = undefined, params = {}) {
291
355
  /**
292
356
  * @method
@@ -52,6 +52,7 @@ export default class okx extends okxRest {
52
52
  watchOrders(symbol?: Str, since?: Int, limit?: Int, params?: {}): Promise<Order[]>;
53
53
  handleOrders(client: Client, message: any, subscription?: any): void;
54
54
  handleMyTrades(client: Client, message: any): void;
55
+ requestId(): string;
55
56
  createOrderWs(symbol: string, type: OrderType, side: OrderSide, amount: number, price?: Num, params?: {}): Promise<Order>;
56
57
  handlePlaceOrders(client: Client, message: any): void;
57
58
  editOrderWs(id: string, symbol: string, type: OrderType, side: OrderSide, amount?: Num, price?: Num, params?: {}): Promise<Order>;
package/js/src/pro/okx.js CHANGED
@@ -1957,6 +1957,12 @@ export default class okx extends okxRest {
1957
1957
  client.resolve(this.orders, symbolMessageHash);
1958
1958
  }
1959
1959
  }
1960
+ requestId() {
1961
+ const ts = this.milliseconds().toString();
1962
+ const randomNumber = this.randNumber(4);
1963
+ const randomPart = randomNumber.toString();
1964
+ return ts + randomPart;
1965
+ }
1960
1966
  async createOrderWs(symbol, type, side, amount, price = undefined, params = {}) {
1961
1967
  /**
1962
1968
  * @method
@@ -1975,7 +1981,7 @@ export default class okx extends okxRest {
1975
1981
  await this.loadMarkets();
1976
1982
  await this.authenticate();
1977
1983
  const url = this.getUrl('private', 'private');
1978
- const messageHash = this.milliseconds().toString();
1984
+ const messageHash = this.requestId();
1979
1985
  let op = undefined;
1980
1986
  [op, params] = this.handleOptionAndParams(params, 'createOrderWs', 'op', 'batch-orders');
1981
1987
  const args = this.createOrderRequest(symbol, type, side, amount, price, params);
@@ -2045,7 +2051,7 @@ export default class okx extends okxRest {
2045
2051
  await this.loadMarkets();
2046
2052
  await this.authenticate();
2047
2053
  const url = this.getUrl('private', 'private');
2048
- const messageHash = this.milliseconds().toString();
2054
+ const messageHash = this.requestId();
2049
2055
  let op = undefined;
2050
2056
  [op, params] = this.handleOptionAndParams(params, 'editOrderWs', 'op', 'amend-order');
2051
2057
  const args = this.editOrderRequest(id, symbol, type, side, amount, price, params);
@@ -2074,7 +2080,7 @@ export default class okx extends okxRest {
2074
2080
  await this.loadMarkets();
2075
2081
  await this.authenticate();
2076
2082
  const url = this.getUrl('private', 'private');
2077
- const messageHash = this.milliseconds().toString();
2083
+ const messageHash = this.requestId();
2078
2084
  const clientOrderId = this.safeString2(params, 'clOrdId', 'clientOrderId');
2079
2085
  params = this.omit(params, ['clientOrderId', 'clOrdId']);
2080
2086
  const arg = {
@@ -2114,7 +2120,7 @@ export default class okx extends okxRest {
2114
2120
  await this.loadMarkets();
2115
2121
  await this.authenticate();
2116
2122
  const url = this.getUrl('private', 'private');
2117
- const messageHash = this.milliseconds().toString();
2123
+ const messageHash = this.requestId();
2118
2124
  const args = [];
2119
2125
  for (let i = 0; i < idsLength; i++) {
2120
2126
  const arg = {
@@ -2150,7 +2156,7 @@ export default class okx extends okxRest {
2150
2156
  throw new BadRequest(this.id + 'cancelAllOrdersWs is only applicable to Option in Portfolio Margin mode, and MMP privilege is required.');
2151
2157
  }
2152
2158
  const url = this.getUrl('private', 'private');
2153
- const messageHash = this.milliseconds().toString();
2159
+ const messageHash = this.requestId();
2154
2160
  const request = {
2155
2161
  'id': messageHash,
2156
2162
  'op': 'mass-cancel',
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ccxt",
3
- "version": "4.4.6",
3
+ "version": "4.4.8",
4
4
  "description": "A JavaScript / TypeScript / Python / C# / PHP cryptocurrency trading library with support for 100+ exchanges",
5
5
  "unpkg": "dist/ccxt.browser.min.js",
6
6
  "type": "module",