ccxt-ir 4.3.46.0.2__py2.py3-none-any.whl → 4.5.0__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 +39 -35
- ccxt/abantether.py +9 -9
- ccxt/abstract/alpaca.py +4 -0
- ccxt/abstract/apex.py +31 -0
- ccxt/abstract/bigone.py +1 -1
- ccxt/abstract/binance.py +106 -48
- ccxt/abstract/binancecoinm.py +106 -48
- ccxt/abstract/binanceus.py +141 -83
- ccxt/abstract/binanceusdm.py +106 -48
- ccxt/abstract/bingx.py +50 -1
- ccxt/abstract/bitbank.py +5 -0
- ccxt/abstract/bitfinex.py +136 -65
- ccxt/abstract/bitflyer.py +1 -0
- ccxt/abstract/bitget.py +67 -0
- ccxt/abstract/bitmart.py +19 -1
- ccxt/abstract/bitopro.py +1 -0
- ccxt/abstract/bitrue.py +68 -68
- ccxt/abstract/bitstamp.py +1 -0
- ccxt/abstract/blofin.py +30 -0
- ccxt/abstract/btcbox.py +2 -0
- ccxt/abstract/bybit.py +28 -13
- ccxt/abstract/cex.py +28 -29
- ccxt/abstract/coinbaseexchange.py +1 -0
- ccxt/abstract/coinbaseinternational.py +1 -1
- ccxt/abstract/cryptocom.py +16 -0
- ccxt/abstract/cryptomus.py +20 -0
- ccxt/abstract/defx.py +69 -0
- ccxt/abstract/deribit.py +1 -0
- ccxt/abstract/derive.py +117 -0
- ccxt/abstract/digifinex.py +1 -0
- ccxt/abstract/ellipx.py +25 -0
- ccxt/abstract/foxbit.py +26 -0
- ccxt/abstract/gate.py +19 -0
- ccxt/abstract/gateio.py +19 -0
- ccxt/abstract/gemini.py +1 -0
- ccxt/abstract/hibachi.py +26 -0
- ccxt/abstract/hyperliquid.py +1 -1
- ccxt/abstract/independentreserve.py +6 -0
- ccxt/abstract/kraken.py +1 -0
- ccxt/abstract/krakenfutures.py +4 -0
- ccxt/abstract/kucoin.py +10 -0
- ccxt/abstract/kucoinfutures.py +18 -0
- ccxt/abstract/lbank.py +2 -1
- ccxt/abstract/luno.py +1 -0
- ccxt/abstract/mexc.py +2 -0
- ccxt/abstract/modetrade.py +119 -0
- ccxt/abstract/myokx.py +349 -0
- ccxt/abstract/oceanex.py +5 -0
- ccxt/abstract/okx.py +25 -0
- ccxt/abstract/okxus.py +349 -0
- ccxt/abstract/onetrading.py +0 -12
- ccxt/abstract/paradex.py +23 -0
- ccxt/abstract/phemex.py +2 -0
- ccxt/abstract/poloniex.py +36 -0
- ccxt/abstract/tradeogre.py +3 -1
- ccxt/abstract/upbit.py +51 -34
- ccxt/abstract/whitebit.py +16 -0
- ccxt/abstract/woo.py +64 -6
- ccxt/abstract/xt.py +10 -5
- ccxt/afratether.py +7 -7
- ccxt/alpaca.py +828 -51
- ccxt/apex.py +1875 -0
- ccxt/arzinja.py +7 -7
- ccxt/arzplus.py +9 -9
- ccxt/ascendex.py +501 -306
- ccxt/async_support/__init__.py +39 -35
- ccxt/async_support/abantether.py +10 -10
- ccxt/async_support/afratether.py +9 -9
- ccxt/async_support/alpaca.py +828 -51
- ccxt/async_support/apex.py +1875 -0
- ccxt/async_support/arzinja.py +10 -10
- ccxt/async_support/arzplus.py +12 -12
- ccxt/async_support/ascendex.py +502 -306
- ccxt/async_support/base/exchange.py +303 -89
- ccxt/async_support/base/ws/cache.py +9 -3
- ccxt/async_support/base/ws/client.py +173 -38
- ccxt/async_support/base/ws/future.py +25 -37
- ccxt/async_support/bequant.py +5 -3
- ccxt/async_support/bigone.py +279 -144
- ccxt/async_support/binance.py +2347 -1158
- ccxt/async_support/binancecoinm.py +9 -3
- ccxt/async_support/binanceus.py +17 -3
- ccxt/async_support/binanceusdm.py +9 -4
- ccxt/async_support/bingx.py +2962 -920
- ccxt/async_support/bit2c.py +147 -27
- ccxt/async_support/bitbank.py +151 -23
- ccxt/async_support/bitbns.py +104 -30
- ccxt/async_support/bitfinex.py +3291 -1113
- ccxt/async_support/bitflyer.py +202 -27
- ccxt/async_support/bitget.py +3683 -1538
- ccxt/async_support/bithumb.py +195 -38
- ccxt/async_support/bitimen.py +12 -12
- ccxt/async_support/bitir.py +38 -38
- ccxt/async_support/bitmart.py +1288 -350
- ccxt/async_support/bitmex.py +260 -75
- ccxt/async_support/bitopro.py +262 -62
- ccxt/async_support/bitpin.py +17 -16
- ccxt/async_support/bitrue.py +459 -290
- ccxt/async_support/bitso.py +199 -54
- ccxt/async_support/bitstamp.py +230 -96
- ccxt/async_support/bitteam.py +167 -25
- ccxt/async_support/{huobijp.py → bittrade.py} +158 -30
- ccxt/async_support/bitvavo.py +213 -49
- ccxt/async_support/blockchaincom.py +160 -46
- ccxt/async_support/blofin.py +502 -120
- ccxt/async_support/btcalpha.py +169 -31
- ccxt/async_support/btcbox.py +292 -23
- ccxt/async_support/btcmarkets.py +211 -58
- ccxt/async_support/btcturk.py +161 -38
- ccxt/async_support/bybit.py +1775 -1030
- ccxt/async_support/cex.py +1440 -1303
- ccxt/async_support/coinbase.py +724 -212
- ccxt/async_support/coinbaseadvanced.py +2 -1
- ccxt/async_support/coinbaseexchange.py +388 -89
- ccxt/async_support/coinbaseinternational.py +412 -57
- ccxt/async_support/coincatch.py +177 -78
- ccxt/async_support/coincheck.py +135 -19
- ccxt/async_support/coinex.py +606 -232
- ccxt/async_support/coinmate.py +189 -63
- ccxt/async_support/coinmetro.py +195 -54
- ccxt/async_support/coinone.py +158 -51
- ccxt/async_support/coinsph.py +336 -61
- ccxt/async_support/coinspot.py +151 -52
- ccxt/async_support/cryptocom.py +661 -111
- ccxt/async_support/cryptomus.py +1137 -0
- ccxt/async_support/defx.py +2071 -0
- ccxt/async_support/delta.py +299 -99
- ccxt/async_support/deribit.py +348 -126
- ccxt/async_support/derive.py +2572 -0
- ccxt/async_support/digifinex.py +430 -214
- ccxt/async_support/ellipx.py +2029 -0
- ccxt/async_support/eterex.py +10 -10
- ccxt/async_support/excoino.py +31 -31
- ccxt/async_support/exir.py +14 -14
- ccxt/async_support/exmo.py +344 -131
- ccxt/async_support/exnovin.py +10 -10
- ccxt/async_support/farhadexchange.py +12 -12
- ccxt/async_support/fmfwio.py +2 -1
- ccxt/async_support/foxbit.py +1935 -0
- ccxt/async_support/gate.py +1351 -529
- ccxt/async_support/gateio.py +2 -1
- ccxt/async_support/gemini.py +144 -39
- ccxt/async_support/hashkey.py +152 -109
- ccxt/async_support/hibachi.py +2080 -0
- ccxt/async_support/hitbtc.py +395 -167
- ccxt/async_support/hitobit.py +12 -12
- ccxt/async_support/hollaex.py +307 -119
- ccxt/async_support/htx.py +851 -383
- ccxt/async_support/huobi.py +2 -1
- ccxt/async_support/hyperliquid.py +1848 -536
- ccxt/async_support/independentreserve.py +288 -15
- ccxt/async_support/indodax.py +190 -33
- ccxt/async_support/jibitex.py +12 -12
- ccxt/async_support/kraken.py +795 -351
- ccxt/async_support/krakenfutures.py +214 -62
- ccxt/async_support/kucoin.py +715 -396
- ccxt/async_support/kucoinfutures.py +652 -89
- ccxt/async_support/latoken.py +217 -113
- ccxt/async_support/lbank.py +425 -97
- ccxt/async_support/luno.py +382 -35
- ccxt/async_support/mercado.py +113 -6
- ccxt/async_support/mexc.py +874 -437
- ccxt/async_support/modetrade.py +2818 -0
- ccxt/async_support/myokx.py +54 -0
- ccxt/async_support/ndax.py +221 -64
- ccxt/async_support/nobitex.py +31 -37
- ccxt/async_support/novadax.py +190 -34
- ccxt/async_support/oceanex.py +217 -28
- ccxt/async_support/okcoin.py +253 -145
- ccxt/async_support/okexchange.py +11 -11
- ccxt/async_support/okx.py +1088 -351
- ccxt/async_support/okxus.py +54 -0
- ccxt/async_support/ompfinex.py +25 -24
- ccxt/async_support/onetrading.py +213 -392
- ccxt/async_support/oxfun.py +245 -166
- ccxt/async_support/p2b.py +151 -29
- ccxt/async_support/paradex.py +562 -49
- ccxt/async_support/paymium.py +82 -19
- ccxt/async_support/phemex.py +713 -172
- ccxt/async_support/poloniex.py +1602 -283
- ccxt/async_support/probit.py +224 -95
- ccxt/async_support/ramzinex.py +30 -27
- ccxt/async_support/sarmayex.py +9 -9
- ccxt/async_support/sarrafex.py +13 -13
- ccxt/async_support/tabdeal.py +14 -13
- ccxt/async_support/tetherland.py +9 -9
- ccxt/async_support/timex.py +210 -51
- ccxt/async_support/tokocrypto.py +167 -47
- ccxt/async_support/tradeogre.py +266 -31
- ccxt/async_support/twox.py +9 -9
- ccxt/async_support/ubitex.py +12 -12
- ccxt/async_support/upbit.py +568 -165
- ccxt/async_support/vertex.py +160 -32
- ccxt/async_support/wallex.py +12 -12
- ccxt/async_support/wavesexchange.py +165 -30
- ccxt/async_support/whitebit.py +975 -127
- ccxt/async_support/woo.py +1918 -1016
- ccxt/async_support/woofipro.py +433 -141
- ccxt/async_support/xt.py +649 -193
- ccxt/async_support/yobit.py +195 -70
- ccxt/async_support/zaif.py +91 -15
- ccxt/async_support/zonda.py +151 -36
- ccxt/base/decimal_to_precision.py +14 -10
- ccxt/base/errors.py +49 -18
- ccxt/base/exchange.py +1556 -450
- ccxt/base/precise.py +10 -0
- ccxt/base/types.py +114 -6
- ccxt/bequant.py +5 -3
- ccxt/bigone.py +279 -144
- ccxt/binance.py +2347 -1158
- ccxt/binancecoinm.py +9 -3
- ccxt/binanceus.py +17 -3
- ccxt/binanceusdm.py +9 -4
- ccxt/bingx.py +2962 -920
- ccxt/bit2c.py +147 -27
- ccxt/bitbank.py +151 -23
- ccxt/bitbns.py +104 -30
- ccxt/bitfinex.py +3290 -1113
- ccxt/bitflyer.py +202 -27
- ccxt/bitget.py +3683 -1538
- ccxt/bithumb.py +194 -38
- ccxt/bitimen.py +9 -9
- ccxt/bitir.py +35 -35
- ccxt/bitmart.py +1288 -350
- ccxt/bitmex.py +260 -75
- ccxt/bitopro.py +262 -62
- ccxt/bitpin.py +15 -14
- ccxt/bitrue.py +459 -290
- ccxt/bitso.py +199 -54
- ccxt/bitstamp.py +230 -96
- ccxt/bitteam.py +167 -25
- ccxt/{huobijp.py → bittrade.py} +158 -30
- ccxt/bitvavo.py +213 -49
- ccxt/blockchaincom.py +160 -46
- ccxt/blofin.py +502 -120
- ccxt/btcalpha.py +169 -31
- ccxt/btcbox.py +291 -23
- ccxt/btcmarkets.py +211 -58
- ccxt/btcturk.py +161 -38
- ccxt/bybit.py +1775 -1030
- ccxt/cex.py +1439 -1303
- ccxt/coinbase.py +724 -212
- ccxt/coinbaseadvanced.py +2 -1
- ccxt/coinbaseexchange.py +388 -89
- ccxt/coinbaseinternational.py +412 -57
- ccxt/coincatch.py +177 -78
- ccxt/coincheck.py +135 -19
- ccxt/coinex.py +606 -232
- ccxt/coinmate.py +189 -63
- ccxt/coinmetro.py +194 -54
- ccxt/coinone.py +158 -51
- ccxt/coinsph.py +336 -61
- ccxt/coinspot.py +151 -52
- ccxt/cryptocom.py +661 -111
- ccxt/cryptomus.py +1137 -0
- ccxt/defx.py +2070 -0
- ccxt/delta.py +299 -99
- ccxt/deribit.py +348 -126
- ccxt/derive.py +2571 -0
- ccxt/digifinex.py +430 -214
- ccxt/ellipx.py +2029 -0
- ccxt/eterex.py +7 -7
- ccxt/excoino.py +29 -29
- ccxt/exir.py +11 -11
- ccxt/exmo.py +343 -131
- ccxt/exnovin.py +8 -8
- ccxt/farhadexchange.py +10 -10
- ccxt/fmfwio.py +2 -1
- ccxt/foxbit.py +1935 -0
- ccxt/gate.py +1351 -529
- ccxt/gateio.py +2 -1
- ccxt/gemini.py +144 -39
- ccxt/hashkey.py +152 -109
- ccxt/hibachi.py +2079 -0
- ccxt/hitbtc.py +395 -167
- ccxt/hitobit.py +9 -9
- ccxt/hollaex.py +307 -119
- ccxt/htx.py +851 -383
- ccxt/huobi.py +2 -1
- ccxt/hyperliquid.py +1848 -536
- ccxt/independentreserve.py +287 -15
- ccxt/indodax.py +190 -33
- ccxt/jibitex.py +9 -9
- ccxt/kraken.py +794 -351
- ccxt/krakenfutures.py +214 -62
- ccxt/kucoin.py +715 -396
- ccxt/kucoinfutures.py +652 -89
- ccxt/latoken.py +217 -113
- ccxt/lbank.py +425 -97
- ccxt/luno.py +382 -35
- ccxt/mercado.py +113 -6
- ccxt/mexc.py +873 -437
- ccxt/modetrade.py +2818 -0
- ccxt/myokx.py +54 -0
- ccxt/ndax.py +221 -64
- ccxt/nobitex.py +29 -35
- ccxt/novadax.py +190 -34
- ccxt/oceanex.py +217 -28
- ccxt/okcoin.py +253 -145
- ccxt/okexchange.py +9 -9
- ccxt/okx.py +1088 -351
- ccxt/okxus.py +54 -0
- ccxt/ompfinex.py +22 -21
- ccxt/onetrading.py +213 -392
- ccxt/oxfun.py +245 -166
- ccxt/p2b.py +151 -29
- ccxt/paradex.py +562 -49
- ccxt/paymium.py +82 -19
- ccxt/phemex.py +712 -172
- ccxt/poloniex.py +1601 -283
- ccxt/pro/__init__.py +76 -17
- ccxt/pro/alpaca.py +21 -6
- ccxt/pro/apex.py +984 -0
- ccxt/pro/ascendex.py +58 -10
- ccxt/pro/bequant.py +6 -1
- ccxt/pro/binance.py +728 -156
- ccxt/pro/binancecoinm.py +6 -2
- ccxt/pro/binanceus.py +8 -4
- ccxt/pro/binanceusdm.py +7 -2
- ccxt/pro/bingx.py +333 -142
- ccxt/pro/bitfinex.py +727 -262
- ccxt/pro/bitget.py +570 -79
- ccxt/pro/bithumb.py +20 -6
- ccxt/pro/bitmart.py +216 -87
- ccxt/pro/bitmex.py +47 -9
- ccxt/pro/bitopro.py +26 -14
- ccxt/pro/bitrue.py +22 -22
- ccxt/pro/bitstamp.py +54 -21
- ccxt/pro/{huobijp.py → bittrade.py} +7 -6
- ccxt/pro/bitvavo.py +191 -67
- ccxt/pro/blockchaincom.py +21 -8
- ccxt/pro/blofin.py +9 -1
- ccxt/pro/bybit.py +632 -245
- ccxt/pro/cex.py +59 -24
- ccxt/pro/coinbase.py +102 -73
- ccxt/pro/coinbaseadvanced.py +2 -1
- ccxt/pro/coinbaseexchange.py +8 -8
- ccxt/pro/coinbaseinternational.py +181 -25
- ccxt/pro/coincatch.py +6 -7
- ccxt/pro/coincheck.py +11 -6
- ccxt/pro/coinex.py +967 -665
- ccxt/pro/coinone.py +16 -9
- ccxt/pro/cryptocom.py +448 -45
- ccxt/pro/defx.py +831 -0
- ccxt/pro/deribit.py +150 -14
- ccxt/pro/derive.py +704 -0
- ccxt/pro/exmo.py +239 -6
- ccxt/pro/gate.py +623 -65
- ccxt/pro/gateio.py +2 -1
- ccxt/pro/gemini.py +27 -11
- ccxt/pro/hashkey.py +2 -2
- ccxt/pro/hitbtc.py +196 -91
- ccxt/pro/hollaex.py +23 -7
- ccxt/pro/htx.py +51 -14
- ccxt/pro/huobi.py +2 -1
- ccxt/pro/hyperliquid.py +591 -27
- ccxt/pro/independentreserve.py +9 -6
- ccxt/pro/kraken.py +640 -320
- ccxt/pro/krakenfutures.py +62 -35
- ccxt/pro/kucoin.py +267 -46
- ccxt/pro/kucoinfutures.py +165 -21
- ccxt/pro/lbank.py +102 -21
- ccxt/pro/luno.py +12 -8
- ccxt/pro/mexc.py +877 -111
- ccxt/pro/modetrade.py +1271 -0
- ccxt/pro/myokx.py +38 -0
- ccxt/pro/ndax.py +15 -2
- ccxt/pro/okcoin.py +23 -4
- ccxt/pro/okx.py +573 -98
- ccxt/pro/okxus.py +38 -0
- ccxt/pro/onetrading.py +30 -13
- ccxt/pro/oxfun.py +131 -27
- ccxt/pro/p2b.py +88 -22
- ccxt/pro/paradex.py +3 -3
- ccxt/pro/phemex.py +75 -21
- ccxt/pro/poloniex.py +124 -41
- ccxt/pro/probit.py +87 -80
- ccxt/pro/tradeogre.py +272 -0
- ccxt/pro/upbit.py +152 -12
- ccxt/pro/vertex.py +8 -3
- ccxt/pro/whitebit.py +58 -5
- ccxt/pro/woo.py +228 -37
- ccxt/pro/woofipro.py +106 -18
- ccxt/pro/xt.py +111 -5
- ccxt/probit.py +224 -95
- ccxt/protobuf/__init__.py +0 -0
- ccxt/protobuf/mexc/PrivateAccountV3Api_pb2.py +37 -0
- ccxt/protobuf/mexc/PrivateDealsV3Api_pb2.py +37 -0
- ccxt/protobuf/mexc/PrivateOrdersV3Api_pb2.py +37 -0
- ccxt/protobuf/mexc/PublicAggreBookTickerV3Api_pb2.py +37 -0
- ccxt/protobuf/mexc/PublicAggreDealsV3Api_pb2.py +39 -0
- ccxt/protobuf/mexc/PublicAggreDepthsV3Api_pb2.py +39 -0
- ccxt/protobuf/mexc/PublicBookTickerBatchV3Api_pb2.py +38 -0
- ccxt/protobuf/mexc/PublicBookTickerV3Api_pb2.py +37 -0
- ccxt/protobuf/mexc/PublicDealsV3Api_pb2.py +39 -0
- ccxt/protobuf/mexc/PublicIncreaseDepthsBatchV3Api_pb2.py +38 -0
- ccxt/protobuf/mexc/PublicIncreaseDepthsV3Api_pb2.py +39 -0
- ccxt/protobuf/mexc/PublicLimitDepthsV3Api_pb2.py +39 -0
- ccxt/protobuf/mexc/PublicMiniTickerV3Api_pb2.py +37 -0
- ccxt/protobuf/mexc/PublicMiniTickersV3Api_pb2.py +38 -0
- ccxt/protobuf/mexc/PublicSpotKlineV3Api_pb2.py +37 -0
- ccxt/protobuf/mexc/PushDataV3ApiWrapper_pb2.py +52 -0
- ccxt/protobuf/mexc/__init__.py +0 -0
- ccxt/ramzinex.py +28 -25
- ccxt/sarmayex.py +7 -7
- ccxt/sarrafex.py +10 -10
- ccxt/static_dependencies/__init__.py +1 -1
- ccxt/static_dependencies/lark/py.typed +0 -0
- ccxt/static_dependencies/marshmallow/py.typed +0 -0
- ccxt/static_dependencies/marshmallow_dataclass/py.typed +0 -0
- ccxt/static_dependencies/marshmallow_oneofschema/py.typed +0 -0
- ccxt/tabdeal.py +12 -11
- ccxt/test/tests_async.py +261 -57
- ccxt/test/tests_helpers.py +1 -3
- ccxt/test/tests_init.py +4 -3
- ccxt/test/tests_sync.py +261 -57
- ccxt/tetherland.py +7 -7
- ccxt/timex.py +210 -51
- ccxt/tokocrypto.py +167 -47
- ccxt/tradeogre.py +266 -31
- ccxt/twox.py +7 -7
- ccxt/ubitex.py +9 -9
- ccxt/upbit.py +568 -165
- ccxt/vertex.py +160 -32
- ccxt/wallex.py +9 -9
- ccxt/wavesexchange.py +165 -30
- ccxt/whitebit.py +975 -127
- ccxt/woo.py +1917 -1016
- ccxt/woofipro.py +432 -141
- ccxt/xt.py +649 -193
- ccxt/yobit.py +194 -70
- ccxt/zaif.py +91 -15
- ccxt/zonda.py +151 -36
- {ccxt_ir-4.3.46.0.2.dist-info → ccxt_ir-4.5.0.dist-info}/METADATA +225 -73
- ccxt_ir-4.5.0.dist-info/RECORD +743 -0
- {ccxt_ir-4.3.46.0.2.dist-info → ccxt_ir-4.5.0.dist-info}/WHEEL +1 -1
- ccxt/abstract/ace.py +0 -15
- ccxt/abstract/bitbay.py +0 -53
- ccxt/abstract/bitcoincom.py +0 -115
- ccxt/abstract/bitfinex2.py +0 -139
- ccxt/abstract/bitpanda.py +0 -35
- ccxt/abstract/bl3p.py +0 -19
- ccxt/abstract/coinlist.py +0 -54
- ccxt/abstract/currencycom.py +0 -68
- ccxt/abstract/hitbtc3.py +0 -115
- ccxt/abstract/idex.py +0 -26
- ccxt/abstract/kuna.py +0 -182
- ccxt/abstract/lykke.py +0 -29
- ccxt/abstract/poloniexfutures.py +0 -48
- ccxt/abstract/wazirx.py +0 -30
- ccxt/ace.py +0 -1012
- ccxt/async_support/ace.py +0 -1012
- ccxt/async_support/base/ws/aiohttp_client.py +0 -125
- ccxt/async_support/base/ws/fast_client.py +0 -96
- ccxt/async_support/bitbay.py +0 -17
- ccxt/async_support/bitcoincom.py +0 -17
- ccxt/async_support/bitfinex2.py +0 -3552
- ccxt/async_support/bitpanda.py +0 -16
- ccxt/async_support/bl3p.py +0 -485
- ccxt/async_support/coinlist.py +0 -2243
- ccxt/async_support/currencycom.py +0 -1950
- ccxt/async_support/hitbtc3.py +0 -16
- ccxt/async_support/idex.py +0 -1766
- ccxt/async_support/kuna.py +0 -1841
- ccxt/async_support/lykke.py +0 -1270
- ccxt/async_support/poloniexfutures.py +0 -1717
- ccxt/async_support/wazirx.py +0 -1224
- ccxt/bitbay.py +0 -17
- ccxt/bitcoincom.py +0 -17
- ccxt/bitfinex2.py +0 -3552
- ccxt/bitpanda.py +0 -16
- ccxt/bl3p.py +0 -485
- ccxt/coinlist.py +0 -2243
- ccxt/currencycom.py +0 -1950
- ccxt/hitbtc3.py +0 -16
- ccxt/idex.py +0 -1766
- ccxt/kuna.py +0 -1841
- ccxt/lykke.py +0 -1270
- ccxt/poloniexfutures.py +0 -1717
- ccxt/pro/bitcoincom.py +0 -34
- ccxt/pro/bitfinex2.py +0 -1083
- ccxt/pro/bitpanda.py +0 -15
- ccxt/pro/currencycom.py +0 -536
- ccxt/pro/idex.py +0 -672
- ccxt/pro/poloniexfutures.py +0 -990
- ccxt/pro/wazirx.py +0 -749
- ccxt/test/base/__init__.py +0 -29
- ccxt/test/base/test_account.py +0 -26
- ccxt/test/base/test_balance.py +0 -56
- ccxt/test/base/test_borrow_interest.py +0 -35
- ccxt/test/base/test_borrow_rate.py +0 -32
- ccxt/test/base/test_calculate_fee.py +0 -51
- ccxt/test/base/test_crypto.py +0 -127
- ccxt/test/base/test_currency.py +0 -76
- ccxt/test/base/test_datetime.py +0 -109
- ccxt/test/base/test_decimal_to_precision.py +0 -392
- ccxt/test/base/test_deep_extend.py +0 -68
- ccxt/test/base/test_deposit_withdrawal.py +0 -50
- ccxt/test/base/test_exchange_datetime_functions.py +0 -76
- ccxt/test/base/test_funding_rate_history.py +0 -29
- ccxt/test/base/test_last_price.py +0 -31
- ccxt/test/base/test_ledger_entry.py +0 -45
- ccxt/test/base/test_ledger_item.py +0 -48
- ccxt/test/base/test_leverage_tier.py +0 -33
- ccxt/test/base/test_liquidation.py +0 -50
- ccxt/test/base/test_margin_mode.py +0 -24
- ccxt/test/base/test_margin_modification.py +0 -35
- ccxt/test/base/test_market.py +0 -193
- ccxt/test/base/test_number.py +0 -411
- ccxt/test/base/test_ohlcv.py +0 -33
- ccxt/test/base/test_open_interest.py +0 -32
- ccxt/test/base/test_order.py +0 -64
- ccxt/test/base/test_order_book.py +0 -69
- ccxt/test/base/test_position.py +0 -60
- ccxt/test/base/test_shared_methods.py +0 -353
- ccxt/test/base/test_status.py +0 -24
- ccxt/test/base/test_throttle.py +0 -126
- ccxt/test/base/test_ticker.py +0 -92
- ccxt/test/base/test_trade.py +0 -47
- ccxt/test/base/test_trading_fee.py +0 -26
- ccxt/test/base/test_transaction.py +0 -39
- ccxt/test/test_async.py +0 -1649
- ccxt/test/test_sync.py +0 -1648
- ccxt/wazirx.py +0 -1224
- ccxt_ir-4.3.46.0.2.dist-info/RECORD +0 -772
- /ccxt/abstract/{huobijp.py → bittrade.py} +0 -0
- {ccxt_ir-4.3.46.0.2.dist-info → ccxt_ir-4.5.0.dist-info/licenses}/LICENSE.txt +0 -0
- {ccxt_ir-4.3.46.0.2.dist-info → ccxt_ir-4.5.0.dist-info}/top_level.txt +0 -0
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 Balances, Currency, Int, Market, Num, Order, OrderBook, OrderSide, OrderType, 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
|
|
@@ -20,7 +20,7 @@ from ccxt.base.precise import Precise
|
|
|
20
20
|
|
|
21
21
|
class paradex(Exchange, ImplicitAPI):
|
|
22
22
|
|
|
23
|
-
def describe(self):
|
|
23
|
+
def describe(self) -> Any:
|
|
24
24
|
return self.deep_extend(super(paradex, self).describe(), {
|
|
25
25
|
'id': 'paradex',
|
|
26
26
|
'name': 'Paradex',
|
|
@@ -53,8 +53,11 @@ class paradex(Exchange, ImplicitAPI):
|
|
|
53
53
|
'createOrder': True,
|
|
54
54
|
'createOrders': False,
|
|
55
55
|
'createReduceOnlyOrder': False,
|
|
56
|
+
'createStopOrder': True,
|
|
57
|
+
'createTriggerOrder': True,
|
|
56
58
|
'editOrder': False,
|
|
57
59
|
'fetchAccounts': False,
|
|
60
|
+
'fetchAllGreeks': True,
|
|
58
61
|
'fetchBalance': True,
|
|
59
62
|
'fetchBorrowInterest': False,
|
|
60
63
|
'fetchBorrowRateHistories': False,
|
|
@@ -73,14 +76,15 @@ class paradex(Exchange, ImplicitAPI):
|
|
|
73
76
|
'fetchFundingRate': False,
|
|
74
77
|
'fetchFundingRateHistory': False,
|
|
75
78
|
'fetchFundingRates': False,
|
|
79
|
+
'fetchGreeks': True,
|
|
76
80
|
'fetchIndexOHLCV': False,
|
|
77
81
|
'fetchIsolatedBorrowRate': False,
|
|
78
82
|
'fetchIsolatedBorrowRates': False,
|
|
79
83
|
'fetchLedger': False,
|
|
80
|
-
'fetchLeverage':
|
|
84
|
+
'fetchLeverage': True,
|
|
81
85
|
'fetchLeverageTiers': False,
|
|
82
86
|
'fetchLiquidations': True,
|
|
83
|
-
'fetchMarginMode':
|
|
87
|
+
'fetchMarginMode': True,
|
|
84
88
|
'fetchMarketLeverageTiers': False,
|
|
85
89
|
'fetchMarkets': True,
|
|
86
90
|
'fetchMarkOHLCV': False,
|
|
@@ -114,8 +118,8 @@ class paradex(Exchange, ImplicitAPI):
|
|
|
114
118
|
'repayCrossMargin': False,
|
|
115
119
|
'repayIsolatedMargin': False,
|
|
116
120
|
'sandbox': True,
|
|
117
|
-
'setLeverage':
|
|
118
|
-
'setMarginMode':
|
|
121
|
+
'setLeverage': True,
|
|
122
|
+
'setMarginMode': True,
|
|
119
123
|
'setPositionMode': False,
|
|
120
124
|
'transfer': False,
|
|
121
125
|
'withdraw': False,
|
|
@@ -157,12 +161,23 @@ class paradex(Exchange, ImplicitAPI):
|
|
|
157
161
|
'system/state': 1,
|
|
158
162
|
'system/time': 1,
|
|
159
163
|
'trades': 1,
|
|
164
|
+
'vaults': 1,
|
|
165
|
+
'vaults/balance': 1,
|
|
166
|
+
'vaults/config': 1,
|
|
167
|
+
'vaults/history': 1,
|
|
168
|
+
'vaults/positions': 1,
|
|
169
|
+
'vaults/summary': 1,
|
|
170
|
+
'vaults/transfers': 1,
|
|
160
171
|
},
|
|
161
172
|
},
|
|
162
173
|
'private': {
|
|
163
174
|
'get': {
|
|
164
175
|
'account': 1,
|
|
176
|
+
'account/info': 1,
|
|
177
|
+
'account/history': 1,
|
|
178
|
+
'account/margin': 1,
|
|
165
179
|
'account/profile': 1,
|
|
180
|
+
'account/subaccounts': 1,
|
|
166
181
|
'balance': 1,
|
|
167
182
|
'fills': 1,
|
|
168
183
|
'funding/payments': 1,
|
|
@@ -175,20 +190,34 @@ class paradex(Exchange, ImplicitAPI):
|
|
|
175
190
|
'orders/by_client_id/{client_id}': 1,
|
|
176
191
|
'orders/{order_id}': 1,
|
|
177
192
|
'points_data/{market}/{program}': 1,
|
|
193
|
+
'referrals/qr-code': 1,
|
|
178
194
|
'referrals/summary': 1,
|
|
179
195
|
'transfers': 1,
|
|
196
|
+
'algo/orders': 1,
|
|
197
|
+
'algo/orders-history': 1,
|
|
198
|
+
'algo/orders/{algo_id}': 1,
|
|
199
|
+
'vaults/account-summary': 1,
|
|
180
200
|
},
|
|
181
201
|
'post': {
|
|
202
|
+
'account/margin/{market}': 1,
|
|
203
|
+
'account/profile/max_slippage': 1,
|
|
182
204
|
'account/profile/referral_code': 1,
|
|
183
205
|
'account/profile/username': 1,
|
|
184
206
|
'auth': 1,
|
|
185
207
|
'onboarding': 1,
|
|
186
208
|
'orders': 1,
|
|
209
|
+
'orders/batch': 1,
|
|
210
|
+
'algo/orders': 1,
|
|
211
|
+
'vaults': 1,
|
|
212
|
+
},
|
|
213
|
+
'put': {
|
|
214
|
+
'orders/{order_id}': 1,
|
|
187
215
|
},
|
|
188
216
|
'delete': {
|
|
189
217
|
'orders': 1,
|
|
190
218
|
'orders/by_client_id/{client_id}': 1,
|
|
191
219
|
'orders/{order_id}': 1,
|
|
220
|
+
'algo/orders/{algo_id}': 1,
|
|
192
221
|
},
|
|
193
222
|
},
|
|
194
223
|
},
|
|
@@ -268,17 +297,91 @@ class paradex(Exchange, ImplicitAPI):
|
|
|
268
297
|
'40112': PermissionDenied, # Geo IP blocked
|
|
269
298
|
},
|
|
270
299
|
'broad': {
|
|
300
|
+
'missing or malformed jwt': AuthenticationError,
|
|
271
301
|
},
|
|
272
302
|
},
|
|
273
303
|
'precisionMode': TICK_SIZE,
|
|
274
304
|
'commonCurrencies': {
|
|
275
305
|
},
|
|
276
306
|
'options': {
|
|
307
|
+
'paradexAccount': None, # add {"privateKey": A, "publicKey": B, "address": C}
|
|
277
308
|
'broker': 'CCXT',
|
|
278
309
|
},
|
|
310
|
+
'features': {
|
|
311
|
+
'spot': None,
|
|
312
|
+
'forSwap': {
|
|
313
|
+
'sandbox': True,
|
|
314
|
+
'createOrder': {
|
|
315
|
+
'marginMode': False,
|
|
316
|
+
'triggerPrice': True,
|
|
317
|
+
'triggerDirection': True, # todo
|
|
318
|
+
'triggerPriceType': None,
|
|
319
|
+
'stopLossPrice': False, # todo
|
|
320
|
+
'takeProfitPrice': False, # todo
|
|
321
|
+
'attachedStopLossTakeProfit': None,
|
|
322
|
+
'timeInForce': {
|
|
323
|
+
'IOC': True,
|
|
324
|
+
'FOK': False,
|
|
325
|
+
'PO': True,
|
|
326
|
+
'GTD': False,
|
|
327
|
+
},
|
|
328
|
+
'hedged': False,
|
|
329
|
+
'trailing': False,
|
|
330
|
+
'leverage': False,
|
|
331
|
+
'marketBuyByCost': False,
|
|
332
|
+
'marketBuyRequiresPrice': False,
|
|
333
|
+
'selfTradePrevention': True, # todo
|
|
334
|
+
'iceberg': False,
|
|
335
|
+
},
|
|
336
|
+
'createOrders': None, # todo
|
|
337
|
+
'fetchMyTrades': {
|
|
338
|
+
'marginMode': False,
|
|
339
|
+
'limit': 100, # todo
|
|
340
|
+
'daysBack': 100000, # todo
|
|
341
|
+
'untilDays': 100000, # todo
|
|
342
|
+
'symbolRequired': False,
|
|
343
|
+
},
|
|
344
|
+
'fetchOrder': {
|
|
345
|
+
'marginMode': False,
|
|
346
|
+
'trigger': False,
|
|
347
|
+
'trailing': False,
|
|
348
|
+
'symbolRequired': False,
|
|
349
|
+
},
|
|
350
|
+
'fetchOpenOrders': {
|
|
351
|
+
'marginMode': False,
|
|
352
|
+
'limit': 100, # todo
|
|
353
|
+
'trigger': False,
|
|
354
|
+
'trailing': False,
|
|
355
|
+
'symbolRequired': False,
|
|
356
|
+
},
|
|
357
|
+
'fetchOrders': {
|
|
358
|
+
'marginMode': False,
|
|
359
|
+
'limit': 100,
|
|
360
|
+
'daysBack': 100000, # todo
|
|
361
|
+
'untilDays': 100000, # todo
|
|
362
|
+
'trigger': False,
|
|
363
|
+
'trailing': False,
|
|
364
|
+
'symbolRequired': False,
|
|
365
|
+
},
|
|
366
|
+
'fetchClosedOrders': None, # todo
|
|
367
|
+
'fetchOHLCV': {
|
|
368
|
+
'limit': None, # todo by from/to
|
|
369
|
+
},
|
|
370
|
+
},
|
|
371
|
+
'swap': {
|
|
372
|
+
'linear': {
|
|
373
|
+
'extends': 'forSwap',
|
|
374
|
+
},
|
|
375
|
+
'inverse': None,
|
|
376
|
+
},
|
|
377
|
+
'future': {
|
|
378
|
+
'linear': None,
|
|
379
|
+
'inverse': None,
|
|
380
|
+
},
|
|
381
|
+
},
|
|
279
382
|
})
|
|
280
383
|
|
|
281
|
-
def fetch_time(self, params={}):
|
|
384
|
+
def fetch_time(self, params={}) -> Int:
|
|
282
385
|
"""
|
|
283
386
|
fetches the current integer timestamp in milliseconds from the exchange server
|
|
284
387
|
|
|
@@ -395,6 +498,57 @@ class paradex(Exchange, ImplicitAPI):
|
|
|
395
498
|
# "max_tob_spread": "0.2"
|
|
396
499
|
# }
|
|
397
500
|
#
|
|
501
|
+
# {
|
|
502
|
+
# "symbol":"BTC-USD-96000-C",
|
|
503
|
+
# "base_currency":"BTC",
|
|
504
|
+
# "quote_currency":"USD",
|
|
505
|
+
# "settlement_currency":"USDC",
|
|
506
|
+
# "order_size_increment":"0.001",
|
|
507
|
+
# "price_tick_size":"0.01",
|
|
508
|
+
# "min_notional":"100",
|
|
509
|
+
# "open_at":"1736764200000",
|
|
510
|
+
# "expiry_at":"0",
|
|
511
|
+
# "asset_kind":"PERP_OPTION",
|
|
512
|
+
# "market_kind":"cross",
|
|
513
|
+
# "position_limit":"10",
|
|
514
|
+
# "price_bands_width":"0.05",
|
|
515
|
+
# "iv_bands_width":"0.05",
|
|
516
|
+
# "max_open_orders":"100",
|
|
517
|
+
# "max_funding_rate":"0.02",
|
|
518
|
+
# "option_cross_margin_params":{
|
|
519
|
+
# "imf":{
|
|
520
|
+
# "long_itm":"0.2",
|
|
521
|
+
# "short_itm":"0.15",
|
|
522
|
+
# "short_otm":"0.1",
|
|
523
|
+
# "short_put_cap":"0.5",
|
|
524
|
+
# "premium_multiplier":"1"
|
|
525
|
+
# },
|
|
526
|
+
# "mmf":{
|
|
527
|
+
# "long_itm":"0.1",
|
|
528
|
+
# "short_itm":"0.075",
|
|
529
|
+
# "short_otm":"0.05",
|
|
530
|
+
# "short_put_cap":"0.5",
|
|
531
|
+
# "premium_multiplier":"0.5"
|
|
532
|
+
# }
|
|
533
|
+
# },
|
|
534
|
+
# "price_feed_id":"GVXRSBjFk6e6J3NbVPXohDJetcTjaeeuykUpbQF8UoMU",
|
|
535
|
+
# "oracle_ewma_factor":"0.20000046249626113",
|
|
536
|
+
# "max_order_size":"2",
|
|
537
|
+
# "max_funding_rate_change":"0.02",
|
|
538
|
+
# "max_tob_spread":"0.2",
|
|
539
|
+
# "interest_rate":"0.0001",
|
|
540
|
+
# "clamp_rate":"0.02",
|
|
541
|
+
# "option_type":"CALL",
|
|
542
|
+
# "strike_price":"96000",
|
|
543
|
+
# "funding_period_hours":"24",
|
|
544
|
+
# "tags":[
|
|
545
|
+
# ]
|
|
546
|
+
# }
|
|
547
|
+
#
|
|
548
|
+
assetKind = self.safe_string(market, 'asset_kind')
|
|
549
|
+
isOption = (assetKind == 'PERP_OPTION')
|
|
550
|
+
type = 'option' if (isOption) else 'swap'
|
|
551
|
+
isSwap = (type == 'swap')
|
|
398
552
|
marketId = self.safe_string(market, 'symbol')
|
|
399
553
|
quoteId = self.safe_string(market, 'quote_currency')
|
|
400
554
|
baseId = self.safe_string(market, 'base_currency')
|
|
@@ -404,8 +558,16 @@ class paradex(Exchange, ImplicitAPI):
|
|
|
404
558
|
settle = self.safe_currency_code(settleId)
|
|
405
559
|
symbol = base + '/' + quote + ':' + settle
|
|
406
560
|
expiry = self.safe_integer(market, 'expiry_at')
|
|
561
|
+
optionType = self.safe_string(market, 'option_type')
|
|
562
|
+
strikePrice = self.safe_string(market, 'strike_price')
|
|
407
563
|
takerFee = self.parse_number('0.0003')
|
|
408
564
|
makerFee = self.parse_number('-0.00005')
|
|
565
|
+
if isOption:
|
|
566
|
+
optionTypeSuffix = 'C' if (optionType == 'CALL') else 'P'
|
|
567
|
+
symbol = symbol + '-' + strikePrice + '-' + optionTypeSuffix
|
|
568
|
+
makerFee = self.parse_number('0.0003')
|
|
569
|
+
else:
|
|
570
|
+
expiry = None
|
|
409
571
|
return self.safe_market_structure({
|
|
410
572
|
'id': marketId,
|
|
411
573
|
'symbol': symbol,
|
|
@@ -415,23 +577,23 @@ class paradex(Exchange, ImplicitAPI):
|
|
|
415
577
|
'baseId': baseId,
|
|
416
578
|
'quoteId': quoteId,
|
|
417
579
|
'settleId': settleId,
|
|
418
|
-
'type':
|
|
580
|
+
'type': type,
|
|
419
581
|
'spot': False,
|
|
420
582
|
'margin': None,
|
|
421
|
-
'swap':
|
|
583
|
+
'swap': isSwap,
|
|
422
584
|
'future': False,
|
|
423
|
-
'option':
|
|
585
|
+
'option': isOption,
|
|
424
586
|
'active': self.safe_bool(market, 'enableTrading'),
|
|
425
587
|
'contract': True,
|
|
426
588
|
'linear': True,
|
|
427
|
-
'inverse':
|
|
589
|
+
'inverse': False,
|
|
428
590
|
'taker': takerFee,
|
|
429
591
|
'maker': makerFee,
|
|
430
592
|
'contractSize': self.parse_number('1'),
|
|
431
|
-
'expiry':
|
|
593
|
+
'expiry': expiry,
|
|
432
594
|
'expiryDatetime': None if (expiry == 0) else self.iso8601(expiry),
|
|
433
|
-
'strike':
|
|
434
|
-
'optionType':
|
|
595
|
+
'strike': self.parse_number(strikePrice),
|
|
596
|
+
'optionType': self.safe_string_lower(market, 'option_type'),
|
|
435
597
|
'precision': {
|
|
436
598
|
'amount': self.safe_number(market, 'order_size_increment'),
|
|
437
599
|
'price': self.safe_number(market, 'price_tick_size'),
|
|
@@ -544,14 +706,9 @@ class paradex(Exchange, ImplicitAPI):
|
|
|
544
706
|
"""
|
|
545
707
|
self.load_markets()
|
|
546
708
|
symbols = self.market_symbols(symbols)
|
|
547
|
-
request: dict = {
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
request['market'] = self.market_id(symbols[0])
|
|
551
|
-
else:
|
|
552
|
-
request['market'] = self.market_id(symbols)
|
|
553
|
-
else:
|
|
554
|
-
request['market'] = 'ALL'
|
|
709
|
+
request: dict = {
|
|
710
|
+
'market': 'ALL',
|
|
711
|
+
}
|
|
555
712
|
response = self.publicGetMarketsSummary(self.extend(request, params))
|
|
556
713
|
#
|
|
557
714
|
# {
|
|
@@ -629,7 +786,7 @@ class paradex(Exchange, ImplicitAPI):
|
|
|
629
786
|
# "ask": "69578.2",
|
|
630
787
|
# "volume_24h": "5815541.397939004",
|
|
631
788
|
# "total_volume": "584031465.525259686",
|
|
632
|
-
# "created_at":
|
|
789
|
+
# "created_at": 1718170156581,
|
|
633
790
|
# "underlying_price": "67367.37268422",
|
|
634
791
|
# "open_interest": "162.272",
|
|
635
792
|
# "funding_rate": "0.01629574927887",
|
|
@@ -871,7 +1028,7 @@ class paradex(Exchange, ImplicitAPI):
|
|
|
871
1028
|
#
|
|
872
1029
|
# {
|
|
873
1030
|
# "symbol": "BTC-USD-PERP",
|
|
874
|
-
# "oracle_price": "68465.
|
|
1031
|
+
# "oracle_price": "68465.17449904",
|
|
875
1032
|
# "mark_price": "68465.17449906",
|
|
876
1033
|
# "last_traded_price": "68495.1",
|
|
877
1034
|
# "bid": "68477.6",
|
|
@@ -950,22 +1107,24 @@ class paradex(Exchange, ImplicitAPI):
|
|
|
950
1107
|
def prepare_paradex_domain(self, l1=False):
|
|
951
1108
|
systemConfig = self.get_system_config()
|
|
952
1109
|
if l1 is True:
|
|
953
|
-
|
|
1110
|
+
l1D = {
|
|
954
1111
|
'name': 'Paradex',
|
|
955
1112
|
'chainId': systemConfig['l1_chain_id'],
|
|
956
1113
|
'version': '1',
|
|
957
1114
|
}
|
|
958
|
-
|
|
1115
|
+
return l1D
|
|
1116
|
+
domain = {
|
|
959
1117
|
'name': 'Paradex',
|
|
960
1118
|
'chainId': systemConfig['starknet_chain_id'],
|
|
961
1119
|
'version': 1,
|
|
962
1120
|
}
|
|
1121
|
+
return domain
|
|
963
1122
|
|
|
964
1123
|
def retrieve_account(self):
|
|
965
|
-
self.check_required_credentials()
|
|
966
1124
|
cachedAccount: dict = self.safe_dict(self.options, 'paradexAccount')
|
|
967
1125
|
if cachedAccount is not None:
|
|
968
1126
|
return cachedAccount
|
|
1127
|
+
self.check_required_credentials()
|
|
969
1128
|
systemConfig = self.get_system_config()
|
|
970
1129
|
domain = self.prepare_paradex_domain(True)
|
|
971
1130
|
messageTypes = {
|
|
@@ -1013,7 +1172,8 @@ class paradex(Exchange, ImplicitAPI):
|
|
|
1013
1172
|
if now < cachedExpires:
|
|
1014
1173
|
return cachedToken
|
|
1015
1174
|
account = self.retrieve_account()
|
|
1016
|
-
|
|
1175
|
+
# https://docs.paradex.trade/api-reference/general-information/authentication
|
|
1176
|
+
expires = now + 180
|
|
1017
1177
|
req = {
|
|
1018
1178
|
'method': 'POST',
|
|
1019
1179
|
'path': '/v1/auth',
|
|
@@ -1086,12 +1246,21 @@ class paradex(Exchange, ImplicitAPI):
|
|
|
1086
1246
|
price = self.safe_string(order, 'price')
|
|
1087
1247
|
amount = self.safe_string(order, 'size')
|
|
1088
1248
|
orderType = self.safe_string(order, 'type')
|
|
1249
|
+
cancelReason = self.safe_string(order, 'cancel_reason')
|
|
1089
1250
|
status = self.safe_string(order, 'status')
|
|
1251
|
+
if cancelReason is not None:
|
|
1252
|
+
if cancelReason == 'NOT_ENOUGH_MARGIN' or cancelReason == 'ORDER_EXCEEDS_POSITION_LIMIT':
|
|
1253
|
+
status = 'rejected'
|
|
1254
|
+
else:
|
|
1255
|
+
status = 'canceled'
|
|
1090
1256
|
side = self.safe_string_lower(order, 'side')
|
|
1091
1257
|
average = self.omit_zero(self.safe_string(order, 'avg_fill_price'))
|
|
1092
1258
|
remaining = self.omit_zero(self.safe_string(order, 'remaining_size'))
|
|
1093
|
-
stopPrice = self.safe_string(order, 'trigger_price')
|
|
1094
1259
|
lastUpdateTimestamp = self.safe_integer(order, 'last_updated_at')
|
|
1260
|
+
flags = self.safe_list(order, 'flags', [])
|
|
1261
|
+
reduceOnly = None
|
|
1262
|
+
if 'REDUCE_ONLY' in flags:
|
|
1263
|
+
reduceOnly = True
|
|
1095
1264
|
return self.safe_order({
|
|
1096
1265
|
'id': orderId,
|
|
1097
1266
|
'clientOrderId': clientOrderId,
|
|
@@ -1102,13 +1271,12 @@ class paradex(Exchange, ImplicitAPI):
|
|
|
1102
1271
|
'status': self.parse_order_status(status),
|
|
1103
1272
|
'symbol': symbol,
|
|
1104
1273
|
'type': self.parse_order_type(orderType),
|
|
1105
|
-
'timeInForce': self.parse_time_in_force(self.safe_string(order, '
|
|
1274
|
+
'timeInForce': self.parse_time_in_force(self.safe_string(order, 'instruction')),
|
|
1106
1275
|
'postOnly': None,
|
|
1107
|
-
'reduceOnly':
|
|
1276
|
+
'reduceOnly': reduceOnly,
|
|
1108
1277
|
'side': side,
|
|
1109
1278
|
'price': price,
|
|
1110
|
-
'
|
|
1111
|
-
'triggerPrice': stopPrice,
|
|
1279
|
+
'triggerPrice': self.safe_string(order, 'trigger_price'),
|
|
1112
1280
|
'takeProfitPrice': None,
|
|
1113
1281
|
'stopLossPrice': None,
|
|
1114
1282
|
'average': average,
|
|
@@ -1171,8 +1339,10 @@ class paradex(Exchange, ImplicitAPI):
|
|
|
1171
1339
|
:param float amount: how much of currency you want to trade in units of base currency
|
|
1172
1340
|
:param float [price]: the price at which the order is to be fullfilled, in units of the quote currency, ignored in market orders
|
|
1173
1341
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
|
1174
|
-
:param float [params.stopPrice]:
|
|
1342
|
+
:param float [params.stopPrice]: alias for triggerPrice
|
|
1175
1343
|
:param float [params.triggerPrice]: The price a trigger order is triggered at
|
|
1344
|
+
:param float [params.stopLossPrice]: the price that a stop loss order is triggered at
|
|
1345
|
+
:param float [params.takeProfitPrice]: the price that a take profit order is triggered at
|
|
1176
1346
|
:param str [params.timeInForce]: "GTC", "IOC", or "POST_ONLY"
|
|
1177
1347
|
:param bool [params.postOnly]: True or False
|
|
1178
1348
|
:param bool [params.reduceOnly]: Ensures that the executed order does not flip the opened position.
|
|
@@ -1188,11 +1358,15 @@ class paradex(Exchange, ImplicitAPI):
|
|
|
1188
1358
|
request: dict = {
|
|
1189
1359
|
'market': market['id'],
|
|
1190
1360
|
'side': orderSide,
|
|
1191
|
-
'type': orderType, # LIMIT/MARKET/STOP_LIMIT/STOP_MARKET
|
|
1192
|
-
'size': self.amount_to_precision(symbol, amount),
|
|
1361
|
+
'type': orderType, # LIMIT/MARKET/STOP_LIMIT/STOP_MARKET,STOP_LOSS_MARKET,STOP_LOSS_LIMIT,TAKE_PROFIT_MARKET,TAKE_PROFIT_LIMIT
|
|
1193
1362
|
}
|
|
1194
|
-
|
|
1363
|
+
triggerPrice = self.safe_string_2(params, 'triggerPrice', 'stopPrice')
|
|
1364
|
+
stopLossPrice = self.safe_string(params, 'stopLossPrice')
|
|
1365
|
+
takeProfitPrice = self.safe_string(params, 'takeProfitPrice')
|
|
1195
1366
|
isMarket = orderType == 'MARKET'
|
|
1367
|
+
isTakeProfitOrder = (takeProfitPrice is not None)
|
|
1368
|
+
isStopLossOrder = (stopLossPrice is not None)
|
|
1369
|
+
isStopOrder = (triggerPrice is not None) or isTakeProfitOrder or isStopLossOrder
|
|
1196
1370
|
timeInForce = self.safe_string_upper(params, 'timeInForce')
|
|
1197
1371
|
postOnly = self.is_post_only(isMarket, None, params)
|
|
1198
1372
|
if not isMarket:
|
|
@@ -1200,22 +1374,51 @@ class paradex(Exchange, ImplicitAPI):
|
|
|
1200
1374
|
request['instruction'] = 'POST_ONLY'
|
|
1201
1375
|
elif timeInForce == 'ioc':
|
|
1202
1376
|
request['instruction'] = 'IOC'
|
|
1203
|
-
if reduceOnly:
|
|
1204
|
-
request['flags'] = [
|
|
1205
|
-
'REDUCE_ONLY',
|
|
1206
|
-
]
|
|
1207
1377
|
if price is not None:
|
|
1208
1378
|
request['price'] = self.price_to_precision(symbol, price)
|
|
1209
1379
|
clientOrderId = self.safe_string_n(params, ['clOrdID', 'clientOrderId', 'client_order_id'])
|
|
1210
1380
|
if clientOrderId is not None:
|
|
1211
1381
|
request['client_id'] = clientOrderId
|
|
1212
|
-
|
|
1382
|
+
sizeString = '0'
|
|
1383
|
+
stopPrice = None
|
|
1384
|
+
if isStopOrder:
|
|
1385
|
+
# flags: Reduce_Only must be provided for TPSL orders.
|
|
1213
1386
|
if isMarket:
|
|
1214
|
-
|
|
1387
|
+
if isStopLossOrder:
|
|
1388
|
+
stopPrice = self.price_to_precision(symbol, stopLossPrice)
|
|
1389
|
+
reduceOnly = True
|
|
1390
|
+
request['type'] = 'STOP_LOSS_MARKET'
|
|
1391
|
+
elif isTakeProfitOrder:
|
|
1392
|
+
stopPrice = self.price_to_precision(symbol, takeProfitPrice)
|
|
1393
|
+
reduceOnly = True
|
|
1394
|
+
request['type'] = 'TAKE_PROFIT_MARKET'
|
|
1395
|
+
else:
|
|
1396
|
+
stopPrice = self.price_to_precision(symbol, triggerPrice)
|
|
1397
|
+
sizeString = self.amount_to_precision(symbol, amount)
|
|
1398
|
+
request['type'] = 'STOP_MARKET'
|
|
1215
1399
|
else:
|
|
1216
|
-
|
|
1217
|
-
|
|
1218
|
-
|
|
1400
|
+
if isStopLossOrder:
|
|
1401
|
+
stopPrice = self.price_to_precision(symbol, stopLossPrice)
|
|
1402
|
+
reduceOnly = True
|
|
1403
|
+
request['type'] = 'STOP_LOSS_LIMIT'
|
|
1404
|
+
elif isTakeProfitOrder:
|
|
1405
|
+
stopPrice = self.price_to_precision(symbol, takeProfitPrice)
|
|
1406
|
+
reduceOnly = True
|
|
1407
|
+
request['type'] = 'TAKE_PROFIT_LIMIT'
|
|
1408
|
+
else:
|
|
1409
|
+
stopPrice = self.price_to_precision(symbol, triggerPrice)
|
|
1410
|
+
sizeString = self.amount_to_precision(symbol, amount)
|
|
1411
|
+
request['type'] = 'STOP_LIMIT'
|
|
1412
|
+
else:
|
|
1413
|
+
sizeString = self.amount_to_precision(symbol, amount)
|
|
1414
|
+
if stopPrice is not None:
|
|
1415
|
+
request['trigger_price'] = stopPrice
|
|
1416
|
+
request['size'] = sizeString
|
|
1417
|
+
if reduceOnly:
|
|
1418
|
+
request['flags'] = [
|
|
1419
|
+
'REDUCE_ONLY',
|
|
1420
|
+
]
|
|
1421
|
+
params = self.omit(params, ['reduceOnly', 'reduce_only', 'clOrdID', 'clientOrderId', 'client_order_id', 'postOnly', 'timeInForce', 'stopPrice', 'triggerPrice', 'stopLossPrice', 'takeProfitPrice'])
|
|
1219
1422
|
account = self.retrieve_account()
|
|
1220
1423
|
now = self.nonce()
|
|
1221
1424
|
orderReq = {
|
|
@@ -1324,7 +1527,7 @@ class paradex(Exchange, ImplicitAPI):
|
|
|
1324
1527
|
#
|
|
1325
1528
|
# if success, no response...
|
|
1326
1529
|
#
|
|
1327
|
-
return response
|
|
1530
|
+
return [self.safe_order({'info': response})]
|
|
1328
1531
|
|
|
1329
1532
|
def fetch_order(self, id: str, symbol: Str = None, params={}):
|
|
1330
1533
|
"""
|
|
@@ -1621,7 +1824,7 @@ class paradex(Exchange, ImplicitAPI):
|
|
|
1621
1824
|
positions = self.fetch_positions([market['symbol']], params)
|
|
1622
1825
|
return self.safe_dict(positions, 0, {})
|
|
1623
1826
|
|
|
1624
|
-
def fetch_positions(self, symbols: Strings = None, params={}):
|
|
1827
|
+
def fetch_positions(self, symbols: Strings = None, params={}) -> List[Position]:
|
|
1625
1828
|
"""
|
|
1626
1829
|
fetch all open positions
|
|
1627
1830
|
|
|
@@ -1768,6 +1971,7 @@ class paradex(Exchange, ImplicitAPI):
|
|
|
1768
1971
|
'contracts': None,
|
|
1769
1972
|
'contractSize': None,
|
|
1770
1973
|
'price': None,
|
|
1974
|
+
'side': None,
|
|
1771
1975
|
'baseValue': None,
|
|
1772
1976
|
'quoteValue': None,
|
|
1773
1977
|
'timestamp': timestamp,
|
|
@@ -1947,6 +2151,316 @@ class paradex(Exchange, ImplicitAPI):
|
|
|
1947
2151
|
}
|
|
1948
2152
|
return self.safe_string(statuses, status, status)
|
|
1949
2153
|
|
|
2154
|
+
def fetch_margin_mode(self, symbol: str, params={}) -> MarginMode:
|
|
2155
|
+
"""
|
|
2156
|
+
fetches the margin mode of a specific symbol
|
|
2157
|
+
|
|
2158
|
+
https://docs.api.testnet.paradex.trade/#get-account-margin-configuration
|
|
2159
|
+
|
|
2160
|
+
:param str symbol: unified symbol of the market the order was made in
|
|
2161
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
|
2162
|
+
:returns dict: a `margin mode structure <https://docs.ccxt.com/#/?id=margin-mode-structure>`
|
|
2163
|
+
"""
|
|
2164
|
+
self.authenticate_rest()
|
|
2165
|
+
self.load_markets()
|
|
2166
|
+
market = self.market(symbol)
|
|
2167
|
+
request: dict = {
|
|
2168
|
+
'market': market['id'],
|
|
2169
|
+
}
|
|
2170
|
+
response = self.privateGetAccountMargin(self.extend(request, params))
|
|
2171
|
+
#
|
|
2172
|
+
# {
|
|
2173
|
+
# "account": "0x6343248026a845b39a8a73fbe9c7ef0a841db31ed5c61ec1446aa9d25e54dbc",
|
|
2174
|
+
# "configs": [
|
|
2175
|
+
# {
|
|
2176
|
+
# "market": "SOL-USD-PERP",
|
|
2177
|
+
# "leverage": 50,
|
|
2178
|
+
# "margin_type": "CROSS"
|
|
2179
|
+
# }
|
|
2180
|
+
# ]
|
|
2181
|
+
# }
|
|
2182
|
+
#
|
|
2183
|
+
configs = self.safe_list(response, 'configs')
|
|
2184
|
+
return self.parse_margin_mode(self.safe_dict(configs, 0), market)
|
|
2185
|
+
|
|
2186
|
+
def parse_margin_mode(self, rawMarginMode: dict, market=None) -> MarginMode:
|
|
2187
|
+
marketId = self.safe_string(rawMarginMode, 'market')
|
|
2188
|
+
market = self.safe_market(marketId, market)
|
|
2189
|
+
marginMode = self.safe_string_lower(rawMarginMode, 'margin_type')
|
|
2190
|
+
return {
|
|
2191
|
+
'info': rawMarginMode,
|
|
2192
|
+
'symbol': market['symbol'],
|
|
2193
|
+
'marginMode': marginMode,
|
|
2194
|
+
}
|
|
2195
|
+
|
|
2196
|
+
def set_margin_mode(self, marginMode: str, symbol: Str = None, params={}):
|
|
2197
|
+
"""
|
|
2198
|
+
set margin mode to 'cross' or 'isolated'
|
|
2199
|
+
|
|
2200
|
+
https://docs.api.testnet.paradex.trade/#set-margin-configuration
|
|
2201
|
+
|
|
2202
|
+
:param str marginMode: 'cross' or 'isolated'
|
|
2203
|
+
:param str symbol: unified market symbol
|
|
2204
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
|
2205
|
+
:param float [params.leverage]: the rate of leverage
|
|
2206
|
+
:returns dict: response from the exchange
|
|
2207
|
+
"""
|
|
2208
|
+
self.check_required_argument('setMarginMode', symbol, 'symbol')
|
|
2209
|
+
self.authenticate_rest()
|
|
2210
|
+
self.load_markets()
|
|
2211
|
+
market: Market = self.market(symbol)
|
|
2212
|
+
leverage: Str = None
|
|
2213
|
+
leverage, params = self.handle_option_and_params(params, 'setMarginMode', 'leverage', 1)
|
|
2214
|
+
request: dict = {
|
|
2215
|
+
'market': market['id'],
|
|
2216
|
+
'leverage': leverage,
|
|
2217
|
+
'margin_type': self.encode_margin_mode(marginMode),
|
|
2218
|
+
}
|
|
2219
|
+
return self.privatePostAccountMarginMarket(self.extend(request, params))
|
|
2220
|
+
|
|
2221
|
+
def fetch_leverage(self, symbol: str, params={}) -> Leverage:
|
|
2222
|
+
"""
|
|
2223
|
+
fetch the set leverage for a market
|
|
2224
|
+
|
|
2225
|
+
https://docs.api.testnet.paradex.trade/#get-account-margin-configuration
|
|
2226
|
+
|
|
2227
|
+
:param str symbol: unified market symbol
|
|
2228
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
|
2229
|
+
:returns dict: a `leverage structure <https://docs.ccxt.com/#/?id=leverage-structure>`
|
|
2230
|
+
"""
|
|
2231
|
+
self.authenticate_rest()
|
|
2232
|
+
self.load_markets()
|
|
2233
|
+
market = self.market(symbol)
|
|
2234
|
+
request: dict = {
|
|
2235
|
+
'market': market['id'],
|
|
2236
|
+
}
|
|
2237
|
+
response = self.privateGetAccountMargin(self.extend(request, params))
|
|
2238
|
+
#
|
|
2239
|
+
# {
|
|
2240
|
+
# "account": "0x6343248026a845b39a8a73fbe9c7ef0a841db31ed5c61ec1446aa9d25e54dbc",
|
|
2241
|
+
# "configs": [
|
|
2242
|
+
# {
|
|
2243
|
+
# "market": "SOL-USD-PERP",
|
|
2244
|
+
# "leverage": 50,
|
|
2245
|
+
# "margin_type": "CROSS"
|
|
2246
|
+
# }
|
|
2247
|
+
# ]
|
|
2248
|
+
# }
|
|
2249
|
+
#
|
|
2250
|
+
configs = self.safe_list(response, 'configs')
|
|
2251
|
+
return self.parse_leverage(self.safe_dict(configs, 0), market)
|
|
2252
|
+
|
|
2253
|
+
def parse_leverage(self, leverage: dict, market: Market = None) -> Leverage:
|
|
2254
|
+
marketId = self.safe_string(leverage, 'market')
|
|
2255
|
+
market = self.safe_market(marketId, market)
|
|
2256
|
+
marginMode = self.safe_string_lower(leverage, 'margin_type')
|
|
2257
|
+
return {
|
|
2258
|
+
'info': leverage,
|
|
2259
|
+
'symbol': self.safe_symbol(marketId, market),
|
|
2260
|
+
'marginMode': marginMode,
|
|
2261
|
+
'longLeverage': self.safe_integer(leverage, 'leverage'),
|
|
2262
|
+
'shortLeverage': self.safe_integer(leverage, 'leverage'),
|
|
2263
|
+
}
|
|
2264
|
+
|
|
2265
|
+
def encode_margin_mode(self, mode):
|
|
2266
|
+
modes = {
|
|
2267
|
+
'cross': 'CROSS',
|
|
2268
|
+
'isolated': 'ISOLATED',
|
|
2269
|
+
}
|
|
2270
|
+
return self.safe_string(modes, mode, mode)
|
|
2271
|
+
|
|
2272
|
+
def set_leverage(self, leverage: int, symbol: Str = None, params={}):
|
|
2273
|
+
"""
|
|
2274
|
+
set the level of leverage for a market
|
|
2275
|
+
|
|
2276
|
+
https://docs.api.testnet.paradex.trade/#set-margin-configuration
|
|
2277
|
+
|
|
2278
|
+
:param float leverage: the rate of leverage
|
|
2279
|
+
:param str [symbol]: unified market symbol(is mandatory for swap markets)
|
|
2280
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
|
2281
|
+
:param str [params.marginMode]: 'cross' or 'isolated'
|
|
2282
|
+
:returns dict: response from the exchange
|
|
2283
|
+
"""
|
|
2284
|
+
self.check_required_argument('setLeverage', symbol, 'symbol')
|
|
2285
|
+
self.authenticate_rest()
|
|
2286
|
+
self.load_markets()
|
|
2287
|
+
market: Market = self.market(symbol)
|
|
2288
|
+
marginMode: Str = None
|
|
2289
|
+
marginMode, params = self.handle_margin_mode_and_params('setLeverage', params, 'cross')
|
|
2290
|
+
request: dict = {
|
|
2291
|
+
'market': market['id'],
|
|
2292
|
+
'leverage': leverage,
|
|
2293
|
+
'margin_type': self.encode_margin_mode(marginMode),
|
|
2294
|
+
}
|
|
2295
|
+
return self.privatePostAccountMarginMarket(self.extend(request, params))
|
|
2296
|
+
|
|
2297
|
+
def fetch_greeks(self, symbol: str, params={}) -> Greeks:
|
|
2298
|
+
"""
|
|
2299
|
+
fetches an option contracts greeks, financial metrics used to measure the factors that affect the price of an options contract
|
|
2300
|
+
|
|
2301
|
+
https://docs.api.testnet.paradex.trade/#list-available-markets-summary
|
|
2302
|
+
|
|
2303
|
+
:param str symbol: unified symbol of the market to fetch greeks for
|
|
2304
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
|
2305
|
+
:returns dict: a `greeks structure <https://docs.ccxt.com/#/?id=greeks-structure>`
|
|
2306
|
+
"""
|
|
2307
|
+
self.load_markets()
|
|
2308
|
+
market = self.market(symbol)
|
|
2309
|
+
request: dict = {
|
|
2310
|
+
'market': market['id'],
|
|
2311
|
+
}
|
|
2312
|
+
response = self.publicGetMarketsSummary(self.extend(request, params))
|
|
2313
|
+
#
|
|
2314
|
+
# {
|
|
2315
|
+
# "results": [
|
|
2316
|
+
# {
|
|
2317
|
+
# "symbol": "BTC-USD-114000-P",
|
|
2318
|
+
# "mark_price": "10835.66892602",
|
|
2319
|
+
# "mark_iv": "0.71781855",
|
|
2320
|
+
# "delta": "-0.98726024",
|
|
2321
|
+
# "greeks": {
|
|
2322
|
+
# "delta": "-0.9872602390817709",
|
|
2323
|
+
# "gamma": "0.000004560958862297231",
|
|
2324
|
+
# "vega": "227.11344863639806",
|
|
2325
|
+
# "rho": "-302.0617972461581",
|
|
2326
|
+
# "vanna": "0.06609830491614832",
|
|
2327
|
+
# "volga": "925.9501532805552"
|
|
2328
|
+
# },
|
|
2329
|
+
# "last_traded_price": "10551.5",
|
|
2330
|
+
# "bid": "10794.9",
|
|
2331
|
+
# "bid_iv": "0.05",
|
|
2332
|
+
# "ask": "10887.3",
|
|
2333
|
+
# "ask_iv": "0.8783283",
|
|
2334
|
+
# "last_iv": "0.05",
|
|
2335
|
+
# "volume_24h": "0",
|
|
2336
|
+
# "total_volume": "195240.72672261014",
|
|
2337
|
+
# "created_at": 1747644009995,
|
|
2338
|
+
# "underlying_price": "103164.79162649",
|
|
2339
|
+
# "open_interest": "0",
|
|
2340
|
+
# "funding_rate": "0.000004464241170536191",
|
|
2341
|
+
# "price_change_rate_24h": "0.074915",
|
|
2342
|
+
# "future_funding_rate": "0.0001"
|
|
2343
|
+
# }
|
|
2344
|
+
# ]
|
|
2345
|
+
# }
|
|
2346
|
+
#
|
|
2347
|
+
data = self.safe_list(response, 'results', [])
|
|
2348
|
+
greeks = self.safe_dict(data, 0, {})
|
|
2349
|
+
return self.parse_greeks(greeks, market)
|
|
2350
|
+
|
|
2351
|
+
def fetch_all_greeks(self, symbols: Strings = None, params={}) -> List[Greeks]:
|
|
2352
|
+
"""
|
|
2353
|
+
fetches all option contracts greeks, financial metrics used to measure the factors that affect the price of an options contract
|
|
2354
|
+
|
|
2355
|
+
https://docs.api.testnet.paradex.trade/#list-available-markets-summary
|
|
2356
|
+
|
|
2357
|
+
:param str[] [symbols]: unified symbols of the markets to fetch greeks for, all markets are returned if not assigned
|
|
2358
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
|
2359
|
+
:returns dict: a `greeks structure <https://docs.ccxt.com/#/?id=greeks-structure>`
|
|
2360
|
+
"""
|
|
2361
|
+
self.load_markets()
|
|
2362
|
+
symbols = self.market_symbols(symbols, None, True, True, True)
|
|
2363
|
+
request: dict = {
|
|
2364
|
+
'market': 'ALL',
|
|
2365
|
+
}
|
|
2366
|
+
response = self.publicGetMarketsSummary(self.extend(request, params))
|
|
2367
|
+
#
|
|
2368
|
+
# {
|
|
2369
|
+
# "results": [
|
|
2370
|
+
# {
|
|
2371
|
+
# "symbol": "BTC-USD-114000-P",
|
|
2372
|
+
# "mark_price": "10835.66892602",
|
|
2373
|
+
# "mark_iv": "0.71781855",
|
|
2374
|
+
# "delta": "-0.98726024",
|
|
2375
|
+
# "greeks": {
|
|
2376
|
+
# "delta": "-0.9872602390817709",
|
|
2377
|
+
# "gamma": "0.000004560958862297231",
|
|
2378
|
+
# "vega": "227.11344863639806",
|
|
2379
|
+
# "rho": "-302.0617972461581",
|
|
2380
|
+
# "vanna": "0.06609830491614832",
|
|
2381
|
+
# "volga": "925.9501532805552"
|
|
2382
|
+
# },
|
|
2383
|
+
# "last_traded_price": "10551.5",
|
|
2384
|
+
# "bid": "10794.9",
|
|
2385
|
+
# "bid_iv": "0.05",
|
|
2386
|
+
# "ask": "10887.3",
|
|
2387
|
+
# "ask_iv": "0.8783283",
|
|
2388
|
+
# "last_iv": "0.05",
|
|
2389
|
+
# "volume_24h": "0",
|
|
2390
|
+
# "total_volume": "195240.72672261014",
|
|
2391
|
+
# "created_at": 1747644009995,
|
|
2392
|
+
# "underlying_price": "103164.79162649",
|
|
2393
|
+
# "open_interest": "0",
|
|
2394
|
+
# "funding_rate": "0.000004464241170536191",
|
|
2395
|
+
# "price_change_rate_24h": "0.074915",
|
|
2396
|
+
# "future_funding_rate": "0.0001"
|
|
2397
|
+
# }
|
|
2398
|
+
# ]
|
|
2399
|
+
# }
|
|
2400
|
+
#
|
|
2401
|
+
results = self.safe_list(response, 'results', [])
|
|
2402
|
+
return self.parse_all_greeks(results, symbols)
|
|
2403
|
+
|
|
2404
|
+
def parse_greeks(self, greeks: dict, market: Market = None) -> Greeks:
|
|
2405
|
+
#
|
|
2406
|
+
# {
|
|
2407
|
+
# "symbol": "BTC-USD-114000-P",
|
|
2408
|
+
# "mark_price": "10835.66892602",
|
|
2409
|
+
# "mark_iv": "0.71781855",
|
|
2410
|
+
# "delta": "-0.98726024",
|
|
2411
|
+
# "greeks": {
|
|
2412
|
+
# "delta": "-0.9872602390817709",
|
|
2413
|
+
# "gamma": "0.000004560958862297231",
|
|
2414
|
+
# "vega": "227.11344863639806",
|
|
2415
|
+
# "rho": "-302.0617972461581",
|
|
2416
|
+
# "vanna": "0.06609830491614832",
|
|
2417
|
+
# "volga": "925.9501532805552"
|
|
2418
|
+
# },
|
|
2419
|
+
# "last_traded_price": "10551.5",
|
|
2420
|
+
# "bid": "10794.9",
|
|
2421
|
+
# "bid_iv": "0.05",
|
|
2422
|
+
# "ask": "10887.3",
|
|
2423
|
+
# "ask_iv": "0.8783283",
|
|
2424
|
+
# "last_iv": "0.05",
|
|
2425
|
+
# "volume_24h": "0",
|
|
2426
|
+
# "total_volume": "195240.72672261014",
|
|
2427
|
+
# "created_at": 1747644009995,
|
|
2428
|
+
# "underlying_price": "103164.79162649",
|
|
2429
|
+
# "open_interest": "0",
|
|
2430
|
+
# "funding_rate": "0.000004464241170536191",
|
|
2431
|
+
# "price_change_rate_24h": "0.074915",
|
|
2432
|
+
# "future_funding_rate": "0.0001"
|
|
2433
|
+
# }
|
|
2434
|
+
#
|
|
2435
|
+
marketId = self.safe_string(greeks, 'symbol')
|
|
2436
|
+
market = self.safe_market(marketId, market, None, 'option')
|
|
2437
|
+
symbol = market['symbol']
|
|
2438
|
+
timestamp = self.safe_integer(greeks, 'created_at')
|
|
2439
|
+
greeksData = self.safe_dict(greeks, 'greeks', {})
|
|
2440
|
+
return {
|
|
2441
|
+
'symbol': symbol,
|
|
2442
|
+
'timestamp': timestamp,
|
|
2443
|
+
'datetime': self.iso8601(timestamp),
|
|
2444
|
+
'delta': self.safe_number(greeksData, 'delta'),
|
|
2445
|
+
'gamma': self.safe_number(greeksData, 'gamma'),
|
|
2446
|
+
'theta': None,
|
|
2447
|
+
'vega': self.safe_number(greeksData, 'vega'),
|
|
2448
|
+
'rho': self.safe_number(greeksData, 'rho'),
|
|
2449
|
+
'vanna': self.safe_number(greeksData, 'vanna'),
|
|
2450
|
+
'volga': self.safe_number(greeksData, 'volga'),
|
|
2451
|
+
'bidSize': None,
|
|
2452
|
+
'askSize': None,
|
|
2453
|
+
'bidImpliedVolatility': self.safe_number(greeks, 'bid_iv'),
|
|
2454
|
+
'askImpliedVolatility': self.safe_number(greeks, 'ask_iv'),
|
|
2455
|
+
'markImpliedVolatility': self.safe_number(greeks, 'mark_iv'),
|
|
2456
|
+
'bidPrice': self.safe_number(greeks, 'bid'),
|
|
2457
|
+
'askPrice': self.safe_number(greeks, 'ask'),
|
|
2458
|
+
'markPrice': self.safe_number(greeks, 'mark_price'),
|
|
2459
|
+
'lastPrice': self.safe_number(greeks, 'last_traded_price'),
|
|
2460
|
+
'underlyingPrice': self.safe_number(greeks, 'underlying_price'),
|
|
2461
|
+
'info': greeks,
|
|
2462
|
+
}
|
|
2463
|
+
|
|
1950
2464
|
def sign(self, path, api='public', method='GET', params={}, headers=None, body=None):
|
|
1951
2465
|
url = self.implode_hostname(self.urls['api'][self.version]) + '/' + self.implode_params(path, params)
|
|
1952
2466
|
query = self.omit(params, self.extract_params(path))
|
|
@@ -1954,7 +2468,6 @@ class paradex(Exchange, ImplicitAPI):
|
|
|
1954
2468
|
if query:
|
|
1955
2469
|
url += '?' + self.urlencode(query)
|
|
1956
2470
|
elif api == 'private':
|
|
1957
|
-
self.check_required_credentials()
|
|
1958
2471
|
headers = {
|
|
1959
2472
|
'Accept': 'application/json',
|
|
1960
2473
|
'PARADEX-PARTNER': self.safe_string(self.options, 'broker', 'CCXT'),
|