ccxt 4.4.96__py2.py3-none-any.whl → 4.4.97__py2.py3-none-any.whl

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 (58) hide show
  1. ccxt/__init__.py +1 -1
  2. ccxt/abstract/binance.py +3 -0
  3. ccxt/abstract/binancecoinm.py +3 -0
  4. ccxt/abstract/binanceus.py +3 -0
  5. ccxt/abstract/binanceusdm.py +3 -0
  6. ccxt/abstract/phemex.py +1 -0
  7. ccxt/async_support/__init__.py +1 -1
  8. ccxt/async_support/base/exchange.py +6 -3
  9. ccxt/async_support/binance.py +90 -34
  10. ccxt/async_support/binancecoinm.py +5 -1
  11. ccxt/async_support/binanceus.py +3 -1
  12. ccxt/async_support/binanceusdm.py +3 -1
  13. ccxt/async_support/bingx.py +1 -1
  14. ccxt/async_support/cryptocom.py +76 -2
  15. ccxt/async_support/exmo.py +1 -1
  16. ccxt/async_support/foxbit.py +1 -1
  17. ccxt/async_support/gate.py +1 -2
  18. ccxt/async_support/hashkey.py +39 -0
  19. ccxt/async_support/hyperliquid.py +40 -25
  20. ccxt/async_support/independentreserve.py +35 -0
  21. ccxt/async_support/indodax.py +34 -0
  22. ccxt/async_support/kucoin.py +2 -1
  23. ccxt/async_support/latoken.py +42 -0
  24. ccxt/async_support/luno.py +36 -0
  25. ccxt/async_support/mercado.py +34 -0
  26. ccxt/async_support/mexc.py +3 -19
  27. ccxt/async_support/phemex.py +36 -31
  28. ccxt/base/decimal_to_precision.py +16 -10
  29. ccxt/base/exchange.py +55 -15
  30. ccxt/binance.py +90 -34
  31. ccxt/binancecoinm.py +5 -1
  32. ccxt/binanceus.py +3 -1
  33. ccxt/binanceusdm.py +3 -1
  34. ccxt/bingx.py +1 -1
  35. ccxt/cryptocom.py +76 -2
  36. ccxt/exmo.py +1 -1
  37. ccxt/foxbit.py +1 -1
  38. ccxt/gate.py +1 -2
  39. ccxt/hashkey.py +39 -0
  40. ccxt/hyperliquid.py +40 -25
  41. ccxt/independentreserve.py +35 -0
  42. ccxt/indodax.py +34 -0
  43. ccxt/kucoin.py +2 -1
  44. ccxt/latoken.py +42 -0
  45. ccxt/luno.py +36 -0
  46. ccxt/mercado.py +34 -0
  47. ccxt/mexc.py +3 -19
  48. ccxt/phemex.py +36 -31
  49. ccxt/pro/__init__.py +1 -1
  50. ccxt/pro/binancecoinm.py +3 -1
  51. ccxt/pro/binanceus.py +3 -1
  52. ccxt/pro/binanceusdm.py +3 -1
  53. ccxt/pro/bybit.py +33 -1
  54. {ccxt-4.4.96.dist-info → ccxt-4.4.97.dist-info}/METADATA +16 -16
  55. {ccxt-4.4.96.dist-info → ccxt-4.4.97.dist-info}/RECORD +58 -58
  56. {ccxt-4.4.96.dist-info → ccxt-4.4.97.dist-info}/LICENSE.txt +0 -0
  57. {ccxt-4.4.96.dist-info → ccxt-4.4.97.dist-info}/WHEEL +0 -0
  58. {ccxt-4.4.96.dist-info → ccxt-4.4.97.dist-info}/top_level.txt +0 -0
ccxt/phemex.py CHANGED
@@ -281,6 +281,7 @@ class phemex(Exchange, ImplicitAPI):
281
281
  # swap
282
282
  'orders/replace': 1, # ?symbol=<symbol>&orderID=<orderID>&origClOrdID=<origClOrdID>&clOrdID=<clOrdID>&price=<price>&priceEp=<priceEp>&orderQty=<orderQty>&stopPx=<stopPx>&stopPxEp=<stopPxEp>&takeProfit=<takeProfit>&takeProfitEp=<takeProfitEp>&stopLoss=<stopLoss>&stopLossEp=<stopLossEp>&pegOffsetValueEp=<pegOffsetValueEp>&pegPriceType=<pegPriceType>
283
283
  'g-orders/replace': 1, # ?symbol=<symbol>&orderID=<orderID>&origClOrdID=<origClOrdID>&clOrdID=<clOrdID>&price=<price>&priceEp=<priceEp>&orderQty=<orderQty>&stopPx=<stopPx>&stopPxEp=<stopPxEp>&takeProfit=<takeProfit>&takeProfitEp=<takeProfitEp>&stopLoss=<stopLoss>&stopLossEp=<stopLossEp>&pegOffsetValueEp=<pegOffsetValueEp>&pegPriceType=<pegPriceType>
284
+ 'g-orders/create': 1,
284
285
  'positions/leverage': 5, # ?symbol=<symbol>&leverage=<leverage>&leverageEr=<leverageEr>
285
286
  'g-positions/leverage': 5, # ?symbol=<symbol>&leverage=<leverage>&leverageEr=<leverageEr>
286
287
  'g-positions/switch-pos-mode-sync': 5, # ?symbol=<symbol>&targetPosMode=<targetPosMode>
@@ -1218,7 +1219,8 @@ class phemex(Exchange, ImplicitAPI):
1218
1219
  # 'id': 123456789, # optional request id
1219
1220
  }
1220
1221
  response = None
1221
- if market['linear'] and market['settle'] == 'USDT':
1222
+ isStableSettled = (market['settle'] == 'USDT') or (market['settle'] == 'USDC')
1223
+ if market['linear'] and isStableSettled:
1222
1224
  response = self.v2GetMdV2Orderbook(self.extend(request, params))
1223
1225
  else:
1224
1226
  if (limit is not None) and (limit <= 30):
@@ -1350,7 +1352,8 @@ class phemex(Exchange, ImplicitAPI):
1350
1352
  }
1351
1353
  until = self.safe_integer_2(params, 'until', 'to')
1352
1354
  params = self.omit(params, ['until'])
1353
- usesSpecialFromToEndpoint = ((market['linear'] or market['settle'] == 'USDT')) and ((since is not None) or (until is not None))
1355
+ isStableSettled = (market['settle'] == 'USDT') or (market['settle'] == 'USDC')
1356
+ usesSpecialFromToEndpoint = ((market['linear'] or isStableSettled)) and ((since is not None) or (until is not None))
1354
1357
  maxLimit = 1000
1355
1358
  if usesSpecialFromToEndpoint:
1356
1359
  maxLimit = 2000
@@ -1358,7 +1361,7 @@ class phemex(Exchange, ImplicitAPI):
1358
1361
  limit = maxLimit
1359
1362
  request['limit'] = min(limit, maxLimit)
1360
1363
  response = None
1361
- if market['linear'] or market['settle'] == 'USDT':
1364
+ if market['linear'] or isStableSettled:
1362
1365
  if (until is not None) or (since is not None):
1363
1366
  candleDuration = self.parse_timeframe(timeframe)
1364
1367
  if since is not None:
@@ -1614,7 +1617,8 @@ class phemex(Exchange, ImplicitAPI):
1614
1617
  # 'id': 123456789, # optional request id
1615
1618
  }
1616
1619
  response = None
1617
- if market['linear'] and market['settle'] == 'USDT':
1620
+ isStableSettled = (market['settle'] == 'USDT') or (market['settle'] == 'USDC')
1621
+ if market['linear'] and isStableSettled:
1618
1622
  response = self.v2GetMdV2Trade(self.extend(request, params))
1619
1623
  else:
1620
1624
  response = self.v1GetMdTrade(self.extend(request, params))
@@ -1853,7 +1857,7 @@ class phemex(Exchange, ImplicitAPI):
1853
1857
  timestamp = self.safe_integer(trade, 'createdAt')
1854
1858
  id = self.safe_string_2(trade, 'execId', 'execID')
1855
1859
  orderId = self.safe_string(trade, 'orderID')
1856
- if market['settle'] == 'USDT':
1860
+ if market['settle'] == 'USDT' or market['settle'] == 'USDC':
1857
1861
  sideId = self.safe_string_lower(trade, 'side')
1858
1862
  if (sideId == 'buy') or (sideId == 'sell'):
1859
1863
  side = sideId
@@ -2589,6 +2593,7 @@ class phemex(Exchange, ImplicitAPI):
2589
2593
  stopLossDefined = (stopLoss is not None)
2590
2594
  takeProfit = self.safe_value(params, 'takeProfit')
2591
2595
  takeProfitDefined = (takeProfit is not None)
2596
+ isStableSettled = (market['settle'] == 'USDT') or (market['settle'] == 'USDC')
2592
2597
  if clientOrderId is None:
2593
2598
  brokerId = self.safe_string(self.options, 'brokerId', 'CCXT123456')
2594
2599
  if brokerId is not None:
@@ -2598,7 +2603,7 @@ class phemex(Exchange, ImplicitAPI):
2598
2603
  params = self.omit(params, ['clOrdID', 'clientOrderId'])
2599
2604
  triggerPrice = self.safe_string_n(params, ['stopPx', 'stopPrice', 'triggerPrice'])
2600
2605
  if triggerPrice is not None:
2601
- if market['settle'] == 'USDT':
2606
+ if isStableSettled:
2602
2607
  request['stopPxRp'] = self.price_to_precision(symbol, triggerPrice)
2603
2608
  else:
2604
2609
  request['stopPxEp'] = self.to_ep(triggerPrice, market)
@@ -2647,7 +2652,7 @@ class phemex(Exchange, ImplicitAPI):
2647
2652
  posSide = 'Merged'
2648
2653
  posSide = self.capitalize(posSide)
2649
2654
  request['posSide'] = posSide
2650
- if market['settle'] == 'USDT':
2655
+ if isStableSettled:
2651
2656
  request['orderQtyRq'] = amount
2652
2657
  else:
2653
2658
  request['orderQty'] = self.parse_to_int(amount)
@@ -2675,7 +2680,7 @@ class phemex(Exchange, ImplicitAPI):
2675
2680
  stopLossTriggerPrice = self.safe_value_2(stopLoss, 'triggerPrice', 'stopPrice')
2676
2681
  if stopLossTriggerPrice is None:
2677
2682
  raise InvalidOrder(self.id + ' createOrder() requires a trigger price in params["stopLoss"]["triggerPrice"] for a stop loss order')
2678
- if market['settle'] == 'USDT':
2683
+ if isStableSettled:
2679
2684
  request['stopLossRp'] = self.price_to_precision(symbol, stopLossTriggerPrice)
2680
2685
  else:
2681
2686
  request['stopLossEp'] = self.to_ep(stopLossTriggerPrice, market)
@@ -2689,7 +2694,7 @@ class phemex(Exchange, ImplicitAPI):
2689
2694
  takeProfitTriggerPrice = self.safe_value_2(takeProfit, 'triggerPrice', 'stopPrice')
2690
2695
  if takeProfitTriggerPrice is None:
2691
2696
  raise InvalidOrder(self.id + ' createOrder() requires a trigger price in params["takeProfit"]["triggerPrice"] for a take profit order')
2692
- if market['settle'] == 'USDT':
2697
+ if isStableSettled:
2693
2698
  request['takeProfitRp'] = self.price_to_precision(symbol, takeProfitTriggerPrice)
2694
2699
  else:
2695
2700
  request['takeProfitEp'] = self.to_ep(takeProfitTriggerPrice, market)
@@ -2700,27 +2705,27 @@ class phemex(Exchange, ImplicitAPI):
2700
2705
  if tpLimitPrice is not None:
2701
2706
  request['tpPxRp'] = self.price_to_precision(symbol, tpLimitPrice)
2702
2707
  if (type == 'Limit') or (type == 'StopLimit') or (type == 'LimitIfTouched'):
2703
- if market['settle'] == 'USDT':
2708
+ if isStableSettled:
2704
2709
  request['priceRp'] = self.price_to_precision(symbol, price)
2705
2710
  else:
2706
2711
  priceString = self.number_to_string(price)
2707
2712
  request['priceEp'] = self.to_ep(priceString, market)
2708
2713
  takeProfitPrice = self.safe_string(params, 'takeProfitPrice')
2709
2714
  if takeProfitPrice is not None:
2710
- if market['settle'] == 'USDT':
2715
+ if isStableSettled:
2711
2716
  request['takeProfitRp'] = self.price_to_precision(symbol, takeProfitPrice)
2712
2717
  else:
2713
2718
  request['takeProfitEp'] = self.to_ep(takeProfitPrice, market)
2714
2719
  params = self.omit(params, 'takeProfitPrice')
2715
2720
  stopLossPrice = self.safe_string(params, 'stopLossPrice')
2716
2721
  if stopLossPrice is not None:
2717
- if market['settle'] == 'USDT':
2722
+ if isStableSettled:
2718
2723
  request['stopLossRp'] = self.price_to_precision(symbol, stopLossPrice)
2719
2724
  else:
2720
2725
  request['stopLossEp'] = self.to_ep(stopLossPrice, market)
2721
2726
  params = self.omit(params, 'stopLossPrice')
2722
2727
  response = None
2723
- if market['settle'] == 'USDT':
2728
+ if isStableSettled:
2724
2729
  response = self.privatePostGOrders(self.extend(request, params))
2725
2730
  elif market['contract']:
2726
2731
  response = self.privatePostOrders(self.extend(request, params))
@@ -2828,13 +2833,13 @@ class phemex(Exchange, ImplicitAPI):
2828
2833
  }
2829
2834
  clientOrderId = self.safe_string_2(params, 'clientOrderId', 'clOrdID')
2830
2835
  params = self.omit(params, ['clientOrderId', 'clOrdID'])
2831
- isUSDTSettled = (market['settle'] == 'USDT')
2836
+ isStableSettled = (market['settle'] == 'USDT') or (market['settle'] == 'USDC')
2832
2837
  if clientOrderId is not None:
2833
2838
  request['clOrdID'] = clientOrderId
2834
2839
  else:
2835
2840
  request['orderID'] = id
2836
2841
  if price is not None:
2837
- if isUSDTSettled:
2842
+ if isStableSettled:
2838
2843
  request['priceRp'] = self.price_to_precision(market['symbol'], price)
2839
2844
  else:
2840
2845
  request['priceEp'] = self.to_ep(price, market)
@@ -2844,19 +2849,19 @@ class phemex(Exchange, ImplicitAPI):
2844
2849
  if finalQty is not None:
2845
2850
  request['baseQtyEV'] = finalQty
2846
2851
  elif amount is not None:
2847
- if isUSDTSettled:
2852
+ if isStableSettled:
2848
2853
  request['orderQtyRq'] = self.amount_to_precision(market['symbol'], amount)
2849
2854
  else:
2850
2855
  request['baseQtyEV'] = self.to_ev(amount, market)
2851
2856
  triggerPrice = self.safe_string_n(params, ['triggerPrice', 'stopPx', 'stopPrice'])
2852
2857
  if triggerPrice is not None:
2853
- if isUSDTSettled:
2858
+ if isStableSettled:
2854
2859
  request['stopPxRp'] = self.price_to_precision(symbol, triggerPrice)
2855
2860
  else:
2856
2861
  request['stopPxEp'] = self.to_ep(triggerPrice, market)
2857
2862
  params = self.omit(params, ['triggerPrice', 'stopPx', 'stopPrice'])
2858
2863
  response = None
2859
- if isUSDTSettled:
2864
+ if isStableSettled:
2860
2865
  posSide = self.safe_string(params, 'posSide')
2861
2866
  if posSide is None:
2862
2867
  request['posSide'] = 'Merged'
@@ -2894,7 +2899,7 @@ class phemex(Exchange, ImplicitAPI):
2894
2899
  else:
2895
2900
  request['orderID'] = id
2896
2901
  response = None
2897
- if market['settle'] == 'USDT':
2902
+ if market['settle'] == 'USDT' or market['settle'] == 'USDC':
2898
2903
  posSide = self.safe_string(params, 'posSide')
2899
2904
  if posSide is None:
2900
2905
  request['posSide'] = 'Merged'
@@ -2930,7 +2935,7 @@ class phemex(Exchange, ImplicitAPI):
2930
2935
  if trigger:
2931
2936
  request['untriggerred'] = trigger
2932
2937
  response = None
2933
- if market['settle'] == 'USDT':
2938
+ if market['settle'] == 'USDT' or market['settle'] == 'USDC':
2934
2939
  response = self.privateDeleteGOrdersAll(self.extend(request, params))
2935
2940
  #
2936
2941
  # {
@@ -2990,7 +2995,7 @@ class phemex(Exchange, ImplicitAPI):
2990
2995
  else:
2991
2996
  request['orderID'] = id
2992
2997
  response = None
2993
- if market['settle'] == 'USDT':
2998
+ if market['settle'] == 'USDT' or market['settle'] == 'USDC':
2994
2999
  response = self.privateGetApiDataGFuturesOrdersByOrderId(self.extend(request, params))
2995
3000
  elif market['spot']:
2996
3001
  response = self.privateGetApiDataSpotsOrdersByOrderId(self.extend(request, params))
@@ -3035,7 +3040,7 @@ class phemex(Exchange, ImplicitAPI):
3035
3040
  if limit is not None:
3036
3041
  request['limit'] = limit
3037
3042
  response = None
3038
- if market['settle'] == 'USDT':
3043
+ if market['settle'] == 'USDT' or market['settle'] == 'USDC':
3039
3044
  request['currency'] = market['settle']
3040
3045
  response = self.privateGetExchangeOrderV2OrderList(self.extend(request, params))
3041
3046
  elif market['swap']:
@@ -3070,7 +3075,7 @@ class phemex(Exchange, ImplicitAPI):
3070
3075
  }
3071
3076
  response = None
3072
3077
  try:
3073
- if market['settle'] == 'USDT':
3078
+ if market['settle'] == 'USDT' or market['settle'] == 'USDC':
3074
3079
  response = self.privateGetGOrdersActiveList(self.extend(request, params))
3075
3080
  elif market['swap']:
3076
3081
  response = self.privateGetOrdersActiveList(self.extend(request, params))
@@ -3875,8 +3880,8 @@ class phemex(Exchange, ImplicitAPI):
3875
3880
  raise BadRequest(self.id + ' fetchFundingHistory() limit argument cannot exceed 200')
3876
3881
  request['limit'] = limit
3877
3882
  response = None
3878
- isUsdt = market['settle'] == 'USDT'
3879
- if isUsdt:
3883
+ isStableSettled = market['settle'] == 'USDT' or market['settle'] == 'USDC'
3884
+ if isStableSettled:
3880
3885
  response = self.privateGetApiDataGFuturesFundingFees(self.extend(request, params))
3881
3886
  else:
3882
3887
  response = self.privateGetApiDataFuturesFundingFees(self.extend(request, params))
@@ -3925,8 +3930,8 @@ class phemex(Exchange, ImplicitAPI):
3925
3930
  if value is None or currencyCode is None:
3926
3931
  return value
3927
3932
  # it was confirmed by phemex support, that USDT contracts use direct amounts in funding fees, while USD & INVERSE needs 'valueScale'
3928
- isUsdt = market['settle'] == 'USDT'
3929
- if not isUsdt:
3933
+ isStableSettled = market['settle'] == 'USDT' or market['settle'] == 'USDC'
3934
+ if not isStableSettled:
3930
3935
  currency = self.safe_currency(currencyCode)
3931
3936
  scale = self.safe_string(currency['info'], 'valueScale')
3932
3937
  tickPrecision = self.parse_precision(scale)
@@ -4118,8 +4123,8 @@ class phemex(Exchange, ImplicitAPI):
4118
4123
  raise ArgumentsRequired(self.id + ' setMarginMode() requires a symbol argument')
4119
4124
  self.load_markets()
4120
4125
  market = self.market(symbol)
4121
- if not market['swap'] or market['settle'] == 'USDT':
4122
- raise BadSymbol(self.id + ' setMarginMode() supports swap(non USDT based) contracts only')
4126
+ if not market['swap'] or market['settle'] == 'USDT' or market['settle'] == 'USDC':
4127
+ raise BadSymbol(self.id + ' setMarginMode() supports swap(non USDT/USDC based) contracts only')
4123
4128
  marginMode = marginMode.lower()
4124
4129
  if marginMode != 'isolated' and marginMode != 'cross':
4125
4130
  raise BadRequest(self.id + ' setMarginMode() marginMode argument should be isolated or cross')
@@ -4355,7 +4360,7 @@ class phemex(Exchange, ImplicitAPI):
4355
4360
  'symbol': market['id'],
4356
4361
  }
4357
4362
  response = None
4358
- if market['settle'] == 'USDT':
4363
+ if market['settle'] == 'USDT' or market['settle'] == 'USDC':
4359
4364
  if not isHedged and longLeverageRr is None and shortLeverageRr is None:
4360
4365
  request['leverageRr'] = leverage
4361
4366
  else:
@@ -4578,7 +4583,7 @@ class phemex(Exchange, ImplicitAPI):
4578
4583
  raise ArgumentsRequired(self.id + ' fetchFundingRateHistory() requires a symbol argument')
4579
4584
  self.load_markets()
4580
4585
  market = self.market(symbol)
4581
- isUsdtSettled = market['settle'] == 'USDT'
4586
+ isUsdtSettled = market['settle'] == 'USDT' or market['settle'] == 'USDC'
4582
4587
  if not market['swap']:
4583
4588
  raise BadRequest(self.id + ' fetchFundingRateHistory() supports swap contracts only')
4584
4589
  paginate = False
ccxt/pro/__init__.py CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  # ----------------------------------------------------------------------------
6
6
 
7
- __version__ = '4.4.96'
7
+ __version__ = '4.4.97'
8
8
 
9
9
  # ----------------------------------------------------------------------------
10
10
 
ccxt/pro/binancecoinm.py CHANGED
@@ -24,7 +24,9 @@ class binancecoinm(binance):
24
24
  'doc': 'https://developers.binance.com/en',
25
25
  },
26
26
  'options': {
27
- 'fetchMarkets': ['inverse'],
27
+ 'fetchMarkets': {
28
+ 'types': ['inverse'],
29
+ },
28
30
  'defaultSubType': 'inverse',
29
31
  },
30
32
  })
ccxt/pro/binanceus.py CHANGED
@@ -45,6 +45,8 @@ class binanceus(binance):
45
45
  'fetchCurrencies': False,
46
46
  'quoteOrderQty': False,
47
47
  'defaultType': 'spot',
48
- 'fetchMarkets': ['spot'],
48
+ 'fetchMarkets': {
49
+ 'types': ['spot'],
50
+ },
49
51
  },
50
52
  })
ccxt/pro/binanceusdm.py CHANGED
@@ -19,7 +19,9 @@ class binanceusdm(binance):
19
19
  'doc': 'https://developers.binance.com/en',
20
20
  },
21
21
  'options': {
22
- 'fetchMarkets': ['linear'],
22
+ 'fetchMarkets': {
23
+ 'types': ['linear'],
24
+ },
23
25
  'defaultSubType': 'linear',
24
26
  },
25
27
  # https://binance-docs.github.io/apidocs/futures/en/#error-codes
ccxt/pro/bybit.py CHANGED
@@ -49,6 +49,17 @@ class bybit(ccxt.async_support.bybit):
49
49
  'watchTrades': True,
50
50
  'watchPositions': True,
51
51
  'watchTradesForSymbols': True,
52
+ 'unWatchTicker': True,
53
+ 'unWatchTickers': True,
54
+ 'unWatchOHLCV': True,
55
+ 'unWatchOHLCVForSymbols': True,
56
+ 'unWatchOrderBook': True,
57
+ 'unWatchOrderBookForSymbols': True,
58
+ 'unWatchTrades': True,
59
+ 'unWatchTradesForSymbols': True,
60
+ 'unWatchMyTrades': True,
61
+ 'unWatchOrders': True,
62
+ 'unWatchPositions': True,
52
63
  },
53
64
  'urls': {
54
65
  'api': {
@@ -1484,6 +1495,27 @@ class bybit(ccxt.async_support.bybit):
1484
1495
  client.resolve(positions, messageHash)
1485
1496
  client.resolve(newPositions, 'positions')
1486
1497
 
1498
+ async def un_watch_positions(self, symbols: Strings = None, params={}) -> Any:
1499
+ """
1500
+ unWatches all open positions
1501
+
1502
+ https://bybit-exchange.github.io/docs/v5/websocket/private/position
1503
+
1504
+ :param str[] [symbols]: list of unified market symbols
1505
+ :param dict [params]: extra parameters specific to the exchange API endpoint
1506
+ :returns dict: status of the unwatch request
1507
+ """
1508
+ await self.load_markets()
1509
+ method = 'watchPositions'
1510
+ messageHash = 'unsubscribe:positions'
1511
+ subHash = 'positions'
1512
+ if not self.is_empty(symbols):
1513
+ raise NotSupported(self.id + ' unWatchPositions() does not support a symbol parameter, you must unwatch all orders')
1514
+ url = await self.get_url_by_market_type(None, True, method, params)
1515
+ await self.authenticate(url)
1516
+ topics = ['position']
1517
+ return await self.un_watch_topics(url, 'positions', symbols, [messageHash], [subHash], topics, params)
1518
+
1487
1519
  async def watch_liquidations(self, symbol: str, since: Int = None, limit: Int = None, params={}) -> List[Liquidation]:
1488
1520
  """
1489
1521
  watch the public liquidations of a trading pair
@@ -2083,7 +2115,7 @@ class bybit(ccxt.async_support.bybit):
2083
2115
  message = self.extend(request, params)
2084
2116
  return await self.watch_multiple(url, messageHashes, message, messageHashes)
2085
2117
 
2086
- async def un_watch_topics(self, url: str, topic: str, symbols: List[str], messageHashes: List[str], subMessageHashes: List[str], topics, params={}, subExtension={}):
2118
+ async def un_watch_topics(self, url: str, topic: str, symbols: Strings, messageHashes: List[str], subMessageHashes: List[str], topics, params={}, subExtension={}):
2087
2119
  reqId = self.request_id()
2088
2120
  request: dict = {
2089
2121
  'op': 'unsubscribe',
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ccxt
3
- Version: 4.4.96
3
+ Version: 4.4.97
4
4
  Summary: A JavaScript / TypeScript / Python / C# / PHP cryptocurrency trading library with support for 100+ exchanges
5
5
  Home-page: https://ccxt.com
6
6
  Author: Igor Kroitor
@@ -80,23 +80,23 @@ Current feature list:
80
80
  |logo |id |name |ver |type |certified |pro |discount |
81
81
  |-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------------|-----------------------------------------------------------------------------------------|:--------------------------------------------------------------------------------------------------------------------------------:|--------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------|:----------------------------------------------------------------------------:|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
82
82
  | [![binance](https://github.com/user-attachments/assets/e9419b93-ccb0-46aa-9bff-c883f096274b)](https://accounts.binance.com/en/register?ref=D7YA7CLY) | binance | [Binance](https://accounts.binance.com/en/register?ref=D7YA7CLY) | [![API Version *](https://img.shields.io/badge/*-lightgray)](https://developers.binance.com/en) | ![CEX – Centralized EXchange](https://img.shields.io/badge/CEX-green.svg "CEX – Centralized EXchange") | [![CCXT Certified](https://img.shields.io/badge/CCXT-Certified-green.svg)](https://github.com/ccxt/ccxt/wiki/Certification) | [![CCXT Pro](https://img.shields.io/badge/CCXT-Pro-black)](https://ccxt.pro) | [![Sign up with Binance using CCXT's referral link for a 10% discount!](https://img.shields.io/static/v1?label=Fee&message=%2d10%25&color=orange)](https://accounts.binance.com/en/register?ref=D7YA7CLY) |
83
- | [![binancecoinm](https://github.com/user-attachments/assets/387cfc4e-5f33-48cd-8f5c-cd4854dabf0c)](https://accounts.binance.com/en/register?ref=D7YA7CLY) | binancecoinm | [Binance COIN-M](https://accounts.binance.com/en/register?ref=D7YA7CLY) | [![API Version *](https://img.shields.io/badge/*-lightgray)](https://binance-docs.github.io/apidocs/delivery/en/) | ![CEX – Centralized EXchange](https://img.shields.io/badge/CEX-green.svg "CEX – Centralized EXchange") | [![CCXT Certified](https://img.shields.io/badge/CCXT-Certified-green.svg)](https://github.com/ccxt/ccxt/wiki/Certification) | [![CCXT Pro](https://img.shields.io/badge/CCXT-Pro-black)](https://ccxt.pro) | [![Sign up with Binance COIN-M using CCXT's referral link for a 10% discount!](https://img.shields.io/static/v1?label=Fee&message=%2d10%25&color=orange)](https://accounts.binance.com/en/register?ref=D7YA7CLY) |
84
83
  | [![binanceusdm](https://github.com/user-attachments/assets/871cbea7-eebb-4b28-b260-c1c91df0487a)](https://accounts.binance.com/en/register?ref=D7YA7CLY) | binanceusdm | [Binance USDⓈ-M](https://accounts.binance.com/en/register?ref=D7YA7CLY) | [![API Version *](https://img.shields.io/badge/*-lightgray)](https://binance-docs.github.io/apidocs/futures/en/) | ![CEX – Centralized EXchange](https://img.shields.io/badge/CEX-green.svg "CEX – Centralized EXchange") | [![CCXT Certified](https://img.shields.io/badge/CCXT-Certified-green.svg)](https://github.com/ccxt/ccxt/wiki/Certification) | [![CCXT Pro](https://img.shields.io/badge/CCXT-Pro-black)](https://ccxt.pro) | [![Sign up with Binance USDⓈ-M using CCXT's referral link for a 10% discount!](https://img.shields.io/static/v1?label=Fee&message=%2d10%25&color=orange)](https://accounts.binance.com/en/register?ref=D7YA7CLY) |
85
- | [![bingx](https://github-production-user-asset-6210df.s3.amazonaws.com/1294454/253675376-6983b72e-4999-4549-b177-33b374c195e3.jpg)](https://bingx.com/invite/OHETOM) | bingx | [BingX](https://bingx.com/invite/OHETOM) | [![API Version 1](https://img.shields.io/badge/1-lightgray)](https://bingx-api.github.io/docs/) | ![CEX – Centralized EXchange](https://img.shields.io/badge/CEX-green.svg "CEX – Centralized EXchange") | [![CCXT Certified](https://img.shields.io/badge/CCXT-Certified-green.svg)](https://github.com/ccxt/ccxt/wiki/Certification) | [![CCXT Pro](https://img.shields.io/badge/CCXT-Pro-black)](https://ccxt.pro) | |
86
- | [![bitget](https://github.com/user-attachments/assets/fbaa10cc-a277-441d-a5b7-997dd9a87658)](https://www.bitget.com/expressly?languageType=0&channelCode=ccxt&vipCode=tg9j) | bitget | [Bitget](https://www.bitget.com/expressly?languageType=0&channelCode=ccxt&vipCode=tg9j) | [![API Version 2](https://img.shields.io/badge/2-lightgray)](https://www.bitget.com/api-doc/common/intro) | ![CEX – Centralized EXchange](https://img.shields.io/badge/CEX-green.svg "CEX – Centralized EXchange") | [![CCXT Certified](https://img.shields.io/badge/CCXT-Certified-green.svg)](https://github.com/ccxt/ccxt/wiki/Certification) | [![CCXT Pro](https://img.shields.io/badge/CCXT-Pro-black)](https://ccxt.pro) | |
87
- | [![bitmart](https://github.com/user-attachments/assets/0623e9c4-f50e-48c9-82bd-65c3908c3a14)](http://www.bitmart.com/?r=rQCFLh) | bitmart | [BitMart](http://www.bitmart.com/?r=rQCFLh) | [![API Version 2](https://img.shields.io/badge/2-lightgray)](https://developer-pro.bitmart.com/) | ![CEX – Centralized EXchange](https://img.shields.io/badge/CEX-green.svg "CEX – Centralized EXchange") | [![CCXT Certified](https://img.shields.io/badge/CCXT-Certified-green.svg)](https://github.com/ccxt/ccxt/wiki/Certification) | [![CCXT Pro](https://img.shields.io/badge/CCXT-Pro-black)](https://ccxt.pro) | [![Sign up with BitMart using CCXT's referral link for a 30% discount!](https://img.shields.io/static/v1?label=Fee&message=%2d30%25&color=orange)](http://www.bitmart.com/?r=rQCFLh) |
88
- | [![bitmex](https://github.com/user-attachments/assets/c78425ab-78d5-49d6-bd14-db7734798f04)](https://www.bitmex.com/app/register/NZTR1q) | bitmex | [BitMEX](https://www.bitmex.com/app/register/NZTR1q) | [![API Version 1](https://img.shields.io/badge/1-lightgray)](https://www.bitmex.com/app/apiOverview) | ![CEX – Centralized EXchange](https://img.shields.io/badge/CEX-green.svg "CEX – Centralized EXchange") | [![CCXT Certified](https://img.shields.io/badge/CCXT-Certified-green.svg)](https://github.com/ccxt/ccxt/wiki/Certification) | [![CCXT Pro](https://img.shields.io/badge/CCXT-Pro-black)](https://ccxt.pro) | [![Sign up with BitMEX using CCXT's referral link for a 10% discount!](https://img.shields.io/static/v1?label=Fee&message=%2d10%25&color=orange)](https://www.bitmex.com/app/register/NZTR1q) |
84
+ | [![binancecoinm](https://github.com/user-attachments/assets/387cfc4e-5f33-48cd-8f5c-cd4854dabf0c)](https://accounts.binance.com/en/register?ref=D7YA7CLY) | binancecoinm | [Binance COIN-M](https://accounts.binance.com/en/register?ref=D7YA7CLY) | [![API Version *](https://img.shields.io/badge/*-lightgray)](https://binance-docs.github.io/apidocs/delivery/en/) | ![CEX – Centralized EXchange](https://img.shields.io/badge/CEX-green.svg "CEX – Centralized EXchange") | [![CCXT Certified](https://img.shields.io/badge/CCXT-Certified-green.svg)](https://github.com/ccxt/ccxt/wiki/Certification) | [![CCXT Pro](https://img.shields.io/badge/CCXT-Pro-black)](https://ccxt.pro) | [![Sign up with Binance COIN-M using CCXT's referral link for a 10% discount!](https://img.shields.io/static/v1?label=Fee&message=%2d10%25&color=orange)](https://accounts.binance.com/en/register?ref=D7YA7CLY) |
89
85
  | [![bybit](https://github.com/user-attachments/assets/97a5d0b3-de10-423d-90e1-6620960025ed)](https://www.bybit.com/register?affiliate_id=35953) | bybit | [Bybit](https://www.bybit.com/register?affiliate_id=35953) | [![API Version 5](https://img.shields.io/badge/5-lightgray)](https://bybit-exchange.github.io/docs/inverse/) | ![CEX – Centralized EXchange](https://img.shields.io/badge/CEX-green.svg "CEX – Centralized EXchange") | [![CCXT Certified](https://img.shields.io/badge/CCXT-Certified-green.svg)](https://github.com/ccxt/ccxt/wiki/Certification) | [![CCXT Pro](https://img.shields.io/badge/CCXT-Pro-black)](https://ccxt.pro) | |
90
- | [![coinex](https://user-images.githubusercontent.com/51840849/87182089-1e05fa00-c2ec-11ea-8da9-cc73b45abbbc.jpg)](https://www.coinex.com/register?refer_code=yw5fz) | coinex | [CoinEx](https://www.coinex.com/register?refer_code=yw5fz) | [![API Version 2](https://img.shields.io/badge/2-lightgray)](https://docs.coinex.com/api/v2) | ![CEX – Centralized EXchange](https://img.shields.io/badge/CEX-green.svg "CEX – Centralized EXchange") | [![CCXT Certified](https://img.shields.io/badge/CCXT-Certified-green.svg)](https://github.com/ccxt/ccxt/wiki/Certification) | [![CCXT Pro](https://img.shields.io/badge/CCXT-Pro-black)](https://ccxt.pro) | |
91
- | [![cryptocom](https://user-images.githubusercontent.com/1294454/147792121-38ed5e36-c229-48d6-b49a-48d05fc19ed4.jpeg)](https://crypto.com/exch/kdacthrnxt) | cryptocom | [Crypto.com](https://crypto.com/exch/kdacthrnxt) | [![API Version 2](https://img.shields.io/badge/2-lightgray)](https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html) | ![CEX – Centralized EXchange](https://img.shields.io/badge/CEX-green.svg "CEX – Centralized EXchange") | [![CCXT Certified](https://img.shields.io/badge/CCXT-Certified-green.svg)](https://github.com/ccxt/ccxt/wiki/Certification) | [![CCXT Pro](https://img.shields.io/badge/CCXT-Pro-black)](https://ccxt.pro) | [![Sign up with Crypto.com using CCXT's referral link for a 75% discount!](https://img.shields.io/static/v1?label=Fee&message=%2d75%25&color=orange)](https://crypto.com/exch/kdacthrnxt) |
86
+ | [![okx](https://user-images.githubusercontent.com/1294454/152485636-38b19e4a-bece-4dec-979a-5982859ffc04.jpg)](https://www.okx.com/join/CCXT2023) | okx | [OKX](https://www.okx.com/join/CCXT2023) | [![API Version 5](https://img.shields.io/badge/5-lightgray)](https://www.okx.com/docs-v5/en/) | ![CEX – Centralized EXchange](https://img.shields.io/badge/CEX-green.svg "CEX – Centralized EXchange") | [![CCXT Certified](https://img.shields.io/badge/CCXT-Certified-green.svg)](https://github.com/ccxt/ccxt/wiki/Certification) | [![CCXT Pro](https://img.shields.io/badge/CCXT-Pro-black)](https://ccxt.pro) | [![Sign up with OKX using CCXT's referral link for a 20% discount!](https://img.shields.io/static/v1?label=Fee&message=%2d20%25&color=orange)](https://www.okx.com/join/CCXT2023) |
92
87
  | [![gate](https://github.com/user-attachments/assets/64f988c5-07b6-4652-b5c1-679a6bf67c85)](https://www.gate.io/signup/2436035) | gate | [Gate.io](https://www.gate.io/signup/2436035) | [![API Version 4](https://img.shields.io/badge/4-lightgray)](https://www.gate.io/docs/developers/apiv4/en/) | ![CEX – Centralized EXchange](https://img.shields.io/badge/CEX-green.svg "CEX – Centralized EXchange") | [![CCXT Certified](https://img.shields.io/badge/CCXT-Certified-green.svg)](https://github.com/ccxt/ccxt/wiki/Certification) | [![CCXT Pro](https://img.shields.io/badge/CCXT-Pro-black)](https://ccxt.pro) | [![Sign up with Gate.io using CCXT's referral link for a 20% discount!](https://img.shields.io/static/v1?label=Fee&message=%2d20%25&color=orange)](https://www.gate.io/signup/2436035) |
93
- | [![hashkey](https://github.com/user-attachments/assets/6dd6127b-cc19-4a13-9b29-a98d81f80e98)](https://global.hashkey.com/en-US/register/invite?invite_code=82FQUN) | hashkey | [HashKey Global](https://global.hashkey.com/en-US/register/invite?invite_code=82FQUN) | [![API Version 1](https://img.shields.io/badge/1-lightgray)](https://hashkeyglobal-apidoc.readme.io/) | ![CEX – Centralized EXchange](https://img.shields.io/badge/CEX-green.svg "CEX – Centralized EXchange") | [![CCXT Certified](https://img.shields.io/badge/CCXT-Certified-green.svg)](https://github.com/ccxt/ccxt/wiki/Certification) | [![CCXT Pro](https://img.shields.io/badge/CCXT-Pro-black)](https://ccxt.pro) | |
94
- | [![htx](https://user-images.githubusercontent.com/1294454/76137448-22748a80-604e-11ea-8069-6e389271911d.jpg)](https://www.htx.com.vc/invite/en-us/1h?invite_code=6rmm2223) | htx | [HTX](https://www.htx.com.vc/invite/en-us/1h?invite_code=6rmm2223) | [![API Version 1](https://img.shields.io/badge/1-lightgray)](https://huobiapi.github.io/docs/spot/v1/en/) | ![CEX – Centralized EXchange](https://img.shields.io/badge/CEX-green.svg "CEX – Centralized EXchange") | [![CCXT Certified](https://img.shields.io/badge/CCXT-Certified-green.svg)](https://github.com/ccxt/ccxt/wiki/Certification) | [![CCXT Pro](https://img.shields.io/badge/CCXT-Pro-black)](https://ccxt.pro) | [![Sign up with HTX using CCXT's referral link for a 15% discount!](https://img.shields.io/static/v1?label=Fee&message=%2d15%25&color=orange)](https://www.htx.com.vc/invite/en-us/1h?invite_code=6rmm2223) |
95
- | [![hyperliquid](https://github.com/ccxt/ccxt/assets/43336371/b371bc6c-4a8c-489f-87f4-20a913dd8d4b)](https://app.hyperliquid.xyz/) | hyperliquid | [Hyperliquid](https://app.hyperliquid.xyz/) | [![API Version 1](https://img.shields.io/badge/1-lightgray)](https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api) | ![DEX - Distributed EXchange](https://img.shields.io/badge/DEX-blue.svg "DEX - Distributed EXchange") | [![CCXT Certified](https://img.shields.io/badge/CCXT-Certified-green.svg)](https://github.com/ccxt/ccxt/wiki/Certification) | [![CCXT Pro](https://img.shields.io/badge/CCXT-Pro-black)](https://ccxt.pro) | |
96
88
  | [![kucoin](https://user-images.githubusercontent.com/51840849/87295558-132aaf80-c50e-11ea-9801-a2fb0c57c799.jpg)](https://www.kucoin.com/ucenter/signup?rcode=E5wkqe) | kucoin | [KuCoin](https://www.kucoin.com/ucenter/signup?rcode=E5wkqe) | [![API Version 2](https://img.shields.io/badge/2-lightgray)](https://docs.kucoin.com) | ![CEX – Centralized EXchange](https://img.shields.io/badge/CEX-green.svg "CEX – Centralized EXchange") | [![CCXT Certified](https://img.shields.io/badge/CCXT-Certified-green.svg)](https://github.com/ccxt/ccxt/wiki/Certification) | [![CCXT Pro](https://img.shields.io/badge/CCXT-Pro-black)](https://ccxt.pro) | |
97
89
  | [![kucoinfutures](https://user-images.githubusercontent.com/1294454/147508995-9e35030a-d046-43a1-a006-6fabd981b554.jpg)](https://futures.kucoin.com/?rcode=E5wkqe) | kucoinfutures | [KuCoin Futures](https://futures.kucoin.com/?rcode=E5wkqe) | [![API Version 1](https://img.shields.io/badge/1-lightgray)](https://docs.kucoin.com/futures) | ![CEX – Centralized EXchange](https://img.shields.io/badge/CEX-green.svg "CEX – Centralized EXchange") | [![CCXT Certified](https://img.shields.io/badge/CCXT-Certified-green.svg)](https://github.com/ccxt/ccxt/wiki/Certification) | [![CCXT Pro](https://img.shields.io/badge/CCXT-Pro-black)](https://ccxt.pro) | |
90
+ | [![bitget](https://github.com/user-attachments/assets/fbaa10cc-a277-441d-a5b7-997dd9a87658)](https://www.bitget.com/expressly?languageType=0&channelCode=ccxt&vipCode=tg9j) | bitget | [Bitget](https://www.bitget.com/expressly?languageType=0&channelCode=ccxt&vipCode=tg9j) | [![API Version 2](https://img.shields.io/badge/2-lightgray)](https://www.bitget.com/api-doc/common/intro) | ![CEX – Centralized EXchange](https://img.shields.io/badge/CEX-green.svg "CEX – Centralized EXchange") | [![CCXT Certified](https://img.shields.io/badge/CCXT-Certified-green.svg)](https://github.com/ccxt/ccxt/wiki/Certification) | [![CCXT Pro](https://img.shields.io/badge/CCXT-Pro-black)](https://ccxt.pro) | |
91
+ | [![hyperliquid](https://github.com/ccxt/ccxt/assets/43336371/b371bc6c-4a8c-489f-87f4-20a913dd8d4b)](https://app.hyperliquid.xyz/) | hyperliquid | [Hyperliquid](https://app.hyperliquid.xyz/) | [![API Version 1](https://img.shields.io/badge/1-lightgray)](https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api) | ![DEX - Distributed EXchange](https://img.shields.io/badge/DEX-blue.svg "DEX - Distributed EXchange") | [![CCXT Certified](https://img.shields.io/badge/CCXT-Certified-green.svg)](https://github.com/ccxt/ccxt/wiki/Certification) | [![CCXT Pro](https://img.shields.io/badge/CCXT-Pro-black)](https://ccxt.pro) | |
92
+ | [![bitmex](https://github.com/user-attachments/assets/c78425ab-78d5-49d6-bd14-db7734798f04)](https://www.bitmex.com/app/register/NZTR1q) | bitmex | [BitMEX](https://www.bitmex.com/app/register/NZTR1q) | [![API Version 1](https://img.shields.io/badge/1-lightgray)](https://www.bitmex.com/app/apiOverview) | ![CEX – Centralized EXchange](https://img.shields.io/badge/CEX-green.svg "CEX – Centralized EXchange") | [![CCXT Certified](https://img.shields.io/badge/CCXT-Certified-green.svg)](https://github.com/ccxt/ccxt/wiki/Certification) | [![CCXT Pro](https://img.shields.io/badge/CCXT-Pro-black)](https://ccxt.pro) | [![Sign up with BitMEX using CCXT's referral link for a 10% discount!](https://img.shields.io/static/v1?label=Fee&message=%2d10%25&color=orange)](https://www.bitmex.com/app/register/NZTR1q) |
93
+ | [![bingx](https://github-production-user-asset-6210df.s3.amazonaws.com/1294454/253675376-6983b72e-4999-4549-b177-33b374c195e3.jpg)](https://bingx.com/invite/OHETOM) | bingx | [BingX](https://bingx.com/invite/OHETOM) | [![API Version 1](https://img.shields.io/badge/1-lightgray)](https://bingx-api.github.io/docs/) | ![CEX – Centralized EXchange](https://img.shields.io/badge/CEX-green.svg "CEX – Centralized EXchange") | [![CCXT Certified](https://img.shields.io/badge/CCXT-Certified-green.svg)](https://github.com/ccxt/ccxt/wiki/Certification) | [![CCXT Pro](https://img.shields.io/badge/CCXT-Pro-black)](https://ccxt.pro) | |
94
+ | [![htx](https://user-images.githubusercontent.com/1294454/76137448-22748a80-604e-11ea-8069-6e389271911d.jpg)](https://www.htx.com.vc/invite/en-us/1h?invite_code=6rmm2223) | htx | [HTX](https://www.htx.com.vc/invite/en-us/1h?invite_code=6rmm2223) | [![API Version 1](https://img.shields.io/badge/1-lightgray)](https://huobiapi.github.io/docs/spot/v1/en/) | ![CEX – Centralized EXchange](https://img.shields.io/badge/CEX-green.svg "CEX – Centralized EXchange") | [![CCXT Certified](https://img.shields.io/badge/CCXT-Certified-green.svg)](https://github.com/ccxt/ccxt/wiki/Certification) | [![CCXT Pro](https://img.shields.io/badge/CCXT-Pro-black)](https://ccxt.pro) | [![Sign up with HTX using CCXT's referral link for a 15% discount!](https://img.shields.io/static/v1?label=Fee&message=%2d15%25&color=orange)](https://www.htx.com.vc/invite/en-us/1h?invite_code=6rmm2223) |
98
95
  | [![mexc](https://user-images.githubusercontent.com/1294454/137283979-8b2a818d-8633-461b-bfca-de89e8c446b2.jpg)](https://www.mexc.com/register?inviteCode=mexc-1FQ1GNu1) | mexc | [MEXC Global](https://www.mexc.com/register?inviteCode=mexc-1FQ1GNu1) | [![API Version 3](https://img.shields.io/badge/3-lightgray)](https://mexcdevelop.github.io/apidocs/) | ![CEX – Centralized EXchange](https://img.shields.io/badge/CEX-green.svg "CEX – Centralized EXchange") | [![CCXT Certified](https://img.shields.io/badge/CCXT-Certified-green.svg)](https://github.com/ccxt/ccxt/wiki/Certification) | [![CCXT Pro](https://img.shields.io/badge/CCXT-Pro-black)](https://ccxt.pro) | |
99
- | [![okx](https://user-images.githubusercontent.com/1294454/152485636-38b19e4a-bece-4dec-979a-5982859ffc04.jpg)](https://www.okx.com/join/CCXT2023) | okx | [OKX](https://www.okx.com/join/CCXT2023) | [![API Version 5](https://img.shields.io/badge/5-lightgray)](https://www.okx.com/docs-v5/en/) | ![CEX – Centralized EXchange](https://img.shields.io/badge/CEX-green.svg "CEX – Centralized EXchange") | [![CCXT Certified](https://img.shields.io/badge/CCXT-Certified-green.svg)](https://github.com/ccxt/ccxt/wiki/Certification) | [![CCXT Pro](https://img.shields.io/badge/CCXT-Pro-black)](https://ccxt.pro) | [![Sign up with OKX using CCXT's referral link for a 20% discount!](https://img.shields.io/static/v1?label=Fee&message=%2d20%25&color=orange)](https://www.okx.com/join/CCXT2023) |
96
+ | [![bitmart](https://github.com/user-attachments/assets/0623e9c4-f50e-48c9-82bd-65c3908c3a14)](http://www.bitmart.com/?r=rQCFLh) | bitmart | [BitMart](http://www.bitmart.com/?r=rQCFLh) | [![API Version 2](https://img.shields.io/badge/2-lightgray)](https://developer-pro.bitmart.com/) | ![CEX – Centralized EXchange](https://img.shields.io/badge/CEX-green.svg "CEX – Centralized EXchange") | [![CCXT Certified](https://img.shields.io/badge/CCXT-Certified-green.svg)](https://github.com/ccxt/ccxt/wiki/Certification) | [![CCXT Pro](https://img.shields.io/badge/CCXT-Pro-black)](https://ccxt.pro) | [![Sign up with BitMart using CCXT's referral link for a 30% discount!](https://img.shields.io/static/v1?label=Fee&message=%2d30%25&color=orange)](http://www.bitmart.com/?r=rQCFLh) |
97
+ | [![cryptocom](https://user-images.githubusercontent.com/1294454/147792121-38ed5e36-c229-48d6-b49a-48d05fc19ed4.jpeg)](https://crypto.com/exch/kdacthrnxt) | cryptocom | [Crypto.com](https://crypto.com/exch/kdacthrnxt) | [![API Version 2](https://img.shields.io/badge/2-lightgray)](https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html) | ![CEX – Centralized EXchange](https://img.shields.io/badge/CEX-green.svg "CEX – Centralized EXchange") | [![CCXT Certified](https://img.shields.io/badge/CCXT-Certified-green.svg)](https://github.com/ccxt/ccxt/wiki/Certification) | [![CCXT Pro](https://img.shields.io/badge/CCXT-Pro-black)](https://ccxt.pro) | [![Sign up with Crypto.com using CCXT's referral link for a 75% discount!](https://img.shields.io/static/v1?label=Fee&message=%2d75%25&color=orange)](https://crypto.com/exch/kdacthrnxt) |
98
+ | [![coinex](https://user-images.githubusercontent.com/51840849/87182089-1e05fa00-c2ec-11ea-8da9-cc73b45abbbc.jpg)](https://www.coinex.com/register?refer_code=yw5fz) | coinex | [CoinEx](https://www.coinex.com/register?refer_code=yw5fz) | [![API Version 2](https://img.shields.io/badge/2-lightgray)](https://docs.coinex.com/api/v2) | ![CEX – Centralized EXchange](https://img.shields.io/badge/CEX-green.svg "CEX – Centralized EXchange") | [![CCXT Certified](https://img.shields.io/badge/CCXT-Certified-green.svg)](https://github.com/ccxt/ccxt/wiki/Certification) | [![CCXT Pro](https://img.shields.io/badge/CCXT-Pro-black)](https://ccxt.pro) | |
99
+ | [![hashkey](https://github.com/user-attachments/assets/6dd6127b-cc19-4a13-9b29-a98d81f80e98)](https://global.hashkey.com/en-US/register/invite?invite_code=82FQUN) | hashkey | [HashKey Global](https://global.hashkey.com/en-US/register/invite?invite_code=82FQUN) | [![API Version 1](https://img.shields.io/badge/1-lightgray)](https://hashkeyglobal-apidoc.readme.io/) | ![CEX – Centralized EXchange](https://img.shields.io/badge/CEX-green.svg "CEX – Centralized EXchange") | [![CCXT Certified](https://img.shields.io/badge/CCXT-Certified-green.svg)](https://github.com/ccxt/ccxt/wiki/Certification) | [![CCXT Pro](https://img.shields.io/badge/CCXT-Pro-black)](https://ccxt.pro) | |
100
100
  | [![woo](https://user-images.githubusercontent.com/1294454/150730761-1a00e5e0-d28c-480f-9e65-089ce3e6ef3b.jpg)](https://woox.io/register?ref=DIJT0CNL) | woo | [WOO X](https://woox.io/register?ref=DIJT0CNL) | [![API Version 1](https://img.shields.io/badge/1-lightgray)](https://docs.woox.io/) | ![CEX – Centralized EXchange](https://img.shields.io/badge/CEX-green.svg "CEX – Centralized EXchange") | [![CCXT Certified](https://img.shields.io/badge/CCXT-Certified-green.svg)](https://github.com/ccxt/ccxt/wiki/Certification) | [![CCXT Pro](https://img.shields.io/badge/CCXT-Pro-black)](https://ccxt.pro) | [![Sign up with WOO X using CCXT's referral link for a 35% discount!](https://img.shields.io/static/v1?label=Fee&message=%2d35%25&color=orange)](https://woox.io/register?ref=DIJT0CNL) |
101
101
  | [![woofipro](https://github.com/user-attachments/assets/9ba21b8a-a9c7-4770-b7f1-ce3bcbde68c1)](https://dex.woo.org/en/trade?ref=CCXT) | woofipro | [WOOFI PRO](https://dex.woo.org/en/trade?ref=CCXT) | [![API Version 1](https://img.shields.io/badge/1-lightgray)](https://orderly.network/docs/build-on-evm/building-on-evm) | ![DEX - Distributed EXchange](https://img.shields.io/badge/DEX-blue.svg "DEX - Distributed EXchange") | [![CCXT Certified](https://img.shields.io/badge/CCXT-Certified-green.svg)](https://github.com/ccxt/ccxt/wiki/Certification) | [![CCXT Pro](https://img.shields.io/badge/CCXT-Pro-black)](https://ccxt.pro) | [![Sign up with WOOFI PRO using CCXT's referral link for a 5% discount!](https://img.shields.io/static/v1?label=Fee&message=%2d5%25&color=orange)](https://dex.woo.org/en/trade?ref=CCXT) |
102
102
 
@@ -160,7 +160,7 @@ Current feature list:
160
160
  | [![ellipx](https://github.com/user-attachments/assets/e07c3f40-281c-4cdf-bacf-fa1c58218a2c)](https://www.ellipx.com) | ellipx | [Ellipx](https://www.ellipx.com) | [![API Version 1](https://img.shields.io/badge/1-lightgray)](https://docs.google.com/document/d/1ZXzTQYffKE_EglTaKptxGQERRnunuLHEMmar7VC9syM) | ![CEX – Centralized EXchange](https://img.shields.io/badge/CEX-green.svg "CEX – Centralized EXchange") | | |
161
161
  | [![exmo](https://user-images.githubusercontent.com/1294454/27766491-1b0ea956-5eda-11e7-9225-40d67b481b8d.jpg)](https://exmo.me/?ref=131685) | exmo | [EXMO](https://exmo.me/?ref=131685) | [![API Version 1.1](https://img.shields.io/badge/1.1-lightgray)](https://exmo.me/en/api_doc?ref=131685) | ![CEX – Centralized EXchange](https://img.shields.io/badge/CEX-green.svg "CEX – Centralized EXchange") | | |
162
162
  | [![fmfwio](https://user-images.githubusercontent.com/1294454/159177712-b685b40c-5269-4cea-ac83-f7894c49525d.jpg)](https://fmfw.io/referral/da948b21d6c92d69) | fmfwio | [FMFW.io](https://fmfw.io/referral/da948b21d6c92d69) | [![API Version 3](https://img.shields.io/badge/3-lightgray)](https://api.fmfw.io/) | ![CEX – Centralized EXchange](https://img.shields.io/badge/CEX-green.svg "CEX – Centralized EXchange") | | |
163
- | [![foxbit](https://github.com/user-attachments/assets/63be1a3a-775d-459b-8c03-493c71c0253c)](https://app.foxbit.com.br) | foxbit | [Foxbit](https://app.foxbit.com.br) | [![API Version 1](https://img.shields.io/badge/1-lightgray)](https://docs.foxbit.com.br) | ![CEX – Centralized EXchange](https://img.shields.io/badge/CEX-green.svg "CEX – Centralized EXchange") | | |
163
+ | [![foxbit](https://github.com/user-attachments/assets/ba1435eb-1d59-4393-8de7-0db10a002fb3)](https://app.foxbit.com.br) | foxbit | [Foxbit](https://app.foxbit.com.br) | [![API Version 1](https://img.shields.io/badge/1-lightgray)](https://docs.foxbit.com.br) | ![CEX – Centralized EXchange](https://img.shields.io/badge/CEX-green.svg "CEX – Centralized EXchange") | | |
164
164
  | [![gate](https://github.com/user-attachments/assets/64f988c5-07b6-4652-b5c1-679a6bf67c85)](https://www.gate.io/signup/2436035) | gate | [Gate.io](https://www.gate.io/signup/2436035) | [![API Version 4](https://img.shields.io/badge/4-lightgray)](https://www.gate.io/docs/developers/apiv4/en/) | ![CEX – Centralized EXchange](https://img.shields.io/badge/CEX-green.svg "CEX – Centralized EXchange") | [![CCXT Certified](https://img.shields.io/badge/CCXT-Certified-green.svg)](https://github.com/ccxt/ccxt/wiki/Certification) | [![CCXT Pro](https://img.shields.io/badge/CCXT-Pro-black)](https://ccxt.pro) |
165
165
  | [![gemini](https://user-images.githubusercontent.com/1294454/27816857-ce7be644-6096-11e7-82d6-3c257263229c.jpg)](https://gemini.com/) | gemini | [Gemini](https://gemini.com/) | [![API Version 1](https://img.shields.io/badge/1-lightgray)](https://docs.gemini.com/rest-api) | ![CEX – Centralized EXchange](https://img.shields.io/badge/CEX-green.svg "CEX – Centralized EXchange") | | [![CCXT Pro](https://img.shields.io/badge/CCXT-Pro-black)](https://ccxt.pro) |
166
166
  | [![hashkey](https://github.com/user-attachments/assets/6dd6127b-cc19-4a13-9b29-a98d81f80e98)](https://global.hashkey.com/en-US/register/invite?invite_code=82FQUN) | hashkey | [HashKey Global](https://global.hashkey.com/en-US/register/invite?invite_code=82FQUN) | [![API Version 1](https://img.shields.io/badge/1-lightgray)](https://hashkeyglobal-apidoc.readme.io/) | ![CEX – Centralized EXchange](https://img.shields.io/badge/CEX-green.svg "CEX – Centralized EXchange") | [![CCXT Certified](https://img.shields.io/badge/CCXT-Certified-green.svg)](https://github.com/ccxt/ccxt/wiki/Certification) | [![CCXT Pro](https://img.shields.io/badge/CCXT-Pro-black)](https://ccxt.pro) |
@@ -269,13 +269,13 @@ console.log(version, Object.keys(exchanges));
269
269
 
270
270
  All-in-one browser bundle (dependencies included), served from a CDN of your choice:
271
271
 
272
- * jsDelivr: https://cdn.jsdelivr.net/npm/ccxt@4.4.96/dist/ccxt.browser.min.js
273
- * unpkg: https://unpkg.com/ccxt@4.4.96/dist/ccxt.browser.min.js
272
+ * jsDelivr: https://cdn.jsdelivr.net/npm/ccxt@4.4.97/dist/ccxt.browser.min.js
273
+ * unpkg: https://unpkg.com/ccxt@4.4.97/dist/ccxt.browser.min.js
274
274
 
275
275
  CDNs are not updated in real-time and may have delays. Defaulting to the most recent version without specifying the version number is not recommended. Please, keep in mind that we are not responsible for the correct operation of those CDN servers.
276
276
 
277
277
  ```HTML
278
- <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/ccxt@4.4.96/dist/ccxt.browser.min.js"></script>
278
+ <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/ccxt@4.4.97/dist/ccxt.browser.min.js"></script>
279
279
  ```
280
280
 
281
281
  Creates a global `ccxt` object: