ccxt 4.1.75 → 4.1.77

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 (131) hide show
  1. package/README.md +3 -3
  2. package/dist/ccxt.browser.js +287 -235
  3. package/dist/ccxt.browser.min.js +5 -5
  4. package/dist/cjs/ccxt.js +1 -1
  5. package/dist/cjs/src/ace.js +2 -0
  6. package/dist/cjs/src/alpaca.js +2 -0
  7. package/dist/cjs/src/base/Exchange.js +8 -0
  8. package/dist/cjs/src/base/errors.js +7 -7
  9. package/dist/cjs/src/base/ws/Client.js +2 -0
  10. package/dist/cjs/src/binance.js +4 -0
  11. package/dist/cjs/src/binanceus.js +2 -0
  12. package/dist/cjs/src/bingx.js +80 -23
  13. package/dist/cjs/src/bit2c.js +2 -0
  14. package/dist/cjs/src/bitbank.js +2 -0
  15. package/dist/cjs/src/bithumb.js +2 -0
  16. package/dist/cjs/src/bitmex.js +6 -0
  17. package/dist/cjs/src/bitopro.js +2 -0
  18. package/dist/cjs/src/bitpanda.js +2 -0
  19. package/dist/cjs/src/bitrue.js +27 -1
  20. package/dist/cjs/src/bitso.js +2 -0
  21. package/dist/cjs/src/bitstamp.js +5 -2
  22. package/dist/cjs/src/bittrex.js +2 -0
  23. package/dist/cjs/src/bitvavo.js +2 -0
  24. package/dist/cjs/src/bl3p.js +2 -0
  25. package/dist/cjs/src/btcalpha.js +2 -0
  26. package/dist/cjs/src/btcbox.js +2 -0
  27. package/dist/cjs/src/btcmarkets.js +2 -0
  28. package/dist/cjs/src/btcturk.js +2 -0
  29. package/dist/cjs/src/bybit.js +2 -0
  30. package/dist/cjs/src/coinbase.js +37 -6
  31. package/dist/cjs/src/coincheck.js +2 -0
  32. package/dist/cjs/src/coinlist.js +2 -0
  33. package/dist/cjs/src/coinmate.js +2 -0
  34. package/dist/cjs/src/coinone.js +2 -0
  35. package/dist/cjs/src/coinsph.js +2 -0
  36. package/dist/cjs/src/coinspot.js +2 -0
  37. package/dist/cjs/src/cryptocom.js +2 -185
  38. package/dist/cjs/src/gate.js +1 -0
  39. package/dist/cjs/src/gemini.js +2 -0
  40. package/dist/cjs/src/idex.js +2 -0
  41. package/dist/cjs/src/independentreserve.js +2 -0
  42. package/dist/cjs/src/indodax.js +2 -0
  43. package/dist/cjs/src/kucoin.js +2 -0
  44. package/dist/cjs/src/kuna.js +2 -0
  45. package/dist/cjs/src/latoken.js +2 -0
  46. package/dist/cjs/src/luno.js +2 -0
  47. package/dist/cjs/src/mercado.js +2 -0
  48. package/dist/cjs/src/mexc.js +2 -0
  49. package/dist/cjs/src/ndax.js +2 -0
  50. package/dist/cjs/src/novadax.js +2 -0
  51. package/dist/cjs/src/okx.js +25 -10
  52. package/dist/cjs/src/p2b.js +2 -0
  53. package/dist/cjs/src/static_dependencies/proxies/http-proxy-agent/index.js +8 -11
  54. package/dist/cjs/src/static_dependencies/proxies/https-proxy-agent/index.js +5 -8
  55. package/dist/cjs/src/static_dependencies/proxies/https-proxy-agent/parse-proxy-response.js +5 -12
  56. package/dist/cjs/src/wavesexchange.js +2 -0
  57. package/dist/cjs/src/wazirx.js +2 -0
  58. package/dist/cjs/src/woo.js +2 -0
  59. package/dist/cjs/src/yobit.js +2 -0
  60. package/dist/cjs/src/zonda.js +2 -0
  61. package/js/ccxt.d.ts +1 -1
  62. package/js/ccxt.js +1 -1
  63. package/js/src/abstract/binance.d.ts +2 -0
  64. package/js/src/abstract/binancecoinm.d.ts +2 -0
  65. package/js/src/abstract/binanceus.d.ts +2 -0
  66. package/js/src/abstract/binanceusdm.d.ts +2 -0
  67. package/js/src/abstract/okx.d.ts +14 -0
  68. package/js/src/ace.js +2 -0
  69. package/js/src/alpaca.js +2 -0
  70. package/js/src/base/Exchange.d.ts +4 -0
  71. package/js/src/base/Exchange.js +8 -0
  72. package/js/src/base/errors.d.ts +4 -4
  73. package/js/src/base/errors.js +7 -7
  74. package/js/src/base/ws/Client.js +2 -0
  75. package/js/src/binance.js +4 -0
  76. package/js/src/binanceus.js +2 -0
  77. package/js/src/bingx.d.ts +4 -3
  78. package/js/src/bingx.js +80 -23
  79. package/js/src/bit2c.js +2 -0
  80. package/js/src/bitbank.js +2 -0
  81. package/js/src/bithumb.js +2 -0
  82. package/js/src/bitmex.d.ts +1 -1
  83. package/js/src/bitmex.js +6 -0
  84. package/js/src/bitopro.js +2 -0
  85. package/js/src/bitpanda.js +2 -0
  86. package/js/src/bitrue.d.ts +1 -0
  87. package/js/src/bitrue.js +27 -1
  88. package/js/src/bitso.js +2 -0
  89. package/js/src/bitstamp.js +5 -2
  90. package/js/src/bittrex.js +2 -0
  91. package/js/src/bitvavo.js +2 -0
  92. package/js/src/bl3p.js +2 -0
  93. package/js/src/btcalpha.js +2 -0
  94. package/js/src/btcbox.js +2 -0
  95. package/js/src/btcmarkets.js +2 -0
  96. package/js/src/btcturk.js +2 -0
  97. package/js/src/bybit.js +2 -0
  98. package/js/src/coinbase.d.ts +1 -0
  99. package/js/src/coinbase.js +37 -6
  100. package/js/src/coincheck.js +2 -0
  101. package/js/src/coinlist.js +2 -0
  102. package/js/src/coinmate.js +2 -0
  103. package/js/src/coinone.js +2 -0
  104. package/js/src/coinsph.js +2 -0
  105. package/js/src/coinspot.js +2 -0
  106. package/js/src/cryptocom.d.ts +0 -24
  107. package/js/src/cryptocom.js +2 -185
  108. package/js/src/gate.js +1 -0
  109. package/js/src/gemini.js +2 -0
  110. package/js/src/idex.js +2 -0
  111. package/js/src/independentreserve.js +2 -0
  112. package/js/src/indodax.js +2 -0
  113. package/js/src/kucoin.js +2 -0
  114. package/js/src/kuna.js +2 -0
  115. package/js/src/latoken.js +2 -0
  116. package/js/src/luno.js +2 -0
  117. package/js/src/mercado.js +2 -0
  118. package/js/src/mexc.js +2 -0
  119. package/js/src/ndax.js +2 -0
  120. package/js/src/novadax.js +2 -0
  121. package/js/src/okx.js +25 -10
  122. package/js/src/p2b.js +2 -0
  123. package/js/src/static_dependencies/proxies/http-proxy-agent/index.js +9 -8
  124. package/js/src/static_dependencies/proxies/https-proxy-agent/index.js +5 -7
  125. package/js/src/static_dependencies/proxies/https-proxy-agent/parse-proxy-response.js +5 -7
  126. package/js/src/wavesexchange.js +2 -0
  127. package/js/src/wazirx.js +2 -0
  128. package/js/src/woo.js +2 -0
  129. package/js/src/yobit.js +2 -0
  130. package/js/src/zonda.js +2 -0
  131. package/package.json +1 -1
package/dist/cjs/ccxt.js CHANGED
@@ -172,7 +172,7 @@ var woo$1 = require('./src/pro/woo.js');
172
172
 
173
173
  //-----------------------------------------------------------------------------
174
174
  // this is updated by vss.js when building
175
- const version = '4.1.75';
175
+ const version = '4.1.77';
176
176
  Exchange["default"].ccxtVersion = version;
177
177
  const exchanges = {
178
178
  'ace': ace,
@@ -31,6 +31,8 @@ class ace extends ace$1 {
31
31
  'cancelAllOrders': false,
32
32
  'cancelOrder': true,
33
33
  'cancelOrders': false,
34
+ 'closeAllPositions': false,
35
+ 'closePosition': false,
34
36
  'createOrder': true,
35
37
  'editOrder': false,
36
38
  'fetchBalance': true,
@@ -47,6 +47,8 @@ class alpaca extends alpaca$1 {
47
47
  'option': false,
48
48
  'cancelAllOrders': true,
49
49
  'cancelOrder': true,
50
+ 'closeAllPositions': false,
51
+ 'closePosition': false,
50
52
  'createOrder': true,
51
53
  'fetchBalance': true,
52
54
  'fetchBidsAsks': false,
@@ -355,6 +355,8 @@ class Exchange {
355
355
  'cancelAllOrders': undefined,
356
356
  'cancelOrder': true,
357
357
  'cancelOrders': undefined,
358
+ 'closeAllPositions': undefined,
359
+ 'closePosition': undefined,
358
360
  'createDepositAddress': undefined,
359
361
  'createLimitOrder': true,
360
362
  'createMarketOrder': true,
@@ -3698,6 +3700,12 @@ class Exchange {
3698
3700
  async fetchFundingHistory(symbol = undefined, since = undefined, limit = undefined, params = {}) {
3699
3701
  throw new errors.NotSupported(this.id + ' fetchFundingHistory() is not supported yet');
3700
3702
  }
3703
+ async closePosition(symbol, side = undefined, marginMode = undefined, params = {}) {
3704
+ throw new errors.NotSupported(this.id + ' closePositions() is not supported yet');
3705
+ }
3706
+ async closeAllPositions(params = {}) {
3707
+ throw new errors.NotSupported(this.id + ' closeAllPositions() is not supported yet');
3708
+ }
3701
3709
  parseLastPrice(price, market = undefined) {
3702
3710
  throw new errors.NotSupported(this.id + ' parseLastPrice() is not supported yet');
3703
3711
  }
@@ -190,8 +190,14 @@ class NotSupported extends ExchangeError {
190
190
  this.name = 'NotSupported';
191
191
  }
192
192
  }
193
+ class OperationFailed extends BaseError {
194
+ constructor(message) {
195
+ super(message);
196
+ this.name = 'OperationFailed';
197
+ }
198
+ }
193
199
  // Network error
194
- class NetworkError extends BaseError {
200
+ class NetworkError extends OperationFailed {
195
201
  constructor(message) {
196
202
  super(message);
197
203
  this.name = 'NetworkError';
@@ -233,12 +239,6 @@ class RequestTimeout extends NetworkError {
233
239
  this.name = 'RequestTimeout';
234
240
  }
235
241
  }
236
- class OperationFailed extends BaseError {
237
- constructor(message) {
238
- super(message);
239
- this.name = 'OperationFailed';
240
- }
241
- }
242
242
  /* ------------------------------------------------------------------------ */
243
243
  // export default subclass (
244
244
  // // Root class
@@ -200,6 +200,7 @@ class Client {
200
200
  this.reset(this.error);
201
201
  this.onErrorCallback(this, this.error);
202
202
  }
203
+ /* eslint-disable no-shadow */
203
204
  onClose(event) {
204
205
  if (this.verbose) {
205
206
  this.log(new Date(), 'onClose', event);
@@ -227,6 +228,7 @@ class Client {
227
228
  message = (typeof message === 'string') ? message : JSON.stringify(message);
228
229
  const future = Future.createFuture();
229
230
  if (platform.isNode) {
231
+ /* eslint-disable no-inner-declarations */
230
232
  function onSendComplete(error) {
231
233
  if (error) {
232
234
  future.reject(error);
@@ -38,6 +38,8 @@ class binance extends binance$1 {
38
38
  'cancelAllOrders': true,
39
39
  'cancelOrder': true,
40
40
  'cancelOrders': true,
41
+ 'closeAllPositions': false,
42
+ 'closePosition': false,
41
43
  'createDepositAddress': false,
42
44
  'createOrder': true,
43
45
  'createOrders': true,
@@ -874,6 +876,7 @@ class binance extends binance$1 {
874
876
  'uiKlines': 0.4,
875
877
  'ticker/24hr': { 'cost': 0.4, 'noSymbol': 16 },
876
878
  'ticker': { 'cost': 0.4, 'noSymbol': 16 },
879
+ 'ticker/tradingDay': 0.8,
877
880
  'ticker/price': { 'cost': 0.4, 'noSymbol': 0.8 },
878
881
  'ticker/bookTicker': { 'cost': 0.4, 'noSymbol': 0.8 },
879
882
  'exchangeInfo': 4,
@@ -902,6 +905,7 @@ class binance extends binance$1 {
902
905
  'rateLimit/order': 8,
903
906
  'myPreventedMatches': 4,
904
907
  'myAllocations': 4,
908
+ 'account/commission': 4,
905
909
  },
906
910
  'post': {
907
911
  'order/oco': 0.2,
@@ -48,6 +48,8 @@ class binanceus extends binance {
48
48
  'option': false,
49
49
  'addMargin': false,
50
50
  'borrowMargin': false,
51
+ 'closeAllPositions': false,
52
+ 'closePosition': false,
51
53
  'createReduceOnlyOrder': false,
52
54
  'fetchBorrowInterest': false,
53
55
  'fetchBorrowRate': false,
@@ -29,6 +29,8 @@ class bingx extends bingx$1 {
29
29
  'cancelAllOrders': true,
30
30
  'cancelOrder': true,
31
31
  'cancelOrders': true,
32
+ 'closeAllPosition': true,
33
+ 'closePosition': false,
32
34
  'createMarketBuyOrderWithCost': true,
33
35
  'createMarketOrderWithCost': true,
34
36
  'createMarketSellOrderWithCost': true,
@@ -80,10 +82,18 @@ class bingx extends bingx$1 {
80
82
  'www': 'https://bingx.com/',
81
83
  'doc': 'https://bingx-api.github.io/docs/',
82
84
  'referral': 'https://bingx.com/invite/OHETOM',
83
- 'fees': {
84
- 'trading': {
85
- 'tierBased': true,
86
- },
85
+ },
86
+ 'fees': {
87
+ 'tierBased': true,
88
+ 'spot': {
89
+ 'feeSide': 'get',
90
+ 'maker': this.parseNumber('0.001'),
91
+ 'taker': this.parseNumber('0.001'),
92
+ },
93
+ 'swap': {
94
+ 'feeSide': 'quote',
95
+ 'maker': this.parseNumber('0.0002'),
96
+ 'taker': this.parseNumber('0.0005'),
87
97
  },
88
98
  },
89
99
  'requiredCredentials': {
@@ -302,9 +312,6 @@ class bingx extends bingx$1 {
302
312
  '1w': '1w',
303
313
  '1M': '1M',
304
314
  },
305
- 'fees': {
306
- 'trading': {},
307
- },
308
315
  'precisionMode': number.DECIMAL_PLACES,
309
316
  'exceptions': {
310
317
  'exact': {
@@ -556,11 +563,12 @@ class bingx extends bingx$1 {
556
563
  if (settle !== undefined) {
557
564
  symbol += ':' + settle;
558
565
  }
566
+ const fees = this.safeValue(this.fees, type, {});
559
567
  const contractSize = this.safeNumber(market, 'size');
560
568
  const isActive = this.safeString(market, 'status') === '1';
561
569
  const isInverse = (spot) ? undefined : false;
562
570
  const isLinear = (spot) ? undefined : swap;
563
- return {
571
+ return this.safeMarketStructure({
564
572
  'id': id,
565
573
  'symbol': symbol,
566
574
  'base': base,
@@ -579,8 +587,9 @@ class bingx extends bingx$1 {
579
587
  'contract': swap,
580
588
  'linear': isLinear,
581
589
  'inverse': isInverse,
582
- 'taker': undefined,
583
- 'maker': undefined,
590
+ 'taker': this.safeNumber(fees, 'taker'),
591
+ 'maker': this.safeNumber(fees, 'maker'),
592
+ 'feeSide': this.safeString(fees, 'feeSide'),
584
593
  'contractSize': contractSize,
585
594
  'expiry': undefined,
586
595
  'expiryDatetime': undefined,
@@ -610,7 +619,7 @@ class bingx extends bingx$1 {
610
619
  },
611
620
  'created': undefined,
612
621
  'info': market,
613
- };
622
+ });
614
623
  }
615
624
  async fetchMarkets(params = {}) {
616
625
  /**
@@ -1576,23 +1585,28 @@ class bingx extends bingx$1 {
1576
1585
  // "avgPrice": "2.2",
1577
1586
  // "leverage": 10,
1578
1587
  // }
1588
+ //
1579
1589
  // standard position
1590
+ //
1580
1591
  // {
1581
- // "currentPrice":"82.91",
1582
- // "symbol":"LTC/USDT",
1583
- // "initialMargin":"5.00000000000000000000",
1584
- // "unrealizedProfit":"-0.26464500",
1585
- // "leverage":"20.000000000",
1586
- // "isolated":true,
1587
- // "entryPrice":"83.13",
1588
- // "positionSide":"LONG",
1589
- // "positionAmt":"1.20365912",
1592
+ // "currentPrice": "82.91",
1593
+ // "symbol": "LTC/USDT",
1594
+ // "initialMargin": "5.00000000000000000000",
1595
+ // "unrealizedProfit": "-0.26464500",
1596
+ // "leverage": "20.000000000",
1597
+ // "isolated": true,
1598
+ // "entryPrice": "83.13",
1599
+ // "positionSide": "LONG",
1600
+ // "positionAmt": "1.20365912",
1590
1601
  // }
1591
1602
  //
1592
- let marketId = this.safeString(position, 'symbol');
1603
+ let marketId = this.safeString(position, 'symbol', '');
1593
1604
  marketId = marketId.replace('/', '-'); // standard return different format
1594
1605
  const isolated = this.safeValue(position, 'isolated');
1595
- const marginMode = isolated ? 'isolated' : 'cross';
1606
+ let marginMode = undefined;
1607
+ if (isolated !== undefined) {
1608
+ marginMode = isolated ? 'isolated' : 'cross';
1609
+ }
1596
1610
  return this.safePosition({
1597
1611
  'info': position,
1598
1612
  'id': this.safeString(position, 'positionId'),
@@ -1788,7 +1802,6 @@ class bingx extends bingx$1 {
1788
1802
  * @method
1789
1803
  * @name bingx#createOrder
1790
1804
  * @description create a trade order
1791
- * @see https://bingx-api.github.io/docs/#/en-us/spot/trade-api.html#Create%20an%20Order
1792
1805
  * @see https://bingx-api.github.io/docs/#/en-us/swapV2/trade-api.html#Trade%20order
1793
1806
  * @param {string} symbol unified symbol of the market to create an order in
1794
1807
  * @param {string} type 'market' or 'limit'
@@ -3409,6 +3422,50 @@ class bingx extends bingx$1 {
3409
3422
  'datetime': this.iso8601(timestamp),
3410
3423
  });
3411
3424
  }
3425
+ async closeAllPositions(params = {}) {
3426
+ /**
3427
+ * @method
3428
+ * @name bitget#closePositions
3429
+ * @description closes open positions for a market
3430
+ * @see https://bitgetlimited.github.io/apidoc/en/mix/#close-all-position
3431
+ * @param {object} [params] extra parameters specific to the okx api endpoint
3432
+ * @param {string} [params.recvWindow] request valid time window value
3433
+ * @returns {[object]} [A list of position structures]{@link https://docs.ccxt.com/#/?id=position-structure}
3434
+ */
3435
+ await this.loadMarkets();
3436
+ const defaultRecvWindow = this.safeInteger(this.options, 'recvWindow');
3437
+ const recvWindow = this.safeInteger(this.parseParams, 'recvWindow', defaultRecvWindow);
3438
+ let marketType = undefined;
3439
+ [marketType, params] = this.handleMarketTypeAndParams('closeAllPositions', undefined, params);
3440
+ if (marketType === 'margin') {
3441
+ throw new errors.BadRequest(this.id + ' closePositions () cannot be used for ' + marketType + ' markets');
3442
+ }
3443
+ const request = {
3444
+ 'recvWindow': recvWindow,
3445
+ };
3446
+ const response = await this.swapV2PrivatePostTradeCloseAllPositions(this.extend(request, params));
3447
+ //
3448
+ // {
3449
+ // "code": 0,
3450
+ // "msg": "",
3451
+ // "data": {
3452
+ // "success": [
3453
+ // 1727686766700486656,
3454
+ // 1727686767048613888
3455
+ // ],
3456
+ // "failed": null
3457
+ // }
3458
+ // }
3459
+ //
3460
+ const data = this.safeValue(response, 'data', {});
3461
+ const success = this.safeValue(data, 'success', []);
3462
+ const positions = [];
3463
+ for (let i = 0; i < success.length; i++) {
3464
+ const position = this.parsePosition({ 'positionId': success[i] });
3465
+ positions.push(position);
3466
+ }
3467
+ return positions;
3468
+ }
3412
3469
  sign(path, section = 'public', method = 'GET', params = {}, headers = undefined, body = undefined) {
3413
3470
  const type = section[0];
3414
3471
  const version = section[1];
@@ -29,6 +29,8 @@ class bit2c extends bit2c$1 {
29
29
  'option': false,
30
30
  'addMargin': false,
31
31
  'cancelOrder': true,
32
+ 'closeAllPositions': false,
33
+ 'closePosition': false,
32
34
  'createOrder': true,
33
35
  'createReduceOnlyOrder': false,
34
36
  'fetchBalance': true,
@@ -27,6 +27,8 @@ class bitbank extends bitbank$1 {
27
27
  'option': false,
28
28
  'addMargin': false,
29
29
  'cancelOrder': true,
30
+ 'closeAllPositions': false,
31
+ 'closePosition': false,
30
32
  'createOrder': true,
31
33
  'createReduceOnlyOrder': false,
32
34
  'fetchBalance': true,
@@ -28,6 +28,8 @@ class bithumb extends bithumb$1 {
28
28
  'option': false,
29
29
  'addMargin': false,
30
30
  'cancelOrder': true,
31
+ 'closeAllPositions': false,
32
+ 'closePosition': false,
31
33
  'createMarketOrder': true,
32
34
  'createOrder': true,
33
35
  'createReduceOnlyOrder': false,
@@ -388,6 +388,12 @@ class bitmex extends bitmex$1 {
388
388
  return this.parseNumber(finalAmount);
389
389
  }
390
390
  convertToRealAmount(code, amount) {
391
+ if (code === undefined) {
392
+ return amount;
393
+ }
394
+ else if (amount === undefined) {
395
+ return undefined;
396
+ }
391
397
  const currency = this.currency(code);
392
398
  const precision = this.safeString(currency, 'precision');
393
399
  return Precise["default"].stringMul(amount, precision);
@@ -31,6 +31,8 @@ class bitopro extends bitopro$1 {
31
31
  'cancelAllOrders': true,
32
32
  'cancelOrder': true,
33
33
  'cancelOrders': true,
34
+ 'closeAllPositions': false,
35
+ 'closePosition': false,
34
36
  'createOrder': true,
35
37
  'editOrder': false,
36
38
  'fetchBalance': true,
@@ -32,6 +32,8 @@ class bitpanda extends bitpanda$1 {
32
32
  'cancelAllOrders': true,
33
33
  'cancelOrder': true,
34
34
  'cancelOrders': true,
35
+ 'closeAllPositions': false,
36
+ 'closePosition': false,
35
37
  'createDepositAddress': true,
36
38
  'createOrder': true,
37
39
  'createReduceOnlyOrder': false,
@@ -32,6 +32,9 @@ class bitrue extends bitrue$1 {
32
32
  'option': false,
33
33
  'cancelAllOrders': true,
34
34
  'cancelOrder': true,
35
+ 'createMarketBuyOrderWithCost': true,
36
+ 'createMarketOrderWithCost': false,
37
+ 'createMarketSellOrderWithCost': false,
35
38
  'createOrder': true,
36
39
  'createStopLimitOrder': true,
37
40
  'createStopMarketOrder': true,
@@ -1886,6 +1889,26 @@ class bitrue extends bitrue$1 {
1886
1889
  'trades': fills,
1887
1890
  }, market);
1888
1891
  }
1892
+ async createMarketBuyOrderWithCost(symbol, cost, params = {}) {
1893
+ /**
1894
+ * @method
1895
+ * @name bitrue#createMarketBuyOrderWithCost
1896
+ * @description create a market buy order by providing the symbol and cost
1897
+ * @see https://www.bitrue.com/api-docs#new-order-trade-hmac-sha256
1898
+ * @see https://www.bitrue.com/api_docs_includes_file/delivery.html#new-order-trade-hmac-sha256
1899
+ * @param {string} symbol unified symbol of the market to create an order in
1900
+ * @param {float} cost how much you want to trade in units of the quote currency
1901
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
1902
+ * @returns {object} an [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
1903
+ */
1904
+ await this.loadMarkets();
1905
+ const market = this.market(symbol);
1906
+ if (!market['swap']) {
1907
+ throw new errors.NotSupported(this.id + ' createMarketBuyOrderWithCost() supports swap orders only');
1908
+ }
1909
+ params['createMarketBuyOrderRequiresPrice'] = false;
1910
+ return await this.createOrder(symbol, 'market', 'buy', cost, undefined, params);
1911
+ }
1889
1912
  async createOrder(symbol, type, side, amount, price = undefined, params = {}) {
1890
1913
  /**
1891
1914
  * @method
@@ -1909,6 +1932,7 @@ class bitrue extends bitrue$1 {
1909
1932
  * EXCHANGE SPECIFIC PARAMETERS
1910
1933
  * @param {decimal} [params.icebergQty]
1911
1934
  * @param {long} [params.recvWindow]
1935
+ * @param {float} [params.cost] *swap market buy only* the quote quantity that can be used as an alternative for the amount
1912
1936
  * @returns {object} an [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
1913
1937
  */
1914
1938
  await this.loadMarkets();
@@ -1945,7 +1969,9 @@ class bitrue extends bitrue$1 {
1945
1969
  request['type'] = 'IOC';
1946
1970
  }
1947
1971
  request['contractName'] = market['id'];
1948
- if (isMarket && (side === 'buy') && (this.options['createMarketBuyOrderRequiresPrice'])) {
1972
+ let createMarketBuyOrderRequiresPrice = true;
1973
+ [createMarketBuyOrderRequiresPrice, params] = this.handleOptionAndParams(params, 'createOrder', 'createMarketBuyOrderRequiresPrice', true);
1974
+ if (isMarket && (side === 'buy') && createMarketBuyOrderRequiresPrice) {
1949
1975
  const cost = this.safeString(params, 'cost');
1950
1976
  params = this.omit(params, 'cost');
1951
1977
  if (price === undefined && cost === undefined) {
@@ -31,6 +31,8 @@ class bitso extends bitso$1 {
31
31
  'cancelAllOrders': true,
32
32
  'cancelOrder': true,
33
33
  'cancelOrders': true,
34
+ 'closeAllPositions': false,
35
+ 'closePosition': false,
34
36
  'createDepositAddress': false,
35
37
  'createOrder': true,
36
38
  'createReduceOnlyOrder': false,
@@ -33,6 +33,8 @@ class bitstamp extends bitstamp$1 {
33
33
  'addMargin': false,
34
34
  'cancelAllOrders': true,
35
35
  'cancelOrder': true,
36
+ 'closeAllPositions': false,
37
+ 'closePosition': false,
36
38
  'createOrder': true,
37
39
  'createReduceOnlyOrder': false,
38
40
  'createStopLimitOrder': false,
@@ -1037,6 +1039,7 @@ class bitstamp extends bitstamp$1 {
1037
1039
  * @method
1038
1040
  * @name bitstamp#fetchOHLCV
1039
1041
  * @description fetches historical candlestick data containing the open, high, low, and close price, and the volume of a market
1042
+ * @see https://www.bitstamp.net/api/#tag/Market-info/operation/GetOHLCData
1040
1043
  * @param {string} symbol unified symbol of the market to fetch OHLCV data for
1041
1044
  * @param {string} timeframe the length of time each candle represents
1042
1045
  * @param {int} [since] timestamp in ms of the earliest candle to fetch
@@ -1059,7 +1062,7 @@ class bitstamp extends bitstamp$1 {
1059
1062
  limit = 1000;
1060
1063
  const start = this.parseToInt(since / 1000);
1061
1064
  request['start'] = start;
1062
- request['end'] = this.sum(start, limit * duration);
1065
+ request['end'] = this.sum(start, duration * (limit - 1));
1063
1066
  request['limit'] = limit;
1064
1067
  }
1065
1068
  }
@@ -1067,7 +1070,7 @@ class bitstamp extends bitstamp$1 {
1067
1070
  if (since !== undefined) {
1068
1071
  const start = this.parseToInt(since / 1000);
1069
1072
  request['start'] = start;
1070
- request['end'] = this.sum(start, limit * duration);
1073
+ request['end'] = this.sum(start, duration * (limit - 1));
1071
1074
  }
1072
1075
  request['limit'] = Math.min(limit, 1000); // min 1, max 1000
1073
1076
  }
@@ -32,6 +32,8 @@ class bittrex extends bittrex$1 {
32
32
  'addMargin': false,
33
33
  'cancelAllOrders': true,
34
34
  'cancelOrder': true,
35
+ 'closeAllPositions': false,
36
+ 'closePosition': false,
35
37
  'createDepositAddress': true,
36
38
  'createMarketOrder': true,
37
39
  'createOrder': true,
@@ -32,6 +32,8 @@ class bitvavo extends bitvavo$1 {
32
32
  'addMargin': false,
33
33
  'cancelAllOrders': true,
34
34
  'cancelOrder': true,
35
+ 'closeAllPositions': false,
36
+ 'closePosition': false,
35
37
  'createOrder': true,
36
38
  'createReduceOnlyOrder': false,
37
39
  'createStopLimitOrder': true,
@@ -30,6 +30,8 @@ class bl3p extends bl3p$1 {
30
30
  'option': false,
31
31
  'addMargin': false,
32
32
  'cancelOrder': true,
33
+ 'closeAllPositions': false,
34
+ 'closePosition': false,
33
35
  'createOrder': true,
34
36
  'createReduceOnlyOrder': false,
35
37
  'createStopLimitOrder': false,
@@ -28,6 +28,8 @@ class btcalpha extends btcalpha$1 {
28
28
  'option': false,
29
29
  'addMargin': false,
30
30
  'cancelOrder': true,
31
+ 'closeAllPositions': false,
32
+ 'closePosition': false,
31
33
  'createOrder': true,
32
34
  'createReduceOnlyOrder': false,
33
35
  'createStopLimitOrder': false,
@@ -30,6 +30,8 @@ class btcbox extends btcbox$1 {
30
30
  'option': false,
31
31
  'addMargin': false,
32
32
  'cancelOrder': true,
33
+ 'closeAllPositions': false,
34
+ 'closePosition': false,
33
35
  'createOrder': true,
34
36
  'createReduceOnlyOrder': false,
35
37
  'fetchBalance': true,
@@ -30,6 +30,8 @@ class btcmarkets extends btcmarkets$1 {
30
30
  'addMargin': false,
31
31
  'cancelOrder': true,
32
32
  'cancelOrders': true,
33
+ 'closeAllPositions': false,
34
+ 'closePosition': false,
33
35
  'createOrder': true,
34
36
  'createReduceOnlyOrder': false,
35
37
  'fetchBalance': true,
@@ -29,6 +29,8 @@ class btcturk extends btcturk$1 {
29
29
  'option': false,
30
30
  'addMargin': false,
31
31
  'cancelOrder': true,
32
+ 'closeAllPositions': false,
33
+ 'closePosition': false,
32
34
  'createOrder': true,
33
35
  'createReduceOnlyOrder': false,
34
36
  'fetchBalance': true,
@@ -35,6 +35,8 @@ class bybit extends bybit$1 {
35
35
  'borrowCrossMargin': true,
36
36
  'cancelAllOrders': true,
37
37
  'cancelOrder': true,
38
+ 'closeAllPositions': false,
39
+ 'closePosition': false,
38
40
  'createMarketBuyOrderWithCost': true,
39
41
  'createMarketSellOrderWithCost': false,
40
42
  'createOrder': true,
@@ -35,11 +35,16 @@ class coinbase extends coinbase$1 {
35
35
  'addMargin': false,
36
36
  'cancelOrder': true,
37
37
  'cancelOrders': true,
38
+ 'closeAllPositions': false,
39
+ 'closePosition': false,
38
40
  'createDepositAddress': true,
39
41
  'createLimitBuyOrder': true,
40
42
  'createLimitSellOrder': true,
41
43
  'createMarketBuyOrder': true,
44
+ 'createMarketBuyOrderWithCost': true,
45
+ 'createMarketOrderWithCost': false,
42
46
  'createMarketSellOrder': true,
47
+ 'createMarketSellOrderWithCost': false,
43
48
  'createOrder': true,
44
49
  'createPostOnlyOrder': true,
45
50
  'createReduceOnlyOrder': false,
@@ -2078,6 +2083,25 @@ class coinbase extends coinbase$1 {
2078
2083
  }
2079
2084
  return request;
2080
2085
  }
2086
+ async createMarketBuyOrderWithCost(symbol, cost, params = {}) {
2087
+ /**
2088
+ * @method
2089
+ * @name coinbase#createMarketBuyOrderWithCost
2090
+ * @description create a market buy order by providing the symbol and cost
2091
+ * @see https://docs.cloud.coinbase.com/advanced-trade-api/reference/retailbrokerageapi_postorder
2092
+ * @param {string} symbol unified symbol of the market to create an order in
2093
+ * @param {float} cost how much you want to trade in units of the quote currency
2094
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
2095
+ * @returns {object} an [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
2096
+ */
2097
+ await this.loadMarkets();
2098
+ const market = this.market(symbol);
2099
+ if (!market['spot']) {
2100
+ throw new errors.NotSupported(this.id + ' createMarketBuyOrderWithCost() supports spot orders only');
2101
+ }
2102
+ params['createMarketBuyOrderRequiresPrice'] = false;
2103
+ return await this.createOrder(symbol, 'market', 'buy', cost, undefined, params);
2104
+ }
2081
2105
  async createOrder(symbol, type, side, amount, price = undefined, params = {}) {
2082
2106
  /**
2083
2107
  * @method
@@ -2098,6 +2122,7 @@ class coinbase extends coinbase$1 {
2098
2122
  * @param {string} [params.timeInForce] 'GTC', 'IOC', 'GTD' or 'PO'
2099
2123
  * @param {string} [params.stop_direction] 'UNKNOWN_STOP_DIRECTION', 'STOP_DIRECTION_STOP_UP', 'STOP_DIRECTION_STOP_DOWN' the direction the stopPrice is triggered from
2100
2124
  * @param {string} [params.end_time] '2023-05-25T17:01:05.092Z' for 'GTD' orders
2125
+ * @param {float} [params.cost] *spot market buy only* the quote quantity that can be used as an alternative for the amount
2101
2126
  * @returns {object} an [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
2102
2127
  */
2103
2128
  await this.loadMarkets();
@@ -2200,21 +2225,27 @@ class coinbase extends coinbase$1 {
2200
2225
  throw new errors.NotSupported(this.id + ' createOrder() only stop limit orders are supported');
2201
2226
  }
2202
2227
  if (side === 'buy') {
2203
- const createMarketBuyOrderRequiresPrice = this.safeValue(this.options, 'createMarketBuyOrderRequiresPrice', true);
2204
2228
  let total = undefined;
2205
- if (createMarketBuyOrderRequiresPrice) {
2229
+ let createMarketBuyOrderRequiresPrice = true;
2230
+ [createMarketBuyOrderRequiresPrice, params] = this.handleOptionAndParams(params, 'createOrder', 'createMarketBuyOrderRequiresPrice', true);
2231
+ const cost = this.safeNumber(params, 'cost');
2232
+ params = this.omit(params, 'cost');
2233
+ if (cost !== undefined) {
2234
+ total = this.costToPrecision(symbol, cost);
2235
+ }
2236
+ else if (createMarketBuyOrderRequiresPrice) {
2206
2237
  if (price === undefined) {
2207
- 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');
2238
+ 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 or param to false and pass the cost to spend in the amount argument');
2208
2239
  }
2209
2240
  else {
2210
2241
  const amountString = this.numberToString(amount);
2211
2242
  const priceString = this.numberToString(price);
2212
- const cost = this.parseNumber(Precise["default"].stringMul(amountString, priceString));
2213
- total = this.priceToPrecision(symbol, cost);
2243
+ const costRequest = Precise["default"].stringMul(amountString, priceString);
2244
+ total = this.costToPrecision(symbol, costRequest);
2214
2245
  }
2215
2246
  }
2216
2247
  else {
2217
- total = this.priceToPrecision(symbol, amount);
2248
+ total = this.costToPrecision(symbol, amount);
2218
2249
  }
2219
2250
  request['order_configuration'] = {
2220
2251
  'market_market_ioc': {