ccxt 4.3.51__py2.py3-none-any.whl → 4.3.53__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.

Potentially problematic release.


This version of ccxt might be problematic. Click here for more details.

ccxt/__init__.py CHANGED
@@ -22,7 +22,7 @@
22
22
 
23
23
  # ----------------------------------------------------------------------------
24
24
 
25
- __version__ = '4.3.51'
25
+ __version__ = '4.3.53'
26
26
 
27
27
  # ----------------------------------------------------------------------------
28
28
 
@@ -178,6 +178,7 @@ from ccxt.timex import timex # noqa: F4
178
178
  from ccxt.tokocrypto import tokocrypto # noqa: F401
179
179
  from ccxt.tradeogre import tradeogre # noqa: F401
180
180
  from ccxt.upbit import upbit # noqa: F401
181
+ from ccxt.vertex import vertex # noqa: F401
181
182
  from ccxt.wavesexchange import wavesexchange # noqa: F401
182
183
  from ccxt.wazirx import wazirx # noqa: F401
183
184
  from ccxt.whitebit import whitebit # noqa: F401
@@ -287,6 +288,7 @@ exchanges = [
287
288
  'tokocrypto',
288
289
  'tradeogre',
289
290
  'upbit',
291
+ 'vertex',
290
292
  'wavesexchange',
291
293
  'wazirx',
292
294
  'whitebit',
ccxt/abstract/okx.py CHANGED
@@ -223,6 +223,7 @@ class ImplicitAPI:
223
223
  private_post_sprd_cancel_order = privatePostSprdCancelOrder = Entry('sprd/cancel-order', 'private', 'POST', {'cost': 1})
224
224
  private_post_sprd_mass_cancel = privatePostSprdMassCancel = Entry('sprd/mass-cancel', 'private', 'POST', {'cost': 1})
225
225
  private_post_sprd_amend_order = privatePostSprdAmendOrder = Entry('sprd/amend-order', 'private', 'POST', {'cost': 1})
226
+ private_post_sprd_cancel_all_after = privatePostSprdCancelAllAfter = Entry('sprd/cancel-all-after', 'private', 'POST', {'cost': 10})
226
227
  private_post_trade_order = privatePostTradeOrder = Entry('trade/order', 'private', 'POST', {'cost': 0.3333333333333333})
227
228
  private_post_trade_batch_orders = privatePostTradeBatchOrders = Entry('trade/batch-orders', 'private', 'POST', {'cost': 0.06666666666666667})
228
229
  private_post_trade_cancel_order = privatePostTradeCancelOrder = Entry('trade/cancel-order', 'private', 'POST', {'cost': 0.3333333333333333})
@@ -0,0 +1,19 @@
1
+ from ccxt.base.types import Entry
2
+
3
+
4
+ class ImplicitAPI:
5
+ v1_archive_post = v1ArchivePost = Entry('', ['v1', 'archive'], 'POST', {'cost': 1})
6
+ v1_gateway_get_query = v1GatewayGetQuery = Entry('query', ['v1', 'gateway'], 'GET', {'cost': 1})
7
+ v1_gateway_get_symbols = v1GatewayGetSymbols = Entry('symbols', ['v1', 'gateway'], 'GET', {'cost': 1})
8
+ v1_gateway_get_time = v1GatewayGetTime = Entry('time', ['v1', 'gateway'], 'GET', {'cost': 1})
9
+ v1_gateway_post_query = v1GatewayPostQuery = Entry('query', ['v1', 'gateway'], 'POST', {'cost': 1})
10
+ v1_gateway_post_execute = v1GatewayPostExecute = Entry('execute', ['v1', 'gateway'], 'POST', {'cost': 1})
11
+ v1_trigger_post_execute = v1TriggerPostExecute = Entry('execute', ['v1', 'trigger'], 'POST', {'cost': 1})
12
+ v1_trigger_post_query = v1TriggerPostQuery = Entry('query', ['v1', 'trigger'], 'POST', {'cost': 1})
13
+ v2_archive_get_tickers = v2ArchiveGetTickers = Entry('tickers', ['v2', 'archive'], 'GET', {'cost': 1})
14
+ v2_archive_get_contracts = v2ArchiveGetContracts = Entry('contracts', ['v2', 'archive'], 'GET', {'cost': 1})
15
+ v2_archive_get_trades = v2ArchiveGetTrades = Entry('trades', ['v2', 'archive'], 'GET', {'cost': 1})
16
+ v2_archive_get_vrtx = v2ArchiveGetVrtx = Entry('vrtx', ['v2', 'archive'], 'GET', {'cost': 1})
17
+ v2_gateway_get_assets = v2GatewayGetAssets = Entry('assets', ['v2', 'gateway'], 'GET', {'cost': 0.6667})
18
+ v2_gateway_get_pairs = v2GatewayGetPairs = Entry('pairs', ['v2', 'gateway'], 'GET', {'cost': 1})
19
+ v2_gateway_get_orderbook = v2GatewayGetOrderbook = Entry('orderbook', ['v2', 'gateway'], 'GET', {'cost': 1})
@@ -4,7 +4,7 @@
4
4
 
5
5
  # -----------------------------------------------------------------------------
6
6
 
7
- __version__ = '4.3.51'
7
+ __version__ = '4.3.53'
8
8
 
9
9
  # -----------------------------------------------------------------------------
10
10
 
@@ -158,6 +158,7 @@ from ccxt.async_support.timex import timex
158
158
  from ccxt.async_support.tokocrypto import tokocrypto # noqa: F401
159
159
  from ccxt.async_support.tradeogre import tradeogre # noqa: F401
160
160
  from ccxt.async_support.upbit import upbit # noqa: F401
161
+ from ccxt.async_support.vertex import vertex # noqa: F401
161
162
  from ccxt.async_support.wavesexchange import wavesexchange # noqa: F401
162
163
  from ccxt.async_support.wazirx import wazirx # noqa: F401
163
164
  from ccxt.async_support.whitebit import whitebit # noqa: F401
@@ -267,6 +268,7 @@ exchanges = [
267
268
  'tokocrypto',
268
269
  'tradeogre',
269
270
  'upbit',
271
+ 'vertex',
270
272
  'wavesexchange',
271
273
  'wazirx',
272
274
  'whitebit',
@@ -2,7 +2,7 @@
2
2
 
3
3
  # -----------------------------------------------------------------------------
4
4
 
5
- __version__ = '4.3.51'
5
+ __version__ = '4.3.53'
6
6
 
7
7
  # -----------------------------------------------------------------------------
8
8
 
@@ -184,7 +184,7 @@ class ArrayCacheBySymbolBySide(ArrayCache):
184
184
  if reference != item:
185
185
  reference.update(item)
186
186
  item = reference
187
- index = self._index.index(item['side'])
187
+ index = self._index.index(item['symbol'] + item['side'])
188
188
  del self._deque[index]
189
189
  del self._index[index]
190
190
  else:
@@ -194,7 +194,7 @@ class ArrayCacheBySymbolBySide(ArrayCache):
194
194
  self._index.popleft()
195
195
  del self.hashmap[delete_item['symbol']][delete_item['side']]
196
196
  self._deque.append(item)
197
- self._index.append(item['side'])
197
+ self._index.append(item['symbol'] + item['side'])
198
198
  if self._clear_all_updates:
199
199
  self._clear_all_updates = False
200
200
  self._clear_updates_by_symbol.clear()
@@ -10283,9 +10283,9 @@ class binance(Exchange, ImplicitAPI):
10283
10283
  orderidlistLength = len(orderidlist)
10284
10284
  origclientorderidlistLength = len(origclientorderidlist)
10285
10285
  if orderidlistLength > 0:
10286
- query = query + '&' + 'orderidlist=[' + ','.join(orderidlist) + ']'
10286
+ query = query + '&' + 'orderidlist=%5B' + '%2C'.join(orderidlist) + '%5D'
10287
10287
  if origclientorderidlistLength > 0:
10288
- query = query + '&' + 'origclientorderidlist=[' + ','.join(origclientorderidlist) + ']'
10288
+ query = query + '&' + 'origclientorderidlist=%5B' + '%2C'.join(origclientorderidlist) + '%5D'
10289
10289
  else:
10290
10290
  query = self.rawencode(extendedParams)
10291
10291
  else:
@@ -10682,7 +10682,7 @@ class binance(Exchange, ImplicitAPI):
10682
10682
  'info': info,
10683
10683
  }
10684
10684
 
10685
- def parse_isolated_borrow_rate(self, info, market: Market = None):
10685
+ def parse_isolated_borrow_rate(self, info: dict, market: Market = None) -> IsolatedBorrowRate:
10686
10686
  #
10687
10687
  # {
10688
10688
  # "vipLevel": 0,
@@ -7451,7 +7451,7 @@ class bitget(Exchange, ImplicitAPI):
7451
7451
  first['timestamp'] = timestamp
7452
7452
  return self.parse_isolated_borrow_rate(first, market)
7453
7453
 
7454
- def parse_isolated_borrow_rate(self, info, market: Market = None) -> IsolatedBorrowRate:
7454
+ def parse_isolated_borrow_rate(self, info: dict, market: Market = None) -> IsolatedBorrowRate:
7455
7455
  #
7456
7456
  # {
7457
7457
  # "symbol": "BTCUSDT",
@@ -3601,7 +3601,7 @@ class bitmart(Exchange, ImplicitAPI):
3601
3601
  borrowRate = self.safe_value(symbols, 0)
3602
3602
  return self.parse_isolated_borrow_rate(borrowRate, market)
3603
3603
 
3604
- def parse_isolated_borrow_rate(self, info, market: Market = None) -> IsolatedBorrowRate:
3604
+ def parse_isolated_borrow_rate(self, info: dict, market: Market = None) -> IsolatedBorrowRate:
3605
3605
  #
3606
3606
  # {
3607
3607
  # "symbol": "BTC_USDT",
@@ -4839,9 +4839,14 @@ class bybit(Exchange, ImplicitAPI):
4839
4839
  :param str [params.baseCoin]: Base coin. Supports linear, inverse & option
4840
4840
  :param str [params.settleCoin]: Settle coin. Supports linear, inverse & option
4841
4841
  :param str [params.orderFilter]: 'Order' or 'StopOrder' or 'tpslOrder'
4842
+ :param boolean [params.paginate]: default False, when True will automatically paginate by calling self endpoint multiple times. See in the docs all the [availble parameters](https://github.com/ccxt/ccxt/wiki/Manual#pagination-params)
4842
4843
  :returns Order[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
4843
4844
  """
4844
4845
  await self.load_markets()
4846
+ paginate = False
4847
+ paginate, params = self.handle_option_and_params(params, 'fetchOpenOrders', 'paginate')
4848
+ if paginate:
4849
+ return await self.fetch_paginated_call_cursor('fetchOpenOrders', symbol, since, limit, params, 'nextPageCursor', 'cursor', None, 50)
4845
4850
  enableUnifiedMargin, enableUnifiedAccount = await self.is_unified_enabled()
4846
4851
  isUnifiedAccount = (enableUnifiedMargin or enableUnifiedAccount)
4847
4852
  request: dict = {}
@@ -4838,7 +4838,7 @@ class coinex(Exchange, ImplicitAPI):
4838
4838
  data = self.safe_list(response, 'data', [])
4839
4839
  return self.parse_transactions(data, currency, since, limit)
4840
4840
 
4841
- def parse_isolated_borrow_rate(self, info, market: Market = None) -> IsolatedBorrowRate:
4841
+ def parse_isolated_borrow_rate(self, info: dict, market: Market = None) -> IsolatedBorrowRate:
4842
4842
  #
4843
4843
  # {
4844
4844
  # "market": "BTCUSDT",
ccxt/async_support/htx.py CHANGED
@@ -6181,7 +6181,7 @@ class htx(Exchange, ImplicitAPI):
6181
6181
  data = self.safe_value(response, 'data', [])
6182
6182
  return self.parse_isolated_borrow_rates(data)
6183
6183
 
6184
- def parse_isolated_borrow_rate(self, info, market: Market = None) -> IsolatedBorrowRate:
6184
+ def parse_isolated_borrow_rate(self, info: dict, market: Market = None) -> IsolatedBorrowRate:
6185
6185
  #
6186
6186
  # {
6187
6187
  # "symbol": "1inchusdt",
@@ -445,23 +445,26 @@ class hyperliquid(Exchange, ImplicitAPI):
445
445
  for i in range(0, len(meta)):
446
446
  market = self.safe_dict(meta, i, {})
447
447
  marketName = self.safe_string(market, 'name')
448
- if marketName.find('/') < 0:
449
- # there are some weird spot markets in testnet, eg @2
450
- continue
451
- marketParts = marketName.split('/')
452
- baseName = self.safe_string(marketParts, 0)
453
- quoteId = self.safe_string(marketParts, 1)
454
- base = self.safe_currency_code(baseName)
455
- quote = self.safe_currency_code(quoteId)
456
- symbol = base + '/' + quote
448
+ # if marketName.find('/') < 0:
449
+ # # there are some weird spot markets in testnet, eg @2
450
+ # continue
451
+ # }
452
+ # marketParts = marketName.split('/')
453
+ # baseName = self.safe_string(marketParts, 0)
454
+ # quoteId = self.safe_string(marketParts, 1)
457
455
  fees = self.safe_dict(self.fees, 'spot', {})
458
456
  taker = self.safe_number(fees, 'taker')
459
457
  maker = self.safe_number(fees, 'maker')
460
458
  tokensPos = self.safe_list(market, 'tokens', [])
461
459
  baseTokenPos = self.safe_integer(tokensPos, 0)
462
- # quoteTokenPos = self.safe_integer(tokensPos, 1)
460
+ quoteTokenPos = self.safe_integer(tokensPos, 1)
463
461
  baseTokenInfo = self.safe_dict(tokens, baseTokenPos, {})
464
- # quoteTokenInfo = self.safe_dict(tokens, quoteTokenPos, {})
462
+ quoteTokenInfo = self.safe_dict(tokens, quoteTokenPos, {})
463
+ baseName = self.safe_string(baseTokenInfo, 'name')
464
+ quoteId = self.safe_string(quoteTokenInfo, 'name')
465
+ base = self.safe_currency_code(baseName)
466
+ quote = self.safe_currency_code(quoteId)
467
+ symbol = base + '/' + quote
465
468
  innerBaseTokenInfo = self.safe_dict(baseTokenInfo, 'spec', baseTokenInfo)
466
469
  # innerQuoteTokenInfo = self.safe_dict(quoteTokenInfo, 'spec', quoteTokenInfo)
467
470
  amountPrecision = self.parse_number(self.parse_precision(self.safe_string(innerBaseTokenInfo, 'szDecimals')))
@@ -1115,7 +1118,7 @@ class hyperliquid(Exchange, ImplicitAPI):
1115
1118
  }
1116
1119
  if clientOrderId is not None:
1117
1120
  orderObj['c'] = clientOrderId
1118
- orderReq.append(self.extend(orderObj, orderParams))
1121
+ orderReq.append(orderObj)
1119
1122
  vaultAddress = self.format_vault_address(self.safe_string(params, 'vaultAddress'))
1120
1123
  orderAction: dict = {
1121
1124
  'type': 'order',
@@ -1135,7 +1138,7 @@ class hyperliquid(Exchange, ImplicitAPI):
1135
1138
  if vaultAddress is not None:
1136
1139
  params = self.omit(params, 'vaultAddress')
1137
1140
  request['vaultAddress'] = vaultAddress
1138
- response = await self.privatePostExchange(self.extend(request, params))
1141
+ response = await self.privatePostExchange(request)
1139
1142
  #
1140
1143
  # {
1141
1144
  # "status": "ok",
@@ -1227,7 +1230,7 @@ class hyperliquid(Exchange, ImplicitAPI):
1227
1230
  if vaultAddress is not None:
1228
1231
  params = self.omit(params, 'vaultAddress')
1229
1232
  request['vaultAddress'] = vaultAddress
1230
- response = await self.privatePostExchange(self.extend(request, params))
1233
+ response = await self.privatePostExchange(request)
1231
1234
  #
1232
1235
  # {
1233
1236
  # "status":"ok",
@@ -1303,7 +1306,7 @@ class hyperliquid(Exchange, ImplicitAPI):
1303
1306
  if vaultAddress is not None:
1304
1307
  params = self.omit(params, 'vaultAddress')
1305
1308
  request['vaultAddress'] = vaultAddress
1306
- response = await self.privatePostExchange(self.extend(request, params))
1309
+ response = await self.privatePostExchange(request)
1307
1310
  #
1308
1311
  # {
1309
1312
  # "status":"ok",
@@ -1346,7 +1349,7 @@ class hyperliquid(Exchange, ImplicitAPI):
1346
1349
  if vaultAddress is not None:
1347
1350
  params = self.omit(params, 'vaultAddress')
1348
1351
  request['vaultAddress'] = vaultAddress
1349
- response = await self.privatePostExchange(self.extend(request, params))
1352
+ response = await self.privatePostExchange(request)
1350
1353
  #
1351
1354
  # {
1352
1355
  # "status":"err",
@@ -1455,7 +1458,7 @@ class hyperliquid(Exchange, ImplicitAPI):
1455
1458
  if vaultAddress is not None:
1456
1459
  params = self.omit(params, 'vaultAddress')
1457
1460
  request['vaultAddress'] = vaultAddress
1458
- response = await self.privatePostExchange(self.extend(request, params))
1461
+ response = await self.privatePostExchange(request)
1459
1462
  #
1460
1463
  # {
1461
1464
  # "status": "ok",
@@ -2097,10 +2100,9 @@ class hyperliquid(Exchange, ImplicitAPI):
2097
2100
  params = self.omit(params, 'vaultAddress')
2098
2101
  if vaultAddress.startswith('0x'):
2099
2102
  vaultAddress = vaultAddress.replace('0x', '')
2100
- extendedAction = self.extend(updateAction, params)
2101
- signature = self.sign_l1_action(extendedAction, nonce, vaultAddress)
2103
+ signature = self.sign_l1_action(updateAction, nonce, vaultAddress)
2102
2104
  request: dict = {
2103
- 'action': extendedAction,
2105
+ 'action': updateAction,
2104
2106
  'nonce': nonce,
2105
2107
  'signature': signature,
2106
2108
  # 'vaultAddress': vaultAddress,
@@ -2153,7 +2155,7 @@ class hyperliquid(Exchange, ImplicitAPI):
2153
2155
  if vaultAddress is not None:
2154
2156
  params = self.omit(params, 'vaultAddress')
2155
2157
  request['vaultAddress'] = vaultAddress
2156
- response = await self.privatePostExchange(self.extend(request, params))
2158
+ response = await self.privatePostExchange(request)
2157
2159
  #
2158
2160
  # {
2159
2161
  # 'response': {
@@ -2211,7 +2213,7 @@ class hyperliquid(Exchange, ImplicitAPI):
2211
2213
  if vaultAddress is not None:
2212
2214
  params = self.omit(params, 'vaultAddress')
2213
2215
  request['vaultAddress'] = vaultAddress
2214
- response = await self.privatePostExchange(self.extend(request, params))
2216
+ response = await self.privatePostExchange(request)
2215
2217
  #
2216
2218
  # {
2217
2219
  # 'response': {
@@ -2275,7 +2277,7 @@ class hyperliquid(Exchange, ImplicitAPI):
2275
2277
  }
2276
2278
  signature = self.sign_l1_action(action, nonce, vaultAddress)
2277
2279
  innerRequest: dict = {
2278
- 'action': self.extend(action, params),
2280
+ 'action': action,
2279
2281
  'nonce': nonce,
2280
2282
  'signature': signature,
2281
2283
  }
@@ -2308,7 +2310,7 @@ class hyperliquid(Exchange, ImplicitAPI):
2308
2310
  'nonce': nonce,
2309
2311
  'signature': sig,
2310
2312
  }
2311
- response = await self.privatePostExchange(self.extend(request, params))
2313
+ response = await self.privatePostExchange(request)
2312
2314
  return response
2313
2315
 
2314
2316
  async def withdraw(self, code: str, amount: float, address: str, tag=None, params={}) -> Transaction:
@@ -2350,7 +2352,7 @@ class hyperliquid(Exchange, ImplicitAPI):
2350
2352
  'nonce': nonce,
2351
2353
  'signature': sig,
2352
2354
  }
2353
- response = await self.privatePostExchange(self.extend(request, params))
2355
+ response = await self.privatePostExchange(request)
2354
2356
  return self.parse_transaction(response)
2355
2357
 
2356
2358
  def parse_transaction(self, transaction: dict, currency: Currency = None) -> Transaction:
@@ -96,6 +96,7 @@ class krakenfutures(Exchange, ImplicitAPI):
96
96
  'public': 'https://demo-futures.kraken.com/derivatives/api/',
97
97
  'private': 'https://demo-futures.kraken.com/derivatives/api/',
98
98
  'charts': 'https://demo-futures.kraken.com/api/charts/',
99
+ 'history': 'https://demo-futures.kraken.com/api/history/',
99
100
  'www': 'https://demo-futures.kraken.com',
100
101
  },
101
102
  'logo': 'https://user-images.githubusercontent.com/24300605/81436764-b22fd580-9172-11ea-9703-742783e6376d.jpg',
ccxt/async_support/okx.py CHANGED
@@ -456,6 +456,7 @@ class okx(Exchange, ImplicitAPI):
456
456
  'sprd/cancel-order': 1,
457
457
  'sprd/mass-cancel': 1,
458
458
  'sprd/amend-order': 1,
459
+ 'sprd/cancel-all-after': 10,
459
460
  # trade
460
461
  'trade/order': 1 / 3,
461
462
  'trade/batch-orders': 1 / 15,
@@ -13,6 +13,7 @@ from ccxt.base.errors import AuthenticationError
13
13
  from ccxt.base.errors import ArgumentsRequired
14
14
  from ccxt.base.errors import BadRequest
15
15
  from ccxt.base.errors import BadSymbol
16
+ from ccxt.base.errors import MarketClosed
16
17
  from ccxt.base.errors import BadResponse
17
18
  from ccxt.base.errors import InsufficientFunds
18
19
  from ccxt.base.errors import InvalidAddress
@@ -194,7 +195,7 @@ class probit(Exchange, ImplicitAPI):
194
195
  'RATE_LIMIT_EXCEEDED': RateLimitExceeded, # You are sending requests too frequently. Please try it later.
195
196
  'MARKET_UNAVAILABLE': ExchangeNotAvailable, # Market is closed today
196
197
  'INVALID_MARKET': BadSymbol, # Requested market is not exist
197
- 'MARKET_CLOSED': BadSymbol, # {"errorCode":"MARKET_CLOSED"}
198
+ 'MARKET_CLOSED': MarketClosed, # {"errorCode":"MARKET_CLOSED"}
198
199
  'MARKET_NOT_FOUND': BadSymbol, # {"errorCode":"MARKET_NOT_FOUND","message":"8e2b8496-0a1e-5beb-b990-a205b902eabe","details":{}}
199
200
  'INVALID_CURRENCY': BadRequest, # Requested currency is not exist on ProBit system
200
201
  'TOO_MANY_OPEN_ORDERS': DDoSProtection, # Too many open orders
@@ -1725,10 +1726,13 @@ class probit(Exchange, ImplicitAPI):
1725
1726
  return None # fallback to default error handler
1726
1727
  if 'errorCode' in response:
1727
1728
  errorCode = self.safe_string(response, 'errorCode')
1728
- message = self.safe_string(response, 'message')
1729
1729
  if errorCode is not None:
1730
- feedback = self.id + ' ' + body
1731
- self.throw_exactly_matched_exception(self.exceptions['exact'], message, feedback)
1732
- self.throw_broadly_matched_exception(self.exceptions['exact'], errorCode, feedback)
1730
+ errMessage = self.safe_string(response, 'message', '')
1731
+ details = self.safe_value(response, 'details')
1732
+ feedback = self.id + ' ' + errorCode + ' ' + errMessage + ' ' + self.json(details)
1733
+ if 'exact' in self.exceptions:
1734
+ self.throw_exactly_matched_exception(self.exceptions['exact'], errorCode, feedback)
1735
+ if 'broad' in self.exceptions:
1736
+ self.throw_broadly_matched_exception(self.exceptions['broad'], errMessage, feedback)
1733
1737
  raise ExchangeError(feedback)
1734
1738
  return None