ccxt 4.2.56 → 4.2.57

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.
@@ -387,14 +387,17 @@ class coinex extends coinex$1 {
387
387
  const keys = Object.keys(this.ohlcvs);
388
388
  const keysLength = keys.length;
389
389
  if (keysLength === 0) {
390
+ this.ohlcvs['unknown'] = {};
390
391
  const limit = this.safeInteger(this.options, 'OHLCVLimit', 1000);
391
- this.ohlcvs = new Cache.ArrayCacheByTimestamp(limit);
392
+ const stored = new Cache.ArrayCacheByTimestamp(limit);
393
+ this.ohlcvs['unknown']['unknown'] = stored;
392
394
  }
395
+ const ohlcv = this.ohlcvs['unknown']['unknown'];
393
396
  for (let i = 0; i < ohlcvs.length; i++) {
394
397
  const candle = ohlcvs[i];
395
- this.ohlcvs.append(candle);
398
+ ohlcv.append(candle);
396
399
  }
397
- client.resolve(this.ohlcvs, messageHash);
400
+ client.resolve(ohlcv, messageHash);
398
401
  }
399
402
  async watchTicker(symbol, params = {}) {
400
403
  /**
@@ -244,7 +244,7 @@ class mexc extends mexc$1 {
244
244
  // "d": {
245
245
  // "e": "spot@public.kline.v3.api",
246
246
  // "k": {
247
- // "t": 1678642260,
247
+ // "t": 1678642261,
248
248
  // "o": 20626.94,
249
249
  // "c": 20599.69,
250
250
  // "h": 20626.94,
@@ -457,7 +457,7 @@ class mexc extends mexc$1 {
457
457
  client.subscriptions[messageHash] = 1;
458
458
  this.orderbooks[symbol] = this.countedOrderBook({});
459
459
  }
460
- const storedOrderBook = this.safeValue(this.orderbooks, symbol);
460
+ const storedOrderBook = this.orderbooks[symbol];
461
461
  const nonce = this.safeInteger(storedOrderBook, 'nonce');
462
462
  if (nonce === undefined) {
463
463
  const cacheLength = storedOrderBook.cache.length;
@@ -114,15 +114,19 @@ class whitebit extends whitebit$1 {
114
114
  const symbol = market['symbol'];
115
115
  const messageHash = 'candles' + ':' + symbol;
116
116
  const parsed = this.parseOHLCV(data, market);
117
- this.ohlcvs[symbol] = this.safeValue(this.ohlcvs, symbol);
118
- let stored = this.ohlcvs[symbol];
119
- if (stored === undefined) {
117
+ // this.ohlcvs[symbol] = this.safeValue (this.ohlcvs, symbol);
118
+ if (!(symbol in this.ohlcvs)) {
119
+ this.ohlcvs[symbol] = {};
120
+ }
121
+ // let stored = this.ohlcvs[symbol]['unknown']; // we don't know the timeframe but we need to respect the type
122
+ if (!('unknown' in this.ohlcvs[symbol])) {
120
123
  const limit = this.safeInteger(this.options, 'OHLCVLimit', 1000);
121
- stored = new Cache.ArrayCacheByTimestamp(limit);
122
- this.ohlcvs[symbol] = stored;
124
+ const stored = new Cache.ArrayCacheByTimestamp(limit);
125
+ this.ohlcvs[symbol]['unknown'] = stored;
123
126
  }
124
- stored.append(parsed);
125
- client.resolve(stored, messageHash);
127
+ const ohlcv = this.ohlcvs[symbol]['unknown'];
128
+ ohlcv.append(parsed);
129
+ client.resolve(ohlcv, messageHash);
126
130
  }
127
131
  return message;
128
132
  }
package/js/ccxt.d.ts CHANGED
@@ -4,7 +4,7 @@ import * as functions from './src/base/functions.js';
4
4
  import * as errors from './src/base/errors.js';
5
5
  import type { Market, Trade, Fee, Ticker, OrderBook, Order, Transaction, Tickers, Currency, Balance, DepositAddress, WithdrawalResponse, DepositAddressResponse, OHLCV, Balances, PartialBalances, Dictionary, MinMax, Position, FundingRateHistory, Liquidation, FundingHistory, MarginMode, Greeks } from './src/base/types.js';
6
6
  import { BaseError, ExchangeError, PermissionDenied, AccountNotEnabled, AccountSuspended, ArgumentsRequired, BadRequest, BadSymbol, MarginModeAlreadySet, BadResponse, NullResponse, InsufficientFunds, InvalidAddress, InvalidOrder, OrderNotFound, OrderNotCached, CancelPending, OrderImmediatelyFillable, OrderNotFillable, DuplicateOrderId, NotSupported, NetworkError, DDoSProtection, RateLimitExceeded, ExchangeNotAvailable, OnMaintenance, InvalidNonce, RequestTimeout, AuthenticationError, AddressPending, NoChange } from './src/base/errors.js';
7
- declare const version = "4.2.55";
7
+ declare const version = "4.2.56";
8
8
  import ace from './src/ace.js';
9
9
  import alpaca from './src/alpaca.js';
10
10
  import ascendex from './src/ascendex.js';
package/js/ccxt.js CHANGED
@@ -38,7 +38,7 @@ import * as errors from './src/base/errors.js';
38
38
  import { BaseError, ExchangeError, PermissionDenied, AccountNotEnabled, AccountSuspended, ArgumentsRequired, BadRequest, BadSymbol, MarginModeAlreadySet, BadResponse, NullResponse, InsufficientFunds, InvalidAddress, InvalidOrder, OrderNotFound, OrderNotCached, CancelPending, OrderImmediatelyFillable, OrderNotFillable, DuplicateOrderId, NotSupported, NetworkError, DDoSProtection, RateLimitExceeded, ExchangeNotAvailable, OnMaintenance, InvalidNonce, RequestTimeout, AuthenticationError, AddressPending, NoChange } from './src/base/errors.js';
39
39
  //-----------------------------------------------------------------------------
40
40
  // this is updated by vss.js when building
41
- const version = '4.2.56';
41
+ const version = '4.2.57';
42
42
  Exchange.ccxtVersion = version;
43
43
  //-----------------------------------------------------------------------------
44
44
  import ace from './src/ace.js';
@@ -3,9 +3,9 @@ import { // eslint-disable-line object-curly-newline
3
3
  ExchangeError, AuthenticationError, DDoSProtection, RequestTimeout, ExchangeNotAvailable, RateLimitExceeded } from "./errors.js";
4
4
  import WsClient from './ws/WsClient.js';
5
5
  import { OrderBook as WsOrderBook, IndexedOrderBook, CountedOrderBook } from './ws/OrderBook.js';
6
- import type { Market, Trade, Ticker, OHLCV, OHLCVC, Order, OrderBook, Balance, Balances, Dictionary, Transaction, DepositAddressResponse, Currency, MinMax, IndexType, Int, OrderType, OrderSide, Position, FundingRate, DepositWithdrawFeeNetwork, LedgerEntry, BorrowInterest, OpenInterest, LeverageTier, TransferEntry, FundingRateHistory, Liquidation, FundingHistory, OrderRequest, MarginMode, Tickers, Greeks, Str, Num, MarketInterface, CurrencyInterface, Account } from './types.js';
6
+ import type { Market, Trade, Ticker, OHLCV, OHLCVC, Order, OrderBook, Balance, Balances, Dictionary, Transaction, DepositAddressResponse, Currency, MinMax, IndexType, Int, OrderType, OrderSide, Position, FundingRate, DepositWithdrawFeeNetwork, LedgerEntry, BorrowInterest, OpenInterest, LeverageTier, TransferEntry, FundingRateHistory, Liquidation, FundingHistory, OrderRequest, MarginMode, Tickers, Greeks, Str, Num, MarketInterface, CurrencyInterface, Account, MarginModes, MarketType } from './types.js';
7
7
  export type { Market, Trade, Fee, Ticker, OHLCV, OHLCVC, Order, OrderBook, Balance, Balances, Dictionary, Transaction, DepositAddressResponse, Currency, MinMax, IndexType, Int, OrderType, OrderSide, Position, FundingRateHistory, Liquidation, FundingHistory, Greeks } from './types.js';
8
- import { ArrayCache } from './ws/Cache.js';
8
+ import { ArrayCache, ArrayCacheByTimestamp } from './ws/Cache.js';
9
9
  import { OrderBook as Ob } from './ws/OrderBook.js';
10
10
  /**
11
11
  * @class Exchange
@@ -82,7 +82,7 @@ export default class Exchange {
82
82
  triggerOrders: ArrayCache;
83
83
  trades: Dictionary<ArrayCache>;
84
84
  transactions: {};
85
- ohlcvs: any;
85
+ ohlcvs: Dictionary<Dictionary<ArrayCacheByTimestamp>>;
86
86
  myTrades: ArrayCache;
87
87
  positions: any;
88
88
  urls: {
@@ -375,9 +375,11 @@ export default class Exchange {
375
375
  fetchLedger: any;
376
376
  fetchLedgerEntry: any;
377
377
  fetchLeverage: any;
378
+ fetchLeverages: any;
378
379
  fetchLeverageTiers: any;
379
380
  fetchLiquidations: any;
380
381
  fetchMarginMode: any;
382
+ fetchMarginModes: any;
381
383
  fetchMarketLeverageTiers: any;
382
384
  fetchMarkets: boolean;
383
385
  fetchMarketsWs: any;
@@ -649,7 +651,8 @@ export default class Exchange {
649
651
  watchOrderBookForSymbols(symbols: string[], limit?: Int, params?: {}): Promise<OrderBook>;
650
652
  fetchDepositAddresses(codes?: string[], params?: {}): Promise<{}>;
651
653
  fetchOrderBook(symbol: string, limit?: Int, params?: {}): Promise<OrderBook>;
652
- fetchMarginMode(symbol?: string, params?: {}): Promise<MarginMode>;
654
+ fetchMarginMode(symbol: string, params?: {}): Promise<MarginMode>;
655
+ fetchMarginModes(symbols?: string[], params?: {}): Promise<MarginModes>;
653
656
  fetchRestOrderBookSafe(symbol: any, limit?: any, params?: {}): Promise<OrderBook>;
654
657
  watchOrderBook(symbol: string, limit?: Int, params?: {}): Promise<OrderBook>;
655
658
  fetchTime(params?: {}): Promise<Int>;
@@ -681,6 +684,7 @@ export default class Exchange {
681
684
  createDepositAddress(code: string, params?: {}): Promise<DepositAddressResponse>;
682
685
  setLeverage(leverage: Int, symbol?: string, params?: {}): Promise<{}>;
683
686
  fetchLeverage(symbol: string, params?: {}): Promise<{}>;
687
+ fetchLeverages(symbols?: string[], params?: {}): Promise<{}>;
684
688
  setPositionMode(hedged: boolean, symbol?: Str, params?: {}): Promise<{}>;
685
689
  addMargin(symbol: string, amount: number, params?: {}): Promise<{}>;
686
690
  reduceMargin(symbol: string, amount: number, params?: {}): Promise<{}>;
@@ -988,5 +992,7 @@ export default class Exchange {
988
992
  parseLiquidation(liquidation: any, market?: Market): Liquidation;
989
993
  parseLiquidations(liquidations: any, market?: any, since?: Int, limit?: Int): Liquidation[];
990
994
  parseGreeks(greeks: any, market?: Market): Greeks;
995
+ parseMarginModes(response: object[], symbols?: string[], symbolKey?: string, marketType?: MarketType): MarginModes;
996
+ parseMarginMode(marginMode: any, market?: Market): MarginMode;
991
997
  }
992
998
  export { Exchange, };
@@ -430,9 +430,11 @@ export default class Exchange {
430
430
  'fetchLedger': undefined,
431
431
  'fetchLedgerEntry': undefined,
432
432
  'fetchLeverage': undefined,
433
+ 'fetchLeverages': undefined,
433
434
  'fetchLeverageTiers': undefined,
434
435
  'fetchLiquidations': undefined,
435
436
  'fetchMarginMode': undefined,
437
+ 'fetchMarginModes': undefined,
436
438
  'fetchMarketLeverageTiers': undefined,
437
439
  'fetchMarkets': true,
438
440
  'fetchMarketsWs': undefined,
@@ -1863,8 +1865,17 @@ export default class Exchange {
1863
1865
  async fetchOrderBook(symbol, limit = undefined, params = {}) {
1864
1866
  throw new NotSupported(this.id + ' fetchOrderBook() is not supported yet');
1865
1867
  }
1866
- async fetchMarginMode(symbol = undefined, params = {}) {
1867
- throw new NotSupported(this.id + ' fetchMarginMode() is not supported yet');
1868
+ async fetchMarginMode(symbol, params = {}) {
1869
+ if (this.has['fetchMarginModes']) {
1870
+ const marginModes = await this.fetchMarginModes([symbol], params);
1871
+ return this.safeDict(marginModes, symbol);
1872
+ }
1873
+ else {
1874
+ throw new NotSupported(this.id + ' fetchMarginMode() is not supported yet');
1875
+ }
1876
+ }
1877
+ async fetchMarginModes(symbols = undefined, params = {}) {
1878
+ throw new NotSupported(this.id + ' fetchMarginModes () is not supported yet');
1868
1879
  }
1869
1880
  async fetchRestOrderBookSafe(symbol, limit = undefined, params = {}) {
1870
1881
  const fetchSnapshotMaxRetries = this.handleOption('watchOrderBook', 'maxRetries', 3);
@@ -1975,6 +1986,9 @@ export default class Exchange {
1975
1986
  async fetchLeverage(symbol, params = {}) {
1976
1987
  throw new NotSupported(this.id + ' fetchLeverage() is not supported yet');
1977
1988
  }
1989
+ async fetchLeverages(symbols = undefined, params = {}) {
1990
+ throw new NotSupported(this.id + ' fetchLeverages() is not supported yet');
1991
+ }
1978
1992
  async setPositionMode(hedged, symbol = undefined, params = {}) {
1979
1993
  throw new NotSupported(this.id + ' setPositionMode() is not supported yet');
1980
1994
  }
@@ -5554,5 +5568,20 @@ export default class Exchange {
5554
5568
  parseGreeks(greeks, market = undefined) {
5555
5569
  throw new NotSupported(this.id + ' parseGreeks () is not supported yet');
5556
5570
  }
5571
+ parseMarginModes(response, symbols = undefined, symbolKey = undefined, marketType = undefined) {
5572
+ const marginModeStructures = {};
5573
+ for (let i = 0; i < response.length; i++) {
5574
+ const info = response[i];
5575
+ const marketId = this.safeString(info, symbolKey);
5576
+ const market = this.safeMarket(marketId, undefined, undefined, marketType);
5577
+ if ((symbols === undefined) || this.inArray(market['symbol'], symbols)) {
5578
+ marginModeStructures[market['symbol']] = this.parseMarginMode(info, market);
5579
+ }
5580
+ }
5581
+ return marginModeStructures;
5582
+ }
5583
+ parseMarginMode(marginMode, market = undefined) {
5584
+ throw new NotSupported(this.id + ' parseMarginMode () is not supported yet');
5585
+ }
5557
5586
  }
5558
5587
  export { Exchange, };
@@ -365,7 +365,7 @@ export interface FundingHistory {
365
365
  amount: number;
366
366
  }
367
367
  export interface MarginMode {
368
- infp: any;
368
+ info: any;
369
369
  symbol: string;
370
370
  marginMode: 'isolated' | 'cross' | string;
371
371
  }
@@ -390,6 +390,8 @@ export interface Greeks {
390
390
  underlyingPrice: number;
391
391
  info: any;
392
392
  }
393
+ export interface MarginModes extends Dictionary<MarginMode> {
394
+ }
393
395
  /** [ timestamp, open, high, low, close, volume ] */
394
396
  export declare type OHLCV = [Num, Num, Num, Num, Num, Num];
395
397
  /** [ timestamp, open, high, low, close, volume, count ] */
@@ -1,5 +1,5 @@
1
1
  import Exchange from './abstract/binance.js';
2
- import type { TransferEntry, Int, OrderSide, Balances, OrderType, Trade, OHLCV, Order, FundingRateHistory, OpenInterest, Liquidation, OrderRequest, Str, Transaction, Ticker, OrderBook, Tickers, Market, Greeks, Strings, Currency, MarketInterface } from './base/types.js';
2
+ import type { TransferEntry, Int, OrderSide, Balances, OrderType, Trade, OHLCV, Order, FundingRateHistory, OpenInterest, Liquidation, OrderRequest, Str, Transaction, Ticker, OrderBook, Tickers, Market, Greeks, Strings, Currency, MarketInterface, MarginMode, MarginModes } from './base/types.js';
3
3
  /**
4
4
  * @class binance
5
5
  * @augments Exchange
@@ -433,4 +433,6 @@ export default class binance extends Exchange {
433
433
  info: any;
434
434
  hedged: boolean;
435
435
  }>;
436
+ fetchMarginModes(symbols?: string[], params?: {}): Promise<MarginModes>;
437
+ parseMarginMode(marginMode: any, market?: any): MarginMode;
436
438
  }
package/js/src/binance.js CHANGED
@@ -100,6 +100,8 @@ export default class binance extends Exchange {
100
100
  'fetchLeverage': true,
101
101
  'fetchLeverageTiers': true,
102
102
  'fetchLiquidations': false,
103
+ 'fetchMarginMode': 'emulated',
104
+ 'fetchMarginModes': true,
103
105
  'fetchMarketLeverageTiers': 'emulated',
104
106
  'fetchMarkets': true,
105
107
  'fetchMarkOHLCV': true,
@@ -12161,4 +12163,157 @@ export default class binance extends Exchange {
12161
12163
  'hedged': dualSidePosition,
12162
12164
  };
12163
12165
  }
12166
+ async fetchMarginModes(symbols = undefined, params = {}) {
12167
+ /**
12168
+ * @method
12169
+ * @name binance#fetchMarginMode
12170
+ * @description fetches margin modes ("isolated" or "cross") that the market for the symbol in in, with symbol=undefined all markets for a subType (linear/inverse) are returned
12171
+ * @see https://binance-docs.github.io/apidocs/futures/en/#account-information-v2-user_data
12172
+ * @param {string} symbol unified symbol of the market the order was made in
12173
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
12174
+ * @returns {object} struct of marginMode
12175
+ */
12176
+ await this.loadMarkets();
12177
+ let market = undefined;
12178
+ if (symbols !== undefined) {
12179
+ symbols = this.marketSymbols(symbols);
12180
+ market = this.market(symbols[0]);
12181
+ }
12182
+ let subType = undefined;
12183
+ [subType, params] = this.handleSubTypeAndParams('fetchMarginMode', market, params);
12184
+ let response = undefined;
12185
+ if (subType === 'linear') {
12186
+ response = await this.fapiPrivateV2GetAccount(params);
12187
+ //
12188
+ // {
12189
+ // feeTier: '0',
12190
+ // canTrade: true,
12191
+ // canDeposit: true,
12192
+ // canWithdraw: true,
12193
+ // tradeGroupId: '-1',
12194
+ // updateTime: '0',
12195
+ // multiAssetsMargin: true,
12196
+ // totalInitialMargin: '438.31134352',
12197
+ // totalMaintMargin: '5.90847101',
12198
+ // totalWalletBalance: '4345.15626338',
12199
+ // totalUnrealizedProfit: '376.45220224',
12200
+ // totalMarginBalance: '4721.60846562',
12201
+ // totalPositionInitialMargin: '425.45252687',
12202
+ // totalOpenOrderInitialMargin: '12.85881664',
12203
+ // totalCrossWalletBalance: '4345.15626338',
12204
+ // totalCrossUnPnl: '376.45220224',
12205
+ // availableBalance: '4281.84764041',
12206
+ // maxWithdrawAmount: '4281.84764041',
12207
+ // assets: [
12208
+ // {
12209
+ // asset: 'ETH',
12210
+ // walletBalance: '0.00000000',
12211
+ // unrealizedProfit: '0.00000000',
12212
+ // marginBalance: '0.00000000',
12213
+ // maintMargin: '0.00000000',
12214
+ // initialMargin: '0.00000000',
12215
+ // positionInitialMargin: '0.00000000',
12216
+ // openOrderInitialMargin: '0.00000000',
12217
+ // maxWithdrawAmount: '0.00000000',
12218
+ // crossWalletBalance: '0.00000000',
12219
+ // crossUnPnl: '0.00000000',
12220
+ // availableBalance: '1.26075574',
12221
+ // marginAvailable: true,
12222
+ // updateTime: '0'
12223
+ // },
12224
+ // ...
12225
+ // ],
12226
+ // positions: [
12227
+ // {
12228
+ // symbol: 'SNTUSDT',
12229
+ // initialMargin: '0',
12230
+ // maintMargin: '0',
12231
+ // unrealizedProfit: '0.00000000',
12232
+ // positionInitialMargin: '0',
12233
+ // openOrderInitialMargin: '0',
12234
+ // leverage: '20',
12235
+ // isolated: false,
12236
+ // entryPrice: '0.0',
12237
+ // breakEvenPrice: '0.0',
12238
+ // maxNotional: '25000',
12239
+ // positionSide: 'BOTH',
12240
+ // positionAmt: '0',
12241
+ // notional: '0',
12242
+ // isolatedWallet: '0',
12243
+ // updateTime: '0',
12244
+ // bidNotional: '0',
12245
+ // askNotional: '0'
12246
+ // },
12247
+ // ...
12248
+ // ]
12249
+ // }
12250
+ //
12251
+ }
12252
+ else if (subType === 'inverse') {
12253
+ response = await this.dapiPrivateGetAccount(params);
12254
+ //
12255
+ // {
12256
+ // feeTier: '0',
12257
+ // canTrade: true,
12258
+ // canDeposit: true,
12259
+ // canWithdraw: true,
12260
+ // updateTime: '0',
12261
+ // assets: [
12262
+ // {
12263
+ // asset: 'APT',
12264
+ // walletBalance: '0.00000000',
12265
+ // unrealizedProfit: '0.00000000',
12266
+ // marginBalance: '0.00000000',
12267
+ // maintMargin: '0.00000000',
12268
+ // initialMargin: '0.00000000',
12269
+ // positionInitialMargin: '0.00000000',
12270
+ // openOrderInitialMargin: '0.00000000',
12271
+ // maxWithdrawAmount: '0.00000000',
12272
+ // crossWalletBalance: '0.00000000',
12273
+ // crossUnPnl: '0.00000000',
12274
+ // availableBalance: '0.00000000',
12275
+ // updateTime: '0'
12276
+ // },
12277
+ // ...
12278
+ // ],
12279
+ // positions: [
12280
+ // {
12281
+ // symbol: 'BCHUSD_240329',
12282
+ // initialMargin: '0',
12283
+ // maintMargin: '0',
12284
+ // unrealizedProfit: '0.00000000',
12285
+ // positionInitialMargin: '0',
12286
+ // openOrderInitialMargin: '0',
12287
+ // leverage: '20',
12288
+ // isolated: false,
12289
+ // positionSide: 'BOTH',
12290
+ // entryPrice: '0.00000000',
12291
+ // maxQty: '1000',
12292
+ // notionalValue: '0',
12293
+ // isolatedWallet: '0',
12294
+ // updateTime: '0',
12295
+ // positionAmt: '0',
12296
+ // breakEvenPrice: '0.00000000'
12297
+ // },
12298
+ // ...
12299
+ // ]
12300
+ // }
12301
+ //
12302
+ }
12303
+ else {
12304
+ throw new BadRequest(this.id + ' fetchMarginModes () supports linear and inverse subTypes only');
12305
+ }
12306
+ const assets = this.safeValue(response, 'positions', []);
12307
+ return this.parseMarginModes(assets, symbols, 'symbol', 'swap');
12308
+ }
12309
+ parseMarginMode(marginMode, market = undefined) {
12310
+ const marketId = this.safeString(marginMode, 'symbol');
12311
+ market = this.safeMarket(marketId, market);
12312
+ const isIsolated = this.safeBool(marginMode, 'isolated');
12313
+ return {
12314
+ 'info': marginMode,
12315
+ 'symbol': market['symbol'],
12316
+ 'marginMode': isIsolated ? 'isolated' : 'cross',
12317
+ };
12318
+ }
12164
12319
  }
@@ -62,6 +62,8 @@ export default class bitmex extends Exchange {
62
62
  cancelOrder(id: string, symbol?: Str, params?: {}): Promise<Order>;
63
63
  cancelOrders(ids: any, symbol?: Str, params?: {}): Promise<Order[]>;
64
64
  cancelAllOrders(symbol?: Str, params?: {}): Promise<Order[]>;
65
+ fetchLeverages(symbols?: string[], params?: {}): Promise<any[]>;
66
+ fetchLeverage(symbol: string, params?: {}): Promise<any[]>;
65
67
  fetchPositions(symbols?: Strings, params?: {}): Promise<import("./base/types.js").Position[]>;
66
68
  parsePosition(position: any, market?: Market): import("./base/types.js").Position;
67
69
  withdraw(code: string, amount: number, address: any, tag?: any, params?: {}): Promise<Transaction>;
package/js/src/bitmex.js CHANGED
@@ -62,7 +62,8 @@ export default class bitmex extends Exchange {
62
62
  'fetchFundingRates': true,
63
63
  'fetchIndexOHLCV': false,
64
64
  'fetchLedger': true,
65
- 'fetchLeverage': false,
65
+ 'fetchLeverage': true,
66
+ 'fetchLeverages': true,
66
67
  'fetchLeverageTiers': false,
67
68
  'fetchLiquidations': true,
68
69
  'fetchMarketLeverageTiers': false,
@@ -2117,6 +2118,46 @@ export default class bitmex extends Exchange {
2117
2118
  //
2118
2119
  return this.parseOrders(response, market);
2119
2120
  }
2121
+ async fetchLeverages(symbols = undefined, params = {}) {
2122
+ /**
2123
+ * @method
2124
+ * @name bitmex#fetchLeverages
2125
+ * @description fetch the set leverage for all contract markets
2126
+ * @see https://www.bitmex.com/api/explorer/#!/Position/Position_get
2127
+ * @param {string[]} [symbols] a list of unified market symbols
2128
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
2129
+ * @returns {object} a list of [leverage structures]{@link https://docs.ccxt.com/#/?id=leverage-structure}
2130
+ */
2131
+ await this.loadMarkets();
2132
+ const positions = await this.fetchPositions(symbols, params);
2133
+ const result = [];
2134
+ for (let i = 0; i < positions.length; i++) {
2135
+ const entry = positions[i];
2136
+ const marketId = this.safeString(entry, 'symbol');
2137
+ const market = this.safeMarket(marketId, undefined, undefined, 'contract');
2138
+ result.push({
2139
+ 'info': entry,
2140
+ 'symbol': market['symbol'],
2141
+ 'leverage': this.safeInteger(entry, 'leverage'),
2142
+ 'marginMode': this.safeString(entry, 'marginMode'),
2143
+ });
2144
+ }
2145
+ return result;
2146
+ }
2147
+ async fetchLeverage(symbol, params = {}) {
2148
+ /**
2149
+ * @method
2150
+ * @name bitmex#fetchLeverage
2151
+ * @description fetch the set leverage for a market
2152
+ * @see https://www.bitmex.com/api/explorer/#!/Position/Position_get
2153
+ * @param {string} symbol unified market symbol
2154
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
2155
+ * @returns {object} a [leverage structure]{@link https://docs.ccxt.com/#/?id=leverage-structure}
2156
+ */
2157
+ await this.loadMarkets();
2158
+ const leverage = await this.fetchLeverages([symbol], params);
2159
+ return leverage;
2160
+ }
2120
2161
  async fetchPositions(symbols = undefined, params = {}) {
2121
2162
  /**
2122
2163
  * @method
@@ -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 } 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;
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');
2540
- }
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
- });
2575
+ throw new BadSymbol(this.id + ' fetchMarginModes () supports swap contracts and margin only');
2587
2576
  }
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
  /**