ccxt 4.4.58__py2.py3-none-any.whl → 4.4.60__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 (311) hide show
  1. ccxt/__init__.py +1 -3
  2. ccxt/ace.py +2 -2
  3. ccxt/alpaca.py +12 -7
  4. ccxt/ascendex.py +3 -3
  5. ccxt/async_support/__init__.py +1 -3
  6. ccxt/async_support/ace.py +2 -2
  7. ccxt/async_support/alpaca.py +12 -7
  8. ccxt/async_support/ascendex.py +3 -3
  9. ccxt/async_support/base/exchange.py +4 -1
  10. ccxt/async_support/bequant.py +2 -1
  11. ccxt/async_support/bigone.py +5 -5
  12. ccxt/async_support/binance.py +84 -4
  13. ccxt/async_support/binancecoinm.py +2 -1
  14. ccxt/async_support/binanceus.py +2 -1
  15. ccxt/async_support/binanceusdm.py +2 -1
  16. ccxt/async_support/bingx.py +3 -3
  17. ccxt/async_support/bit2c.py +9 -9
  18. ccxt/async_support/bitbank.py +2 -2
  19. ccxt/async_support/bitbns.py +2 -2
  20. ccxt/async_support/bitcoincom.py +2 -1
  21. ccxt/async_support/bitfinex.py +2 -2
  22. ccxt/async_support/bitfinex1.py +2 -2
  23. ccxt/async_support/bitflyer.py +2 -2
  24. ccxt/async_support/bitget.py +6 -5
  25. ccxt/async_support/bithumb.py +2 -2
  26. ccxt/async_support/bitmart.py +137 -86
  27. ccxt/async_support/bitmex.py +2 -2
  28. ccxt/async_support/bitopro.py +2 -2
  29. ccxt/async_support/bitpanda.py +2 -1
  30. ccxt/async_support/bitrue.py +3 -3
  31. ccxt/async_support/bitso.py +2 -2
  32. ccxt/async_support/bitstamp.py +2 -2
  33. ccxt/async_support/bitteam.py +2 -2
  34. ccxt/async_support/bitvavo.py +3 -3
  35. ccxt/async_support/bl3p.py +2 -2
  36. ccxt/async_support/blockchaincom.py +2 -2
  37. ccxt/async_support/blofin.py +2 -2
  38. ccxt/async_support/btcalpha.py +2 -2
  39. ccxt/async_support/btcbox.py +2 -2
  40. ccxt/async_support/btcmarkets.py +3 -3
  41. ccxt/async_support/btcturk.py +2 -2
  42. ccxt/async_support/bybit.py +9 -6
  43. ccxt/async_support/cex.py +3 -3
  44. ccxt/async_support/coinbase.py +4 -4
  45. ccxt/async_support/coinbaseadvanced.py +2 -1
  46. ccxt/async_support/coinbaseexchange.py +3 -3
  47. ccxt/async_support/coinbaseinternational.py +3 -4
  48. ccxt/async_support/coincatch.py +3 -3
  49. ccxt/async_support/coincheck.py +2 -2
  50. ccxt/async_support/coinex.py +3 -3
  51. ccxt/async_support/coinlist.py +3 -3
  52. ccxt/async_support/coinmate.py +2 -2
  53. ccxt/async_support/coinmetro.py +2 -2
  54. ccxt/async_support/coinone.py +2 -2
  55. ccxt/async_support/coinsph.py +3 -3
  56. ccxt/async_support/coinspot.py +2 -2
  57. ccxt/async_support/cryptocom.py +2 -2
  58. ccxt/async_support/currencycom.py +3 -3
  59. ccxt/async_support/defx.py +3 -3
  60. ccxt/async_support/delta.py +3 -3
  61. ccxt/async_support/deribit.py +3 -3
  62. ccxt/async_support/digifinex.py +3 -3
  63. ccxt/async_support/ellipx.py +1 -1
  64. ccxt/async_support/exmo.py +2 -2
  65. ccxt/async_support/fmfwio.py +2 -1
  66. ccxt/async_support/gate.py +3 -3
  67. ccxt/async_support/gateio.py +2 -1
  68. ccxt/async_support/gemini.py +2 -2
  69. ccxt/async_support/hashkey.py +2 -2
  70. ccxt/async_support/hitbtc.py +3 -3
  71. ccxt/async_support/hollaex.py +3 -3
  72. ccxt/async_support/htx.py +3 -3
  73. ccxt/async_support/huobi.py +2 -1
  74. ccxt/async_support/huobijp.py +3 -3
  75. ccxt/async_support/hyperliquid.py +83 -3
  76. ccxt/async_support/idex.py +3 -3
  77. ccxt/async_support/independentreserve.py +2 -2
  78. ccxt/async_support/indodax.py +3 -3
  79. ccxt/async_support/kraken.py +3 -3
  80. ccxt/async_support/krakenfutures.py +2 -2
  81. ccxt/async_support/kucoin.py +3 -3
  82. ccxt/async_support/kucoinfutures.py +3 -3
  83. ccxt/async_support/kuna.py +3 -3
  84. ccxt/async_support/latoken.py +3 -3
  85. ccxt/async_support/lbank.py +3 -3
  86. ccxt/async_support/luno.py +2 -2
  87. ccxt/async_support/mercado.py +2 -2
  88. ccxt/async_support/mexc.py +3 -3
  89. ccxt/async_support/myokx.py +2 -1
  90. ccxt/async_support/ndax.py +2 -2
  91. ccxt/async_support/novadax.py +3 -3
  92. ccxt/async_support/oceanex.py +3 -3
  93. ccxt/async_support/okcoin.py +3 -3
  94. ccxt/async_support/okx.py +3 -4
  95. ccxt/async_support/onetrading.py +3 -3
  96. ccxt/async_support/oxfun.py +3 -3
  97. ccxt/async_support/p2b.py +2 -2
  98. ccxt/async_support/paradex.py +3 -3
  99. ccxt/async_support/paymium.py +2 -2
  100. ccxt/async_support/phemex.py +2 -2
  101. ccxt/async_support/poloniex.py +3 -3
  102. ccxt/async_support/poloniexfutures.py +3 -3
  103. ccxt/async_support/probit.py +3 -3
  104. ccxt/async_support/timex.py +3 -3
  105. ccxt/async_support/tokocrypto.py +3 -3
  106. ccxt/async_support/tradeogre.py +2 -2
  107. ccxt/async_support/upbit.py +2 -2
  108. ccxt/async_support/vertex.py +4 -4
  109. ccxt/async_support/wavesexchange.py +2 -3
  110. ccxt/async_support/whitebit.py +3 -3
  111. ccxt/async_support/woo.py +3 -4
  112. ccxt/async_support/woofipro.py +3 -4
  113. ccxt/async_support/xt.py +15 -3
  114. ccxt/async_support/yobit.py +2 -2
  115. ccxt/async_support/zaif.py +2 -2
  116. ccxt/async_support/zonda.py +2 -2
  117. ccxt/base/errors.py +6 -0
  118. ccxt/base/exchange.py +8 -3
  119. ccxt/bequant.py +2 -1
  120. ccxt/bigone.py +5 -5
  121. ccxt/binance.py +84 -4
  122. ccxt/binancecoinm.py +2 -1
  123. ccxt/binanceus.py +2 -1
  124. ccxt/binanceusdm.py +2 -1
  125. ccxt/bingx.py +3 -3
  126. ccxt/bit2c.py +9 -9
  127. ccxt/bitbank.py +2 -2
  128. ccxt/bitbns.py +2 -2
  129. ccxt/bitcoincom.py +2 -1
  130. ccxt/bitfinex.py +2 -2
  131. ccxt/bitfinex1.py +2 -2
  132. ccxt/bitflyer.py +2 -2
  133. ccxt/bitget.py +6 -5
  134. ccxt/bithumb.py +2 -2
  135. ccxt/bitmart.py +137 -86
  136. ccxt/bitmex.py +2 -2
  137. ccxt/bitopro.py +2 -2
  138. ccxt/bitpanda.py +2 -1
  139. ccxt/bitrue.py +3 -3
  140. ccxt/bitso.py +2 -2
  141. ccxt/bitstamp.py +2 -2
  142. ccxt/bitteam.py +2 -2
  143. ccxt/bitvavo.py +3 -3
  144. ccxt/bl3p.py +2 -2
  145. ccxt/blockchaincom.py +2 -2
  146. ccxt/blofin.py +2 -2
  147. ccxt/btcalpha.py +2 -2
  148. ccxt/btcbox.py +2 -2
  149. ccxt/btcmarkets.py +3 -3
  150. ccxt/btcturk.py +2 -2
  151. ccxt/bybit.py +9 -6
  152. ccxt/cex.py +3 -3
  153. ccxt/coinbase.py +4 -4
  154. ccxt/coinbaseadvanced.py +2 -1
  155. ccxt/coinbaseexchange.py +3 -3
  156. ccxt/coinbaseinternational.py +3 -4
  157. ccxt/coincatch.py +3 -3
  158. ccxt/coincheck.py +2 -2
  159. ccxt/coinex.py +3 -3
  160. ccxt/coinlist.py +3 -3
  161. ccxt/coinmate.py +2 -2
  162. ccxt/coinmetro.py +2 -2
  163. ccxt/coinone.py +2 -2
  164. ccxt/coinsph.py +3 -3
  165. ccxt/coinspot.py +2 -2
  166. ccxt/cryptocom.py +2 -2
  167. ccxt/currencycom.py +3 -3
  168. ccxt/defx.py +3 -3
  169. ccxt/delta.py +3 -3
  170. ccxt/deribit.py +3 -3
  171. ccxt/digifinex.py +3 -3
  172. ccxt/ellipx.py +1 -1
  173. ccxt/exmo.py +2 -2
  174. ccxt/fmfwio.py +2 -1
  175. ccxt/gate.py +3 -3
  176. ccxt/gateio.py +2 -1
  177. ccxt/gemini.py +2 -2
  178. ccxt/hashkey.py +2 -2
  179. ccxt/hitbtc.py +3 -3
  180. ccxt/hollaex.py +3 -3
  181. ccxt/htx.py +3 -3
  182. ccxt/huobi.py +2 -1
  183. ccxt/huobijp.py +3 -3
  184. ccxt/hyperliquid.py +83 -3
  185. ccxt/idex.py +3 -3
  186. ccxt/independentreserve.py +2 -2
  187. ccxt/indodax.py +3 -3
  188. ccxt/kraken.py +3 -3
  189. ccxt/krakenfutures.py +2 -2
  190. ccxt/kucoin.py +3 -3
  191. ccxt/kucoinfutures.py +3 -3
  192. ccxt/kuna.py +3 -3
  193. ccxt/latoken.py +3 -3
  194. ccxt/lbank.py +3 -3
  195. ccxt/luno.py +2 -2
  196. ccxt/mercado.py +2 -2
  197. ccxt/mexc.py +3 -3
  198. ccxt/myokx.py +2 -1
  199. ccxt/ndax.py +2 -2
  200. ccxt/novadax.py +3 -3
  201. ccxt/oceanex.py +3 -3
  202. ccxt/okcoin.py +3 -3
  203. ccxt/okx.py +3 -4
  204. ccxt/onetrading.py +3 -3
  205. ccxt/oxfun.py +3 -3
  206. ccxt/p2b.py +2 -2
  207. ccxt/paradex.py +3 -3
  208. ccxt/paymium.py +2 -2
  209. ccxt/phemex.py +2 -2
  210. ccxt/poloniex.py +3 -3
  211. ccxt/poloniexfutures.py +3 -3
  212. ccxt/pro/__init__.py +1 -3
  213. ccxt/pro/alpaca.py +2 -2
  214. ccxt/pro/ascendex.py +2 -2
  215. ccxt/pro/bequant.py +2 -1
  216. ccxt/pro/binance.py +2 -3
  217. ccxt/pro/binancecoinm.py +2 -1
  218. ccxt/pro/binanceus.py +3 -2
  219. ccxt/pro/binanceusdm.py +2 -1
  220. ccxt/pro/bingx.py +2 -2
  221. ccxt/pro/bitcoincom.py +2 -1
  222. ccxt/pro/bitfinex.py +2 -2
  223. ccxt/pro/bitfinex1.py +2 -2
  224. ccxt/pro/bitget.py +2 -3
  225. ccxt/pro/bithumb.py +2 -2
  226. ccxt/pro/bitmart.py +2 -2
  227. ccxt/pro/bitmex.py +2 -2
  228. ccxt/pro/bitopro.py +2 -2
  229. ccxt/pro/bitpanda.py +2 -1
  230. ccxt/pro/bitrue.py +2 -2
  231. ccxt/pro/bitstamp.py +2 -2
  232. ccxt/pro/bitvavo.py +2 -2
  233. ccxt/pro/blockchaincom.py +2 -2
  234. ccxt/pro/blofin.py +1 -1
  235. ccxt/pro/bybit.py +2 -3
  236. ccxt/pro/cex.py +2 -2
  237. ccxt/pro/coinbase.py +2 -2
  238. ccxt/pro/coinbaseadvanced.py +2 -1
  239. ccxt/pro/coinbaseexchange.py +2 -2
  240. ccxt/pro/coinbaseinternational.py +2 -2
  241. ccxt/pro/coincatch.py +2 -3
  242. ccxt/pro/coincheck.py +2 -2
  243. ccxt/pro/coinex.py +2 -2
  244. ccxt/pro/coinone.py +2 -2
  245. ccxt/pro/cryptocom.py +2 -3
  246. ccxt/pro/currencycom.py +2 -2
  247. ccxt/pro/defx.py +2 -3
  248. ccxt/pro/deribit.py +2 -2
  249. ccxt/pro/exmo.py +2 -2
  250. ccxt/pro/gate.py +2 -3
  251. ccxt/pro/gateio.py +2 -1
  252. ccxt/pro/gemini.py +2 -2
  253. ccxt/pro/hashkey.py +2 -2
  254. ccxt/pro/hitbtc.py +2 -2
  255. ccxt/pro/hollaex.py +2 -2
  256. ccxt/pro/htx.py +2 -2
  257. ccxt/pro/huobi.py +2 -1
  258. ccxt/pro/huobijp.py +2 -2
  259. ccxt/pro/hyperliquid.py +2 -3
  260. ccxt/pro/idex.py +2 -2
  261. ccxt/pro/independentreserve.py +2 -2
  262. ccxt/pro/kraken.py +2 -2
  263. ccxt/pro/krakenfutures.py +2 -2
  264. ccxt/pro/kucoin.py +2 -3
  265. ccxt/pro/kucoinfutures.py +2 -3
  266. ccxt/pro/lbank.py +2 -2
  267. ccxt/pro/luno.py +2 -2
  268. ccxt/pro/mexc.py +2 -2
  269. ccxt/pro/myokx.py +2 -1
  270. ccxt/pro/ndax.py +2 -2
  271. ccxt/pro/okcoin.py +2 -2
  272. ccxt/pro/okx.py +2 -3
  273. ccxt/pro/onetrading.py +2 -2
  274. ccxt/pro/oxfun.py +2 -2
  275. ccxt/pro/p2b.py +2 -2
  276. ccxt/pro/paradex.py +2 -2
  277. ccxt/pro/phemex.py +2 -2
  278. ccxt/pro/poloniex.py +2 -2
  279. ccxt/pro/poloniexfutures.py +2 -2
  280. ccxt/pro/probit.py +2 -2
  281. ccxt/pro/upbit.py +2 -2
  282. ccxt/pro/vertex.py +2 -2
  283. ccxt/pro/wazirx.py +2 -2
  284. ccxt/pro/whitebit.py +2 -2
  285. ccxt/pro/woo.py +2 -2
  286. ccxt/pro/woofipro.py +2 -2
  287. ccxt/pro/xt.py +110 -4
  288. ccxt/probit.py +3 -3
  289. ccxt/test/tests_async.py +11 -0
  290. ccxt/test/tests_sync.py +11 -0
  291. ccxt/timex.py +3 -3
  292. ccxt/tokocrypto.py +3 -3
  293. ccxt/tradeogre.py +2 -2
  294. ccxt/upbit.py +2 -2
  295. ccxt/vertex.py +4 -4
  296. ccxt/wavesexchange.py +2 -3
  297. ccxt/whitebit.py +3 -3
  298. ccxt/woo.py +3 -4
  299. ccxt/woofipro.py +3 -4
  300. ccxt/xt.py +15 -3
  301. ccxt/yobit.py +2 -2
  302. ccxt/zaif.py +2 -2
  303. ccxt/zonda.py +2 -2
  304. {ccxt-4.4.58.dist-info → ccxt-4.4.60.dist-info}/METADATA +30 -33
  305. {ccxt-4.4.58.dist-info → ccxt-4.4.60.dist-info}/RECORD +308 -311
  306. ccxt/abstract/wazirx.py +0 -30
  307. ccxt/async_support/wazirx.py +0 -1336
  308. ccxt/wazirx.py +0 -1336
  309. {ccxt-4.4.58.dist-info → ccxt-4.4.60.dist-info}/LICENSE.txt +0 -0
  310. {ccxt-4.4.58.dist-info → ccxt-4.4.60.dist-info}/WHEEL +0 -0
  311. {ccxt-4.4.58.dist-info → ccxt-4.4.60.dist-info}/top_level.txt +0 -0
ccxt/pro/xt.py CHANGED
@@ -4,15 +4,15 @@
4
4
  # https://github.com/ccxt/ccxt/blob/master/CONTRIBUTING.md#how-to-contribute-code
5
5
 
6
6
  import ccxt.async_support
7
- from ccxt.async_support.base.ws.cache import ArrayCache, ArrayCacheBySymbolById, ArrayCacheByTimestamp
8
- from ccxt.base.types import Balances, Int, Market, Order, OrderBook, Str, Strings, Ticker, Tickers, Trade
7
+ from ccxt.async_support.base.ws.cache import ArrayCache, ArrayCacheBySymbolById, ArrayCacheBySymbolBySide, ArrayCacheByTimestamp
8
+ from ccxt.base.types import Any, Balances, Int, Market, Order, OrderBook, Position, Str, Strings, Ticker, Tickers, Trade
9
9
  from ccxt.async_support.base.ws.client import Client
10
10
  from typing import List
11
11
 
12
12
 
13
13
  class xt(ccxt.async_support.xt):
14
14
 
15
- def describe(self):
15
+ def describe(self) -> Any:
16
16
  return self.deep_extend(super(xt, self).describe(), {
17
17
  'has': {
18
18
  'ws': True,
@@ -25,7 +25,7 @@ class xt(ccxt.async_support.xt):
25
25
  'watchBalance': True,
26
26
  'watchOrders': True,
27
27
  'watchMyTrades': True,
28
- 'watchPositions': None, # TODO https://doc.xt.com/#futures_user_websocket_v2position
28
+ 'watchPositions': True,
29
29
  },
30
30
  'urls': {
31
31
  'api': {
@@ -45,6 +45,11 @@ class xt(ccxt.async_support.xt):
45
45
  'watchTickers': {
46
46
  'method': 'tickers', # agg_tickers(contract only)
47
47
  },
48
+ 'watchPositions': {
49
+ 'type': 'swap',
50
+ 'fetchPositionsSnapshot': True,
51
+ 'awaitPositionsSnapshot': True,
52
+ },
48
53
  },
49
54
  'streaming': {
50
55
  'keepAlive': 20000,
@@ -352,6 +357,106 @@ class xt(ccxt.async_support.xt):
352
357
  name = 'balance'
353
358
  return await self.subscribe(name, 'private', 'watchBalance', None, None, params)
354
359
 
360
+ async def watch_positions(self, symbols: Strings = None, since: Int = None, limit: Int = None, params={}) -> List[Position]:
361
+ """
362
+
363
+ https://doc.xt.com/#futures_user_websocket_v2position
364
+
365
+ watch all open positions
366
+ :param str[]|None symbols: list of unified market symbols
367
+ :param number [since]: since timestamp
368
+ :param number [limit]: limit
369
+ :param dict params: extra parameters specific to the exchange API endpoint
370
+ :returns dict[]: a list of `position structure <https://docs.ccxt.com/en/latest/manual.html#position-structure>`
371
+ """
372
+ await self.load_markets()
373
+ url = self.urls['api']['ws']['contract'] + '/' + 'user'
374
+ client = self.client(url)
375
+ self.set_positions_cache(client)
376
+ fetchPositionsSnapshot = self.handle_option('watchPositions', 'fetchPositionsSnapshot', True)
377
+ awaitPositionsSnapshot = self.handle_option('watchPositions', 'awaitPositionsSnapshot', True)
378
+ cache = self.positions
379
+ if fetchPositionsSnapshot and awaitPositionsSnapshot and self.is_empty(cache):
380
+ snapshot = await client.future('fetchPositionsSnapshot')
381
+ return self.filter_by_symbols_since_limit(snapshot, symbols, since, limit, True)
382
+ name = 'position'
383
+ newPositions = await self.subscribe(name, 'private', 'watchPositions', None, None, params)
384
+ if self.newUpdates:
385
+ return newPositions
386
+ return self.filter_by_symbols_since_limit(cache, symbols, since, limit, True)
387
+
388
+ def set_positions_cache(self, client: Client):
389
+ if self.positions is None:
390
+ self.positions = ArrayCacheBySymbolBySide()
391
+ fetchPositionsSnapshot = self.handle_option('watchPositions', 'fetchPositionsSnapshot')
392
+ if fetchPositionsSnapshot:
393
+ messageHash = 'fetchPositionsSnapshot'
394
+ if not (messageHash in client.futures):
395
+ client.future(messageHash)
396
+ self.spawn(self.load_positions_snapshot, client, messageHash)
397
+
398
+ async def load_positions_snapshot(self, client, messageHash):
399
+ positions = await self.fetch_positions(None)
400
+ self.positions = ArrayCacheBySymbolBySide()
401
+ cache = self.positions
402
+ for i in range(0, len(positions)):
403
+ position = positions[i]
404
+ contracts = self.safe_number(position, 'contracts', 0)
405
+ if contracts > 0:
406
+ cache.append(position)
407
+ # don't remove the future from the .futures cache
408
+ future = client.futures[messageHash]
409
+ future.resolve(cache)
410
+ client.resolve(cache, 'position::contract')
411
+
412
+ def handle_position(self, client, message):
413
+ #
414
+ # {
415
+ # topic: 'position',
416
+ # event: 'position',
417
+ # data: {
418
+ # accountId: 245296,
419
+ # accountType: 0,
420
+ # symbol: 'eth_usdt',
421
+ # contractType: 'PERPETUAL',
422
+ # positionType: 'CROSSED',
423
+ # positionSide: 'LONG',
424
+ # positionSize: '1',
425
+ # closeOrderSize: '0',
426
+ # availableCloseSize: '1',
427
+ # realizedProfit: '-0.0121',
428
+ # entryPrice: '2637.87',
429
+ # openOrderSize: '1',
430
+ # isolatedMargin: '2.63787',
431
+ # openOrderMarginFrozen: '2.78832014',
432
+ # underlyingType: 'U_BASED',
433
+ # leverage: 10,
434
+ # welfareAccount: False,
435
+ # profitFixedLatest: {},
436
+ # closeProfit: '0.0000',
437
+ # totalFee: '-0.0158',
438
+ # totalFundFee: '0.0037',
439
+ # markPrice: '2690.96'
440
+ # }
441
+ # }
442
+ #
443
+ if self.positions is None:
444
+ self.positions = ArrayCacheBySymbolBySide()
445
+ cache = self.positions
446
+ data = self.safe_dict(message, 'data', {})
447
+ position = self.parse_position(data)
448
+ cache.append(position)
449
+ messageHashes = self.find_message_hashes(client, 'position::contract')
450
+ for i in range(0, len(messageHashes)):
451
+ messageHash = messageHashes[i]
452
+ parts = messageHash.split('::')
453
+ symbolsString = parts[1]
454
+ symbols = symbolsString.split(',')
455
+ positions = self.filter_by_array([position], 'symbol', symbols, False)
456
+ if not self.is_empty(positions):
457
+ client.resolve(positions, messageHash)
458
+ client.resolve([position], 'position::contract')
459
+
355
460
  def handle_ticker(self, client: Client, message: dict):
356
461
  #
357
462
  # spot
@@ -1036,6 +1141,7 @@ class xt(ccxt.async_support.xt):
1036
1141
  'agg_tickers': self.handle_tickers,
1037
1142
  'balance': self.handle_balance,
1038
1143
  'order': self.handle_order,
1144
+ 'position': self.handle_position,
1039
1145
  }
1040
1146
  method = self.safe_value(methods, topic)
1041
1147
  if topic == 'trade':
ccxt/probit.py CHANGED
@@ -6,7 +6,7 @@
6
6
  from ccxt.base.exchange import Exchange
7
7
  from ccxt.abstract.probit import ImplicitAPI
8
8
  import math
9
- from ccxt.base.types import Balances, Currencies, Currency, DepositAddress, Int, Market, Num, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, Transaction
9
+ from ccxt.base.types import Any, Balances, Currencies, Currency, DepositAddress, Int, Market, Num, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, Transaction
10
10
  from typing import List
11
11
  from ccxt.base.errors import ExchangeError
12
12
  from ccxt.base.errors import AuthenticationError
@@ -28,7 +28,7 @@ from ccxt.base.precise import Precise
28
28
 
29
29
  class probit(Exchange, ImplicitAPI):
30
30
 
31
- def describe(self):
31
+ def describe(self) -> Any:
32
32
  return self.deep_extend(super(probit, self).describe(), {
33
33
  'id': 'probit',
34
34
  'name': 'ProBit',
@@ -938,7 +938,7 @@ class probit(Exchange, ImplicitAPI):
938
938
  'fee': fee,
939
939
  }, market)
940
940
 
941
- def fetch_time(self, params={}):
941
+ def fetch_time(self, params={}) -> Int:
942
942
  """
943
943
 
944
944
  https://docs-en.probit.com/reference/time
ccxt/test/tests_async.py CHANGED
@@ -620,10 +620,21 @@ class testMainClass:
620
620
  dump('[TEST_WARNING]' + error_message)
621
621
  return True
622
622
 
623
+ def check_constructor(self, exchange):
624
+ # todo: this might be moved in base tests later
625
+ if exchange.id == 'binance':
626
+ assert exchange.hostname is None, 'binance.com hostname should be empty'
627
+ assert exchange.urls['api']['public'] == 'https://api.binance.com/api/v3', 'https://api.binance.com/api/v3 does not match: ' + exchange.urls['api']['public']
628
+ assert ('lending/union/account' in exchange.api['sapi']['get']), 'SAPI should contain the endpoint lending/union/account, ' + json_stringify(exchange.api['sapi']['get'])
629
+ elif exchange.id == 'binanceus':
630
+ assert exchange.hostname == 'binance.us', 'binance.us hostname does not match ' + exchange.hostname
631
+ assert exchange.urls['api']['public'] == 'https://api.binance.us/api/v3', 'https://api.binance.us/api/v3 does not match: ' + exchange.urls['api']['public']
632
+
623
633
  async def start_test(self, exchange, symbol):
624
634
  # we do not need to test aliases
625
635
  if exchange.alias:
626
636
  return True
637
+ self.check_constructor(exchange)
627
638
  if self.sandbox or get_exchange_prop(exchange, 'sandbox'):
628
639
  exchange.set_sandbox_mode(True)
629
640
  try:
ccxt/test/tests_sync.py CHANGED
@@ -617,10 +617,21 @@ class testMainClass:
617
617
  dump('[TEST_WARNING]' + error_message)
618
618
  return True
619
619
 
620
+ def check_constructor(self, exchange):
621
+ # todo: this might be moved in base tests later
622
+ if exchange.id == 'binance':
623
+ assert exchange.hostname is None, 'binance.com hostname should be empty'
624
+ assert exchange.urls['api']['public'] == 'https://api.binance.com/api/v3', 'https://api.binance.com/api/v3 does not match: ' + exchange.urls['api']['public']
625
+ assert ('lending/union/account' in exchange.api['sapi']['get']), 'SAPI should contain the endpoint lending/union/account, ' + json_stringify(exchange.api['sapi']['get'])
626
+ elif exchange.id == 'binanceus':
627
+ assert exchange.hostname == 'binance.us', 'binance.us hostname does not match ' + exchange.hostname
628
+ assert exchange.urls['api']['public'] == 'https://api.binance.us/api/v3', 'https://api.binance.us/api/v3 does not match: ' + exchange.urls['api']['public']
629
+
620
630
  def start_test(self, exchange, symbol):
621
631
  # we do not need to test aliases
622
632
  if exchange.alias:
623
633
  return True
634
+ self.check_constructor(exchange)
624
635
  if self.sandbox or get_exchange_prop(exchange, 'sandbox'):
625
636
  exchange.set_sandbox_mode(True)
626
637
  try:
ccxt/timex.py CHANGED
@@ -5,7 +5,7 @@
5
5
 
6
6
  from ccxt.base.exchange import Exchange
7
7
  from ccxt.abstract.timex import ImplicitAPI
8
- from ccxt.base.types import Balances, Currencies, Currency, DepositAddress, Int, Market, Num, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, TradingFeeInterface, Transaction
8
+ from ccxt.base.types import Any, Balances, Currencies, Currency, DepositAddress, Int, Market, Num, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, TradingFeeInterface, Transaction
9
9
  from typing import List
10
10
  from ccxt.base.errors import ExchangeError
11
11
  from ccxt.base.errors import AuthenticationError
@@ -24,7 +24,7 @@ from ccxt.base.precise import Precise
24
24
 
25
25
  class timex(Exchange, ImplicitAPI):
26
26
 
27
- def describe(self):
27
+ def describe(self) -> Any:
28
28
  return self.deep_extend(super(timex, self).describe(), {
29
29
  'id': 'timex',
30
30
  'name': 'TimeX',
@@ -354,7 +354,7 @@ class timex(Exchange, ImplicitAPI):
354
354
  },
355
355
  })
356
356
 
357
- def fetch_time(self, params={}):
357
+ def fetch_time(self, params={}) -> Int:
358
358
  """
359
359
  fetches the current integer timestamp in milliseconds from the exchange server
360
360
  :param dict [params]: extra parameters specific to the exchange API endpoint
ccxt/tokocrypto.py CHANGED
@@ -7,7 +7,7 @@ from ccxt.base.exchange import Exchange
7
7
  from ccxt.abstract.tokocrypto import ImplicitAPI
8
8
  import hashlib
9
9
  import json
10
- from ccxt.base.types import Balances, Currency, DepositAddress, Int, Market, Num, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, Transaction
10
+ from ccxt.base.types import Any, Balances, Currency, DepositAddress, Int, Market, Num, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, Transaction
11
11
  from typing import List
12
12
  from ccxt.base.errors import ExchangeError
13
13
  from ccxt.base.errors import AuthenticationError
@@ -37,7 +37,7 @@ from ccxt.base.precise import Precise
37
37
 
38
38
  class tokocrypto(Exchange, ImplicitAPI):
39
39
 
40
- def describe(self):
40
+ def describe(self) -> Any:
41
41
  return self.deep_extend(super(tokocrypto, self).describe(), {
42
42
  'id': 'tokocrypto',
43
43
  'name': 'Tokocrypto',
@@ -702,7 +702,7 @@ class tokocrypto(Exchange, ImplicitAPI):
702
702
  def nonce(self):
703
703
  return self.milliseconds() - self.options['timeDifference']
704
704
 
705
- def fetch_time(self, params={}):
705
+ def fetch_time(self, params={}) -> Int:
706
706
  """
707
707
 
708
708
  https://www.tokocrypto.com/apidocs/#check-server-time
ccxt/tradeogre.py CHANGED
@@ -5,7 +5,7 @@
5
5
 
6
6
  from ccxt.base.exchange import Exchange
7
7
  from ccxt.abstract.tradeogre import ImplicitAPI
8
- from ccxt.base.types import IndexType, Int, Market, Num, Order, OrderSide, OrderType, Str, Ticker
8
+ from ccxt.base.types import Any, IndexType, Int, Market, Num, Order, OrderSide, OrderType, Str, Ticker
9
9
  from typing import List
10
10
  from ccxt.base.errors import ExchangeError
11
11
  from ccxt.base.errors import AuthenticationError
@@ -17,7 +17,7 @@ from ccxt.base.decimal_to_precision import TICK_SIZE
17
17
 
18
18
  class tradeogre(Exchange, ImplicitAPI):
19
19
 
20
- def describe(self):
20
+ def describe(self) -> Any:
21
21
  return self.deep_extend(super(tradeogre, self).describe(), {
22
22
  'id': 'tradeogre',
23
23
  'name': 'tradeogre',
ccxt/upbit.py CHANGED
@@ -5,7 +5,7 @@
5
5
 
6
6
  from ccxt.base.exchange import Exchange
7
7
  from ccxt.abstract.upbit import ImplicitAPI
8
- from ccxt.base.types import Balances, Currency, DepositAddress, Int, Market, Num, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, OrderBooks, Trade, TradingFeeInterface, Transaction
8
+ from ccxt.base.types import Any, Balances, Currency, DepositAddress, Int, Market, Num, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, OrderBooks, Trade, TradingFeeInterface, Transaction
9
9
  from typing import List
10
10
  from ccxt.base.errors import ExchangeError
11
11
  from ccxt.base.errors import AuthenticationError
@@ -22,7 +22,7 @@ from ccxt.base.precise import Precise
22
22
 
23
23
  class upbit(Exchange, ImplicitAPI):
24
24
 
25
- def describe(self):
25
+ def describe(self) -> Any:
26
26
  return self.deep_extend(super(upbit, self).describe(), {
27
27
  'id': 'upbit',
28
28
  'name': 'Upbit',
ccxt/vertex.py CHANGED
@@ -5,7 +5,7 @@
5
5
 
6
6
  from ccxt.base.exchange import Exchange
7
7
  from ccxt.abstract.vertex import ImplicitAPI
8
- from ccxt.base.types import Balances, Currencies, Currency, Int, Market, Num, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, FundingRate, FundingRates, Trade, TradingFees, Transaction
8
+ from ccxt.base.types import Any, Balances, Currencies, Currency, Int, Market, Num, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, FundingRate, FundingRates, Trade, TradingFees, Transaction
9
9
  from typing import List
10
10
  from ccxt.base.errors import ExchangeError
11
11
  from ccxt.base.errors import AuthenticationError
@@ -22,7 +22,7 @@ from ccxt.base.precise import Precise
22
22
 
23
23
  class vertex(Exchange, ImplicitAPI):
24
24
 
25
- def describe(self):
25
+ def describe(self) -> Any:
26
26
  return self.deep_extend(super(vertex, self).describe(), {
27
27
  'id': 'vertex',
28
28
  'name': 'Vertex',
@@ -622,7 +622,7 @@ class vertex(Exchange, ImplicitAPI):
622
622
  result.append(self.parse_market(rawMarket))
623
623
  return result
624
624
 
625
- def fetch_time(self, params={}):
625
+ def fetch_time(self, params={}) -> Int:
626
626
  """
627
627
  fetches the current integer timestamp in milliseconds from the exchange server
628
628
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -630,7 +630,7 @@ class vertex(Exchange, ImplicitAPI):
630
630
  """
631
631
  response = self.v1GatewayGetTime(params)
632
632
  # 1717481623452
633
- return self.parse_number(response)
633
+ return self.parse_to_int(response)
634
634
 
635
635
  def fetch_status(self, params={}):
636
636
  """
ccxt/wavesexchange.py CHANGED
@@ -6,9 +6,8 @@
6
6
  from ccxt.base.exchange import Exchange
7
7
  from ccxt.abstract.wavesexchange import ImplicitAPI
8
8
  import json
9
- from ccxt.base.types import Balances, Currency, DepositAddress, Int, Market, Num, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, Transaction
9
+ from ccxt.base.types import Any, Balances, Currency, DepositAddress, Int, Market, Num, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, Transaction
10
10
  from typing import List
11
- from typing import Any
12
11
  from ccxt.base.errors import ExchangeError
13
12
  from ccxt.base.errors import AuthenticationError
14
13
  from ccxt.base.errors import AccountSuspended
@@ -26,7 +25,7 @@ from ccxt.base.precise import Precise
26
25
 
27
26
  class wavesexchange(Exchange, ImplicitAPI):
28
27
 
29
- def describe(self):
28
+ def describe(self) -> Any:
30
29
  return self.deep_extend(super(wavesexchange, self).describe(), {
31
30
  'id': 'wavesexchange',
32
31
  'name': 'Waves.Exchange',
ccxt/whitebit.py CHANGED
@@ -6,7 +6,7 @@
6
6
  from ccxt.base.exchange import Exchange
7
7
  from ccxt.abstract.whitebit import ImplicitAPI
8
8
  import hashlib
9
- from ccxt.base.types import Balances, BorrowInterest, Bool, Currencies, Currency, DepositAddress, Int, Market, MarketType, Num, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, FundingRate, FundingRates, Trade, TradingFees, Transaction, TransferEntry
9
+ from ccxt.base.types import Any, Balances, BorrowInterest, Bool, Currencies, Currency, DepositAddress, Int, Market, MarketType, Num, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, FundingRate, FundingRates, Trade, TradingFees, Transaction, TransferEntry
10
10
  from typing import List
11
11
  from ccxt.base.errors import ExchangeError
12
12
  from ccxt.base.errors import AuthenticationError
@@ -26,7 +26,7 @@ from ccxt.base.precise import Precise
26
26
 
27
27
  class whitebit(Exchange, ImplicitAPI):
28
28
 
29
- def describe(self):
29
+ def describe(self) -> Any:
30
30
  return self.deep_extend(super(whitebit, self).describe(), {
31
31
  'id': 'whitebit',
32
32
  'name': 'WhiteBit',
@@ -1291,7 +1291,7 @@ class whitebit(Exchange, ImplicitAPI):
1291
1291
  'info': response,
1292
1292
  }
1293
1293
 
1294
- def fetch_time(self, params={}):
1294
+ def fetch_time(self, params={}) -> Int:
1295
1295
  """
1296
1296
  fetches the current integer timestamp in milliseconds from the exchange server
1297
1297
 
ccxt/woo.py CHANGED
@@ -6,9 +6,8 @@
6
6
  from ccxt.base.exchange import Exchange
7
7
  from ccxt.abstract.woo import ImplicitAPI
8
8
  import hashlib
9
- from ccxt.base.types import Account, Balances, Bool, Conversion, Currencies, Currency, DepositAddress, Int, LedgerEntry, Leverage, MarginModification, Market, MarketType, Num, Order, OrderBook, OrderSide, OrderType, Str, Strings, FundingRate, FundingRates, Trade, TradingFees, Transaction, TransferEntry
9
+ from ccxt.base.types import Account, Any, Balances, Bool, Conversion, Currencies, Currency, DepositAddress, Int, LedgerEntry, Leverage, MarginModification, Market, MarketType, Num, Order, OrderBook, OrderSide, OrderType, Str, Strings, FundingRate, FundingRates, Trade, TradingFees, Transaction, TransferEntry
10
10
  from typing import List
11
- from typing import Any
12
11
  from ccxt.base.errors import ExchangeError
13
12
  from ccxt.base.errors import AuthenticationError
14
13
  from ccxt.base.errors import ArgumentsRequired
@@ -24,7 +23,7 @@ from ccxt.base.precise import Precise
24
23
 
25
24
  class woo(Exchange, ImplicitAPI):
26
25
 
27
- def describe(self):
26
+ def describe(self) -> Any:
28
27
  return self.deep_extend(super(woo, self).describe(), {
29
28
  'id': 'woo',
30
29
  'name': 'WOO X',
@@ -484,7 +483,7 @@ class woo(Exchange, ImplicitAPI):
484
483
  'info': response,
485
484
  }
486
485
 
487
- def fetch_time(self, params={}):
486
+ def fetch_time(self, params={}) -> Int:
488
487
  """
489
488
  fetches the current integer timestamp in milliseconds from the exchange server
490
489
 
ccxt/woofipro.py CHANGED
@@ -5,9 +5,8 @@
5
5
 
6
6
  from ccxt.base.exchange import Exchange
7
7
  from ccxt.abstract.woofipro import ImplicitAPI
8
- from ccxt.base.types import Balances, Currencies, Currency, Int, LedgerEntry, Leverage, Market, Num, Order, OrderBook, OrderRequest, OrderSide, OrderType, Str, Strings, FundingRate, FundingRates, Trade, TradingFees, Transaction
8
+ from ccxt.base.types import Any, Balances, Currencies, Currency, Int, LedgerEntry, Leverage, Market, Num, Order, OrderBook, OrderRequest, OrderSide, OrderType, Str, Strings, FundingRate, FundingRates, Trade, TradingFees, Transaction
9
9
  from typing import List
10
- from typing import Any
11
10
  from ccxt.base.errors import ExchangeError
12
11
  from ccxt.base.errors import AuthenticationError
13
12
  from ccxt.base.errors import ArgumentsRequired
@@ -23,7 +22,7 @@ from ccxt.base.precise import Precise
23
22
 
24
23
  class woofipro(Exchange, ImplicitAPI):
25
24
 
26
- def describe(self):
25
+ def describe(self) -> Any:
27
26
  return self.deep_extend(super(woofipro, self).describe(), {
28
27
  'id': 'woofipro',
29
28
  'name': 'WOOFI PRO',
@@ -471,7 +470,7 @@ class woofipro(Exchange, ImplicitAPI):
471
470
  'info': response,
472
471
  }
473
472
 
474
- def fetch_time(self, params={}):
473
+ def fetch_time(self, params={}) -> Int:
475
474
  """
476
475
  fetches the current integer timestamp in milliseconds from the exchange server
477
476
 
ccxt/xt.py CHANGED
@@ -6,7 +6,7 @@
6
6
  from ccxt.base.exchange import Exchange
7
7
  from ccxt.abstract.xt import ImplicitAPI
8
8
  import hashlib
9
- from ccxt.base.types import Currencies, Currency, DepositAddress, Int, LedgerEntry, LeverageTier, LeverageTiers, MarginModification, Market, Num, Order, OrderSide, OrderType, Str, Tickers, FundingRate, Transaction, TransferEntry
9
+ from ccxt.base.types import Any, Currencies, Currency, DepositAddress, Int, LedgerEntry, LeverageTier, LeverageTiers, MarginModification, Market, Num, Order, OrderSide, OrderType, Str, Tickers, FundingRate, Transaction, TransferEntry
10
10
  from typing import List
11
11
  from ccxt.base.errors import ExchangeError
12
12
  from ccxt.base.errors import AuthenticationError
@@ -27,7 +27,7 @@ from ccxt.base.precise import Precise
27
27
 
28
28
  class xt(Exchange, ImplicitAPI):
29
29
 
30
- def describe(self):
30
+ def describe(self) -> Any:
31
31
  return self.deep_extend(super(xt, self).describe(), {
32
32
  'id': 'xt',
33
33
  'name': 'XT',
@@ -812,7 +812,7 @@ class xt(Exchange, ImplicitAPI):
812
812
  def nonce(self):
813
813
  return self.milliseconds() - self.options['timeDifference']
814
814
 
815
- def fetch_time(self, params={}):
815
+ def fetch_time(self, params={}) -> Int:
816
816
  """
817
817
  fetches the current integer timestamp in milliseconds from the xt server
818
818
 
@@ -1393,9 +1393,15 @@ class xt(Exchange, ImplicitAPI):
1393
1393
  :param int [since]: timestamp in ms of the earliest candle to fetch
1394
1394
  :param int [limit]: the maximum amount of candles to fetch
1395
1395
  :param dict params: extra parameters specific to the xt api endpoint
1396
+ :param int [params.until]: timestamp in ms of the latest candle to fetch
1397
+ :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)
1396
1398
  :returns int[][]: A list of candles ordered, open, high, low, close, volume
1397
1399
  """
1398
1400
  self.load_markets()
1401
+ paginate = False
1402
+ paginate, params = self.handle_option_and_params(params, 'fetchOHLCV', 'paginate', False)
1403
+ if paginate:
1404
+ return self.fetch_paginated_call_deterministic('fetchOHLCV', symbol, since, limit, timeframe, params, 1000)
1399
1405
  market = self.market(symbol)
1400
1406
  request = {
1401
1407
  'symbol': market['id'],
@@ -1405,6 +1411,12 @@ class xt(Exchange, ImplicitAPI):
1405
1411
  request['startTime'] = since
1406
1412
  if limit is not None:
1407
1413
  request['limit'] = limit
1414
+ else:
1415
+ request['limit'] = 1000
1416
+ until = self.safe_integer(params, 'until')
1417
+ params = self.omit(params, ['until'])
1418
+ if until is not None:
1419
+ request['endTime'] = until
1408
1420
  response = None
1409
1421
  if market['linear']:
1410
1422
  response = self.publicLinearGetFutureMarketV1PublicQKline(self.extend(request, params))
ccxt/yobit.py CHANGED
@@ -6,7 +6,7 @@
6
6
  from ccxt.base.exchange import Exchange
7
7
  from ccxt.abstract.yobit import ImplicitAPI
8
8
  import hashlib
9
- from ccxt.base.types import Balances, DepositAddress, Int, Market, Num, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, OrderBooks, Trade, TradingFees, Transaction
9
+ from ccxt.base.types import Any, Balances, DepositAddress, Int, Market, Num, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, OrderBooks, Trade, TradingFees, Transaction
10
10
  from typing import List
11
11
  from ccxt.base.errors import ExchangeError
12
12
  from ccxt.base.errors import AuthenticationError
@@ -24,7 +24,7 @@ from ccxt.base.precise import Precise
24
24
 
25
25
  class yobit(Exchange, ImplicitAPI):
26
26
 
27
- def describe(self):
27
+ def describe(self) -> Any:
28
28
  return self.deep_extend(super(yobit, self).describe(), {
29
29
  'id': 'yobit',
30
30
  'name': 'YoBit',
ccxt/zaif.py CHANGED
@@ -6,7 +6,7 @@
6
6
  from ccxt.base.exchange import Exchange
7
7
  from ccxt.abstract.zaif import ImplicitAPI
8
8
  import hashlib
9
- from ccxt.base.types import Balances, Currency, Int, Market, Num, Order, OrderBook, OrderSide, OrderType, Str, Ticker, Trade, Transaction
9
+ from ccxt.base.types import Any, Balances, Currency, Int, Market, Num, Order, OrderBook, OrderSide, OrderType, Str, Ticker, Trade, Transaction
10
10
  from typing import List
11
11
  from ccxt.base.errors import ExchangeError
12
12
  from ccxt.base.errors import BadRequest
@@ -16,7 +16,7 @@ from ccxt.base.precise import Precise
16
16
 
17
17
  class zaif(Exchange, ImplicitAPI):
18
18
 
19
- def describe(self):
19
+ def describe(self) -> Any:
20
20
  return self.deep_extend(super(zaif, self).describe(), {
21
21
  'id': 'zaif',
22
22
  'name': 'Zaif',
ccxt/zonda.py CHANGED
@@ -6,7 +6,7 @@
6
6
  from ccxt.base.exchange import Exchange
7
7
  from ccxt.abstract.zonda import ImplicitAPI
8
8
  import hashlib
9
- from ccxt.base.types import Balances, Currency, DepositAddress, Int, LedgerEntry, Market, Num, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, Transaction, TransferEntry
9
+ from ccxt.base.types import Any, Balances, Currency, DepositAddress, Int, LedgerEntry, Market, Num, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, Transaction, TransferEntry
10
10
  from typing import List
11
11
  from ccxt.base.errors import ExchangeError
12
12
  from ccxt.base.errors import AuthenticationError
@@ -27,7 +27,7 @@ from ccxt.base.precise import Precise
27
27
 
28
28
  class zonda(Exchange, ImplicitAPI):
29
29
 
30
- def describe(self):
30
+ def describe(self) -> Any:
31
31
  return self.deep_extend(super(zonda, self).describe(), {
32
32
  'id': 'zonda',
33
33
  'name': 'Zonda',