ccxt 4.4.41__py2.py3-none-any.whl → 4.4.42__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 (162) 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/ace.py +1 -1
  7. ccxt/alpaca.py +0 -1
  8. ccxt/ascendex.py +0 -1
  9. ccxt/async_support/__init__.py +1 -1
  10. ccxt/async_support/ace.py +1 -1
  11. ccxt/async_support/alpaca.py +0 -1
  12. ccxt/async_support/ascendex.py +0 -1
  13. ccxt/async_support/base/exchange.py +15 -15
  14. ccxt/async_support/bigone.py +0 -1
  15. ccxt/async_support/binance.py +3 -0
  16. ccxt/async_support/bingx.py +2 -0
  17. ccxt/async_support/bitfinex.py +122 -0
  18. ccxt/async_support/blofin.py +16 -7
  19. ccxt/async_support/cex.py +1 -1
  20. ccxt/async_support/coinbase.py +8 -9
  21. ccxt/async_support/coinbaseexchange.py +5 -6
  22. ccxt/async_support/coinbaseinternational.py +7 -8
  23. ccxt/async_support/coincatch.py +0 -1
  24. ccxt/async_support/coincheck.py +0 -1
  25. ccxt/async_support/coinex.py +91 -6
  26. ccxt/async_support/coinlist.py +3 -4
  27. ccxt/async_support/coinmate.py +1 -3
  28. ccxt/async_support/coinmetro.py +4 -5
  29. ccxt/async_support/coinone.py +0 -1
  30. ccxt/async_support/coinsph.py +7 -8
  31. ccxt/async_support/cryptocom.py +3 -0
  32. ccxt/async_support/currencycom.py +3 -4
  33. ccxt/async_support/defx.py +6 -7
  34. ccxt/async_support/deribit.py +1 -3
  35. ccxt/async_support/digifinex.py +0 -1
  36. ccxt/async_support/ellipx.py +0 -2
  37. ccxt/async_support/exmo.py +1 -2
  38. ccxt/async_support/gate.py +1 -2
  39. ccxt/async_support/gemini.py +4 -5
  40. ccxt/async_support/hashkey.py +79 -67
  41. ccxt/async_support/hitbtc.py +47 -5
  42. ccxt/async_support/hollaex.py +4 -6
  43. ccxt/async_support/htx.py +1 -3
  44. ccxt/async_support/huobijp.py +0 -1
  45. ccxt/async_support/idex.py +8 -8
  46. ccxt/async_support/independentreserve.py +0 -1
  47. ccxt/async_support/indodax.py +0 -1
  48. ccxt/async_support/kraken.py +63 -3
  49. ccxt/async_support/krakenfutures.py +75 -3
  50. ccxt/async_support/kucoin.py +1 -3
  51. ccxt/async_support/kucoinfutures.py +10 -9
  52. ccxt/async_support/kuna.py +1 -3
  53. ccxt/async_support/latoken.py +1 -3
  54. ccxt/async_support/lbank.py +0 -1
  55. ccxt/async_support/luno.py +0 -1
  56. ccxt/async_support/lykke.py +0 -1
  57. ccxt/async_support/mercado.py +0 -1
  58. ccxt/async_support/mexc.py +3 -4
  59. ccxt/async_support/ndax.py +1 -1
  60. ccxt/async_support/novadax.py +4 -6
  61. ccxt/async_support/oceanex.py +0 -1
  62. ccxt/async_support/okcoin.py +1 -3
  63. ccxt/async_support/okx.py +1 -3
  64. ccxt/async_support/onetrading.py +1 -3
  65. ccxt/async_support/p2b.py +1 -1
  66. ccxt/async_support/paradex.py +5 -7
  67. ccxt/async_support/phemex.py +8 -10
  68. ccxt/async_support/poloniex.py +1 -3
  69. ccxt/async_support/poloniexfutures.py +6 -6
  70. ccxt/async_support/probit.py +0 -1
  71. ccxt/async_support/timex.py +0 -1
  72. ccxt/async_support/tokocrypto.py +11 -14
  73. ccxt/async_support/tradeogre.py +1 -1
  74. ccxt/async_support/upbit.py +0 -1
  75. ccxt/async_support/wavesexchange.py +4 -5
  76. ccxt/async_support/whitebit.py +8 -9
  77. ccxt/async_support/woo.py +98 -12
  78. ccxt/async_support/woofipro.py +96 -15
  79. ccxt/async_support/xt.py +3 -2
  80. ccxt/async_support/yobit.py +0 -1
  81. ccxt/async_support/zaif.py +0 -1
  82. ccxt/async_support/zonda.py +1 -2
  83. ccxt/base/exchange.py +21 -17
  84. ccxt/bigone.py +0 -1
  85. ccxt/binance.py +3 -0
  86. ccxt/bingx.py +2 -0
  87. ccxt/bitfinex.py +122 -0
  88. ccxt/blofin.py +16 -7
  89. ccxt/cex.py +1 -1
  90. ccxt/coinbase.py +8 -9
  91. ccxt/coinbaseexchange.py +5 -6
  92. ccxt/coinbaseinternational.py +7 -8
  93. ccxt/coincatch.py +0 -1
  94. ccxt/coincheck.py +0 -1
  95. ccxt/coinex.py +91 -6
  96. ccxt/coinlist.py +3 -4
  97. ccxt/coinmate.py +1 -3
  98. ccxt/coinmetro.py +4 -5
  99. ccxt/coinone.py +0 -1
  100. ccxt/coinsph.py +7 -8
  101. ccxt/cryptocom.py +3 -0
  102. ccxt/currencycom.py +3 -4
  103. ccxt/defx.py +6 -7
  104. ccxt/deribit.py +1 -3
  105. ccxt/digifinex.py +0 -1
  106. ccxt/ellipx.py +0 -2
  107. ccxt/exmo.py +1 -2
  108. ccxt/gate.py +1 -2
  109. ccxt/gemini.py +4 -5
  110. ccxt/hashkey.py +79 -67
  111. ccxt/hitbtc.py +47 -5
  112. ccxt/hollaex.py +4 -6
  113. ccxt/htx.py +1 -3
  114. ccxt/huobijp.py +0 -1
  115. ccxt/idex.py +8 -8
  116. ccxt/independentreserve.py +0 -1
  117. ccxt/indodax.py +0 -1
  118. ccxt/kraken.py +63 -3
  119. ccxt/krakenfutures.py +75 -3
  120. ccxt/kucoin.py +1 -3
  121. ccxt/kucoinfutures.py +10 -9
  122. ccxt/kuna.py +1 -3
  123. ccxt/latoken.py +1 -3
  124. ccxt/lbank.py +0 -1
  125. ccxt/luno.py +0 -1
  126. ccxt/lykke.py +0 -1
  127. ccxt/mercado.py +0 -1
  128. ccxt/mexc.py +3 -4
  129. ccxt/ndax.py +1 -1
  130. ccxt/novadax.py +4 -6
  131. ccxt/oceanex.py +0 -1
  132. ccxt/okcoin.py +1 -3
  133. ccxt/okx.py +1 -3
  134. ccxt/onetrading.py +1 -3
  135. ccxt/p2b.py +1 -1
  136. ccxt/paradex.py +5 -7
  137. ccxt/phemex.py +8 -10
  138. ccxt/poloniex.py +1 -3
  139. ccxt/poloniexfutures.py +6 -6
  140. ccxt/pro/__init__.py +1 -1
  141. ccxt/probit.py +0 -1
  142. ccxt/timex.py +0 -1
  143. ccxt/tokocrypto.py +11 -14
  144. ccxt/tradeogre.py +1 -1
  145. ccxt/upbit.py +0 -1
  146. ccxt/wavesexchange.py +4 -5
  147. ccxt/whitebit.py +8 -9
  148. ccxt/woo.py +98 -12
  149. ccxt/woofipro.py +96 -15
  150. ccxt/xt.py +3 -2
  151. ccxt/yobit.py +0 -1
  152. ccxt/zaif.py +0 -1
  153. ccxt/zonda.py +1 -2
  154. {ccxt-4.4.41.dist-info → ccxt-4.4.42.dist-info}/METADATA +5 -5
  155. {ccxt-4.4.41.dist-info → ccxt-4.4.42.dist-info}/RECORD +158 -162
  156. ccxt/bitbay.py +0 -17
  157. ccxt/bitfinex2.py +0 -3624
  158. ccxt/hitbtc3.py +0 -16
  159. ccxt/pro/bitfinex2.py +0 -1086
  160. {ccxt-4.4.41.dist-info → ccxt-4.4.42.dist-info}/LICENSE.txt +0 -0
  161. {ccxt-4.4.41.dist-info → ccxt-4.4.42.dist-info}/WHEEL +0 -0
  162. {ccxt-4.4.41.dist-info → ccxt-4.4.42.dist-info}/top_level.txt +0 -0
ccxt/base/exchange.py CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  # -----------------------------------------------------------------------------
6
6
 
7
- __version__ = '4.4.41'
7
+ __version__ = '4.4.42'
8
8
 
9
9
  # -----------------------------------------------------------------------------
10
10
 
@@ -4550,10 +4550,14 @@ class Exchange(object):
4550
4550
 
4551
4551
  def handle_option_and_params_2(self, params: object, methodName1: str, optionName1: str, optionName2: str, defaultValue=None):
4552
4552
  value = None
4553
- value, params = self.handle_option_and_params(params, methodName1, optionName1, defaultValue)
4553
+ value, params = self.handle_option_and_params(params, methodName1, optionName1)
4554
+ if value is not None:
4555
+ # omit optionName2 too from params
4556
+ params = self.omit(params, optionName2)
4557
+ return [value, params]
4554
4558
  # if still None, try optionName2
4555
4559
  value2 = None
4556
- value2, params = self.handle_option_and_params(params, methodName1, optionName2, value)
4560
+ value2, params = self.handle_option_and_params(params, methodName1, optionName2, defaultValue)
4557
4561
  return [value2, params]
4558
4562
 
4559
4563
  def handle_option(self, methodName: str, optionName: str, defaultValue=None):
@@ -5454,44 +5458,44 @@ class Exchange(object):
5454
5458
  query = self.extend(params, {'reduceOnly': True})
5455
5459
  return self.create_order_ws(symbol, type, side, amount, price, query)
5456
5460
 
5457
- def create_stop_order(self, symbol: str, type: OrderType, side: OrderSide, amount: float, price: Num = None, stopPrice: Num = None, params={}):
5461
+ def create_stop_order(self, symbol: str, type: OrderType, side: OrderSide, amount: float, price: Num = None, triggerPrice: Num = None, params={}):
5458
5462
  if not self.has['createStopOrder']:
5459
5463
  raise NotSupported(self.id + ' createStopOrder() is not supported yet')
5460
- if stopPrice is None:
5464
+ if triggerPrice is None:
5461
5465
  raise ArgumentsRequired(self.id + ' create_stop_order() requires a stopPrice argument')
5462
- query = self.extend(params, {'stopPrice': stopPrice})
5466
+ query = self.extend(params, {'stopPrice': triggerPrice})
5463
5467
  return self.create_order(symbol, type, side, amount, price, query)
5464
5468
 
5465
- def create_stop_order_ws(self, symbol: str, type: OrderType, side: OrderSide, amount: float, price: Num = None, stopPrice: Num = None, params={}):
5469
+ def create_stop_order_ws(self, symbol: str, type: OrderType, side: OrderSide, amount: float, price: Num = None, triggerPrice: Num = None, params={}):
5466
5470
  if not self.has['createStopOrderWs']:
5467
5471
  raise NotSupported(self.id + ' createStopOrderWs() is not supported yet')
5468
- if stopPrice is None:
5472
+ if triggerPrice is None:
5469
5473
  raise ArgumentsRequired(self.id + ' createStopOrderWs() requires a stopPrice argument')
5470
- query = self.extend(params, {'stopPrice': stopPrice})
5474
+ query = self.extend(params, {'stopPrice': triggerPrice})
5471
5475
  return self.create_order_ws(symbol, type, side, amount, price, query)
5472
5476
 
5473
- def create_stop_limit_order(self, symbol: str, side: OrderSide, amount: float, price: float, stopPrice: float, params={}):
5477
+ def create_stop_limit_order(self, symbol: str, side: OrderSide, amount: float, price: float, triggerPrice: float, params={}):
5474
5478
  if not self.has['createStopLimitOrder']:
5475
5479
  raise NotSupported(self.id + ' createStopLimitOrder() is not supported yet')
5476
- query = self.extend(params, {'stopPrice': stopPrice})
5480
+ query = self.extend(params, {'stopPrice': triggerPrice})
5477
5481
  return self.create_order(symbol, 'limit', side, amount, price, query)
5478
5482
 
5479
- def create_stop_limit_order_ws(self, symbol: str, side: OrderSide, amount: float, price: float, stopPrice: float, params={}):
5483
+ def create_stop_limit_order_ws(self, symbol: str, side: OrderSide, amount: float, price: float, triggerPrice: float, params={}):
5480
5484
  if not self.has['createStopLimitOrderWs']:
5481
5485
  raise NotSupported(self.id + ' createStopLimitOrderWs() is not supported yet')
5482
- query = self.extend(params, {'stopPrice': stopPrice})
5486
+ query = self.extend(params, {'stopPrice': triggerPrice})
5483
5487
  return self.create_order_ws(symbol, 'limit', side, amount, price, query)
5484
5488
 
5485
- def create_stop_market_order(self, symbol: str, side: OrderSide, amount: float, stopPrice: float, params={}):
5489
+ def create_stop_market_order(self, symbol: str, side: OrderSide, amount: float, triggerPrice: float, params={}):
5486
5490
  if not self.has['createStopMarketOrder']:
5487
5491
  raise NotSupported(self.id + ' createStopMarketOrder() is not supported yet')
5488
- query = self.extend(params, {'stopPrice': stopPrice})
5492
+ query = self.extend(params, {'stopPrice': triggerPrice})
5489
5493
  return self.create_order(symbol, 'market', side, amount, None, query)
5490
5494
 
5491
- def create_stop_market_order_ws(self, symbol: str, side: OrderSide, amount: float, stopPrice: float, params={}):
5495
+ def create_stop_market_order_ws(self, symbol: str, side: OrderSide, amount: float, triggerPrice: float, params={}):
5492
5496
  if not self.has['createStopMarketOrderWs']:
5493
5497
  raise NotSupported(self.id + ' createStopMarketOrderWs() is not supported yet')
5494
- query = self.extend(params, {'stopPrice': stopPrice})
5498
+ query = self.extend(params, {'stopPrice': triggerPrice})
5495
5499
  return self.create_order_ws(symbol, 'market', side, amount, None, query)
5496
5500
 
5497
5501
  def safe_currency_code(self, currencyId: Str, currency: Currency = None):
ccxt/bigone.py CHANGED
@@ -1333,7 +1333,6 @@ class bigone(Exchange, ImplicitAPI):
1333
1333
  'postOnly': self.safe_bool(order, 'post_only'),
1334
1334
  'side': side,
1335
1335
  'price': price,
1336
- 'stopPrice': triggerPrice,
1337
1336
  'triggerPrice': triggerPrice,
1338
1337
  'amount': amount,
1339
1338
  'cost': cost,
ccxt/binance.py CHANGED
@@ -657,6 +657,8 @@ class binance(Exchange, ImplicitAPI):
657
657
  'portfolio/bnb-transfer': 150, # Weight(IP): 1500 => cost = 0.1 * 1500 = 150
658
658
  'portfolio/repay-futures-switch': 150, # Weight(IP): 1500 => cost = 0.1 * 1500 = 150
659
659
  'portfolio/repay-futures-negative-balance': 150, # Weight(IP): 1500 => cost = 0.1 * 1500 = 150
660
+ 'portfolio/mint': 20,
661
+ 'portfolio/redeem': 20,
660
662
  'lending/auto-invest/plan/add': 0.1, # Weight(IP): 1 => cost = 0.1 * 1 = 0.1
661
663
  'lending/auto-invest/plan/edit': 0.1, # Weight(IP): 1 => cost = 0.1 * 1 = 0.1
662
664
  'lending/auto-invest/plan/edit-status': 0.1, # Weight(IP): 1 => cost = 0.1 * 1 = 0.1
@@ -985,6 +987,7 @@ class binance(Exchange, ImplicitAPI):
985
987
  'block/order/orders': 5,
986
988
  'block/order/execute': 5,
987
989
  'block/user-trades': 5,
990
+ 'blockTrades': 5,
988
991
  },
989
992
  'post': {
990
993
  'order': 1,
ccxt/bingx.py CHANGED
@@ -5344,6 +5344,8 @@ class bingx(Exchange, ImplicitAPI):
5344
5344
  elif market['swap']:
5345
5345
  request['endTs'] = now
5346
5346
  if market['spot']:
5347
+ if limit is not None:
5348
+ request['limit'] = limit # default 500, maximum 1000
5347
5349
  response = self.spotV1PrivateGetTradeMyTrades(self.extend(request, params))
5348
5350
  data = self.safe_dict(response, 'data', {})
5349
5351
  fills = self.safe_list(data, 'fills', [])
ccxt/bitfinex.py CHANGED
@@ -100,6 +100,7 @@ class bitfinex(Exchange, ImplicitAPI):
100
100
  'fetchOHLCV': True,
101
101
  'fetchOpenInterest': True,
102
102
  'fetchOpenInterestHistory': True,
103
+ 'fetchOpenInterests': True,
103
104
  'fetchOpenOrder': True,
104
105
  'fetchOpenOrders': True,
105
106
  'fetchOrder': True,
@@ -419,6 +420,75 @@ class bitfinex(Exchange, ImplicitAPI):
419
420
  'TETHERUSE': 'ERC20',
420
421
  },
421
422
  },
423
+ 'features': {
424
+ 'default': {
425
+ 'sandbox': False,
426
+ 'createOrder': {
427
+ 'marginMode': True,
428
+ 'triggerPrice': True,
429
+ 'triggerPriceType': None,
430
+ 'triggerDirection': False,
431
+ 'stopLossPrice': True,
432
+ 'takeProfitPrice': True,
433
+ 'attachedStopLossTakeProfit': None,
434
+ 'timeInForce': {
435
+ 'IOC': True,
436
+ 'FOK': True,
437
+ 'PO': True,
438
+ 'GTD': False,
439
+ },
440
+ 'hedged': False,
441
+ 'trailing': True, # todo: unify
442
+ # todo: leverage unify
443
+ },
444
+ 'createOrders': {
445
+ 'max': 75,
446
+ },
447
+ 'fetchMyTrades': {
448
+ 'marginMode': False,
449
+ 'limit': 2500,
450
+ 'daysBack': None,
451
+ 'untilDays': 100000, # todo: implement
452
+ },
453
+ 'fetchOrder': {
454
+ 'marginMode': False,
455
+ 'trigger': False,
456
+ 'trailing': False,
457
+ },
458
+ 'fetchOpenOrders': {
459
+ 'marginMode': False,
460
+ 'limit': None,
461
+ 'trigger': False,
462
+ 'trailing': False,
463
+ },
464
+ 'fetchOrders': None,
465
+ 'fetchClosedOrders': {
466
+ 'marginMode': False,
467
+ 'limit': None,
468
+ 'daysBackClosed': None,
469
+ 'daysBackCanceled': None,
470
+ 'untilDays': 100000,
471
+ 'trigger': False,
472
+ 'trailing': False,
473
+ },
474
+ 'fetchOHLCV': {
475
+ 'limit': 10000,
476
+ },
477
+ },
478
+ 'spot': {
479
+ 'extends': 'default',
480
+ },
481
+ 'swap': {
482
+ 'linear': {
483
+ 'extends': 'default',
484
+ },
485
+ 'inverse': None,
486
+ },
487
+ 'future': {
488
+ 'linear': None,
489
+ 'inverse': None,
490
+ },
491
+ },
422
492
  'exceptions': {
423
493
  'exact': {
424
494
  '11010': RateLimitExceeded,
@@ -3116,6 +3186,58 @@ class bitfinex(Exchange, ImplicitAPI):
3116
3186
  'previousFundingDatetime': None,
3117
3187
  }
3118
3188
 
3189
+ def fetch_open_interests(self, symbols: Strings = None, params={}):
3190
+ """
3191
+ Retrieves the open interest for a list of symbols
3192
+
3193
+ https://docs.bitfinex.com/reference/rest-public-derivatives-status
3194
+
3195
+ :param str[] [symbols]: a list of unified CCXT market symbols
3196
+ :param dict [params]: exchange specific parameters
3197
+ :returns dict[]: a list of `open interest structures <https://docs.ccxt.com/#/?id=open-interest-structure>`
3198
+ """
3199
+ self.load_markets()
3200
+ symbols = self.market_symbols(symbols)
3201
+ marketIds = ['ALL']
3202
+ if symbols is not None:
3203
+ marketIds = self.market_ids(symbols)
3204
+ request: dict = {
3205
+ 'keys': ','.join(marketIds),
3206
+ }
3207
+ response = self.publicGetStatusDeriv(self.extend(request, params))
3208
+ #
3209
+ # [
3210
+ # [
3211
+ # "tXRPF0:USTF0", # market id
3212
+ # 1706256986000, # millisecond timestamp
3213
+ # null,
3214
+ # 0.512705, # derivative mid price
3215
+ # 0.512395, # underlying spot mid price
3216
+ # null,
3217
+ # 37671483.04, # insurance fund balance
3218
+ # null,
3219
+ # 1706284800000, # timestamp of next funding
3220
+ # 0.00002353, # accrued funding for next period
3221
+ # 317, # next funding step
3222
+ # null,
3223
+ # 0, # current funding
3224
+ # null,
3225
+ # null,
3226
+ # 0.5123016, # mark price
3227
+ # null,
3228
+ # null,
3229
+ # 2233562.03115, # open interest in contracts
3230
+ # null,
3231
+ # null,
3232
+ # null,
3233
+ # 0.0005, # average spread without funding payment
3234
+ # 0.0025 # funding payment cap
3235
+ # ]
3236
+ # ]
3237
+ #
3238
+ result = self.parse_open_interests(response)
3239
+ return self.filter_by_array(result, 'symbol', symbols)
3240
+
3119
3241
  def fetch_open_interest(self, symbol: str, params={}):
3120
3242
  """
3121
3243
  retrieves the open interest of a contract trading pair
ccxt/blofin.py CHANGED
@@ -167,7 +167,7 @@ class blofin(Exchange, ImplicitAPI):
167
167
  'rest': 'https://openapi.blofin.com',
168
168
  },
169
169
  'referral': {
170
- 'url': 'https://blofin.com/register?referral_code=jBd8U1',
170
+ 'url': 'https://blofin.com/register?referral_code=f79EsS',
171
171
  'discount': 0.05,
172
172
  },
173
173
  'www': 'https://www.blofin.com',
@@ -287,10 +287,18 @@ class blofin(Exchange, ImplicitAPI):
287
287
  'brokerId': 'ec6dd3a7dd982d0b',
288
288
  'accountsByType': {
289
289
  'swap': 'futures',
290
+ 'funding': 'funding',
290
291
  'future': 'futures',
292
+ 'copy_trading': 'copy_trading',
293
+ 'earn': 'earn',
294
+ 'spot': 'spot',
291
295
  },
292
296
  'accountsById': {
297
+ 'funding': 'funding',
293
298
  'futures': 'swap',
299
+ 'copy_trading': 'copy_trading',
300
+ 'earn': 'earn',
301
+ 'spot': 'spot',
294
302
  },
295
303
  'sandboxMode': False,
296
304
  'defaultNetwork': 'ERC20',
@@ -873,8 +881,9 @@ class blofin(Exchange, ImplicitAPI):
873
881
  entry = self.safe_dict(data, 0, {})
874
882
  return self.parse_funding_rate(entry, market)
875
883
 
876
- def parse_balance_by_type(self, type, response):
877
- if type:
884
+ def parse_balance_by_type(self, response):
885
+ data = self.safe_list(response, 'data')
886
+ if (data is not None) and isinstance(data, list):
878
887
  return self.parse_funding_balance(response)
879
888
  else:
880
889
  return self.parse_balance(response)
@@ -986,19 +995,19 @@ class blofin(Exchange, ImplicitAPI):
986
995
  :returns dict: a `balance structure <https://docs.ccxt.com/#/?id=balance-structure>`
987
996
  """
988
997
  self.load_markets()
989
- accountType = self.safe_string_2(params, 'accountType', 'type')
990
- params = self.omit(params, ['accountType', 'type'])
998
+ accountType = None
999
+ accountType, params = self.handle_option_and_params_2(params, 'fetchBalance', 'accountType', 'type')
991
1000
  request: dict = {
992
1001
  }
993
1002
  response = None
994
- if accountType is not None:
1003
+ if accountType is not None and accountType != 'swap':
995
1004
  options = self.safe_dict(self.options, 'accountsByType', {})
996
1005
  parsedAccountType = self.safe_string(options, accountType, accountType)
997
1006
  request['accountType'] = parsedAccountType
998
1007
  response = self.privateGetAssetBalances(self.extend(request, params))
999
1008
  else:
1000
1009
  response = self.privateGetAccountBalance(self.extend(request, params))
1001
- return self.parse_balance_by_type(accountType, response)
1010
+ return self.parse_balance_by_type(response)
1002
1011
 
1003
1012
  def create_order_request(self, symbol: str, type: OrderType, side: OrderSide, amount: float, price: Num = None, params={}):
1004
1013
  market = self.market(symbol)
ccxt/cex.py CHANGED
@@ -1066,7 +1066,7 @@ class cex(Exchange, ImplicitAPI):
1066
1066
  'postOnly': None,
1067
1067
  'side': self.safe_string_lower(order, 'side'),
1068
1068
  'price': self.safe_number(order, 'price'),
1069
- 'stopPrice': self.safe_number(order, 'stopPrice'),
1069
+ 'triggerPrice': self.safe_number(order, 'stopPrice'),
1070
1070
  'amount': requestedBase,
1071
1071
  'cost': executedQuote,
1072
1072
  'average': self.safe_number(order, 'averagePrice'),
ccxt/coinbase.py CHANGED
@@ -2809,10 +2809,10 @@ class coinbase(Exchange, ImplicitAPI):
2809
2809
  'product_id': market['id'],
2810
2810
  'side': side.upper(),
2811
2811
  }
2812
- stopPrice = self.safe_number_n(params, ['stopPrice', 'stop_price', 'triggerPrice'])
2812
+ triggerPrice = self.safe_number_n(params, ['stopPrice', 'stop_price', 'triggerPrice'])
2813
2813
  stopLossPrice = self.safe_number(params, 'stopLossPrice')
2814
2814
  takeProfitPrice = self.safe_number(params, 'takeProfitPrice')
2815
- isStop = stopPrice is not None
2815
+ isStop = triggerPrice is not None
2816
2816
  isStopLoss = stopLossPrice is not None
2817
2817
  isTakeProfit = takeProfitPrice is not None
2818
2818
  timeInForce = self.safe_string(params, 'timeInForce')
@@ -2830,7 +2830,7 @@ class coinbase(Exchange, ImplicitAPI):
2830
2830
  'stop_limit_stop_limit_gtd': {
2831
2831
  'base_size': self.amount_to_precision(symbol, amount),
2832
2832
  'limit_price': self.price_to_precision(symbol, price),
2833
- 'stop_price': self.price_to_precision(symbol, stopPrice),
2833
+ 'stop_price': self.price_to_precision(symbol, triggerPrice),
2834
2834
  'stop_direction': stopDirection,
2835
2835
  'end_time': endTime,
2836
2836
  },
@@ -2840,25 +2840,25 @@ class coinbase(Exchange, ImplicitAPI):
2840
2840
  'stop_limit_stop_limit_gtc': {
2841
2841
  'base_size': self.amount_to_precision(symbol, amount),
2842
2842
  'limit_price': self.price_to_precision(symbol, price),
2843
- 'stop_price': self.price_to_precision(symbol, stopPrice),
2843
+ 'stop_price': self.price_to_precision(symbol, triggerPrice),
2844
2844
  'stop_direction': stopDirection,
2845
2845
  },
2846
2846
  }
2847
2847
  elif isStopLoss or isTakeProfit:
2848
- triggerPrice = None
2848
+ tpslPrice = None
2849
2849
  if isStopLoss:
2850
2850
  if stopDirection is None:
2851
2851
  stopDirection = 'STOP_DIRECTION_STOP_UP' if (side == 'buy') else 'STOP_DIRECTION_STOP_DOWN'
2852
- triggerPrice = self.price_to_precision(symbol, stopLossPrice)
2852
+ tpslPrice = self.price_to_precision(symbol, stopLossPrice)
2853
2853
  else:
2854
2854
  if stopDirection is None:
2855
2855
  stopDirection = 'STOP_DIRECTION_STOP_DOWN' if (side == 'buy') else 'STOP_DIRECTION_STOP_UP'
2856
- triggerPrice = self.price_to_precision(symbol, takeProfitPrice)
2856
+ tpslPrice = self.price_to_precision(symbol, takeProfitPrice)
2857
2857
  request['order_configuration'] = {
2858
2858
  'stop_limit_stop_limit_gtc': {
2859
2859
  'base_size': self.amount_to_precision(symbol, amount),
2860
2860
  'limit_price': self.price_to_precision(symbol, price),
2861
- 'stop_price': triggerPrice,
2861
+ 'stop_price': tpslPrice,
2862
2862
  'stop_direction': stopDirection,
2863
2863
  },
2864
2864
  }
@@ -3109,7 +3109,6 @@ class coinbase(Exchange, ImplicitAPI):
3109
3109
  'postOnly': postOnly,
3110
3110
  'side': self.safe_string_lower(order, 'side'),
3111
3111
  'price': price,
3112
- 'stopPrice': triggerPrice,
3113
3112
  'triggerPrice': triggerPrice,
3114
3113
  'amount': amount,
3115
3114
  'filled': self.safe_string(order, 'filled_size'),
ccxt/coinbaseexchange.py CHANGED
@@ -1042,7 +1042,7 @@ class coinbaseexchange(Exchange, ImplicitAPI):
1042
1042
  side = self.safe_string(order, 'side')
1043
1043
  timeInForce = self.safe_string(order, 'time_in_force')
1044
1044
  postOnly = self.safe_value(order, 'post_only')
1045
- stopPrice = self.safe_number(order, 'stop_price')
1045
+ triggerPrice = self.safe_number(order, 'stop_price')
1046
1046
  clientOrderId = self.safe_string(order, 'client_oid')
1047
1047
  return self.safe_order({
1048
1048
  'id': id,
@@ -1058,8 +1058,7 @@ class coinbaseexchange(Exchange, ImplicitAPI):
1058
1058
  'postOnly': postOnly,
1059
1059
  'side': side,
1060
1060
  'price': price,
1061
- 'stopPrice': stopPrice,
1062
- 'triggerPrice': stopPrice,
1061
+ 'triggerPrice': triggerPrice,
1063
1062
  'cost': cost,
1064
1063
  'amount': amount,
1065
1064
  'filled': filled,
@@ -1224,9 +1223,9 @@ class coinbaseexchange(Exchange, ImplicitAPI):
1224
1223
  clientOrderId = self.safe_string_2(params, 'clientOrderId', 'client_oid')
1225
1224
  if clientOrderId is not None:
1226
1225
  request['client_oid'] = clientOrderId
1227
- stopPrice = self.safe_number_n(params, ['stopPrice', 'stop_price', 'triggerPrice'])
1228
- if stopPrice is not None:
1229
- request['stop_price'] = self.price_to_precision(symbol, stopPrice)
1226
+ triggerPrice = self.safe_number_n(params, ['stopPrice', 'stop_price', 'triggerPrice'])
1227
+ if triggerPrice is not None:
1228
+ request['stop_price'] = self.price_to_precision(symbol, triggerPrice)
1230
1229
  timeInForce = self.safe_string_2(params, 'timeInForce', 'time_in_force')
1231
1230
  if timeInForce is not None:
1232
1231
  request['time_in_force'] = timeInForce
@@ -1630,7 +1630,7 @@ class coinbaseinternational(Exchange, ImplicitAPI):
1630
1630
  :param float amount: how much you want to trade in units of the base currency, quote currency for 'market' 'buy' orders
1631
1631
  :param float [price]: the price to fulfill the order, in units of the quote currency, ignored in market orders
1632
1632
  :param dict [params]: extra parameters specific to the exchange API endpoint
1633
- :param float [params.stopPrice]: price to trigger stop orders
1633
+ :param float [params.stopPrice]: alias for triggerPrice
1634
1634
  :param float [params.triggerPrice]: price to trigger stop orders
1635
1635
  :param float [params.stopLossPrice]: price to trigger stop-loss orders
1636
1636
  :param bool [params.postOnly]: True or False
@@ -1642,7 +1642,7 @@ class coinbaseinternational(Exchange, ImplicitAPI):
1642
1642
  self.load_markets()
1643
1643
  market = self.market(symbol)
1644
1644
  typeId = type.upper()
1645
- stopPrice = self.safe_number_n(params, ['triggerPrice', 'stopPrice', 'stop_price'])
1645
+ triggerPrice = self.safe_number_n(params, ['triggerPrice', 'stopPrice', 'stop_price'])
1646
1646
  clientOrderIdprefix = self.safe_string(self.options, 'brokerId', 'nfqkvdjp')
1647
1647
  clientOrderId = clientOrderIdprefix + '-' + self.uuid()
1648
1648
  clientOrderId = clientOrderId[0:17]
@@ -1652,12 +1652,12 @@ class coinbaseinternational(Exchange, ImplicitAPI):
1652
1652
  'instrument': market['id'],
1653
1653
  'size': self.amount_to_precision(market['symbol'], amount),
1654
1654
  }
1655
- if stopPrice is not None:
1655
+ if triggerPrice is not None:
1656
1656
  if type == 'limit':
1657
1657
  typeId = 'STOP_LIMIT'
1658
1658
  else:
1659
1659
  typeId = 'STOP'
1660
- request['stop_price'] = stopPrice
1660
+ request['stop_price'] = triggerPrice
1661
1661
  request['type'] = typeId
1662
1662
  if type == 'limit':
1663
1663
  if price is None:
@@ -1751,7 +1751,6 @@ class coinbaseinternational(Exchange, ImplicitAPI):
1751
1751
  'postOnly': None,
1752
1752
  'side': self.safe_string_lower(order, 'side'),
1753
1753
  'price': self.safe_string(order, 'price'),
1754
- 'stopPrice': self.safe_string(order, 'stop_price'),
1755
1754
  'triggerPrice': self.safe_string(order, 'stop_price'),
1756
1755
  'amount': self.safe_string(order, 'size'),
1757
1756
  'filled': self.safe_string(order, 'exec_qty'),
@@ -1885,9 +1884,9 @@ class coinbaseinternational(Exchange, ImplicitAPI):
1885
1884
  request['size'] = self.amount_to_precision(symbol, amount)
1886
1885
  if price is not None:
1887
1886
  request['price'] = self.price_to_precision(symbol, price)
1888
- stopPrice = self.safe_number_n(params, ['stopPrice', 'stop_price', 'triggerPrice'])
1889
- if stopPrice is not None:
1890
- request['stop_price'] = stopPrice
1887
+ triggerPrice = self.safe_number_n(params, ['stopPrice', 'stop_price', 'triggerPrice'])
1888
+ if triggerPrice is not None:
1889
+ request['stop_price'] = triggerPrice
1891
1890
  clientOrderId = self.safe_string_2(params, 'client_order_id', 'clientOrderId')
1892
1891
  if clientOrderId is None:
1893
1892
  raise BadRequest(self.id + ' editOrder() requires a clientOrderId parameter')
ccxt/coincatch.py CHANGED
@@ -3907,7 +3907,6 @@ class coincatch(Exchange, ImplicitAPI):
3907
3907
  'amount': amount,
3908
3908
  'filled': self.safe_string_2(order, 'fillQuantity', 'filledQty'),
3909
3909
  'remaining': None,
3910
- 'stopPrice': None,
3911
3910
  'triggerPrice': triggerPrice,
3912
3911
  'takeProfitPrice': takeProfitPrice,
3913
3912
  'stopLossPrice': stopLossPrice,
ccxt/coincheck.py CHANGED
@@ -267,7 +267,6 @@ class coincheck(Exchange, ImplicitAPI):
267
267
  'status': status,
268
268
  'symbol': symbol,
269
269
  'price': price,
270
- 'stopPrice': None,
271
270
  'triggerPrice': None,
272
271
  'cost': None,
273
272
  'fee': None,
ccxt/coinex.py CHANGED
@@ -513,6 +513,92 @@ class coinex(Exchange, ImplicitAPI):
513
513
  # CSC, AE, BASE, AIPG, AKASH, POLKADOTASSETHUB ?, ALEO, STX, ALGO, ALPH, BLAST, AR, ARCH, ARDR, ARK, ARRR, MANTA, NTRN, LUNA, AURORA, AVAIL, ASC20, AVA, AYA, AZERO, BAN, BAND, BB, RUNES, BEAM, BELLSCOIN, BITCI, NEAR, AGORIC, BLOCX, BNC, BOBA, BRISE, KRC20, CANTO, CAPS, CCD, CELO, CFX, CHI, CKB, CLORE, CLV, CORE, CSPR, CTXC, DAG, DCR, DERO, DESO, DEFI, DGB, DNX, DOCK, DOGECHAIN, DYDX, DYMENSION, EGLD, ELA, ELF, ENJIN, EOSIO, ERG, ETN_SC, EVMOS, EWC, SGB, FACT, FB, FET, FIO, FIRO, NEO3, FLOW, FLARE, FLUX, LINEA, FREN, FSN, FB_BRC20, GLMR, GRIN, GRS, HACASH, HBAR, HERB, HIVE, MAPO, HMND, HNS, ZKSYNC, HTR, HUAHUA, MERLIN, ICP, ICX, INJ, IOST, IOTA, IOTX, IRIS, IRON, ONE, JOYSTREAM, KAI, KAR, KAS, KAVA, KCN, KDA, KLAY, KLY, KMD, KSM, KUB, KUJIRA, LAT, LBC, LUNC, LUKSO, MARS, METIS, MINA, MANTLE, MOB, MODE, MONA, MOVR, MTL, NEOX, NEXA, NIBI, NIMIQ, NMC, ONOMY, NRG, WAVES, NULS, OAS, OCTA, OLT, ONT, OORT, ORAI, OSMO, P3D, COMPOSABLE, PIVX, RON, POKT, POLYMESH, PRE_MARKET, PYI, QKC, QTUM, QUBIC, RSK, ROSE, ROUTE, RTM, THORCHAIN, RVN, RADIANT, SAGA, SALVIUM, SATOX, SC, SCP, _NULL, SCRT, SDN, RGBPP, SELF, SMH, SPACE, STARGAZE, STC, STEEM, STRATISEVM, STRD, STARKNET, SXP, SYS, TAIKO, TAO, TARA, TENET, THETA, TT, VENOM, VECHAIN, TOMO, VITE, VLX, VSYS, VTC, WAN, WAXP, WEMIX, XCH, XDC, XEC, XELIS, NEM, XHV, XLM, XNA, NANO, XPLA, XPR, XPRT, XRD, XTZ, XVG, XYM, ZANO, ZEC, ZEN, ZEPH, ZETA
514
514
  },
515
515
  },
516
+ 'features': {
517
+ 'spot': {
518
+ 'sandbox': False,
519
+ 'createOrder': {
520
+ 'marginMode': True,
521
+ 'triggerPrice': True,
522
+ 'triggerPriceType': None,
523
+ 'triggerDirection': False,
524
+ 'stopLossPrice': False, # todo
525
+ 'takeProfitPrice': False, # todo
526
+ 'attachedStopLossTakeProfit': None,
527
+ 'timeInForce': {
528
+ 'IOC': True,
529
+ 'FOK': True,
530
+ 'PO': True,
531
+ 'GTD': False,
532
+ },
533
+ 'hedged': False,
534
+ 'trailing': False,
535
+ # exchange-supported features
536
+ # 'marketBuyRequiresPrice': True,
537
+ # 'marketBuyByCost': True,
538
+ # 'selfTradePrevention': True,
539
+ # 'iceberg': True,
540
+ },
541
+ 'createOrders': {
542
+ 'max': 5,
543
+ },
544
+ 'fetchMyTrades': {
545
+ 'marginMode': True,
546
+ 'limit': 1000,
547
+ 'daysBack': None,
548
+ 'untilDays': 100000,
549
+ },
550
+ 'fetchOrder': {
551
+ 'marginMode': False,
552
+ 'trigger': False,
553
+ 'trailing': False,
554
+ },
555
+ 'fetchOpenOrders': {
556
+ 'marginMode': True,
557
+ 'limit': 1000,
558
+ 'trigger': True,
559
+ 'trailing': False,
560
+ },
561
+ 'fetchOrders': None,
562
+ 'fetchClosedOrders': {
563
+ 'marginMode': True,
564
+ 'limit': 1000,
565
+ 'daysBackClosed': None,
566
+ 'daysBackCanceled': None,
567
+ 'untilDays': None,
568
+ 'trigger': True,
569
+ 'trailing': False,
570
+ },
571
+ 'fetchOHLCV': {
572
+ 'limit': 1000,
573
+ },
574
+ },
575
+ 'forDerivatives': {
576
+ 'extends': 'spot',
577
+ 'createOrder': {
578
+ 'marginMode': True,
579
+ 'stopLossPrice': True,
580
+ 'takeProfitPrice': True,
581
+ },
582
+ 'fetchOpenOrders': {
583
+ 'marginMode': False,
584
+ },
585
+ 'fetchClosedOrders': {
586
+ 'marginMode': False,
587
+ },
588
+ },
589
+ 'swap': {
590
+ 'linear': {
591
+ 'extends': 'forDerivatives',
592
+ },
593
+ 'inverse': {
594
+ 'extends': 'forDerivatives',
595
+ },
596
+ },
597
+ 'future': {
598
+ 'linear': None,
599
+ 'inverse': None,
600
+ },
601
+ },
516
602
  'commonCurrencies': {
517
603
  'ACM': 'Actinium',
518
604
  },
@@ -1977,7 +2063,6 @@ class coinex(Exchange, ImplicitAPI):
1977
2063
  'reduceOnly': None,
1978
2064
  'side': side,
1979
2065
  'price': self.safe_string(order, 'price'),
1980
- 'stopPrice': self.safe_string(order, 'trigger_price'),
1981
2066
  'triggerPrice': self.safe_string(order, 'trigger_price'),
1982
2067
  'takeProfitPrice': self.safe_number(order, 'take_profit_price'),
1983
2068
  'stopLossPrice': self.safe_number(order, 'stop_loss_price'),
@@ -2017,7 +2102,7 @@ class coinex(Exchange, ImplicitAPI):
2017
2102
  market = self.market(symbol)
2018
2103
  swap = market['swap']
2019
2104
  clientOrderId = self.safe_string_2(params, 'client_id', 'clientOrderId')
2020
- stopPrice = self.safe_string_2(params, 'stopPrice', 'triggerPrice')
2105
+ triggerPrice = self.safe_string_2(params, 'stopPrice', 'triggerPrice')
2021
2106
  stopLossPrice = self.safe_string(params, 'stopLossPrice')
2022
2107
  takeProfitPrice = self.safe_string(params, 'takeProfitPrice')
2023
2108
  option = self.safe_string(params, 'option')
@@ -2062,8 +2147,8 @@ class coinex(Exchange, ImplicitAPI):
2062
2147
  request['take_profit_type'] = self.safe_string(params, 'stop_type', 'latest_price')
2063
2148
  else:
2064
2149
  request['amount'] = self.amount_to_precision(symbol, amount)
2065
- if stopPrice is not None:
2066
- request['trigger_price'] = self.price_to_precision(symbol, stopPrice)
2150
+ if triggerPrice is not None:
2151
+ request['trigger_price'] = self.price_to_precision(symbol, triggerPrice)
2067
2152
  request['trigger_price_type'] = self.safe_string(params, 'stop_type', 'latest_price')
2068
2153
  else:
2069
2154
  marginMode = None
@@ -2090,8 +2175,8 @@ class coinex(Exchange, ImplicitAPI):
2090
2175
  request['amount'] = self.cost_to_precision(symbol, amount)
2091
2176
  else:
2092
2177
  request['amount'] = self.amount_to_precision(symbol, amount)
2093
- if stopPrice is not None:
2094
- request['trigger_price'] = self.price_to_precision(symbol, stopPrice)
2178
+ if triggerPrice is not None:
2179
+ request['trigger_price'] = self.price_to_precision(symbol, triggerPrice)
2095
2180
  params = self.omit(params, ['reduceOnly', 'timeInForce', 'postOnly', 'stopPrice', 'triggerPrice', 'stopLossPrice', 'takeProfitPrice'])
2096
2181
  return self.extend(request, params)
2097
2182