ccxt 4.1.28 → 4.1.30

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 (43) hide show
  1. package/README.md +3 -3
  2. package/dist/ccxt.browser.js +586 -62
  3. package/dist/ccxt.browser.min.js +9 -9
  4. package/dist/cjs/ccxt.js +1 -1
  5. package/dist/cjs/src/base/ws/Future.js +6 -2
  6. package/dist/cjs/src/bitget.js +286 -17
  7. package/dist/cjs/src/bitopro.js +5 -4
  8. package/dist/cjs/src/bitrue.js +33 -18
  9. package/dist/cjs/src/bybit.js +4 -0
  10. package/dist/cjs/src/cryptocom.js +32 -0
  11. package/dist/cjs/src/gate.js +58 -10
  12. package/dist/cjs/src/huobi.js +0 -1
  13. package/dist/cjs/src/huobijp.js +0 -1
  14. package/dist/cjs/src/krakenfutures.js +58 -4
  15. package/dist/cjs/src/mexc.js +95 -4
  16. package/dist/cjs/src/okx.js +1 -0
  17. package/dist/cjs/src/phemex.js +3 -0
  18. package/dist/cjs/src/pro/huobi.js +4 -0
  19. package/js/ccxt.d.ts +1 -1
  20. package/js/ccxt.js +1 -1
  21. package/js/src/abstract/bybit.d.ts +1 -0
  22. package/js/src/abstract/okex.d.ts +1 -0
  23. package/js/src/abstract/okex5.d.ts +1 -0
  24. package/js/src/abstract/okx.d.ts +1 -0
  25. package/js/src/base/ws/Future.js +6 -2
  26. package/js/src/bitget.d.ts +12 -0
  27. package/js/src/bitget.js +286 -17
  28. package/js/src/bitopro.js +5 -4
  29. package/js/src/bitrue.js +33 -18
  30. package/js/src/bybit.js +4 -0
  31. package/js/src/cryptocom.d.ts +1 -0
  32. package/js/src/cryptocom.js +32 -0
  33. package/js/src/gate.js +58 -10
  34. package/js/src/huobi.js +0 -1
  35. package/js/src/huobijp.js +0 -1
  36. package/js/src/krakenfutures.d.ts +1 -1
  37. package/js/src/krakenfutures.js +58 -4
  38. package/js/src/mexc.d.ts +3 -1
  39. package/js/src/mexc.js +95 -4
  40. package/js/src/okx.js +1 -0
  41. package/js/src/phemex.js +3 -0
  42. package/js/src/pro/huobi.js +4 -0
  43. package/package.json +1 -1
package/dist/cjs/ccxt.js CHANGED
@@ -180,7 +180,7 @@ var woo$1 = require('./src/pro/woo.js');
180
180
 
181
181
  //-----------------------------------------------------------------------------
182
182
  // this is updated by vss.js when building
183
- const version = '4.1.28';
183
+ const version = '4.1.30';
184
184
  Exchange["default"].ccxtVersion = version;
185
185
  const exchanges = {
186
186
  'ace': ace,
@@ -11,11 +11,15 @@ function createFuture() {
11
11
  });
12
12
  p.resolve = function _resolve() {
13
13
  // eslint-disable-next-line prefer-rest-params
14
- resolve.apply(this, arguments);
14
+ setTimeout(() => {
15
+ resolve.apply(this, arguments);
16
+ });
15
17
  };
16
18
  p.reject = function _reject() {
17
19
  // eslint-disable-next-line prefer-rest-params
18
- reject.apply(this, arguments);
20
+ setTimeout(() => {
21
+ reject.apply(this, arguments);
22
+ });
19
23
  };
20
24
  return p;
21
25
  }
@@ -25,7 +25,7 @@ class bitget extends bitget$1 {
25
25
  'has': {
26
26
  'CORS': undefined,
27
27
  'spot': true,
28
- 'margin': undefined,
28
+ 'margin': true,
29
29
  'swap': true,
30
30
  'future': true,
31
31
  'option': false,
@@ -40,6 +40,7 @@ class bitget extends bitget$1 {
40
40
  'editOrder': true,
41
41
  'fetchAccounts': false,
42
42
  'fetchBalance': true,
43
+ 'fetchBorrowInterest': true,
43
44
  'fetchBorrowRate': true,
44
45
  'fetchBorrowRateHistories': false,
45
46
  'fetchBorrowRateHistory': false,
@@ -1491,20 +1492,47 @@ class bitget extends bitget$1 {
1491
1492
  * @name bitget#fetchMarketLeverageTiers
1492
1493
  * @description retrieve information on the maximum leverage, and maintenance margin for trades of varying trade sizes for a single market
1493
1494
  * @see https://bitgetlimited.github.io/apidoc/en/mix/#get-position-tier
1495
+ * @see https://bitgetlimited.github.io/apidoc/en/margin/#get-isolated-tier-data
1496
+ * @see https://bitgetlimited.github.io/apidoc/en/margin/#get-cross-tier-data
1494
1497
  * @param {string} symbol unified market symbol
1495
1498
  * @param {object} [params] extra parameters specific to the bitget api endpoint
1499
+ * @param {string} [params.marginMode] for spot margin 'cross' or 'isolated', default is 'isolated'
1500
+ * @param {string} [params.code] required for cross spot margin
1496
1501
  * @returns {object} a [leverage tiers structure]{@link https://github.com/ccxt/ccxt/wiki/Manual#leverage-tiers-structure}
1497
1502
  */
1498
1503
  await this.loadMarkets();
1499
1504
  const request = {};
1500
- let market = undefined;
1501
- market = this.market(symbol);
1502
- if (market['spot']) {
1505
+ const market = this.market(symbol);
1506
+ let type = undefined;
1507
+ [type, params] = this.handleMarketTypeAndParams('fetchMarketLeverageTiers', market, params);
1508
+ let response = undefined;
1509
+ let marginMode = undefined;
1510
+ [marginMode, params] = this.handleMarginModeAndParams('fetchMarketLeverageTiers', params, 'isolated');
1511
+ if ((type === 'swap') || (type === 'future')) {
1512
+ const marketId = market['id'];
1513
+ const parts = marketId.split('_');
1514
+ const productType = this.safeStringUpper(parts, 1);
1515
+ request['symbol'] = marketId;
1516
+ request['productType'] = productType;
1517
+ response = await this.publicMixGetMarketQueryPositionLever(this.extend(request, params));
1518
+ }
1519
+ else if (marginMode === 'isolated') {
1520
+ request['symbol'] = market['info']['symbolName'];
1521
+ response = await this.publicMarginGetIsolatedPublicTierData(this.extend(request, params));
1522
+ }
1523
+ else if (marginMode === 'cross') {
1524
+ const code = this.safeString(params, 'code');
1525
+ this.checkRequiredArgument('fetchMarketLeverageTiers', code, 'code');
1526
+ params = this.omit(params, 'code');
1527
+ const currency = this.currency(code);
1528
+ request['coin'] = currency['code'];
1529
+ response = await this.publicMarginGetCrossPublicTierData(this.extend(request, params));
1530
+ }
1531
+ else {
1503
1532
  throw new errors.BadRequest(this.id + ' fetchMarketLeverageTiers() symbol does not support market ' + symbol);
1504
1533
  }
1505
- request['symbol'] = market['id'];
1506
- request['productType'] = 'UMCBL';
1507
- const response = await this.publicMixGetMarketQueryPositionLever(this.extend(request, params));
1534
+ //
1535
+ // swap and future
1508
1536
  //
1509
1537
  // {
1510
1538
  // "code":"00000",
@@ -1521,10 +1549,50 @@ class bitget extends bitget$1 {
1521
1549
  // "requestTime":1627292076687
1522
1550
  // }
1523
1551
  //
1524
- const result = this.safeValue(response, 'data');
1552
+ // isolated
1553
+ //
1554
+ // {
1555
+ // "code": "00000",
1556
+ // "msg": "success",
1557
+ // "requestTime": 1698352496622,
1558
+ // "data": [
1559
+ // {
1560
+ // "tier": "1",
1561
+ // "symbol": "BTCUSDT",
1562
+ // "leverage": "10",
1563
+ // "baseCoin": "BTC",
1564
+ // "quoteCoin": "USDT",
1565
+ // "baseMaxBorrowableAmount": "3",
1566
+ // "quoteMaxBorrowableAmount": "30000",
1567
+ // "maintainMarginRate": "0.05",
1568
+ // "initRate": "0.1111"
1569
+ // },
1570
+ // ]
1571
+ // }
1572
+ //
1573
+ // cross
1574
+ //
1575
+ // {
1576
+ // "code": "00000",
1577
+ // "msg": "success",
1578
+ // "requestTime": 1698352997077,
1579
+ // "data": [
1580
+ // {
1581
+ // "tier": "1",
1582
+ // "leverage": "3",
1583
+ // "coin": "BTC",
1584
+ // "maxBorrowableAmount": "26",
1585
+ // "maintainMarginRate": "0.1"
1586
+ // }
1587
+ // ]
1588
+ // }
1589
+ //
1590
+ const result = this.safeValue(response, 'data', []);
1525
1591
  return this.parseMarketLeverageTiers(result, market);
1526
1592
  }
1527
1593
  parseMarketLeverageTiers(info, market = undefined) {
1594
+ //
1595
+ // swap and future
1528
1596
  //
1529
1597
  // [
1530
1598
  // {
@@ -1534,22 +1602,57 @@ class bitget extends bitget$1 {
1534
1602
  // "leverage": 125,
1535
1603
  // "keepMarginRate": "0.004"
1536
1604
  // }
1537
- // ],
1605
+ // ]
1606
+ //
1607
+ // isolated
1608
+ //
1609
+ // [
1610
+ // {
1611
+ // "tier": "1",
1612
+ // "symbol": "BTCUSDT",
1613
+ // "leverage": "10",
1614
+ // "baseCoin": "BTC",
1615
+ // "quoteCoin": "USDT",
1616
+ // "baseMaxBorrowableAmount": "3",
1617
+ // "quoteMaxBorrowableAmount": "30000",
1618
+ // "maintainMarginRate": "0.05",
1619
+ // "initRate": "0.1111"
1620
+ // }
1621
+ // ]
1622
+ //
1623
+ // cross
1624
+ //
1625
+ // [
1626
+ // {
1627
+ // "tier": "1",
1628
+ // "leverage": "3",
1629
+ // "coin": "BTC",
1630
+ // "maxBorrowableAmount": "26",
1631
+ // "maintainMarginRate": "0.1"
1632
+ // }
1633
+ // ]
1538
1634
  //
1539
1635
  const tiers = [];
1636
+ let minNotional = 0;
1540
1637
  for (let i = 0; i < info.length; i++) {
1541
1638
  const item = info[i];
1542
- const minNotional = this.safeNumber(item, 'startUnit');
1543
- const maxNotional = this.safeNumber(item, 'endUnit');
1639
+ const minimumNotional = this.safeNumber(item, 'startUnit');
1640
+ if (minimumNotional !== undefined) {
1641
+ minNotional = minimumNotional;
1642
+ }
1643
+ const maxNotional = this.safeNumberN(item, ['endUnit', 'maxBorrowableAmount', 'baseMaxBorrowableAmount']);
1644
+ const marginCurrency = this.safeString2(item, 'coin', 'baseCoin');
1645
+ const currencyId = (marginCurrency !== undefined) ? marginCurrency : market['base'];
1544
1646
  tiers.push({
1545
- 'tier': this.sum(i, 1),
1546
- 'currency': market['base'],
1647
+ 'tier': this.safeInteger2(item, 'level', 'tier'),
1648
+ 'currency': this.safeCurrencyCode(currencyId),
1547
1649
  'minNotional': minNotional,
1548
1650
  'maxNotional': maxNotional,
1549
- 'maintenanceMarginRate': this.safeNumber(item, 'keepMarginRate'),
1651
+ 'maintenanceMarginRate': this.safeNumber2(item, 'keepMarginRate', 'maintainMarginRate'),
1550
1652
  'maxLeverage': this.safeNumber(item, 'leverage'),
1551
1653
  'info': item,
1552
1654
  });
1655
+ minNotional = maxNotional;
1553
1656
  }
1554
1657
  return tiers;
1555
1658
  }
@@ -3331,12 +3434,16 @@ class bitget extends bitget$1 {
3331
3434
  * @description create a list of trade orders (all orders should be of the same symbol)
3332
3435
  * @see https://bitgetlimited.github.io/apidoc/en/spot/#batch-order
3333
3436
  * @see https://bitgetlimited.github.io/apidoc/en/mix/#batch-order
3437
+ * @see https://bitgetlimited.github.io/apidoc/en/margin/#isolated-batch-order
3438
+ * @see https://bitgetlimited.github.io/apidoc/en/margin/#cross-batch-order
3334
3439
  * @param {array} orders list of orders to create, each object should contain the parameters required by createOrder, namely symbol, type, side, amount, price and params
3440
+ * @param {object} [params] extra parameters specific to the api endpoint
3335
3441
  * @returns {object} an [order structure]{@link https://github.com/ccxt/ccxt/wiki/Manual#order-structure}
3336
3442
  */
3337
3443
  await this.loadMarkets();
3338
3444
  const ordersRequests = [];
3339
3445
  let symbol = undefined;
3446
+ let marginMode = undefined;
3340
3447
  for (let i = 0; i < orders.length; i++) {
3341
3448
  const rawOrder = orders[i];
3342
3449
  const marketId = this.safeString(rawOrder, 'symbol');
@@ -3353,23 +3460,44 @@ class bitget extends bitget$1 {
3353
3460
  const amount = this.safeValue(rawOrder, 'amount');
3354
3461
  const price = this.safeValue(rawOrder, 'price');
3355
3462
  const orderParams = this.safeValue(rawOrder, 'params', {});
3463
+ const marginResult = this.handleMarginModeAndParams('createOrders', params);
3464
+ const currentMarginMode = marginResult[0];
3465
+ if (currentMarginMode !== undefined) {
3466
+ if (marginMode === undefined) {
3467
+ marginMode = currentMarginMode;
3468
+ }
3469
+ else {
3470
+ if (marginMode !== currentMarginMode) {
3471
+ throw new errors.BadRequest(this.id + ' createOrders() requires all orders to have the same margin mode (isolated or cross)');
3472
+ }
3473
+ }
3474
+ }
3356
3475
  const orderRequest = this.createOrderRequest(marketId, type, side, amount, price, orderParams);
3357
3476
  ordersRequests.push(orderRequest);
3358
3477
  }
3359
3478
  const market = this.market(symbol);
3479
+ const symbolRequest = (marginMode !== undefined) ? (market['info']['symbolName']) : (market['id']);
3360
3480
  const request = {
3361
- 'symbol': market['id'],
3481
+ 'symbol': symbolRequest,
3362
3482
  };
3363
3483
  let response = undefined;
3364
3484
  if (market['spot']) {
3365
3485
  request['orderList'] = ordersRequests;
3366
- response = await this.privateSpotPostTradeBatchOrders(request);
3367
3486
  }
3368
- else {
3487
+ if ((market['swap']) || (market['future'])) {
3369
3488
  request['orderDataList'] = ordersRequests;
3370
3489
  request['marginCoin'] = market['settleId'];
3371
3490
  response = await this.privateMixPostOrderBatchOrders(request);
3372
3491
  }
3492
+ else if (marginMode === 'isolated') {
3493
+ response = await this.privateMarginPostIsolatedOrderBatchPlaceOrder(request);
3494
+ }
3495
+ else if (marginMode === 'cross') {
3496
+ response = await this.privateMarginPostCrossOrderBatchPlaceOrder(request);
3497
+ }
3498
+ else {
3499
+ response = await this.privateSpotPostTradeBatchOrders(request);
3500
+ }
3373
3501
  //
3374
3502
  // {
3375
3503
  // "code": "00000",
@@ -6374,6 +6502,147 @@ class bitget extends bitget$1 {
6374
6502
  'info': info,
6375
6503
  };
6376
6504
  }
6505
+ async fetchBorrowInterest(code = undefined, symbol = undefined, since = undefined, limit = undefined, params = {}) {
6506
+ /**
6507
+ * @method
6508
+ * @name bitget#fetchBorrowInterest
6509
+ * @description fetch the interest owed by the user for borrowing currency for margin trading
6510
+ * @see https://bitgetlimited.github.io/apidoc/en/margin/#get-isolated-interest-records
6511
+ * @see https://bitgetlimited.github.io/apidoc/en/margin/#get-cross-interest-records
6512
+ * @param {string} [code] unified currency code
6513
+ * @param {string} [symbol] unified market symbol when fetching interest in isolated markets
6514
+ * @param {int} [since] the earliest time in ms to fetch borrow interest for
6515
+ * @param {int} [limit] the maximum number of structures to retrieve
6516
+ * @param {object} [params] extra parameters specific to the bitget api endpoint
6517
+ * @returns {object[]} a list of [borrow interest structures]{@link https://github.com/ccxt/ccxt/wiki/Manual#borrow-interest-structure}
6518
+ */
6519
+ await this.loadMarkets();
6520
+ let market = undefined;
6521
+ if (symbol !== undefined) {
6522
+ market = this.market(symbol);
6523
+ }
6524
+ const request = {};
6525
+ let currency = undefined;
6526
+ if (code !== undefined) {
6527
+ currency = this.currency(code);
6528
+ request['coin'] = currency['id'];
6529
+ }
6530
+ if (since !== undefined) {
6531
+ request['startTime'] = since;
6532
+ }
6533
+ else {
6534
+ request['startTime'] = this.milliseconds() - 7776000000;
6535
+ }
6536
+ if (limit !== undefined) {
6537
+ request['pageSize'] = limit;
6538
+ }
6539
+ let response = undefined;
6540
+ let marginMode = undefined;
6541
+ [marginMode, params] = this.handleMarginModeAndParams('fetchBorrowInterest', params, 'cross');
6542
+ if (marginMode === 'isolated') {
6543
+ this.checkRequiredSymbol('fetchBorrowInterest', symbol);
6544
+ request['symbol'] = market['info']['symbolName'];
6545
+ response = await this.privateMarginGetIsolatedInterestList(this.extend(request, params));
6546
+ }
6547
+ else if (marginMode === 'cross') {
6548
+ response = await this.privateMarginGetCrossInterestList(this.extend(request, params));
6549
+ }
6550
+ //
6551
+ // isolated
6552
+ //
6553
+ // {
6554
+ // "code": "00000",
6555
+ // "msg": "success",
6556
+ // "requestTime": 1698282523888,
6557
+ // "data": {
6558
+ // "resultList": [
6559
+ // {
6560
+ // "interestId": "1100560904468705284",
6561
+ // "interestCoin": "USDT",
6562
+ // "interestRate": "0.000126279",
6563
+ // "loanCoin": "USDT",
6564
+ // "amount": "0.00000298",
6565
+ // "type": "scheduled",
6566
+ // "symbol": "BTCUSDT",
6567
+ // "ctime": "1698120000000"
6568
+ // },
6569
+ // ],
6570
+ // "maxId": "1100560904468705284",
6571
+ // "minId": "1096915487398965249"
6572
+ // }
6573
+ // }
6574
+ //
6575
+ // cross
6576
+ //
6577
+ // {
6578
+ // "code": "00000",
6579
+ // "msg": "success",
6580
+ // "requestTime": 1698282552126,
6581
+ // "data": {
6582
+ // "resultList": [
6583
+ // {
6584
+ // "interestId": "1099126154352799744",
6585
+ // "interestCoin": "USDT",
6586
+ // "interestRate": "0.000126279",
6587
+ // "loanCoin": "USDT",
6588
+ // "amount": "0.00002631",
6589
+ // "type": "scheduled",
6590
+ // "ctime": "1697778000000"
6591
+ // },
6592
+ // ],
6593
+ // "maxId": "1099126154352799744",
6594
+ // "minId": "1096917004629716993"
6595
+ // }
6596
+ // }
6597
+ //
6598
+ const data = this.safeValue(response, 'data', {});
6599
+ const rows = this.safeValue(data, 'resultList', []);
6600
+ const interest = this.parseBorrowInterests(rows, market);
6601
+ return this.filterByCurrencySinceLimit(interest, code, since, limit);
6602
+ }
6603
+ parseBorrowInterest(info, market = undefined) {
6604
+ //
6605
+ // isolated
6606
+ //
6607
+ // {
6608
+ // "interestId": "1100560904468705284",
6609
+ // "interestCoin": "USDT",
6610
+ // "interestRate": "0.000126279",
6611
+ // "loanCoin": "USDT",
6612
+ // "amount": "0.00000298",
6613
+ // "type": "scheduled",
6614
+ // "symbol": "BTCUSDT",
6615
+ // "ctime": "1698120000000"
6616
+ // }
6617
+ //
6618
+ // cross
6619
+ //
6620
+ // {
6621
+ // "interestId": "1099126154352799744",
6622
+ // "interestCoin": "USDT",
6623
+ // "interestRate": "0.000126279",
6624
+ // "loanCoin": "USDT",
6625
+ // "amount": "0.00002631",
6626
+ // "type": "scheduled",
6627
+ // "ctime": "1697778000000"
6628
+ // }
6629
+ //
6630
+ const marketId = this.safeString(info, 'symbol');
6631
+ market = this.safeMarket(marketId, market);
6632
+ const marginMode = (marketId !== undefined) ? 'isolated' : 'cross';
6633
+ const timestamp = this.safeInteger(info, 'ctime');
6634
+ return {
6635
+ 'symbol': this.safeString(market, 'symbol'),
6636
+ 'marginMode': marginMode,
6637
+ 'currency': this.safeCurrencyCode(this.safeString(info, 'interestCoin')),
6638
+ 'interest': this.safeNumber(info, 'amount'),
6639
+ 'interestRate': this.safeNumber(info, 'interestRate'),
6640
+ 'amountBorrowed': undefined,
6641
+ 'timestamp': timestamp,
6642
+ 'datetime': this.iso8601(timestamp),
6643
+ 'info': info,
6644
+ };
6645
+ }
6377
6646
  handleErrors(code, reason, url, method, headers, body, response, requestHeaders, requestBody) {
6378
6647
  if (!response) {
6379
6648
  return undefined; // fallback to default error handler
@@ -1121,14 +1121,15 @@ class bitopro extends bitopro$1 {
1121
1121
  const request = {
1122
1122
  // 'pair': market['id'], // optional
1123
1123
  };
1124
- // privateDeleteOrdersAll or privateDeleteOrdersPair
1125
- let method = this.safeString(this.options, 'privateDeleteOrdersPair', 'privateDeleteOrdersAll');
1124
+ let response = undefined;
1126
1125
  if (symbol !== undefined) {
1127
1126
  const market = this.market(symbol);
1128
1127
  request['pair'] = market['id'];
1129
- method = 'privateDeleteOrdersPair';
1128
+ response = await this.privateDeleteOrdersPair(this.extend(request, params));
1129
+ }
1130
+ else {
1131
+ response = await this.privateDeleteOrdersAll(this.extend(request, params));
1130
1132
  }
1131
- const response = await this[method](this.extend(request, params));
1132
1133
  const result = this.safeValue(response, 'data', {});
1133
1134
  //
1134
1135
  // {
@@ -796,6 +796,16 @@ class bitrue extends bitrue$1 {
796
796
  return orderbook;
797
797
  }
798
798
  parseTicker(ticker, market = undefined) {
799
+ //
800
+ // fetchBidsAsks
801
+ //
802
+ // {
803
+ // "symbol": "LTCBTC",
804
+ // "bidPrice": "4.00000000",
805
+ // "bidQty": "431.00000000",
806
+ // "askPrice": "4.00000200",
807
+ // "askQty": "9.00000000"
808
+ // }
799
809
  //
800
810
  // fetchTicker
801
811
  //
@@ -820,10 +830,10 @@ class bitrue extends bitrue$1 {
820
830
  'datetime': undefined,
821
831
  'high': this.safeString(ticker, 'high24hr'),
822
832
  'low': this.safeString(ticker, 'low24hr'),
823
- 'bid': this.safeString(ticker, 'highestBid'),
824
- 'bidVolume': undefined,
825
- 'ask': this.safeString(ticker, 'lowestAsk'),
826
- 'askVolume': undefined,
833
+ 'bid': this.safeString2(ticker, 'highestBid', 'bidPrice'),
834
+ 'bidVolume': this.safeString(ticker, 'bidQty'),
835
+ 'ask': this.safeString2(ticker, 'lowestAsk', 'askPrice'),
836
+ 'askVolume': this.safeString(ticker, 'askQty'),
827
837
  'vwap': undefined,
828
838
  'open': undefined,
829
839
  'close': last,
@@ -951,26 +961,31 @@ class bitrue extends bitrue$1 {
951
961
  * @method
952
962
  * @name bitrue#fetchBidsAsks
953
963
  * @description fetches the bid and ask price and volume for multiple markets
964
+ * @see https://github.com/Bitrue-exchange/Spot-official-api-docs#symbol-order-book-ticker
954
965
  * @param {string[]|undefined} symbols unified symbols of the markets to fetch the bids and asks for, all markets are returned if not assigned
955
966
  * @param {object} [params] extra parameters specific to the bitrue api endpoint
956
967
  * @returns {object} a dictionary of [ticker structures]{@link https://github.com/ccxt/ccxt/wiki/Manual#ticker-structure}
957
968
  */
958
969
  await this.loadMarkets();
959
- const defaultType = this.safeString2(this.options, 'fetchBidsAsks', 'defaultType', 'spot');
960
- const type = this.safeString(params, 'type', defaultType);
961
- const query = this.omit(params, 'type');
962
- let method = undefined;
963
- if (type === 'future') {
964
- method = 'fapiPublicGetTickerBookTicker';
965
- }
966
- else if (type === 'delivery') {
967
- method = 'dapiPublicGetTickerBookTicker';
968
- }
969
- else {
970
- method = 'publicGetTickerBookTicker';
970
+ symbols = this.marketSymbols(symbols);
971
+ let market = undefined;
972
+ const request = {};
973
+ if (symbols !== undefined) {
974
+ const first = this.safeString(symbols, 0);
975
+ market = this.market(first);
976
+ request['symbol'] = market['id'];
971
977
  }
972
- const response = await this[method](query);
973
- return this.parseTickers(response, symbols);
978
+ const response = await this.v1PublicGetTickerBookTicker(this.extend(request, params));
979
+ // {
980
+ // "symbol": "LTCBTC",
981
+ // "bidPrice": "4.00000000",
982
+ // "bidQty": "431.00000000",
983
+ // "askPrice": "4.00000200",
984
+ // "askQty": "9.00000000"
985
+ // }
986
+ const data = {};
987
+ data[market['id']] = response;
988
+ return this.parseTickers(data, symbols);
974
989
  }
975
990
  async fetchTickers(symbols = undefined, params = {}) {
976
991
  /**
@@ -616,6 +616,7 @@ class bybit extends bybit$1 {
616
616
  'v5/position/trading-stop': 5,
617
617
  'v5/position/set-auto-add-margin': 2.5,
618
618
  'v5/position/add-margin': 2.5,
619
+ 'v5/position/confirm-pending-mmr': 2.5,
619
620
  // account
620
621
  'v5/account/upgrade-to-uta': 2.5,
621
622
  'v5/account/set-margin-mode': 2.5,
@@ -3189,8 +3190,11 @@ class bybit extends bybit$1 {
3189
3190
  // "time": 1672125441042
3190
3191
  // }
3191
3192
  //
3193
+ const timestamp = this.safeInteger(response, 'time');
3192
3194
  const result = {
3193
3195
  'info': response,
3196
+ 'timestamp': timestamp,
3197
+ 'datetime': this.iso8601(timestamp),
3194
3198
  };
3195
3199
  const responseResult = this.safeValue(response, 'result', {});
3196
3200
  const currencyList = this.safeValueN(responseResult, ['loanAccountList', 'list', 'balance']);
@@ -32,6 +32,7 @@ class cryptocom extends cryptocom$1 {
32
32
  'borrowMargin': true,
33
33
  'cancelAllOrders': true,
34
34
  'cancelOrder': true,
35
+ 'cancelOrders': true,
35
36
  'createOrder': true,
36
37
  'createOrders': true,
37
38
  'fetchAccounts': true,
@@ -1426,6 +1427,37 @@ class cryptocom extends cryptocom$1 {
1426
1427
  const result = this.safeValue(response, 'result', {});
1427
1428
  return this.parseOrder(result, market);
1428
1429
  }
1430
+ async cancelOrders(ids, symbol = undefined, params = {}) {
1431
+ /**
1432
+ * @method
1433
+ * @name cryptocom#cancelOrders
1434
+ * @description cancel multiple orders
1435
+ * @see https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#private-cancel-order-list-list
1436
+ * @param {string[]} ids order ids
1437
+ * @param {string} symbol unified market symbol
1438
+ * @param {object} [params] extra parameters specific to the okx api endpoint
1439
+ * @returns {object} an list of [order structures]{@link https://github.com/ccxt/ccxt/wiki/Manual#order-structure}
1440
+ */
1441
+ this.checkRequiredSymbol('cancelOrders', symbol);
1442
+ await this.loadMarkets();
1443
+ const market = this.market(symbol);
1444
+ const orderRequests = [];
1445
+ for (let i = 0; i < ids.length; i++) {
1446
+ const id = ids[i];
1447
+ const order = {
1448
+ 'instrument_name': market['id'],
1449
+ 'order_id': id.toString(),
1450
+ };
1451
+ orderRequests.push(order);
1452
+ }
1453
+ const request = {
1454
+ 'contingency_type': 'LIST',
1455
+ 'order_list': orderRequests,
1456
+ };
1457
+ const response = await this.v1PrivatePostPrivateCancelOrderList(this.extend(request, params));
1458
+ const result = this.safeValue(response, 'result', []);
1459
+ return this.parseOrders(result, market, undefined, undefined, params);
1460
+ }
1429
1461
  async fetchOpenOrders(symbol = undefined, since = undefined, limit = undefined, params = {}) {
1430
1462
  /**
1431
1463
  * @method