ccxt 4.3.5__py2.py3-none-any.whl → 4.3.7__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 (189) 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/bingx.py +1 -0
  7. ccxt/abstract/coinbase.py +5 -0
  8. ccxt/abstract/woo.py +1 -0
  9. ccxt/ace.py +5 -0
  10. ccxt/alpaca.py +6 -0
  11. ccxt/ascendex.py +2 -2
  12. ccxt/async_support/__init__.py +1 -1
  13. ccxt/async_support/ace.py +5 -0
  14. ccxt/async_support/alpaca.py +6 -0
  15. ccxt/async_support/ascendex.py +2 -2
  16. ccxt/async_support/base/exchange.py +30 -1
  17. ccxt/async_support/bigone.py +1 -1
  18. ccxt/async_support/binance.py +7 -3
  19. ccxt/async_support/bingx.py +43 -1
  20. ccxt/async_support/bitbank.py +4 -1
  21. ccxt/async_support/bitfinex.py +1 -1
  22. ccxt/async_support/bitfinex2.py +1 -1
  23. ccxt/async_support/bitflyer.py +1 -1
  24. ccxt/async_support/bitget.py +70 -4
  25. ccxt/async_support/bithumb.py +5 -1
  26. ccxt/async_support/bitmart.py +1 -1
  27. ccxt/async_support/bitmex.py +25 -1
  28. ccxt/async_support/bitopro.py +6 -1
  29. ccxt/async_support/bitrue.py +1 -1
  30. ccxt/async_support/bitso.py +4 -1
  31. ccxt/async_support/bitstamp.py +4 -1
  32. ccxt/async_support/bitteam.py +4 -0
  33. ccxt/async_support/bitvavo.py +4 -1
  34. ccxt/async_support/bl3p.py +3 -0
  35. ccxt/async_support/blockchaincom.py +1 -1
  36. ccxt/async_support/btcalpha.py +3 -0
  37. ccxt/async_support/btcbox.py +3 -0
  38. ccxt/async_support/btcmarkets.py +4 -1
  39. ccxt/async_support/btcturk.py +3 -0
  40. ccxt/async_support/bybit.py +196 -14
  41. ccxt/async_support/cex.py +6 -0
  42. ccxt/async_support/coinbase.py +98 -22
  43. ccxt/async_support/coinbaseinternational.py +3 -1
  44. ccxt/async_support/coinbasepro.py +7 -1
  45. ccxt/async_support/coincheck.py +3 -0
  46. ccxt/async_support/coinex.py +180 -79
  47. ccxt/async_support/coinlist.py +5 -1
  48. ccxt/async_support/coinmate.py +4 -1
  49. ccxt/async_support/coinone.py +3 -0
  50. ccxt/async_support/coinsph.py +5 -1
  51. ccxt/async_support/coinspot.py +3 -0
  52. ccxt/async_support/cryptocom.py +33 -2
  53. ccxt/async_support/delta.py +2 -2
  54. ccxt/async_support/deribit.py +1 -1
  55. ccxt/async_support/digifinex.py +3 -3
  56. ccxt/async_support/exmo.py +8 -3
  57. ccxt/async_support/gate.py +112 -24
  58. ccxt/async_support/gemini.py +1 -1
  59. ccxt/async_support/hitbtc.py +7 -6
  60. ccxt/async_support/hollaex.py +1 -1
  61. ccxt/async_support/htx.py +29 -1
  62. ccxt/async_support/huobijp.py +1 -1
  63. ccxt/async_support/hyperliquid.py +39 -2
  64. ccxt/async_support/idex.py +4 -1
  65. ccxt/async_support/independentreserve.py +3 -0
  66. ccxt/async_support/indodax.py +4 -1
  67. ccxt/async_support/kraken.py +28 -1
  68. ccxt/async_support/krakenfutures.py +26 -0
  69. ccxt/async_support/kucoin.py +3 -1
  70. ccxt/async_support/kucoinfutures.py +5 -3
  71. ccxt/async_support/kuna.py +1 -1
  72. ccxt/async_support/latoken.py +6 -0
  73. ccxt/async_support/lbank.py +1 -1
  74. ccxt/async_support/luno.py +3 -0
  75. ccxt/async_support/lykke.py +6 -1
  76. ccxt/async_support/mercado.py +4 -1
  77. ccxt/async_support/mexc.py +110 -4
  78. ccxt/async_support/ndax.py +5 -1
  79. ccxt/async_support/novadax.py +5 -1
  80. ccxt/async_support/okcoin.py +1 -1
  81. ccxt/async_support/okx.py +183 -4
  82. ccxt/async_support/onetrading.py +4 -1
  83. ccxt/async_support/p2b.py +3 -0
  84. ccxt/async_support/phemex.py +1 -1
  85. ccxt/async_support/poloniex.py +1 -1
  86. ccxt/async_support/probit.py +4 -1
  87. ccxt/async_support/timex.py +3 -0
  88. ccxt/async_support/tokocrypto.py +1 -1
  89. ccxt/async_support/tradeogre.py +3 -0
  90. ccxt/async_support/upbit.py +1 -1
  91. ccxt/async_support/wavesexchange.py +4 -1
  92. ccxt/async_support/wazirx.py +3 -0
  93. ccxt/async_support/whitebit.py +38 -1
  94. ccxt/async_support/woo.py +30 -1
  95. ccxt/async_support/yobit.py +4 -1
  96. ccxt/async_support/zaif.py +1 -1
  97. ccxt/async_support/zonda.py +1 -1
  98. ccxt/base/exchange.py +30 -1
  99. ccxt/bigone.py +1 -1
  100. ccxt/binance.py +7 -3
  101. ccxt/bingx.py +43 -1
  102. ccxt/bitbank.py +4 -1
  103. ccxt/bitfinex.py +1 -1
  104. ccxt/bitfinex2.py +1 -1
  105. ccxt/bitflyer.py +1 -1
  106. ccxt/bitget.py +70 -4
  107. ccxt/bithumb.py +5 -1
  108. ccxt/bitmart.py +1 -1
  109. ccxt/bitmex.py +25 -1
  110. ccxt/bitopro.py +6 -1
  111. ccxt/bitrue.py +1 -1
  112. ccxt/bitso.py +4 -1
  113. ccxt/bitstamp.py +4 -1
  114. ccxt/bitteam.py +4 -0
  115. ccxt/bitvavo.py +4 -1
  116. ccxt/bl3p.py +3 -0
  117. ccxt/blockchaincom.py +1 -1
  118. ccxt/btcalpha.py +3 -0
  119. ccxt/btcbox.py +3 -0
  120. ccxt/btcmarkets.py +4 -1
  121. ccxt/btcturk.py +3 -0
  122. ccxt/bybit.py +196 -14
  123. ccxt/cex.py +6 -0
  124. ccxt/coinbase.py +98 -22
  125. ccxt/coinbaseinternational.py +3 -1
  126. ccxt/coinbasepro.py +7 -1
  127. ccxt/coincheck.py +3 -0
  128. ccxt/coinex.py +180 -79
  129. ccxt/coinlist.py +5 -1
  130. ccxt/coinmate.py +4 -1
  131. ccxt/coinone.py +3 -0
  132. ccxt/coinsph.py +5 -1
  133. ccxt/coinspot.py +3 -0
  134. ccxt/cryptocom.py +33 -2
  135. ccxt/delta.py +2 -2
  136. ccxt/deribit.py +1 -1
  137. ccxt/digifinex.py +3 -3
  138. ccxt/exmo.py +8 -3
  139. ccxt/gate.py +112 -24
  140. ccxt/gemini.py +1 -1
  141. ccxt/hitbtc.py +7 -6
  142. ccxt/hollaex.py +1 -1
  143. ccxt/htx.py +29 -1
  144. ccxt/huobijp.py +1 -1
  145. ccxt/hyperliquid.py +39 -2
  146. ccxt/idex.py +4 -1
  147. ccxt/independentreserve.py +3 -0
  148. ccxt/indodax.py +4 -1
  149. ccxt/kraken.py +28 -1
  150. ccxt/krakenfutures.py +26 -0
  151. ccxt/kucoin.py +3 -1
  152. ccxt/kucoinfutures.py +5 -3
  153. ccxt/kuna.py +1 -1
  154. ccxt/latoken.py +6 -0
  155. ccxt/lbank.py +1 -1
  156. ccxt/luno.py +3 -0
  157. ccxt/lykke.py +6 -1
  158. ccxt/mercado.py +4 -1
  159. ccxt/mexc.py +110 -4
  160. ccxt/ndax.py +5 -1
  161. ccxt/novadax.py +5 -1
  162. ccxt/okcoin.py +1 -1
  163. ccxt/okx.py +183 -4
  164. ccxt/onetrading.py +4 -1
  165. ccxt/p2b.py +3 -0
  166. ccxt/phemex.py +1 -1
  167. ccxt/poloniex.py +1 -1
  168. ccxt/pro/__init__.py +1 -1
  169. ccxt/pro/bitget.py +1 -1
  170. ccxt/pro/bybit.py +1 -1
  171. ccxt/pro/coinbase.py +28 -28
  172. ccxt/probit.py +4 -1
  173. ccxt/test/test_async.py +2 -0
  174. ccxt/test/test_sync.py +2 -0
  175. ccxt/timex.py +3 -0
  176. ccxt/tokocrypto.py +1 -1
  177. ccxt/tradeogre.py +3 -0
  178. ccxt/upbit.py +1 -1
  179. ccxt/wavesexchange.py +4 -1
  180. ccxt/wazirx.py +3 -0
  181. ccxt/whitebit.py +38 -1
  182. ccxt/woo.py +30 -1
  183. ccxt/yobit.py +4 -1
  184. ccxt/zaif.py +1 -1
  185. ccxt/zonda.py +1 -1
  186. {ccxt-4.3.5.dist-info → ccxt-4.3.7.dist-info}/METADATA +4 -4
  187. {ccxt-4.3.5.dist-info → ccxt-4.3.7.dist-info}/RECORD +189 -189
  188. {ccxt-4.3.5.dist-info → ccxt-4.3.7.dist-info}/WHEEL +0 -0
  189. {ccxt-4.3.5.dist-info → ccxt-4.3.7.dist-info}/top_level.txt +0 -0
@@ -74,7 +74,12 @@ class exmo(Exchange, ImplicitAPI):
74
74
  'fetchOrderBook': True,
75
75
  'fetchOrderBooks': True,
76
76
  'fetchOrderTrades': True,
77
+ 'fetchPosition': False,
78
+ 'fetchPositionHistory': False,
77
79
  'fetchPositionMode': False,
80
+ 'fetchPositions': False,
81
+ 'fetchPositionsHistory': False,
82
+ 'fetchPositionsRisk': False,
78
83
  'fetchPremiumIndexOHLCV': False,
79
84
  'fetchTicker': True,
80
85
  'fetchTickers': True,
@@ -282,7 +287,7 @@ class exmo(Exchange, ImplicitAPI):
282
287
  'datetime': None,
283
288
  }
284
289
 
285
- async def reduce_margin(self, symbol: str, amount, params={}) -> MarginModification:
290
+ async def reduce_margin(self, symbol: str, amount: float, params={}) -> MarginModification:
286
291
  """
287
292
  remove margin from a position
288
293
  :see: https://documenter.getpostman.com/view/10287440/SzYXWKPi#eebf9f25-0289-4946-9482-89872c738449
@@ -293,7 +298,7 @@ class exmo(Exchange, ImplicitAPI):
293
298
  """
294
299
  return await self.modify_margin_helper(symbol, amount, 'reduce', params)
295
300
 
296
- async def add_margin(self, symbol: str, amount, params={}) -> MarginModification:
301
+ async def add_margin(self, symbol: str, amount: float, params={}) -> MarginModification:
297
302
  """
298
303
  add margin
299
304
  :see: https://documenter.getpostman.com/view/10287440/SzYXWKPi#143ef808-79ca-4e49-9e79-a60ea4d8c0e3
@@ -1980,7 +1985,7 @@ class exmo(Exchange, ImplicitAPI):
1980
1985
  return self.markets[symbols[0]]
1981
1986
  return None
1982
1987
 
1983
- async def withdraw(self, code: str, amount: float, address, tag=None, params={}):
1988
+ async def withdraw(self, code: str, amount: float, address: str, tag=None, params={}):
1984
1989
  """
1985
1990
  make a withdrawal
1986
1991
  :see: https://documenter.getpostman.com/view/10287440/SzYXWKPi#3ab9c34d-ad58-4f87-9c57-2e2ea88a8325
@@ -7,7 +7,7 @@ from ccxt.async_support.base.exchange import Exchange
7
7
  from ccxt.abstract.gate import ImplicitAPI
8
8
  import asyncio
9
9
  import hashlib
10
- from ccxt.base.types import Balances, Currencies, Currency, FundingHistory, Greeks, Int, Leverage, Leverages, MarginModification, Market, MarketInterface, Num, Option, OptionChain, Order, OrderBook, OrderRequest, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, TradingFeeInterface, TradingFees, Transaction, TransferEntry
10
+ from ccxt.base.types import Balances, Currencies, Currency, FundingHistory, Greeks, Int, Leverage, Leverages, MarginModification, Market, MarketInterface, Num, Option, OptionChain, Order, OrderBook, OrderRequest, OrderSide, OrderType, Position, Str, Strings, Ticker, Tickers, Trade, TradingFeeInterface, TradingFees, Transaction, TransferEntry
11
11
  from typing import List
12
12
  from ccxt.base.errors import ExchangeError
13
13
  from ccxt.base.errors import AuthenticationError
@@ -157,8 +157,10 @@ class gate(Exchange, ImplicitAPI):
157
157
  'fetchOrder': True,
158
158
  'fetchOrderBook': True,
159
159
  'fetchPosition': True,
160
+ 'fetchPositionHistory': 'emulated',
160
161
  'fetchPositionMode': False,
161
162
  'fetchPositions': True,
163
+ 'fetchPositionsHistory': True,
162
164
  'fetchPremiumIndexOHLCV': False,
163
165
  'fetchSettlementHistory': True,
164
166
  'fetchTicker': True,
@@ -673,7 +675,6 @@ class gate(Exchange, ImplicitAPI):
673
675
  'option': 'options',
674
676
  'options': 'options',
675
677
  },
676
- 'defaultType': 'spot',
677
678
  'swap': {
678
679
  'fetchMarkets': {
679
680
  'settlementCurrencies': ['usdt', 'btc'],
@@ -3392,7 +3393,7 @@ class gate(Exchange, ImplicitAPI):
3392
3393
  response = await self.privateWalletGetWithdrawals(self.extend(request, params))
3393
3394
  return self.parse_transactions(response, currency)
3394
3395
 
3395
- async def withdraw(self, code: str, amount: float, address, tag=None, params={}):
3396
+ async def withdraw(self, code: str, amount: float, address: str, tag=None, params={}):
3396
3397
  """
3397
3398
  make a withdrawal
3398
3399
  :see: https://www.gate.io/docs/developers/apiv4/en/#withdraw
@@ -4947,37 +4948,61 @@ class gate(Exchange, ImplicitAPI):
4947
4948
  # "pending_orders": 0
4948
4949
  # }
4949
4950
  #
4951
+ # fetchPositionsHistory(swap and future)
4952
+ #
4953
+ # {
4954
+ # "contract": "SLERF_USDT", # Futures contract
4955
+ # "text": "web", # Text of close order
4956
+ # "long_price": "0.766306", # When 'side' is 'long,' it indicates the opening average price; when 'side' is 'short,' it indicates the closing average price.
4957
+ # "pnl": "-23.41702352", # PNL
4958
+ # "pnl_pnl": "-22.7187", # Position P/L
4959
+ # "pnl_fee": "-0.06527125", # Transaction Fees
4960
+ # "pnl_fund": "-0.63305227", # Funding Fees
4961
+ # "accum_size": "100",
4962
+ # "time": 1711279263, # Position close time
4963
+ # "short_price": "0.539119", # When 'side' is 'long,' it indicates the opening average price; when 'side' is 'short,' it indicates the closing average price
4964
+ # "side": "long", # Position side, long or short
4965
+ # "max_size": "100", # Max Trade Size
4966
+ # "first_open_time": 1711037985 # First Open Time
4967
+ # }
4968
+ #
4950
4969
  contract = self.safe_string(position, 'contract')
4951
4970
  market = self.safe_market(contract, market, '_', 'contract')
4952
- size = self.safe_string(position, 'size')
4953
- side = None
4954
- if Precise.string_gt(size, '0'):
4955
- side = 'long'
4956
- elif Precise.string_lt(size, '0'):
4957
- side = 'short'
4971
+ size = self.safe_string_2(position, 'size', 'accum_size')
4972
+ side = self.safe_string(position, 'side')
4973
+ if side is None:
4974
+ if Precise.string_gt(size, '0'):
4975
+ side = 'long'
4976
+ elif Precise.string_lt(size, '0'):
4977
+ side = 'short'
4958
4978
  maintenanceRate = self.safe_string(position, 'maintenance_rate')
4959
4979
  notional = self.safe_string(position, 'value')
4960
4980
  leverage = self.safe_string(position, 'leverage')
4961
4981
  marginMode = None
4962
- if leverage == '0':
4963
- marginMode = 'cross'
4964
- else:
4965
- marginMode = 'isolated'
4966
- unrealisedPnl = self.safe_string(position, 'unrealised_pnl')
4982
+ if leverage is not None:
4983
+ if leverage == '0':
4984
+ marginMode = 'cross'
4985
+ else:
4986
+ marginMode = 'isolated'
4967
4987
  # Initial Position Margin = ( Position Value / Leverage ) + Close Position Fee
4968
4988
  # *The default leverage under the full position is the highest leverage in the market.
4969
4989
  # *Trading fee is charged Fee Rate(0.075%).
4970
- takerFee = '0.00075'
4971
- feePaid = Precise.string_mul(takerFee, notional)
4972
- initialMarginString = Precise.string_add(Precise.string_div(notional, leverage), feePaid)
4973
- timestamp = self.safe_timestamp(position, 'open_time')
4990
+ feePaid = self.safe_string(position, 'pnl_fee')
4991
+ initialMarginString = None
4992
+ if feePaid is None:
4993
+ takerFee = '0.00075'
4994
+ feePaid = Precise.string_mul(takerFee, notional)
4995
+ initialMarginString = Precise.string_add(Precise.string_div(notional, leverage), feePaid)
4996
+ timestamp = self.safe_timestamp_2(position, 'open_time', 'first_open_time')
4997
+ if timestamp == 0:
4998
+ timestamp = None
4974
4999
  return self.safe_position({
4975
5000
  'info': position,
4976
5001
  'id': None,
4977
5002
  'symbol': self.safe_string(market, 'symbol'),
4978
5003
  'timestamp': timestamp,
4979
5004
  'datetime': self.iso8601(timestamp),
4980
- 'lastUpdateTimestamp': self.safe_timestamp(position, 'update_time'),
5005
+ 'lastUpdateTimestamp': self.safe_timestamp_2(position, 'update_time', 'time'),
4981
5006
  'initialMargin': self.parse_number(initialMarginString),
4982
5007
  'initialMarginPercentage': self.parse_number(Precise.string_div(initialMarginString, notional)),
4983
5008
  'maintenanceMargin': self.parse_number(Precise.string_mul(maintenanceRate, notional)),
@@ -4985,11 +5010,10 @@ class gate(Exchange, ImplicitAPI):
4985
5010
  'entryPrice': self.safe_number(position, 'entry_price'),
4986
5011
  'notional': self.parse_number(notional),
4987
5012
  'leverage': self.safe_number(position, 'leverage'),
4988
- 'unrealizedPnl': self.parse_number(unrealisedPnl),
4989
- 'realizedPnl': self.safe_number(position, 'realised_pnl'),
5013
+ 'unrealizedPnl': self.safe_number(position, 'unrealised_pnl'),
5014
+ 'realizedPnl': self.safe_number_2(position, 'realised_pnl', 'pnl'),
4990
5015
  'contracts': self.parse_number(Precise.string_abs(size)),
4991
5016
  'contractSize': self.safe_number(market, 'contractSize'),
4992
- # 'realisedPnl': position['realised_pnl'],
4993
5017
  'marginRatio': None,
4994
5018
  'liquidationPrice': self.safe_number(position, 'liq_price'),
4995
5019
  'markPrice': self.safe_number(position, 'mark_price'),
@@ -5698,7 +5722,7 @@ class gate(Exchange, ImplicitAPI):
5698
5722
  'datetime': None,
5699
5723
  }
5700
5724
 
5701
- async def reduce_margin(self, symbol: str, amount, params={}) -> MarginModification:
5725
+ async def reduce_margin(self, symbol: str, amount: float, params={}) -> MarginModification:
5702
5726
  """
5703
5727
  remove margin from a position
5704
5728
  :see: https://www.gate.io/docs/developers/apiv4/en/#update-position-margin
@@ -5710,7 +5734,7 @@ class gate(Exchange, ImplicitAPI):
5710
5734
  """
5711
5735
  return await self.modify_margin_helper(symbol, -amount, params)
5712
5736
 
5713
- async def add_margin(self, symbol: str, amount, params={}) -> MarginModification:
5737
+ async def add_margin(self, symbol: str, amount: float, params={}) -> MarginModification:
5714
5738
  """
5715
5739
  add margin
5716
5740
  :see: https://www.gate.io/docs/developers/apiv4/en/#update-position-margin
@@ -6869,6 +6893,70 @@ class gate(Exchange, ImplicitAPI):
6869
6893
  'quoteVolume': None,
6870
6894
  }
6871
6895
 
6896
+ async def fetch_positions_history(self, symbols: Strings = None, since: Int = None, limit: Int = None, params={}) -> List[Position]:
6897
+ """
6898
+ fetches historical positions
6899
+ :see: https://www.gate.io/docs/developers/apiv4/#list-position-close-history
6900
+ :see: https://www.gate.io/docs/developers/apiv4/#list-position-close-history-2
6901
+ :param str[] symbols: unified conract symbols, must all have the same settle currency and the same market type
6902
+ :param int [since]: the earliest time in ms to fetch positions for
6903
+ :param int [limit]: the maximum amount of records to fetch, default=1000
6904
+ :param dict params: extra parameters specific to the exchange api endpoint
6905
+ :param int [params.until]: the latest time in ms to fetch positions for
6906
+ *
6907
+ * EXCHANGE SPECIFIC PARAMETERS
6908
+ :param int offset: list offset, starting from 0
6909
+ :param str side: long or short
6910
+ :param str pnl: query profit or loss
6911
+ :returns dict[]: a list of `position structures <https://docs.ccxt.com/#/?id=position-structure>`
6912
+ """
6913
+ await self.load_markets()
6914
+ market = None
6915
+ if symbols is not None:
6916
+ symbolsLength = len(symbols)
6917
+ if symbolsLength == 1:
6918
+ market = self.market(symbols[0])
6919
+ marketType = None
6920
+ marketType, params = self.handle_market_type_and_params('fetchPositionsHistory', market, params, 'swap')
6921
+ until = self.safe_integer(params, 'until')
6922
+ params = self.omit(params, 'until')
6923
+ request = {}
6924
+ request, params = self.prepare_request(market, marketType, params)
6925
+ if limit is not None:
6926
+ request['limit'] = limit
6927
+ if since is not None:
6928
+ request['from'] = self.parse_to_int(since / 1000)
6929
+ if until is not None:
6930
+ request['to'] = self.parse_to_int(until / 1000)
6931
+ response = None
6932
+ if marketType == 'swap':
6933
+ response = await self.privateFuturesGetSettlePositionClose(self.extend(request, params))
6934
+ elif marketType == 'future':
6935
+ response = await self.privateDeliveryGetSettlePositionClose(self.extend(request, params))
6936
+ else:
6937
+ raise NotSupported(self.id + ' fetchPositionsHistory() does not support markets of type ' + marketType)
6938
+ #
6939
+ # [
6940
+ # {
6941
+ # "contract": "SLERF_USDT",
6942
+ # "text": "web",
6943
+ # "long_price": "0.766306",
6944
+ # "pnl": "-23.41702352",
6945
+ # "pnl_pnl": "-22.7187",
6946
+ # "pnl_fee": "-0.06527125",
6947
+ # "pnl_fund": "-0.63305227",
6948
+ # "accum_size": "100",
6949
+ # "time": 1711279263,
6950
+ # "short_price": "0.539119",
6951
+ # "side": "long",
6952
+ # "max_size": "100",
6953
+ # "first_open_time": 1711037985
6954
+ # },
6955
+ # ...
6956
+ # ]
6957
+ #
6958
+ return self.parse_positions(response, symbols, params)
6959
+
6872
6960
  def handle_errors(self, code, reason, url, method, headers, body, response, requestHeaders, requestBody):
6873
6961
  if response is None:
6874
6962
  return None
@@ -1523,7 +1523,7 @@ class gemini(Exchange, ImplicitAPI):
1523
1523
  response = await self.privatePostV1Mytrades(self.extend(request, params))
1524
1524
  return self.parse_trades(response, market, since, limit)
1525
1525
 
1526
- async def withdraw(self, code: str, amount: float, address, tag=None, params={}):
1526
+ async def withdraw(self, code: str, amount: float, address: str, tag=None, params={}):
1527
1527
  """
1528
1528
  make a withdrawal
1529
1529
  :see: https://docs.gemini.com/rest-api/#withdraw-crypto-funds
@@ -2491,7 +2491,7 @@ class hitbtc(Exchange, ImplicitAPI):
2491
2491
  'info': response,
2492
2492
  }
2493
2493
 
2494
- async def withdraw(self, code: str, amount: float, address, tag=None, params={}):
2494
+ async def withdraw(self, code: str, amount: float, address: str, tag=None, params={}):
2495
2495
  """
2496
2496
  make a withdrawal
2497
2497
  :see: https://api.hitbtc.com/#withdraw-crypto
@@ -3008,8 +3008,9 @@ class hitbtc(Exchange, ImplicitAPI):
3008
3008
  if market['swap']:
3009
3009
  if leverage is None:
3010
3010
  raise ArgumentsRequired(self.id + ' modifyMarginHelper() requires a leverage parameter for swap markets')
3011
- if amount != 0:
3012
- amount = self.amount_to_precision(symbol, amount)
3011
+ stringAmount = self.number_to_string(amount)
3012
+ if stringAmount != '0':
3013
+ amount = self.amount_to_precision(symbol, stringAmount)
3013
3014
  else:
3014
3015
  amount = '0'
3015
3016
  request = {
@@ -3091,7 +3092,7 @@ class hitbtc(Exchange, ImplicitAPI):
3091
3092
  'datetime': datetime,
3092
3093
  }
3093
3094
 
3094
- async def reduce_margin(self, symbol: str, amount, params={}) -> MarginModification:
3095
+ async def reduce_margin(self, symbol: str, amount: float, params={}) -> MarginModification:
3095
3096
  """
3096
3097
  remove margin from a position
3097
3098
  :see: https://api.hitbtc.com/#create-update-margin-account-2
@@ -3103,11 +3104,11 @@ class hitbtc(Exchange, ImplicitAPI):
3103
3104
  :param bool [params.margin]: True for reducing spot-margin
3104
3105
  :returns dict: a `margin structure <https://docs.ccxt.com/#/?id=reduce-margin-structure>`
3105
3106
  """
3106
- if amount != 0:
3107
+ if self.number_to_string(amount) != '0':
3107
3108
  raise BadRequest(self.id + ' reduceMargin() on hitbtc requires the amount to be 0 and that will remove the entire margin amount')
3108
3109
  return await self.modify_margin_helper(symbol, amount, 'reduce', params)
3109
3110
 
3110
- async def add_margin(self, symbol: str, amount, params={}) -> MarginModification:
3111
+ async def add_margin(self, symbol: str, amount: float, params={}) -> MarginModification:
3111
3112
  """
3112
3113
  add margin
3113
3114
  :see: https://api.hitbtc.com/#create-update-margin-account-2
@@ -1609,7 +1609,7 @@ class hollaex(Exchange, ImplicitAPI):
1609
1609
  'fee': fee,
1610
1610
  }
1611
1611
 
1612
- async def withdraw(self, code: str, amount: float, address, tag=None, params={}):
1612
+ async def withdraw(self, code: str, amount: float, address: str, tag=None, params={}):
1613
1613
  """
1614
1614
  make a withdrawal
1615
1615
  :see: https://apidocs.hollaex.com/#withdrawal
ccxt/async_support/htx.py CHANGED
@@ -54,6 +54,7 @@ class htx(Exchange, ImplicitAPI):
54
54
  'borrowCrossMargin': True,
55
55
  'borrowIsolatedMargin': True,
56
56
  'cancelAllOrders': True,
57
+ 'cancelAllOrdersAfter': True,
57
58
  'cancelOrder': True,
58
59
  'cancelOrders': True,
59
60
  'createDepositAddress': None,
@@ -120,7 +121,9 @@ class htx(Exchange, ImplicitAPI):
120
121
  'fetchOrders': True,
121
122
  'fetchOrderTrades': True,
122
123
  'fetchPosition': True,
124
+ 'fetchPositionHistory': 'emulated',
123
125
  'fetchPositions': True,
126
+ 'fetchPositionsHistory': False,
124
127
  'fetchPositionsRisk': False,
125
128
  'fetchPremiumIndexOHLCV': True,
126
129
  'fetchSettlementHistory': True,
@@ -5629,6 +5632,31 @@ class htx(Exchange, ImplicitAPI):
5629
5632
  #
5630
5633
  return response
5631
5634
 
5635
+ async def cancel_all_orders_after(self, timeout: Int, params={}):
5636
+ """
5637
+ dead man's switch, cancel all orders after the given timeout
5638
+ :see: https://huobiapi.github.io/docs/spot/v1/en/#dead-man-s-switch
5639
+ :param number timeout: time in milliseconds, 0 represents cancel the timer
5640
+ :param dict [params]: extra parameters specific to the exchange API endpoint
5641
+ :returns dict: the api result
5642
+ """
5643
+ await self.load_markets()
5644
+ request: dict = {
5645
+ 'timeout': self.parse_to_int(timeout / 1000) if (timeout > 0) else 0,
5646
+ }
5647
+ response = await self.v2PrivatePostAlgoOrdersCancelAllAfter(self.extend(request, params))
5648
+ #
5649
+ # {
5650
+ # "code": 200,
5651
+ # "message": "success",
5652
+ # "data": {
5653
+ # "currentTime": 1630491627230,
5654
+ # "triggerTime": 1630491637230
5655
+ # }
5656
+ # }
5657
+ #
5658
+ return response
5659
+
5632
5660
  def parse_deposit_address(self, depositAddress, currency: Currency = None):
5633
5661
  #
5634
5662
  # {
@@ -5950,7 +5978,7 @@ class htx(Exchange, ImplicitAPI):
5950
5978
  }
5951
5979
  return self.safe_string(statuses, status, status)
5952
5980
 
5953
- async def withdraw(self, code: str, amount: float, address, tag=None, params={}):
5981
+ async def withdraw(self, code: str, amount: float, address: str, tag=None, params={}):
5954
5982
  """
5955
5983
  make a withdrawal
5956
5984
  :param str code: unified currency code
@@ -1696,7 +1696,7 @@ class huobijp(Exchange, ImplicitAPI):
1696
1696
  }
1697
1697
  return self.safe_string(statuses, status, status)
1698
1698
 
1699
- async def withdraw(self, code: str, amount: float, address, tag=None, params={}):
1699
+ async def withdraw(self, code: str, amount: float, address: str, tag=None, params={}):
1700
1700
  """
1701
1701
  make a withdrawal
1702
1702
  :param str code: unified currency code
@@ -43,6 +43,7 @@ class hyperliquid(Exchange, ImplicitAPI):
43
43
  'borrowCrossMargin': False,
44
44
  'borrowIsolatedMargin': False,
45
45
  'cancelAllOrders': False,
46
+ 'cancelAllOrdersAfter': True,
46
47
  'cancelOrder': True,
47
48
  'cancelOrders': True,
48
49
  'cancelOrdersForSymbols': True,
@@ -1303,6 +1304,42 @@ class hyperliquid(Exchange, ImplicitAPI):
1303
1304
  #
1304
1305
  return response
1305
1306
 
1307
+ async def cancel_all_orders_after(self, timeout: Int, params={}):
1308
+ """
1309
+ dead man's switch, cancel all orders after the given timeout
1310
+ :param number timeout: time in milliseconds, 0 represents cancel the timer
1311
+ :param dict [params]: extra parameters specific to the exchange API endpoint
1312
+ :param str [params.vaultAddress]: the vault address
1313
+ :returns dict: the api result
1314
+ """
1315
+ self.check_required_credentials()
1316
+ await self.load_markets()
1317
+ params = self.omit(params, ['clientOrderId', 'client_id'])
1318
+ nonce = self.milliseconds()
1319
+ request = {
1320
+ 'nonce': nonce,
1321
+ # 'vaultAddress': vaultAddress,
1322
+ }
1323
+ cancelAction = {
1324
+ 'type': 'scheduleCancel',
1325
+ 'time': nonce + timeout,
1326
+ }
1327
+ vaultAddress = self.format_vault_address(self.safe_string(params, 'vaultAddress'))
1328
+ signature = self.sign_l1_action(cancelAction, nonce, vaultAddress)
1329
+ request['action'] = cancelAction
1330
+ request['signature'] = signature
1331
+ if vaultAddress is not None:
1332
+ params = self.omit(params, 'vaultAddress')
1333
+ request['vaultAddress'] = vaultAddress
1334
+ response = await self.privatePostExchange(self.extend(request, params))
1335
+ #
1336
+ # {
1337
+ # "status":"err",
1338
+ # "response":"Cannot set scheduled cancel time until enough volume traded. Required: $1000000. Traded: $373.47205."
1339
+ # }
1340
+ #
1341
+ return response
1342
+
1306
1343
  async def edit_order(self, id: str, symbol: str, type: str, side: str, amount: Num = None, price: Num = None, params={}):
1307
1344
  """
1308
1345
  edit a trade order
@@ -2090,7 +2127,7 @@ class hyperliquid(Exchange, ImplicitAPI):
2090
2127
  #
2091
2128
  return response
2092
2129
 
2093
- async def add_margin(self, symbol: str, amount, params={}) -> MarginModification:
2130
+ async def add_margin(self, symbol: str, amount: float, params={}) -> MarginModification:
2094
2131
  """
2095
2132
  add margin
2096
2133
  :see: https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/exchange-endpoint#update-isolated-margin
@@ -2101,7 +2138,7 @@ class hyperliquid(Exchange, ImplicitAPI):
2101
2138
  """
2102
2139
  return await self.modify_margin_helper(symbol, amount, 'add', params)
2103
2140
 
2104
- async def reduce_margin(self, symbol: str, amount, params={}) -> MarginModification:
2141
+ async def reduce_margin(self, symbol: str, amount: float, params={}) -> MarginModification:
2105
2142
  """
2106
2143
  :see: https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/exchange-endpoint#update-isolated-margin
2107
2144
  remove margin from a position
@@ -88,8 +88,11 @@ class idex(Exchange, ImplicitAPI):
88
88
  'fetchOrderBook': True,
89
89
  'fetchOrders': False,
90
90
  'fetchPosition': False,
91
+ 'fetchPositionHistory': False,
91
92
  'fetchPositionMode': False,
92
93
  'fetchPositions': False,
94
+ 'fetchPositionsForSymbol': False,
95
+ 'fetchPositionsHistory': False,
93
96
  'fetchPositionsRisk': False,
94
97
  'fetchPremiumIndexOHLCV': False,
95
98
  'fetchStatus': True,
@@ -1287,7 +1290,7 @@ class idex(Exchange, ImplicitAPI):
1287
1290
  response = await self.privatePostOrders(request)
1288
1291
  return self.parse_order(response, market)
1289
1292
 
1290
- async def withdraw(self, code: str, amount: float, address, tag=None, params={}):
1293
+ async def withdraw(self, code: str, amount: float, address: str, tag=None, params={}):
1291
1294
  """
1292
1295
  make a withdrawal
1293
1296
  :see: https://api-docs-v3.idex.io/#withdraw-funds
@@ -64,8 +64,11 @@ class independentreserve(Exchange, ImplicitAPI):
64
64
  'fetchOrder': True,
65
65
  'fetchOrderBook': True,
66
66
  'fetchPosition': False,
67
+ 'fetchPositionHistory': False,
67
68
  'fetchPositionMode': False,
68
69
  'fetchPositions': False,
70
+ 'fetchPositionsForSymbol': False,
71
+ 'fetchPositionsHistory': False,
69
72
  'fetchPositionsRisk': False,
70
73
  'fetchPremiumIndexOHLCV': False,
71
74
  'fetchTicker': True,
@@ -78,8 +78,11 @@ class indodax(Exchange, ImplicitAPI):
78
78
  'fetchOrderBook': True,
79
79
  'fetchOrders': False,
80
80
  'fetchPosition': False,
81
+ 'fetchPositionHistory': False,
81
82
  'fetchPositionMode': False,
82
83
  'fetchPositions': False,
84
+ 'fetchPositionsForSymbol': False,
85
+ 'fetchPositionsHistory': False,
83
86
  'fetchPositionsRisk': False,
84
87
  'fetchPremiumIndexOHLCV': False,
85
88
  'fetchTicker': True,
@@ -951,7 +954,7 @@ class indodax(Exchange, ImplicitAPI):
951
954
  transactions = self.array_concat(withdraws, deposits)
952
955
  return self.parse_transactions(transactions, currency, since, limit)
953
956
 
954
- async def withdraw(self, code: str, amount: float, address, tag=None, params={}):
957
+ async def withdraw(self, code: str, amount: float, address: str, tag=None, params={}):
955
958
  """
956
959
  make a withdrawal
957
960
  :see: https://github.com/btcid/indodax-official-api-docs/blob/master/Private-RestAPI.md#withdraw-coin-endpoints
@@ -54,6 +54,7 @@ class kraken(Exchange, ImplicitAPI):
54
54
  'option': False,
55
55
  'addMargin': False,
56
56
  'cancelAllOrders': True,
57
+ 'cancelAllOrdersAfter': True,
57
58
  'cancelOrder': True,
58
59
  'cancelOrders': True,
59
60
  'createDepositAddress': True,
@@ -2006,6 +2007,32 @@ class kraken(Exchange, ImplicitAPI):
2006
2007
  await self.load_markets()
2007
2008
  return await self.privatePostCancelAll(params)
2008
2009
 
2010
+ async def cancel_all_orders_after(self, timeout: Int, params={}):
2011
+ """
2012
+ dead man's switch, cancel all orders after the given timeout
2013
+ :see: https://docs.kraken.com/rest/#tag/Spot-Trading/operation/cancelAllOrdersAfter
2014
+ :param number timeout: time in milliseconds, 0 represents cancel the timer
2015
+ :param dict [params]: extra parameters specific to the exchange API endpoint
2016
+ :returns dict: the api result
2017
+ """
2018
+ if timeout > 86400000:
2019
+ raise BadRequest(self.id + 'cancelAllOrdersAfter timeout should be less than 86400000 milliseconds')
2020
+ await self.load_markets()
2021
+ request: dict = {
2022
+ 'timeout': (self.parse_to_int(timeout / 1000)) if (timeout > 0) else 0,
2023
+ }
2024
+ response = await self.privatePostCancelAllOrdersAfter(self.extend(request, params))
2025
+ #
2026
+ # {
2027
+ # "error": [],
2028
+ # "result": {
2029
+ # "currentTime": "2023-03-24T17:41:56Z",
2030
+ # "triggerTime": "2023-03-24T17:42:56Z"
2031
+ # }
2032
+ # }
2033
+ #
2034
+ return response
2035
+
2009
2036
  async def fetch_open_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
2010
2037
  """
2011
2038
  fetch all unfilled currently open orders
@@ -2495,7 +2522,7 @@ class kraken(Exchange, ImplicitAPI):
2495
2522
  'info': depositAddress,
2496
2523
  }
2497
2524
 
2498
- async def withdraw(self, code: str, amount: float, address, tag=None, params={}):
2525
+ async def withdraw(self, code: str, amount: float, address: str, tag=None, params={}):
2499
2526
  """
2500
2527
  make a withdrawal
2501
2528
  :see: https://docs.kraken.com/rest/#tag/Funding/operation/withdrawFunds
@@ -46,6 +46,7 @@ class krakenfutures(Exchange, ImplicitAPI):
46
46
  'future': True,
47
47
  'option': False,
48
48
  'cancelAllOrders': True,
49
+ 'cancelAllOrdersAfter': True,
49
50
  'cancelOrder': True,
50
51
  'cancelOrders': True,
51
52
  'createMarketOrder': False,
@@ -1207,6 +1208,31 @@ class krakenfutures(Exchange, ImplicitAPI):
1207
1208
  response = await self.privatePostCancelallorders(self.extend(request, params))
1208
1209
  return response
1209
1210
 
1211
+ async def cancel_all_orders_after(self, timeout: Int, params={}):
1212
+ """
1213
+ dead man's switch, cancel all orders after the given timeout
1214
+ :see: https://docs.futures.kraken.com/#http-api-trading-v3-api-order-management-dead-man-39-s-switch
1215
+ :param number timeout: time in milliseconds, 0 represents cancel the timer
1216
+ :param dict [params]: extra parameters specific to the exchange API endpoint
1217
+ :returns dict: the api result
1218
+ """
1219
+ await self.load_markets()
1220
+ request: dict = {
1221
+ 'timeout': (self.parse_to_int(timeout / 1000)) if (timeout > 0) else 0,
1222
+ }
1223
+ response = await self.privatePostCancelallordersafter(self.extend(request, params))
1224
+ #
1225
+ # {
1226
+ # "result": "success",
1227
+ # "serverTime": "2018-06-19T16:51:23.839Z",
1228
+ # "status": {
1229
+ # "currentTime": "2018-06-19T16:51:23.839Z",
1230
+ # "triggerTime": "0"
1231
+ # }
1232
+ # }
1233
+ #
1234
+ return response
1235
+
1210
1236
  async def fetch_open_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
1211
1237
  """
1212
1238
  :see: https://docs.futures.kraken.com/#http-api-trading-v3-api-order-management-get-open-orders
@@ -108,7 +108,9 @@ class kucoin(Exchange, ImplicitAPI):
108
108
  'fetchOrderBooks': False,
109
109
  'fetchOrdersByStatus': True,
110
110
  'fetchOrderTrades': True,
111
+ 'fetchPositionHistory': False,
111
112
  'fetchPositionMode': False,
113
+ 'fetchPositionsHistory': False,
112
114
  'fetchPremiumIndexOHLCV': False,
113
115
  'fetchStatus': True,
114
116
  'fetchTicker': True,
@@ -3004,7 +3006,7 @@ class kucoin(Exchange, ImplicitAPI):
3004
3006
  'tierBased': True,
3005
3007
  }
3006
3008
 
3007
- async def withdraw(self, code: str, amount: float, address, tag=None, params={}):
3009
+ async def withdraw(self, code: str, amount: float, address: str, tag=None, params={}):
3008
3010
  """
3009
3011
  make a withdrawal
3010
3012
  :see: https://www.kucoin.com/docs/rest/funding/withdrawals/apply-withdraw