ccxt 4.2.56 → 4.2.58

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 (75) hide show
  1. package/README.md +4 -4
  2. package/dist/ccxt.browser.js +818 -335
  3. package/dist/ccxt.browser.min.js +7 -7
  4. package/dist/cjs/ccxt.js +1 -1
  5. package/dist/cjs/src/alpaca.js +90 -88
  6. package/dist/cjs/src/base/Exchange.js +53 -3
  7. package/dist/cjs/src/binance.js +196 -28
  8. package/dist/cjs/src/bingx.js +12 -1
  9. package/dist/cjs/src/bitget.js +71 -56
  10. package/dist/cjs/src/bitmex.js +26 -1
  11. package/dist/cjs/src/bitrue.js +24 -15
  12. package/dist/cjs/src/blofin.js +24 -1
  13. package/dist/cjs/src/bybit.js +11 -3
  14. package/dist/cjs/src/currencycom.js +15 -5
  15. package/dist/cjs/src/delta.js +14 -1
  16. package/dist/cjs/src/gate.js +1 -1
  17. package/dist/cjs/src/hitbtc.js +63 -55
  18. package/dist/cjs/src/krakenfutures.js +22 -7
  19. package/dist/cjs/src/kuna.js +14 -11
  20. package/dist/cjs/src/mexc.js +75 -0
  21. package/dist/cjs/src/okx.js +31 -1
  22. package/dist/cjs/src/pro/alpaca.js +1 -1
  23. package/dist/cjs/src/pro/bitmex.js +23 -32
  24. package/dist/cjs/src/pro/cex.js +6 -2
  25. package/dist/cjs/src/pro/coinex.js +6 -3
  26. package/dist/cjs/src/pro/mexc.js +2 -2
  27. package/dist/cjs/src/pro/whitebit.js +15 -13
  28. package/dist/cjs/src/probit.js +1 -1
  29. package/dist/cjs/src/wavesexchange.js +1 -1
  30. package/dist/cjs/src/woo.js +20 -4
  31. package/js/ccxt.d.ts +3 -3
  32. package/js/ccxt.js +1 -1
  33. package/js/src/alpaca.js +90 -88
  34. package/js/src/base/Exchange.d.ts +14 -6
  35. package/js/src/base/Exchange.js +53 -3
  36. package/js/src/base/types.d.ts +12 -1
  37. package/js/src/binance.d.ts +5 -2
  38. package/js/src/binance.js +196 -28
  39. package/js/src/bingx.d.ts +3 -2
  40. package/js/src/bingx.js +12 -1
  41. package/js/src/bitget.d.ts +3 -2
  42. package/js/src/bitget.js +71 -56
  43. package/js/src/bitmex.d.ts +3 -1
  44. package/js/src/bitmex.js +26 -1
  45. package/js/src/bitrue.js +24 -15
  46. package/js/src/blofin.d.ts +3 -2
  47. package/js/src/blofin.js +24 -1
  48. package/js/src/bybit.d.ts +3 -6
  49. package/js/src/bybit.js +11 -3
  50. package/js/src/currencycom.d.ts +3 -2
  51. package/js/src/currencycom.js +15 -5
  52. package/js/src/delta.d.ts +3 -2
  53. package/js/src/delta.js +14 -1
  54. package/js/src/gate.js +1 -1
  55. package/js/src/hitbtc.d.ts +5 -3
  56. package/js/src/hitbtc.js +63 -55
  57. package/js/src/krakenfutures.d.ts +3 -2
  58. package/js/src/krakenfutures.js +22 -7
  59. package/js/src/kuna.js +14 -11
  60. package/js/src/mexc.d.ts +3 -1
  61. package/js/src/mexc.js +75 -0
  62. package/js/src/okx.d.ts +3 -2
  63. package/js/src/okx.js +31 -1
  64. package/js/src/pro/alpaca.js +1 -1
  65. package/js/src/pro/bitmex.js +24 -31
  66. package/js/src/pro/cex.js +6 -2
  67. package/js/src/pro/coinex.js +6 -3
  68. package/js/src/pro/mexc.js +2 -2
  69. package/js/src/pro/whitebit.js +15 -13
  70. package/js/src/probit.js +1 -1
  71. package/js/src/wavesexchange.js +1 -1
  72. package/js/src/woo.d.ts +3 -5
  73. package/js/src/woo.js +20 -4
  74. package/package.json +1 -1
  75. package/skip-tests.json +26 -8
package/js/src/delta.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import Exchange from './abstract/delta.js';
2
- import type { Balances, Currency, Greeks, Int, Market, MarketInterface, OHLCV, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, Position } from './base/types.js';
2
+ import type { Balances, Currency, Greeks, Int, Market, MarketInterface, OHLCV, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, Position, Leverage } from './base/types.js';
3
3
  /**
4
4
  * @class delta
5
5
  * @augments Exchange
@@ -153,7 +153,8 @@ export default class delta extends Exchange {
153
153
  };
154
154
  fetchOpenInterest(symbol: string, params?: {}): Promise<import("./base/types.js").OpenInterest>;
155
155
  parseOpenInterest(interest: any, market?: Market): import("./base/types.js").OpenInterest;
156
- fetchLeverage(symbol: string, params?: {}): Promise<any>;
156
+ fetchLeverage(symbol: string, params?: {}): Promise<Leverage>;
157
+ parseLeverage(leverage: any, market?: any): Leverage;
157
158
  setLeverage(leverage: Int, symbol?: Str, params?: {}): Promise<any>;
158
159
  fetchSettlementHistory(symbol?: Str, since?: Int, limit?: Int, params?: {}): Promise<any>;
159
160
  parseSettlement(settlement: any, market: any): {
package/js/src/delta.js CHANGED
@@ -2814,6 +2814,7 @@ export default class delta extends Exchange {
2814
2814
  const request = {
2815
2815
  'product_id': market['numericId'],
2816
2816
  };
2817
+ const response = await this.privateGetProductsProductIdOrdersLeverage(this.extend(request, params));
2817
2818
  //
2818
2819
  // {
2819
2820
  // "result": {
@@ -2827,7 +2828,19 @@ export default class delta extends Exchange {
2827
2828
  // "success": true
2828
2829
  // }
2829
2830
  //
2830
- return await this.privateGetProductsProductIdOrdersLeverage(this.extend(request, params));
2831
+ const result = this.safeDict(response, 'result', {});
2832
+ return this.parseLeverage(result, market);
2833
+ }
2834
+ parseLeverage(leverage, market = undefined) {
2835
+ const marketId = this.safeString(leverage, 'index_symbol');
2836
+ const leverageValue = this.safeInteger(leverage, 'leverage');
2837
+ return {
2838
+ 'info': leverage,
2839
+ 'symbol': this.safeSymbol(marketId, market),
2840
+ 'marginMode': this.safeStringLower(leverage, 'margin_mode'),
2841
+ 'longLeverage': leverageValue,
2842
+ 'shortLeverage': leverageValue,
2843
+ };
2831
2844
  }
2832
2845
  async setLeverage(leverage, symbol = undefined, params = {}) {
2833
2846
  /**
package/js/src/gate.js CHANGED
@@ -962,7 +962,7 @@ export default class gate extends Exchange {
962
962
  * @param {object} [params] extra parameters specific to the exchange API endpoint
963
963
  * @returns {object[]} an array of objects representing market data
964
964
  */
965
- const sandboxMode = this.safeValue(this.options, 'sandboxMode', false);
965
+ const sandboxMode = this.safeBool(this.options, 'sandboxMode', false);
966
966
  let rawPromises = [
967
967
  this.fetchContractMarkets(params),
968
968
  this.fetchOptionMarkets(params),
@@ -1,5 +1,5 @@
1
1
  import Exchange from './abstract/hitbtc.js';
2
- import type { TransferEntry, Int, OrderSide, OrderType, FundingRateHistory, OHLCV, Ticker, Order, OrderBook, Dictionary, Position, Str, Trade, Balances, Transaction, MarginMode, Tickers, Strings, Market, Currency } from './base/types.js';
2
+ import type { TransferEntry, Int, OrderSide, OrderType, FundingRateHistory, OHLCV, Ticker, Order, OrderBook, Dictionary, Position, Str, Trade, Balances, Transaction, MarginMode, Tickers, Strings, Market, Currency, MarginModes, Leverage } from './base/types.js';
3
3
  /**
4
4
  * @class hitbtc
5
5
  * @augments Exchange
@@ -69,7 +69,8 @@ export default class hitbtc extends Exchange {
69
69
  createOrderRequest(market: object, marketType: string, type: OrderType, side: OrderSide, amount: any, price?: any, marginMode?: Str, params?: {}): {}[];
70
70
  parseOrderStatus(status: any): string;
71
71
  parseOrder(order: any, market?: Market): Order;
72
- fetchMarginMode(symbol?: Str, params?: {}): Promise<MarginMode>;
72
+ fetchMarginModes(symbols?: Str[], params?: {}): Promise<MarginModes>;
73
+ parseMarginMode(marginMode: any, market?: any): MarginMode;
73
74
  transfer(code: string, amount: number, fromAccount: string, toAccount: string, params?: {}): Promise<TransferEntry>;
74
75
  parseTransfer(transfer: any, currency?: Currency): {
75
76
  id: string;
@@ -142,7 +143,8 @@ export default class hitbtc extends Exchange {
142
143
  };
143
144
  reduceMargin(symbol: string, amount: any, params?: {}): Promise<any>;
144
145
  addMargin(symbol: string, amount: any, params?: {}): Promise<any>;
145
- fetchLeverage(symbol: string, params?: {}): Promise<number>;
146
+ fetchLeverage(symbol: string, params?: {}): Promise<Leverage>;
147
+ parseLeverage(leverage: any, market?: any): Leverage;
146
148
  setLeverage(leverage: Int, symbol?: Str, params?: {}): Promise<any>;
147
149
  fetchDepositWithdrawFees(codes?: Strings, params?: {}): Promise<any>;
148
150
  parseDepositWithdrawFee(fee: any, currency?: Currency): any;
package/js/src/hitbtc.js CHANGED
@@ -66,7 +66,8 @@ export default class hitbtc extends Exchange {
66
66
  'fetchLeverage': true,
67
67
  'fetchLeverageTiers': undefined,
68
68
  'fetchLiquidations': false,
69
- 'fetchMarginMode': true,
69
+ 'fetchMarginMode': 'emulated',
70
+ 'fetchMarginModes': true,
70
71
  'fetchMarketLeverageTiers': false,
71
72
  'fetchMarkets': true,
72
73
  'fetchMarkOHLCV': true,
@@ -2510,7 +2511,7 @@ export default class hitbtc extends Exchange {
2510
2511
  'stopLossPrice': undefined,
2511
2512
  }, market);
2512
2513
  }
2513
- async fetchMarginMode(symbol = undefined, params = {}) {
2514
+ async fetchMarginModes(symbols = undefined, params = {}) {
2514
2515
  /**
2515
2516
  * @method
2516
2517
  * @name hitbtc#fetchMarginMode
@@ -2523,70 +2524,66 @@ export default class hitbtc extends Exchange {
2523
2524
  */
2524
2525
  await this.loadMarkets();
2525
2526
  let market = undefined;
2526
- if (symbol !== undefined) {
2527
- market = this.market(symbol);
2527
+ if (symbols !== undefined) {
2528
+ symbols = this.marketSymbols(symbols);
2529
+ market = this.market(symbols[0]);
2528
2530
  }
2529
2531
  let marketType = undefined;
2530
2532
  [marketType, params] = this.handleMarketTypeAndParams('fetchMarginMode', market, params);
2531
2533
  let response = undefined;
2532
2534
  if (marketType === 'margin') {
2533
2535
  response = await this.privateGetMarginConfig(params);
2536
+ //
2537
+ // {
2538
+ // "config": [{
2539
+ // "symbol": "BTCUSD",
2540
+ // "margin_call_leverage_mul": "1.50",
2541
+ // "liquidation_leverage_mul": "2.00",
2542
+ // "max_initial_leverage": "10.00",
2543
+ // "margin_mode": "Isolated",
2544
+ // "force_close_fee": "0.05",
2545
+ // "enabled": true,
2546
+ // "active": true,
2547
+ // "limit_base": "50000.00",
2548
+ // "limit_power": "2.2",
2549
+ // "unlimited_threshold": "10.0"
2550
+ // }]
2551
+ // }
2552
+ //
2534
2553
  }
2535
2554
  else if (marketType === 'swap') {
2536
2555
  response = await this.privateGetFuturesConfig(params);
2556
+ //
2557
+ // {
2558
+ // "config": [{
2559
+ // "symbol": "BTCUSD_PERP",
2560
+ // "margin_call_leverage_mul": "1.20",
2561
+ // "liquidation_leverage_mul": "2.00",
2562
+ // "max_initial_leverage": "100.00",
2563
+ // "margin_mode": "Isolated",
2564
+ // "force_close_fee": "0.001",
2565
+ // "enabled": true,
2566
+ // "active": false,
2567
+ // "limit_base": "5000000.000000000000",
2568
+ // "limit_power": "1.25",
2569
+ // "unlimited_threshold": "2.00"
2570
+ // }]
2571
+ // }
2572
+ //
2537
2573
  }
2538
2574
  else {
2539
- throw new BadSymbol(this.id + ' fetchMarginMode() supports swap contracts and margin only');
2575
+ throw new BadSymbol(this.id + ' fetchMarginModes () supports swap contracts and margin only');
2540
2576
  }
2541
- //
2542
- // margin
2543
- // {
2544
- // "config": [{
2545
- // "symbol": "BTCUSD",
2546
- // "margin_call_leverage_mul": "1.50",
2547
- // "liquidation_leverage_mul": "2.00",
2548
- // "max_initial_leverage": "10.00",
2549
- // "margin_mode": "Isolated",
2550
- // "force_close_fee": "0.05",
2551
- // "enabled": true,
2552
- // "active": true,
2553
- // "limit_base": "50000.00",
2554
- // "limit_power": "2.2",
2555
- // "unlimited_threshold": "10.0"
2556
- // }]
2557
- // }
2558
- //
2559
- // swap
2560
- // {
2561
- // "config": [{
2562
- // "symbol": "BTCUSD_PERP",
2563
- // "margin_call_leverage_mul": "1.20",
2564
- // "liquidation_leverage_mul": "2.00",
2565
- // "max_initial_leverage": "100.00",
2566
- // "margin_mode": "Isolated",
2567
- // "force_close_fee": "0.001",
2568
- // "enabled": true,
2569
- // "active": false,
2570
- // "limit_base": "5000000.000000000000",
2571
- // "limit_power": "1.25",
2572
- // "unlimited_threshold": "2.00"
2573
- // }]
2574
- // }
2575
- //
2576
- const config = this.safeValue(response, 'config', []);
2577
- const marginModes = [];
2578
- for (let i = 0; i < config.length; i++) {
2579
- const data = this.safeValue(config, i);
2580
- const marketId = this.safeString(data, 'symbol');
2581
- const marketInner = this.safeMarket(marketId);
2582
- marginModes.push({
2583
- 'info': data,
2584
- 'symbol': this.safeString(marketInner, 'symbol'),
2585
- 'marginMode': this.safeStringLower(data, 'margin_mode'),
2586
- });
2587
- }
2588
- const filteredMargin = this.filterBySymbol(marginModes, symbol);
2589
- return this.safeValue(filteredMargin, 0);
2577
+ const config = this.safeList(response, 'config', []);
2578
+ return this.parseMarginModes(config, symbols, 'symbol');
2579
+ }
2580
+ parseMarginMode(marginMode, market = undefined) {
2581
+ const marketId = this.safeString(marginMode, 'symbol');
2582
+ return {
2583
+ 'info': marginMode,
2584
+ 'symbol': this.safeSymbol(marketId, market),
2585
+ 'marginMode': this.safeStringLower(marginMode, 'margin_mode'),
2586
+ };
2590
2587
  }
2591
2588
  async transfer(code, amount, fromAccount, toAccount, params = {}) {
2592
2589
  /**
@@ -3405,7 +3402,18 @@ export default class hitbtc extends Exchange {
3405
3402
  // ]
3406
3403
  // }
3407
3404
  //
3408
- return this.safeNumber(response, 'leverage');
3405
+ return this.parseLeverage(response, market);
3406
+ }
3407
+ parseLeverage(leverage, market = undefined) {
3408
+ const marketId = this.safeString(leverage, 'symbol');
3409
+ const leverageValue = this.safeInteger(leverage, 'leverage');
3410
+ return {
3411
+ 'info': leverage,
3412
+ 'symbol': this.safeSymbol(marketId, market),
3413
+ 'marginMode': this.safeStringLower(leverage, 'type'),
3414
+ 'longLeverage': leverageValue,
3415
+ 'shortLeverage': leverageValue,
3416
+ };
3409
3417
  }
3410
3418
  async setLeverage(leverage, symbol = undefined, params = {}) {
3411
3419
  /**
@@ -1,5 +1,5 @@
1
1
  import Exchange from './abstract/krakenfutures.js';
2
- import type { TransferEntry, Int, OrderSide, OrderType, OHLCV, Trade, FundingRateHistory, OrderRequest, Order, Balances, Str, Ticker, OrderBook, Tickers, Strings, Market, Currency } from './base/types.js';
2
+ import type { TransferEntry, Int, OrderSide, OrderType, OHLCV, Trade, FundingRateHistory, OrderRequest, Order, Balances, Str, Ticker, OrderBook, Tickers, Strings, Market, Currency, Leverage } from './base/types.js';
3
3
  /**
4
4
  * @class krakenfutures
5
5
  * @augments Exchange
@@ -94,7 +94,8 @@ export default class krakenfutures extends Exchange {
94
94
  transferOut(code: string, amount: any, params?: {}): Promise<TransferEntry>;
95
95
  transfer(code: string, amount: number, fromAccount: string, toAccount: string, params?: {}): Promise<TransferEntry>;
96
96
  setLeverage(leverage: Int, symbol?: Str, params?: {}): Promise<any>;
97
- fetchLeverage(symbol?: Str, params?: {}): Promise<any>;
97
+ fetchLeverage(symbol: string, params?: {}): Promise<Leverage>;
98
+ parseLeverage(leverage: any, market?: any): Leverage;
98
99
  handleErrors(code: any, reason: any, url: any, method: any, headers: any, body: any, response: any, requestHeaders: any, requestBody: any): any;
99
100
  sign(path: any, api?: string, method?: string, params?: {}, headers?: any, body?: any): {
100
101
  url: string;
@@ -2459,7 +2459,7 @@ export default class krakenfutures extends Exchange {
2459
2459
  //
2460
2460
  return await this.privatePutLeveragepreferences(this.extend(request, params));
2461
2461
  }
2462
- async fetchLeverage(symbol = undefined, params = {}) {
2462
+ async fetchLeverage(symbol, params = {}) {
2463
2463
  /**
2464
2464
  * @method
2465
2465
  * @name krakenfutures#fetchLeverage
@@ -2473,17 +2473,32 @@ export default class krakenfutures extends Exchange {
2473
2473
  throw new ArgumentsRequired(this.id + ' fetchLeverage() requires a symbol argument');
2474
2474
  }
2475
2475
  await this.loadMarkets();
2476
+ const market = this.market(symbol);
2476
2477
  const request = {
2477
2478
  'symbol': this.marketId(symbol).toUpperCase(),
2478
2479
  };
2480
+ const response = await this.privateGetLeveragepreferences(this.extend(request, params));
2479
2481
  //
2480
- // {
2481
- // "result": "success",
2482
- // "serverTime": "2023-08-01T09:54:08.900Z",
2483
- // "leveragePreferences": [ { symbol: "PF_LTCUSD", maxLeverage: "5.00" } ]
2484
- // }
2482
+ // {
2483
+ // "result": "success",
2484
+ // "serverTime": "2023-08-01T09:54:08.900Z",
2485
+ // "leveragePreferences": [ { symbol: "PF_LTCUSD", maxLeverage: "5.00" } ]
2486
+ // }
2485
2487
  //
2486
- return await this.privateGetLeveragepreferences(this.extend(request, params));
2488
+ const leveragePreferences = this.safeList(response, 'leveragePreferences', []);
2489
+ const data = this.safeDict(leveragePreferences, 0, {});
2490
+ return this.parseLeverage(data, market);
2491
+ }
2492
+ parseLeverage(leverage, market = undefined) {
2493
+ const marketId = this.safeString(leverage, 'symbol');
2494
+ const leverageValue = this.safeInteger(leverage, 'maxLeverage');
2495
+ return {
2496
+ 'info': leverage,
2497
+ 'symbol': this.safeSymbol(marketId, market),
2498
+ 'marginMode': undefined,
2499
+ 'longLeverage': leverageValue,
2500
+ 'shortLeverage': leverageValue,
2501
+ };
2487
2502
  }
2488
2503
  handleErrors(code, reason, url, method, headers, body, response, requestHeaders, requestBody) {
2489
2504
  if (response === undefined) {
package/js/src/kuna.js CHANGED
@@ -809,7 +809,7 @@ export default class kuna extends Exchange {
809
809
  await this.loadMarkets();
810
810
  const market = this.market(symbol);
811
811
  const request = {
812
- 'pair': market['id'],
812
+ 'pairs': market['id'],
813
813
  };
814
814
  if (limit !== undefined) {
815
815
  request['limit'] = limit;
@@ -817,18 +817,21 @@ export default class kuna extends Exchange {
817
817
  const response = await this.v4PublicGetTradePublicBookPairs(this.extend(request, params));
818
818
  //
819
819
  // {
820
- // "data": {
821
- // "id": "3e5591ba-2778-4d85-8851-54284045ea44", // Unique identifier of a trade
822
- // "pair": "BTC_USDT", // Market pair that is being traded
823
- // "quoteQuantity": "11528.8118", // Qty of the quote asset, USDT in this example
824
- // "matchPrice": "18649", // Exchange price at the moment of execution
825
- // "matchQuantity": "0.6182", // Qty of the base asset, BTC in this example
826
- // "createdAt": "2022-09-23T14:30:41.486Z", // Date-time of trade execution, UTC
827
- // "side": "Ask" // Trade type: `Ask` or `Bid`. Bid for buying base asset, Ask for selling base asset (e.g. for BTC_USDT trading pair, BTC is the base asset).
828
- // }
820
+ // 'data': [
821
+ // {
822
+ // 'createdAt': '2024-03-02T00:10:49.385Z',
823
+ // 'id': '3b42878a-3688-4bc1-891e-5cc2fc902142',
824
+ // 'matchPrice': '62181.31',
825
+ // 'matchQuantity': '0.00568',
826
+ // 'pair': 'BTC_USDT',
827
+ // 'quoteQuantity': '353.1898408',
828
+ // 'side': 'Bid'
829
+ // },
830
+ // ...
831
+ // ]
829
832
  // }
830
833
  //
831
- const data = this.safeValue(response, 'data', {});
834
+ const data = this.safeList(response, 'data', []);
832
835
  return this.parseTrades(data, market, since, limit);
833
836
  }
834
837
  parseTrade(trade, market = undefined) {
package/js/src/mexc.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import Exchange from './abstract/mexc.js';
2
- import type { TransferEntry, IndexType, Int, OrderSide, Balances, OrderType, OHLCV, FundingRateHistory, Position, OrderBook, OrderRequest, FundingHistory, Order, Str, Trade, Transaction, Ticker, Tickers, Strings, Market, Currency } from './base/types.js';
2
+ import type { TransferEntry, IndexType, Int, OrderSide, Balances, OrderType, OHLCV, FundingRateHistory, Position, OrderBook, OrderRequest, FundingHistory, Order, Str, Trade, Transaction, Ticker, Tickers, Strings, Market, Currency, Leverage } from './base/types.js';
3
3
  /**
4
4
  * @class mexc
5
5
  * @augments Exchange
@@ -172,6 +172,8 @@ export default class mexc extends Exchange {
172
172
  parseTransactionFee(transaction: any, currency?: Currency): {};
173
173
  fetchDepositWithdrawFees(codes?: Strings, params?: {}): Promise<any>;
174
174
  parseDepositWithdrawFee(fee: any, currency?: Currency): any;
175
+ fetchLeverage(symbol: string, params?: {}): Promise<Leverage>;
176
+ parseLeverage(leverage: any, market?: any): Leverage;
175
177
  handleMarginModeAndParams(methodName: any, params?: {}, defaultValue?: any): any[];
176
178
  sign(path: any, api?: string, method?: string, params?: {}, headers?: any, body?: any): {
177
179
  url: any;
package/js/src/mexc.js CHANGED
@@ -74,6 +74,8 @@ export default class mexc extends Exchange {
74
74
  'fetchL2OrderBook': true,
75
75
  'fetchLedger': undefined,
76
76
  'fetchLedgerEntry': undefined,
77
+ 'fetchLeverage': true,
78
+ 'fetchLeverages': false,
77
79
  'fetchLeverageTiers': true,
78
80
  'fetchMarginMode': false,
79
81
  'fetchMarketLeverageTiers': undefined,
@@ -5377,6 +5379,79 @@ export default class mexc extends Exchange {
5377
5379
  }
5378
5380
  return this.assignDefaultDepositWithdrawFees(result);
5379
5381
  }
5382
+ async fetchLeverage(symbol, params = {}) {
5383
+ /**
5384
+ * @method
5385
+ * @name mexc#fetchLeverage
5386
+ * @description fetch the set leverage for a market
5387
+ * @see https://mexcdevelop.github.io/apidocs/contract_v1_en/#get-leverage
5388
+ * @param {string} symbol unified market symbol
5389
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
5390
+ * @returns {object} a [leverage structure]{@link https://docs.ccxt.com/#/?id=leverage-structure}
5391
+ */
5392
+ await this.loadMarkets();
5393
+ const market = this.market(symbol);
5394
+ const request = {
5395
+ 'symbol': market['id'],
5396
+ };
5397
+ const response = await this.contractPrivateGetPositionLeverage(this.extend(request, params));
5398
+ //
5399
+ // {
5400
+ // "success": true,
5401
+ // "code": 0,
5402
+ // "data": [
5403
+ // {
5404
+ // "level": 1,
5405
+ // "maxVol": 463300,
5406
+ // "mmr": 0.004,
5407
+ // "imr": 0.005,
5408
+ // "positionType": 1,
5409
+ // "openType": 1,
5410
+ // "leverage": 20,
5411
+ // "limitBySys": false,
5412
+ // "currentMmr": 0.004
5413
+ // },
5414
+ // {
5415
+ // "level": 1,
5416
+ // "maxVol": 463300,
5417
+ // "mmr": 0.004,
5418
+ // "imr": 0.005,
5419
+ // "positionType": 2,
5420
+ // "openType": 1,
5421
+ // "leverage": 20,
5422
+ // "limitBySys": false,
5423
+ // "currentMmr": 0.004
5424
+ // }
5425
+ // ]
5426
+ // }
5427
+ //
5428
+ const data = this.safeList(response, 'data', []);
5429
+ return this.parseLeverage(data, market);
5430
+ }
5431
+ parseLeverage(leverage, market = undefined) {
5432
+ let marginMode = undefined;
5433
+ let longLeverage = undefined;
5434
+ let shortLeverage = undefined;
5435
+ for (let i = 0; i < leverage.length; i++) {
5436
+ const entry = leverage[i];
5437
+ const openType = this.safeInteger(entry, 'openType');
5438
+ const positionType = this.safeInteger(entry, 'positionType');
5439
+ if (positionType === 1) {
5440
+ longLeverage = this.safeInteger(entry, 'leverage');
5441
+ }
5442
+ else if (positionType === 2) {
5443
+ shortLeverage = this.safeInteger(entry, 'leverage');
5444
+ }
5445
+ marginMode = (openType === 1) ? 'isolated' : 'cross';
5446
+ }
5447
+ return {
5448
+ 'info': leverage,
5449
+ 'symbol': market['symbol'],
5450
+ 'marginMode': marginMode,
5451
+ 'longLeverage': longLeverage,
5452
+ 'shortLeverage': shortLeverage,
5453
+ };
5454
+ }
5380
5455
  handleMarginModeAndParams(methodName, params = {}, defaultValue = undefined) {
5381
5456
  /**
5382
5457
  * @ignore
package/js/src/okx.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import Exchange from './abstract/okx.js';
2
- import type { TransferEntry, Int, OrderSide, OrderType, Trade, OHLCV, Order, FundingRateHistory, OrderRequest, FundingHistory, Str, Transaction, Ticker, OrderBook, Balances, Tickers, Market, Greeks, Strings, MarketInterface, Currency } from './base/types.js';
2
+ import type { TransferEntry, Int, OrderSide, OrderType, Trade, OHLCV, Order, FundingRateHistory, OrderRequest, FundingHistory, Str, Transaction, Ticker, OrderBook, Balances, Tickers, Market, Greeks, Strings, MarketInterface, Currency, Leverage } from './base/types.js';
3
3
  /**
4
4
  * @class okx
5
5
  * @augments Exchange
@@ -104,7 +104,8 @@ export default class okx extends Exchange {
104
104
  fetchWithdrawal(id: string, code?: Str, params?: {}): Promise<Transaction>;
105
105
  parseTransactionStatus(status: any): string;
106
106
  parseTransaction(transaction: any, currency?: Currency): Transaction;
107
- fetchLeverage(symbol: string, params?: {}): Promise<any>;
107
+ fetchLeverage(symbol: string, params?: {}): Promise<Leverage>;
108
+ parseLeverage(leverage: any, market?: any): Leverage;
108
109
  fetchPosition(symbol: string, params?: {}): Promise<import("./base/types.js").Position>;
109
110
  fetchPositions(symbols?: Strings, params?: {}): Promise<import("./base/types.js").Position[]>;
110
111
  fetchPositionsForSymbol(symbol: string, params?: {}): Promise<import("./base/types.js").Position[]>;
package/js/src/okx.js CHANGED
@@ -5164,7 +5164,37 @@ export default class okx extends Exchange {
5164
5164
  // "msg": ""
5165
5165
  // }
5166
5166
  //
5167
- return response;
5167
+ const data = this.safeList(response, 'data', []);
5168
+ return this.parseLeverage(data, market);
5169
+ }
5170
+ parseLeverage(leverage, market = undefined) {
5171
+ let marketId = undefined;
5172
+ let marginMode = undefined;
5173
+ let longLeverage = undefined;
5174
+ let shortLeverage = undefined;
5175
+ for (let i = 0; i < leverage.length; i++) {
5176
+ const entry = leverage[i];
5177
+ marginMode = this.safeStringLower(entry, 'mgnMode');
5178
+ marketId = this.safeString(entry, 'instId');
5179
+ const positionSide = this.safeStringLower(entry, 'posSide');
5180
+ if (positionSide === 'long') {
5181
+ longLeverage = this.safeInteger(entry, 'lever');
5182
+ }
5183
+ else if (positionSide === 'short') {
5184
+ shortLeverage = this.safeInteger(entry, 'lever');
5185
+ }
5186
+ else {
5187
+ longLeverage = this.safeInteger(entry, 'lever');
5188
+ shortLeverage = this.safeInteger(entry, 'lever');
5189
+ }
5190
+ }
5191
+ return {
5192
+ 'info': leverage,
5193
+ 'symbol': this.safeSymbol(marketId, market),
5194
+ 'marginMode': marginMode,
5195
+ 'longLeverage': longLeverage,
5196
+ 'shortLeverage': shortLeverage,
5197
+ };
5168
5198
  }
5169
5199
  async fetchPosition(symbol, params = {}) {
5170
5200
  /**
@@ -613,7 +613,7 @@ export default class alpaca extends alpacaRest {
613
613
  for (let i = 0; i < message.length; i++) {
614
614
  const data = message[i];
615
615
  const T = this.safeString(data, 'T');
616
- const msg = this.safeValue(data, 'msg', {});
616
+ const msg = this.safeString(data, 'msg');
617
617
  if (T === 'subscription') {
618
618
  this.handleSubscription(client, data);
619
619
  return;
@@ -63,17 +63,9 @@ export default class bitmex extends bitmexRest {
63
63
  * @returns {object} a [ticker structure]{@link https://docs.ccxt.com/#/?id=ticker-structure}
64
64
  */
65
65
  await this.loadMarkets();
66
- const market = this.market(symbol);
67
- const name = 'instrument';
68
- const messageHash = name + ':' + market['id'];
69
- const url = this.urls['api']['ws'];
70
- const request = {
71
- 'op': 'subscribe',
72
- 'args': [
73
- messageHash,
74
- ],
75
- };
76
- return await this.watch(url, messageHash, this.extend(request, params), messageHash);
66
+ symbol = this.symbol(symbol);
67
+ const tickers = await this.watchTickers([symbol], params);
68
+ return tickers[symbol];
77
69
  }
78
70
  async watchTickers(symbols = undefined, params = {}) {
79
71
  /**
@@ -89,26 +81,27 @@ export default class bitmex extends bitmexRest {
89
81
  const name = 'instrument';
90
82
  const url = this.urls['api']['ws'];
91
83
  const messageHashes = [];
84
+ const rawSubscriptions = [];
92
85
  if (symbols !== undefined) {
93
86
  for (let i = 0; i < symbols.length; i++) {
94
87
  const symbol = symbols[i];
95
88
  const market = this.market(symbol);
96
- const hash = name + ':' + market['id'];
97
- messageHashes.push(hash);
89
+ const subscription = name + ':' + market['id'];
90
+ rawSubscriptions.push(subscription);
91
+ const messageHash = 'ticker:' + symbol;
92
+ messageHashes.push(messageHash);
98
93
  }
99
94
  }
100
95
  else {
101
- messageHashes.push(name);
96
+ rawSubscriptions.push(name);
97
+ messageHashes.push('alltickers');
102
98
  }
103
99
  const request = {
104
100
  'op': 'subscribe',
105
- 'args': messageHashes,
101
+ 'args': rawSubscriptions,
106
102
  };
107
- const ticker = await this.watchMultiple(url, messageHashes, this.extend(request, params), messageHashes);
103
+ const ticker = await this.watchMultiple(url, messageHashes, this.extend(request, params), rawSubscriptions);
108
104
  if (this.newUpdates) {
109
- if (symbols === undefined) {
110
- return ticker;
111
- }
112
105
  const result = {};
113
106
  result[ticker['symbol']] = ticker;
114
107
  return result;
@@ -342,23 +335,23 @@ export default class bitmex extends bitmexRest {
342
335
  // ]
343
336
  // }
344
337
  //
345
- const table = this.safeString(message, 'table');
346
338
  const data = this.safeList(message, 'data', []);
347
339
  const tickers = {};
348
340
  for (let i = 0; i < data.length; i++) {
349
341
  const update = data[i];
350
342
  const marketId = this.safeString(update, 'symbol');
351
- const market = this.safeMarket(marketId);
352
- const symbol = market['symbol'];
353
- const messageHash = table + ':' + marketId;
354
- const ticker = this.safeDict(this.tickers, symbol, {});
355
- const info = this.safeDict(ticker, 'info', {});
356
- const parsedTicker = this.parseTicker(this.extend(info, update), market);
357
- tickers[symbol] = parsedTicker;
358
- this.tickers[symbol] = parsedTicker;
359
- client.resolve(ticker, messageHash);
343
+ const symbol = this.safeSymbol(marketId);
344
+ if (!(symbol in this.tickers)) {
345
+ this.tickers[symbol] = this.parseTicker({});
346
+ }
347
+ const updatedTicker = this.parseTicker(update);
348
+ const fullParsedTicker = this.deepExtend(this.tickers[symbol], updatedTicker);
349
+ tickers[symbol] = fullParsedTicker;
350
+ this.tickers[symbol] = fullParsedTicker;
351
+ const messageHash = 'ticker:' + symbol;
352
+ client.resolve(fullParsedTicker, messageHash);
353
+ client.resolve(fullParsedTicker, 'alltickers');
360
354
  }
361
- client.resolve(tickers, 'instrument');
362
355
  return message;
363
356
  }
364
357
  async watchBalance(params = {}) {
@@ -1338,7 +1331,7 @@ export default class bitmex extends bitmexRest {
1338
1331
  const messageHash = table + ':' + market['id'];
1339
1332
  const result = [
1340
1333
  this.parse8601(this.safeString(candle, 'timestamp')) - duration * 1000,
1341
- this.safeFloat(candle, 'open'),
1334
+ undefined,
1342
1335
  this.safeFloat(candle, 'high'),
1343
1336
  this.safeFloat(candle, 'low'),
1344
1337
  this.safeFloat(candle, 'close'),