ccxt 4.1.95 → 4.1.97

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 (198) hide show
  1. package/README.md +3 -3
  2. package/build.sh +16 -16
  3. package/dist/ccxt.browser.js +1570 -1401
  4. package/dist/ccxt.browser.min.js +3 -3
  5. package/dist/cjs/ccxt.js +1 -1
  6. package/dist/cjs/src/ace.js +1 -1
  7. package/dist/cjs/src/ascendex.js +1 -1
  8. package/dist/cjs/src/base/Exchange.js +6 -5
  9. package/dist/cjs/src/base/errors.js +8 -1
  10. package/dist/cjs/src/bigone.js +2 -2
  11. package/dist/cjs/src/binance.js +145 -135
  12. package/dist/cjs/src/bingx.js +50 -8
  13. package/dist/cjs/src/bit2c.js +2 -3
  14. package/dist/cjs/src/bitfinex.js +1 -1
  15. package/dist/cjs/src/bitfinex2.js +3 -4
  16. package/dist/cjs/src/bitflyer.js +2 -2
  17. package/dist/cjs/src/bitmart.js +2 -2
  18. package/dist/cjs/src/bitmex.js +2 -2
  19. package/dist/cjs/src/bitopro.js +1 -1
  20. package/dist/cjs/src/bitpanda.js +1 -1
  21. package/dist/cjs/src/bitvavo.js +1 -1
  22. package/dist/cjs/src/blockchaincom.js +1 -1
  23. package/dist/cjs/src/btcalpha.js +2 -2
  24. package/dist/cjs/src/btcbox.js +3 -4
  25. package/dist/cjs/src/btcmarkets.js +2 -2
  26. package/dist/cjs/src/btcturk.js +1 -1
  27. package/dist/cjs/src/bybit.js +2 -2
  28. package/dist/cjs/src/cex.js +1 -1
  29. package/dist/cjs/src/coinbase.js +11 -5
  30. package/dist/cjs/src/coinbasepro.js +2 -2
  31. package/dist/cjs/src/coinex.js +1 -1
  32. package/dist/cjs/src/coinlist.js +1 -1
  33. package/dist/cjs/src/cryptocom.js +2 -1
  34. package/dist/cjs/src/delta.js +25 -0
  35. package/dist/cjs/src/deribit.js +1 -1
  36. package/dist/cjs/src/digifinex.js +1 -1
  37. package/dist/cjs/src/gate.js +3 -3
  38. package/dist/cjs/src/hitbtc.js +1 -1
  39. package/dist/cjs/src/hollaex.js +2 -2
  40. package/dist/cjs/src/htx.js +1 -1
  41. package/dist/cjs/src/huobijp.js +2 -2
  42. package/dist/cjs/src/idex.js +1 -1
  43. package/dist/cjs/src/independentreserve.js +1 -1
  44. package/dist/cjs/src/kraken.js +47 -46
  45. package/dist/cjs/src/krakenfutures.js +53 -26
  46. package/dist/cjs/src/kucoin.js +74 -4
  47. package/dist/cjs/src/kucoinfutures.js +2 -2
  48. package/dist/cjs/src/kuna.js +1 -1
  49. package/dist/cjs/src/latoken.js +1 -1
  50. package/dist/cjs/src/luno.js +2 -2
  51. package/dist/cjs/src/lykke.js +1 -1
  52. package/dist/cjs/src/mexc.js +2 -2
  53. package/dist/cjs/src/ndax.js +1 -1
  54. package/dist/cjs/src/novadax.js +2 -2
  55. package/dist/cjs/src/oceanex.js +1 -1
  56. package/dist/cjs/src/okcoin.js +1 -1
  57. package/dist/cjs/src/okx.js +1 -1
  58. package/dist/cjs/src/poloniexfutures.js +1 -1
  59. package/dist/cjs/src/pro/alpaca.js +1 -1
  60. package/dist/cjs/src/pro/ascendex.js +1 -1
  61. package/dist/cjs/src/pro/binance.js +4 -5
  62. package/dist/cjs/src/pro/bingx.js +6 -3
  63. package/dist/cjs/src/pro/bitfinex.js +3 -4
  64. package/dist/cjs/src/pro/bitfinex2.js +1 -1
  65. package/dist/cjs/src/pro/bitmex.js +1 -1
  66. package/dist/cjs/src/pro/bitpanda.js +1 -1
  67. package/dist/cjs/src/pro/blockchaincom.js +1 -1
  68. package/dist/cjs/src/pro/bybit.js +2 -2
  69. package/dist/cjs/src/pro/cex.js +1 -1
  70. package/dist/cjs/src/pro/coinbase.js +1 -1
  71. package/dist/cjs/src/pro/coinbasepro.js +1 -1
  72. package/dist/cjs/src/pro/deribit.js +1 -1
  73. package/dist/cjs/src/pro/gate.js +3 -3
  74. package/dist/cjs/src/pro/gemini.js +1 -1
  75. package/dist/cjs/src/pro/hollaex.js +1 -1
  76. package/dist/cjs/src/pro/htx.js +1 -1
  77. package/dist/cjs/src/pro/idex.js +1 -1
  78. package/dist/cjs/src/pro/kraken.js +3 -4
  79. package/dist/cjs/src/pro/krakenfutures.js +1 -1
  80. package/dist/cjs/src/pro/kucoinfutures.js +1 -1
  81. package/dist/cjs/src/pro/mexc.js +1 -1
  82. package/dist/cjs/src/pro/okcoin.js +1 -1
  83. package/dist/cjs/src/pro/okx.js +2 -2
  84. package/dist/cjs/src/pro/phemex.js +1 -1
  85. package/dist/cjs/src/pro/poloniexfutures.js +1 -1
  86. package/dist/cjs/src/pro/woo.js +2 -3
  87. package/dist/cjs/src/probit.js +1 -1
  88. package/dist/cjs/src/timex.js +1 -1
  89. package/dist/cjs/src/tokocrypto.js +1 -1
  90. package/dist/cjs/src/upbit.js +1 -1
  91. package/dist/cjs/src/wavesexchange.js +1 -1
  92. package/dist/cjs/src/whitebit.js +1 -1
  93. package/dist/cjs/src/woo.js +1 -1
  94. package/dist/cjs/src/zaif.js +1 -1
  95. package/js/ccxt.d.ts +1 -1
  96. package/js/ccxt.js +1 -1
  97. package/js/src/abstract/bingx.d.ts +2 -0
  98. package/js/src/abstract/kucoin.d.ts +12 -0
  99. package/js/src/abstract/kucoinfutures.d.ts +12 -1
  100. package/js/src/ace.js +1 -1
  101. package/js/src/ascendex.js +1 -1
  102. package/js/src/base/Exchange.d.ts +1 -1
  103. package/js/src/base/Exchange.js +7 -6
  104. package/js/src/base/errorHierarchy.d.ts +1 -0
  105. package/js/src/base/errorHierarchy.js +1 -0
  106. package/js/src/base/errors.d.ts +5 -1
  107. package/js/src/base/errors.js +8 -2
  108. package/js/src/bigone.js +2 -2
  109. package/js/src/binance.js +145 -135
  110. package/js/src/bingx.d.ts +1 -0
  111. package/js/src/bingx.js +50 -8
  112. package/js/src/bit2c.js +2 -3
  113. package/js/src/bitfinex.js +1 -1
  114. package/js/src/bitfinex2.js +3 -4
  115. package/js/src/bitflyer.js +2 -2
  116. package/js/src/bitmart.js +2 -2
  117. package/js/src/bitmex.js +2 -2
  118. package/js/src/bitopro.js +1 -1
  119. package/js/src/bitpanda.js +1 -1
  120. package/js/src/bitso.d.ts +1 -1
  121. package/js/src/bitvavo.js +1 -1
  122. package/js/src/blockchaincom.js +1 -1
  123. package/js/src/btcalpha.js +2 -2
  124. package/js/src/btcbox.js +3 -4
  125. package/js/src/btcmarkets.js +2 -2
  126. package/js/src/btcturk.js +1 -1
  127. package/js/src/bybit.js +2 -2
  128. package/js/src/cex.js +1 -1
  129. package/js/src/coinbase.js +11 -5
  130. package/js/src/coinbasepro.js +2 -2
  131. package/js/src/coinex.js +1 -1
  132. package/js/src/coinlist.js +1 -1
  133. package/js/src/cryptocom.js +2 -1
  134. package/js/src/delta.d.ts +5 -4
  135. package/js/src/delta.js +25 -0
  136. package/js/src/deribit.js +1 -1
  137. package/js/src/digifinex.js +1 -1
  138. package/js/src/gate.js +3 -3
  139. package/js/src/hitbtc.js +1 -1
  140. package/js/src/hollaex.js +2 -2
  141. package/js/src/htx.js +1 -1
  142. package/js/src/huobijp.js +2 -2
  143. package/js/src/idex.js +1 -1
  144. package/js/src/independentreserve.js +1 -1
  145. package/js/src/kraken.js +47 -46
  146. package/js/src/krakenfutures.js +53 -26
  147. package/js/src/kucoin.d.ts +3 -0
  148. package/js/src/kucoin.js +74 -4
  149. package/js/src/kucoinfutures.js +2 -2
  150. package/js/src/kuna.js +1 -1
  151. package/js/src/latoken.js +1 -1
  152. package/js/src/luno.js +2 -2
  153. package/js/src/lykke.js +1 -1
  154. package/js/src/mexc.js +2 -2
  155. package/js/src/ndax.js +1 -1
  156. package/js/src/novadax.js +2 -2
  157. package/js/src/oceanex.js +1 -1
  158. package/js/src/okcoin.js +1 -1
  159. package/js/src/okx.js +1 -1
  160. package/js/src/poloniexfutures.js +1 -1
  161. package/js/src/pro/alpaca.js +1 -1
  162. package/js/src/pro/ascendex.js +1 -1
  163. package/js/src/pro/binance.js +4 -5
  164. package/js/src/pro/bingx.js +6 -3
  165. package/js/src/pro/bitfinex.js +3 -4
  166. package/js/src/pro/bitfinex2.js +1 -1
  167. package/js/src/pro/bitmex.js +1 -1
  168. package/js/src/pro/bitpanda.js +1 -1
  169. package/js/src/pro/blockchaincom.js +1 -1
  170. package/js/src/pro/bybit.js +2 -2
  171. package/js/src/pro/cex.js +1 -1
  172. package/js/src/pro/coinbase.js +1 -1
  173. package/js/src/pro/coinbasepro.js +1 -1
  174. package/js/src/pro/deribit.js +1 -1
  175. package/js/src/pro/gate.js +3 -3
  176. package/js/src/pro/gemini.js +1 -1
  177. package/js/src/pro/hollaex.js +1 -1
  178. package/js/src/pro/htx.js +1 -1
  179. package/js/src/pro/idex.js +1 -1
  180. package/js/src/pro/kraken.js +3 -4
  181. package/js/src/pro/krakenfutures.js +1 -1
  182. package/js/src/pro/kucoinfutures.js +1 -1
  183. package/js/src/pro/mexc.js +1 -1
  184. package/js/src/pro/okcoin.js +1 -1
  185. package/js/src/pro/okx.js +2 -2
  186. package/js/src/pro/phemex.js +1 -1
  187. package/js/src/pro/poloniexfutures.js +1 -1
  188. package/js/src/pro/woo.js +2 -3
  189. package/js/src/probit.js +1 -1
  190. package/js/src/timex.js +1 -1
  191. package/js/src/tokocrypto.js +1 -1
  192. package/js/src/upbit.js +1 -1
  193. package/js/src/wavesexchange.js +1 -1
  194. package/js/src/whitebit.js +1 -1
  195. package/js/src/woo.js +1 -1
  196. package/js/src/zaif.js +1 -1
  197. package/package.json +2 -2
  198. package/skip-tests.json +1 -0
package/js/src/binance.js CHANGED
@@ -2568,24 +2568,23 @@ export default class binance extends Exchange {
2568
2568
  let type = this.safeString(params, 'type', defaultType);
2569
2569
  let subType = undefined;
2570
2570
  [subType, params] = this.handleSubTypeAndParams('fetchBalance', undefined, params);
2571
- const [marginMode, query] = this.handleMarginModeAndParams('fetchBalance', params);
2572
- let method = 'privateGetAccount';
2571
+ let marginMode = undefined;
2572
+ let query = undefined;
2573
+ [marginMode, query] = this.handleMarginModeAndParams('fetchBalance', params);
2574
+ query = this.omit(query, 'type');
2575
+ let response = undefined;
2573
2576
  const request = {};
2574
2577
  if (this.isLinear(type, subType)) {
2575
- const options = this.safeValue(this.options, type, {});
2576
- const fetchBalanceOptions = this.safeValue(options, 'fetchBalance', {});
2577
- method = this.safeString(fetchBalanceOptions, 'method', 'fapiPrivateV2GetAccount');
2578
2578
  type = 'linear';
2579
+ response = await this.fapiPrivateV2GetAccount(this.extend(request, query));
2579
2580
  }
2580
2581
  else if (this.isInverse(type, subType)) {
2581
- const options = this.safeValue(this.options, type, {});
2582
- const fetchBalanceOptions = this.safeValue(options, 'fetchBalance', {});
2583
- method = this.safeString(fetchBalanceOptions, 'method', 'dapiPrivateGetAccount');
2584
2582
  type = 'inverse';
2583
+ response = await this.dapiPrivateGetAccount(this.extend(request, query));
2585
2584
  }
2586
2585
  else if (marginMode === 'isolated') {
2587
- method = 'sapiGetMarginIsolatedAccount';
2588
2586
  const paramSymbols = this.safeValue(params, 'symbols');
2587
+ query = this.omit(query, 'symbols');
2589
2588
  if (paramSymbols !== undefined) {
2590
2589
  let symbols = '';
2591
2590
  if (Array.isArray(paramSymbols)) {
@@ -2601,18 +2600,20 @@ export default class binance extends Exchange {
2601
2600
  }
2602
2601
  request['symbols'] = symbols;
2603
2602
  }
2603
+ response = await this.sapiGetMarginIsolatedAccount(this.extend(request, query));
2604
2604
  }
2605
2605
  else if ((type === 'margin') || (marginMode === 'cross')) {
2606
- method = 'sapiGetMarginAccount';
2606
+ response = await this.sapiGetMarginAccount(this.extend(request, query));
2607
2607
  }
2608
2608
  else if (type === 'savings') {
2609
- method = 'sapiGetLendingUnionAccount';
2609
+ response = await this.sapiGetLendingUnionAccount(this.extend(request, query));
2610
2610
  }
2611
2611
  else if (type === 'funding') {
2612
- method = 'sapiPostAssetGetFundingAsset';
2612
+ response = await this.sapiPostAssetGetFundingAsset(this.extend(request, query));
2613
+ }
2614
+ else {
2615
+ response = await this.privateGetAccount(this.extend(request, query));
2613
2616
  }
2614
- const requestParams = this.omit(query, ['type', 'symbols']);
2615
- const response = await this[method](this.extend(request, requestParams));
2616
2617
  //
2617
2618
  // spot
2618
2619
  //
@@ -3304,33 +3305,35 @@ export default class binance extends Exchange {
3304
3305
  if (until !== undefined) {
3305
3306
  request['endTime'] = until;
3306
3307
  }
3307
- let method = 'publicGetKlines';
3308
+ let response = undefined;
3308
3309
  if (market['option']) {
3309
- method = 'eapiPublicGetKlines';
3310
+ response = await this.eapiPublicGetKlines(this.extend(request, params));
3310
3311
  }
3311
3312
  else if (price === 'mark') {
3312
3313
  if (market['inverse']) {
3313
- method = 'dapiPublicGetMarkPriceKlines';
3314
+ response = await this.dapiPublicGetMarkPriceKlines(this.extend(request, params));
3314
3315
  }
3315
3316
  else {
3316
- method = 'fapiPublicGetMarkPriceKlines';
3317
+ response = await this.fapiPublicGetMarkPriceKlines(this.extend(request, params));
3317
3318
  }
3318
3319
  }
3319
3320
  else if (price === 'index') {
3320
3321
  if (market['inverse']) {
3321
- method = 'dapiPublicGetIndexPriceKlines';
3322
+ response = await this.dapiPublicGetIndexPriceKlines(this.extend(request, params));
3322
3323
  }
3323
3324
  else {
3324
- method = 'fapiPublicGetIndexPriceKlines';
3325
+ response = await this.fapiPublicGetIndexPriceKlines(this.extend(request, params));
3325
3326
  }
3326
3327
  }
3327
3328
  else if (market['linear']) {
3328
- method = 'fapiPublicGetKlines';
3329
+ response = await this.fapiPublicGetKlines(this.extend(request, params));
3329
3330
  }
3330
3331
  else if (market['inverse']) {
3331
- method = 'dapiPublicGetKlines';
3332
+ response = await this.dapiPublicGetKlines(this.extend(request, params));
3333
+ }
3334
+ else {
3335
+ response = await this.publicGetKlines(this.extend(request, params));
3332
3336
  }
3333
- const response = await this[method](this.extend(request, params));
3334
3337
  //
3335
3338
  // [
3336
3339
  // [1591478520000,"0.02501300","0.02501800","0.02500000","0.02500000","22.19000000",1591478579999,"0.55490906",40,"10.92900000","0.27336462","0"],
@@ -4746,22 +4749,6 @@ export default class binance extends Exchange {
4746
4749
  const request = {
4747
4750
  'symbol': market['id'],
4748
4751
  };
4749
- let method = 'privateGetOrder';
4750
- if (market['option']) {
4751
- method = 'eapiPrivateGetOrder';
4752
- }
4753
- else if (market['linear']) {
4754
- method = 'fapiPrivateGetOrder';
4755
- }
4756
- else if (market['inverse']) {
4757
- method = 'dapiPrivateGetOrder';
4758
- }
4759
- else if (type === 'margin' || marginMode !== undefined) {
4760
- method = 'sapiGetMarginOrder';
4761
- if (marginMode === 'isolated') {
4762
- request['isIsolated'] = true;
4763
- }
4764
- }
4765
4752
  const clientOrderId = this.safeValue2(params, 'origClientOrderId', 'clientOrderId');
4766
4753
  if (clientOrderId !== undefined) {
4767
4754
  if (market['option']) {
@@ -4775,7 +4762,25 @@ export default class binance extends Exchange {
4775
4762
  request['orderId'] = id;
4776
4763
  }
4777
4764
  const requestParams = this.omit(query, ['type', 'clientOrderId', 'origClientOrderId']);
4778
- const response = await this[method](this.extend(request, requestParams));
4765
+ let response = undefined;
4766
+ if (market['option']) {
4767
+ response = await this.eapiPrivateGetOrder(this.extend(request, requestParams));
4768
+ }
4769
+ else if (market['linear']) {
4770
+ response = await this.fapiPrivateGetOrder(this.extend(request, requestParams));
4771
+ }
4772
+ else if (market['inverse']) {
4773
+ response = await this.dapiPrivateGetOrder(this.extend(request, requestParams));
4774
+ }
4775
+ else if (type === 'margin' || marginMode !== undefined) {
4776
+ if (marginMode === 'isolated') {
4777
+ request['isIsolated'] = true;
4778
+ }
4779
+ response = await this.sapiGetMarginOrder(this.extend(request, requestParams));
4780
+ }
4781
+ else {
4782
+ response = await this.privateGetOrder(this.extend(request, requestParams));
4783
+ }
4779
4784
  return this.parseOrder(response, market);
4780
4785
  }
4781
4786
  async fetchOrders(symbol = undefined, since = undefined, limit = undefined, params = {}) {
@@ -4813,34 +4818,36 @@ export default class binance extends Exchange {
4813
4818
  const request = {
4814
4819
  'symbol': market['id'],
4815
4820
  };
4816
- let method = 'privateGetAllOrders';
4821
+ const until = this.safeInteger(params, 'until');
4822
+ if (until !== undefined) {
4823
+ params = this.omit(params, 'until');
4824
+ request['endTime'] = until;
4825
+ }
4826
+ if (since !== undefined) {
4827
+ request['startTime'] = since;
4828
+ }
4829
+ if (limit !== undefined) {
4830
+ request['limit'] = limit;
4831
+ }
4832
+ let response = undefined;
4817
4833
  if (market['option']) {
4818
- method = 'eapiPrivateGetHistoryOrders';
4834
+ response = await this.eapiPrivateGetHistoryOrders(this.extend(request, query));
4819
4835
  }
4820
4836
  else if (market['linear']) {
4821
- method = 'fapiPrivateGetAllOrders';
4837
+ response = await this.fapiPrivateGetAllOrders(this.extend(request, query));
4822
4838
  }
4823
4839
  else if (market['inverse']) {
4824
- method = 'dapiPrivateGetAllOrders';
4840
+ response = await this.dapiPrivateGetAllOrders(this.extend(request, query));
4825
4841
  }
4826
4842
  else if (type === 'margin' || marginMode !== undefined) {
4827
- method = 'sapiGetMarginAllOrders';
4828
4843
  if (marginMode === 'isolated') {
4829
4844
  request['isIsolated'] = true;
4830
4845
  }
4846
+ response = await this.sapiGetMarginAllOrders(this.extend(request, query));
4831
4847
  }
4832
- const until = this.safeInteger(params, 'until');
4833
- if (until !== undefined) {
4834
- params = this.omit(params, 'until');
4835
- request['endTime'] = until;
4836
- }
4837
- if (since !== undefined) {
4838
- request['startTime'] = since;
4839
- }
4840
- if (limit !== undefined) {
4841
- request['limit'] = limit;
4848
+ else {
4849
+ response = await this.privateGetAllOrders(this.extend(request, query));
4842
4850
  }
4843
- const response = await this[method](this.extend(request, query));
4844
4851
  //
4845
4852
  // spot
4846
4853
  //
@@ -4965,32 +4972,34 @@ export default class binance extends Exchange {
4965
4972
  let subType = undefined;
4966
4973
  [subType, query] = this.handleSubTypeAndParams('fetchOpenOrders', market, query);
4967
4974
  const requestParams = this.omit(query, 'type');
4968
- let method = 'privateGetOpenOrders';
4975
+ let response = undefined;
4969
4976
  if (type === 'option') {
4970
- method = 'eapiPrivateGetOpenOrders';
4971
4977
  if (since !== undefined) {
4972
4978
  request['startTime'] = since;
4973
4979
  }
4974
4980
  if (limit !== undefined) {
4975
4981
  request['limit'] = limit;
4976
4982
  }
4983
+ response = await this.eapiPrivateGetOpenOrders(this.extend(request, requestParams));
4977
4984
  }
4978
4985
  else if (this.isLinear(type, subType)) {
4979
- method = 'fapiPrivateGetOpenOrders';
4986
+ response = await this.fapiPrivateGetOpenOrders(this.extend(request, requestParams));
4980
4987
  }
4981
4988
  else if (this.isInverse(type, subType)) {
4982
- method = 'dapiPrivateGetOpenOrders';
4989
+ response = await this.dapiPrivateGetOpenOrders(this.extend(request, requestParams));
4983
4990
  }
4984
4991
  else if (type === 'margin' || marginMode !== undefined) {
4985
- method = 'sapiGetMarginOpenOrders';
4986
4992
  if (marginMode === 'isolated') {
4987
4993
  request['isIsolated'] = true;
4988
4994
  if (symbol === undefined) {
4989
4995
  throw new ArgumentsRequired(this.id + ' fetchOpenOrders() requires a symbol argument for isolated markets');
4990
4996
  }
4991
4997
  }
4998
+ response = await this.sapiGetMarginOpenOrders(this.extend(request, requestParams));
4999
+ }
5000
+ else {
5001
+ response = await this.privateGetOpenOrders(this.extend(request, requestParams));
4992
5002
  }
4993
- const response = await this[method](this.extend(request, requestParams));
4994
5003
  return this.parseOrders(response, market, since, limit);
4995
5004
  }
4996
5005
  async fetchClosedOrders(symbol = undefined, since = undefined, limit = undefined, params = {}) {
@@ -5081,24 +5090,26 @@ export default class binance extends Exchange {
5081
5090
  else {
5082
5091
  request['orderId'] = id;
5083
5092
  }
5084
- let method = 'privateDeleteOrder';
5093
+ const requestParams = this.omit(query, ['type', 'origClientOrderId', 'clientOrderId']);
5094
+ let response = undefined;
5085
5095
  if (market['option']) {
5086
- method = 'eapiPrivateDeleteOrder';
5096
+ response = await this.eapiPrivateDeleteOrder(this.extend(request, requestParams));
5087
5097
  }
5088
5098
  else if (market['linear']) {
5089
- method = 'fapiPrivateDeleteOrder';
5099
+ response = await this.fapiPrivateDeleteOrder(this.extend(request, requestParams));
5090
5100
  }
5091
5101
  else if (market['inverse']) {
5092
- method = 'dapiPrivateDeleteOrder';
5102
+ response = await this.dapiPrivateDeleteOrder(this.extend(request, requestParams));
5093
5103
  }
5094
5104
  else if (type === 'margin' || marginMode !== undefined) {
5095
- method = 'sapiDeleteMarginOrder';
5096
5105
  if (marginMode === 'isolated') {
5097
5106
  request['isIsolated'] = true;
5098
5107
  }
5108
+ response = await this.sapiDeleteMarginOrder(this.extend(request, requestParams));
5109
+ }
5110
+ else {
5111
+ response = await this.privateDeleteOrder(this.extend(request, requestParams));
5099
5112
  }
5100
- const requestParams = this.omit(query, ['type', 'origClientOrderId', 'clientOrderId']);
5101
- const response = await this[method](this.extend(request, requestParams));
5102
5113
  return this.parseOrder(response, market);
5103
5114
  }
5104
5115
  async cancelAllOrders(symbol = undefined, params = {}) {
@@ -5127,23 +5138,25 @@ export default class binance extends Exchange {
5127
5138
  const type = this.safeString(params, 'type', market['type']);
5128
5139
  params = this.omit(params, ['type']);
5129
5140
  const [marginMode, query] = this.handleMarginModeAndParams('cancelAllOrders', params);
5130
- let method = 'privateDeleteOpenOrders';
5141
+ let response = undefined;
5131
5142
  if (market['option']) {
5132
- method = 'eapiPrivateDeleteAllOpenOrders';
5143
+ response = await this.eapiPrivateDeleteAllOpenOrders(this.extend(request, query));
5133
5144
  }
5134
5145
  else if (market['linear']) {
5135
- method = 'fapiPrivateDeleteAllOpenOrders';
5146
+ response = await this.fapiPrivateDeleteAllOpenOrders(this.extend(request, query));
5136
5147
  }
5137
5148
  else if (market['inverse']) {
5138
- method = 'dapiPrivateDeleteAllOpenOrders';
5149
+ response = await this.dapiPrivateDeleteAllOpenOrders(this.extend(request, query));
5139
5150
  }
5140
5151
  else if ((type === 'margin') || (marginMode !== undefined)) {
5141
- method = 'sapiDeleteMarginOpenOrders';
5142
5152
  if (marginMode === 'isolated') {
5143
5153
  request['isIsolated'] = true;
5144
5154
  }
5155
+ response = await this.sapiDeleteMarginOpenOrders(this.extend(request, query));
5156
+ }
5157
+ else {
5158
+ response = await this.privateDeleteOpenOrders(this.extend(request, query));
5145
5159
  }
5146
- const response = await this[method](this.extend(request, query));
5147
5160
  if (Array.isArray(response)) {
5148
5161
  return this.parseOrders(response, market);
5149
5162
  }
@@ -5280,37 +5293,12 @@ export default class binance extends Exchange {
5280
5293
  const request = {};
5281
5294
  let market = undefined;
5282
5295
  let type = undefined;
5283
- let method = undefined;
5284
5296
  let marginMode = undefined;
5285
5297
  if (symbol !== undefined) {
5286
5298
  market = this.market(symbol);
5287
5299
  request['symbol'] = market['id'];
5288
5300
  }
5289
5301
  [type, params] = this.handleMarketTypeAndParams('fetchMyTrades', market, params);
5290
- if (type === 'option') {
5291
- method = 'eapiPrivateGetUserTrades';
5292
- }
5293
- else {
5294
- if (symbol === undefined) {
5295
- throw new ArgumentsRequired(this.id + ' fetchMyTrades() requires a symbol argument');
5296
- }
5297
- [marginMode, params] = this.handleMarginModeAndParams('fetchMyTrades', params);
5298
- if (type === 'spot' || type === 'margin') {
5299
- method = 'privateGetMyTrades';
5300
- if ((type === 'margin') || (marginMode !== undefined)) {
5301
- method = 'sapiGetMarginMyTrades';
5302
- if (marginMode === 'isolated') {
5303
- request['isIsolated'] = true;
5304
- }
5305
- }
5306
- }
5307
- else if (market['linear']) {
5308
- method = 'fapiPrivateGetUserTrades';
5309
- }
5310
- else if (market['inverse']) {
5311
- method = 'dapiPrivateGetUserTrades';
5312
- }
5313
- }
5314
5302
  let endTime = this.safeInteger2(params, 'until', 'endTime');
5315
5303
  if (since !== undefined) {
5316
5304
  const startTime = since;
@@ -5338,7 +5326,33 @@ export default class binance extends Exchange {
5338
5326
  }
5339
5327
  request['limit'] = limit;
5340
5328
  }
5341
- const response = await this[method](this.extend(request, params));
5329
+ let response = undefined;
5330
+ if (type === 'option') {
5331
+ response = await this.eapiPrivateGetUserTrades(this.extend(request, params));
5332
+ }
5333
+ else {
5334
+ if (symbol === undefined) {
5335
+ throw new ArgumentsRequired(this.id + ' fetchMyTrades() requires a symbol argument');
5336
+ }
5337
+ [marginMode, params] = this.handleMarginModeAndParams('fetchMyTrades', params);
5338
+ if (type === 'spot' || type === 'margin') {
5339
+ if ((type === 'margin') || (marginMode !== undefined)) {
5340
+ if (marginMode === 'isolated') {
5341
+ request['isIsolated'] = true;
5342
+ }
5343
+ response = await this.sapiGetMarginMyTrades(this.extend(request, params));
5344
+ }
5345
+ else {
5346
+ response = await this.privateGetMyTrades(this.extend(request, params));
5347
+ }
5348
+ }
5349
+ else if (market['linear']) {
5350
+ response = await this.fapiPrivateGetUserTrades(this.extend(request, params));
5351
+ }
5352
+ else if (market['inverse']) {
5353
+ response = await this.dapiPrivateGetUserTrades(this.extend(request, params));
5354
+ }
5355
+ }
5342
5356
  //
5343
5357
  // spot trade
5344
5358
  //
@@ -6668,7 +6682,6 @@ export default class binance extends Exchange {
6668
6682
  * @returns {object} a dictionary of [fee structures]{@link https://docs.ccxt.com/#/?id=fee-structure} indexed by market symbols
6669
6683
  */
6670
6684
  await this.loadMarkets();
6671
- let method = undefined;
6672
6685
  let type = undefined;
6673
6686
  [type, params] = this.handleMarketTypeAndParams('fetchTradingFees', undefined, params);
6674
6687
  let subType = undefined;
@@ -6676,16 +6689,16 @@ export default class binance extends Exchange {
6676
6689
  const isSpotOrMargin = (type === 'spot') || (type === 'margin');
6677
6690
  const isLinear = this.isLinear(type, subType);
6678
6691
  const isInverse = this.isInverse(type, subType);
6692
+ let response = undefined;
6679
6693
  if (isSpotOrMargin) {
6680
- method = 'sapiGetAssetTradeFee';
6694
+ response = await this.sapiGetAssetTradeFee(params);
6681
6695
  }
6682
6696
  else if (isLinear) {
6683
- method = 'fapiPrivateV2GetAccount';
6697
+ response = await this.fapiPrivateV2GetAccount(params);
6684
6698
  }
6685
6699
  else if (isInverse) {
6686
- method = 'dapiPrivateGetAccount';
6700
+ response = await this.dapiPrivateGetAccount(params);
6687
6701
  }
6688
- const response = await this[method](params);
6689
6702
  //
6690
6703
  // sapi / spot
6691
6704
  //
@@ -6883,17 +6896,16 @@ export default class binance extends Exchange {
6883
6896
  const request = {
6884
6897
  'symbol': market['id'],
6885
6898
  };
6886
- let method = undefined;
6899
+ let response = undefined;
6887
6900
  if (market['linear']) {
6888
- method = 'fapiPublicGetPremiumIndex';
6901
+ response = await this.fapiPublicGetPremiumIndex(this.extend(request, params));
6889
6902
  }
6890
6903
  else if (market['inverse']) {
6891
- method = 'dapiPublicGetPremiumIndex';
6904
+ response = await this.dapiPublicGetPremiumIndex(this.extend(request, params));
6892
6905
  }
6893
6906
  else {
6894
6907
  throw new NotSupported(this.id + ' fetchFundingRate() supports linear and inverse contracts only');
6895
6908
  }
6896
- let response = await this[method](this.extend(request, params));
6897
6909
  if (market['inverse']) {
6898
6910
  response = response[0];
6899
6911
  }
@@ -7531,20 +7543,20 @@ export default class binance extends Exchange {
7531
7543
  * @returns {object} a dictionary of [leverage tiers structures]{@link https://docs.ccxt.com/#/?id=leverage-tiers-structure}, indexed by market symbols
7532
7544
  */
7533
7545
  await this.loadMarkets();
7534
- const [type, query] = this.handleMarketTypeAndParams('fetchLeverageTiers', undefined, params);
7546
+ let type = undefined;
7547
+ [type, params] = this.handleMarketTypeAndParams('fetchLeverageTiers', undefined, params);
7535
7548
  let subType = undefined;
7536
- [subType, params] = this.handleSubTypeAndParams('fetchLeverageTiers', undefined, query, 'linear');
7537
- let method = undefined;
7549
+ [subType, params] = this.handleSubTypeAndParams('fetchLeverageTiers', undefined, params, 'linear');
7550
+ let response = undefined;
7538
7551
  if (this.isLinear(type, subType)) {
7539
- method = 'fapiPrivateGetLeverageBracket';
7552
+ response = await this.fapiPrivateGetLeverageBracket(params);
7540
7553
  }
7541
7554
  else if (this.isInverse(type, subType)) {
7542
- method = 'dapiPrivateV2GetLeverageBracket';
7555
+ response = await this.dapiPrivateV2GetLeverageBracket(params);
7543
7556
  }
7544
7557
  else {
7545
7558
  throw new NotSupported(this.id + ' fetchLeverageTiers() supports linear and inverse contracts only');
7546
7559
  }
7547
- const response = await this[method](query);
7548
7560
  //
7549
7561
  // usdm
7550
7562
  //
@@ -8018,21 +8030,21 @@ export default class binance extends Exchange {
8018
8030
  }
8019
8031
  await this.loadMarkets();
8020
8032
  const market = this.market(symbol);
8021
- let method;
8033
+ const request = {
8034
+ 'symbol': market['id'],
8035
+ 'leverage': leverage,
8036
+ };
8037
+ let response = undefined;
8022
8038
  if (market['linear']) {
8023
- method = 'fapiPrivatePostLeverage';
8039
+ response = await this.fapiPrivatePostLeverage(this.extend(request, params));
8024
8040
  }
8025
8041
  else if (market['inverse']) {
8026
- method = 'dapiPrivatePostLeverage';
8042
+ response = await this.dapiPrivatePostLeverage(this.extend(request, params));
8027
8043
  }
8028
8044
  else {
8029
8045
  throw new NotSupported(this.id + ' setLeverage() supports linear and inverse contracts only');
8030
8046
  }
8031
- const request = {
8032
- 'symbol': market['id'],
8033
- 'leverage': leverage,
8034
- };
8035
- return await this[method](this.extend(request, params));
8047
+ return response;
8036
8048
  }
8037
8049
  async setMarginMode(marginMode, symbol = undefined, params = {}) {
8038
8050
  /**
@@ -8065,23 +8077,21 @@ export default class binance extends Exchange {
8065
8077
  }
8066
8078
  await this.loadMarkets();
8067
8079
  const market = this.market(symbol);
8068
- let method = undefined;
8069
- if (market['linear']) {
8070
- method = 'fapiPrivatePostMarginType';
8071
- }
8072
- else if (market['inverse']) {
8073
- method = 'dapiPrivatePostMarginType';
8074
- }
8075
- else {
8076
- throw new NotSupported(this.id + ' setMarginMode() supports linear and inverse contracts only');
8077
- }
8078
8080
  const request = {
8079
8081
  'symbol': market['id'],
8080
8082
  'marginType': marginMode,
8081
8083
  };
8082
8084
  let response = undefined;
8083
8085
  try {
8084
- response = await this[method](this.extend(request, params));
8086
+ if (market['linear']) {
8087
+ response = await this.fapiPrivatePostMarginType(this.extend(request, params));
8088
+ }
8089
+ else if (market['inverse']) {
8090
+ response = await this.dapiPrivatePostMarginType(this.extend(request, params));
8091
+ }
8092
+ else {
8093
+ throw new NotSupported(this.id + ' setMarginMode() supports linear and inverse contracts only');
8094
+ }
8085
8095
  }
8086
8096
  catch (e) {
8087
8097
  // not an error
package/js/src/bingx.d.ts CHANGED
@@ -134,6 +134,7 @@ export default class bingx extends Exchange {
134
134
  fetchMyLiquidations(symbol?: Str, since?: Int, limit?: Int, params?: {}): Promise<import("./base/types.js").Liquidation[]>;
135
135
  parseLiquidation(liquidation: any, market?: Market): import("./base/types.js").Liquidation;
136
136
  closeAllPositions(params?: {}): Promise<Position[]>;
137
+ setPositionMode(hedged: any, symbol?: Str, params?: {}): Promise<any>;
137
138
  sign(path: any, section?: string, method?: string, params?: {}, headers?: any, body?: any): {
138
139
  url: any;
139
140
  method: string;
package/js/src/bingx.js CHANGED
@@ -145,6 +145,16 @@ export default class bingx extends Exchange {
145
145
  },
146
146
  },
147
147
  'swap': {
148
+ 'v1': {
149
+ 'private': {
150
+ 'get': {
151
+ 'positionSide/dual': 1,
152
+ },
153
+ 'post': {
154
+ 'positionSide/dual': 1,
155
+ },
156
+ },
157
+ },
148
158
  'v2': {
149
159
  'public': {
150
160
  'get': {
@@ -331,6 +341,7 @@ export default class bingx extends Exchange {
331
341
  '100202': InsufficientFunds,
332
342
  '100204': BadRequest,
333
343
  '100400': BadRequest,
344
+ '100421': BadSymbol,
334
345
  '100440': ExchangeError,
335
346
  '100500': ExchangeError,
336
347
  '100503': ExchangeError,
@@ -1306,7 +1317,7 @@ export default class bingx extends Exchange {
1306
1317
  // }
1307
1318
  //
1308
1319
  const marketId = this.safeString(ticker, 'symbol');
1309
- const change = this.safeString(ticker, 'priceChange');
1320
+ // const change = this.safeString (ticker, 'priceChange'); // this is not ccxt's change because it does high-low instead of last-open
1310
1321
  const lastQty = this.safeString(ticker, 'lastQty');
1311
1322
  // in spot markets, lastQty is not present
1312
1323
  // it's (bad, but) the only way we can check the tickers origin
@@ -1318,10 +1329,10 @@ export default class bingx extends Exchange {
1318
1329
  const close = this.safeString(ticker, 'lastPrice');
1319
1330
  const quoteVolume = this.safeString(ticker, 'quoteVolume');
1320
1331
  const baseVolume = this.safeString(ticker, 'volume');
1321
- let percentage = this.safeString(ticker, 'priceChangePercent');
1322
- if (percentage !== undefined) {
1323
- percentage = percentage.replace('%', '');
1324
- }
1332
+ // let percentage = this.safeString (ticker, 'priceChangePercent');
1333
+ // if (percentage !== undefined) {
1334
+ // percentage = percentage.replace ('%', '');
1335
+ // } similarly to change, it's not ccxt's percentage because it does priceChange/open, and priceChange is high-low
1325
1336
  const ts = this.safeInteger(ticker, 'closeTime');
1326
1337
  const datetime = this.iso8601(ts);
1327
1338
  const bid = this.safeString(ticker, 'bidPrice');
@@ -1343,8 +1354,8 @@ export default class bingx extends Exchange {
1343
1354
  'close': close,
1344
1355
  'last': undefined,
1345
1356
  'previousClose': undefined,
1346
- 'change': change,
1347
- 'percentage': percentage,
1357
+ 'change': undefined,
1358
+ 'percentage': undefined,
1348
1359
  'average': undefined,
1349
1360
  'baseVolume': baseVolume,
1350
1361
  'quoteVolume': quoteVolume,
@@ -2472,7 +2483,7 @@ export default class bingx extends Exchange {
2472
2483
  * @see https://bingx-api.github.io/docs/#/standard/contract-interface.html#Historical%20order
2473
2484
  * @param {string} [symbol] unified market symbol of the market orders were made in
2474
2485
  * @param {int} [since] the earliest time in ms to fetch orders for
2475
- * @param {int} [limit] the maximum number of orde structures to retrieve
2486
+ * @param {int} [limit] the maximum number of order structures to retrieve
2476
2487
  * @param {object} [params] extra parameters specific to the exchange API endpoint
2477
2488
  * @param {int} [params.until] the latest time in ms to fetch orders for
2478
2489
  * @param {boolean} [params.standard] whether to fetch standard contract orders
@@ -3415,6 +3426,37 @@ export default class bingx extends Exchange {
3415
3426
  }
3416
3427
  return positions;
3417
3428
  }
3429
+ async setPositionMode(hedged, symbol = undefined, params = {}) {
3430
+ /**
3431
+ * @method
3432
+ * @name bingx#setPositionMode
3433
+ * @description set hedged to true or false for a market
3434
+ * @see https://bingx-api.github.io/docs/#/en-us/swapV2/trade-api.html#Set%20Position%20Mode
3435
+ * @param {bool} hedged set to true to use dualSidePosition
3436
+ * @param {string} symbol not used by bingx setPositionMode ()
3437
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
3438
+ * @returns {object} response from the exchange
3439
+ */
3440
+ let dualSidePosition = undefined;
3441
+ if (hedged) {
3442
+ dualSidePosition = 'true';
3443
+ }
3444
+ else {
3445
+ dualSidePosition = 'false';
3446
+ }
3447
+ const request = {
3448
+ 'dualSidePosition': dualSidePosition,
3449
+ };
3450
+ //
3451
+ // {
3452
+ // code: '0',
3453
+ // msg: '',
3454
+ // timeStamp: '1703327432734',
3455
+ // data: { dualSidePosition: 'false' }
3456
+ // }
3457
+ //
3458
+ return await this.swapV1PrivatePostPositionSideDual(this.extend(request, params));
3459
+ }
3418
3460
  sign(path, section = 'public', method = 'GET', params = {}, headers = undefined, body = undefined) {
3419
3461
  const type = section[0];
3420
3462
  const version = section[1];
package/js/src/bit2c.js CHANGED
@@ -279,14 +279,13 @@ export default class bit2c extends Exchange {
279
279
  }
280
280
  parseTicker(ticker, market = undefined) {
281
281
  const symbol = this.safeSymbol(undefined, market);
282
- const timestamp = this.milliseconds();
283
282
  const averagePrice = this.safeString(ticker, 'av');
284
283
  const baseVolume = this.safeString(ticker, 'a');
285
284
  const last = this.safeString(ticker, 'll');
286
285
  return this.safeTicker({
287
286
  'symbol': symbol,
288
- 'timestamp': timestamp,
289
- 'datetime': this.iso8601(timestamp),
287
+ 'timestamp': undefined,
288
+ 'datetime': undefined,
290
289
  'high': undefined,
291
290
  'low': undefined,
292
291
  'bid': this.safeString(ticker, 'h'),
@@ -1241,7 +1241,7 @@ export default class bitfinex extends Exchange {
1241
1241
  * @description fetches information on multiple closed orders made by the user
1242
1242
  * @param {string} symbol unified market symbol of the market orders were made in
1243
1243
  * @param {int} [since] the earliest time in ms to fetch orders for
1244
- * @param {int} [limit] the maximum number of orde structures to retrieve
1244
+ * @param {int} [limit] the maximum number of order structures to retrieve
1245
1245
  * @param {object} [params] extra parameters specific to the exchange API endpoint
1246
1246
  * @returns {Order[]} a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
1247
1247
  */