ccxt 4.3.36__py2.py3-none-any.whl → 4.3.37__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.
ccxt/__init__.py CHANGED
@@ -22,7 +22,7 @@
22
22
 
23
23
  # ----------------------------------------------------------------------------
24
24
 
25
- __version__ = '4.3.36'
25
+ __version__ = '4.3.37'
26
26
 
27
27
  # ----------------------------------------------------------------------------
28
28
 
ccxt/abstract/kraken.py CHANGED
@@ -6,13 +6,13 @@ class ImplicitAPI:
6
6
  zendesk_get_201893608 = zendeskGet201893608 = Entry('201893608', 'zendesk', 'GET', {})
7
7
  public_get_assets = publicGetAssets = Entry('Assets', 'public', 'GET', {'cost': 1})
8
8
  public_get_assetpairs = publicGetAssetPairs = Entry('AssetPairs', 'public', 'GET', {'cost': 1})
9
- public_get_depth = publicGetDepth = Entry('Depth', 'public', 'GET', {'cost': 1})
10
- public_get_ohlc = publicGetOHLC = Entry('OHLC', 'public', 'GET', {'cost': 1})
9
+ public_get_depth = publicGetDepth = Entry('Depth', 'public', 'GET', {'cost': 1.2})
10
+ public_get_ohlc = publicGetOHLC = Entry('OHLC', 'public', 'GET', {'cost': 1.2})
11
11
  public_get_spread = publicGetSpread = Entry('Spread', 'public', 'GET', {'cost': 1})
12
12
  public_get_systemstatus = publicGetSystemStatus = Entry('SystemStatus', 'public', 'GET', {'cost': 1})
13
13
  public_get_ticker = publicGetTicker = Entry('Ticker', 'public', 'GET', {'cost': 1})
14
14
  public_get_time = publicGetTime = Entry('Time', 'public', 'GET', {'cost': 1})
15
- public_get_trades = publicGetTrades = Entry('Trades', 'public', 'GET', {'cost': 1})
15
+ public_get_trades = publicGetTrades = Entry('Trades', 'public', 'GET', {'cost': 1.2})
16
16
  private_post_addorder = privatePostAddOrder = Entry('AddOrder', 'private', 'POST', {'cost': 0})
17
17
  private_post_addorderbatch = privatePostAddOrderBatch = Entry('AddOrderBatch', 'private', 'POST', {'cost': 0})
18
18
  private_post_addexport = privatePostAddExport = Entry('AddExport', 'private', 'POST', {'cost': 3})
@@ -4,7 +4,7 @@
4
4
 
5
5
  # -----------------------------------------------------------------------------
6
6
 
7
- __version__ = '4.3.36'
7
+ __version__ = '4.3.37'
8
8
 
9
9
  # -----------------------------------------------------------------------------
10
10
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  # -----------------------------------------------------------------------------
4
4
 
5
- __version__ = '4.3.36'
5
+ __version__ = '4.3.37'
6
6
 
7
7
  # -----------------------------------------------------------------------------
8
8
 
@@ -2570,7 +2570,9 @@ class bingx(Exchange, ImplicitAPI):
2570
2570
  #
2571
2571
  else:
2572
2572
  raise BadRequest(self.id + ' cancelAllOrders is only supported for spot and swap markets.')
2573
- return response
2573
+ data = self.safe_dict(response, 'data', {})
2574
+ orders = self.safe_list_2(data, 'success', 'orders', [])
2575
+ return self.parse_orders(orders)
2574
2576
 
2575
2577
  async def cancel_orders(self, ids: List[str], symbol: Str = None, params={}):
2576
2578
  """
@@ -2606,42 +2608,70 @@ class bingx(Exchange, ImplicitAPI):
2606
2608
  spotReqKey = 'clientOrderIDs' if areClientOrderIds else 'orderIds'
2607
2609
  request[spotReqKey] = ','.join(parsedIds)
2608
2610
  response = await self.spotV1PrivatePostTradeCancelOrders(self.extend(request, params))
2611
+ #
2612
+ # {
2613
+ # "code": 0,
2614
+ # "msg": "",
2615
+ # "debugMsg": "",
2616
+ # "data": {
2617
+ # "orders": [
2618
+ # {
2619
+ # "symbol": "SOL-USDT",
2620
+ # "orderId": 1795970045910614016,
2621
+ # "transactTime": 1717027601111,
2622
+ # "price": "180.25",
2623
+ # "stopPrice": "0",
2624
+ # "origQty": "0.03",
2625
+ # "executedQty": "0",
2626
+ # "cummulativeQuoteQty": "0",
2627
+ # "status": "CANCELED",
2628
+ # "type": "LIMIT",
2629
+ # "side": "SELL",
2630
+ # "clientOrderID": ""
2631
+ # },
2632
+ # ...
2633
+ # ]
2634
+ # }
2635
+ # }
2636
+ #
2609
2637
  else:
2610
2638
  if areClientOrderIds:
2611
2639
  request['clientOrderIDList'] = self.json(parsedIds)
2612
2640
  else:
2613
2641
  request['orderIdList'] = parsedIds
2614
2642
  response = await self.swapV2PrivateDeleteTradeBatchOrders(self.extend(request, params))
2615
- #
2616
- # {
2617
- # "code": 0,
2618
- # "msg": "",
2619
- # "data": {
2620
- # "success": [
2621
- # {
2622
- # "symbol": "LINK-USDT",
2623
- # "orderId": 1597783850786750464,
2624
- # "side": "BUY",
2625
- # "positionSide": "LONG",
2626
- # "type": "TRIGGER_MARKET",
2627
- # "origQty": "5.0",
2628
- # "price": "5.5710",
2629
- # "executedQty": "0.0",
2630
- # "avgPrice": "0.0000",
2631
- # "cumQuote": "0",
2632
- # "stopPrice": "5.0000",
2633
- # "profit": "0.0000",
2634
- # "commission": "0.000000",
2635
- # "status": "CANCELLED",
2636
- # "time": 1669776330000,
2637
- # "updateTime": 1672370837000
2638
- # }
2639
- # ],
2640
- # "failed": null
2641
- # }
2642
- # }
2643
- #
2644
- return response
2643
+ #
2644
+ # {
2645
+ # "code": 0,
2646
+ # "msg": "",
2647
+ # "data": {
2648
+ # "success": [
2649
+ # {
2650
+ # "symbol": "LINK-USDT",
2651
+ # "orderId": 1597783850786750464,
2652
+ # "side": "BUY",
2653
+ # "positionSide": "LONG",
2654
+ # "type": "TRIGGER_MARKET",
2655
+ # "origQty": "5.0",
2656
+ # "price": "5.5710",
2657
+ # "executedQty": "0.0",
2658
+ # "avgPrice": "0.0000",
2659
+ # "cumQuote": "0",
2660
+ # "stopPrice": "5.0000",
2661
+ # "profit": "0.0000",
2662
+ # "commission": "0.000000",
2663
+ # "status": "CANCELLED",
2664
+ # "time": 1669776330000,
2665
+ # "updateTime": 1672370837000
2666
+ # }
2667
+ # ],
2668
+ # "failed": null
2669
+ # }
2670
+ # }
2671
+ #
2672
+ data = self.safe_dict(response, 'data', {})
2673
+ success = self.safe_list_2(data, 'success', 'orders', [])
2674
+ return self.parse_orders(success)
2645
2675
 
2646
2676
  async def cancel_all_orders_after(self, timeout: Int, params={}):
2647
2677
  """
@@ -669,8 +669,31 @@ class bitbank(Exchange, ImplicitAPI):
669
669
  'pair': market['id'],
670
670
  }
671
671
  response = await self.privatePostUserSpotCancelOrder(self.extend(request, params))
672
+ #
673
+ # {
674
+ # "success": 1,
675
+ # "data": {
676
+ # "order_id": 0,
677
+ # "pair": "string",
678
+ # "side": "string",
679
+ # "type": "string",
680
+ # "start_amount": "string",
681
+ # "remaining_amount": "string",
682
+ # "executed_amount": "string",
683
+ # "price": "string",
684
+ # "post_only": False,
685
+ # "average_price": "string",
686
+ # "ordered_at": 0,
687
+ # "expire_at": 0,
688
+ # "canceled_at": 0,
689
+ # "triggered_at": 0,
690
+ # "trigger_price": "string",
691
+ # "status": "string"
692
+ # }
693
+ # }
694
+ #
672
695
  data = self.safe_value(response, 'data')
673
- return data
696
+ return self.parse_order(data)
674
697
 
675
698
  async def fetch_order(self, id: str, symbol: Str = None, params={}):
676
699
  """
@@ -687,6 +710,28 @@ class bitbank(Exchange, ImplicitAPI):
687
710
  'pair': market['id'],
688
711
  }
689
712
  response = await self.privateGetUserSpotOrder(self.extend(request, params))
713
+ #
714
+ # {
715
+ # "success": 1,
716
+ # "data": {
717
+ # "order_id": 0,
718
+ # "pair": "string",
719
+ # "side": "string",
720
+ # "type": "string",
721
+ # "start_amount": "string",
722
+ # "remaining_amount": "string",
723
+ # "executed_amount": "string",
724
+ # "price": "string",
725
+ # "post_only": False,
726
+ # "average_price": "string",
727
+ # "ordered_at": 0,
728
+ # "expire_at": 0,
729
+ # "triggered_at": 0,
730
+ # "triger_price": "string",
731
+ # "status": "string"
732
+ # }
733
+ # }
734
+ #
690
735
  data = self.safe_dict(response, 'data')
691
736
  return self.parse_order(data, market)
692
737
 
@@ -1180,9 +1180,9 @@ class bitmart(Exchange, ImplicitAPI):
1180
1180
  market = self.safe_market(marketId, market)
1181
1181
  symbol = market['symbol']
1182
1182
  last = self.safe_string_2(ticker, 'close_24h', 'last_price')
1183
- percentage = Precise.string_abs(self.safe_string(ticker, 'price_change_percent_24h'))
1183
+ percentage = self.safe_string(ticker, 'price_change_percent_24h')
1184
1184
  if percentage is None:
1185
- percentage = Precise.string_abs(Precise.string_mul(self.safe_string(ticker, 'fluctuation'), '100'))
1185
+ percentage = Precise.string_mul(self.safe_string(ticker, 'fluctuation'), '100')
1186
1186
  baseVolume = self.safe_string(ticker, 'base_volume_24h')
1187
1187
  quoteVolume = self.safe_string(ticker, 'quote_volume_24h')
1188
1188
  if quoteVolume is None:
ccxt/async_support/htx.py CHANGED
@@ -57,6 +57,8 @@ class htx(Exchange, ImplicitAPI):
57
57
  'cancelAllOrdersAfter': True,
58
58
  'cancelOrder': True,
59
59
  'cancelOrders': True,
60
+ 'closeAllPositions': False,
61
+ 'closePosition': True,
60
62
  'createDepositAddress': None,
61
63
  'createMarketBuyOrderWithCost': True,
62
64
  'createMarketOrderWithCost': False,
@@ -5004,7 +5006,7 @@ class htx(Exchange, ImplicitAPI):
5004
5006
  :param float [params.stopLossPrice]: *contract only* the price a stop-loss order is triggered at
5005
5007
  :param float [params.takeProfitPrice]: *contract only* the price a take-profit order is triggered at
5006
5008
  :param str [params.operator]: *spot and margin only* gte or lte, trigger price condition
5007
- :param str [params.offset]: *contract only* 'open', 'close', or 'both', required in hedge mode
5009
+ :param str [params.offset]: *contract only* 'both'(linear only), 'open', or 'close', required in hedge mode and for inverse markets
5008
5010
  :param bool [params.postOnly]: *contract only* True or False
5009
5011
  :param int [params.leverRate]: *contract only* required for all contract orders except tpsl, leverage greater than 20x requires prior approval of high-leverage agreement
5010
5012
  :param str [params.timeInForce]: supports 'IOC' and 'FOK'
@@ -5054,6 +5056,9 @@ class htx(Exchange, ImplicitAPI):
5054
5056
  else:
5055
5057
  response = await self.contractPrivatePostLinearSwapApiV1SwapCrossOrder(contractRequest)
5056
5058
  elif market['inverse']:
5059
+ offset = self.safe_string(params, 'offset')
5060
+ if offset is None:
5061
+ raise ArgumentsRequired(self.id + ' createOrder() requires an extra parameter params["offset"] to be set to "open" or "close" when placing orders in inverse markets')
5057
5062
  if market['swap']:
5058
5063
  if isStop:
5059
5064
  response = await self.contractPrivatePostSwapApiV1SwapTriggerOrder(contractRequest)
@@ -6935,14 +6940,19 @@ class htx(Exchange, ImplicitAPI):
6935
6940
  fetch all open positions
6936
6941
  :param str[]|None symbols: list of unified market symbols
6937
6942
  :param dict [params]: extra parameters specific to the exchange API endpoint
6943
+ :param str [params.subType]: 'linear' or 'inverse'
6944
+ :param str [params.type]: *inverse only* 'future', or 'swap'
6945
+ :param str [params.marginMode]: *linear only* 'cross' or 'isolated'
6938
6946
  :returns dict[]: a list of `position structure <https://docs.ccxt.com/#/?id=position-structure>`
6939
6947
  """
6940
6948
  await self.load_markets()
6941
6949
  symbols = self.market_symbols(symbols)
6942
6950
  market = None
6943
6951
  if symbols is not None:
6944
- first = self.safe_string(symbols, 0)
6945
- market = self.market(first)
6952
+ symbolsLength = len(symbols)
6953
+ if symbolsLength > 0:
6954
+ first = self.safe_string(symbols, 0)
6955
+ market = self.market(first)
6946
6956
  marginMode = None
6947
6957
  marginMode, params = self.handle_margin_mode_and_params('fetchPositions', params, 'cross')
6948
6958
  subType = None
@@ -8386,6 +8396,57 @@ class htx(Exchange, ImplicitAPI):
8386
8396
  'datetime': self.iso8601(timestamp),
8387
8397
  })
8388
8398
 
8399
+ async def close_position(self, symbol: str, side: OrderSide = None, params={}) -> Order:
8400
+ """
8401
+ closes open positions for a contract market, requires 'amount' in params, unlike other exchanges
8402
+ :see: https://huobiapi.github.io/docs/usdt_swap/v1/en/#isolated-place-lightning-close-order # USDT-M(isolated)
8403
+ :see: https://huobiapi.github.io/docs/usdt_swap/v1/en/#cross-place-lightning-close-position # USDT-M(cross)
8404
+ :see: https://huobiapi.github.io/docs/coin_margined_swap/v1/en/#place-lightning-close-order # Coin-M swap
8405
+ :see: https://huobiapi.github.io/docs/dm/v1/en/#place-flash-close-order # Coin-M futures
8406
+ :param str symbol: unified CCXT market symbol
8407
+ :param str side: 'buy' or 'sell', the side of the closing order, opposite side side
8408
+ :param dict [params]: extra parameters specific to the okx api endpoint
8409
+ :param str [params.clientOrderId]: client needs to provide unique API and have to maintain the API themselves afterwards. [1, 9223372036854775807]
8410
+ :param dict [params.marginMode]: 'cross' or 'isolated', required for linear markets
8411
+ *
8412
+ * EXCHANGE SPECIFIC PARAMETERS
8413
+ :param number [params.amount]: order quantity
8414
+ :param str [params.order_price_type]: 'lightning' by default, 'lightning_fok': lightning fok type, 'lightning_ioc': lightning ioc type 'market' by default, 'market': market order type, 'lightning_fok': lightning
8415
+ :returns dict: `an order structure <https://docs.ccxt.com/#/?id=position-structure>`
8416
+ """
8417
+ await self.load_markets()
8418
+ market = self.market(symbol)
8419
+ clientOrderId = self.safe_string(params, 'clientOrderId')
8420
+ if not market['contract']:
8421
+ raise BadRequest(self.id + ' closePosition() symbol supports contract markets only')
8422
+ self.check_required_argument('closePosition', side, 'side')
8423
+ request: dict = {
8424
+ 'contract_code': market['id'],
8425
+ 'direction': side,
8426
+ }
8427
+ if clientOrderId is not None:
8428
+ request['client_order_id'] = clientOrderId
8429
+ if market['inverse']:
8430
+ amount = self.safe_string_2(params, 'volume', 'amount')
8431
+ if amount is None:
8432
+ raise ArgumentsRequired(self.id + ' closePosition() requires an extra argument params["amount"] for inverse markets')
8433
+ request['volume'] = self.amount_to_precision(symbol, amount)
8434
+ params = self.omit(params, ['clientOrderId', 'volume', 'amount'])
8435
+ response = None
8436
+ if market['inverse']: # Coin-M
8437
+ if market['swap']:
8438
+ response = await self.contractPrivatePostSwapApiV1SwapLightningClosePosition(self.extend(request, params))
8439
+ else: # future
8440
+ response = await self.contractPrivatePostApiV1LightningClosePosition(self.extend(request, params))
8441
+ else: # USDT-M
8442
+ marginMode = None
8443
+ marginMode, params = self.handle_margin_mode_and_params('closePosition', params, 'cross')
8444
+ if marginMode == 'cross':
8445
+ response = await self.contractPrivatePostLinearSwapApiV1SwapCrossLightningClosePosition(self.extend(request, params))
8446
+ else: # isolated
8447
+ response = await self.contractPrivatePostLinearSwapApiV1SwapLightningClosePosition(self.extend(request, params))
8448
+ return self.parse_order(response, market)
8449
+
8389
8450
  async def set_position_mode(self, hedged: bool, symbol: Str = None, params={}):
8390
8451
  """
8391
8452
  set hedged to True or False
@@ -179,13 +179,13 @@ class kraken(Exchange, ImplicitAPI):
179
179
  # rate-limits explained in comment in the top of self file
180
180
  'Assets': 1,
181
181
  'AssetPairs': 1,
182
- 'Depth': 1,
183
- 'OHLC': 1,
182
+ 'Depth': 1.2,
183
+ 'OHLC': 1.2, # 1.2 because 1 triggers too many requests immediately
184
184
  'Spread': 1,
185
185
  'SystemStatus': 1,
186
186
  'Ticker': 1,
187
187
  'Time': 1,
188
- 'Trades': 1,
188
+ 'Trades': 1.2,
189
189
  },
190
190
  },
191
191
  'private': {
@@ -761,8 +761,8 @@ class kraken(Exchange, ImplicitAPI):
761
761
  return {
762
762
  'info': response,
763
763
  'symbol': market['symbol'],
764
- 'maker': self.safe_number(symbolMakerFee, 'fee'),
765
- 'taker': self.safe_number(symbolTakerFee, 'fee'),
764
+ 'maker': self.parse_number(Precise.string_div(self.safe_string(symbolMakerFee, 'fee'), '100')),
765
+ 'taker': self.parse_number(Precise.string_div(self.safe_string(symbolTakerFee, 'fee'), '100')),
766
766
  'percentage': True,
767
767
  'tierBased': True,
768
768
  }
@@ -2138,8 +2138,10 @@ class woofipro(Exchange, ImplicitAPI):
2138
2138
 
2139
2139
  def sign_hash(self, hash, privateKey):
2140
2140
  signature = self.ecdsa(hash[-64:], privateKey[-64:], 'secp256k1', None)
2141
+ r = signature['r']
2142
+ s = signature['s']
2141
2143
  v = self.int_to_base16(self.sum(27, signature['v']))
2142
- return '0x' + signature['r'].rjust(64, '0') + signature['s'].rjust(64, '0') + v
2144
+ return '0x' + r.rjust(64, '0') + s.rjust(64, '0') + v
2143
2145
 
2144
2146
  def sign_message(self, message, privateKey):
2145
2147
  return self.sign_hash(self.hash_message(message), privateKey[-64:])
ccxt/base/exchange.py CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  # -----------------------------------------------------------------------------
6
6
 
7
- __version__ = '4.3.36'
7
+ __version__ = '4.3.37'
8
8
 
9
9
  # -----------------------------------------------------------------------------
10
10
 
ccxt/bingx.py CHANGED
@@ -2569,7 +2569,9 @@ class bingx(Exchange, ImplicitAPI):
2569
2569
  #
2570
2570
  else:
2571
2571
  raise BadRequest(self.id + ' cancelAllOrders is only supported for spot and swap markets.')
2572
- return response
2572
+ data = self.safe_dict(response, 'data', {})
2573
+ orders = self.safe_list_2(data, 'success', 'orders', [])
2574
+ return self.parse_orders(orders)
2573
2575
 
2574
2576
  def cancel_orders(self, ids: List[str], symbol: Str = None, params={}):
2575
2577
  """
@@ -2605,42 +2607,70 @@ class bingx(Exchange, ImplicitAPI):
2605
2607
  spotReqKey = 'clientOrderIDs' if areClientOrderIds else 'orderIds'
2606
2608
  request[spotReqKey] = ','.join(parsedIds)
2607
2609
  response = self.spotV1PrivatePostTradeCancelOrders(self.extend(request, params))
2610
+ #
2611
+ # {
2612
+ # "code": 0,
2613
+ # "msg": "",
2614
+ # "debugMsg": "",
2615
+ # "data": {
2616
+ # "orders": [
2617
+ # {
2618
+ # "symbol": "SOL-USDT",
2619
+ # "orderId": 1795970045910614016,
2620
+ # "transactTime": 1717027601111,
2621
+ # "price": "180.25",
2622
+ # "stopPrice": "0",
2623
+ # "origQty": "0.03",
2624
+ # "executedQty": "0",
2625
+ # "cummulativeQuoteQty": "0",
2626
+ # "status": "CANCELED",
2627
+ # "type": "LIMIT",
2628
+ # "side": "SELL",
2629
+ # "clientOrderID": ""
2630
+ # },
2631
+ # ...
2632
+ # ]
2633
+ # }
2634
+ # }
2635
+ #
2608
2636
  else:
2609
2637
  if areClientOrderIds:
2610
2638
  request['clientOrderIDList'] = self.json(parsedIds)
2611
2639
  else:
2612
2640
  request['orderIdList'] = parsedIds
2613
2641
  response = self.swapV2PrivateDeleteTradeBatchOrders(self.extend(request, params))
2614
- #
2615
- # {
2616
- # "code": 0,
2617
- # "msg": "",
2618
- # "data": {
2619
- # "success": [
2620
- # {
2621
- # "symbol": "LINK-USDT",
2622
- # "orderId": 1597783850786750464,
2623
- # "side": "BUY",
2624
- # "positionSide": "LONG",
2625
- # "type": "TRIGGER_MARKET",
2626
- # "origQty": "5.0",
2627
- # "price": "5.5710",
2628
- # "executedQty": "0.0",
2629
- # "avgPrice": "0.0000",
2630
- # "cumQuote": "0",
2631
- # "stopPrice": "5.0000",
2632
- # "profit": "0.0000",
2633
- # "commission": "0.000000",
2634
- # "status": "CANCELLED",
2635
- # "time": 1669776330000,
2636
- # "updateTime": 1672370837000
2637
- # }
2638
- # ],
2639
- # "failed": null
2640
- # }
2641
- # }
2642
- #
2643
- return response
2642
+ #
2643
+ # {
2644
+ # "code": 0,
2645
+ # "msg": "",
2646
+ # "data": {
2647
+ # "success": [
2648
+ # {
2649
+ # "symbol": "LINK-USDT",
2650
+ # "orderId": 1597783850786750464,
2651
+ # "side": "BUY",
2652
+ # "positionSide": "LONG",
2653
+ # "type": "TRIGGER_MARKET",
2654
+ # "origQty": "5.0",
2655
+ # "price": "5.5710",
2656
+ # "executedQty": "0.0",
2657
+ # "avgPrice": "0.0000",
2658
+ # "cumQuote": "0",
2659
+ # "stopPrice": "5.0000",
2660
+ # "profit": "0.0000",
2661
+ # "commission": "0.000000",
2662
+ # "status": "CANCELLED",
2663
+ # "time": 1669776330000,
2664
+ # "updateTime": 1672370837000
2665
+ # }
2666
+ # ],
2667
+ # "failed": null
2668
+ # }
2669
+ # }
2670
+ #
2671
+ data = self.safe_dict(response, 'data', {})
2672
+ success = self.safe_list_2(data, 'success', 'orders', [])
2673
+ return self.parse_orders(success)
2644
2674
 
2645
2675
  def cancel_all_orders_after(self, timeout: Int, params={}):
2646
2676
  """
ccxt/bitbank.py CHANGED
@@ -669,8 +669,31 @@ class bitbank(Exchange, ImplicitAPI):
669
669
  'pair': market['id'],
670
670
  }
671
671
  response = self.privatePostUserSpotCancelOrder(self.extend(request, params))
672
+ #
673
+ # {
674
+ # "success": 1,
675
+ # "data": {
676
+ # "order_id": 0,
677
+ # "pair": "string",
678
+ # "side": "string",
679
+ # "type": "string",
680
+ # "start_amount": "string",
681
+ # "remaining_amount": "string",
682
+ # "executed_amount": "string",
683
+ # "price": "string",
684
+ # "post_only": False,
685
+ # "average_price": "string",
686
+ # "ordered_at": 0,
687
+ # "expire_at": 0,
688
+ # "canceled_at": 0,
689
+ # "triggered_at": 0,
690
+ # "trigger_price": "string",
691
+ # "status": "string"
692
+ # }
693
+ # }
694
+ #
672
695
  data = self.safe_value(response, 'data')
673
- return data
696
+ return self.parse_order(data)
674
697
 
675
698
  def fetch_order(self, id: str, symbol: Str = None, params={}):
676
699
  """
@@ -687,6 +710,28 @@ class bitbank(Exchange, ImplicitAPI):
687
710
  'pair': market['id'],
688
711
  }
689
712
  response = self.privateGetUserSpotOrder(self.extend(request, params))
713
+ #
714
+ # {
715
+ # "success": 1,
716
+ # "data": {
717
+ # "order_id": 0,
718
+ # "pair": "string",
719
+ # "side": "string",
720
+ # "type": "string",
721
+ # "start_amount": "string",
722
+ # "remaining_amount": "string",
723
+ # "executed_amount": "string",
724
+ # "price": "string",
725
+ # "post_only": False,
726
+ # "average_price": "string",
727
+ # "ordered_at": 0,
728
+ # "expire_at": 0,
729
+ # "triggered_at": 0,
730
+ # "triger_price": "string",
731
+ # "status": "string"
732
+ # }
733
+ # }
734
+ #
690
735
  data = self.safe_dict(response, 'data')
691
736
  return self.parse_order(data, market)
692
737
 
ccxt/bitmart.py CHANGED
@@ -1180,9 +1180,9 @@ class bitmart(Exchange, ImplicitAPI):
1180
1180
  market = self.safe_market(marketId, market)
1181
1181
  symbol = market['symbol']
1182
1182
  last = self.safe_string_2(ticker, 'close_24h', 'last_price')
1183
- percentage = Precise.string_abs(self.safe_string(ticker, 'price_change_percent_24h'))
1183
+ percentage = self.safe_string(ticker, 'price_change_percent_24h')
1184
1184
  if percentage is None:
1185
- percentage = Precise.string_abs(Precise.string_mul(self.safe_string(ticker, 'fluctuation'), '100'))
1185
+ percentage = Precise.string_mul(self.safe_string(ticker, 'fluctuation'), '100')
1186
1186
  baseVolume = self.safe_string(ticker, 'base_volume_24h')
1187
1187
  quoteVolume = self.safe_string(ticker, 'quote_volume_24h')
1188
1188
  if quoteVolume is None:
ccxt/htx.py CHANGED
@@ -56,6 +56,8 @@ class htx(Exchange, ImplicitAPI):
56
56
  'cancelAllOrdersAfter': True,
57
57
  'cancelOrder': True,
58
58
  'cancelOrders': True,
59
+ 'closeAllPositions': False,
60
+ 'closePosition': True,
59
61
  'createDepositAddress': None,
60
62
  'createMarketBuyOrderWithCost': True,
61
63
  'createMarketOrderWithCost': False,
@@ -5003,7 +5005,7 @@ class htx(Exchange, ImplicitAPI):
5003
5005
  :param float [params.stopLossPrice]: *contract only* the price a stop-loss order is triggered at
5004
5006
  :param float [params.takeProfitPrice]: *contract only* the price a take-profit order is triggered at
5005
5007
  :param str [params.operator]: *spot and margin only* gte or lte, trigger price condition
5006
- :param str [params.offset]: *contract only* 'open', 'close', or 'both', required in hedge mode
5008
+ :param str [params.offset]: *contract only* 'both'(linear only), 'open', or 'close', required in hedge mode and for inverse markets
5007
5009
  :param bool [params.postOnly]: *contract only* True or False
5008
5010
  :param int [params.leverRate]: *contract only* required for all contract orders except tpsl, leverage greater than 20x requires prior approval of high-leverage agreement
5009
5011
  :param str [params.timeInForce]: supports 'IOC' and 'FOK'
@@ -5053,6 +5055,9 @@ class htx(Exchange, ImplicitAPI):
5053
5055
  else:
5054
5056
  response = self.contractPrivatePostLinearSwapApiV1SwapCrossOrder(contractRequest)
5055
5057
  elif market['inverse']:
5058
+ offset = self.safe_string(params, 'offset')
5059
+ if offset is None:
5060
+ raise ArgumentsRequired(self.id + ' createOrder() requires an extra parameter params["offset"] to be set to "open" or "close" when placing orders in inverse markets')
5056
5061
  if market['swap']:
5057
5062
  if isStop:
5058
5063
  response = self.contractPrivatePostSwapApiV1SwapTriggerOrder(contractRequest)
@@ -6934,14 +6939,19 @@ class htx(Exchange, ImplicitAPI):
6934
6939
  fetch all open positions
6935
6940
  :param str[]|None symbols: list of unified market symbols
6936
6941
  :param dict [params]: extra parameters specific to the exchange API endpoint
6942
+ :param str [params.subType]: 'linear' or 'inverse'
6943
+ :param str [params.type]: *inverse only* 'future', or 'swap'
6944
+ :param str [params.marginMode]: *linear only* 'cross' or 'isolated'
6937
6945
  :returns dict[]: a list of `position structure <https://docs.ccxt.com/#/?id=position-structure>`
6938
6946
  """
6939
6947
  self.load_markets()
6940
6948
  symbols = self.market_symbols(symbols)
6941
6949
  market = None
6942
6950
  if symbols is not None:
6943
- first = self.safe_string(symbols, 0)
6944
- market = self.market(first)
6951
+ symbolsLength = len(symbols)
6952
+ if symbolsLength > 0:
6953
+ first = self.safe_string(symbols, 0)
6954
+ market = self.market(first)
6945
6955
  marginMode = None
6946
6956
  marginMode, params = self.handle_margin_mode_and_params('fetchPositions', params, 'cross')
6947
6957
  subType = None
@@ -8385,6 +8395,57 @@ class htx(Exchange, ImplicitAPI):
8385
8395
  'datetime': self.iso8601(timestamp),
8386
8396
  })
8387
8397
 
8398
+ def close_position(self, symbol: str, side: OrderSide = None, params={}) -> Order:
8399
+ """
8400
+ closes open positions for a contract market, requires 'amount' in params, unlike other exchanges
8401
+ :see: https://huobiapi.github.io/docs/usdt_swap/v1/en/#isolated-place-lightning-close-order # USDT-M(isolated)
8402
+ :see: https://huobiapi.github.io/docs/usdt_swap/v1/en/#cross-place-lightning-close-position # USDT-M(cross)
8403
+ :see: https://huobiapi.github.io/docs/coin_margined_swap/v1/en/#place-lightning-close-order # Coin-M swap
8404
+ :see: https://huobiapi.github.io/docs/dm/v1/en/#place-flash-close-order # Coin-M futures
8405
+ :param str symbol: unified CCXT market symbol
8406
+ :param str side: 'buy' or 'sell', the side of the closing order, opposite side side
8407
+ :param dict [params]: extra parameters specific to the okx api endpoint
8408
+ :param str [params.clientOrderId]: client needs to provide unique API and have to maintain the API themselves afterwards. [1, 9223372036854775807]
8409
+ :param dict [params.marginMode]: 'cross' or 'isolated', required for linear markets
8410
+ *
8411
+ * EXCHANGE SPECIFIC PARAMETERS
8412
+ :param number [params.amount]: order quantity
8413
+ :param str [params.order_price_type]: 'lightning' by default, 'lightning_fok': lightning fok type, 'lightning_ioc': lightning ioc type 'market' by default, 'market': market order type, 'lightning_fok': lightning
8414
+ :returns dict: `an order structure <https://docs.ccxt.com/#/?id=position-structure>`
8415
+ """
8416
+ self.load_markets()
8417
+ market = self.market(symbol)
8418
+ clientOrderId = self.safe_string(params, 'clientOrderId')
8419
+ if not market['contract']:
8420
+ raise BadRequest(self.id + ' closePosition() symbol supports contract markets only')
8421
+ self.check_required_argument('closePosition', side, 'side')
8422
+ request: dict = {
8423
+ 'contract_code': market['id'],
8424
+ 'direction': side,
8425
+ }
8426
+ if clientOrderId is not None:
8427
+ request['client_order_id'] = clientOrderId
8428
+ if market['inverse']:
8429
+ amount = self.safe_string_2(params, 'volume', 'amount')
8430
+ if amount is None:
8431
+ raise ArgumentsRequired(self.id + ' closePosition() requires an extra argument params["amount"] for inverse markets')
8432
+ request['volume'] = self.amount_to_precision(symbol, amount)
8433
+ params = self.omit(params, ['clientOrderId', 'volume', 'amount'])
8434
+ response = None
8435
+ if market['inverse']: # Coin-M
8436
+ if market['swap']:
8437
+ response = self.contractPrivatePostSwapApiV1SwapLightningClosePosition(self.extend(request, params))
8438
+ else: # future
8439
+ response = self.contractPrivatePostApiV1LightningClosePosition(self.extend(request, params))
8440
+ else: # USDT-M
8441
+ marginMode = None
8442
+ marginMode, params = self.handle_margin_mode_and_params('closePosition', params, 'cross')
8443
+ if marginMode == 'cross':
8444
+ response = self.contractPrivatePostLinearSwapApiV1SwapCrossLightningClosePosition(self.extend(request, params))
8445
+ else: # isolated
8446
+ response = self.contractPrivatePostLinearSwapApiV1SwapLightningClosePosition(self.extend(request, params))
8447
+ return self.parse_order(response, market)
8448
+
8388
8449
  def set_position_mode(self, hedged: bool, symbol: Str = None, params={}):
8389
8450
  """
8390
8451
  set hedged to True or False
ccxt/kraken.py CHANGED
@@ -179,13 +179,13 @@ class kraken(Exchange, ImplicitAPI):
179
179
  # rate-limits explained in comment in the top of self file
180
180
  'Assets': 1,
181
181
  'AssetPairs': 1,
182
- 'Depth': 1,
183
- 'OHLC': 1,
182
+ 'Depth': 1.2,
183
+ 'OHLC': 1.2, # 1.2 because 1 triggers too many requests immediately
184
184
  'Spread': 1,
185
185
  'SystemStatus': 1,
186
186
  'Ticker': 1,
187
187
  'Time': 1,
188
- 'Trades': 1,
188
+ 'Trades': 1.2,
189
189
  },
190
190
  },
191
191
  'private': {
@@ -761,8 +761,8 @@ class kraken(Exchange, ImplicitAPI):
761
761
  return {
762
762
  'info': response,
763
763
  'symbol': market['symbol'],
764
- 'maker': self.safe_number(symbolMakerFee, 'fee'),
765
- 'taker': self.safe_number(symbolTakerFee, 'fee'),
764
+ 'maker': self.parse_number(Precise.string_div(self.safe_string(symbolMakerFee, 'fee'), '100')),
765
+ 'taker': self.parse_number(Precise.string_div(self.safe_string(symbolTakerFee, 'fee'), '100')),
766
766
  'percentage': True,
767
767
  'tierBased': True,
768
768
  }
ccxt/pro/__init__.py CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  # ----------------------------------------------------------------------------
6
6
 
7
- __version__ = '4.3.36'
7
+ __version__ = '4.3.37'
8
8
 
9
9
  # ----------------------------------------------------------------------------
10
10
 
ccxt/woofipro.py CHANGED
@@ -2138,8 +2138,10 @@ class woofipro(Exchange, ImplicitAPI):
2138
2138
 
2139
2139
  def sign_hash(self, hash, privateKey):
2140
2140
  signature = self.ecdsa(hash[-64:], privateKey[-64:], 'secp256k1', None)
2141
+ r = signature['r']
2142
+ s = signature['s']
2141
2143
  v = self.int_to_base16(self.sum(27, signature['v']))
2142
- return '0x' + signature['r'].rjust(64, '0') + signature['s'].rjust(64, '0') + v
2144
+ return '0x' + r.rjust(64, '0') + s.rjust(64, '0') + v
2143
2145
 
2144
2146
  def sign_message(self, message, privateKey):
2145
2147
  return self.sign_hash(self.hash_message(message), privateKey[-64:])
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ccxt
3
- Version: 4.3.36
3
+ Version: 4.3.37
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.36/dist/ccxt.browser.min.js
268
- * unpkg: https://unpkg.com/ccxt@4.3.36/dist/ccxt.browser.min.js
267
+ * jsDelivr: https://cdn.jsdelivr.net/npm/ccxt@4.3.37/dist/ccxt.browser.min.js
268
+ * unpkg: https://unpkg.com/ccxt@4.3.37/dist/ccxt.browser.min.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.36/dist/ccxt.browser.min.js"></script>
273
+ <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/ccxt@4.3.37/dist/ccxt.browser.min.js"></script>
274
274
  ```
275
275
 
276
276
  Creates a global `ccxt` object:
@@ -1,4 +1,4 @@
1
- ccxt/__init__.py,sha256=CYsOzikJcAjJK5He1XzWN44IS_gV-IfqarntOqSltjQ,15950
1
+ ccxt/__init__.py,sha256=EBsnoDGGwpC7aree5X4kq0cJ4jylAykAHCR9no7JrXc,15950
2
2
  ccxt/ace.py,sha256=6x4vkcS2lGSkAQuzS-AAgYJLPDNNfNo9NMIdAoXzs18,41776
3
3
  ccxt/alpaca.py,sha256=EZ7uF3XI8EXXIsCZ-UVpruBXS96Kps6WOOukmdcgCn0,47326
4
4
  ccxt/ascendex.py,sha256=rUUU3n4j8QrMrJCk4pVwVastIYzS3eDTUAL9R2ePErk,151832
@@ -8,9 +8,9 @@ ccxt/binance.py,sha256=vCH6EpFYY1gtDHQrf7In-gYXehhFqWTSfoXShAGbUSE,618778
8
8
  ccxt/binancecoinm.py,sha256=pncdw6Xw2X1Po-vEvAB4nL37scoS_axGAVxetPy1YQs,1645
9
9
  ccxt/binanceus.py,sha256=hdcT4OnadcdFFFjF3GtM0nWv90jqojqwdVS3xWGuW40,9163
10
10
  ccxt/binanceusdm.py,sha256=KPQGlCalQ0eGlPCs2tSanOxaP8O0zFRQjGntA16Yprw,2480
11
- ccxt/bingx.py,sha256=vEOh4NXjcqmnf4sGuWhsQfV4bFagu_8DI6eb1KNF6QY,186903
11
+ ccxt/bingx.py,sha256=5yMkh41wzmCEPyVbN1CcCDmZ-1lJmuqR9J_eXJ9Giw8,188325
12
12
  ccxt/bit2c.py,sha256=un1ZuLNvEt7bkceNeue3UctEoFA-xpoKQlnq4bX5Slc,37062
13
- ccxt/bitbank.py,sha256=6V4AeEw2_mqErXGGx24tXWIgORSL11IX0f4kYFJ7Q1A,41989
13
+ ccxt/bitbank.py,sha256=yxS-W5FeA2Kqp7VbdNt6960GjuMflKVqUlTbtKPgqUY,43535
14
14
  ccxt/bitbay.py,sha256=xAIjzGRDVGwoy-Gygd99H0YN4wiaz_0lR0Z14oxaaxc,478
15
15
  ccxt/bitbns.py,sha256=vob7RER0BJJcP2ten1UcO3sE8FihY5jNffN-emNtu6E,48270
16
16
  ccxt/bitcoincom.py,sha256=PyWIl4nC4jp5Uba2lI1At0N_hhNyWD0DoZC_MSyL_s4,502
@@ -19,7 +19,7 @@ ccxt/bitfinex2.py,sha256=smVuwDShHy4m4s4i4xGzx04r197GKPL8MA3lT2End4E,160612
19
19
  ccxt/bitflyer.py,sha256=rvykeLLkDYVMEwXs4rInQClYwdXIXmj_7mxDpGT216I,41565
20
20
  ccxt/bitget.py,sha256=7ETvr_9MSWv0KlbdmVxBMd-K7z_2EAdTq1Xaj_Gi6nE,423496
21
21
  ccxt/bithumb.py,sha256=0oRYEp30LykNchRZwqbsiZlrzY4koY6EFWubVYs5hU8,45684
22
- ccxt/bitmart.py,sha256=FEWE-T15bUylIo8nkOwEn4ealjNZ2jsTQrnB5VvBpys,204467
22
+ ccxt/bitmart.py,sha256=JEXZ_kAu12Io1Y6m9QDn0_98s1qqOdBvoqOyRFUnzoY,204427
23
23
  ccxt/bitmex.py,sha256=koETQgb-yVZ3ZfP6qIHyTMLTDk8eXTHauhwhaP79ZBQ,126862
24
24
  ccxt/bitopro.py,sha256=kjGn1UOy6toGyEbpV_al50eGCjqI75GN4LXpGbmL4Tw,68743
25
25
  ccxt/bitpanda.py,sha256=aiwPkx9lKbVzt4ggoYdq_mIbMGtg5ZtGl2yRHO5xyz8,471
@@ -62,14 +62,14 @@ ccxt/gemini.py,sha256=5eIia9wC4amH1e2kuVZh69mQ8y43TRZu4JizH_w8ogc,80838
62
62
  ccxt/hitbtc.py,sha256=rFfuwk_KY9OLy_GM4dVJmbMfLa0j_8Wfml5yJxS9UTM,153389
63
63
  ccxt/hitbtc3.py,sha256=qRAr4Zvaju9IQWRZUohdoN7xRnzIMPq8AyYb3gPv-Is,455
64
64
  ccxt/hollaex.py,sha256=e7irunlbzhM1BSvv9kyaccHdUF0cRjnJkIbMMQhe5PA,76141
65
- ccxt/htx.py,sha256=xQABPnaOqDati12yUXjUff8znMgSyGbHTqTKwPhSngE,420980
65
+ ccxt/htx.py,sha256=tsbkKP3Bvi8yN2PcmpGR3-G1W5nS3fzfP4H_znf4_UQ,425065
66
66
  ccxt/huobi.py,sha256=4vaG7IRN7fyjaJ_ac6S-njlHOfSEN5de7aq0noznxYw,438
67
67
  ccxt/huobijp.py,sha256=wWCz1hRTJP8KRqfhsfml8h4d3Zz1ChAgqdYDl0OiDAo,88183
68
68
  ccxt/hyperliquid.py,sha256=535pxGdgEFjP03WtB3ck6Nz0PwD7HqsTOoW-6qwxAYM,101079
69
69
  ccxt/idex.py,sha256=7f5GA9z-Mui7YOmSxPRbHIWATSU8DVXUNYPlgw34iMw,73231
70
70
  ccxt/independentreserve.py,sha256=LPYeMLwcsUG9_91dpDtRVJZPOtCIe4uV7nv_T7plzss,32246
71
71
  ccxt/indodax.py,sha256=Oo3elggqB0J7YWaE0o6fXo9SpJuseTQSnoJ3jYt-Buc,52074
72
- ccxt/kraken.py,sha256=_jfLrNeo-IRUd7g01VCz4bKjSCCDe5XWLvcOv7v-HoA,128319
72
+ ccxt/kraken.py,sha256=WjB-3YdDAnW-rdNTVumLK_2ok3NafWG9K6BTIUBWRWc,128473
73
73
  ccxt/krakenfutures.py,sha256=1xUvIzuDUevPngvmaODrZZ4LDYoojY7pzM5GbeobJKI,117101
74
74
  ccxt/kucoin.py,sha256=DLUGLWdfTjxH9gna_jnlncz_wg38MhtYr_0Y0TF6-fA,218298
75
75
  ccxt/kucoinfutures.py,sha256=x9TacKIoBZ_WnA4nljaAH9TwMvTDkU_E-GtqbK5S8F4,124565
@@ -100,7 +100,7 @@ ccxt/wavesexchange.py,sha256=BgqApypcGzFw4rlKR4LW2YUW7CkK2h1ICmtsYIcgZqQ,113831
100
100
  ccxt/wazirx.py,sha256=leNH1FwG_45Sim2Adx5bZc2u6zz8zqx5AUymiDxFJ54,51509
101
101
  ccxt/whitebit.py,sha256=xENpt5u6txhUlLfc4IR_FHCAJMw3u1nj17voGoq0zus,118756
102
102
  ccxt/woo.py,sha256=8oeJFt8SpBY1D-TH1qBJzt_vtR5Iq4KQ0v7LohMIxFY,139810
103
- ccxt/woofipro.py,sha256=-djja__nTUC87mVRRmyJ0-mxQw3QykMsBwGgW7rtSME,115182
103
+ ccxt/woofipro.py,sha256=VdAKu5DnL5reBUUfj_HPy6USLw9Ti6pLwMBWP4oXQz0,115210
104
104
  ccxt/yobit.py,sha256=MFrd_ZvzSPP0T8RWrC3aLNrQN2rDZz3m2cbCnOqXr6s,53372
105
105
  ccxt/zaif.py,sha256=zq592UTcuXvzR2qVkSNhXwBPxJm5JE4sKbDyrImyuHU,28863
106
106
  ccxt/zonda.py,sha256=mP8o4UQgLZq1-gak8BAn4hH17BCDeztHhe34Itlf7V0,81230
@@ -175,7 +175,7 @@ ccxt/abstract/hyperliquid.py,sha256=AtChoOQaaZLeXCAQBA_Lg77vqsZ4mQqNTqewcW_puWg,
175
175
  ccxt/abstract/idex.py,sha256=kFcWa8PauxofzN_k2DyQ0aZxQ70VPNAWMcEUZrl7XqE,2129
176
176
  ccxt/abstract/independentreserve.py,sha256=Cue0hud5acRs2Q6oSvQ7Rx-YWS_fuACs6uV3aIE20ZM,4165
177
177
  ccxt/abstract/indodax.py,sha256=E16v8W6Ac9kmV9hFEqf_kwV6VQmK74lc1LEUEkuDpYg,2488
178
- ccxt/abstract/kraken.py,sha256=Ixlz9Fwm1mn-B9ddUMfxOQsRzTZHfQBJKYXSQd8mCyk,5877
178
+ ccxt/abstract/kraken.py,sha256=AUpdQHWHZFXseHNx1-cuLqRutYwYEUVqQ7mjc0TQR_s,5883
179
179
  ccxt/abstract/krakenfutures.py,sha256=SiQ5XgX8DXkJgaF6AaX6Gzyb8Ef8mV6j3LhZj0Q7qdo,3537
180
180
  ccxt/abstract/kucoin.py,sha256=9A8YSxRjuBoBfWRZKwYsdP10GNptdorbnY8R1ae7Lvs,25491
181
181
  ccxt/abstract/kucoinfutures.py,sha256=W6BLMw26kIxIPQJh77lrSHjvsf2wXCshvBCzxYGEpjo,28204
@@ -210,7 +210,7 @@ ccxt/abstract/woofipro.py,sha256=El50vWGAV-4QPIDhgSnd4egfvk246NB6vTC-8h722vs,160
210
210
  ccxt/abstract/yobit.py,sha256=8ycfCO8ORFly9hc0Aa47sZyX4_ZKPXS9h9yJzI-uQ7Q,1339
211
211
  ccxt/abstract/zaif.py,sha256=m15WHdl3gYy0GOXNZ8NEH8eE7sVh8c0T_ITNuU8vXeU,3935
212
212
  ccxt/abstract/zonda.py,sha256=X-hCW0SdX3YKZWixDyW-O2211M58Rno8kKJ6quY7rw4,7183
213
- ccxt/async_support/__init__.py,sha256=1xe5nA9zCLUX8-EJqABf-Mn5VBSb8kktGMEWt8Ri98s,15723
213
+ ccxt/async_support/__init__.py,sha256=w2wqy_8lIzziYMfJ9YUKh4AZq7x3sv_7sTPBv3gWzec,15723
214
214
  ccxt/async_support/ace.py,sha256=tsRgs_o4Iq7q8IkD83FUdC-2ztylhgO4cp2hww3rlqQ,42000
215
215
  ccxt/async_support/alpaca.py,sha256=3845DgojoA1p0pxrqnDIqHbbRcEwZhZIkE4aygD5ics,47538
216
216
  ccxt/async_support/ascendex.py,sha256=7tZ4C7FfzmuB_ADYjl6IkyQQ5JG0Vt1AD_B3fTeY6V0,152620
@@ -220,9 +220,9 @@ ccxt/async_support/binance.py,sha256=dBRcoYqL2UcYNg_H4j6SdUgxUIEZdXMUhJX67afc2PI
220
220
  ccxt/async_support/binancecoinm.py,sha256=IY3RLZptQA2nmZaUYRGfTa5ZY4VMWBpFYfwHc8zTHw0,1683
221
221
  ccxt/async_support/binanceus.py,sha256=c-K3Tk7LaRJjmYdCx8vBOqsx01uXrtvt0PC2ekBiD0g,9177
222
222
  ccxt/async_support/binanceusdm.py,sha256=-1r4A4tmV2pCiLGO80hzq7MIIj4MTzOD7buZGv6JauA,2518
223
- ccxt/async_support/bingx.py,sha256=PJQEf8tCzw8VB7TjDIEKzk-MwZSAtt4msqFeZzf6eFc,187939
223
+ ccxt/async_support/bingx.py,sha256=mL8PerdRTP78nwA03hGG0g028VwQPDxWnHmv3_3Fh94,189361
224
224
  ccxt/async_support/bit2c.py,sha256=5div5D1LV3QHZUqL3CDdKaBDATQ3c2Phglx9JpAb7fY,37274
225
- ccxt/async_support/bitbank.py,sha256=xcG6QiyYZE1MmWHcd4x3slaW5XwR6dMeByEKXnEp2rA,42249
225
+ ccxt/async_support/bitbank.py,sha256=47jVvH8--NkV11uL-1X22vEg0YMyLc--SVtVuTLrFCI,43795
226
226
  ccxt/async_support/bitbay.py,sha256=jcaEXi2IhYTva8ezO_SfJhwxEZk7HST4J3NaxD16BQA,492
227
227
  ccxt/async_support/bitbns.py,sha256=qiW_A43mb7CdKuHupPSzTiIn8gD0T_vuvdyu3qcX2p4,48524
228
228
  ccxt/async_support/bitcoincom.py,sha256=RiqwhK3RfxQ_PXTa860fphDCvwA8dalL-_rXlK85-8A,516
@@ -231,7 +231,7 @@ ccxt/async_support/bitfinex2.py,sha256=QQstleJSkjDRMHGSFZQIUHJ5fx55Bgdytk35gMWke
231
231
  ccxt/async_support/bitflyer.py,sha256=RWrRkrZJow4M5uwoqTCD0bcITItbC5WZ57Mcmv0_1nk,41873
232
232
  ccxt/async_support/bitget.py,sha256=BLMe-ofDnsehCgJSJZkKK2JN7NbsBFZGop_cuM57cyU,425120
233
233
  ccxt/async_support/bithumb.py,sha256=0_SehUTG-pqL8uBHE_IhwJ5BjNTFfbxwF0A_IufTNuA,45914
234
- ccxt/async_support/bitmart.py,sha256=ttjLEDra7QR8zgD2PyOlm004Whvof2tRcwElT0cBhI0,205423
234
+ ccxt/async_support/bitmart.py,sha256=BHFBmb26UjRza9c-NoOJbzCi5H3hoQfkjh0AOA7thQE,205383
235
235
  ccxt/async_support/bitmex.py,sha256=JCRSgTWNwB97A1vwvEpajD8VQ4AE8Qs5ZU1yd8KaiYc,127440
236
236
  ccxt/async_support/bitopro.py,sha256=OWWNB_6Vpe10JG0P7dpmgerPEtmuxbx5_DLBFWnsL7w,69147
237
237
  ccxt/async_support/bitpanda.py,sha256=2k3URBWrpnh2xHa7JiYenI7_4MW5UeOPGzetlmRkR4U,485
@@ -274,14 +274,14 @@ ccxt/async_support/gemini.py,sha256=cJjRW_O2uIKhi6tsClWr9Td8AGet_sXM2Lkj-i3MjRA,
274
274
  ccxt/async_support/hitbtc.py,sha256=mu0IpmPkynGU8MaXLi9nZyDLP9L6Vjqb_D104q5Dj9E,154435
275
275
  ccxt/async_support/hitbtc3.py,sha256=dmSYoD2o4av_zzbZI8HNIoj8BWxA7QozsVpy8JaOXzU,469
276
276
  ccxt/async_support/hollaex.py,sha256=b7nJAvL0dCfPwhjOCfoAn1Qd9msFvEIfYp-7EQ4QIwQ,76575
277
- ccxt/async_support/htx.py,sha256=g-2L9jStmxvQevzZnC_LO4wqDBnv-EFS9-m593ouYUU,423336
277
+ ccxt/async_support/htx.py,sha256=wYAmakkCQfBs_6iFrB-P8pkrRSXV16RCm6xjg3zAWbQ,427457
278
278
  ccxt/async_support/huobi.py,sha256=fup0j6wQ1khAtfbb1H4CSyJAOzhxuoHMmrM6sgTuhr8,452
279
279
  ccxt/async_support/huobijp.py,sha256=C8r2aXJ5D8vyS9hEA2FKBTufDKircXN9D2ypm720HeU,88683
280
280
  ccxt/async_support/hyperliquid.py,sha256=xy4GMllF4APqWrHjWmI7hUQRJtsMY-7k_2moNVPyuQY,101599
281
281
  ccxt/async_support/idex.py,sha256=f5CvLsX4ECEr-spmDP2a26Ge2AmbWMip1o0usOmbvAE,73707
282
282
  ccxt/async_support/independentreserve.py,sha256=i6gf1iPcwyBiL_65UoszpotGco-KgvTxcRkrq6AZsOY,32506
283
283
  ccxt/async_support/indodax.py,sha256=yNHitrcyGRAUKLlEmLl6nKWjcJTuPPFW6BpizQp71oo,52382
284
- ccxt/async_support/kraken.py,sha256=8KR2ozRDR0Mt5g93TnyJ7H1lrcSpnLrm6H3I5SzGdSg,128957
284
+ ccxt/async_support/kraken.py,sha256=Wi-bG5ftU0DNDkT05mu-BylIdliwsLcDGQvLy0bPxbQ,129111
285
285
  ccxt/async_support/krakenfutures.py,sha256=G5lWWvUyyl64laoN-i08k3S8fyOGKfx-2Vbkn42D6tE,117589
286
286
  ccxt/async_support/kucoin.py,sha256=xcBYK19XTgiAWViYprAhJb8dHrgEKyOQcV2ODX2a5dw,219370
287
287
  ccxt/async_support/kucoinfutures.py,sha256=19pp3iLxyGxqNvFLZ3W_Ov6gqUAwQE5oTvp9DezKmG8,125203
@@ -312,12 +312,12 @@ ccxt/async_support/wavesexchange.py,sha256=iLrg2z3npMfiUUcaqVgDJZsi2EVstwgTRThWT
312
312
  ccxt/async_support/wazirx.py,sha256=FOv4rrTDhhuFVnCYS47EqgtyPEqCO0gJIJKcWA2FMTE,51811
313
313
  ccxt/async_support/whitebit.py,sha256=mwoolQKWL_9ZpC-zU5Ti4rM7QsK3Fmmo_MRUgj_Nno8,119406
314
314
  ccxt/async_support/woo.py,sha256=uMfhQF8Drm6tMo3SuyrTM3hq8Tb_4a6eJw4AKuE0bcE,140700
315
- ccxt/async_support/woofipro.py,sha256=FEkqK94zCiBmb0vDefnFplMtVcj3iQhR4LoTaE48A-o,115862
315
+ ccxt/async_support/woofipro.py,sha256=gOVcSt5dCniYG9QVzSoszVpV_a3k8CBEcviex9Ivwy0,115890
316
316
  ccxt/async_support/yobit.py,sha256=KQcu9nXJPDlAodZyxOXKIn6eTSLmlvUlgRFE6EBLfug,53656
317
317
  ccxt/async_support/zaif.py,sha256=jTK5pLZSpKL1Pt0qAJTjN09TDS5AfhptGgGAqw7sNwE,29045
318
318
  ccxt/async_support/zonda.py,sha256=e5sSXcFM7NZSyCGPoKmeyNe5wLIxJZJhDAetMknwAYo,81544
319
319
  ccxt/async_support/base/__init__.py,sha256=aVYSsFi--b4InRs9zDN_wtCpj8odosAB726JdUHavrk,67
320
- ccxt/async_support/base/exchange.py,sha256=MmuyZc6gSSGlF3PmxxlNAQxeawp5uxyBL9t8OWiYW7o,109872
320
+ ccxt/async_support/base/exchange.py,sha256=1Z_3-8VWvQ2SDUYI8EQWZ-n3EB8kcPlt3TVscwts_pQ,109872
321
321
  ccxt/async_support/base/throttler.py,sha256=tvDVcdRUVYi8fZRlEcnqtgzcgB_KMUMRs5Pu8tuU-tU,1847
322
322
  ccxt/async_support/base/ws/__init__.py,sha256=uockzpLuwntKGZbs5EOWFe-Zg-k6Cj7GhNJLc_RX0so,1791
323
323
  ccxt/async_support/base/ws/aiohttp_client.py,sha256=5IEiT0elWI9a7Vr-KV0jgmlbpLJWBzIlrLaCkTKGaqY,5752
@@ -331,10 +331,10 @@ ccxt/async_support/base/ws/order_book_side.py,sha256=GhnGUt78pJ-AYL_Dq9produGjmB
331
331
  ccxt/base/__init__.py,sha256=eTx1OE3HJjspFUQjGm6LBhaQiMKJnXjkdP-JUXknyQ0,1320
332
332
  ccxt/base/decimal_to_precision.py,sha256=fgWRBzRTtsf3r2INyS4f7WHlzgjB5YM1ekiwqD21aac,6634
333
333
  ccxt/base/errors.py,sha256=FGdyULeNCNcl52gA_CNhe2dZmat9GJGkTdlIyDXAF_A,4213
334
- ccxt/base/exchange.py,sha256=LdZOLqZKTf1D1zHEHEfx-0RTcz201x6hauayBdN8-d0,280871
334
+ ccxt/base/exchange.py,sha256=fVG8clDxRi4bieRJnwmqRkKwG5pVlC0eLOs6PTuqOtQ,280871
335
335
  ccxt/base/precise.py,sha256=_xfu54sV0vWNnOfGTKRFykeuWP8mn4K1m9lk1tcllX4,8565
336
336
  ccxt/base/types.py,sha256=RGGcbz86cVtrmU602zoFO5gSWrv_J7IHxQkPnzmNirs,9247
337
- ccxt/pro/__init__.py,sha256=WxyBWNBICF6P3mdUh3-cGlYr--2aVTVwD9yJiq4rJAA,7107
337
+ ccxt/pro/__init__.py,sha256=xcDuY_PDmzKunVljOsr9FhjqI9ZnBbYmIDTeLQdRbIc,7107
338
338
  ccxt/pro/alpaca.py,sha256=81nFwDKyNlmUnhSyRyDLmLU6LGt3yqip1L_Ms2UyAmw,27215
339
339
  ccxt/pro/ascendex.py,sha256=e4WZqmTkIz9sVAWtKAaV6BvanrM2ylRdzjxrclZYmOE,35456
340
340
  ccxt/pro/bequant.py,sha256=5zbsP8BHQTUZ8ZNL6uaACxDbUClgkOV4SYfXT_LfQVg,1351
@@ -535,7 +535,7 @@ ccxt/test/base/test_ticker.py,sha256=cMTIMb1oySNORUCmqI5ZzMswlEyCF6gJMah3vfvo8wQ
535
535
  ccxt/test/base/test_trade.py,sha256=PMtmB8V38dpaP-eb8h488xYMlR6D69yCOhsA1RuWrUA,2336
536
536
  ccxt/test/base/test_trading_fee.py,sha256=2aDCNJtqBkTC_AieO0l1HYGq5hz5qkWlkWb9Nv_fcwk,1066
537
537
  ccxt/test/base/test_transaction.py,sha256=BTbB4UHHXkrvYgwbrhh867nVRlevmIkIrz1W_odlQJI,1434
538
- ccxt-4.3.36.dist-info/METADATA,sha256=UMScllpu9MtdaOWcb_wT1xB8i6VR6zW3EtAQBY_NhSI,112807
539
- ccxt-4.3.36.dist-info/WHEEL,sha256=P2T-6epvtXQ2cBOE_U1K4_noqlJFN3tj15djMgEu4NM,110
540
- ccxt-4.3.36.dist-info/top_level.txt,sha256=CkQDuCTDKNcImPV60t36G6MdYfxsAPNiSaEwifVoVMo,5
541
- ccxt-4.3.36.dist-info/RECORD,,
538
+ ccxt-4.3.37.dist-info/METADATA,sha256=0_o7JJRmtB7ditlZk6ZVXEGDM0CAHNyVaqeSPLAYFd4,112807
539
+ ccxt-4.3.37.dist-info/WHEEL,sha256=P2T-6epvtXQ2cBOE_U1K4_noqlJFN3tj15djMgEu4NM,110
540
+ ccxt-4.3.37.dist-info/top_level.txt,sha256=CkQDuCTDKNcImPV60t36G6MdYfxsAPNiSaEwifVoVMo,5
541
+ ccxt-4.3.37.dist-info/RECORD,,
File without changes