ccxt 4.4.40 → 4.4.42

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 (183) hide show
  1. package/README.md +4 -4
  2. package/dist/ccxt.browser.min.js +3 -3
  3. package/dist/cjs/ccxt.js +1 -1
  4. package/dist/cjs/src/ace.js +1 -1
  5. package/dist/cjs/src/alpaca.js +0 -1
  6. package/dist/cjs/src/ascendex.js +0 -1
  7. package/dist/cjs/src/base/Exchange.js +41 -19
  8. package/dist/cjs/src/bigone.js +0 -1
  9. package/dist/cjs/src/binance.js +27 -24
  10. package/dist/cjs/src/bingx.js +6 -1
  11. package/dist/cjs/src/bitfinex.js +124 -1
  12. package/dist/cjs/src/bitget.js +1 -0
  13. package/dist/cjs/src/bitmart.js +254 -1
  14. package/dist/cjs/src/blofin.js +16 -7
  15. package/dist/cjs/src/bybit.js +8 -8
  16. package/dist/cjs/src/cex.js +1 -1
  17. package/dist/cjs/src/coinbase.js +8 -9
  18. package/dist/cjs/src/coinbaseexchange.js +5 -6
  19. package/dist/cjs/src/coinbaseinternational.js +7 -8
  20. package/dist/cjs/src/coincatch.js +0 -1
  21. package/dist/cjs/src/coincheck.js +0 -1
  22. package/dist/cjs/src/coinex.js +91 -6
  23. package/dist/cjs/src/coinlist.js +3 -4
  24. package/dist/cjs/src/coinmate.js +1 -3
  25. package/dist/cjs/src/coinmetro.js +4 -5
  26. package/dist/cjs/src/coinone.js +0 -1
  27. package/dist/cjs/src/coinsph.js +7 -8
  28. package/dist/cjs/src/cryptocom.js +3 -0
  29. package/dist/cjs/src/currencycom.js +3 -4
  30. package/dist/cjs/src/defx.js +6 -7
  31. package/dist/cjs/src/deribit.js +1 -3
  32. package/dist/cjs/src/digifinex.js +0 -1
  33. package/dist/cjs/src/ellipx.js +0 -2
  34. package/dist/cjs/src/exmo.js +63 -6
  35. package/dist/cjs/src/gate.js +2 -3
  36. package/dist/cjs/src/gemini.js +4 -5
  37. package/dist/cjs/src/hashkey.js +79 -83
  38. package/dist/cjs/src/hitbtc.js +49 -5
  39. package/dist/cjs/src/hollaex.js +4 -6
  40. package/dist/cjs/src/htx.js +2 -4
  41. package/dist/cjs/src/huobijp.js +0 -1
  42. package/dist/cjs/src/hyperliquid.js +65 -1
  43. package/dist/cjs/src/idex.js +8 -8
  44. package/dist/cjs/src/independentreserve.js +0 -1
  45. package/dist/cjs/src/indodax.js +0 -1
  46. package/dist/cjs/src/kraken.js +192 -29
  47. package/dist/cjs/src/krakenfutures.js +75 -3
  48. package/dist/cjs/src/kucoin.js +7 -4
  49. package/dist/cjs/src/kucoinfutures.js +10 -9
  50. package/dist/cjs/src/kuna.js +1 -3
  51. package/dist/cjs/src/latoken.js +1 -3
  52. package/dist/cjs/src/lbank.js +0 -1
  53. package/dist/cjs/src/luno.js +0 -1
  54. package/dist/cjs/src/lykke.js +0 -1
  55. package/dist/cjs/src/mercado.js +0 -1
  56. package/dist/cjs/src/mexc.js +6 -7
  57. package/dist/cjs/src/ndax.js +1 -1
  58. package/dist/cjs/src/novadax.js +4 -6
  59. package/dist/cjs/src/oceanex.js +0 -1
  60. package/dist/cjs/src/okcoin.js +1 -3
  61. package/dist/cjs/src/okx.js +7 -4
  62. package/dist/cjs/src/onetrading.js +1 -3
  63. package/dist/cjs/src/p2b.js +1 -1
  64. package/dist/cjs/src/paradex.js +5 -7
  65. package/dist/cjs/src/phemex.js +8 -10
  66. package/dist/cjs/src/poloniex.js +1 -3
  67. package/dist/cjs/src/poloniexfutures.js +6 -6
  68. package/dist/cjs/src/probit.js +0 -1
  69. package/dist/cjs/src/timex.js +0 -1
  70. package/dist/cjs/src/tokocrypto.js +11 -14
  71. package/dist/cjs/src/tradeogre.js +1 -1
  72. package/dist/cjs/src/upbit.js +0 -1
  73. package/dist/cjs/src/wavesexchange.js +4 -5
  74. package/dist/cjs/src/whitebit.js +8 -9
  75. package/dist/cjs/src/woo.js +99 -13
  76. package/dist/cjs/src/woofipro.js +96 -15
  77. package/dist/cjs/src/xt.js +8 -4
  78. package/dist/cjs/src/yobit.js +0 -1
  79. package/dist/cjs/src/zaif.js +0 -1
  80. package/dist/cjs/src/zonda.js +1 -2
  81. package/js/ccxt.d.ts +3 -3
  82. package/js/ccxt.js +1 -1
  83. package/js/src/abstract/binance.d.ts +3 -0
  84. package/js/src/abstract/binancecoinm.d.ts +3 -0
  85. package/js/src/abstract/binanceus.d.ts +3 -0
  86. package/js/src/abstract/binanceusdm.d.ts +3 -0
  87. package/js/src/abstract/bitmart.d.ts +2 -0
  88. package/js/src/abstract/okx.d.ts +5 -0
  89. package/js/src/ace.js +1 -1
  90. package/js/src/alpaca.js +0 -1
  91. package/js/src/ascendex.js +0 -1
  92. package/js/src/base/Exchange.d.ts +12 -9
  93. package/js/src/base/Exchange.js +41 -19
  94. package/js/src/base/types.d.ts +2 -0
  95. package/js/src/bigone.js +0 -1
  96. package/js/src/binance.js +27 -24
  97. package/js/src/bingx.js +6 -1
  98. package/js/src/bitfinex.d.ts +11 -1
  99. package/js/src/bitfinex.js +124 -1
  100. package/js/src/bitget.js +1 -0
  101. package/js/src/bitmart.d.ts +52 -1
  102. package/js/src/bitmart.js +254 -1
  103. package/js/src/blofin.d.ts +1 -1
  104. package/js/src/blofin.js +16 -7
  105. package/js/src/bybit.js +8 -8
  106. package/js/src/cex.js +1 -1
  107. package/js/src/coinbase.js +8 -9
  108. package/js/src/coinbaseexchange.js +5 -6
  109. package/js/src/coinbaseinternational.d.ts +1 -1
  110. package/js/src/coinbaseinternational.js +7 -8
  111. package/js/src/coincatch.js +0 -1
  112. package/js/src/coincheck.js +0 -1
  113. package/js/src/coinex.js +91 -6
  114. package/js/src/coinlist.js +3 -4
  115. package/js/src/coinmate.js +1 -3
  116. package/js/src/coinmetro.js +4 -5
  117. package/js/src/coinone.js +0 -1
  118. package/js/src/coinsph.js +7 -8
  119. package/js/src/cryptocom.js +3 -0
  120. package/js/src/currencycom.js +3 -4
  121. package/js/src/defx.js +6 -7
  122. package/js/src/deribit.js +1 -3
  123. package/js/src/digifinex.js +0 -1
  124. package/js/src/ellipx.js +0 -2
  125. package/js/src/exmo.d.ts +36 -1
  126. package/js/src/exmo.js +63 -6
  127. package/js/src/gate.d.ts +1 -1
  128. package/js/src/gate.js +2 -3
  129. package/js/src/gemini.js +4 -5
  130. package/js/src/hashkey.js +79 -83
  131. package/js/src/hitbtc.d.ts +11 -1
  132. package/js/src/hitbtc.js +49 -5
  133. package/js/src/hollaex.js +4 -6
  134. package/js/src/htx.js +2 -4
  135. package/js/src/huobijp.js +0 -1
  136. package/js/src/hyperliquid.d.ts +20 -1
  137. package/js/src/hyperliquid.js +65 -1
  138. package/js/src/idex.js +8 -8
  139. package/js/src/independentreserve.js +0 -1
  140. package/js/src/indodax.js +0 -1
  141. package/js/src/kraken.d.ts +15 -9
  142. package/js/src/kraken.js +192 -29
  143. package/js/src/krakenfutures.d.ts +2 -2
  144. package/js/src/krakenfutures.js +75 -3
  145. package/js/src/kucoin.js +7 -4
  146. package/js/src/kucoinfutures.d.ts +5 -4
  147. package/js/src/kucoinfutures.js +10 -9
  148. package/js/src/kuna.js +1 -3
  149. package/js/src/latoken.js +1 -3
  150. package/js/src/lbank.js +0 -1
  151. package/js/src/luno.js +0 -1
  152. package/js/src/lykke.js +0 -1
  153. package/js/src/mercado.js +0 -1
  154. package/js/src/mexc.js +6 -7
  155. package/js/src/ndax.js +1 -1
  156. package/js/src/novadax.js +4 -6
  157. package/js/src/oceanex.js +0 -1
  158. package/js/src/okcoin.js +1 -3
  159. package/js/src/okx.js +7 -4
  160. package/js/src/onetrading.js +1 -3
  161. package/js/src/p2b.js +1 -1
  162. package/js/src/paradex.d.ts +1 -1
  163. package/js/src/paradex.js +5 -7
  164. package/js/src/phemex.js +8 -10
  165. package/js/src/poloniex.js +1 -3
  166. package/js/src/poloniexfutures.js +6 -6
  167. package/js/src/probit.js +0 -1
  168. package/js/src/timex.js +0 -1
  169. package/js/src/tokocrypto.js +11 -14
  170. package/js/src/tradeogre.js +1 -1
  171. package/js/src/upbit.js +0 -1
  172. package/js/src/wavesexchange.d.ts +1 -1
  173. package/js/src/wavesexchange.js +4 -5
  174. package/js/src/whitebit.js +8 -9
  175. package/js/src/woo.d.ts +1 -1
  176. package/js/src/woo.js +99 -13
  177. package/js/src/woofipro.js +96 -15
  178. package/js/src/xt.d.ts +2 -1
  179. package/js/src/xt.js +8 -4
  180. package/js/src/yobit.js +0 -1
  181. package/js/src/zaif.js +0 -1
  182. package/js/src/zonda.js +1 -2
  183. package/package.json +2 -2
@@ -3,7 +3,7 @@ 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, Option, OptionChain, Str, Num, MarketInterface, CurrencyInterface, BalanceAccount, MarginModes, MarketType, Leverage, Leverages, LastPrice, LastPrices, Account, Strings, MarginModification, TradingFeeInterface, Currencies, TradingFees, Conversion, CancellationRequest, IsolatedBorrowRate, IsolatedBorrowRates, CrossBorrowRates, CrossBorrowRate, Dict, FundingRates, LeverageTiers, Bool, int, DepositAddress, LongShortRatio } 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, Option, OptionChain, Str, Num, MarketInterface, CurrencyInterface, BalanceAccount, MarginModes, MarketType, Leverage, Leverages, LastPrice, LastPrices, Account, Strings, MarginModification, TradingFeeInterface, Currencies, TradingFees, Conversion, CancellationRequest, IsolatedBorrowRate, IsolatedBorrowRates, CrossBorrowRates, CrossBorrowRate, Dict, FundingRates, LeverageTiers, Bool, int, DepositAddress, LongShortRatio, OpenInterests } from './types.js';
7
7
  export type { Market, Trade, Fee, Ticker, OHLCV, OHLCVC, Order, OrderBook, Balance, Balances, Dictionary, Transaction, DepositAddressResponse, Currency, MinMax, IndexType, Int, Bool, OrderType, OrderSide, Position, LedgerEntry, BorrowInterest, OpenInterest, LeverageTier, TransferEntry, CrossBorrowRate, FundingRateHistory, Liquidation, FundingHistory, OrderRequest, MarginMode, Tickers, Greeks, Option, OptionChain, Str, Num, MarketInterface, CurrencyInterface, BalanceAccount, MarginModes, MarketType, Leverage, Leverages, LastPrice, LastPrices, Account, Strings, Conversion, DepositAddress, LongShortRatio } from './types.js';
8
8
  import { ArrayCache, ArrayCacheByTimestamp } from './ws/Cache.js';
9
9
  import { OrderBook as Ob } from './ws/OrderBook.js';
@@ -531,6 +531,7 @@ export default class Exchange {
531
531
  fetchOHLCV: any;
532
532
  fetchOHLCVWs: any;
533
533
  fetchOpenInterest: any;
534
+ fetchOpenInterests: any;
534
535
  fetchOpenInterestHistory: any;
535
536
  fetchOpenOrder: any;
536
537
  fetchOpenOrders: any;
@@ -815,6 +816,7 @@ export default class Exchange {
815
816
  fetchDepositAddressesByNetwork(code: string, params?: {}): Promise<DepositAddress[]>;
816
817
  fetchOpenInterestHistory(symbol: string, timeframe?: string, since?: Int, limit?: Int, params?: {}): Promise<OpenInterest[]>;
817
818
  fetchOpenInterest(symbol: string, params?: {}): Promise<OpenInterest>;
819
+ fetchOpenInterests(symbols?: Strings, params?: {}): Promise<OpenInterests>;
818
820
  signIn(params?: {}): Promise<{}>;
819
821
  fetchPaymentMethods(params?: {}): Promise<{}>;
820
822
  parseToInt(number: any): number;
@@ -1103,12 +1105,12 @@ export default class Exchange {
1103
1105
  createPostOnlyOrderWs(symbol: string, type: OrderType, side: OrderSide, amount: number, price?: Num, params?: {}): Promise<Order>;
1104
1106
  createReduceOnlyOrder(symbol: string, type: OrderType, side: OrderSide, amount: number, price?: Num, params?: {}): Promise<Order>;
1105
1107
  createReduceOnlyOrderWs(symbol: string, type: OrderType, side: OrderSide, amount: number, price?: Num, params?: {}): Promise<Order>;
1106
- createStopOrder(symbol: string, type: OrderType, side: OrderSide, amount: number, price?: Num, stopPrice?: Num, params?: {}): Promise<Order>;
1107
- createStopOrderWs(symbol: string, type: OrderType, side: OrderSide, amount: number, price?: Num, stopPrice?: Num, params?: {}): Promise<Order>;
1108
- createStopLimitOrder(symbol: string, side: OrderSide, amount: number, price: number, stopPrice: number, params?: {}): Promise<Order>;
1109
- createStopLimitOrderWs(symbol: string, side: OrderSide, amount: number, price: number, stopPrice: number, params?: {}): Promise<Order>;
1110
- createStopMarketOrder(symbol: string, side: OrderSide, amount: number, stopPrice: number, params?: {}): Promise<Order>;
1111
- createStopMarketOrderWs(symbol: string, side: OrderSide, amount: number, stopPrice: number, params?: {}): Promise<Order>;
1108
+ createStopOrder(symbol: string, type: OrderType, side: OrderSide, amount: number, price?: Num, triggerPrice?: Num, params?: {}): Promise<Order>;
1109
+ createStopOrderWs(symbol: string, type: OrderType, side: OrderSide, amount: number, price?: Num, triggerPrice?: Num, params?: {}): Promise<Order>;
1110
+ createStopLimitOrder(symbol: string, side: OrderSide, amount: number, price: number, triggerPrice: number, params?: {}): Promise<Order>;
1111
+ createStopLimitOrderWs(symbol: string, side: OrderSide, amount: number, price: number, triggerPrice: number, params?: {}): Promise<Order>;
1112
+ createStopMarketOrder(symbol: string, side: OrderSide, amount: number, triggerPrice: number, params?: {}): Promise<Order>;
1113
+ createStopMarketOrderWs(symbol: string, side: OrderSide, amount: number, triggerPrice: number, params?: {}): Promise<Order>;
1112
1114
  safeCurrencyCode(currencyId: Str, currency?: Currency): string;
1113
1115
  filterBySymbolSinceLimit(array: any, symbol?: Str, since?: Int, limit?: Int, tail?: boolean): any;
1114
1116
  filterByCurrencySinceLimit(array: any, code?: any, since?: Int, limit?: Int, tail?: boolean): any;
@@ -1124,6 +1126,7 @@ export default class Exchange {
1124
1126
  safeSymbol(marketId: Str, market?: Market, delimiter?: Str, marketType?: Str): string;
1125
1127
  parseFundingRate(contract: string, market?: Market): FundingRate;
1126
1128
  parseFundingRates(response: any, market?: Market): FundingRates;
1129
+ parseOpenInterests(response: any, market?: Market): OpenInterests;
1127
1130
  parseLongShortRatio(info: Dict, market?: Market): LongShortRatio;
1128
1131
  parseLongShortRatioHistory(response: any, market?: any, since?: Int, limit?: Int): LongShortRatio[];
1129
1132
  handleTriggerAndParams(params: any): any[];
@@ -1136,7 +1139,7 @@ export default class Exchange {
1136
1139
  fetchTradingFee(symbol: string, params?: {}): Promise<TradingFeeInterface>;
1137
1140
  fetchConvertCurrencies(params?: {}): Promise<Currencies>;
1138
1141
  parseOpenInterest(interest: any, market?: Market): OpenInterest;
1139
- parseOpenInterests(response: any, market?: any, since?: Int, limit?: Int): OpenInterest[];
1142
+ parseOpenInterestsHistory(response: any, market?: any, since?: Int, limit?: Int): OpenInterest[];
1140
1143
  fetchFundingRate(symbol: string, params?: {}): Promise<FundingRate>;
1141
1144
  fetchFundingInterval(symbol: string, params?: {}): Promise<FundingRate>;
1142
1145
  fetchMarkOHLCV(symbol: any, timeframe?: string, since?: Int, limit?: Int, params?: {}): Promise<OHLCV[]>;
@@ -1159,7 +1162,7 @@ export default class Exchange {
1159
1162
  filterByArrayTickers(objects: any, key: IndexType, values?: any, indexed?: boolean): Dictionary<Ticker>;
1160
1163
  createOHLCVObject(symbol: string, timeframe: string, data: any): Dictionary<Dictionary<OHLCV[]>>;
1161
1164
  handleMaxEntriesPerRequestAndParams(method: string, maxEntriesPerRequest?: Int, params?: {}): [Int, any];
1162
- fetchPaginatedCallDynamic(method: string, symbol?: Str, since?: Int, limit?: Int, params?: {}, maxEntriesPerRequest?: Int): Promise<any>;
1165
+ fetchPaginatedCallDynamic(method: string, symbol?: Str, since?: Int, limit?: Int, params?: {}, maxEntriesPerRequest?: Int, removeRepeated?: boolean): Promise<any>;
1163
1166
  safeDeterministicCall(method: string, symbol?: Str, since?: Int, limit?: Int, timeframe?: Str, params?: {}): Promise<any>;
1164
1167
  fetchPaginatedCallDeterministic(method: string, symbol?: Str, since?: Int, limit?: Int, timeframe?: Str, params?: {}, maxEntriesPerRequest?: any): Promise<any>;
1165
1168
  fetchPaginatedCallCursor(method: string, symbol?: Str, since?: any, limit?: any, params?: {}, cursorReceived?: any, cursorSent?: any, cursorIncrement?: any, maxEntriesPerRequest?: any): Promise<any>;
@@ -1427,6 +1427,7 @@ export default class Exchange {
1427
1427
  'fetchOHLCV': undefined,
1428
1428
  'fetchOHLCVWs': undefined,
1429
1429
  'fetchOpenInterest': undefined,
1430
+ 'fetchOpenInterests': undefined,
1430
1431
  'fetchOpenInterestHistory': undefined,
1431
1432
  'fetchOpenOrder': undefined,
1432
1433
  'fetchOpenOrders': undefined,
@@ -2261,6 +2262,9 @@ export default class Exchange {
2261
2262
  async fetchOpenInterest(symbol, params = {}) {
2262
2263
  throw new NotSupported(this.id + ' fetchOpenInterest() is not supported yet');
2263
2264
  }
2265
+ async fetchOpenInterests(symbols = undefined, params = {}) {
2266
+ throw new NotSupported(this.id + ' fetchOpenInterests() is not supported yet');
2267
+ }
2264
2268
  async signIn(params = {}) {
2265
2269
  throw new NotSupported(this.id + ' signIn() is not supported yet');
2266
2270
  }
@@ -4445,10 +4449,15 @@ export default class Exchange {
4445
4449
  }
4446
4450
  handleOptionAndParams2(params, methodName1, optionName1, optionName2, defaultValue = undefined) {
4447
4451
  let value = undefined;
4448
- [value, params] = this.handleOptionAndParams(params, methodName1, optionName1, defaultValue);
4452
+ [value, params] = this.handleOptionAndParams(params, methodName1, optionName1);
4453
+ if (value !== undefined) {
4454
+ // omit optionName2 too from params
4455
+ params = this.omit(params, optionName2);
4456
+ return [value, params];
4457
+ }
4449
4458
  // if still undefined, try optionName2
4450
4459
  let value2 = undefined;
4451
- [value2, params] = this.handleOptionAndParams(params, methodName1, optionName2, value);
4460
+ [value2, params] = this.handleOptionAndParams(params, methodName1, optionName2, defaultValue);
4452
4461
  return [value2, params];
4453
4462
  }
4454
4463
  handleOption(methodName, optionName, defaultValue = undefined) {
@@ -5503,52 +5512,52 @@ export default class Exchange {
5503
5512
  const query = this.extend(params, { 'reduceOnly': true });
5504
5513
  return await this.createOrderWs(symbol, type, side, amount, price, query);
5505
5514
  }
5506
- async createStopOrder(symbol, type, side, amount, price = undefined, stopPrice = undefined, params = {}) {
5515
+ async createStopOrder(symbol, type, side, amount, price = undefined, triggerPrice = undefined, params = {}) {
5507
5516
  if (!this.has['createStopOrder']) {
5508
5517
  throw new NotSupported(this.id + ' createStopOrder() is not supported yet');
5509
5518
  }
5510
- if (stopPrice === undefined) {
5519
+ if (triggerPrice === undefined) {
5511
5520
  throw new ArgumentsRequired(this.id + ' create_stop_order() requires a stopPrice argument');
5512
5521
  }
5513
- const query = this.extend(params, { 'stopPrice': stopPrice });
5522
+ const query = this.extend(params, { 'stopPrice': triggerPrice });
5514
5523
  return await this.createOrder(symbol, type, side, amount, price, query);
5515
5524
  }
5516
- async createStopOrderWs(symbol, type, side, amount, price = undefined, stopPrice = undefined, params = {}) {
5525
+ async createStopOrderWs(symbol, type, side, amount, price = undefined, triggerPrice = undefined, params = {}) {
5517
5526
  if (!this.has['createStopOrderWs']) {
5518
5527
  throw new NotSupported(this.id + ' createStopOrderWs() is not supported yet');
5519
5528
  }
5520
- if (stopPrice === undefined) {
5529
+ if (triggerPrice === undefined) {
5521
5530
  throw new ArgumentsRequired(this.id + ' createStopOrderWs() requires a stopPrice argument');
5522
5531
  }
5523
- const query = this.extend(params, { 'stopPrice': stopPrice });
5532
+ const query = this.extend(params, { 'stopPrice': triggerPrice });
5524
5533
  return await this.createOrderWs(symbol, type, side, amount, price, query);
5525
5534
  }
5526
- async createStopLimitOrder(symbol, side, amount, price, stopPrice, params = {}) {
5535
+ async createStopLimitOrder(symbol, side, amount, price, triggerPrice, params = {}) {
5527
5536
  if (!this.has['createStopLimitOrder']) {
5528
5537
  throw new NotSupported(this.id + ' createStopLimitOrder() is not supported yet');
5529
5538
  }
5530
- const query = this.extend(params, { 'stopPrice': stopPrice });
5539
+ const query = this.extend(params, { 'stopPrice': triggerPrice });
5531
5540
  return await this.createOrder(symbol, 'limit', side, amount, price, query);
5532
5541
  }
5533
- async createStopLimitOrderWs(symbol, side, amount, price, stopPrice, params = {}) {
5542
+ async createStopLimitOrderWs(symbol, side, amount, price, triggerPrice, params = {}) {
5534
5543
  if (!this.has['createStopLimitOrderWs']) {
5535
5544
  throw new NotSupported(this.id + ' createStopLimitOrderWs() is not supported yet');
5536
5545
  }
5537
- const query = this.extend(params, { 'stopPrice': stopPrice });
5546
+ const query = this.extend(params, { 'stopPrice': triggerPrice });
5538
5547
  return await this.createOrderWs(symbol, 'limit', side, amount, price, query);
5539
5548
  }
5540
- async createStopMarketOrder(symbol, side, amount, stopPrice, params = {}) {
5549
+ async createStopMarketOrder(symbol, side, amount, triggerPrice, params = {}) {
5541
5550
  if (!this.has['createStopMarketOrder']) {
5542
5551
  throw new NotSupported(this.id + ' createStopMarketOrder() is not supported yet');
5543
5552
  }
5544
- const query = this.extend(params, { 'stopPrice': stopPrice });
5553
+ const query = this.extend(params, { 'stopPrice': triggerPrice });
5545
5554
  return await this.createOrder(symbol, 'market', side, amount, undefined, query);
5546
5555
  }
5547
- async createStopMarketOrderWs(symbol, side, amount, stopPrice, params = {}) {
5556
+ async createStopMarketOrderWs(symbol, side, amount, triggerPrice, params = {}) {
5548
5557
  if (!this.has['createStopMarketOrderWs']) {
5549
5558
  throw new NotSupported(this.id + ' createStopMarketOrderWs() is not supported yet');
5550
5559
  }
5551
- const query = this.extend(params, { 'stopPrice': stopPrice });
5560
+ const query = this.extend(params, { 'stopPrice': triggerPrice });
5552
5561
  return await this.createOrderWs(symbol, 'market', side, amount, undefined, query);
5553
5562
  }
5554
5563
  safeCurrencyCode(currencyId, currency = undefined) {
@@ -5716,6 +5725,14 @@ export default class Exchange {
5716
5725
  }
5717
5726
  return result;
5718
5727
  }
5728
+ parseOpenInterests(response, market = undefined) {
5729
+ const result = {};
5730
+ for (let i = 0; i < response.length; i++) {
5731
+ const parsed = this.parseOpenInterest(response[i], market);
5732
+ result[parsed['symbol']] = parsed;
5733
+ }
5734
+ return result;
5735
+ }
5719
5736
  parseLongShortRatio(info, market = undefined) {
5720
5737
  throw new NotSupported(this.id + ' parseLongShortRatio() is not supported yet');
5721
5738
  }
@@ -5825,7 +5842,7 @@ export default class Exchange {
5825
5842
  parseOpenInterest(interest, market = undefined) {
5826
5843
  throw new NotSupported(this.id + ' parseOpenInterest () is not supported yet');
5827
5844
  }
5828
- parseOpenInterests(response, market = undefined, since = undefined, limit = undefined) {
5845
+ parseOpenInterestsHistory(response, market = undefined, since = undefined, limit = undefined) {
5829
5846
  const interests = [];
5830
5847
  for (let i = 0; i < response.length; i++) {
5831
5848
  const entry = response[i];
@@ -6177,7 +6194,7 @@ export default class Exchange {
6177
6194
  }
6178
6195
  return [maxEntriesPerRequest, params];
6179
6196
  }
6180
- async fetchPaginatedCallDynamic(method, symbol = undefined, since = undefined, limit = undefined, params = {}, maxEntriesPerRequest = undefined) {
6197
+ async fetchPaginatedCallDynamic(method, symbol = undefined, since = undefined, limit = undefined, params = {}, maxEntriesPerRequest = undefined, removeRepeated = true) {
6181
6198
  let maxCalls = undefined;
6182
6199
  [maxCalls, params] = this.handleOptionAndParams(params, method, 'paginationCalls', 10);
6183
6200
  let maxRetries = undefined;
@@ -6185,6 +6202,8 @@ export default class Exchange {
6185
6202
  let paginationDirection = undefined;
6186
6203
  [paginationDirection, params] = this.handleOptionAndParams(params, method, 'paginationDirection', 'backward');
6187
6204
  let paginationTimestamp = undefined;
6205
+ let removeRepeatedOption = removeRepeated;
6206
+ [removeRepeatedOption, params] = this.handleOptionAndParams(params, method, 'removeRepeated', removeRepeated);
6188
6207
  let calls = 0;
6189
6208
  let result = [];
6190
6209
  let errors = 0;
@@ -6255,7 +6274,10 @@ export default class Exchange {
6255
6274
  }
6256
6275
  }
6257
6276
  }
6258
- const uniqueResults = this.removeRepeatedElementsFromArray(result);
6277
+ let uniqueResults = result;
6278
+ if (removeRepeatedOption) {
6279
+ uniqueResults = this.removeRepeatedElementsFromArray(result);
6280
+ }
6259
6281
  const key = (method === 'fetchOHLCV') ? 0 : 'timestamp';
6260
6282
  return this.filterBySinceLimit(uniqueResults, since, limit, key);
6261
6283
  }
@@ -403,6 +403,8 @@ export interface OpenInterest {
403
403
  datetime?: Str;
404
404
  info: any;
405
405
  }
406
+ export interface OpenInterests extends Dictionary<OpenInterest> {
407
+ }
406
408
  export interface Liquidation {
407
409
  info: any;
408
410
  symbol: string;
package/js/src/bigone.js CHANGED
@@ -1378,7 +1378,6 @@ export default class bigone extends Exchange {
1378
1378
  'postOnly': this.safeBool(order, 'post_only'),
1379
1379
  'side': side,
1380
1380
  'price': price,
1381
- 'stopPrice': triggerPrice,
1382
1381
  'triggerPrice': triggerPrice,
1383
1382
  'amount': amount,
1384
1383
  'cost': cost,
package/js/src/binance.js CHANGED
@@ -637,6 +637,8 @@ export default class binance extends Exchange {
637
637
  'portfolio/bnb-transfer': 150,
638
638
  'portfolio/repay-futures-switch': 150,
639
639
  'portfolio/repay-futures-negative-balance': 150,
640
+ 'portfolio/mint': 20,
641
+ 'portfolio/redeem': 20,
640
642
  'lending/auto-invest/plan/add': 0.1,
641
643
  'lending/auto-invest/plan/edit': 0.1,
642
644
  'lending/auto-invest/plan/edit-status': 0.1,
@@ -965,6 +967,7 @@ export default class binance extends Exchange {
965
967
  'block/order/orders': 5,
966
968
  'block/order/execute': 5,
967
969
  'block/user-trades': 5,
970
+ 'blockTrades': 5,
968
971
  },
969
972
  'post': {
970
973
  'order': 1,
@@ -5232,8 +5235,8 @@ export default class binance extends Exchange {
5232
5235
  uppercaseType = 'LIMIT_MAKER';
5233
5236
  }
5234
5237
  request['type'] = uppercaseType;
5235
- const stopPrice = this.safeNumber2(params, 'stopPrice', 'triggerPrice');
5236
- if (stopPrice !== undefined) {
5238
+ const triggerPrice = this.safeNumber2(params, 'stopPrice', 'triggerPrice');
5239
+ if (triggerPrice !== undefined) {
5237
5240
  if (uppercaseType === 'MARKET') {
5238
5241
  uppercaseType = 'STOP_LOSS';
5239
5242
  }
@@ -5244,7 +5247,7 @@ export default class binance extends Exchange {
5244
5247
  const validOrderTypes = this.safeList(market['info'], 'orderTypes');
5245
5248
  if (!this.inArray(uppercaseType, validOrderTypes)) {
5246
5249
  if (initialUppercaseType !== uppercaseType) {
5247
- throw new InvalidOrder(this.id + ' stopPrice parameter is not allowed for ' + symbol + ' ' + type + ' orders');
5250
+ throw new InvalidOrder(this.id + ' triggerPrice parameter is not allowed for ' + symbol + ' ' + type + ' orders');
5248
5251
  }
5249
5252
  else {
5250
5253
  throw new InvalidOrder(this.id + ' ' + type + ' is not a valid order type for the ' + symbol + ' market');
@@ -5265,7 +5268,7 @@ export default class binance extends Exchange {
5265
5268
  request['newOrderRespType'] = this.safeValue(this.options['newOrderRespType'], type, 'RESULT'); // 'ACK' for order id, 'RESULT' for full order or 'FULL' for order with fills
5266
5269
  let timeInForceIsRequired = false;
5267
5270
  let priceIsRequired = false;
5268
- let stopPriceIsRequired = false;
5271
+ let triggerPriceIsRequired = false;
5269
5272
  let quantityIsRequired = false;
5270
5273
  if (uppercaseType === 'MARKET') {
5271
5274
  const quoteOrderQty = this.safeBool(this.options, 'quoteOrderQty', true);
@@ -5295,12 +5298,12 @@ export default class binance extends Exchange {
5295
5298
  quantityIsRequired = true;
5296
5299
  }
5297
5300
  else if ((uppercaseType === 'STOP_LOSS') || (uppercaseType === 'TAKE_PROFIT')) {
5298
- stopPriceIsRequired = true;
5301
+ triggerPriceIsRequired = true;
5299
5302
  quantityIsRequired = true;
5300
5303
  }
5301
5304
  else if ((uppercaseType === 'STOP_LOSS_LIMIT') || (uppercaseType === 'TAKE_PROFIT_LIMIT')) {
5302
5305
  quantityIsRequired = true;
5303
- stopPriceIsRequired = true;
5306
+ triggerPriceIsRequired = true;
5304
5307
  priceIsRequired = true;
5305
5308
  timeInForceIsRequired = true;
5306
5309
  }
@@ -5320,12 +5323,12 @@ export default class binance extends Exchange {
5320
5323
  if (timeInForceIsRequired && (this.safeString(params, 'timeInForce') === undefined)) {
5321
5324
  request['timeInForce'] = this.options['defaultTimeInForce']; // 'GTC' = Good To Cancel (default), 'IOC' = Immediate Or Cancel
5322
5325
  }
5323
- if (stopPriceIsRequired) {
5324
- if (stopPrice === undefined) {
5325
- throw new InvalidOrder(this.id + ' editOrder() requires a stopPrice extra param for a ' + type + ' order');
5326
+ if (triggerPriceIsRequired) {
5327
+ if (triggerPrice === undefined) {
5328
+ throw new InvalidOrder(this.id + ' editOrder() requires a triggerPrice extra param for a ' + type + ' order');
5326
5329
  }
5327
5330
  else {
5328
- request['stopPrice'] = this.priceToPrecision(symbol, stopPrice);
5331
+ request['stopPrice'] = this.priceToPrecision(symbol, triggerPrice);
5329
5332
  }
5330
5333
  }
5331
5334
  request['cancelReplaceMode'] = 'STOP_ON_FAILURE'; // If the cancel request fails, the new order placement will not be attempted.
@@ -5989,7 +5992,7 @@ export default class binance extends Exchange {
5989
5992
  type = 'limit';
5990
5993
  }
5991
5994
  const stopPriceString = this.safeString(order, 'stopPrice');
5992
- const stopPrice = this.parseNumber(this.omitZero(stopPriceString));
5995
+ const triggerPrice = this.parseNumber(this.omitZero(stopPriceString));
5993
5996
  const feeCost = this.safeNumber(order, 'fee');
5994
5997
  let fee = undefined;
5995
5998
  if (feeCost !== undefined) {
@@ -6014,7 +6017,7 @@ export default class binance extends Exchange {
6014
6017
  'reduceOnly': this.safeBool(order, 'reduceOnly'),
6015
6018
  'side': side,
6016
6019
  'price': price,
6017
- 'triggerPrice': stopPrice,
6020
+ 'triggerPrice': triggerPrice,
6018
6021
  'amount': amount,
6019
6022
  'cost': cost,
6020
6023
  'average': average,
@@ -6333,7 +6336,7 @@ export default class binance extends Exchange {
6333
6336
  const validOrderTypes = this.safeList(market['info'], 'orderTypes');
6334
6337
  if (!this.inArray(uppercaseType, validOrderTypes)) {
6335
6338
  if (initialUppercaseType !== uppercaseType) {
6336
- throw new InvalidOrder(this.id + ' stopPrice parameter is not allowed for ' + symbol + ' ' + type + ' orders');
6339
+ throw new InvalidOrder(this.id + ' triggerPrice parameter is not allowed for ' + symbol + ' ' + type + ' orders');
6337
6340
  }
6338
6341
  else {
6339
6342
  throw new InvalidOrder(this.id + ' ' + type + ' is not a valid order type for the ' + symbol + ' market');
@@ -6388,7 +6391,7 @@ export default class binance extends Exchange {
6388
6391
  const closePosition = this.safeBool(params, 'closePosition', false);
6389
6392
  let timeInForceIsRequired = false;
6390
6393
  let priceIsRequired = false;
6391
- let stopPriceIsRequired = false;
6394
+ let triggerPriceIsRequired = false;
6392
6395
  let quantityIsRequired = false;
6393
6396
  //
6394
6397
  // spot/margin
@@ -6443,7 +6446,7 @@ export default class binance extends Exchange {
6443
6446
  quantityIsRequired = true;
6444
6447
  }
6445
6448
  else if ((uppercaseType === 'STOP_LOSS') || (uppercaseType === 'TAKE_PROFIT')) {
6446
- stopPriceIsRequired = true;
6449
+ triggerPriceIsRequired = true;
6447
6450
  quantityIsRequired = true;
6448
6451
  if (market['linear'] || market['inverse']) {
6449
6452
  priceIsRequired = true;
@@ -6451,7 +6454,7 @@ export default class binance extends Exchange {
6451
6454
  }
6452
6455
  else if ((uppercaseType === 'STOP_LOSS_LIMIT') || (uppercaseType === 'TAKE_PROFIT_LIMIT')) {
6453
6456
  quantityIsRequired = true;
6454
- stopPriceIsRequired = true;
6457
+ triggerPriceIsRequired = true;
6455
6458
  priceIsRequired = true;
6456
6459
  timeInForceIsRequired = true;
6457
6460
  }
@@ -6461,14 +6464,14 @@ export default class binance extends Exchange {
6461
6464
  }
6462
6465
  else if (uppercaseType === 'STOP') {
6463
6466
  quantityIsRequired = true;
6464
- stopPriceIsRequired = true;
6467
+ triggerPriceIsRequired = true;
6465
6468
  priceIsRequired = true;
6466
6469
  }
6467
6470
  else if ((uppercaseType === 'STOP_MARKET') || (uppercaseType === 'TAKE_PROFIT_MARKET')) {
6468
6471
  if (!closePosition) {
6469
6472
  quantityIsRequired = true;
6470
6473
  }
6471
- stopPriceIsRequired = true;
6474
+ triggerPriceIsRequired = true;
6472
6475
  }
6473
6476
  else if (uppercaseType === 'TRAILING_STOP_MARKET') {
6474
6477
  if (!closePosition) {
@@ -6507,16 +6510,16 @@ export default class binance extends Exchange {
6507
6510
  request['price'] = this.parseToNumeric(price); // some options don't have the precision available
6508
6511
  }
6509
6512
  }
6510
- if (stopPriceIsRequired) {
6513
+ if (triggerPriceIsRequired) {
6511
6514
  if (market['contract']) {
6512
6515
  if (stopPrice === undefined) {
6513
- throw new InvalidOrder(this.id + ' createOrder() requires a stopPrice extra param for a ' + type + ' order');
6516
+ throw new InvalidOrder(this.id + ' createOrder() requires a triggerPrice extra param for a ' + type + ' order');
6514
6517
  }
6515
6518
  }
6516
6519
  else {
6517
6520
  // check for delta price as well
6518
6521
  if (trailingDelta === undefined && stopPrice === undefined && trailingPercent === undefined) {
6519
- throw new InvalidOrder(this.id + ' createOrder() requires a stopPrice, trailingDelta or trailingPercent param for a ' + type + ' order');
6522
+ throw new InvalidOrder(this.id + ' createOrder() requires a triggerPrice, trailingDelta or trailingPercent param for a ' + type + ' order');
6520
6523
  }
6521
6524
  }
6522
6525
  if (stopPrice !== undefined) {
@@ -11640,7 +11643,7 @@ export default class binance extends Exchange {
11640
11643
  let paginate = false;
11641
11644
  [paginate, params] = this.handleOptionAndParams(params, 'fetchLedger', 'paginate');
11642
11645
  if (paginate) {
11643
- return await this.fetchPaginatedCallDynamic('fetchLedger', code, since, limit, params);
11646
+ return await this.fetchPaginatedCallDynamic('fetchLedger', code, since, limit, params, undefined, false);
11644
11647
  }
11645
11648
  let type = undefined;
11646
11649
  let subType = undefined;
@@ -12822,7 +12825,7 @@ export default class binance extends Exchange {
12822
12825
  // ...
12823
12826
  // ]
12824
12827
  //
12825
- return this.parseOpenInterests(response, market, since, limit);
12828
+ return this.parseOpenInterestsHistory(response, market, since, limit);
12826
12829
  }
12827
12830
  /**
12828
12831
  * @method
@@ -12891,7 +12894,7 @@ export default class binance extends Exchange {
12891
12894
  //
12892
12895
  if (market['option']) {
12893
12896
  symbol = market['symbol'];
12894
- const result = this.parseOpenInterests(response, market);
12897
+ const result = this.parseOpenInterestsHistory(response, market);
12895
12898
  for (let i = 0; i < result.length; i++) {
12896
12899
  const item = result[i];
12897
12900
  if (item['symbol'] === symbol) {
package/js/src/bingx.js CHANGED
@@ -51,6 +51,7 @@ export default class bingx extends Exchange {
51
51
  'createTrailingAmountOrder': true,
52
52
  'createTrailingPercentOrder': true,
53
53
  'createTriggerOrder': true,
54
+ 'editOrder': true,
54
55
  'fetchBalance': true,
55
56
  'fetchCanceledOrders': true,
56
57
  'fetchClosedOrders': true,
@@ -73,6 +74,7 @@ export default class bingx extends Exchange {
73
74
  'fetchMarkPrice': true,
74
75
  'fetchMarkPrices': true,
75
76
  'fetchMyLiquidations': true,
77
+ 'fetchMyTrades': true,
76
78
  'fetchOHLCV': true,
77
79
  'fetchOpenInterest': true,
78
80
  'fetchOpenOrders': true,
@@ -1040,7 +1042,7 @@ export default class bingx extends Exchange {
1040
1042
  };
1041
1043
  request['interval'] = this.safeString(this.timeframes, timeframe, timeframe);
1042
1044
  if (since !== undefined) {
1043
- request['startTime'] = since;
1045
+ request['startTime'] = Math.max(since - 1, 0);
1044
1046
  }
1045
1047
  if (limit !== undefined) {
1046
1048
  request['limit'] = limit;
@@ -5599,6 +5601,9 @@ export default class bingx extends Exchange {
5599
5601
  request['endTs'] = now;
5600
5602
  }
5601
5603
  if (market['spot']) {
5604
+ if (limit !== undefined) {
5605
+ request['limit'] = limit; // default 500, maximum 1000
5606
+ }
5602
5607
  response = await this.spotV1PrivateGetTradeMyTrades(this.extend(request, params));
5603
5608
  const data = this.safeDict(response, 'data', {});
5604
5609
  fills = this.safeList(data, 'fills', []);
@@ -1,5 +1,5 @@
1
1
  import Exchange from './abstract/bitfinex.js';
2
- import type { TransferEntry, Int, OrderSide, OrderType, Trade, OHLCV, Order, FundingRateHistory, OrderBook, Str, Transaction, Ticker, Balances, Tickers, Strings, Currency, Market, OpenInterest, Liquidation, OrderRequest, Num, MarginModification, Currencies, TradingFees, Dict, LedgerEntry, FundingRate, FundingRates, DepositAddress } from './base/types.js';
2
+ import type { TransferEntry, Int, OrderSide, OrderType, Trade, OHLCV, Order, FundingRateHistory, OrderBook, Str, Transaction, Ticker, Balances, Tickers, Strings, Currency, Market, OpenInterest, Liquidation, OrderRequest, Num, MarginModification, Currencies, TradingFees, Dict, LedgerEntry, FundingRate, FundingRates, DepositAddress, OpenInterests } from './base/types.js';
3
3
  /**
4
4
  * @class bitfinex
5
5
  * @augments Exchange
@@ -416,6 +416,16 @@ export default class bitfinex extends Exchange {
416
416
  previousFundingTimestamp: any;
417
417
  previousFundingDatetime: any;
418
418
  };
419
+ /**
420
+ * @method
421
+ * @name bitfinex#fetchOpenInterests
422
+ * @description Retrieves the open interest for a list of symbols
423
+ * @see https://docs.bitfinex.com/reference/rest-public-derivatives-status
424
+ * @param {string[]} [symbols] a list of unified CCXT market symbols
425
+ * @param {object} [params] exchange specific parameters
426
+ * @returns {object[]} a list of [open interest structures]{@link https://docs.ccxt.com/#/?id=open-interest-structure}
427
+ */
428
+ fetchOpenInterests(symbols?: Strings, params?: {}): Promise<OpenInterests>;
419
429
  /**
420
430
  * @method
421
431
  * @name bitfinex#fetchOpenInterest
@@ -85,6 +85,7 @@ export default class bitfinex extends Exchange {
85
85
  'fetchOHLCV': true,
86
86
  'fetchOpenInterest': true,
87
87
  'fetchOpenInterestHistory': true,
88
+ 'fetchOpenInterests': true,
88
89
  'fetchOpenOrder': true,
89
90
  'fetchOpenOrders': true,
90
91
  'fetchOrder': true,
@@ -404,6 +405,75 @@ export default class bitfinex extends Exchange {
404
405
  'TETHERUSE': 'ERC20',
405
406
  },
406
407
  },
408
+ 'features': {
409
+ 'default': {
410
+ 'sandbox': false,
411
+ 'createOrder': {
412
+ 'marginMode': true,
413
+ 'triggerPrice': true,
414
+ 'triggerPriceType': undefined,
415
+ 'triggerDirection': false,
416
+ 'stopLossPrice': true,
417
+ 'takeProfitPrice': true,
418
+ 'attachedStopLossTakeProfit': undefined,
419
+ 'timeInForce': {
420
+ 'IOC': true,
421
+ 'FOK': true,
422
+ 'PO': true,
423
+ 'GTD': false,
424
+ },
425
+ 'hedged': false,
426
+ 'trailing': true, // todo: unify
427
+ // todo: leverage unify
428
+ },
429
+ 'createOrders': {
430
+ 'max': 75,
431
+ },
432
+ 'fetchMyTrades': {
433
+ 'marginMode': false,
434
+ 'limit': 2500,
435
+ 'daysBack': undefined,
436
+ 'untilDays': 100000, // todo: implement
437
+ },
438
+ 'fetchOrder': {
439
+ 'marginMode': false,
440
+ 'trigger': false,
441
+ 'trailing': false,
442
+ },
443
+ 'fetchOpenOrders': {
444
+ 'marginMode': false,
445
+ 'limit': undefined,
446
+ 'trigger': false,
447
+ 'trailing': false,
448
+ },
449
+ 'fetchOrders': undefined,
450
+ 'fetchClosedOrders': {
451
+ 'marginMode': false,
452
+ 'limit': undefined,
453
+ 'daysBackClosed': undefined,
454
+ 'daysBackCanceled': undefined,
455
+ 'untilDays': 100000,
456
+ 'trigger': false,
457
+ 'trailing': false,
458
+ },
459
+ 'fetchOHLCV': {
460
+ 'limit': 10000,
461
+ },
462
+ },
463
+ 'spot': {
464
+ 'extends': 'default',
465
+ },
466
+ 'swap': {
467
+ 'linear': {
468
+ 'extends': 'default',
469
+ },
470
+ 'inverse': undefined,
471
+ },
472
+ 'future': {
473
+ 'linear': undefined,
474
+ 'inverse': undefined,
475
+ },
476
+ },
407
477
  'exceptions': {
408
478
  'exact': {
409
479
  '11010': RateLimitExceeded,
@@ -3248,6 +3318,59 @@ export default class bitfinex extends Exchange {
3248
3318
  'previousFundingDatetime': undefined,
3249
3319
  };
3250
3320
  }
3321
+ /**
3322
+ * @method
3323
+ * @name bitfinex#fetchOpenInterests
3324
+ * @description Retrieves the open interest for a list of symbols
3325
+ * @see https://docs.bitfinex.com/reference/rest-public-derivatives-status
3326
+ * @param {string[]} [symbols] a list of unified CCXT market symbols
3327
+ * @param {object} [params] exchange specific parameters
3328
+ * @returns {object[]} a list of [open interest structures]{@link https://docs.ccxt.com/#/?id=open-interest-structure}
3329
+ */
3330
+ async fetchOpenInterests(symbols = undefined, params = {}) {
3331
+ await this.loadMarkets();
3332
+ symbols = this.marketSymbols(symbols);
3333
+ let marketIds = ['ALL'];
3334
+ if (symbols !== undefined) {
3335
+ marketIds = this.marketIds(symbols);
3336
+ }
3337
+ const request = {
3338
+ 'keys': marketIds.join(','),
3339
+ };
3340
+ const response = await this.publicGetStatusDeriv(this.extend(request, params));
3341
+ //
3342
+ // [
3343
+ // [
3344
+ // "tXRPF0:USTF0", // market id
3345
+ // 1706256986000, // millisecond timestamp
3346
+ // null,
3347
+ // 0.512705, // derivative mid price
3348
+ // 0.512395, // underlying spot mid price
3349
+ // null,
3350
+ // 37671483.04, // insurance fund balance
3351
+ // null,
3352
+ // 1706284800000, // timestamp of next funding
3353
+ // 0.00002353, // accrued funding for next period
3354
+ // 317, // next funding step
3355
+ // null,
3356
+ // 0, // current funding
3357
+ // null,
3358
+ // null,
3359
+ // 0.5123016, // mark price
3360
+ // null,
3361
+ // null,
3362
+ // 2233562.03115, // open interest in contracts
3363
+ // null,
3364
+ // null,
3365
+ // null,
3366
+ // 0.0005, // average spread without funding payment
3367
+ // 0.0025 // funding payment cap
3368
+ // ]
3369
+ // ]
3370
+ //
3371
+ const result = this.parseOpenInterests(response);
3372
+ return this.filterByArray(result, 'symbol', symbols);
3373
+ }
3251
3374
  /**
3252
3375
  * @method
3253
3376
  * @name bitfinex#fetchOpenInterest
@@ -3359,7 +3482,7 @@ export default class bitfinex extends Exchange {
3359
3482
  // ],
3360
3483
  // ]
3361
3484
  //
3362
- return this.parseOpenInterests(response, market, since, limit);
3485
+ return this.parseOpenInterestsHistory(response, market, since, limit);
3363
3486
  }
3364
3487
  parseOpenInterest(interest, market = undefined) {
3365
3488
  //