ccxt 4.1.36 → 4.1.38

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 (143) hide show
  1. package/README.md +4 -4
  2. package/dist/ccxt.browser.js +1767 -446
  3. package/dist/ccxt.browser.min.js +3 -3
  4. package/dist/cjs/ccxt.js +1 -1
  5. package/dist/cjs/src/base/Exchange.js +19 -0
  6. package/dist/cjs/src/base/errors.js +6 -6
  7. package/dist/cjs/src/binance.js +2 -2
  8. package/dist/cjs/src/bingx.js +106 -0
  9. package/dist/cjs/src/bitforex.js +26 -1
  10. package/dist/cjs/src/bitget.js +2 -2
  11. package/dist/cjs/src/bitmart.js +2 -2
  12. package/dist/cjs/src/bitmex.js +3 -3
  13. package/dist/cjs/src/bybit.js +1 -0
  14. package/dist/cjs/src/deribit.js +2 -2
  15. package/dist/cjs/src/digifinex.js +204 -52
  16. package/dist/cjs/src/gate.js +2 -2
  17. package/dist/cjs/src/hollaex.js +7 -7
  18. package/dist/cjs/src/huobi.js +20 -4
  19. package/dist/cjs/src/kucoinfutures.js +0 -3
  20. package/dist/cjs/src/kuna.js +1284 -350
  21. package/dist/cjs/src/latoken.js +2 -2
  22. package/dist/cjs/src/pro/bitget.js +50 -7
  23. package/dist/cjs/src/wazirx.js +23 -1
  24. package/js/ccxt.d.ts +1 -1
  25. package/js/ccxt.js +1 -1
  26. package/js/src/abstract/bybit.d.ts +1 -0
  27. package/js/src/abstract/kuna.d.ts +29 -27
  28. package/js/src/ace.d.ts +7 -7
  29. package/js/src/alpaca.d.ts +7 -7
  30. package/js/src/ascendex.d.ts +3 -3
  31. package/js/src/base/Exchange.d.ts +3 -2
  32. package/js/src/base/Exchange.js +19 -0
  33. package/js/src/base/errorHierarchy.d.ts +1 -1
  34. package/js/src/base/errorHierarchy.js +1 -1
  35. package/js/src/base/errors.d.ts +3 -3
  36. package/js/src/base/errors.js +6 -6
  37. package/js/src/bigone.d.ts +10 -10
  38. package/js/src/binance.d.ts +48 -15
  39. package/js/src/binance.js +2 -2
  40. package/js/src/bingx.d.ts +10 -8
  41. package/js/src/bingx.js +106 -0
  42. package/js/src/bit2c.d.ts +5 -5
  43. package/js/src/bitbank.d.ts +7 -7
  44. package/js/src/bitbns.d.ts +6 -6
  45. package/js/src/bitfinex.d.ts +9 -9
  46. package/js/src/bitfinex2.d.ts +1 -1
  47. package/js/src/bitforex.d.ts +8 -8
  48. package/js/src/bitforex.js +26 -1
  49. package/js/src/bitget.d.ts +2 -12
  50. package/js/src/bitget.js +2 -2
  51. package/js/src/bithumb.d.ts +7 -7
  52. package/js/src/bitmart.d.ts +11 -21
  53. package/js/src/bitmart.js +2 -2
  54. package/js/src/bitmex.d.ts +2 -12
  55. package/js/src/bitmex.js +3 -3
  56. package/js/src/bitopro.d.ts +9 -9
  57. package/js/src/bitpanda.d.ts +8 -8
  58. package/js/src/bitrue.d.ts +9 -9
  59. package/js/src/bitso.d.ts +7 -7
  60. package/js/src/bitstamp.d.ts +7 -7
  61. package/js/src/bittrex.d.ts +9 -9
  62. package/js/src/bitvavo.d.ts +1 -1
  63. package/js/src/blockchaincom.d.ts +8 -8
  64. package/js/src/btcalpha.d.ts +9 -9
  65. package/js/src/btcbox.d.ts +8 -8
  66. package/js/src/btcmarkets.d.ts +3 -3
  67. package/js/src/btctradeua.d.ts +3 -3
  68. package/js/src/btcturk.d.ts +6 -6
  69. package/js/src/bybit.d.ts +1 -1
  70. package/js/src/bybit.js +1 -0
  71. package/js/src/cex.d.ts +3 -3
  72. package/js/src/coinbase.d.ts +1 -1
  73. package/js/src/coinbasepro.d.ts +1 -1
  74. package/js/src/coinex.d.ts +11 -11
  75. package/js/src/coinfalcon.d.ts +6 -6
  76. package/js/src/coinmate.d.ts +6 -6
  77. package/js/src/coinone.d.ts +5 -5
  78. package/js/src/coinsph.d.ts +10 -10
  79. package/js/src/cryptocom.d.ts +1 -1
  80. package/js/src/currencycom.d.ts +8 -8
  81. package/js/src/delta.d.ts +10 -10
  82. package/js/src/deribit.d.ts +9 -19
  83. package/js/src/deribit.js +2 -2
  84. package/js/src/digifinex.d.ts +10 -8
  85. package/js/src/digifinex.js +204 -52
  86. package/js/src/exmo.d.ts +3 -3
  87. package/js/src/gate.d.ts +2 -12
  88. package/js/src/gate.js +2 -2
  89. package/js/src/gemini.d.ts +6 -6
  90. package/js/src/hitbtc.d.ts +1 -1
  91. package/js/src/hollaex.d.ts +12 -12
  92. package/js/src/hollaex.js +7 -7
  93. package/js/src/huobi.d.ts +2 -12
  94. package/js/src/huobi.js +20 -4
  95. package/js/src/huobijp.d.ts +3 -3
  96. package/js/src/idex.d.ts +3 -3
  97. package/js/src/independentreserve.d.ts +6 -6
  98. package/js/src/kraken.d.ts +8 -8
  99. package/js/src/krakenfutures.d.ts +8 -8
  100. package/js/src/kucoin.d.ts +1 -1
  101. package/js/src/kucoinfutures.d.ts +4 -5
  102. package/js/src/kucoinfutures.js +0 -3
  103. package/js/src/kuna.d.ts +155 -7
  104. package/js/src/kuna.js +1290 -351
  105. package/js/src/latoken.d.ts +7 -7
  106. package/js/src/latoken.js +2 -2
  107. package/js/src/lbank.d.ts +3 -3
  108. package/js/src/lbank2.d.ts +10 -10
  109. package/js/src/luno.d.ts +8 -8
  110. package/js/src/lykke.d.ts +6 -6
  111. package/js/src/mercado.d.ts +9 -9
  112. package/js/src/mexc.d.ts +17 -17
  113. package/js/src/ndax.d.ts +9 -9
  114. package/js/src/novadax.d.ts +10 -10
  115. package/js/src/oceanex.d.ts +3 -3
  116. package/js/src/okcoin.d.ts +9 -9
  117. package/js/src/okx.d.ts +1 -1
  118. package/js/src/phemex.d.ts +13 -13
  119. package/js/src/poloniex.d.ts +9 -9
  120. package/js/src/poloniexfutures.d.ts +8 -8
  121. package/js/src/pro/bingx.d.ts +2 -2
  122. package/js/src/pro/bitget.d.ts +3 -3
  123. package/js/src/pro/bitget.js +50 -7
  124. package/js/src/pro/bybit.d.ts +3 -3
  125. package/js/src/pro/hitbtc.d.ts +2 -2
  126. package/js/src/pro/mexc.d.ts +2 -2
  127. package/js/src/pro/poloniex.d.ts +2 -2
  128. package/js/src/pro/wazirx.d.ts +2 -2
  129. package/js/src/probit.d.ts +9 -9
  130. package/js/src/tidex.d.ts +5 -5
  131. package/js/src/timex.d.ts +9 -9
  132. package/js/src/tokocrypto.d.ts +10 -10
  133. package/js/src/upbit.d.ts +11 -11
  134. package/js/src/wavesexchange.d.ts +9 -9
  135. package/js/src/wazirx.d.ts +8 -8
  136. package/js/src/wazirx.js +23 -1
  137. package/js/src/whitebit.d.ts +3 -3
  138. package/js/src/woo.d.ts +8 -8
  139. package/js/src/yobit.d.ts +6 -6
  140. package/js/src/zaif.d.ts +5 -5
  141. package/js/src/zonda.d.ts +6 -6
  142. package/package.json +1 -1
  143. package/skip-tests.json +6 -1
@@ -31,6 +31,7 @@ class digifinex extends digifinex$1 {
31
31
  'cancelOrder': true,
32
32
  'cancelOrders': true,
33
33
  'createOrder': true,
34
+ 'createOrders': true,
34
35
  'createPostOnlyOrder': true,
35
36
  'createReduceOnlyOrder': true,
36
37
  'createStopLimitOrder': false,
@@ -288,6 +289,7 @@ class digifinex extends digifinex$1 {
288
289
  'options': {
289
290
  'defaultType': 'spot',
290
291
  'types': ['spot', 'margin', 'otc'],
292
+ 'createMarketBuyOrderRequiresPrice': true,
291
293
  'accountsByType': {
292
294
  'spot': '1',
293
295
  'margin': '2',
@@ -1551,28 +1553,173 @@ class digifinex extends digifinex$1 {
1551
1553
  * @param {string} symbol unified symbol of the market to create an order in
1552
1554
  * @param {string} type 'market' or 'limit'
1553
1555
  * @param {string} side 'buy' or 'sell'
1554
- * @param {float} amount how much of currency you want to trade in units of base currency
1556
+ * @param {float} amount how much you want to trade in units of the base currency, spot market orders use the quote currency, swap requires the number of contracts
1555
1557
  * @param {float} [price] the price at which the order is to be fullfilled, in units of the quote currency, ignored in market orders
1556
1558
  * @param {object} [params] extra parameters specific to the digifinex api endpoint
1557
1559
  * @param {string} [params.timeInForce] "GTC", "IOC", "FOK", or "PO"
1558
1560
  * @param {bool} [params.postOnly] true or false
1559
1561
  * @param {bool} [params.reduceOnly] true or false
1562
+ * @param {string} [params.marginMode] 'cross' or 'isolated', for spot margin trading
1560
1563
  * @returns {object} an [order structure]{@link https://github.com/ccxt/ccxt/wiki/Manual#order-structure}
1561
1564
  */
1562
1565
  await this.loadMarkets();
1563
1566
  const market = this.market(symbol);
1564
- symbol = market['symbol'];
1567
+ const marginResult = this.handleMarginModeAndParams('createOrder', params);
1568
+ const marginMode = marginResult[0];
1569
+ const request = this.createOrderRequest(symbol, type, side, amount, price, params);
1570
+ let response = undefined;
1571
+ if (market['swap']) {
1572
+ response = await this.privateSwapPostTradeOrderPlace(request);
1573
+ }
1574
+ else {
1575
+ if (marginMode !== undefined) {
1576
+ response = await this.privateSpotPostMarginOrderNew(request);
1577
+ }
1578
+ else {
1579
+ response = await this.privateSpotPostSpotOrderNew(request);
1580
+ }
1581
+ }
1582
+ //
1583
+ // spot and margin
1584
+ //
1585
+ // {
1586
+ // "code": 0,
1587
+ // "order_id": "198361cecdc65f9c8c9bb2fa68faec40"
1588
+ // }
1589
+ //
1590
+ // swap
1591
+ //
1592
+ // {
1593
+ // "code": 0,
1594
+ // "data": "1590873693003714560"
1595
+ // }
1596
+ //
1597
+ const order = this.parseOrder(response, market);
1598
+ order['symbol'] = market['symbol'];
1599
+ order['type'] = type;
1600
+ order['side'] = side;
1601
+ order['amount'] = amount;
1602
+ order['price'] = price;
1603
+ return order;
1604
+ }
1605
+ async createOrders(orders, params = {}) {
1606
+ /**
1607
+ * @method
1608
+ * @name digifinex#createOrders
1609
+ * @description create a list of trade orders (all orders should be of the same symbol)
1610
+ * @see https://docs.digifinex.com/en-ww/spot/v3/rest.html#create-multiple-order
1611
+ * @see https://docs.digifinex.com/en-ww/swap/v2/rest.html#batchorder
1612
+ * @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
1613
+ * @param {object} [params] extra parameters specific to the digifinex api endpoint
1614
+ * @returns {object} an [order structure]{@link https://github.com/ccxt/ccxt/wiki/Manual#order-structure}
1615
+ */
1616
+ await this.loadMarkets();
1617
+ const ordersRequests = [];
1618
+ let symbol = undefined;
1619
+ let marginMode = undefined;
1620
+ for (let i = 0; i < orders.length; i++) {
1621
+ const rawOrder = orders[i];
1622
+ const marketId = this.safeString(rawOrder, 'symbol');
1623
+ if (symbol === undefined) {
1624
+ symbol = marketId;
1625
+ }
1626
+ else {
1627
+ if (symbol !== marketId) {
1628
+ throw new errors.BadRequest(this.id + ' createOrders() requires all orders to have the same symbol');
1629
+ }
1630
+ }
1631
+ const type = this.safeString(rawOrder, 'type');
1632
+ const side = this.safeString(rawOrder, 'side');
1633
+ const amount = this.safeValue(rawOrder, 'amount');
1634
+ const price = this.safeValue(rawOrder, 'price');
1635
+ const orderParams = this.safeValue(rawOrder, 'params', {});
1636
+ const marginResult = this.handleMarginModeAndParams('createOrders', params);
1637
+ const currentMarginMode = marginResult[0];
1638
+ if (currentMarginMode !== undefined) {
1639
+ if (marginMode === undefined) {
1640
+ marginMode = currentMarginMode;
1641
+ }
1642
+ else {
1643
+ if (marginMode !== currentMarginMode) {
1644
+ throw new errors.BadRequest(this.id + ' createOrders() requires all orders to have the same margin mode (isolated or cross)');
1645
+ }
1646
+ }
1647
+ }
1648
+ const orderRequest = this.createOrderRequest(marketId, type, side, amount, price, orderParams);
1649
+ ordersRequests.push(orderRequest);
1650
+ }
1651
+ const market = this.market(symbol);
1652
+ const request = {};
1653
+ let response = undefined;
1654
+ if (market['swap']) {
1655
+ response = await this.privateSwapPostTradeBatchOrder(ordersRequests);
1656
+ }
1657
+ else {
1658
+ request['market'] = (marginMode !== undefined) ? 'margin' : 'spot';
1659
+ request['symbol'] = market['id'];
1660
+ request['list'] = this.json(ordersRequests);
1661
+ response = await this.privateSpotPostMarketOrderBatchNew(request);
1662
+ }
1663
+ //
1664
+ // spot
1665
+ //
1666
+ // {
1667
+ // "code": 0,
1668
+ // "order_ids": [
1669
+ // "064290fbe2d26e7b28d7e6c0a5cf70a5",
1670
+ // "24c8f9b73d81e4d9d8d7e3280281c258"
1671
+ // ]
1672
+ // }
1673
+ //
1674
+ // swap
1675
+ //
1676
+ // {
1677
+ // "code": 0,
1678
+ // "data": [
1679
+ // "1720297963537829888",
1680
+ // "1720297963537829889"
1681
+ // ]
1682
+ // }
1683
+ //
1684
+ let data = [];
1685
+ if (market['swap']) {
1686
+ data = this.safeValue(response, 'data', []);
1687
+ }
1688
+ else {
1689
+ data = this.safeValue(response, 'order_ids', []);
1690
+ }
1691
+ const result = [];
1692
+ for (let i = 0; i < orders.length; i++) {
1693
+ const rawOrder = orders[i];
1694
+ const individualOrder = {};
1695
+ individualOrder['order_id'] = data[i];
1696
+ individualOrder['instrument_id'] = market['id'];
1697
+ individualOrder['amount'] = this.safeNumber(rawOrder, 'amount');
1698
+ individualOrder['price'] = this.safeNumber(rawOrder, 'price');
1699
+ result.push(individualOrder);
1700
+ }
1701
+ return this.parseOrders(result, market);
1702
+ }
1703
+ createOrderRequest(symbol, type, side, amount, price = undefined, params = {}) {
1704
+ /**
1705
+ * @method
1706
+ * @ignore
1707
+ * @name digifinex#createOrderRequest
1708
+ * @description helper function to build request
1709
+ * @param {string} symbol unified symbol of the market to create an order in
1710
+ * @param {string} type 'market' or 'limit'
1711
+ * @param {string} side 'buy' or 'sell'
1712
+ * @param {float} amount how much you want to trade in units of the base currency, spot market orders use the quote currency, swap requires the number of contracts
1713
+ * @param {float} [price] the price at which the order is to be fullfilled, in units of the quote currency, ignored in market orders
1714
+ * @param {object} [params] extra parameters specific to the digifinex api endpoint
1715
+ * @returns {object} request to be sent to the exchange
1716
+ */
1717
+ const market = this.market(symbol);
1565
1718
  let marketType = undefined;
1566
1719
  let marginMode = undefined;
1567
- [marketType, params] = this.handleMarketTypeAndParams('createOrder', market, params);
1568
- let method = this.getSupportedMapping(marketType, {
1569
- 'spot': 'privateSpotPostSpotOrderNew',
1570
- 'margin': 'privateSpotPostMarginOrderNew',
1571
- 'swap': 'privateSwapPostTradeOrderPlace',
1572
- });
1573
- [marginMode, params] = this.handleMarginModeAndParams('createOrder', params);
1720
+ [marketType, params] = this.handleMarketTypeAndParams('createOrderRequest', market, params);
1721
+ [marginMode, params] = this.handleMarginModeAndParams('createOrderRequest', params);
1574
1722
  if (marginMode !== undefined) {
1575
- method = 'privateSpotPostMarginOrderNew';
1576
1723
  marketType = 'margin';
1577
1724
  }
1578
1725
  const request = {};
@@ -1629,40 +1776,34 @@ class digifinex extends digifinex$1 {
1629
1776
  }
1630
1777
  request['type'] = side + suffix;
1631
1778
  // limit orders require the amount in the base currency, market orders require the amount in the quote currency
1632
- request['amount'] = this.amountToPrecision(symbol, amount);
1779
+ let quantity = undefined;
1780
+ const createMarketBuyOrderRequiresPrice = this.safeValue(this.options, 'createMarketBuyOrderRequiresPrice', true);
1781
+ if (createMarketBuyOrderRequiresPrice && isMarketOrder && (side === 'buy')) {
1782
+ if (price === undefined) {
1783
+ throw new errors.InvalidOrder(this.id + ' createOrder() requires a price argument for market buy orders on spot markets to calculate the total amount to spend (amount * price), alternatively set the createMarketBuyOrderRequiresPrice option to false and pass in the cost to spend into the amount parameter');
1784
+ }
1785
+ else {
1786
+ const amountString = this.numberToString(amount);
1787
+ const priceString = this.numberToString(price);
1788
+ const cost = this.parseNumber(Precise["default"].stringMul(amountString, priceString));
1789
+ quantity = this.priceToPrecision(symbol, cost);
1790
+ }
1791
+ }
1792
+ else {
1793
+ quantity = this.amountToPrecision(symbol, amount);
1794
+ }
1795
+ request['amount'] = quantity;
1633
1796
  }
1634
1797
  if (postOnly) {
1635
1798
  if (postOnlyParsed) {
1636
- request['postOnly'] = postOnlyParsed;
1799
+ request['post_only'] = postOnlyParsed;
1637
1800
  }
1638
1801
  else {
1639
- request['postOnly'] = postOnly;
1802
+ request['post_only'] = postOnly;
1640
1803
  }
1641
1804
  }
1642
- const query = this.omit(params, ['postOnly', 'post_only']);
1643
- const response = await this[method](this.extend(request, query));
1644
- //
1645
- // spot and margin
1646
- //
1647
- // {
1648
- // "code": 0,
1649
- // "order_id": "198361cecdc65f9c8c9bb2fa68faec40"
1650
- // }
1651
- //
1652
- // swap
1653
- //
1654
- // {
1655
- // "code": 0,
1656
- // "data": "1590873693003714560"
1657
- // }
1658
- //
1659
- const order = this.parseOrder(response, market);
1660
- order['symbol'] = symbol;
1661
- order['type'] = type;
1662
- order['side'] = side;
1663
- order['amount'] = amount;
1664
- order['price'] = price;
1665
- return order;
1805
+ params = this.omit(params, ['postOnly']);
1806
+ return this.extend(request, params);
1666
1807
  }
1667
1808
  async cancelOrder(id, symbol = undefined, params = {}) {
1668
1809
  /**
@@ -1799,6 +1940,15 @@ class digifinex extends digifinex$1 {
1799
1940
  // "data": "1590873693003714560"
1800
1941
  // }
1801
1942
  //
1943
+ // spot and swap: createOrders
1944
+ //
1945
+ // {
1946
+ // "order_id": "d64d92a5e0a120f792f385485bc3d95b",
1947
+ // "instrument_id": "BTC_USDT",
1948
+ // "amount": 0.0001,
1949
+ // "price": 27000
1950
+ // }
1951
+ //
1802
1952
  // spot: fetchOrder, fetchOpenOrders, fetchOrders
1803
1953
  //
1804
1954
  // {
@@ -1844,24 +1994,26 @@ class digifinex extends digifinex$1 {
1844
1994
  let type = undefined;
1845
1995
  let side = this.safeString(order, 'type');
1846
1996
  const marketId = this.safeString2(order, 'symbol', 'instrument_id');
1847
- const symbol = this.safeSymbol(marketId, market, '_');
1997
+ const symbol = this.safeSymbol(marketId, market);
1848
1998
  market = this.market(symbol);
1849
1999
  if (market['type'] === 'swap') {
1850
2000
  const orderType = this.safeInteger(order, 'order_type');
1851
- if ((orderType === 9) || (orderType === 10) || (orderType === 11) || (orderType === 12) || (orderType === 15)) {
1852
- timeInForce = 'FOK';
1853
- }
1854
- else if ((orderType === 1) || (orderType === 2) || (orderType === 3) || (orderType === 4) || (orderType === 13)) {
1855
- timeInForce = 'IOC';
1856
- }
1857
- else if ((orderType === 6) || (orderType === 7) || (orderType === 8) || (orderType === 14)) {
1858
- timeInForce = 'GTC';
1859
- }
1860
- if ((orderType === 0) || (orderType === 1) || (orderType === 4) || (orderType === 5) || (orderType === 9) || (orderType === 10)) {
1861
- type = 'limit';
1862
- }
1863
- else {
1864
- type = 'market';
2001
+ if (orderType !== undefined) {
2002
+ if ((orderType === 9) || (orderType === 10) || (orderType === 11) || (orderType === 12) || (orderType === 15)) {
2003
+ timeInForce = 'FOK';
2004
+ }
2005
+ else if ((orderType === 1) || (orderType === 2) || (orderType === 3) || (orderType === 4) || (orderType === 13)) {
2006
+ timeInForce = 'IOC';
2007
+ }
2008
+ else if ((orderType === 6) || (orderType === 7) || (orderType === 8) || (orderType === 14)) {
2009
+ timeInForce = 'GTC';
2010
+ }
2011
+ if ((orderType === 0) || (orderType === 1) || (orderType === 4) || (orderType === 5) || (orderType === 9) || (orderType === 10)) {
2012
+ type = 'limit';
2013
+ }
2014
+ else {
2015
+ type = 'market';
2016
+ }
1865
2017
  }
1866
2018
  if (side === '1') {
1867
2019
  side = 'open long';
@@ -6658,7 +6658,7 @@ class gate extends gate$1 {
6658
6658
  if (quoteValueString === undefined) {
6659
6659
  quoteValueString = Precise["default"].stringMul(baseValueString, priceString);
6660
6660
  }
6661
- return {
6661
+ return this.safeLiquidation({
6662
6662
  'info': liquidation,
6663
6663
  'symbol': this.safeSymbol(marketId, market),
6664
6664
  'contracts': this.parseNumber(contractsString),
@@ -6668,7 +6668,7 @@ class gate extends gate$1 {
6668
6668
  'quoteValue': this.parseNumber(Precise["default"].stringAbs(quoteValueString)),
6669
6669
  'timestamp': timestamp,
6670
6670
  'datetime': this.iso8601(timestamp),
6671
- };
6671
+ });
6672
6672
  }
6673
6673
  handleErrors(code, reason, url, method, headers, body, response, requestHeaders, requestBody) {
6674
6674
  if (response === undefined) {
@@ -794,7 +794,7 @@ class hollaex extends hollaex$1 {
794
794
  //
795
795
  return this.parseOHLCVs(response, market, timeframe, since, limit);
796
796
  }
797
- parseOHLCV(response, market = undefined) {
797
+ parseOHLCV(ohlcv, market = undefined) {
798
798
  //
799
799
  // {
800
800
  // "time":"2020-03-02T20:00:00.000Z",
@@ -807,12 +807,12 @@ class hollaex extends hollaex$1 {
807
807
  // }
808
808
  //
809
809
  return [
810
- this.parse8601(this.safeString(response, 'time')),
811
- this.safeNumber(response, 'open'),
812
- this.safeNumber(response, 'high'),
813
- this.safeNumber(response, 'low'),
814
- this.safeNumber(response, 'close'),
815
- this.safeNumber(response, 'volume'),
810
+ this.parse8601(this.safeString(ohlcv, 'time')),
811
+ this.safeNumber(ohlcv, 'open'),
812
+ this.safeNumber(ohlcv, 'high'),
813
+ this.safeNumber(ohlcv, 'low'),
814
+ this.safeNumber(ohlcv, 'close'),
815
+ this.safeNumber(ohlcv, 'volume'),
816
816
  ];
817
817
  }
818
818
  parseBalance(response) {
@@ -4820,6 +4820,7 @@ class huobi extends huobi$1 {
4820
4820
  * @param {string} [params.offset] *contract only* 'open', 'close', or 'both', required in hedge mode
4821
4821
  * @param {bool} [params.postOnly] *contract only* true or false
4822
4822
  * @param {int} [params.leverRate] *contract only* required for all contract orders except tpsl, leverage greater than 20x requires prior approval of high-leverage agreement
4823
+ * @param {string} [params.timeInForce] supports 'IOC' and 'FOK'
4823
4824
  * @returns {object} an [order structure]{@link https://github.com/ccxt/ccxt/wiki/Manual#order-structure}
4824
4825
  */
4825
4826
  await this.loadMarkets();
@@ -4892,6 +4893,13 @@ class huobi extends huobi$1 {
4892
4893
  if (postOnly) {
4893
4894
  orderType = 'limit-maker';
4894
4895
  }
4896
+ const timeInForce = this.safeString(params, 'timeInForce', 'GTC');
4897
+ if (timeInForce === 'FOK') {
4898
+ orderType = orderType + '-fok';
4899
+ }
4900
+ else if (timeInForce === 'IOC') {
4901
+ orderType = 'ioc';
4902
+ }
4895
4903
  request['type'] = side + '-' + orderType;
4896
4904
  const clientOrderId = this.safeString2(params, 'clientOrderId', 'client-order-id'); // must be 64 chars max and unique within 24 hours
4897
4905
  if (clientOrderId === undefined) {
@@ -4939,7 +4947,7 @@ class huobi extends huobi$1 {
4939
4947
  if (orderType in limitOrderTypes) {
4940
4948
  request['price'] = this.priceToPrecision(symbol, price);
4941
4949
  }
4942
- params = this.omit(params, ['stopPrice', 'stop-price', 'clientOrderId', 'client-order-id', 'operator']);
4950
+ params = this.omit(params, ['stopPrice', 'stop-price', 'clientOrderId', 'client-order-id', 'operator', 'timeInForce']);
4943
4951
  const response = await this.spotPrivatePostV1OrderOrdersPlace(this.extend(request, params));
4944
4952
  //
4945
4953
  // spot
@@ -4984,6 +4992,7 @@ class huobi extends huobi$1 {
4984
4992
  * @param {float} amount how much of currency you want to trade in units of base currency
4985
4993
  * @param {float} [price] the price at which the order is to be fullfilled, in units of the quote currency, ignored in market orders
4986
4994
  * @param {object} params extra parameters specific to the huobi api endpoint
4995
+ * @param {string} [params.timeInForce] supports 'IOC' and 'FOK'
4987
4996
  * @returns {object} an [order structure]{@link https://github.com/ccxt/ccxt/wiki/Manual#order-structure}
4988
4997
  */
4989
4998
  const market = this.market(symbol);
@@ -4997,6 +5006,13 @@ class huobi extends huobi$1 {
4997
5006
  if (postOnly) {
4998
5007
  type = 'post_only';
4999
5008
  }
5009
+ const timeInForce = this.safeString(params, 'timeInForce', 'GTC');
5010
+ if (timeInForce === 'FOK') {
5011
+ type = 'fok';
5012
+ }
5013
+ else if (timeInForce === 'IOC') {
5014
+ type = 'ioc';
5015
+ }
5000
5016
  const triggerPrice = this.safeNumber2(params, 'stopPrice', 'trigger_price');
5001
5017
  const stopLossTriggerPrice = this.safeNumber2(params, 'stopLossPrice', 'sl_trigger_price');
5002
5018
  const takeProfitTriggerPrice = this.safeNumber2(params, 'takeProfitPrice', 'tp_trigger_price');
@@ -5049,7 +5065,7 @@ class huobi extends huobi$1 {
5049
5065
  request['lever_rate'] = leverRate;
5050
5066
  request['order_price_type'] = type;
5051
5067
  }
5052
- params = this.omit(params, ['reduceOnly', 'stopPrice', 'stopLossPrice', 'takeProfitPrice', 'triggerType', 'leverRate']);
5068
+ params = this.omit(params, ['reduceOnly', 'stopPrice', 'stopLossPrice', 'takeProfitPrice', 'triggerType', 'leverRate', 'timeInForce']);
5053
5069
  const broker = this.safeValue(this.options, 'broker', {});
5054
5070
  const brokerId = this.safeString(broker, 'id');
5055
5071
  request['channel_code'] = brokerId;
@@ -8491,7 +8507,7 @@ class huobi extends huobi$1 {
8491
8507
  //
8492
8508
  const marketId = this.safeString(liquidation, 'contract_code');
8493
8509
  const timestamp = this.safeInteger(liquidation, 'created_at');
8494
- return {
8510
+ return this.safeLiquidation({
8495
8511
  'info': liquidation,
8496
8512
  'symbol': this.safeSymbol(marketId, market),
8497
8513
  'contracts': this.safeNumber(liquidation, 'volume'),
@@ -8501,7 +8517,7 @@ class huobi extends huobi$1 {
8501
8517
  'quoteValue': this.safeNumber(liquidation, 'trade_turnover'),
8502
8518
  'timestamp': timestamp,
8503
8519
  'datetime': this.iso8601(timestamp),
8504
- };
8520
+ });
8505
8521
  }
8506
8522
  }
8507
8523
 
@@ -741,9 +741,6 @@ class kucoinfutures extends kucoinfutures$1 {
741
741
  //
742
742
  return this.parseTicker(response['data'], market);
743
743
  }
744
- async fetchTickers(symbols = undefined, params = {}) {
745
- throw new errors.NotSupported(this.id + ' fetchTickers() is not supported yet');
746
- }
747
744
  parseTicker(ticker, market = undefined) {
748
745
  //
749
746
  // {