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

Files changed (49) hide show
  1. ccxt/__init__.py +1 -1
  2. ccxt/abstract/binance.py +1 -0
  3. ccxt/abstract/binancecoinm.py +1 -0
  4. ccxt/abstract/binanceus.py +1 -0
  5. ccxt/abstract/binanceusdm.py +1 -0
  6. ccxt/abstract/bitget.py +3 -0
  7. ccxt/abstract/coinex.py +1 -1
  8. ccxt/abstract/okx.py +3 -0
  9. ccxt/ascendex.py +1 -1
  10. ccxt/async_support/__init__.py +1 -1
  11. ccxt/async_support/ascendex.py +1 -1
  12. ccxt/async_support/base/exchange.py +3 -1
  13. ccxt/async_support/binance.py +8 -2
  14. ccxt/async_support/bingx.py +1 -1
  15. ccxt/async_support/bitget.py +4 -1
  16. ccxt/async_support/bitmex.py +1 -0
  17. ccxt/async_support/bybit.py +35 -9
  18. ccxt/async_support/coinex.py +177 -200
  19. ccxt/async_support/delta.py +1 -1
  20. ccxt/async_support/digifinex.py +1 -1
  21. ccxt/async_support/exmo.py +1 -1
  22. ccxt/async_support/gate.py +1 -1
  23. ccxt/async_support/hitbtc.py +1 -1
  24. ccxt/async_support/hyperliquid.py +25 -3
  25. ccxt/async_support/okx.py +4 -1
  26. ccxt/async_support/phemex.py +15 -7
  27. ccxt/base/exchange.py +4 -2
  28. ccxt/binance.py +8 -2
  29. ccxt/bingx.py +1 -1
  30. ccxt/bitget.py +4 -1
  31. ccxt/bitmex.py +1 -0
  32. ccxt/bybit.py +35 -9
  33. ccxt/coinex.py +177 -200
  34. ccxt/delta.py +1 -1
  35. ccxt/digifinex.py +1 -1
  36. ccxt/exmo.py +1 -1
  37. ccxt/gate.py +1 -1
  38. ccxt/hitbtc.py +1 -1
  39. ccxt/hyperliquid.py +25 -3
  40. ccxt/okx.py +4 -1
  41. ccxt/phemex.py +15 -7
  42. ccxt/pro/__init__.py +1 -1
  43. ccxt/pro/htx.py +12 -6
  44. ccxt/pro/kucoinfutures.py +89 -1
  45. ccxt/pro/woo.py +46 -22
  46. {ccxt-4.3.19.dist-info → ccxt-4.3.21.dist-info}/METADATA +4 -4
  47. {ccxt-4.3.19.dist-info → ccxt-4.3.21.dist-info}/RECORD +49 -49
  48. {ccxt-4.3.19.dist-info → ccxt-4.3.21.dist-info}/WHEEL +0 -0
  49. {ccxt-4.3.19.dist-info → ccxt-4.3.21.dist-info}/top_level.txt +0 -0
ccxt/phemex.py CHANGED
@@ -2347,12 +2347,14 @@ class phemex(Exchange, ImplicitAPI):
2347
2347
  """
2348
2348
  create a trade order
2349
2349
  :see: https://github.com/phemex/phemex-api-docs/blob/master/Public-Hedged-Perpetual-API.md#place-order
2350
+ :see: https://phemex-docs.github.io/#place-order-http-put-prefered-3
2350
2351
  :param str symbol: unified symbol of the market to create an order in
2351
2352
  :param str type: 'market' or 'limit'
2352
2353
  :param str side: 'buy' or 'sell'
2353
2354
  :param float amount: how much of currency you want to trade in units of base currency
2354
2355
  :param float [price]: the price at which the order is to be fullfilled, in units of the quote currency, ignored in market orders
2355
2356
  :param dict [params]: extra parameters specific to the exchange API endpoint
2357
+ :param float [params.trigger]: trigger price for conditional orders
2356
2358
  :param dict [params.takeProfit]: *swap only* *takeProfit object in params* containing the triggerPrice at which the attached take profit order will be triggered(perpetual swap markets only)
2357
2359
  :param float [params.takeProfit.triggerPrice]: take profit trigger price
2358
2360
  :param dict [params.stopLoss]: *swap only* *stopLoss object in params* containing the triggerPrice at which the attached stop loss order will be triggered(perpetual swap markets only)
@@ -2363,7 +2365,7 @@ class phemex(Exchange, ImplicitAPI):
2363
2365
  market = self.market(symbol)
2364
2366
  requestSide = self.capitalize(side)
2365
2367
  type = self.capitalize(type)
2366
- reduceOnly = self.safe_value(params, 'reduceOnly')
2368
+ reduceOnly = self.safe_bool(params, 'reduceOnly')
2367
2369
  request = {
2368
2370
  # common
2369
2371
  'symbol': market['id'],
@@ -2404,18 +2406,24 @@ class phemex(Exchange, ImplicitAPI):
2404
2406
  else:
2405
2407
  request['clOrdID'] = clientOrderId
2406
2408
  params = self.omit(params, ['clOrdID', 'clientOrderId'])
2407
- stopPrice = self.safe_string_n(params, ['stopPx', 'stopPrice', 'triggerPrice'])
2408
- if stopPrice is not None:
2409
+ triggerPrice = self.safe_string_n(params, ['stopPx', 'stopPrice', 'triggerPrice'])
2410
+ if triggerPrice is not None:
2409
2411
  if market['settle'] == 'USDT':
2410
- request['stopPxRp'] = self.price_to_precision(symbol, stopPrice)
2412
+ request['stopPxRp'] = self.price_to_precision(symbol, triggerPrice)
2411
2413
  else:
2412
- request['stopPxEp'] = self.to_ep(stopPrice, market)
2414
+ request['stopPxEp'] = self.to_ep(triggerPrice, market)
2413
2415
  params = self.omit(params, ['stopPx', 'stopPrice', 'stopLoss', 'takeProfit', 'triggerPrice'])
2414
2416
  if market['spot']:
2415
2417
  qtyType = self.safe_value(params, 'qtyType', 'ByBase')
2416
2418
  if (type == 'Market') or (type == 'Stop') or (type == 'MarketIfTouched'):
2417
2419
  if price is not None:
2418
2420
  qtyType = 'ByQuote'
2421
+ if triggerPrice is not None:
2422
+ if type == 'Limit':
2423
+ request['ordType'] = 'StopLimit'
2424
+ elif type == 'Market':
2425
+ request['ordType'] = 'Stop'
2426
+ request['trigger'] = 'ByLastPrice'
2419
2427
  request['qtyType'] = qtyType
2420
2428
  if qtyType == 'ByQuote':
2421
2429
  cost = self.safe_number(params, 'cost')
@@ -2446,7 +2454,7 @@ class phemex(Exchange, ImplicitAPI):
2446
2454
  request['orderQtyRq'] = amount
2447
2455
  else:
2448
2456
  request['orderQty'] = self.parse_to_int(amount)
2449
- if stopPrice is not None:
2457
+ if triggerPrice is not None:
2450
2458
  triggerType = self.safe_string(params, 'triggerType', 'ByMarkPrice')
2451
2459
  request['triggerType'] = triggerType
2452
2460
  if stopLossDefined or takeProfitDefined:
@@ -3782,7 +3790,7 @@ class phemex(Exchange, ImplicitAPI):
3782
3790
  }
3783
3791
  return self.safe_string(statuses, status, status)
3784
3792
 
3785
- def parse_margin_modification(self, data, market: Market = None) -> MarginModification:
3793
+ def parse_margin_modification(self, data: dict, market: Market = None) -> MarginModification:
3786
3794
  #
3787
3795
  # {
3788
3796
  # "code": 0,
ccxt/pro/__init__.py CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  # ----------------------------------------------------------------------------
6
6
 
7
- __version__ = '4.3.19'
7
+ __version__ = '4.3.21'
8
8
 
9
9
  # ----------------------------------------------------------------------------
10
10
 
ccxt/pro/htx.py CHANGED
@@ -1772,7 +1772,7 @@ class htx(ccxt.async_support.htx):
1772
1772
  # "data": {"user-id": "35930539"}
1773
1773
  # }
1774
1774
  #
1775
- promise = client.futures['authenticated']
1775
+ promise = client.futures['auth']
1776
1776
  promise.resolve(message)
1777
1777
 
1778
1778
  def handle_error_message(self, client: Client, message):
@@ -1800,6 +1800,12 @@ class htx(ccxt.async_support.htx):
1800
1800
  # 'err-msg': "Non - single account user is not available, please check through the cross and isolated account asset interface",
1801
1801
  # "ts": 1698419490189
1802
1802
  # }
1803
+ # {
1804
+ # "action":"req",
1805
+ # "code":2002,
1806
+ # "ch":"auth",
1807
+ # "message":"auth.fail"
1808
+ # }
1803
1809
  #
1804
1810
  status = self.safe_string(message, 'status')
1805
1811
  if status == 'error':
@@ -1810,6 +1816,7 @@ class htx(ccxt.async_support.htx):
1810
1816
  errorCode = self.safe_string(message, 'err-code')
1811
1817
  try:
1812
1818
  self.throw_exactly_matched_exception(self.exceptions['ws']['exact'], errorCode, self.json(message))
1819
+ raise ExchangeError(self.json(message))
1813
1820
  except Exception as e:
1814
1821
  messageHash = self.safe_string(subscription, 'messageHash')
1815
1822
  client.reject(e, messageHash)
@@ -1817,11 +1824,12 @@ class htx(ccxt.async_support.htx):
1817
1824
  if id in client.subscriptions:
1818
1825
  del client.subscriptions[id]
1819
1826
  return False
1820
- code = self.safe_integer_2(message, 'code', 'err-code')
1821
- if code is not None and ((code != 200) and (code != 0)):
1827
+ code = self.safe_string_2(message, 'code', 'err-code')
1828
+ if code is not None and ((code != '200') and (code != '0')):
1822
1829
  feedback = self.id + ' ' + self.json(message)
1823
1830
  try:
1824
1831
  self.throw_exactly_matched_exception(self.exceptions['ws']['exact'], code, feedback)
1832
+ raise ExchangeError(feedback)
1825
1833
  except Exception as e:
1826
1834
  if isinstance(e, AuthenticationError):
1827
1835
  client.reject(e, 'auth')
@@ -2137,8 +2145,6 @@ class htx(ccxt.async_support.htx):
2137
2145
  'url': url,
2138
2146
  'hostname': hostname,
2139
2147
  }
2140
- if type == 'spot':
2141
- self.options['ws']['gunzip'] = False
2142
2148
  await self.authenticate(authParams)
2143
2149
  return await self.watch(url, messageHash, self.extend(request, params), channel, extendedSubsription)
2144
2150
 
@@ -2149,7 +2155,7 @@ class htx(ccxt.async_support.htx):
2149
2155
  if url is None or hostname is None or type is None:
2150
2156
  raise ArgumentsRequired(self.id + ' authenticate requires a url, hostname and type argument')
2151
2157
  self.check_required_credentials()
2152
- messageHash = 'authenticated'
2158
+ messageHash = 'auth'
2153
2159
  relativePath = url.replace('wss://' + hostname, '')
2154
2160
  client = self.client(url)
2155
2161
  future = client.future(messageHash)
ccxt/pro/kucoinfutures.py CHANGED
@@ -4,7 +4,7 @@
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
7
+ from ccxt.async_support.base.ws.cache import ArrayCache, ArrayCacheBySymbolById, ArrayCacheByTimestamp
8
8
  from ccxt.base.types import Balances, Int, 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
@@ -22,6 +22,7 @@ class kucoinfutures(ccxt.async_support.kucoinfutures):
22
22
  'watchTickers': True,
23
23
  'watchBidsAsks': True,
24
24
  'watchTrades': True,
25
+ 'watchOHLCV': True,
25
26
  'watchOrderBook': True,
26
27
  'watchOrders': True,
27
28
  'watchBalance': True,
@@ -32,6 +33,21 @@ class kucoinfutures(ccxt.async_support.kucoinfutures):
32
33
  'watchOrderBookForSymbols': True,
33
34
  },
34
35
  'options': {
36
+ 'timeframes': {
37
+ '1m': '1min',
38
+ '3m': '1min',
39
+ '5m': '5min',
40
+ '15m': '15min',
41
+ '30m': '30min',
42
+ '1h': '1hour',
43
+ '2h': '2hour',
44
+ '4h': '4hour',
45
+ '8h': '8hour',
46
+ '12h': '12hour',
47
+ '1d': '1day',
48
+ '1w': '1week',
49
+ '1M': '1month',
50
+ },
35
51
  'accountsByType': {
36
52
  'swap': 'future',
37
53
  'cross': 'margin',
@@ -540,6 +556,77 @@ class kucoinfutures(ccxt.async_support.kucoinfutures):
540
556
  client.resolve(trades, messageHash)
541
557
  return message
542
558
 
559
+ async def watch_ohlcv(self, symbol: str, timeframe='1m', since: Int = None, limit: Int = None, params={}) -> List[list]:
560
+ """
561
+ :see: https://www.kucoin.com/docs/websocket/futures-trading/public-channels/klines
562
+ watches historical candlestick data containing the open, high, low, and close price, and the volume of a market
563
+ :param str symbol: unified symbol of the market to fetch OHLCV data for
564
+ :param str timeframe: the length of time each candle represents
565
+ :param int [since]: timestamp in ms of the earliest candle to fetch
566
+ :param int [limit]: the maximum amount of candles to fetch
567
+ :param dict [params]: extra parameters specific to the exchange API endpoint
568
+ :returns int[][]: A list of candles ordered, open, high, low, close, volume
569
+ """
570
+ await self.load_markets()
571
+ symbol = self.symbol(symbol)
572
+ url = await self.negotiate(False)
573
+ marketId = self.market_id(symbol)
574
+ timeframes = self.safe_dict(self.options, 'timeframes')
575
+ timeframeId = self.safe_string(timeframes, timeframe, timeframe)
576
+ topic = '/contractMarket/limitCandle:' + marketId + '_' + timeframeId
577
+ messageHash = 'ohlcv::' + symbol + '_' + timeframe
578
+ ohlcv = await self.subscribe(url, messageHash, topic, None, params)
579
+ if self.newUpdates:
580
+ limit = ohlcv.getLimit(symbol, limit)
581
+ return self.filter_by_since_limit(ohlcv, since, limit, 0, True)
582
+
583
+ def handle_ohlcv(self, client: Client, message):
584
+ #
585
+ # {
586
+ # "topic":"/contractMarket/limitCandle:LTCUSDTM_1min",
587
+ # "type":"message",
588
+ # "data":{
589
+ # "symbol":"LTCUSDTM",
590
+ # "candles":[
591
+ # "1715470980",
592
+ # "81.38",
593
+ # "81.38",
594
+ # "81.38",
595
+ # "81.38",
596
+ # "61.0",
597
+ # "61"
598
+ # ],
599
+ # "time":1715470994801
600
+ # },
601
+ # "subject":"candle.stick"
602
+ # }
603
+ #
604
+ topic = self.safe_string(message, 'topic')
605
+ parts = topic.split('_')
606
+ timeframeId = self.safe_string(parts, 1)
607
+ data = self.safe_dict(message, 'data')
608
+ timeframes = self.safe_dict(self.options, 'timeframes')
609
+ timeframe = self.find_timeframe(timeframeId, timeframes)
610
+ marketId = self.safe_string(data, 'symbol')
611
+ symbol = self.safe_symbol(marketId)
612
+ messageHash = 'ohlcv::' + symbol + '_' + timeframe
613
+ ohlcv = self.safe_list(data, 'candles')
614
+ parsed = [
615
+ self.safe_integer(ohlcv, 0),
616
+ self.safe_number(ohlcv, 1),
617
+ self.safe_number(ohlcv, 2),
618
+ self.safe_number(ohlcv, 3),
619
+ self.safe_number(ohlcv, 4),
620
+ self.safe_number(ohlcv, 6), # Note value 5 is incorrect and will be fixed in subsequent versions of kucoin
621
+ ]
622
+ self.ohlcvs[symbol] = self.safe_dict(self.ohlcvs, symbol, {})
623
+ if not (timeframe in self.ohlcvs[symbol]):
624
+ limit = self.safe_integer(self.options, 'OHLCVLimit', 1000)
625
+ self.ohlcvs[symbol][timeframe] = ArrayCacheByTimestamp(limit)
626
+ stored = self.ohlcvs[symbol][timeframe]
627
+ stored.append(parsed)
628
+ client.resolve(stored, messageHash)
629
+
543
630
  async def watch_order_book(self, symbol: str, limit: Int = None, params={}) -> OrderBook:
544
631
  """
545
632
  watches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
@@ -923,6 +1010,7 @@ class kucoinfutures(ccxt.async_support.kucoinfutures):
923
1010
  methods = {
924
1011
  'level2': self.handle_order_book,
925
1012
  'ticker': self.handle_ticker,
1013
+ 'candle.stick': self.handle_ohlcv,
926
1014
  'tickerV2': self.handle_bid_ask,
927
1015
  'availableBalance.change': self.handle_balance,
928
1016
  'match': self.handle_trade,
ccxt/pro/woo.py CHANGED
@@ -531,6 +531,16 @@ class woo(ccxt.async_support.woo):
531
531
  request = self.extend(subscribe, message)
532
532
  return await self.watch(url, messageHash, request, messageHash, subscribe)
533
533
 
534
+ async def watch_private_multiple(self, messageHashes, message, params={}):
535
+ await self.authenticate(params)
536
+ url = self.urls['api']['ws']['private'] + '/' + self.uid
537
+ requestId = self.request_id(url)
538
+ subscribe = {
539
+ 'id': requestId,
540
+ }
541
+ request = self.extend(subscribe, message)
542
+ return await self.watch_multiple(url, messageHashes, request, messageHashes, subscribe)
543
+
534
544
  async def watch_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
535
545
  """
536
546
  :see: https://docs.woo.org/#executionreport
@@ -540,10 +550,13 @@ class woo(ccxt.async_support.woo):
540
550
  :param int [since]: the earliest time in ms to fetch orders for
541
551
  :param int [limit]: the maximum number of order structures to retrieve
542
552
  :param dict [params]: extra parameters specific to the exchange API endpoint
553
+ :param bool [params.trigger]: True if trigger order
543
554
  :returns dict[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
544
555
  """
545
556
  await self.load_markets()
546
- topic = 'executionreport'
557
+ trigger = self.safe_bool_2(params, 'stop', 'trigger', False)
558
+ topic = 'algoexecutionreportv2' if (trigger) else 'executionreport'
559
+ params = self.omit(params, ['stop', 'trigger'])
547
560
  messageHash = topic
548
561
  if symbol is not None:
549
562
  market = self.market(symbol)
@@ -562,15 +575,19 @@ class woo(ccxt.async_support.woo):
562
575
  async def watch_my_trades(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
563
576
  """
564
577
  :see: https://docs.woo.org/#executionreport
578
+ :see: https://docs.woo.org/#algoexecutionreportv2
565
579
  watches information on multiple trades made by the user
566
580
  :param str symbol: unified market symbol of the market orders were made in
567
581
  :param int [since]: the earliest time in ms to fetch orders for
568
582
  :param int [limit]: the maximum number of order structures to retrieve
569
583
  :param dict [params]: extra parameters specific to the exchange API endpoint
584
+ :param bool [params.trigger]: True if trigger order
570
585
  :returns dict[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
571
586
  """
572
587
  await self.load_markets()
573
- topic = 'executionreport'
588
+ trigger = self.safe_bool_2(params, 'stop', 'trigger', False)
589
+ topic = 'algoexecutionreportv2' if (trigger) else 'executionreport'
590
+ params = self.omit(params, ['stop', 'trigger'])
574
591
  messageHash = 'myTrades'
575
592
  if symbol is not None:
576
593
  market = self.market(symbol)
@@ -692,14 +709,24 @@ class woo(ccxt.async_support.woo):
692
709
  # }
693
710
  # }
694
711
  #
695
- order = self.safe_dict(message, 'data')
696
- tradeId = self.safe_string(order, 'tradeId')
697
- if (tradeId is not None) and (tradeId != '0'):
698
- self.handle_my_trade(client, order)
699
- self.handle_order(client, order)
712
+ topic = self.safe_string(message, 'topic')
713
+ data = self.safe_value(message, 'data')
714
+ if isinstance(data, list):
715
+ # algoexecutionreportv2
716
+ for i in range(0, len(data)):
717
+ order = data[i]
718
+ tradeId = self.omit_zero(self.safe_string(data, 'tradeId'))
719
+ if tradeId is not None:
720
+ self.handle_my_trade(client, order)
721
+ self.handle_order(client, order, topic)
722
+ else:
723
+ # executionreport
724
+ tradeId = self.omit_zero(self.safe_string(data, 'tradeId'))
725
+ if tradeId is not None:
726
+ self.handle_my_trade(client, data)
727
+ self.handle_order(client, data, topic)
700
728
 
701
- def handle_order(self, client: Client, message):
702
- topic = 'executionreport'
729
+ def handle_order(self, client: Client, message, topic):
703
730
  parsed = self.parse_ws_order(message)
704
731
  symbol = self.safe_string(parsed, 'symbol')
705
732
  orderId = self.safe_string(parsed, 'id')
@@ -776,11 +803,14 @@ class woo(ccxt.async_support.woo):
776
803
  :returns dict[]: a list of `position structure <https://docs.ccxt.com/en/latest/manual.html#position-structure>`
777
804
  """
778
805
  await self.load_markets()
779
- messageHash = ''
806
+ messageHashes = []
780
807
  symbols = self.market_symbols(symbols)
781
808
  if not self.is_empty(symbols):
782
- messageHash = '::' + ','.join(symbols)
783
- messageHash = 'positions' + messageHash
809
+ for i in range(0, len(symbols)):
810
+ symbol = symbols[i]
811
+ messageHashes.append('positions::' + symbol)
812
+ else:
813
+ messageHashes.append('positions')
784
814
  url = self.urls['api']['ws']['private'] + '/' + self.uid
785
815
  client = self.client(url)
786
816
  self.set_positions_cache(client, symbols)
@@ -793,7 +823,7 @@ class woo(ccxt.async_support.woo):
793
823
  'event': 'subscribe',
794
824
  'topic': 'position',
795
825
  }
796
- newPositions = await self.watch_private(messageHash, request, params)
826
+ newPositions = await self.watch_private_multiple(messageHashes, request, params)
797
827
  if self.newUpdates:
798
828
  return newPositions
799
829
  return self.filter_by_symbols_since_limit(self.positions, symbols, since, limit, True)
@@ -862,15 +892,8 @@ class woo(ccxt.async_support.woo):
862
892
  position = self.parse_position(rawPosition, market)
863
893
  newPositions.append(position)
864
894
  cache.append(position)
865
- messageHashes = self.find_message_hashes(client, 'positions::')
866
- for i in range(0, len(messageHashes)):
867
- messageHash = messageHashes[i]
868
- parts = messageHash.split('::')
869
- symbolsString = parts[1]
870
- symbols = symbolsString.split(',')
871
- positions = self.filter_by_array(newPositions, 'symbol', symbols, False)
872
- if not self.is_empty(positions):
873
- client.resolve(positions, messageHash)
895
+ messageHash = 'positions::' + market['symbol']
896
+ client.resolve(position, messageHash)
874
897
  client.resolve(newPositions, 'positions')
875
898
 
876
899
  async def watch_balance(self, params={}) -> Balances:
@@ -978,6 +1001,7 @@ class woo(ccxt.async_support.woo):
978
1001
  'kline': self.handle_ohlcv,
979
1002
  'auth': self.handle_auth,
980
1003
  'executionreport': self.handle_order_update,
1004
+ 'algoexecutionreportv2': self.handle_order_update,
981
1005
  'trade': self.handle_trade,
982
1006
  'balance': self.handle_balance,
983
1007
  'position': self.handle_positions,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ccxt
3
- Version: 4.3.19
3
+ Version: 4.3.21
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
@@ -264,13 +264,13 @@ console.log(version, Object.keys(exchanges));
264
264
 
265
265
  All-in-one browser bundle (dependencies included), served from a CDN of your choice:
266
266
 
267
- * jsDelivr: https://cdn.jsdelivr.net/npm/ccxt@4.3.19/dist/ccxt.browser.js
268
- * unpkg: https://unpkg.com/ccxt@4.3.19/dist/ccxt.browser.js
267
+ * jsDelivr: https://cdn.jsdelivr.net/npm/ccxt@4.3.21/dist/ccxt.browser.js
268
+ * unpkg: https://unpkg.com/ccxt@4.3.21/dist/ccxt.browser.js
269
269
 
270
270
  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.
271
271
 
272
272
  ```HTML
273
- <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/ccxt@4.3.19/dist/ccxt.browser.js"></script>
273
+ <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/ccxt@4.3.21/dist/ccxt.browser.js"></script>
274
274
  ```
275
275
 
276
276
  Creates a global `ccxt` object: