ccxt 4.4.80__py2.py3-none-any.whl → 4.4.85__py2.py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (104) hide show
  1. ccxt/__init__.py +1 -5
  2. ccxt/abstract/blofin.py +8 -0
  3. ccxt/abstract/btcbox.py +1 -0
  4. ccxt/apex.py +21 -30
  5. ccxt/ascendex.py +1 -1
  6. ccxt/async_support/__init__.py +1 -5
  7. ccxt/async_support/apex.py +21 -30
  8. ccxt/async_support/ascendex.py +1 -1
  9. ccxt/async_support/base/exchange.py +26 -3
  10. ccxt/async_support/base/ws/cache.py +6 -1
  11. ccxt/async_support/bigone.py +17 -14
  12. ccxt/async_support/bingx.py +13 -32
  13. ccxt/async_support/bitfinex.py +61 -48
  14. ccxt/async_support/bitget.py +7 -4
  15. ccxt/async_support/bitrue.py +14 -32
  16. ccxt/async_support/bitso.py +33 -0
  17. ccxt/async_support/bitstamp.py +33 -0
  18. ccxt/async_support/blofin.py +145 -14
  19. ccxt/async_support/btcbox.py +25 -5
  20. ccxt/async_support/bybit.py +20 -39
  21. ccxt/async_support/cex.py +2 -4
  22. ccxt/async_support/coinbase.py +56 -42
  23. ccxt/async_support/coinbaseexchange.py +141 -32
  24. ccxt/async_support/coincatch.py +14 -67
  25. ccxt/async_support/coinex.py +28 -29
  26. ccxt/async_support/coinlist.py +17 -16
  27. ccxt/async_support/coinmetro.py +20 -11
  28. ccxt/async_support/coinone.py +8 -10
  29. ccxt/async_support/coinsph.py +124 -2
  30. ccxt/async_support/cryptocom.py +109 -2
  31. ccxt/async_support/cryptomus.py +42 -80
  32. ccxt/async_support/delta.py +75 -36
  33. ccxt/async_support/derive.py +46 -10
  34. ccxt/async_support/ellipx.py +175 -77
  35. ccxt/async_support/gate.py +1 -1
  36. ccxt/async_support/gemini.py +3 -4
  37. ccxt/async_support/hitbtc.py +56 -65
  38. ccxt/async_support/htx.py +2 -2
  39. ccxt/async_support/hyperliquid.py +15 -2
  40. ccxt/async_support/kraken.py +27 -23
  41. ccxt/async_support/kucoinfutures.py +5 -0
  42. ccxt/async_support/lbank.py +1 -1
  43. ccxt/async_support/okx.py +1 -2
  44. ccxt/async_support/oxfun.py +21 -1
  45. ccxt/async_support/paradex.py +120 -4
  46. ccxt/base/errors.py +6 -0
  47. ccxt/base/exchange.py +40 -3
  48. ccxt/base/types.py +3 -0
  49. ccxt/bigone.py +17 -14
  50. ccxt/bingx.py +13 -32
  51. ccxt/bitfinex.py +61 -48
  52. ccxt/bitget.py +7 -4
  53. ccxt/bitrue.py +14 -32
  54. ccxt/bitso.py +33 -0
  55. ccxt/bitstamp.py +33 -0
  56. ccxt/blofin.py +145 -14
  57. ccxt/btcbox.py +24 -5
  58. ccxt/bybit.py +20 -39
  59. ccxt/cex.py +2 -4
  60. ccxt/coinbase.py +56 -42
  61. ccxt/coinbaseexchange.py +141 -32
  62. ccxt/coincatch.py +14 -67
  63. ccxt/coinex.py +28 -29
  64. ccxt/coinlist.py +17 -16
  65. ccxt/coinmetro.py +20 -11
  66. ccxt/coinone.py +8 -10
  67. ccxt/coinsph.py +124 -2
  68. ccxt/cryptocom.py +109 -2
  69. ccxt/cryptomus.py +42 -80
  70. ccxt/delta.py +75 -36
  71. ccxt/derive.py +46 -10
  72. ccxt/ellipx.py +175 -77
  73. ccxt/gate.py +1 -1
  74. ccxt/gemini.py +3 -4
  75. ccxt/hitbtc.py +56 -65
  76. ccxt/htx.py +2 -2
  77. ccxt/hyperliquid.py +15 -2
  78. ccxt/kraken.py +27 -23
  79. ccxt/kucoinfutures.py +5 -0
  80. ccxt/lbank.py +1 -1
  81. ccxt/okx.py +1 -2
  82. ccxt/oxfun.py +21 -1
  83. ccxt/paradex.py +120 -4
  84. ccxt/pro/__init__.py +69 -3
  85. ccxt/pro/binance.py +31 -33
  86. ccxt/pro/bithumb.py +5 -3
  87. ccxt/pro/coinbase.py +1 -1
  88. ccxt/pro/hyperliquid.py +10 -2
  89. ccxt/pro/kraken.py +249 -79
  90. ccxt/pro/mexc.py +252 -7
  91. ccxt/pro/poloniex.py +6 -2
  92. {ccxt-4.4.80.dist-info → ccxt-4.4.85.dist-info}/METADATA +7 -11
  93. {ccxt-4.4.80.dist-info → ccxt-4.4.85.dist-info}/RECORD +96 -104
  94. ccxt/abstract/bl3p.py +0 -19
  95. ccxt/abstract/idex.py +0 -26
  96. ccxt/async_support/base/ws/fast_client.py +0 -97
  97. ccxt/async_support/bl3p.py +0 -543
  98. ccxt/async_support/idex.py +0 -1889
  99. ccxt/bl3p.py +0 -543
  100. ccxt/idex.py +0 -1889
  101. ccxt/pro/idex.py +0 -687
  102. {ccxt-4.4.80.dist-info → ccxt-4.4.85.dist-info}/LICENSE.txt +0 -0
  103. {ccxt-4.4.80.dist-info → ccxt-4.4.85.dist-info}/WHEEL +0 -0
  104. {ccxt-4.4.80.dist-info → ccxt-4.4.85.dist-info}/top_level.txt +0 -0
ccxt/kraken.py CHANGED
@@ -1616,6 +1616,8 @@ class kraken(Exchange, ImplicitAPI):
1616
1616
  'volume': self.amount_to_precision(symbol, amount),
1617
1617
  }
1618
1618
  orderRequest = self.order_request('createOrder', symbol, type, request, amount, price, params)
1619
+ flags = self.safe_string(orderRequest[0], 'oflags', '')
1620
+ isUsingCost = flags.find('viqc') > -1
1619
1621
  response = self.privatePostAddOrder(self.extend(orderRequest[0], orderRequest[1]))
1620
1622
  #
1621
1623
  # {
@@ -1627,6 +1629,10 @@ class kraken(Exchange, ImplicitAPI):
1627
1629
  # }
1628
1630
  #
1629
1631
  result = self.safe_dict(response, 'result')
1632
+ result['usingCost'] = isUsingCost
1633
+ # it's impossible to know if the order was created using cost or base currency
1634
+ # becuase kraken only returns something like self: {order: 'buy 10.00000000 LTCUSD @ market'}
1635
+ # self usingCost flag is used to help the parsing but omited from the order
1630
1636
  return self.parse_order(result)
1631
1637
 
1632
1638
  def find_market_by_altname_or_id(self, id):
@@ -1713,22 +1719,15 @@ class kraken(Exchange, ImplicitAPI):
1713
1719
  # }
1714
1720
  #
1715
1721
  # ws - createOrder
1716
- # {
1717
- # "descr": 'sell 0.00010000 XBTUSDT @ market',
1718
- # "event": 'addOrderStatus',
1719
- # "reqid": 1,
1720
- # "status": 'ok',
1721
- # "txid": 'OAVXZH-XIE54-JCYYDG'
1722
- # }
1722
+ # {
1723
+ # "order_id": "OXM2QD-EALR2-YBAVEU"
1724
+ # }
1725
+ #
1723
1726
  # ws - editOrder
1724
- # {
1725
- # "descr": "order edited price = 9000.00000000",
1726
- # "event": "editOrderStatus",
1727
- # "originaltxid": "O65KZW-J4AW3-VFS74A",
1728
- # "reqid": 3,
1729
- # "status": "ok",
1730
- # "txid": "OTI672-HJFAO-XOIPPK"
1731
- # }
1727
+ # {
1728
+ # "amend_id": "TJSMEH-AA67V-YUSQ6O",
1729
+ # "order_id": "OXM2QD-EALR2-YBAVEU"
1730
+ # }
1732
1731
  #
1733
1732
  # {
1734
1733
  # "error": [],
@@ -1796,6 +1795,8 @@ class kraken(Exchange, ImplicitAPI):
1796
1795
  # "oflags": "fciq"
1797
1796
  # }
1798
1797
  #
1798
+ isUsingCost = self.safe_bool(order, 'usingCost', False)
1799
+ order = self.omit(order, 'usingCost')
1799
1800
  description = self.safe_dict(order, 'descr', {})
1800
1801
  orderDescriptionObj = self.safe_dict(order, 'descr') # can be null
1801
1802
  orderDescription = None
@@ -1808,11 +1809,15 @@ class kraken(Exchange, ImplicitAPI):
1808
1809
  marketId = None
1809
1810
  price = None
1810
1811
  amount = None
1812
+ cost = None
1811
1813
  triggerPrice = None
1812
1814
  if orderDescription is not None:
1813
1815
  parts = orderDescription.split(' ')
1814
1816
  side = self.safe_string(parts, 0)
1815
- amount = self.safe_string(parts, 1)
1817
+ if not isUsingCost:
1818
+ amount = self.safe_string(parts, 1)
1819
+ else:
1820
+ cost = self.safe_string(parts, 1)
1816
1821
  marketId = self.safe_string(parts, 2)
1817
1822
  part4 = self.safe_string(parts, 4)
1818
1823
  part5 = self.safe_string(parts, 5)
@@ -1842,13 +1847,12 @@ class kraken(Exchange, ImplicitAPI):
1842
1847
  # kraken truncates the cost in the api response so we will ignore it and calculate it from average & filled
1843
1848
  # cost = self.safe_string(order, 'cost')
1844
1849
  price = self.safe_string(description, 'price', price)
1845
- # when type = trailling stop returns price = '+50.0000%'
1846
- if (price is not None) and price.endswith('%'):
1850
+ # when type = trailing stop returns price = '+50.0000%'
1851
+ if (price is not None) and (price.endswith('%') or Precise.string_equals(price, '0.00000') or Precise.string_equals(price, '0')):
1847
1852
  price = None # self is not the price we want
1848
- if (price is None) or Precise.string_equals(price, '0'):
1853
+ if price is None:
1849
1854
  price = self.safe_string(description, 'price2')
1850
- if (price is None) or Precise.string_equals(price, '0'):
1851
- price = self.safe_string(order, 'price', price)
1855
+ price = self.safe_string_2(order, 'limitprice', 'price', price)
1852
1856
  flags = self.safe_string(order, 'oflags', '')
1853
1857
  isPostOnly = flags.find('post') > -1
1854
1858
  average = self.safe_number(order, 'price')
@@ -1865,7 +1869,7 @@ class kraken(Exchange, ImplicitAPI):
1865
1869
  elif flags.find('fcib') >= 0:
1866
1870
  fee['currency'] = market['base']
1867
1871
  status = self.parse_order_status(self.safe_string(order, 'status'))
1868
- id = self.safe_string_n(order, ['id', 'txid', 'amend_id'])
1872
+ id = self.safe_string_n(order, ['id', 'txid', 'order_id', 'amend_id'])
1869
1873
  if (id is None) or (id.startswith('[')):
1870
1874
  txid = self.safe_list(order, 'txid')
1871
1875
  id = self.safe_string(txid, 0)
@@ -1922,7 +1926,7 @@ class kraken(Exchange, ImplicitAPI):
1922
1926
  'triggerPrice': triggerPrice,
1923
1927
  'takeProfitPrice': takeProfitPrice,
1924
1928
  'stopLossPrice': stopLossPrice,
1925
- 'cost': None,
1929
+ 'cost': cost,
1926
1930
  'amount': amount,
1927
1931
  'filled': filled,
1928
1932
  'average': average,
ccxt/kucoinfutures.py CHANGED
@@ -1510,6 +1510,7 @@ class kucoinfutures(kucoin, ImplicitAPI):
1510
1510
  :param str [params.timeInForce]: GTC, GTT, IOC, or FOK, default is GTC, limit orders only
1511
1511
  :param str [params.postOnly]: Post only flag, invalid when timeInForce is IOC or FOK
1512
1512
  :param float [params.cost]: the cost of the order in units of USDT
1513
+ :param str [params.marginMode]: 'cross' or 'isolated', default is 'isolated'
1513
1514
  ----------------- Exchange Specific Parameters -----------------
1514
1515
  :param float [params.leverage]: Leverage size of the order(mandatory param in request, default is 1)
1515
1516
  :param str [params.clientOid]: client order id, defaults to uuid if not passed
@@ -1607,6 +1608,10 @@ class kucoinfutures(kucoin, ImplicitAPI):
1607
1608
  'type': type, # limit or market
1608
1609
  'leverage': 1,
1609
1610
  }
1611
+ marginModeUpper = self.safe_string_upper(params, 'marginMode')
1612
+ if marginModeUpper is not None:
1613
+ params = self.omit(params, 'marginMode')
1614
+ request['marginMode'] = marginModeUpper
1610
1615
  cost = self.safe_string(params, 'cost')
1611
1616
  params = self.omit(params, 'cost')
1612
1617
  if cost is not None:
ccxt/lbank.py CHANGED
@@ -875,7 +875,7 @@ class lbank(Exchange, ImplicitAPI):
875
875
  timestamp = self.milliseconds()
876
876
  if market['swap']:
877
877
  return self.parse_order_book(orderbook, market['symbol'], timestamp, 'bids', 'asks', 'price', 'volume')
878
- return self.parse_order_book(orderbook, market['symbol'], timestamp)
878
+ return self.parse_order_book(orderbook, market['symbol'], timestamp, 'bids', 'asks', 1, 0)
879
879
 
880
880
  def parse_trade(self, trade: dict, market: Market = None) -> Trade:
881
881
  #
ccxt/okx.py CHANGED
@@ -1647,7 +1647,6 @@ class okx(Exchange, ImplicitAPI):
1647
1647
  ymd = self.yymmdd(expiry)
1648
1648
  symbol = symbol + '-' + ymd + '-' + strikePrice + '-' + optionType
1649
1649
  optionType = 'put' if (optionType == 'P') else 'call'
1650
- tickSize = self.safe_string(market, 'tickSz')
1651
1650
  fees = self.safe_dict_2(self.fees, type, 'trading', {})
1652
1651
  maxLeverage = self.safe_string(market, 'lever', '1')
1653
1652
  maxLeverage = Precise.string_max(maxLeverage, '1')
@@ -1679,7 +1678,7 @@ class okx(Exchange, ImplicitAPI):
1679
1678
  'created': self.safe_integer(market, 'listTime'),
1680
1679
  'precision': {
1681
1680
  'amount': self.safe_number(market, 'lotSz'),
1682
- 'price': self.parse_number(tickSize),
1681
+ 'price': self.safe_number(market, 'tickSz'),
1683
1682
  },
1684
1683
  'limits': {
1685
1684
  'leverage': {
ccxt/oxfun.py CHANGED
@@ -83,7 +83,7 @@ class oxfun(Exchange, ImplicitAPI):
83
83
  'fetchDepositWithdrawFee': False,
84
84
  'fetchDepositWithdrawFees': False,
85
85
  'fetchFundingHistory': True,
86
- 'fetchFundingRate': 'emulated',
86
+ 'fetchFundingRate': True,
87
87
  'fetchFundingRateHistory': True,
88
88
  'fetchFundingRates': True,
89
89
  'fetchIndexOHLCV': False,
@@ -1103,6 +1103,26 @@ class oxfun(Exchange, ImplicitAPI):
1103
1103
  data = self.safe_list(response, 'data', [])
1104
1104
  return self.parse_funding_rates(data, symbols)
1105
1105
 
1106
+ def fetch_funding_rate(self, symbol: str, params={}) -> FundingRate:
1107
+ """
1108
+ fetch the current funding rates for a symbol
1109
+
1110
+ https://docs.ox.fun/?json#get-v3-funding-estimates
1111
+
1112
+ :param str symbol: unified market symbols
1113
+ :param dict [params]: extra parameters specific to the exchange API endpoint
1114
+ :returns Order[]: an array of `funding rate structures <https://docs.ccxt.com/#/?id=funding-rate-structure>`
1115
+ """
1116
+ self.load_markets()
1117
+ request: dict = {
1118
+ 'marketCode': self.market_id(symbol),
1119
+ }
1120
+ response = self.publicGetV3FundingEstimates(self.extend(request, params))
1121
+ #
1122
+ data = self.safe_list(response, 'data', [])
1123
+ first = self.safe_dict(data, 0, {})
1124
+ return self.parse_funding_rate(first, self.market(symbol))
1125
+
1106
1126
  def parse_funding_rate(self, fundingRate, market: Market = None) -> FundingRate:
1107
1127
  #
1108
1128
  # {
ccxt/paradex.py CHANGED
@@ -5,7 +5,7 @@
5
5
 
6
6
  from ccxt.base.exchange import Exchange
7
7
  from ccxt.abstract.paradex import ImplicitAPI
8
- from ccxt.base.types import Any, Balances, Currency, Int, Leverage, MarginMode, Market, Num, Order, OrderBook, OrderSide, OrderType, Position, Str, Strings, Ticker, Tickers, Trade, Transaction
8
+ from ccxt.base.types import Any, Balances, Currency, Greeks, Int, Leverage, MarginMode, Market, Num, Order, OrderBook, OrderSide, OrderType, Position, Str, Strings, Ticker, Tickers, Trade, Transaction
9
9
  from typing import List
10
10
  from ccxt.base.errors import ExchangeError
11
11
  from ccxt.base.errors import AuthenticationError
@@ -75,6 +75,7 @@ class paradex(Exchange, ImplicitAPI):
75
75
  'fetchFundingRate': False,
76
76
  'fetchFundingRateHistory': False,
77
77
  'fetchFundingRates': False,
78
+ 'fetchGreeks': True,
78
79
  'fetchIndexOHLCV': False,
79
80
  'fetchIsolatedBorrowRate': False,
80
81
  'fetchIsolatedBorrowRates': False,
@@ -558,13 +559,14 @@ class paradex(Exchange, ImplicitAPI):
558
559
  expiry = self.safe_integer(market, 'expiry_at')
559
560
  optionType = self.safe_string(market, 'option_type')
560
561
  strikePrice = self.safe_string(market, 'strike_price')
562
+ takerFee = self.parse_number('0.0003')
563
+ makerFee = self.parse_number('-0.00005')
561
564
  if isOption:
562
565
  optionTypeSuffix = 'C' if (optionType == 'CALL') else 'P'
563
566
  symbol = symbol + '-' + strikePrice + '-' + optionTypeSuffix
567
+ makerFee = self.parse_number('0.0003')
564
568
  else:
565
569
  expiry = None
566
- takerFee = self.parse_number('0.0003')
567
- makerFee = self.parse_number('-0.00005')
568
570
  return self.safe_market_structure({
569
571
  'id': marketId,
570
572
  'symbol': symbol,
@@ -1262,7 +1264,7 @@ class paradex(Exchange, ImplicitAPI):
1262
1264
  'status': self.parse_order_status(status),
1263
1265
  'symbol': symbol,
1264
1266
  'type': self.parse_order_type(orderType),
1265
- 'timeInForce': self.parse_time_in_force(self.safe_string(order, 'instrunction')),
1267
+ 'timeInForce': self.parse_time_in_force(self.safe_string(order, 'instruction')),
1266
1268
  'postOnly': None,
1267
1269
  'reduceOnly': reduceOnly,
1268
1270
  'side': side,
@@ -2284,6 +2286,120 @@ class paradex(Exchange, ImplicitAPI):
2284
2286
  }
2285
2287
  return self.privatePostAccountMarginMarket(self.extend(request, params))
2286
2288
 
2289
+ def fetch_greeks(self, symbol: str, params={}) -> Greeks:
2290
+ """
2291
+ fetches an option contracts greeks, financial metrics used to measure the factors that affect the price of an options contract
2292
+
2293
+ https://docs.api.testnet.paradex.trade/#list-available-markets-summary
2294
+
2295
+ :param str symbol: unified symbol of the market to fetch greeks for
2296
+ :param dict [params]: extra parameters specific to the exchange API endpoint
2297
+ :returns dict: a `greeks structure <https://docs.ccxt.com/#/?id=greeks-structure>`
2298
+ """
2299
+ self.load_markets()
2300
+ market = self.market(symbol)
2301
+ request: dict = {
2302
+ 'market': market['id'],
2303
+ }
2304
+ response = self.publicGetMarketsSummary(self.extend(request, params))
2305
+ #
2306
+ # {
2307
+ # "results": [
2308
+ # {
2309
+ # "symbol": "BTC-USD-114000-P",
2310
+ # "mark_price": "10835.66892602",
2311
+ # "mark_iv": "0.71781855",
2312
+ # "delta": "-0.98726024",
2313
+ # "greeks": {
2314
+ # "delta": "-0.9872602390817709",
2315
+ # "gamma": "0.000004560958862297231",
2316
+ # "vega": "227.11344863639806",
2317
+ # "rho": "-302.0617972461581",
2318
+ # "vanna": "0.06609830491614832",
2319
+ # "volga": "925.9501532805552"
2320
+ # },
2321
+ # "last_traded_price": "10551.5",
2322
+ # "bid": "10794.9",
2323
+ # "bid_iv": "0.05",
2324
+ # "ask": "10887.3",
2325
+ # "ask_iv": "0.8783283",
2326
+ # "last_iv": "0.05",
2327
+ # "volume_24h": "0",
2328
+ # "total_volume": "195240.72672261014",
2329
+ # "created_at": 1747644009995,
2330
+ # "underlying_price": "103164.79162649",
2331
+ # "open_interest": "0",
2332
+ # "funding_rate": "0.000004464241170536191",
2333
+ # "price_change_rate_24h": "0.074915",
2334
+ # "future_funding_rate": "0.0001"
2335
+ # }
2336
+ # ]
2337
+ # }
2338
+ #
2339
+ data = self.safe_list(response, 'results', [])
2340
+ greeks = self.safe_dict(data, 0, {})
2341
+ return self.parse_greeks(greeks, market)
2342
+
2343
+ def parse_greeks(self, greeks: dict, market: Market = None) -> Greeks:
2344
+ #
2345
+ # {
2346
+ # "symbol": "BTC-USD-114000-P",
2347
+ # "mark_price": "10835.66892602",
2348
+ # "mark_iv": "0.71781855",
2349
+ # "delta": "-0.98726024",
2350
+ # "greeks": {
2351
+ # "delta": "-0.9872602390817709",
2352
+ # "gamma": "0.000004560958862297231",
2353
+ # "vega": "227.11344863639806",
2354
+ # "rho": "-302.0617972461581",
2355
+ # "vanna": "0.06609830491614832",
2356
+ # "volga": "925.9501532805552"
2357
+ # },
2358
+ # "last_traded_price": "10551.5",
2359
+ # "bid": "10794.9",
2360
+ # "bid_iv": "0.05",
2361
+ # "ask": "10887.3",
2362
+ # "ask_iv": "0.8783283",
2363
+ # "last_iv": "0.05",
2364
+ # "volume_24h": "0",
2365
+ # "total_volume": "195240.72672261014",
2366
+ # "created_at": 1747644009995,
2367
+ # "underlying_price": "103164.79162649",
2368
+ # "open_interest": "0",
2369
+ # "funding_rate": "0.000004464241170536191",
2370
+ # "price_change_rate_24h": "0.074915",
2371
+ # "future_funding_rate": "0.0001"
2372
+ # }
2373
+ #
2374
+ marketId = self.safe_string(greeks, 'symbol')
2375
+ market = self.safe_market(marketId, market, None, 'option')
2376
+ symbol = market['symbol']
2377
+ timestamp = self.safe_integer(greeks, 'created_at')
2378
+ greeksData = self.safe_dict(greeks, 'greeks', {})
2379
+ return {
2380
+ 'symbol': symbol,
2381
+ 'timestamp': timestamp,
2382
+ 'datetime': self.iso8601(timestamp),
2383
+ 'delta': self.safe_number(greeksData, 'delta'),
2384
+ 'gamma': self.safe_number(greeksData, 'gamma'),
2385
+ 'theta': None,
2386
+ 'vega': self.safe_number(greeksData, 'vega'),
2387
+ 'rho': self.safe_number(greeksData, 'rho'),
2388
+ 'vanna': self.safe_number(greeksData, 'vanna'),
2389
+ 'volga': self.safe_number(greeksData, 'volga'),
2390
+ 'bidSize': None,
2391
+ 'askSize': None,
2392
+ 'bidImpliedVolatility': self.safe_number(greeks, 'bid_iv'),
2393
+ 'askImpliedVolatility': self.safe_number(greeks, 'ask_iv'),
2394
+ 'markImpliedVolatility': self.safe_number(greeks, 'mark_iv'),
2395
+ 'bidPrice': self.safe_number(greeks, 'bid'),
2396
+ 'askPrice': self.safe_number(greeks, 'ask'),
2397
+ 'markPrice': self.safe_number(greeks, 'mark_price'),
2398
+ 'lastPrice': self.safe_number(greeks, 'last_traded_price'),
2399
+ 'underlyingPrice': self.safe_number(greeks, 'underlying_price'),
2400
+ 'info': greeks,
2401
+ }
2402
+
2287
2403
  def sign(self, path, api='public', method='GET', params={}, headers=None, body=None):
2288
2404
  url = self.implode_hostname(self.urls['api'][self.version]) + '/' + self.implode_params(path, params)
2289
2405
  query = self.omit(params, self.extract_params(path))
ccxt/pro/__init__.py CHANGED
@@ -4,13 +4,81 @@
4
4
 
5
5
  # ----------------------------------------------------------------------------
6
6
 
7
- __version__ = '4.4.80'
7
+ __version__ = '4.4.85'
8
8
 
9
9
  # ----------------------------------------------------------------------------
10
10
 
11
11
  from ccxt.async_support.base.exchange import Exchange # noqa: F401
12
12
 
13
13
  # CCXT Pro exchanges (now this is mainly used for importing exchanges in WS tests)
14
+
15
+ # DO_NOT_REMOVE__ERROR_IMPORTS_START
16
+ from ccxt.base.errors import BaseError # noqa: F401
17
+ from ccxt.base.errors import ExchangeError # noqa: F401
18
+ from ccxt.base.errors import AuthenticationError # noqa: F401
19
+ from ccxt.base.errors import PermissionDenied # noqa: F401
20
+ from ccxt.base.errors import AccountNotEnabled # noqa: F401
21
+ from ccxt.base.errors import AccountSuspended # noqa: F401
22
+ from ccxt.base.errors import ArgumentsRequired # noqa: F401
23
+ from ccxt.base.errors import BadRequest # noqa: F401
24
+ from ccxt.base.errors import BadSymbol # noqa: F401
25
+ from ccxt.base.errors import OperationRejected # noqa: F401
26
+ from ccxt.base.errors import NoChange # noqa: F401
27
+ from ccxt.base.errors import MarginModeAlreadySet # noqa: F401
28
+ from ccxt.base.errors import MarketClosed # noqa: F401
29
+ from ccxt.base.errors import ManualInteractionNeeded # noqa: F401
30
+ from ccxt.base.errors import InsufficientFunds # noqa: F401
31
+ from ccxt.base.errors import InvalidAddress # noqa: F401
32
+ from ccxt.base.errors import AddressPending # noqa: F401
33
+ from ccxt.base.errors import InvalidOrder # noqa: F401
34
+ from ccxt.base.errors import OrderNotFound # noqa: F401
35
+ from ccxt.base.errors import OrderNotCached # noqa: F401
36
+ from ccxt.base.errors import OrderImmediatelyFillable # noqa: F401
37
+ from ccxt.base.errors import OrderNotFillable # noqa: F401
38
+ from ccxt.base.errors import DuplicateOrderId # noqa: F401
39
+ from ccxt.base.errors import ContractUnavailable # noqa: F401
40
+ from ccxt.base.errors import NotSupported # noqa: F401
41
+ from ccxt.base.errors import InvalidProxySettings # noqa: F401
42
+ from ccxt.base.errors import ExchangeClosedByUser # noqa: F401
43
+ from ccxt.base.errors import OperationFailed # noqa: F401
44
+ from ccxt.base.errors import NetworkError # noqa: F401
45
+ from ccxt.base.errors import DDoSProtection # noqa: F401
46
+ from ccxt.base.errors import RateLimitExceeded # noqa: F401
47
+ from ccxt.base.errors import ExchangeNotAvailable # noqa: F401
48
+ from ccxt.base.errors import OnMaintenance # noqa: F401
49
+ from ccxt.base.errors import InvalidNonce # noqa: F401
50
+ from ccxt.base.errors import ChecksumError # noqa: F401
51
+ from ccxt.base.errors import RequestTimeout # noqa: F401
52
+ from ccxt.base.errors import BadResponse # noqa: F401
53
+ from ccxt.base.errors import NullResponse # noqa: F401
54
+ from ccxt.base.errors import CancelPending # noqa: F401
55
+ from ccxt.base.errors import UnsubscribeError # noqa: F401
56
+ from ccxt.base.errors import error_hierarchy # noqa: F401
57
+ # DO_NOT_REMOVE__ERROR_IMPORTS_END
58
+
59
+
60
+
61
+
62
+
63
+
64
+
65
+
66
+
67
+
68
+
69
+
70
+
71
+
72
+
73
+
74
+
75
+
76
+
77
+
78
+
79
+
80
+
81
+
14
82
 
15
83
  from ccxt.pro.alpaca import alpaca # noqa: F401
16
84
  from ccxt.pro.apex import apex # noqa: F401
@@ -57,7 +125,6 @@ from ccxt.pro.htx import htx # noqa
57
125
  from ccxt.pro.huobi import huobi # noqa: F401
58
126
  from ccxt.pro.huobijp import huobijp # noqa: F401
59
127
  from ccxt.pro.hyperliquid import hyperliquid # noqa: F401
60
- from ccxt.pro.idex import idex # noqa: F401
61
128
  from ccxt.pro.independentreserve import independentreserve # noqa: F401
62
129
  from ccxt.pro.kraken import kraken # noqa: F401
63
130
  from ccxt.pro.krakenfutures import krakenfutures # noqa: F401
@@ -131,7 +198,6 @@ exchanges = [
131
198
  'huobi',
132
199
  'huobijp',
133
200
  'hyperliquid',
134
- 'idex',
135
201
  'independentreserve',
136
202
  'kraken',
137
203
  'krakenfutures',