ccxt 4.1.91__py2.py3-none-any.whl → 4.1.95__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.
@@ -48,6 +48,7 @@ class hitbtc(Exchange, ImplicitAPI):
48
48
  'addMargin': True,
49
49
  'cancelAllOrders': True,
50
50
  'cancelOrder': True,
51
+ 'closePosition': False,
51
52
  'createDepositAddress': True,
52
53
  'createOrder': True,
53
54
  'createPostOnlyOrder': True,
@@ -2660,6 +2661,8 @@ class hitbtc(Exchange, ImplicitAPI):
2660
2661
  marketType = None
2661
2662
  marginMode = None
2662
2663
  marketType, params = self.handle_market_type_and_params('fetchPositions', None, params)
2664
+ if marketType == 'spot':
2665
+ marketType = 'swap'
2663
2666
  marginMode, params = self.handle_margin_mode_and_params('fetchPositions', params)
2664
2667
  params = self.omit(params, ['marginMode', 'margin'])
2665
2668
  response = None
@@ -3264,6 +3267,41 @@ class hitbtc(Exchange, ImplicitAPI):
3264
3267
  }
3265
3268
  return result
3266
3269
 
3270
+ async def close_position(self, symbol: str, side: OrderSide = None, params={}) -> Order:
3271
+ """
3272
+ closes open positions for a market
3273
+ :see: https://api.hitbtc.com/#close-all-futures-margin-positions
3274
+ :param dict [params]: extra parameters specific to the okx api endpoint
3275
+ :param str [params.symbol]: *required* unified market symbol
3276
+ :param str [params.marginMode]: 'cross' or 'isolated', default is 'cross'
3277
+ :returns dict: An `order structure <https://docs.ccxt.com/#/?id=order-structure>`
3278
+ """
3279
+ await self.load_markets()
3280
+ marginMode = None
3281
+ marginMode, params = self.handle_margin_mode_and_params('closePosition', params, 'cross')
3282
+ market = self.market(symbol)
3283
+ request = {
3284
+ 'symbol': market['id'],
3285
+ 'margin_mode': marginMode,
3286
+ }
3287
+ response = await self.privateDeleteFuturesPositionMarginModeSymbol(self.extend(request, params))
3288
+ #
3289
+ # {
3290
+ # "id":"202471640",
3291
+ # "symbol":"TRXUSDT_PERP",
3292
+ # "margin_mode":"Cross",
3293
+ # "leverage":"1.00",
3294
+ # "quantity":"0",
3295
+ # "price_entry":"0",
3296
+ # "price_margin_call":"0",
3297
+ # "price_liquidation":"0",
3298
+ # "pnl":"0.001234100000",
3299
+ # "created_at":"2023-10-29T14:46:13.235Z",
3300
+ # "updated_at":"2023-12-19T09:34:40.014Z"
3301
+ # }
3302
+ #
3303
+ return self.parse_order(response, market)
3304
+
3267
3305
  def handle_margin_mode_and_params(self, methodName, params={}, defaultValue=None):
3268
3306
  """
3269
3307
  * @ignore
@@ -168,6 +168,7 @@ class kucoinfutures(kucoin, ImplicitAPI):
168
168
  'positions': 4.44,
169
169
  'funding-history': 4.44,
170
170
  'sub/api-key': 1,
171
+ 'trade-statistics': 1,
171
172
  },
172
173
  'post': {
173
174
  'withdrawals': 1,
@@ -189,6 +190,7 @@ class kucoinfutures(kucoin, ImplicitAPI):
189
190
  'orders': 4.44,
190
191
  'stopOrders': 1,
191
192
  'sub/api-key': 1,
193
+ 'orders/client-order/{clientOid}': 1,
192
194
  },
193
195
  },
194
196
  'webExchange': {
@@ -1189,13 +1191,24 @@ class kucoinfutures(kucoin, ImplicitAPI):
1189
1191
  :param str id: order id
1190
1192
  :param str symbol: unified symbol of the market the order was made in
1191
1193
  :param dict [params]: extra parameters specific to the exchange API endpoint
1194
+ :param str [params.clientOrderId]: cancel order by client order id
1192
1195
  :returns dict: An `order structure <https://docs.ccxt.com/#/?id=order-structure>`
1193
1196
  """
1194
1197
  await self.load_markets()
1195
- request = {
1196
- 'orderId': id,
1197
- }
1198
- response = await self.futuresPrivateDeleteOrdersOrderId(self.extend(request, params))
1198
+ clientOrderId = self.safe_string_2(params, 'clientOid', 'clientOrderId')
1199
+ params = self.omit(params, ['clientOrderId'])
1200
+ request = {}
1201
+ response = None
1202
+ if clientOrderId is not None:
1203
+ if symbol is None:
1204
+ raise ArgumentsRequired(self.id + ' cancelOrder() requires a symbol argument when cancelling by clientOrderId')
1205
+ market = self.market(symbol)
1206
+ request['symbol'] = market['id']
1207
+ request['clientOid'] = clientOrderId
1208
+ response = await self.futuresPrivateDeleteOrdersClientOrderClientOid(self.extend(request, params))
1209
+ else:
1210
+ request['orderId'] = id
1211
+ response = await self.futuresPrivateDeleteOrdersOrderId(self.extend(request, params))
1199
1212
  #
1200
1213
  # {
1201
1214
  # "code": "200000",
ccxt/async_support/okx.py CHANGED
@@ -273,6 +273,7 @@ class okx(Exchange, ImplicitAPI):
273
273
  # rfq
274
274
  'rfq/counterparties': 4,
275
275
  'rfq/maker-instrument-settings': 4,
276
+ 'rfq/mmp-config': 4,
276
277
  'rfq/rfqs': 10,
277
278
  'rfq/quotes': 10,
278
279
  'rfq/trades': 4,
@@ -412,6 +413,7 @@ class okx(Exchange, ImplicitAPI):
412
413
  'rfq/execute-quote': 15,
413
414
  'rfq/maker-instrument-settings': 4,
414
415
  'rfq/mmp-reset': 4,
416
+ 'rfq/mmp-config': 100,
415
417
  'rfq/create-quote': 0.4,
416
418
  'rfq/cancel-quote': 0.4,
417
419
  'rfq/cancel-batch-quotes': 10,
ccxt/base/exchange.py CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  # -----------------------------------------------------------------------------
6
6
 
7
- __version__ = '4.1.91'
7
+ __version__ = '4.1.95'
8
8
 
9
9
  # -----------------------------------------------------------------------------
10
10
 
@@ -115,6 +115,7 @@ class Exchange(object):
115
115
  aiohttp_trust_env = False
116
116
  requests_trust_env = False
117
117
  session = None # Session () by default
118
+ socks_proxy_session = None
118
119
  verify = True # SSL verification
119
120
  validateServerSsl = True
120
121
  validateClientSsl = False
ccxt/binance.py CHANGED
@@ -3035,7 +3035,7 @@ class binance(Exchange, ImplicitAPI):
3035
3035
  :see: https://binance-docs.github.io/apidocs/futures/en/#24hr-ticker-price-change-statistics # swap
3036
3036
  :see: https://binance-docs.github.io/apidocs/delivery/en/#24hr-ticker-price-change-statistics # future
3037
3037
  :see: https://binance-docs.github.io/apidocs/voptions/en/#24hr-ticker-price-change-statistics # option
3038
- :param str[]|None symbols: unified symbols of the markets to fetch the ticker for, all market tickers are returned if not assigned
3038
+ :param str[] [symbols]: unified symbols of the markets to fetch the ticker for, all market tickers are returned if not assigned
3039
3039
  :param dict [params]: extra parameters specific to the exchange API endpoint
3040
3040
  :returns dict: a dictionary of `ticker structures <https://docs.ccxt.com/#/?id=ticker-structure>`
3041
3041
  """
@@ -3049,18 +3049,19 @@ class binance(Exchange, ImplicitAPI):
3049
3049
  type, params = self.handle_market_type_and_params('fetchTickers', market, params)
3050
3050
  subType = None
3051
3051
  subType, params = self.handle_sub_type_and_params('fetchTickers', market, params)
3052
- query = self.omit(params, 'type')
3053
- defaultMethod = None
3052
+ response = None
3054
3053
  if type == 'option':
3055
- defaultMethod = 'eapiPublicGetTicker'
3054
+ response = self.eapiPublicGetTicker(params)
3056
3055
  elif self.is_linear(type, subType):
3057
- defaultMethod = 'fapiPublicGetTicker24hr'
3056
+ response = self.fapiPublicGetTicker24hr(params)
3058
3057
  elif self.is_inverse(type, subType):
3059
- defaultMethod = 'dapiPublicGetTicker24hr'
3058
+ response = self.dapiPublicGetTicker24hr(params)
3060
3059
  else:
3061
- defaultMethod = 'publicGetTicker24hr'
3062
- method = self.safe_string(self.options, 'fetchTickersMethod', defaultMethod)
3063
- response = getattr(self, method)(query)
3060
+ request = {}
3061
+ if symbols is not None:
3062
+ marketIds = self.market_ids(symbols)
3063
+ request['symbols'] = self.json(marketIds)
3064
+ response = self.publicGetTicker24hr(self.extend(request, params))
3064
3065
  return self.parse_tickers(response, symbols)
3065
3066
 
3066
3067
  def parse_ohlcv(self, ohlcv, market: Market = None) -> list:
ccxt/bingx.py CHANGED
@@ -876,14 +876,17 @@ class bingx(Exchange, ImplicitAPI):
876
876
  type = 'spot' if (cost is None) else 'swap'
877
877
  currencyId = self.safe_string_2(trade, 'currency', 'N')
878
878
  currencyCode = self.safe_currency_code(currencyId)
879
- m = self.safe_value(trade, 'm', False)
879
+ m = self.safe_value(trade, 'm')
880
880
  marketId = self.safe_string(trade, 's')
881
881
  isBuyerMaker = self.safe_value_2(trade, 'buyerMaker', 'isBuyerMaker')
882
- takeOrMaker = 'maker' if (isBuyerMaker or m) else 'taker'
882
+ takeOrMaker = None
883
+ if (isBuyerMaker is not None) or (m is not None):
884
+ takeOrMaker = 'maker' if (isBuyerMaker or m) else 'taker'
883
885
  side = self.safe_string_lower_2(trade, 'side', 'S')
884
886
  if side is None:
885
- side = 'sell' if (isBuyerMaker or m) else 'buy'
886
- takeOrMaker = 'taker'
887
+ if (isBuyerMaker is not None) or (m is not None):
888
+ side = 'sell' if (isBuyerMaker or m) else 'buy'
889
+ takeOrMaker = 'taker'
887
890
  return self.safe_trade({
888
891
  'id': self.safe_string_n(trade, ['id', 't']),
889
892
  'info': trade,
@@ -895,7 +898,7 @@ class bingx(Exchange, ImplicitAPI):
895
898
  'side': self.parse_order_side(side),
896
899
  'takerOrMaker': takeOrMaker,
897
900
  'price': self.safe_string_2(trade, 'price', 'p'),
898
- 'amount': self.safe_string_n(trade, ['qty', 'amount', 'q']),
901
+ 'amount': self.safe_string_n(trade, ['qty', 'volume', 'amount', 'q']),
899
902
  'cost': cost,
900
903
  'fee': {
901
904
  'cost': self.parse_number(Precise.string_abs(self.safe_string_2(trade, 'commission', 'n'))),
ccxt/bitget.py CHANGED
@@ -57,7 +57,7 @@ class bitget(Exchange, ImplicitAPI):
57
57
  'cancelOrder': True,
58
58
  'cancelOrders': True,
59
59
  'closeAllPositions': True,
60
- 'closePosition': False,
60
+ 'closePosition': True,
61
61
  'createMarketBuyOrderWithCost': True,
62
62
  'createMarketOrderWithCost': False,
63
63
  'createMarketSellOrderWithCost': False,
@@ -3431,7 +3431,7 @@ class bitget(Exchange, ImplicitAPI):
3431
3431
 
3432
3432
  def parse_order(self, order, market: Market = None) -> Order:
3433
3433
  #
3434
- # createOrder, editOrder
3434
+ # createOrder, editOrder, closePosition
3435
3435
  #
3436
3436
  # {
3437
3437
  # "clientOid": "abe95dbe-6081-4a6f-a2d3-ae49601cd479",
@@ -3708,8 +3708,12 @@ class bitget(Exchange, ImplicitAPI):
3708
3708
  'clientOrderId': self.safe_string_2(order, 'clientOrderId', 'clientOid'),
3709
3709
  'status': 'rejected',
3710
3710
  }, market)
3711
+ isContractOrder = ('posSide' in order)
3712
+ marketType = 'contract' if isContractOrder else 'spot'
3713
+ if market is not None:
3714
+ marketType = market['type']
3711
3715
  marketId = self.safe_string(order, 'symbol')
3712
- market = self.safe_market(marketId, market)
3716
+ market = self.safe_market(marketId, market, None, marketType)
3713
3717
  timestamp = self.safe_integer_2(order, 'cTime', 'ctime')
3714
3718
  updateTimestamp = self.safe_integer(order, 'uTime')
3715
3719
  rawStatus = self.safe_string_2(order, 'status', 'state')
@@ -4690,31 +4694,36 @@ class bitget(Exchange, ImplicitAPI):
4690
4694
  :param str [params.isPlan]: *swap only* 'plan' for stop orders and 'profit_loss' for tp/sl orders, default is 'plan'
4691
4695
  :returns Order[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
4692
4696
  """
4693
- if symbol is None:
4694
- raise ArgumentsRequired(self.id + ' fetchOpenOrders() requires a symbol argument')
4695
4697
  self.load_markets()
4696
4698
  sandboxMode = self.safe_value(self.options, 'sandboxMode', False)
4697
4699
  market = None
4698
- if sandboxMode:
4699
- sandboxSymbol = self.convert_symbol_for_sandbox(symbol)
4700
- market = self.market(sandboxSymbol)
4701
- else:
4702
- market = self.market(symbol)
4700
+ type = None
4701
+ request = {}
4703
4702
  marginMode = None
4704
4703
  marginMode, params = self.handle_margin_mode_and_params('fetchOpenOrders', params)
4704
+ if symbol is not None:
4705
+ if sandboxMode:
4706
+ sandboxSymbol = self.convert_symbol_for_sandbox(symbol)
4707
+ market = self.market(sandboxSymbol)
4708
+ else:
4709
+ market = self.market(symbol)
4710
+ request['symbol'] = market['id']
4711
+ defaultType = self.safe_string_2(self.options, 'fetchOpenOrders', 'defaultType', 'spot')
4712
+ marketType = market['type'] if ('type' in market) else defaultType
4713
+ type = self.safe_string(params, 'type', marketType)
4714
+ else:
4715
+ defaultType = self.safe_string_2(self.options, 'fetchOpenOrders', 'defaultType', 'spot')
4716
+ type = self.safe_string(params, 'type', defaultType)
4705
4717
  paginate = False
4706
4718
  paginate, params = self.handle_option_and_params(params, 'fetchOpenOrders', 'paginate')
4707
4719
  if paginate:
4708
4720
  cursorReceived = None
4709
- if market['spot']:
4721
+ if type == 'spot':
4710
4722
  if marginMode is not None:
4711
4723
  cursorReceived = 'minId'
4712
4724
  else:
4713
4725
  cursorReceived = 'endId'
4714
4726
  return self.fetch_paginated_call_cursor('fetchOpenOrders', symbol, since, limit, params, cursorReceived, 'idLessThan')
4715
- request = {
4716
- 'symbol': market['id'],
4717
- }
4718
4727
  response = None
4719
4728
  stop = self.safe_value_2(params, 'stop', 'trigger')
4720
4729
  params = self.omit(params, ['stop', 'trigger'])
@@ -4723,35 +4732,37 @@ class bitget(Exchange, ImplicitAPI):
4723
4732
  request['startTime'] = since
4724
4733
  if limit is not None:
4725
4734
  request['limit'] = limit
4726
- if (market['swap']) or (market['future']) or (marginMode is not None):
4735
+ if (type == 'swap') or (type == 'future') or (marginMode is not None):
4727
4736
  clientOrderId = self.safe_string_2(params, 'clientOid', 'clientOrderId')
4728
4737
  params = self.omit(params, 'clientOrderId')
4729
4738
  if clientOrderId is not None:
4730
4739
  request['clientOid'] = clientOrderId
4731
- if market['spot']:
4740
+ query = None
4741
+ query = self.omit(params, ['type'])
4742
+ if type == 'spot':
4732
4743
  if marginMode is not None:
4733
4744
  if since is None:
4734
4745
  since = self.milliseconds() - 7776000000
4735
4746
  request['startTime'] = since
4736
4747
  if marginMode == 'isolated':
4737
- response = self.privateMarginGetV2MarginIsolatedOpenOrders(self.extend(request, params))
4748
+ response = self.privateMarginGetV2MarginIsolatedOpenOrders(self.extend(request, query))
4738
4749
  elif marginMode == 'cross':
4739
- response = self.privateMarginGetV2MarginCrossedOpenOrders(self.extend(request, params))
4750
+ response = self.privateMarginGetV2MarginCrossedOpenOrders(self.extend(request, query))
4740
4751
  else:
4741
4752
  if stop:
4742
- response = self.privateSpotGetV2SpotTradeCurrentPlanOrder(self.extend(request, params))
4753
+ response = self.privateSpotGetV2SpotTradeCurrentPlanOrder(self.extend(request, query))
4743
4754
  else:
4744
- response = self.privateSpotGetV2SpotTradeUnfilledOrders(self.extend(request, params))
4755
+ response = self.privateSpotGetV2SpotTradeUnfilledOrders(self.extend(request, query))
4745
4756
  else:
4746
4757
  productType = None
4747
- productType, params = self.handle_product_type_and_params(market, params)
4758
+ productType, query = self.handle_product_type_and_params(market, query)
4748
4759
  request['productType'] = productType
4749
4760
  if stop:
4750
- planType = self.safe_string(params, 'planType', 'normal_plan')
4761
+ planType = self.safe_string(query, 'planType', 'normal_plan')
4751
4762
  request['planType'] = planType
4752
- response = self.privateMixGetV2MixOrderOrdersPlanPending(self.extend(request, params))
4763
+ response = self.privateMixGetV2MixOrderOrdersPlanPending(self.extend(request, query))
4753
4764
  else:
4754
- response = self.privateMixGetV2MixOrderOrdersPending(self.extend(request, params))
4765
+ response = self.privateMixGetV2MixOrderOrdersPending(self.extend(request, query))
4755
4766
  #
4756
4767
  # spot
4757
4768
  #
@@ -4928,7 +4939,7 @@ class bitget(Exchange, ImplicitAPI):
4928
4939
  # }
4929
4940
  #
4930
4941
  data = self.safe_value(response, 'data')
4931
- if market['spot']:
4942
+ if type == 'spot':
4932
4943
  if (marginMode is not None) or stop:
4933
4944
  resultList = self.safe_value(data, 'orderList', [])
4934
4945
  return self.parse_orders(resultList, market, since, limit)
@@ -4953,12 +4964,13 @@ class bitget(Exchange, ImplicitAPI):
4953
4964
  :param int [params.until]: the latest time in ms to fetch entries for
4954
4965
  :param boolean [params.paginate]: default False, when True will automatically paginate by calling self endpoint multiple times. See in the docs all the [available parameters](https://github.com/ccxt/ccxt/wiki/Manual#pagination-params)
4955
4966
  :param str [params.isPlan]: *swap only* 'plan' for stop orders and 'profit_loss' for tp/sl orders, default is 'plan'
4967
+ :param str [params.productType]: *contract only* 'USDT-FUTURES', 'USDC-FUTURES', 'COIN-FUTURES', 'SUSDT-FUTURES', 'SUSDC-FUTURES' or 'SCOIN-FUTURES'
4956
4968
  :returns Order[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
4957
4969
  """
4958
- if symbol is None:
4959
- raise ArgumentsRequired(self.id + ' fetchClosedOrders() requires a symbol argument')
4960
4970
  self.load_markets()
4961
- market = self.market(symbol)
4971
+ market = None
4972
+ if symbol is not None:
4973
+ market = self.market(symbol)
4962
4974
  response = self.fetch_canceled_and_closed_orders(symbol, since, limit, params)
4963
4975
  result = []
4964
4976
  for i in range(0, len(response)):
@@ -4984,12 +4996,13 @@ class bitget(Exchange, ImplicitAPI):
4984
4996
  :param int [params.until]: the latest time in ms to fetch entries for
4985
4997
  :param boolean [params.paginate]: default False, when True will automatically paginate by calling self endpoint multiple times. See in the docs all the [available parameters](https://github.com/ccxt/ccxt/wiki/Manual#pagination-params)
4986
4998
  :param str [params.isPlan]: *swap only* 'plan' for stop orders and 'profit_loss' for tp/sl orders, default is 'plan'
4999
+ :param str [params.productType]: *contract only* 'USDT-FUTURES', 'USDC-FUTURES', 'COIN-FUTURES', 'SUSDT-FUTURES', 'SUSDC-FUTURES' or 'SCOIN-FUTURES'
4987
5000
  :returns dict: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
4988
5001
  """
4989
- if symbol is None:
4990
- raise ArgumentsRequired(self.id + ' fetchCanceledOrders() requires a symbol argument')
4991
5002
  self.load_markets()
4992
- market = self.market(symbol)
5003
+ market = None
5004
+ if symbol is not None:
5005
+ market = self.market(symbol)
4993
5006
  response = self.fetch_canceled_and_closed_orders(symbol, since, limit, params)
4994
5007
  result = []
4995
5008
  for i in range(0, len(response)):
@@ -5004,25 +5017,27 @@ class bitget(Exchange, ImplicitAPI):
5004
5017
  sandboxMode = self.safe_value(self.options, 'sandboxMode', False)
5005
5018
  market = None
5006
5019
  if sandboxMode:
5007
- sandboxSymbol = self.convert_symbol_for_sandbox(symbol)
5008
- market = self.market(sandboxSymbol)
5009
- else:
5020
+ if symbol is not None:
5021
+ sandboxSymbol = self.convert_symbol_for_sandbox(symbol)
5022
+ symbol = sandboxSymbol
5023
+ request = {}
5024
+ if symbol is not None:
5010
5025
  market = self.market(symbol)
5026
+ request['symbol'] = market['id']
5027
+ marketType = None
5028
+ marketType, params = self.handle_market_type_and_params('fetchCanceledAndClosedOrders', market, params)
5011
5029
  marginMode = None
5012
5030
  marginMode, params = self.handle_margin_mode_and_params('fetchCanceledAndClosedOrders', params)
5013
5031
  paginate = False
5014
5032
  paginate, params = self.handle_option_and_params(params, 'fetchCanceledAndClosedOrders', 'paginate')
5015
5033
  if paginate:
5016
5034
  cursorReceived = None
5017
- if market['spot']:
5035
+ if marketType == 'spot':
5018
5036
  if marginMode is not None:
5019
5037
  cursorReceived = 'minId'
5020
5038
  else:
5021
5039
  cursorReceived = 'endId'
5022
5040
  return self.fetch_paginated_call_cursor('fetchCanceledAndClosedOrders', symbol, since, limit, params, cursorReceived, 'idLessThan')
5023
- request = {
5024
- 'symbol': market['id'],
5025
- }
5026
5041
  response = None
5027
5042
  stop = self.safe_value_2(params, 'stop', 'trigger')
5028
5043
  params = self.omit(params, ['stop', 'trigger'])
@@ -5031,13 +5046,13 @@ class bitget(Exchange, ImplicitAPI):
5031
5046
  request['startTime'] = since
5032
5047
  if limit is not None:
5033
5048
  request['limit'] = limit
5034
- if (market['swap']) or (market['future']) or (marginMode is not None):
5049
+ if (marketType == 'swap') or (marketType == 'future') or (marginMode is not None):
5035
5050
  clientOrderId = self.safe_string_2(params, 'clientOid', 'clientOrderId')
5036
5051
  params = self.omit(params, 'clientOrderId')
5037
5052
  if clientOrderId is not None:
5038
5053
  request['clientOid'] = clientOrderId
5039
5054
  now = self.milliseconds()
5040
- if market['spot']:
5055
+ if marketType == 'spot':
5041
5056
  if marginMode is not None:
5042
5057
  if since is None:
5043
5058
  since = now - 7776000000
@@ -5048,6 +5063,8 @@ class bitget(Exchange, ImplicitAPI):
5048
5063
  response = self.privateMarginGetV2MarginCrossedHistoryOrders(self.extend(request, params))
5049
5064
  else:
5050
5065
  if stop:
5066
+ if symbol is None:
5067
+ raise ArgumentsRequired(self.id + ' fetchCanceledAndClosedOrders() requires a symbol argument')
5051
5068
  endTime = self.safe_integer_n(params, ['endTime', 'until', 'till'])
5052
5069
  params = self.omit(params, ['until', 'till'])
5053
5070
  if since is None:
@@ -5247,7 +5264,7 @@ class bitget(Exchange, ImplicitAPI):
5247
5264
  # }
5248
5265
  #
5249
5266
  data = self.safe_value(response, 'data', {})
5250
- if market['spot']:
5267
+ if marketType == 'spot':
5251
5268
  if (marginMode is not None) or stop:
5252
5269
  return self.safe_value(data, 'orderList', [])
5253
5270
  else:
@@ -5879,11 +5896,10 @@ class bitget(Exchange, ImplicitAPI):
5879
5896
  #
5880
5897
  # closeAllPositions
5881
5898
  #
5882
- # {
5883
- # "symbol": "XRPUSDT_UMCBL",
5884
- # "orderId": "1111861847410757635",
5885
- # "clientOid": "1111861847410757637"
5886
- # }
5899
+ # {
5900
+ # "orderId": "1120923953904893955",
5901
+ # "clientOid": "1120923953904893956"
5902
+ # }
5887
5903
  #
5888
5904
  marketId = self.safe_string(position, 'symbol')
5889
5905
  market = self.safe_market(marketId, market, None, 'contract')
@@ -5942,7 +5958,7 @@ class bitget(Exchange, ImplicitAPI):
5942
5958
  percentage = Precise.string_mul(Precise.string_div(unrealizedPnl, initialMargin, 4), '100')
5943
5959
  return self.safe_position({
5944
5960
  'info': position,
5945
- 'id': None,
5961
+ 'id': self.safe_string(position, 'orderId'),
5946
5962
  'symbol': symbol,
5947
5963
  'notional': self.parse_number(notional),
5948
5964
  'marginMode': marginMode,
@@ -7456,57 +7472,87 @@ class bitget(Exchange, ImplicitAPI):
7456
7472
  'info': info,
7457
7473
  }
7458
7474
 
7475
+ def close_position(self, symbol: str, side: OrderSide = None, params={}) -> Order:
7476
+ """
7477
+ closes an open position for a market
7478
+ :see: https://www.bitget.com/api-doc/contract/trade/Flash-Close-Position
7479
+ :param str symbol: unified CCXT market symbol
7480
+ :param str [side]: one-way mode: 'buy' or 'sell', hedge-mode: 'long' or 'short'
7481
+ :param dict [params]: extra parameters specific to the exchange API endpoint
7482
+ :returns dict: An `order structure <https://docs.ccxt.com/#/?id=order-structure>`
7483
+ """
7484
+ self.load_markets()
7485
+ sandboxMode = self.safe_value(self.options, 'sandboxMode', False)
7486
+ market = None
7487
+ if sandboxMode:
7488
+ sandboxSymbol = self.convert_symbol_for_sandbox(symbol)
7489
+ market = self.market(sandboxSymbol)
7490
+ else:
7491
+ market = self.market(symbol)
7492
+ productType = None
7493
+ productType, params = self.handle_product_type_and_params(market, params)
7494
+ request = {
7495
+ 'symbol': market['id'],
7496
+ 'productType': productType,
7497
+ }
7498
+ if side is not None:
7499
+ request['holdSide'] = side
7500
+ response = self.privateMixPostV2MixOrderClosePositions(self.extend(request, params))
7501
+ #
7502
+ # {
7503
+ # "code": "00000",
7504
+ # "msg": "success",
7505
+ # "requestTime": 1702975017017,
7506
+ # "data": {
7507
+ # "successList": [
7508
+ # {
7509
+ # "orderId": "1120923953904893955",
7510
+ # "clientOid": "1120923953904893956"
7511
+ # }
7512
+ # ],
7513
+ # "failureList": [],
7514
+ # "result": False
7515
+ # }
7516
+ # }
7517
+ #
7518
+ data = self.safe_value(response, 'data', {})
7519
+ order = self.safe_value(data, 'successList', [])
7520
+ return self.parse_order(order[0], market)
7521
+
7459
7522
  def close_all_positions(self, params={}) -> List[Position]:
7460
7523
  """
7461
- closes open positions for a market
7462
- :see: https://bitgetlimited.github.io/apidoc/en/mix/#close-all-position
7463
- :param dict [params]: extra parameters specific to the okx api endpoint
7464
- :param str [params.subType]: 'linear' or 'inverse'
7465
- :param str [params.settle]: *required and only valid when params.subType == "linear"* 'USDT' or 'USDC'
7466
- :returns dict[]: `A list of position structures <https://docs.ccxt.com/#/?id=position-structure>`
7524
+ closes all open positions for a market type
7525
+ :see: https://www.bitget.com/api-doc/contract/trade/Flash-Close-Position
7526
+ :param dict [params]: extra parameters specific to the exchange API endpoint
7527
+ :param str [params.productType]: 'USDT-FUTURES', 'USDC-FUTURES', 'COIN-FUTURES', 'SUSDT-FUTURES', 'SUSDC-FUTURES' or 'SCOIN-FUTURES'
7528
+ :returns dict[]: A list of `position structures <https://docs.ccxt.com/#/?id=position-structure>`
7467
7529
  """
7468
7530
  self.load_markets()
7469
- subType = None
7470
- settle = None
7471
- subType, params = self.handle_sub_type_and_params('closeAllPositions', None, params)
7472
- settle = self.safe_string(params, 'settle', 'USDT')
7473
- params = self.omit(params, ['settle'])
7474
- productType = self.safe_string(params, 'productType')
7475
- request = {}
7476
- if productType is None:
7477
- sandboxMode = self.safe_value(self.options, 'sandboxMode', False)
7478
- localProductType = None
7479
- if subType == 'inverse':
7480
- localProductType = 'dmcbl'
7481
- else:
7482
- if settle == 'USDT':
7483
- localProductType = 'umcbl'
7484
- elif settle == 'USDC':
7485
- localProductType = 'cmcbl'
7486
- if sandboxMode:
7487
- localProductType = 's' + localProductType
7488
- request['productType'] = localProductType
7489
- response = self.privateMixPostMixV1OrderCloseAllPositions(self.extend(request, params))
7490
- #
7491
- # {
7492
- # "code": "00000",
7493
- # "msg": "success",
7494
- # "requestTime": 1700814442466,
7495
- # "data": {
7496
- # "orderInfo": [
7497
- # {
7498
- # "symbol": "XRPUSDT_UMCBL",
7499
- # "orderId": "1111861847410757635",
7500
- # "clientOid": "1111861847410757637"
7501
- # },
7502
- # ],
7503
- # "failure": [],
7504
- # "result": True
7505
- # }
7506
- # }
7531
+ productType = None
7532
+ productType, params = self.handle_product_type_and_params(None, params)
7533
+ request = {
7534
+ 'productType': productType,
7535
+ }
7536
+ response = self.privateMixPostV2MixOrderClosePositions(self.extend(request, params))
7537
+ #
7538
+ # {
7539
+ # "code": "00000",
7540
+ # "msg": "success",
7541
+ # "requestTime": 1702975017017,
7542
+ # "data": {
7543
+ # "successList": [
7544
+ # {
7545
+ # "orderId": "1120923953904893955",
7546
+ # "clientOid": "1120923953904893956"
7547
+ # }
7548
+ # ],
7549
+ # "failureList": [],
7550
+ # "result": False
7551
+ # }
7552
+ # }
7507
7553
  #
7508
7554
  data = self.safe_value(response, 'data', {})
7509
- orderInfo = self.safe_value(data, 'orderInfo', [])
7555
+ orderInfo = self.safe_value(data, 'successList', [])
7510
7556
  return self.parse_positions(orderInfo, None, params)
7511
7557
 
7512
7558
  def handle_errors(self, code, reason, url, method, headers, body, response, requestHeaders, requestBody):
ccxt/bitrue.py CHANGED
@@ -1483,15 +1483,8 @@ class bitrue(Exchange, ImplicitAPI):
1483
1483
  first = self.safe_string(symbols, 0)
1484
1484
  market = self.market(first)
1485
1485
  if market['swap']:
1486
- request['contractName'] = market['id']
1487
- if market['linear']:
1488
- response = self.fapiV1PublicGetTicker(self.extend(request, params))
1489
- elif market['inverse']:
1490
- response = self.dapiV1PublicGetTicker(self.extend(request, params))
1491
- response['symbol'] = market['id']
1492
- data = [response]
1486
+ raise NotSupported(self.id + ' fetchTickers does not support swap markets, please use fetchTicker instead')
1493
1487
  elif market['spot']:
1494
- request['symbol'] = market['id']
1495
1488
  response = self.spotV1PublicGetTicker24hr(self.extend(request, params))
1496
1489
  data = response
1497
1490
  else:
@@ -1499,7 +1492,7 @@ class bitrue(Exchange, ImplicitAPI):
1499
1492
  else:
1500
1493
  type, params = self.handle_market_type_and_params('fetchTickers', None, params)
1501
1494
  if type != 'spot':
1502
- raise NotSupported(self.id + ' fetchTickers only support spot when symbols is not set')
1495
+ raise NotSupported(self.id + ' fetchTickers only support spot when symbols are not proved')
1503
1496
  response = self.spotV1PublicGetTicker24hr(self.extend(request, params))
1504
1497
  data = response
1505
1498
  #
ccxt/bybit.py CHANGED
@@ -311,6 +311,7 @@ class bybit(Exchange, ImplicitAPI):
311
311
  'v5/account/fee-rate': 10, # 5/s = 1000 / (20 * 10)
312
312
  'v5/account/info': 5,
313
313
  'v5/account/transaction-log': 1,
314
+ 'v5/account/smp-group': 1,
314
315
  'v5/account/mmp-state': 5,
315
316
  # asset
316
317
  'v5/asset/exchange/order-record': 5, # 10/s => cost = 50 / 10 = 5