ccxt 4.2.76__py2.py3-none-any.whl → 4.2.78__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 (57) hide show
  1. ccxt/__init__.py +1 -1
  2. ccxt/abstract/kucoin.py +1 -0
  3. ccxt/abstract/kucoinfutures.py +1 -0
  4. ccxt/async_support/__init__.py +1 -1
  5. ccxt/async_support/base/exchange.py +1 -1
  6. ccxt/async_support/binance.py +503 -444
  7. ccxt/async_support/bingx.py +1 -1
  8. ccxt/async_support/bitflyer.py +2 -2
  9. ccxt/async_support/bithumb.py +2 -2
  10. ccxt/async_support/blofin.py +11 -2
  11. ccxt/async_support/bybit.py +88 -52
  12. ccxt/async_support/coinbase.py +21 -10
  13. ccxt/async_support/delta.py +65 -51
  14. ccxt/async_support/deribit.py +2 -2
  15. ccxt/async_support/gate.py +3 -2
  16. ccxt/async_support/htx.py +34 -27
  17. ccxt/async_support/hyperliquid.py +7 -5
  18. ccxt/async_support/kraken.py +8 -8
  19. ccxt/async_support/kucoin.py +192 -5
  20. ccxt/async_support/okcoin.py +27 -1
  21. ccxt/async_support/okx.py +20 -2
  22. ccxt/async_support/woo.py +62 -3
  23. ccxt/base/exchange.py +9 -4
  24. ccxt/binance.py +503 -444
  25. ccxt/bingx.py +1 -1
  26. ccxt/bitflyer.py +2 -2
  27. ccxt/bithumb.py +2 -2
  28. ccxt/blofin.py +11 -2
  29. ccxt/bybit.py +88 -52
  30. ccxt/coinbase.py +21 -10
  31. ccxt/delta.py +65 -51
  32. ccxt/deribit.py +2 -2
  33. ccxt/gate.py +3 -2
  34. ccxt/htx.py +34 -27
  35. ccxt/hyperliquid.py +7 -5
  36. ccxt/kraken.py +8 -8
  37. ccxt/kucoin.py +192 -5
  38. ccxt/okcoin.py +27 -1
  39. ccxt/okx.py +20 -2
  40. ccxt/pro/__init__.py +1 -1
  41. ccxt/pro/ascendex.py +1 -1
  42. ccxt/pro/bitvavo.py +1 -1
  43. ccxt/pro/coinex.py +20 -14
  44. ccxt/pro/deribit.py +1 -1
  45. ccxt/pro/exmo.py +1 -1
  46. ccxt/pro/krakenfutures.py +1 -1
  47. ccxt/pro/phemex.py +1 -1
  48. ccxt/pro/poloniex.py +1 -1
  49. ccxt/pro/probit.py +1 -1
  50. ccxt/pro/woo.py +50 -6
  51. ccxt/test/test_async.py +9 -16
  52. ccxt/test/test_sync.py +9 -16
  53. ccxt/woo.py +62 -3
  54. {ccxt-4.2.76.dist-info → ccxt-4.2.78.dist-info}/METADATA +4 -4
  55. {ccxt-4.2.76.dist-info → ccxt-4.2.78.dist-info}/RECORD +57 -57
  56. {ccxt-4.2.76.dist-info → ccxt-4.2.78.dist-info}/WHEEL +0 -0
  57. {ccxt-4.2.76.dist-info → ccxt-4.2.78.dist-info}/top_level.txt +0 -0
ccxt/pro/woo.py CHANGED
@@ -62,6 +62,13 @@ class woo(ccxt.async_support.woo):
62
62
  'ping': self.ping,
63
63
  'keepAlive': 10000,
64
64
  },
65
+ 'exceptions': {
66
+ 'ws': {
67
+ 'exact': {
68
+ 'Auth is needed.': AuthenticationError,
69
+ },
70
+ },
71
+ },
65
72
  })
66
73
 
67
74
  def request_id(self, url):
@@ -413,8 +420,9 @@ class woo(ccxt.async_support.woo):
413
420
  client = self.client(url)
414
421
  messageHash = 'authenticated'
415
422
  event = 'auth'
416
- future = self.safe_value(client.subscriptions, messageHash)
417
- if future is None:
423
+ future = client.future(messageHash)
424
+ authenticated = self.safe_value(client.subscriptions, messageHash)
425
+ if authenticated is None:
418
426
  ts = str(self.nonce())
419
427
  auth = '|' + ts
420
428
  signature = self.hmac(self.encode(auth), self.encode(self.secret), hashlib.sha256)
@@ -427,9 +435,8 @@ class woo(ccxt.async_support.woo):
427
435
  },
428
436
  }
429
437
  message = self.extend(request, params)
430
- future = self.watch(url, messageHash, message)
431
- client.subscriptions[messageHash] = future
432
- return future
438
+ self.watch(url, messageHash, message, messageHash)
439
+ return await future
433
440
 
434
441
  async def watch_private(self, messageHash, message, params={}):
435
442
  await self.authenticate(params)
@@ -442,6 +449,14 @@ class woo(ccxt.async_support.woo):
442
449
  return await self.watch(url, messageHash, request, messageHash, subscribe)
443
450
 
444
451
  async def watch_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
452
+ """
453
+ watches information on multiple orders made by the user
454
+ :param str symbol: unified market symbol of the market orders were made in
455
+ :param int [since]: the earliest time in ms to fetch orders for
456
+ :param int [limit]: the maximum number of order structures to retrieve
457
+ :param dict [params]: extra parameters specific to the exchange API endpoint
458
+ :returns dict[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
459
+ """
445
460
  await self.load_markets()
446
461
  topic = 'executionreport'
447
462
  messageHash = topic
@@ -768,7 +783,34 @@ class woo(ccxt.async_support.woo):
768
783
  self.balance = self.safe_balance(self.balance)
769
784
  client.resolve(self.balance, 'balance')
770
785
 
786
+ def handle_error_message(self, client: Client, message):
787
+ #
788
+ # {"id":"1","event":"subscribe","success":false,"ts":1710780997216,"errorMsg":"Auth is needed."}
789
+ #
790
+ if not ('success' in message):
791
+ return False
792
+ success = self.safe_bool(message, 'success')
793
+ if success:
794
+ return False
795
+ errorMessage = self.safe_string(message, 'errorMsg')
796
+ try:
797
+ if errorMessage is not None:
798
+ feedback = self.id + ' ' + self.json(message)
799
+ self.throw_exactly_matched_exception(self.exceptions['exact'], errorMessage, feedback)
800
+ return False
801
+ except Exception as error:
802
+ if isinstance(error, AuthenticationError):
803
+ messageHash = 'authenticated'
804
+ client.reject(error, messageHash)
805
+ if messageHash in client.subscriptions:
806
+ del client.subscriptions[messageHash]
807
+ else:
808
+ client.reject(error)
809
+ return True
810
+
771
811
  def handle_message(self, client: Client, message):
812
+ if self.handle_error_message(client, message):
813
+ return
772
814
  methods = {
773
815
  'ping': self.handle_ping,
774
816
  'pong': self.handle_pong,
@@ -844,7 +886,9 @@ class woo(ccxt.async_support.woo):
844
886
  messageHash = 'authenticated'
845
887
  success = self.safe_value(message, 'success')
846
888
  if success:
847
- client.resolve(message, messageHash)
889
+ # client.resolve(message, messageHash)
890
+ future = self.safe_value(client.futures, 'authenticated')
891
+ future.resolve(True)
848
892
  else:
849
893
  error = AuthenticationError(self.json(message))
850
894
  client.reject(error, messageHash)
ccxt/test/test_async.py CHANGED
@@ -1326,11 +1326,10 @@ class testMainClass(baseMainTestClass):
1326
1326
  async def test_kucoin(self):
1327
1327
  exchange = self.init_offline_exchange('kucoin')
1328
1328
  req_headers = None
1329
- options_string = str(exchange.options)
1330
1329
  spot_id = exchange.options['partner']['spot']['id']
1331
1330
  spot_key = exchange.options['partner']['spot']['key']
1332
- assert spot_id == 'ccxt', 'kucoin - id: ' + spot_id + ' not in options: ' + options_string
1333
- assert spot_key == '9e58cc35-5b5e-4133-92ec-166e3f077cb8', 'kucoin - key: ' + spot_key + ' not in options: ' + options_string
1331
+ assert spot_id == 'ccxt', 'kucoin - id: ' + spot_id + ' not in options'
1332
+ assert spot_key == '9e58cc35-5b5e-4133-92ec-166e3f077cb8', 'kucoin - key: ' + spot_key + ' not in options.'
1334
1333
  try:
1335
1334
  await exchange.create_order('BTC/USDT', 'limit', 'buy', 1, 20000)
1336
1335
  except Exception as e:
@@ -1345,11 +1344,10 @@ class testMainClass(baseMainTestClass):
1345
1344
  exchange = self.init_offline_exchange('kucoinfutures')
1346
1345
  req_headers = None
1347
1346
  id = 'ccxtfutures'
1348
- options_string = str(exchange.options['partner']['future'])
1349
1347
  future_id = exchange.options['partner']['future']['id']
1350
1348
  future_key = exchange.options['partner']['future']['key']
1351
- assert future_id == id, 'kucoinfutures - id: ' + future_id + ' not in options: ' + options_string
1352
- assert future_key == '1b327198-f30c-4f14-a0ac-918871282f15', 'kucoinfutures - key: ' + future_key + ' not in options: ' + options_string
1349
+ assert future_id == id, 'kucoinfutures - id: ' + future_id + ' not in options.'
1350
+ assert future_key == '1b327198-f30c-4f14-a0ac-918871282f15', 'kucoinfutures - key: ' + future_key + ' not in options.'
1353
1351
  try:
1354
1352
  await exchange.create_order('BTC/USDT:USDT', 'limit', 'buy', 1, 20000)
1355
1353
  except Exception as e:
@@ -1362,8 +1360,7 @@ class testMainClass(baseMainTestClass):
1362
1360
  exchange = self.init_offline_exchange('bitget')
1363
1361
  req_headers = None
1364
1362
  id = 'p4sve'
1365
- options_string = str(exchange.options)
1366
- assert exchange.options['broker'] == id, 'bitget - id: ' + id + ' not in options: ' + options_string
1363
+ assert exchange.options['broker'] == id, 'bitget - id: ' + id + ' not in options'
1367
1364
  try:
1368
1365
  await exchange.create_order('BTC/USDT', 'limit', 'buy', 1, 20000)
1369
1366
  except Exception as e:
@@ -1376,15 +1373,13 @@ class testMainClass(baseMainTestClass):
1376
1373
  exchange = self.init_offline_exchange('mexc')
1377
1374
  req_headers = None
1378
1375
  id = 'CCXT'
1379
- options_string = str(exchange.options)
1380
- assert exchange.options['broker'] == id, 'mexc - id: ' + id + ' not in options: ' + options_string
1376
+ assert exchange.options['broker'] == id, 'mexc - id: ' + id + ' not in options'
1381
1377
  await exchange.load_markets()
1382
1378
  try:
1383
1379
  await exchange.create_order('BTC/USDT', 'limit', 'buy', 1, 20000)
1384
1380
  except Exception as e:
1385
1381
  req_headers = exchange.last_request_headers
1386
- req_headers_string = str(req_headers) if req_headers is not None else 'undefined'
1387
- assert req_headers['source'] == id, 'mexc - id: ' + id + ' not in headers: ' + req_headers_string
1382
+ assert req_headers['source'] == id, 'mexc - id: ' + id + ' not in headers.'
1388
1383
  await close(exchange)
1389
1384
  return True
1390
1385
 
@@ -1476,15 +1471,13 @@ class testMainClass(baseMainTestClass):
1476
1471
  exchange = self.init_offline_exchange('bingx')
1477
1472
  req_headers = None
1478
1473
  id = 'CCXT'
1479
- options_string = str(exchange.options)
1480
- assert exchange.options['broker'] == id, 'bingx - id: ' + id + ' not in options: ' + options_string
1474
+ assert exchange.options['broker'] == id, 'bingx - id: ' + id + ' not in options'
1481
1475
  try:
1482
1476
  await exchange.create_order('BTC/USDT', 'limit', 'buy', 1, 20000)
1483
1477
  except Exception as e:
1484
1478
  # we expect an error here, we're only interested in the headers
1485
1479
  req_headers = exchange.last_request_headers
1486
- req_headers_string = str(req_headers) if req_headers is not None else 'undefined'
1487
- assert req_headers['X-SOURCE-KEY'] == id, 'bingx - id: ' + id + ' not in headers: ' + req_headers_string
1480
+ assert req_headers['X-SOURCE-KEY'] == id, 'bingx - id: ' + id + ' not in headers.'
1488
1481
  await close(exchange)
1489
1482
 
1490
1483
  async def test_phemex(self):
ccxt/test/test_sync.py CHANGED
@@ -1325,11 +1325,10 @@ class testMainClass(baseMainTestClass):
1325
1325
  def test_kucoin(self):
1326
1326
  exchange = self.init_offline_exchange('kucoin')
1327
1327
  req_headers = None
1328
- options_string = str(exchange.options)
1329
1328
  spot_id = exchange.options['partner']['spot']['id']
1330
1329
  spot_key = exchange.options['partner']['spot']['key']
1331
- assert spot_id == 'ccxt', 'kucoin - id: ' + spot_id + ' not in options: ' + options_string
1332
- assert spot_key == '9e58cc35-5b5e-4133-92ec-166e3f077cb8', 'kucoin - key: ' + spot_key + ' not in options: ' + options_string
1330
+ assert spot_id == 'ccxt', 'kucoin - id: ' + spot_id + ' not in options'
1331
+ assert spot_key == '9e58cc35-5b5e-4133-92ec-166e3f077cb8', 'kucoin - key: ' + spot_key + ' not in options.'
1333
1332
  try:
1334
1333
  exchange.create_order('BTC/USDT', 'limit', 'buy', 1, 20000)
1335
1334
  except Exception as e:
@@ -1344,11 +1343,10 @@ class testMainClass(baseMainTestClass):
1344
1343
  exchange = self.init_offline_exchange('kucoinfutures')
1345
1344
  req_headers = None
1346
1345
  id = 'ccxtfutures'
1347
- options_string = str(exchange.options['partner']['future'])
1348
1346
  future_id = exchange.options['partner']['future']['id']
1349
1347
  future_key = exchange.options['partner']['future']['key']
1350
- assert future_id == id, 'kucoinfutures - id: ' + future_id + ' not in options: ' + options_string
1351
- assert future_key == '1b327198-f30c-4f14-a0ac-918871282f15', 'kucoinfutures - key: ' + future_key + ' not in options: ' + options_string
1348
+ assert future_id == id, 'kucoinfutures - id: ' + future_id + ' not in options.'
1349
+ assert future_key == '1b327198-f30c-4f14-a0ac-918871282f15', 'kucoinfutures - key: ' + future_key + ' not in options.'
1352
1350
  try:
1353
1351
  exchange.create_order('BTC/USDT:USDT', 'limit', 'buy', 1, 20000)
1354
1352
  except Exception as e:
@@ -1361,8 +1359,7 @@ class testMainClass(baseMainTestClass):
1361
1359
  exchange = self.init_offline_exchange('bitget')
1362
1360
  req_headers = None
1363
1361
  id = 'p4sve'
1364
- options_string = str(exchange.options)
1365
- assert exchange.options['broker'] == id, 'bitget - id: ' + id + ' not in options: ' + options_string
1362
+ assert exchange.options['broker'] == id, 'bitget - id: ' + id + ' not in options'
1366
1363
  try:
1367
1364
  exchange.create_order('BTC/USDT', 'limit', 'buy', 1, 20000)
1368
1365
  except Exception as e:
@@ -1375,15 +1372,13 @@ class testMainClass(baseMainTestClass):
1375
1372
  exchange = self.init_offline_exchange('mexc')
1376
1373
  req_headers = None
1377
1374
  id = 'CCXT'
1378
- options_string = str(exchange.options)
1379
- assert exchange.options['broker'] == id, 'mexc - id: ' + id + ' not in options: ' + options_string
1375
+ assert exchange.options['broker'] == id, 'mexc - id: ' + id + ' not in options'
1380
1376
  exchange.load_markets()
1381
1377
  try:
1382
1378
  exchange.create_order('BTC/USDT', 'limit', 'buy', 1, 20000)
1383
1379
  except Exception as e:
1384
1380
  req_headers = exchange.last_request_headers
1385
- req_headers_string = str(req_headers) if req_headers is not None else 'undefined'
1386
- assert req_headers['source'] == id, 'mexc - id: ' + id + ' not in headers: ' + req_headers_string
1381
+ assert req_headers['source'] == id, 'mexc - id: ' + id + ' not in headers.'
1387
1382
  close(exchange)
1388
1383
  return True
1389
1384
 
@@ -1475,15 +1470,13 @@ class testMainClass(baseMainTestClass):
1475
1470
  exchange = self.init_offline_exchange('bingx')
1476
1471
  req_headers = None
1477
1472
  id = 'CCXT'
1478
- options_string = str(exchange.options)
1479
- assert exchange.options['broker'] == id, 'bingx - id: ' + id + ' not in options: ' + options_string
1473
+ assert exchange.options['broker'] == id, 'bingx - id: ' + id + ' not in options'
1480
1474
  try:
1481
1475
  exchange.create_order('BTC/USDT', 'limit', 'buy', 1, 20000)
1482
1476
  except Exception as e:
1483
1477
  # we expect an error here, we're only interested in the headers
1484
1478
  req_headers = exchange.last_request_headers
1485
- req_headers_string = str(req_headers) if req_headers is not None else 'undefined'
1486
- assert req_headers['X-SOURCE-KEY'] == id, 'bingx - id: ' + id + ' not in headers: ' + req_headers_string
1479
+ assert req_headers['X-SOURCE-KEY'] == id, 'bingx - id: ' + id + ' not in headers.'
1487
1480
  close(exchange)
1488
1481
 
1489
1482
  def test_phemex(self):
ccxt/woo.py CHANGED
@@ -65,7 +65,7 @@ class woo(Exchange, ImplicitAPI):
65
65
  'fetchBalance': True,
66
66
  'fetchCanceledOrders': False,
67
67
  'fetchClosedOrder': False,
68
- 'fetchClosedOrders': False,
68
+ 'fetchClosedOrders': True,
69
69
  'fetchCurrencies': True,
70
70
  'fetchDepositAddress': True,
71
71
  'fetchDeposits': True,
@@ -84,7 +84,7 @@ class woo(Exchange, ImplicitAPI):
84
84
  'fetchOHLCV': True,
85
85
  'fetchOpenInterestHistory': False,
86
86
  'fetchOpenOrder': False,
87
- 'fetchOpenOrders': False,
87
+ 'fetchOpenOrders': True,
88
88
  'fetchOrder': True,
89
89
  'fetchOrderBook': True,
90
90
  'fetchOrders': True,
@@ -1274,9 +1274,14 @@ class woo(Exchange, ImplicitAPI):
1274
1274
  :param boolean [params.isTriggered]: whether the order has been triggered(False by default)
1275
1275
  :param str [params.side]: 'buy' or 'sell'
1276
1276
  :param boolean [params.trailing]: set to True if you want to fetch trailing orders
1277
+ :param boolean [params.paginate]: set to True if you want to fetch orders with pagination
1277
1278
  :returns Order[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
1278
1279
  """
1279
1280
  self.load_markets()
1281
+ paginate = False
1282
+ paginate, params = self.handle_option_and_params(params, 'fetchOrders', 'paginate')
1283
+ if paginate:
1284
+ return self.fetch_paginated_call_incremental('fetchOrders', symbol, since, limit, params, 'page', 500)
1280
1285
  request = {}
1281
1286
  market: Market = None
1282
1287
  stop = self.safe_bool_2(params, 'stop', 'trigger')
@@ -1290,6 +1295,10 @@ class woo(Exchange, ImplicitAPI):
1290
1295
  request['createdTimeStart'] = since
1291
1296
  else:
1292
1297
  request['start_t'] = since
1298
+ if limit is not None:
1299
+ request['size'] = limit
1300
+ else:
1301
+ request['size'] = 500
1293
1302
  if stop:
1294
1303
  request['algoType'] = 'stop'
1295
1304
  elif trailing:
@@ -1332,7 +1341,47 @@ class woo(Exchange, ImplicitAPI):
1332
1341
  #
1333
1342
  data = self.safe_value(response, 'data', response)
1334
1343
  orders = self.safe_list(data, 'rows')
1335
- return self.parse_orders(orders, market, since, limit, params)
1344
+ return self.parse_orders(orders, market, since, limit)
1345
+
1346
+ def fetch_open_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
1347
+ """
1348
+ fetches information on multiple orders made by the user
1349
+ :see: https://docs.woo.org/#get-orders
1350
+ :see: https://docs.woo.org/#get-algo-orders
1351
+ :param str symbol: unified market symbol of the market orders were made in
1352
+ :param int [since]: the earliest time in ms to fetch orders for
1353
+ :param int [limit]: the maximum number of order structures to retrieve
1354
+ :param dict [params]: extra parameters specific to the exchange API endpoint
1355
+ :param boolean [params.stop]: whether the order is a stop/algo order
1356
+ :param boolean [params.isTriggered]: whether the order has been triggered(False by default)
1357
+ :param str [params.side]: 'buy' or 'sell'
1358
+ :param boolean [params.trailing]: set to True if you want to fetch trailing orders
1359
+ :param boolean [params.paginate]: set to True if you want to fetch orders with pagination
1360
+ :returns Order[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
1361
+ """
1362
+ self.load_markets()
1363
+ extendedParams = self.extend(params, {'status': 'INCOMPLETE'})
1364
+ return self.fetch_orders(symbol, since, limit, extendedParams)
1365
+
1366
+ def fetch_closed_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
1367
+ """
1368
+ fetches information on multiple orders made by the user
1369
+ :see: https://docs.woo.org/#get-orders
1370
+ :see: https://docs.woo.org/#get-algo-orders
1371
+ :param str symbol: unified market symbol of the market orders were made in
1372
+ :param int [since]: the earliest time in ms to fetch orders for
1373
+ :param int [limit]: the maximum number of order structures to retrieve
1374
+ :param dict [params]: extra parameters specific to the exchange API endpoint
1375
+ :param boolean [params.stop]: whether the order is a stop/algo order
1376
+ :param boolean [params.isTriggered]: whether the order has been triggered(False by default)
1377
+ :param str [params.side]: 'buy' or 'sell'
1378
+ :param boolean [params.trailing]: set to True if you want to fetch trailing orders
1379
+ :param boolean [params.paginate]: set to True if you want to fetch orders with pagination
1380
+ :returns Order[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
1381
+ """
1382
+ self.load_markets()
1383
+ extendedParams = self.extend(params, {'status': 'COMPLETED'})
1384
+ return self.fetch_orders(symbol, since, limit, extendedParams)
1336
1385
 
1337
1386
  def parse_time_in_force(self, timeInForce):
1338
1387
  timeInForces = {
@@ -1633,14 +1682,20 @@ class woo(Exchange, ImplicitAPI):
1633
1682
 
1634
1683
  def fetch_my_trades(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}):
1635
1684
  """
1685
+ :see: https://docs.woo.org/#get-trades
1636
1686
  fetch all trades made by the user
1637
1687
  :param str symbol: unified market symbol
1638
1688
  :param int [since]: the earliest time in ms to fetch trades for
1639
1689
  :param int [limit]: the maximum number of trades structures to retrieve
1640
1690
  :param dict [params]: extra parameters specific to the exchange API endpoint
1691
+ :param boolean [params.paginate]: set to True if you want to fetch trades with pagination
1641
1692
  :returns Trade[]: a list of `trade structures <https://docs.ccxt.com/#/?id=trade-structure>`
1642
1693
  """
1643
1694
  self.load_markets()
1695
+ paginate = False
1696
+ paginate, params = self.handle_option_and_params(params, 'fetchMyTrades', 'paginate')
1697
+ if paginate:
1698
+ return self.fetch_paginated_call_incremental('fetchMyTrades', symbol, since, limit, params, 'page', 500)
1644
1699
  request = {}
1645
1700
  market: Market = None
1646
1701
  if symbol is not None:
@@ -1648,6 +1703,10 @@ class woo(Exchange, ImplicitAPI):
1648
1703
  request['symbol'] = market['id']
1649
1704
  if since is not None:
1650
1705
  request['start_t'] = since
1706
+ if limit is not None:
1707
+ request['size'] = limit
1708
+ else:
1709
+ request['size'] = 500
1651
1710
  response = self.v1PrivateGetClientTrades(self.extend(request, params))
1652
1711
  # {
1653
1712
  # "success": True,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ccxt
3
- Version: 4.2.76
3
+ Version: 4.2.78
4
4
  Summary: A JavaScript / TypeScript / Python / C# / PHP cryptocurrency trading library with support for 100+ exchanges
5
5
  Home-page: https://ccxt.com
6
6
  Author: Igor Kroitor
@@ -262,13 +262,13 @@ console.log(version, Object.keys(exchanges));
262
262
 
263
263
  All-in-one browser bundle (dependencies included), served from a CDN of your choice:
264
264
 
265
- * jsDelivr: https://cdn.jsdelivr.net/npm/ccxt@4.2.76/dist/ccxt.browser.js
266
- * unpkg: https://unpkg.com/ccxt@4.2.76/dist/ccxt.browser.js
265
+ * jsDelivr: https://cdn.jsdelivr.net/npm/ccxt@4.2.78/dist/ccxt.browser.js
266
+ * unpkg: https://unpkg.com/ccxt@4.2.78/dist/ccxt.browser.js
267
267
 
268
268
  CDNs are not updated in real-time and may have delays. Defaulting to the most recent version without specifying the version number is not recommended. Please, keep in mind that we are not responsible for the correct operation of those CDN servers.
269
269
 
270
270
  ```HTML
271
- <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/ccxt@4.2.76/dist/ccxt.browser.js"></script>
271
+ <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/ccxt@4.2.78/dist/ccxt.browser.js"></script>
272
272
  ```
273
273
 
274
274
  Creates a global `ccxt` object: