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.
- ccxt/__init__.py +1 -5
- ccxt/abstract/blofin.py +8 -0
- ccxt/abstract/btcbox.py +1 -0
- ccxt/apex.py +21 -30
- ccxt/ascendex.py +1 -1
- ccxt/async_support/__init__.py +1 -5
- ccxt/async_support/apex.py +21 -30
- ccxt/async_support/ascendex.py +1 -1
- ccxt/async_support/base/exchange.py +26 -3
- ccxt/async_support/base/ws/cache.py +6 -1
- ccxt/async_support/bigone.py +17 -14
- ccxt/async_support/bingx.py +13 -32
- ccxt/async_support/bitfinex.py +61 -48
- ccxt/async_support/bitget.py +7 -4
- ccxt/async_support/bitrue.py +14 -32
- ccxt/async_support/bitso.py +33 -0
- ccxt/async_support/bitstamp.py +33 -0
- ccxt/async_support/blofin.py +145 -14
- ccxt/async_support/btcbox.py +25 -5
- ccxt/async_support/bybit.py +20 -39
- ccxt/async_support/cex.py +2 -4
- ccxt/async_support/coinbase.py +56 -42
- ccxt/async_support/coinbaseexchange.py +141 -32
- ccxt/async_support/coincatch.py +14 -67
- ccxt/async_support/coinex.py +28 -29
- ccxt/async_support/coinlist.py +17 -16
- ccxt/async_support/coinmetro.py +20 -11
- ccxt/async_support/coinone.py +8 -10
- ccxt/async_support/coinsph.py +124 -2
- ccxt/async_support/cryptocom.py +109 -2
- ccxt/async_support/cryptomus.py +42 -80
- ccxt/async_support/delta.py +75 -36
- ccxt/async_support/derive.py +46 -10
- ccxt/async_support/ellipx.py +175 -77
- ccxt/async_support/gate.py +1 -1
- ccxt/async_support/gemini.py +3 -4
- ccxt/async_support/hitbtc.py +56 -65
- ccxt/async_support/htx.py +2 -2
- ccxt/async_support/hyperliquid.py +15 -2
- ccxt/async_support/kraken.py +27 -23
- ccxt/async_support/kucoinfutures.py +5 -0
- ccxt/async_support/lbank.py +1 -1
- ccxt/async_support/okx.py +1 -2
- ccxt/async_support/oxfun.py +21 -1
- ccxt/async_support/paradex.py +120 -4
- ccxt/base/errors.py +6 -0
- ccxt/base/exchange.py +40 -3
- ccxt/base/types.py +3 -0
- ccxt/bigone.py +17 -14
- ccxt/bingx.py +13 -32
- ccxt/bitfinex.py +61 -48
- ccxt/bitget.py +7 -4
- ccxt/bitrue.py +14 -32
- ccxt/bitso.py +33 -0
- ccxt/bitstamp.py +33 -0
- ccxt/blofin.py +145 -14
- ccxt/btcbox.py +24 -5
- ccxt/bybit.py +20 -39
- ccxt/cex.py +2 -4
- ccxt/coinbase.py +56 -42
- ccxt/coinbaseexchange.py +141 -32
- ccxt/coincatch.py +14 -67
- ccxt/coinex.py +28 -29
- ccxt/coinlist.py +17 -16
- ccxt/coinmetro.py +20 -11
- ccxt/coinone.py +8 -10
- ccxt/coinsph.py +124 -2
- ccxt/cryptocom.py +109 -2
- ccxt/cryptomus.py +42 -80
- ccxt/delta.py +75 -36
- ccxt/derive.py +46 -10
- ccxt/ellipx.py +175 -77
- ccxt/gate.py +1 -1
- ccxt/gemini.py +3 -4
- ccxt/hitbtc.py +56 -65
- ccxt/htx.py +2 -2
- ccxt/hyperliquid.py +15 -2
- ccxt/kraken.py +27 -23
- ccxt/kucoinfutures.py +5 -0
- ccxt/lbank.py +1 -1
- ccxt/okx.py +1 -2
- ccxt/oxfun.py +21 -1
- ccxt/paradex.py +120 -4
- ccxt/pro/__init__.py +69 -3
- ccxt/pro/binance.py +31 -33
- ccxt/pro/bithumb.py +5 -3
- ccxt/pro/coinbase.py +1 -1
- ccxt/pro/hyperliquid.py +10 -2
- ccxt/pro/kraken.py +249 -79
- ccxt/pro/mexc.py +252 -7
- ccxt/pro/poloniex.py +6 -2
- {ccxt-4.4.80.dist-info → ccxt-4.4.85.dist-info}/METADATA +7 -11
- {ccxt-4.4.80.dist-info → ccxt-4.4.85.dist-info}/RECORD +96 -104
- ccxt/abstract/bl3p.py +0 -19
- ccxt/abstract/idex.py +0 -26
- ccxt/async_support/base/ws/fast_client.py +0 -97
- ccxt/async_support/bl3p.py +0 -543
- ccxt/async_support/idex.py +0 -1889
- ccxt/bl3p.py +0 -543
- ccxt/idex.py +0 -1889
- ccxt/pro/idex.py +0 -687
- {ccxt-4.4.80.dist-info → ccxt-4.4.85.dist-info}/LICENSE.txt +0 -0
- {ccxt-4.4.80.dist-info → ccxt-4.4.85.dist-info}/WHEEL +0 -0
- {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
|
-
#
|
1718
|
-
#
|
1719
|
-
#
|
1720
|
-
# "status": 'ok',
|
1721
|
-
# "txid": 'OAVXZH-XIE54-JCYYDG'
|
1722
|
-
# }
|
1722
|
+
# {
|
1723
|
+
# "order_id": "OXM2QD-EALR2-YBAVEU"
|
1724
|
+
# }
|
1725
|
+
#
|
1723
1726
|
# ws - editOrder
|
1724
|
-
#
|
1725
|
-
#
|
1726
|
-
#
|
1727
|
-
#
|
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
|
-
|
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 =
|
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
|
1853
|
+
if price is None:
|
1849
1854
|
price = self.safe_string(description, 'price2')
|
1850
|
-
|
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':
|
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.
|
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':
|
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, '
|
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.
|
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',
|