ccxt 4.2.76__py2.py3-none-any.whl → 4.4.48__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 +36 -14
- ccxt/abstract/alpaca.py +4 -0
- ccxt/abstract/bigone.py +1 -1
- ccxt/abstract/binance.py +112 -48
- ccxt/abstract/binancecoinm.py +112 -48
- ccxt/abstract/binanceus.py +147 -83
- ccxt/abstract/binanceusdm.py +112 -48
- ccxt/abstract/bingx.py +133 -78
- ccxt/abstract/bitbank.py +5 -0
- ccxt/abstract/bitfinex.py +136 -65
- ccxt/abstract/bitfinex1.py +69 -0
- ccxt/abstract/bitflyer.py +1 -0
- ccxt/abstract/bitget.py +8 -1
- ccxt/abstract/bitmart.py +13 -1
- ccxt/abstract/bitopro.py +1 -0
- ccxt/abstract/bitpanda.py +0 -12
- ccxt/abstract/bitrue.py +3 -3
- ccxt/abstract/bitstamp.py +26 -3
- ccxt/abstract/blofin.py +24 -0
- ccxt/abstract/btcbox.py +1 -0
- ccxt/abstract/bybit.py +29 -14
- ccxt/abstract/cex.py +28 -29
- ccxt/abstract/coinbase.py +6 -0
- ccxt/abstract/coinbaseadvanced.py +94 -0
- ccxt/abstract/{coinbasepro.py → coinbaseexchange.py} +1 -0
- ccxt/abstract/coinbaseinternational.py +1 -1
- ccxt/abstract/coincatch.py +94 -0
- ccxt/abstract/coinex.py +233 -123
- ccxt/abstract/coinmetro.py +1 -0
- ccxt/abstract/cryptocom.py +14 -0
- ccxt/abstract/defx.py +69 -0
- ccxt/abstract/deribit.py +1 -0
- ccxt/abstract/digifinex.py +1 -0
- ccxt/abstract/ellipx.py +25 -0
- ccxt/abstract/gate.py +20 -0
- ccxt/abstract/gateio.py +20 -0
- ccxt/abstract/gemini.py +1 -0
- ccxt/abstract/hashkey.py +67 -0
- ccxt/abstract/hyperliquid.py +1 -1
- ccxt/abstract/independentreserve.py +6 -0
- ccxt/abstract/kraken.py +4 -3
- ccxt/abstract/krakenfutures.py +4 -0
- ccxt/abstract/kucoin.py +25 -0
- ccxt/abstract/kucoinfutures.py +35 -0
- ccxt/abstract/luno.py +2 -0
- ccxt/abstract/mexc.py +4 -0
- ccxt/abstract/myokx.py +340 -0
- ccxt/abstract/oceanex.py +5 -0
- ccxt/abstract/okx.py +30 -0
- ccxt/abstract/onetrading.py +0 -12
- ccxt/abstract/oxfun.py +34 -0
- ccxt/abstract/paradex.py +40 -0
- ccxt/abstract/phemex.py +1 -0
- ccxt/abstract/upbit.py +4 -0
- ccxt/abstract/vertex.py +19 -0
- ccxt/abstract/whitebit.py +31 -1
- ccxt/abstract/woo.py +6 -2
- ccxt/abstract/woofipro.py +119 -0
- ccxt/abstract/xt.py +153 -0
- ccxt/abstract/zonda.py +6 -0
- ccxt/ace.py +164 -60
- ccxt/alpaca.py +727 -63
- ccxt/ascendex.py +395 -249
- ccxt/async_support/__init__.py +36 -14
- ccxt/async_support/ace.py +164 -60
- ccxt/async_support/alpaca.py +727 -63
- ccxt/async_support/ascendex.py +396 -249
- ccxt/async_support/base/exchange.py +531 -155
- ccxt/async_support/base/ws/aiohttp_client.py +28 -5
- ccxt/async_support/base/ws/cache.py +3 -2
- ccxt/async_support/base/ws/client.py +26 -5
- ccxt/async_support/base/ws/fast_client.py +4 -3
- ccxt/async_support/base/ws/functions.py +1 -1
- ccxt/async_support/base/ws/future.py +40 -31
- ccxt/async_support/base/ws/order_book_side.py +3 -0
- ccxt/async_support/bequant.py +1 -1
- ccxt/async_support/bigone.py +329 -202
- ccxt/async_support/binance.py +3513 -1511
- ccxt/async_support/binancecoinm.py +2 -1
- ccxt/async_support/binanceus.py +12 -1
- ccxt/async_support/binanceusdm.py +3 -1
- ccxt/async_support/bingx.py +3105 -881
- ccxt/async_support/bit2c.py +119 -38
- ccxt/async_support/bitbank.py +215 -76
- ccxt/async_support/bitbns.py +124 -53
- ccxt/async_support/bitfinex.py +3236 -1078
- ccxt/async_support/bitfinex1.py +1711 -0
- ccxt/async_support/bitflyer.py +239 -50
- ccxt/async_support/bitget.py +1513 -563
- ccxt/async_support/bithumb.py +201 -67
- ccxt/async_support/bitmart.py +1320 -435
- ccxt/async_support/bitmex.py +308 -111
- ccxt/async_support/bitopro.py +256 -96
- ccxt/async_support/bitrue.py +365 -233
- ccxt/async_support/bitso.py +201 -89
- ccxt/async_support/bitstamp.py +438 -269
- ccxt/async_support/bitteam.py +179 -73
- ccxt/async_support/bitvavo.py +180 -70
- ccxt/async_support/bl3p.py +92 -25
- ccxt/async_support/blockchaincom.py +193 -79
- ccxt/async_support/blofin.py +403 -150
- ccxt/async_support/btcalpha.py +161 -55
- ccxt/async_support/btcbox.py +250 -34
- ccxt/async_support/btcmarkets.py +232 -85
- ccxt/async_support/btcturk.py +159 -60
- ccxt/async_support/bybit.py +2326 -1255
- ccxt/async_support/cex.py +1409 -1329
- ccxt/async_support/coinbase.py +1455 -288
- ccxt/async_support/coinbaseadvanced.py +17 -0
- ccxt/async_support/{coinbasepro.py → coinbaseexchange.py} +233 -99
- ccxt/async_support/coinbaseinternational.py +428 -88
- ccxt/async_support/coincatch.py +5152 -0
- ccxt/async_support/coincheck.py +121 -38
- ccxt/async_support/coinex.py +4020 -3339
- ccxt/async_support/coinlist.py +273 -116
- ccxt/async_support/coinmate.py +204 -97
- ccxt/async_support/coinmetro.py +203 -110
- ccxt/async_support/coinone.py +142 -68
- ccxt/async_support/coinsph.py +206 -89
- ccxt/async_support/coinspot.py +137 -62
- ccxt/async_support/cryptocom.py +515 -185
- ccxt/async_support/currencycom.py +203 -85
- ccxt/async_support/defx.py +2066 -0
- ccxt/async_support/delta.py +467 -158
- ccxt/async_support/deribit.py +558 -324
- ccxt/async_support/digifinex.py +340 -223
- ccxt/async_support/ellipx.py +1826 -0
- ccxt/async_support/exmo.py +259 -128
- ccxt/async_support/gate.py +1473 -464
- ccxt/async_support/gemini.py +206 -84
- ccxt/async_support/hashkey.py +4164 -0
- ccxt/async_support/hitbtc.py +334 -178
- ccxt/async_support/hollaex.py +134 -83
- ccxt/async_support/htx.py +1095 -563
- ccxt/async_support/huobijp.py +105 -56
- ccxt/async_support/hyperliquid.py +1634 -269
- ccxt/async_support/idex.py +148 -95
- ccxt/async_support/independentreserve.py +236 -31
- ccxt/async_support/indodax.py +165 -62
- ccxt/async_support/kraken.py +871 -354
- ccxt/async_support/krakenfutures.py +324 -100
- ccxt/async_support/kucoin.py +1050 -355
- ccxt/async_support/kucoinfutures.py +1004 -149
- ccxt/async_support/kuna.py +138 -106
- ccxt/async_support/latoken.py +135 -79
- ccxt/async_support/lbank.py +290 -113
- ccxt/async_support/luno.py +112 -62
- ccxt/async_support/lykke.py +104 -55
- ccxt/async_support/mercado.py +36 -29
- ccxt/async_support/mexc.py +995 -429
- ccxt/async_support/myokx.py +43 -0
- ccxt/async_support/ndax.py +163 -82
- ccxt/async_support/novadax.py +121 -75
- ccxt/async_support/oceanex.py +175 -59
- ccxt/async_support/okcoin.py +222 -163
- ccxt/async_support/okx.py +1777 -455
- ccxt/async_support/onetrading.py +132 -414
- ccxt/async_support/oxfun.py +2832 -0
- ccxt/async_support/p2b.py +79 -51
- ccxt/async_support/paradex.py +2017 -0
- ccxt/async_support/paymium.py +56 -32
- ccxt/async_support/phemex.py +572 -196
- ccxt/async_support/poloniex.py +218 -95
- ccxt/async_support/poloniexfutures.py +260 -92
- ccxt/async_support/probit.py +143 -110
- ccxt/async_support/timex.py +123 -70
- ccxt/async_support/tokocrypto.py +129 -93
- ccxt/async_support/tradeogre.py +39 -25
- ccxt/async_support/upbit.py +322 -113
- ccxt/async_support/vertex.py +2983 -0
- ccxt/async_support/wavesexchange.py +227 -173
- ccxt/async_support/wazirx.py +145 -65
- ccxt/async_support/whitebit.py +533 -138
- ccxt/async_support/woo.py +1155 -295
- ccxt/async_support/woofipro.py +2716 -0
- ccxt/async_support/xt.py +4628 -0
- ccxt/async_support/yobit.py +160 -92
- ccxt/async_support/zaif.py +80 -33
- ccxt/async_support/zonda.py +140 -69
- ccxt/base/errors.py +51 -20
- ccxt/base/exchange.py +1729 -482
- ccxt/base/precise.py +10 -0
- ccxt/base/types.py +223 -4
- ccxt/bequant.py +1 -1
- ccxt/bigone.py +329 -202
- ccxt/binance.py +3513 -1511
- ccxt/binancecoinm.py +2 -1
- ccxt/binanceus.py +12 -1
- ccxt/binanceusdm.py +3 -1
- ccxt/bingx.py +3105 -881
- ccxt/bit2c.py +119 -38
- ccxt/bitbank.py +215 -76
- ccxt/bitbns.py +124 -53
- ccxt/bitfinex.py +3235 -1078
- ccxt/bitfinex1.py +1710 -0
- ccxt/bitflyer.py +239 -50
- ccxt/bitget.py +1513 -563
- ccxt/bithumb.py +200 -67
- ccxt/bitmart.py +1320 -435
- ccxt/bitmex.py +308 -111
- ccxt/bitopro.py +256 -96
- ccxt/bitrue.py +365 -233
- ccxt/bitso.py +201 -89
- ccxt/bitstamp.py +438 -269
- ccxt/bitteam.py +179 -73
- ccxt/bitvavo.py +180 -70
- ccxt/bl3p.py +92 -25
- ccxt/blockchaincom.py +193 -79
- ccxt/blofin.py +403 -150
- ccxt/btcalpha.py +161 -55
- ccxt/btcbox.py +250 -34
- ccxt/btcmarkets.py +232 -85
- ccxt/btcturk.py +159 -60
- ccxt/bybit.py +2326 -1255
- ccxt/cex.py +1408 -1329
- ccxt/coinbase.py +1455 -288
- ccxt/coinbaseadvanced.py +17 -0
- ccxt/{coinbasepro.py → coinbaseexchange.py} +233 -99
- ccxt/coinbaseinternational.py +428 -88
- ccxt/coincatch.py +5152 -0
- ccxt/coincheck.py +121 -38
- ccxt/coinex.py +4020 -3339
- ccxt/coinlist.py +273 -116
- ccxt/coinmate.py +204 -97
- ccxt/coinmetro.py +203 -110
- ccxt/coinone.py +142 -68
- ccxt/coinsph.py +206 -89
- ccxt/coinspot.py +137 -62
- ccxt/cryptocom.py +515 -185
- ccxt/currencycom.py +203 -85
- ccxt/defx.py +2065 -0
- ccxt/delta.py +467 -158
- ccxt/deribit.py +558 -324
- ccxt/digifinex.py +340 -223
- ccxt/ellipx.py +1826 -0
- ccxt/exmo.py +259 -128
- ccxt/gate.py +1473 -464
- ccxt/gemini.py +206 -84
- ccxt/hashkey.py +4164 -0
- ccxt/hitbtc.py +334 -178
- ccxt/hollaex.py +134 -83
- ccxt/htx.py +1095 -563
- ccxt/huobijp.py +105 -56
- ccxt/hyperliquid.py +1633 -269
- ccxt/idex.py +148 -95
- ccxt/independentreserve.py +235 -31
- ccxt/indodax.py +165 -62
- ccxt/kraken.py +871 -354
- ccxt/krakenfutures.py +324 -100
- ccxt/kucoin.py +1050 -355
- ccxt/kucoinfutures.py +1004 -149
- ccxt/kuna.py +138 -106
- ccxt/latoken.py +135 -79
- ccxt/lbank.py +290 -113
- ccxt/luno.py +112 -62
- ccxt/lykke.py +104 -55
- ccxt/mercado.py +36 -29
- ccxt/mexc.py +994 -429
- ccxt/myokx.py +43 -0
- ccxt/ndax.py +163 -82
- ccxt/novadax.py +121 -75
- ccxt/oceanex.py +175 -59
- ccxt/okcoin.py +222 -163
- ccxt/okx.py +1777 -455
- ccxt/onetrading.py +132 -414
- ccxt/oxfun.py +2831 -0
- ccxt/p2b.py +79 -51
- ccxt/paradex.py +2017 -0
- ccxt/paymium.py +56 -32
- ccxt/phemex.py +572 -196
- ccxt/poloniex.py +218 -95
- ccxt/poloniexfutures.py +260 -92
- ccxt/pro/__init__.py +29 -5
- ccxt/pro/alpaca.py +32 -17
- ccxt/pro/ascendex.py +63 -15
- ccxt/pro/bequant.py +4 -0
- ccxt/pro/binance.py +1596 -329
- ccxt/pro/binancecoinm.py +1 -0
- ccxt/pro/binanceus.py +2 -9
- ccxt/pro/binanceusdm.py +2 -0
- ccxt/pro/bingx.py +527 -134
- ccxt/pro/bitcoincom.py +4 -1
- ccxt/pro/bitfinex.py +731 -266
- ccxt/pro/bitfinex1.py +635 -0
- ccxt/pro/bitget.py +726 -357
- ccxt/pro/bithumb.py +380 -0
- ccxt/pro/bitmart.py +138 -39
- ccxt/pro/bitmex.py +199 -40
- ccxt/pro/bitopro.py +25 -13
- ccxt/pro/bitrue.py +31 -32
- ccxt/pro/bitstamp.py +7 -6
- ccxt/pro/bitvavo.py +204 -82
- ccxt/pro/blockchaincom.py +30 -17
- ccxt/pro/blofin.py +692 -0
- ccxt/pro/bybit.py +791 -82
- ccxt/pro/cex.py +99 -51
- ccxt/pro/coinbase.py +220 -30
- ccxt/{async_support/hitbtc3.py → pro/coinbaseadvanced.py} +5 -5
- ccxt/pro/{coinbasepro.py → coinbaseexchange.py} +19 -19
- ccxt/pro/coinbaseinternational.py +193 -30
- ccxt/pro/coincatch.py +1464 -0
- ccxt/pro/coincheck.py +11 -6
- ccxt/pro/coinex.py +967 -661
- ccxt/pro/coinone.py +17 -10
- ccxt/pro/cryptocom.py +446 -66
- ccxt/pro/currencycom.py +11 -10
- ccxt/pro/defx.py +832 -0
- ccxt/pro/deribit.py +168 -32
- ccxt/pro/exmo.py +253 -21
- ccxt/pro/gate.py +729 -64
- ccxt/pro/gemini.py +44 -26
- ccxt/pro/hashkey.py +802 -0
- ccxt/pro/hitbtc.py +208 -103
- ccxt/pro/hollaex.py +25 -9
- ccxt/pro/htx.py +83 -39
- ccxt/pro/huobijp.py +17 -16
- ccxt/pro/hyperliquid.py +502 -31
- ccxt/pro/idex.py +28 -13
- ccxt/pro/independentreserve.py +21 -16
- ccxt/pro/kraken.py +298 -51
- ccxt/pro/krakenfutures.py +166 -75
- ccxt/pro/kucoin.py +395 -77
- ccxt/pro/kucoinfutures.py +400 -99
- ccxt/pro/lbank.py +52 -31
- ccxt/pro/luno.py +12 -10
- ccxt/pro/mexc.py +400 -50
- ccxt/pro/myokx.py +28 -0
- ccxt/pro/ndax.py +25 -12
- ccxt/pro/okcoin.py +28 -9
- ccxt/pro/okx.py +935 -124
- ccxt/pro/onetrading.py +41 -24
- ccxt/pro/oxfun.py +1054 -0
- ccxt/pro/p2b.py +100 -24
- ccxt/pro/paradex.py +352 -0
- ccxt/pro/phemex.py +93 -34
- ccxt/pro/poloniex.py +129 -50
- ccxt/pro/poloniexfutures.py +53 -32
- ccxt/pro/probit.py +93 -86
- ccxt/pro/upbit.py +401 -8
- ccxt/pro/vertex.py +943 -0
- ccxt/pro/wazirx.py +46 -28
- ccxt/pro/whitebit.py +65 -12
- ccxt/pro/woo.py +486 -70
- ccxt/pro/woofipro.py +1271 -0
- ccxt/pro/xt.py +1067 -0
- ccxt/probit.py +143 -110
- ccxt/static_dependencies/__init__.py +1 -1
- ccxt/static_dependencies/lark/__init__.py +38 -0
- ccxt/static_dependencies/lark/__pyinstaller/__init__.py +6 -0
- ccxt/static_dependencies/lark/__pyinstaller/hook-lark.py +14 -0
- ccxt/static_dependencies/lark/ast_utils.py +59 -0
- ccxt/static_dependencies/lark/common.py +86 -0
- ccxt/static_dependencies/lark/exceptions.py +292 -0
- ccxt/static_dependencies/lark/grammar.py +130 -0
- ccxt/static_dependencies/lark/grammars/__init__.py +0 -0
- ccxt/static_dependencies/lark/indenter.py +143 -0
- ccxt/static_dependencies/lark/lark.py +658 -0
- ccxt/static_dependencies/lark/lexer.py +678 -0
- ccxt/static_dependencies/lark/load_grammar.py +1428 -0
- ccxt/static_dependencies/lark/parse_tree_builder.py +391 -0
- ccxt/static_dependencies/lark/parser_frontends.py +257 -0
- ccxt/static_dependencies/lark/parsers/__init__.py +0 -0
- ccxt/static_dependencies/lark/parsers/cyk.py +340 -0
- ccxt/static_dependencies/lark/parsers/earley.py +314 -0
- ccxt/static_dependencies/lark/parsers/earley_common.py +42 -0
- ccxt/static_dependencies/lark/parsers/earley_forest.py +801 -0
- ccxt/static_dependencies/lark/parsers/grammar_analysis.py +203 -0
- ccxt/static_dependencies/lark/parsers/lalr_analysis.py +332 -0
- ccxt/static_dependencies/lark/parsers/lalr_interactive_parser.py +158 -0
- ccxt/static_dependencies/lark/parsers/lalr_parser.py +122 -0
- ccxt/static_dependencies/lark/parsers/lalr_parser_state.py +110 -0
- ccxt/static_dependencies/lark/parsers/xearley.py +165 -0
- ccxt/static_dependencies/lark/py.typed +0 -0
- ccxt/static_dependencies/lark/reconstruct.py +107 -0
- ccxt/static_dependencies/lark/tools/__init__.py +70 -0
- ccxt/static_dependencies/lark/tools/nearley.py +202 -0
- ccxt/static_dependencies/lark/tools/serialize.py +32 -0
- ccxt/static_dependencies/lark/tools/standalone.py +196 -0
- ccxt/static_dependencies/lark/tree.py +267 -0
- ccxt/static_dependencies/lark/tree_matcher.py +186 -0
- ccxt/static_dependencies/lark/tree_templates.py +180 -0
- ccxt/static_dependencies/lark/utils.py +343 -0
- ccxt/static_dependencies/lark/visitors.py +596 -0
- ccxt/static_dependencies/marshmallow/__init__.py +81 -0
- ccxt/static_dependencies/marshmallow/base.py +65 -0
- ccxt/static_dependencies/marshmallow/class_registry.py +94 -0
- ccxt/static_dependencies/marshmallow/decorators.py +231 -0
- ccxt/static_dependencies/marshmallow/error_store.py +60 -0
- ccxt/static_dependencies/marshmallow/exceptions.py +71 -0
- ccxt/static_dependencies/marshmallow/fields.py +2114 -0
- ccxt/static_dependencies/marshmallow/orderedset.py +89 -0
- ccxt/static_dependencies/marshmallow/py.typed +0 -0
- ccxt/static_dependencies/marshmallow/schema.py +1228 -0
- ccxt/static_dependencies/marshmallow/types.py +12 -0
- ccxt/static_dependencies/marshmallow/utils.py +378 -0
- ccxt/static_dependencies/marshmallow/validate.py +678 -0
- ccxt/static_dependencies/marshmallow/warnings.py +2 -0
- ccxt/static_dependencies/marshmallow_dataclass/__init__.py +1047 -0
- ccxt/static_dependencies/marshmallow_dataclass/collection_field.py +51 -0
- ccxt/static_dependencies/marshmallow_dataclass/lazy_class_attribute.py +45 -0
- ccxt/static_dependencies/marshmallow_dataclass/mypy.py +71 -0
- ccxt/static_dependencies/marshmallow_dataclass/py.typed +0 -0
- ccxt/static_dependencies/marshmallow_dataclass/typing.py +14 -0
- ccxt/static_dependencies/marshmallow_dataclass/union_field.py +82 -0
- ccxt/static_dependencies/marshmallow_oneofschema/__init__.py +1 -0
- ccxt/static_dependencies/marshmallow_oneofschema/one_of_schema.py +193 -0
- ccxt/static_dependencies/marshmallow_oneofschema/py.typed +0 -0
- ccxt/static_dependencies/starknet/__init__.py +0 -0
- ccxt/static_dependencies/starknet/cairo/__init__.py +0 -0
- ccxt/static_dependencies/starknet/cairo/data_types.py +123 -0
- ccxt/static_dependencies/starknet/cairo/deprecated_parse/__init__.py +0 -0
- ccxt/static_dependencies/starknet/cairo/deprecated_parse/cairo_types.py +77 -0
- ccxt/static_dependencies/starknet/cairo/deprecated_parse/parser.py +46 -0
- ccxt/static_dependencies/starknet/cairo/deprecated_parse/parser_transformer.py +138 -0
- ccxt/static_dependencies/starknet/cairo/felt.py +64 -0
- ccxt/static_dependencies/starknet/cairo/type_parser.py +121 -0
- ccxt/static_dependencies/starknet/cairo/v1/__init__.py +0 -0
- ccxt/static_dependencies/starknet/cairo/v1/type_parser.py +59 -0
- ccxt/static_dependencies/starknet/cairo/v2/__init__.py +0 -0
- ccxt/static_dependencies/starknet/cairo/v2/type_parser.py +77 -0
- ccxt/static_dependencies/starknet/ccxt_utils.py +7 -0
- ccxt/static_dependencies/starknet/common.py +15 -0
- ccxt/static_dependencies/starknet/constants.py +39 -0
- ccxt/static_dependencies/starknet/hash/__init__.py +0 -0
- ccxt/static_dependencies/starknet/hash/address.py +79 -0
- ccxt/static_dependencies/starknet/hash/compiled_class_hash_objects.py +111 -0
- ccxt/static_dependencies/starknet/hash/selector.py +16 -0
- ccxt/static_dependencies/starknet/hash/storage.py +12 -0
- ccxt/static_dependencies/starknet/hash/utils.py +78 -0
- ccxt/static_dependencies/starknet/models/__init__.py +0 -0
- ccxt/static_dependencies/starknet/models/typed_data.py +45 -0
- ccxt/static_dependencies/starknet/serialization/__init__.py +24 -0
- ccxt/static_dependencies/starknet/serialization/_calldata_reader.py +40 -0
- ccxt/static_dependencies/starknet/serialization/_context.py +142 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/__init__.py +10 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/_common.py +82 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/array_serializer.py +43 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/bool_serializer.py +37 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/byte_array_serializer.py +66 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/cairo_data_serializer.py +71 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/enum_serializer.py +71 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/felt_serializer.py +50 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/named_tuple_serializer.py +58 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/option_serializer.py +43 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/output_serializer.py +40 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/payload_serializer.py +72 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/struct_serializer.py +36 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/tuple_serializer.py +36 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/uint256_serializer.py +76 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/uint_serializer.py +100 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/unit_serializer.py +32 -0
- ccxt/static_dependencies/starknet/serialization/errors.py +10 -0
- ccxt/static_dependencies/starknet/serialization/factory.py +229 -0
- ccxt/static_dependencies/starknet/serialization/function_serialization_adapter.py +110 -0
- ccxt/static_dependencies/starknet/serialization/tuple_dataclass.py +59 -0
- ccxt/static_dependencies/starknet/utils/__init__.py +0 -0
- ccxt/static_dependencies/starknet/utils/constructor_args_translator.py +86 -0
- ccxt/static_dependencies/starknet/utils/iterable.py +13 -0
- ccxt/static_dependencies/starknet/utils/schema.py +13 -0
- ccxt/static_dependencies/starknet/utils/typed_data.py +182 -0
- ccxt/static_dependencies/starkware/__init__.py +0 -0
- ccxt/static_dependencies/starkware/crypto/__init__.py +0 -0
- ccxt/static_dependencies/starkware/crypto/fast_pedersen_hash.py +50 -0
- ccxt/static_dependencies/starkware/crypto/math_utils.py +78 -0
- ccxt/static_dependencies/starkware/crypto/signature.py +2344 -0
- ccxt/static_dependencies/starkware/crypto/utils.py +63 -0
- ccxt/static_dependencies/sympy/__init__.py +0 -0
- ccxt/static_dependencies/sympy/core/__init__.py +0 -0
- ccxt/static_dependencies/sympy/core/intfunc.py +35 -0
- ccxt/static_dependencies/sympy/external/__init__.py +0 -0
- ccxt/static_dependencies/sympy/external/gmpy.py +345 -0
- ccxt/static_dependencies/sympy/external/importtools.py +187 -0
- ccxt/static_dependencies/sympy/external/ntheory.py +637 -0
- ccxt/static_dependencies/sympy/external/pythonmpq.py +341 -0
- ccxt/static_dependencies/typing_inspect/__init__.py +0 -0
- ccxt/static_dependencies/typing_inspect/typing_inspect.py +851 -0
- ccxt/test/{test_async.py → tests_async.py} +465 -407
- ccxt/test/tests_helpers.py +285 -0
- ccxt/test/tests_init.py +39 -0
- ccxt/test/{test_sync.py → tests_sync.py} +465 -409
- ccxt/timex.py +123 -70
- ccxt/tokocrypto.py +129 -93
- ccxt/tradeogre.py +39 -25
- ccxt/upbit.py +322 -113
- ccxt/vertex.py +2983 -0
- ccxt/wavesexchange.py +227 -173
- ccxt/wazirx.py +145 -65
- ccxt/whitebit.py +533 -138
- ccxt/woo.py +1155 -295
- ccxt/woofipro.py +2716 -0
- ccxt/xt.py +4627 -0
- ccxt/yobit.py +159 -92
- ccxt/zaif.py +80 -33
- ccxt/zonda.py +140 -69
- ccxt-4.4.48.dist-info/LICENSE.txt +21 -0
- ccxt-4.4.48.dist-info/METADATA +646 -0
- ccxt-4.4.48.dist-info/RECORD +669 -0
- {ccxt-4.2.76.dist-info → ccxt-4.4.48.dist-info}/WHEEL +1 -1
- ccxt/abstract/bitbay.py +0 -47
- ccxt/abstract/bitfinex2.py +0 -139
- ccxt/abstract/hitbtc3.py +0 -115
- ccxt/async_support/bitbay.py +0 -17
- ccxt/async_support/bitfinex2.py +0 -3496
- ccxt/async_support/flowbtc.py +0 -34
- ccxt/bitbay.py +0 -17
- ccxt/bitfinex2.py +0 -3496
- ccxt/flowbtc.py +0 -34
- ccxt/hitbtc3.py +0 -16
- ccxt/pro/bitfinex2.py +0 -1081
- ccxt/test/base/__init__.py +0 -28
- 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 -103
- 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 -32
- 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_margin_mode.py +0 -24
- ccxt/test/base/test_margin_modification.py +0 -35
- ccxt/test/base/test_market.py +0 -190
- ccxt/test/base/test_number.py +0 -411
- ccxt/test/base/test_ohlcv.py +0 -32
- 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 -63
- ccxt/test/base/test_position.py +0 -60
- ccxt/test/base/test_shared_methods.py +0 -345
- ccxt/test/base/test_status.py +0 -24
- ccxt/test/base/test_throttle.py +0 -126
- ccxt/test/base/test_ticker.py +0 -86
- 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-4.2.76.dist-info/METADATA +0 -626
- ccxt-4.2.76.dist-info/RECORD +0 -534
- {ccxt-4.2.76.dist-info → ccxt-4.4.48.dist-info}/top_level.txt +0 -0
ccxt/cryptocom.py
CHANGED
@@ -6,9 +6,10 @@
|
|
6
6
|
from ccxt.base.exchange import Exchange
|
7
7
|
from ccxt.abstract.cryptocom import ImplicitAPI
|
8
8
|
import hashlib
|
9
|
-
from ccxt.base.types import Account, Balances, Currency, Int, Market, Num, Order, OrderBook, OrderRequest, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, Transaction
|
9
|
+
from ccxt.base.types import Account, Balances, Currency, DepositAddress, Int, LedgerEntry, Market, Num, Order, OrderBook, OrderRequest, CancellationRequest, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, TradingFeeInterface, TradingFees, Transaction
|
10
10
|
from typing import List
|
11
11
|
from ccxt.base.errors import ExchangeError
|
12
|
+
from ccxt.base.errors import AuthenticationError
|
12
13
|
from ccxt.base.errors import PermissionDenied
|
13
14
|
from ccxt.base.errors import AccountNotEnabled
|
14
15
|
from ccxt.base.errors import ArgumentsRequired
|
@@ -16,11 +17,13 @@ from ccxt.base.errors import BadRequest
|
|
16
17
|
from ccxt.base.errors import BadSymbol
|
17
18
|
from ccxt.base.errors import InsufficientFunds
|
18
19
|
from ccxt.base.errors import InvalidOrder
|
20
|
+
from ccxt.base.errors import OrderNotFound
|
19
21
|
from ccxt.base.errors import NotSupported
|
20
22
|
from ccxt.base.errors import DDoSProtection
|
23
|
+
from ccxt.base.errors import RateLimitExceeded
|
21
24
|
from ccxt.base.errors import OnMaintenance
|
22
25
|
from ccxt.base.errors import InvalidNonce
|
23
|
-
from ccxt.base.errors import
|
26
|
+
from ccxt.base.errors import RequestTimeout
|
24
27
|
from ccxt.base.decimal_to_precision import TICK_SIZE
|
25
28
|
from ccxt.base.precise import Precise
|
26
29
|
|
@@ -47,6 +50,7 @@ class cryptocom(Exchange, ImplicitAPI):
|
|
47
50
|
'cancelAllOrders': True,
|
48
51
|
'cancelOrder': True,
|
49
52
|
'cancelOrders': True,
|
53
|
+
'cancelOrdersForSymbols': True,
|
50
54
|
'closeAllPositions': False,
|
51
55
|
'closePosition': True,
|
52
56
|
'createMarketBuyOrderWithCost': False,
|
@@ -54,6 +58,8 @@ class cryptocom(Exchange, ImplicitAPI):
|
|
54
58
|
'createMarketSellOrderWithCost': False,
|
55
59
|
'createOrder': True,
|
56
60
|
'createOrders': True,
|
61
|
+
'createStopOrder': True,
|
62
|
+
'createTriggerOrder': True,
|
57
63
|
'fetchAccounts': True,
|
58
64
|
'fetchBalance': True,
|
59
65
|
'fetchBidsAsks': False,
|
@@ -65,6 +71,7 @@ class cryptocom(Exchange, ImplicitAPI):
|
|
65
71
|
'fetchCrossBorrowRates': False,
|
66
72
|
'fetchCurrencies': False,
|
67
73
|
'fetchDepositAddress': True,
|
74
|
+
'fetchDepositAddresses': False,
|
68
75
|
'fetchDepositAddressesByNetwork': True,
|
69
76
|
'fetchDeposits': True,
|
70
77
|
'fetchDepositsWithdrawals': False,
|
@@ -81,6 +88,7 @@ class cryptocom(Exchange, ImplicitAPI):
|
|
81
88
|
'fetchLedger': True,
|
82
89
|
'fetchLeverage': False,
|
83
90
|
'fetchLeverageTiers': False,
|
91
|
+
'fetchMarginAdjustmentHistory': False,
|
84
92
|
'fetchMarginMode': False,
|
85
93
|
'fetchMarketLeverageTiers': False,
|
86
94
|
'fetchMarkets': True,
|
@@ -93,8 +101,10 @@ class cryptocom(Exchange, ImplicitAPI):
|
|
93
101
|
'fetchOrderBook': True,
|
94
102
|
'fetchOrders': True,
|
95
103
|
'fetchPosition': True,
|
104
|
+
'fetchPositionHistory': False,
|
96
105
|
'fetchPositionMode': False,
|
97
106
|
'fetchPositions': True,
|
107
|
+
'fetchPositionsHistory': False,
|
98
108
|
'fetchPremiumIndexOHLCV': False,
|
99
109
|
'fetchSettlementHistory': True,
|
100
110
|
'fetchStatus': False,
|
@@ -102,8 +112,8 @@ class cryptocom(Exchange, ImplicitAPI):
|
|
102
112
|
'fetchTickers': True,
|
103
113
|
'fetchTime': False,
|
104
114
|
'fetchTrades': True,
|
105
|
-
'fetchTradingFee':
|
106
|
-
'fetchTradingFees':
|
115
|
+
'fetchTradingFee': True,
|
116
|
+
'fetchTradingFees': True,
|
107
117
|
'fetchTransactionFees': False,
|
108
118
|
'fetchTransactions': False,
|
109
119
|
'fetchTransfers': False,
|
@@ -113,6 +123,7 @@ class cryptocom(Exchange, ImplicitAPI):
|
|
113
123
|
'reduceMargin': False,
|
114
124
|
'repayCrossMargin': False,
|
115
125
|
'repayIsolatedMargin': False,
|
126
|
+
'sandbox': True,
|
116
127
|
'setLeverage': False,
|
117
128
|
'setMarginMode': False,
|
118
129
|
'setPositionMode': False,
|
@@ -148,7 +159,7 @@ class cryptocom(Exchange, ImplicitAPI):
|
|
148
159
|
'www': 'https://crypto.com/',
|
149
160
|
'referral': {
|
150
161
|
'url': 'https://crypto.com/exch/kdacthrnxt',
|
151
|
-
'discount': 0.
|
162
|
+
'discount': 0.75,
|
152
163
|
},
|
153
164
|
'doc': [
|
154
165
|
'https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html',
|
@@ -170,6 +181,10 @@ class cryptocom(Exchange, ImplicitAPI):
|
|
170
181
|
'public/get-valuations': 1,
|
171
182
|
'public/get-expired-settlement-price': 10 / 3,
|
172
183
|
'public/get-insurance': 1,
|
184
|
+
'public/get-risk-parameters': 1,
|
185
|
+
},
|
186
|
+
'post': {
|
187
|
+
'public/staking/get-conversion-rate': 2,
|
173
188
|
},
|
174
189
|
},
|
175
190
|
'private': {
|
@@ -200,6 +215,18 @@ class cryptocom(Exchange, ImplicitAPI):
|
|
200
215
|
'private/get-accounts': 10 / 3,
|
201
216
|
'private/get-withdrawal-history': 10 / 3,
|
202
217
|
'private/get-deposit-history': 10 / 3,
|
218
|
+
'private/get-fee-rate': 2,
|
219
|
+
'private/get-instrument-fee-rate': 2,
|
220
|
+
'private/staking/stake': 2,
|
221
|
+
'private/staking/unstake': 2,
|
222
|
+
'private/staking/get-staking-position': 2,
|
223
|
+
'private/staking/get-staking-instruments': 2,
|
224
|
+
'private/staking/get-open-stake': 2,
|
225
|
+
'private/staking/get-stake-history': 2,
|
226
|
+
'private/staking/get-reward-history': 2,
|
227
|
+
'private/staking/convert': 2,
|
228
|
+
'private/staking/get-open-convert': 2,
|
229
|
+
'private/staking/get-convert-history': 2,
|
203
230
|
},
|
204
231
|
},
|
205
232
|
},
|
@@ -339,6 +366,97 @@ class cryptocom(Exchange, ImplicitAPI):
|
|
339
366
|
},
|
340
367
|
'broker': 'CCXT',
|
341
368
|
},
|
369
|
+
'features': {
|
370
|
+
'default': {
|
371
|
+
'sandbox': True,
|
372
|
+
'createOrder': {
|
373
|
+
'marginMode': True,
|
374
|
+
'triggerPrice': True,
|
375
|
+
# todo: implementation fix
|
376
|
+
'triggerPriceType': {
|
377
|
+
'last': True,
|
378
|
+
'mark': True,
|
379
|
+
'index': True,
|
380
|
+
},
|
381
|
+
'triggerDirection': False,
|
382
|
+
'stopLossPrice': True,
|
383
|
+
'takeProfitPrice': True,
|
384
|
+
'attachedStopLossTakeProfit': None,
|
385
|
+
'timeInForce': {
|
386
|
+
'IOC': True,
|
387
|
+
'FOK': True,
|
388
|
+
'PO': True,
|
389
|
+
'GTD': False,
|
390
|
+
},
|
391
|
+
'hedged': False,
|
392
|
+
'selfTradePrevention': True, # todo: implement
|
393
|
+
'trailing': False,
|
394
|
+
'iceberg': False,
|
395
|
+
'leverage': False,
|
396
|
+
'marketBuyByCost': True,
|
397
|
+
'marketBuyRequiresPrice': True,
|
398
|
+
},
|
399
|
+
'createOrders': {
|
400
|
+
'max': 10,
|
401
|
+
},
|
402
|
+
'fetchMyTrades': {
|
403
|
+
'marginMode': False,
|
404
|
+
'limit': 100,
|
405
|
+
'daysBack': None,
|
406
|
+
'untilDays': 1,
|
407
|
+
},
|
408
|
+
'fetchOrder': {
|
409
|
+
'marginMode': False,
|
410
|
+
'trigger': False,
|
411
|
+
'trailing': False,
|
412
|
+
},
|
413
|
+
'fetchOpenOrders': {
|
414
|
+
'marginMode': True,
|
415
|
+
'limit': 100,
|
416
|
+
'trigger': False,
|
417
|
+
'trailing': False,
|
418
|
+
},
|
419
|
+
'fetchOrders': {
|
420
|
+
'marginMode': False,
|
421
|
+
'limit': 100,
|
422
|
+
'daysBack': None,
|
423
|
+
'untilDays': 1,
|
424
|
+
'trigger': False,
|
425
|
+
'trailing': False,
|
426
|
+
},
|
427
|
+
'fetchClosedOrders': {
|
428
|
+
'marginMode': False,
|
429
|
+
'limit': 100,
|
430
|
+
'daysBack': None,
|
431
|
+
'daysBackCanceled': None,
|
432
|
+
'untilDays': 1,
|
433
|
+
'trigger': False,
|
434
|
+
'trailing': False,
|
435
|
+
},
|
436
|
+
'fetchOHLCV': {
|
437
|
+
'limit': 300,
|
438
|
+
},
|
439
|
+
},
|
440
|
+
'spot': {
|
441
|
+
'extends': 'default',
|
442
|
+
},
|
443
|
+
'swap': {
|
444
|
+
'linear': {
|
445
|
+
'extends': 'default',
|
446
|
+
},
|
447
|
+
'inverse': {
|
448
|
+
'extends': 'default',
|
449
|
+
},
|
450
|
+
},
|
451
|
+
'future': {
|
452
|
+
'linear': {
|
453
|
+
'extends': 'default',
|
454
|
+
},
|
455
|
+
'inverse': {
|
456
|
+
'extends': 'default',
|
457
|
+
},
|
458
|
+
},
|
459
|
+
},
|
342
460
|
# https://exchange-docs.crypto.com/spot/index.html#response-and-reason-codes
|
343
461
|
'commonCurrencies': {
|
344
462
|
'USD_STABLE_COIN': 'USDC',
|
@@ -383,16 +501,29 @@ class cryptocom(Exchange, ImplicitAPI):
|
|
383
501
|
'40006': BadRequest,
|
384
502
|
'40007': BadRequest,
|
385
503
|
'40101': AuthenticationError,
|
386
|
-
'
|
504
|
+
'40102': InvalidNonce, # Nonce value differs by more than 60 seconds from server
|
505
|
+
'40103': AuthenticationError, # IP address not whitelisted
|
506
|
+
'40104': AuthenticationError, # Disallowed based on user tier
|
507
|
+
'40107': BadRequest, # Session subscription limit has been exceeded
|
508
|
+
'40401': OrderNotFound,
|
509
|
+
'40801': RequestTimeout,
|
510
|
+
'42901': RateLimitExceeded,
|
511
|
+
'43005': InvalidOrder, # Rejected POST_ONLY create-order request(normally happened when exec_inst contains POST_ONLY but time_in_force is NOT GOOD_TILL_CANCEL)
|
512
|
+
'43003': InvalidOrder, # FOK order has not been filled and cancelled
|
513
|
+
'43004': InvalidOrder, # IOC order has not been filled and cancelled
|
514
|
+
'43012': BadRequest, # Canceled due to Self Trade Prevention
|
515
|
+
'50001': ExchangeError,
|
387
516
|
'9010001': OnMaintenance, # {"code":9010001,"message":"SYSTEM_MAINTENANCE","details":"Crypto.com Exchange is currently under maintenance. Please refer to https://status.crypto.com for more details."}
|
388
517
|
},
|
389
518
|
'broad': {},
|
390
519
|
},
|
391
520
|
})
|
392
521
|
|
393
|
-
def fetch_markets(self, params={}):
|
522
|
+
def fetch_markets(self, params={}) -> List[Market]:
|
394
523
|
"""
|
395
|
-
|
524
|
+
|
525
|
+
https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#public-get-instruments
|
526
|
+
|
396
527
|
retrieves data on all markets for cryptocom
|
397
528
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
398
529
|
:returns dict[]: an array of objects representing market data
|
@@ -485,8 +616,8 @@ class cryptocom(Exchange, ImplicitAPI):
|
|
485
616
|
# }
|
486
617
|
# }
|
487
618
|
#
|
488
|
-
resultResponse = self.
|
489
|
-
data = self.
|
619
|
+
resultResponse = self.safe_dict(response, 'result', {})
|
620
|
+
data = self.safe_list(resultResponse, 'data', [])
|
490
621
|
result = []
|
491
622
|
for i in range(0, len(data)):
|
492
623
|
market = data[i]
|
@@ -503,9 +634,10 @@ class cryptocom(Exchange, ImplicitAPI):
|
|
503
634
|
settle = None if spot else self.safe_currency_code(settleId)
|
504
635
|
optionType = self.safe_string_lower(market, 'put_call')
|
505
636
|
strike = self.safe_string(market, 'strike')
|
506
|
-
marginBuyEnabled = self.
|
507
|
-
marginSellEnabled = self.
|
508
|
-
|
637
|
+
marginBuyEnabled = self.safe_bool(market, 'margin_buy_enabled')
|
638
|
+
marginSellEnabled = self.safe_bool(market, 'margin_sell_enabled')
|
639
|
+
expiryString = self.omit_zero(self.safe_string(market, 'expiry_timestamp_ms'))
|
640
|
+
expiry = int(expiryString) if (expiryString is not None) else None
|
509
641
|
symbol = base + '/' + quote
|
510
642
|
type = None
|
511
643
|
contract = None
|
@@ -540,7 +672,7 @@ class cryptocom(Exchange, ImplicitAPI):
|
|
540
672
|
'swap': swap,
|
541
673
|
'future': future,
|
542
674
|
'option': option,
|
543
|
-
'active': self.
|
675
|
+
'active': self.safe_bool(market, 'tradable'),
|
544
676
|
'contract': contract,
|
545
677
|
'linear': True if (contract) else None,
|
546
678
|
'inverse': False if (contract) else None,
|
@@ -579,15 +711,17 @@ class cryptocom(Exchange, ImplicitAPI):
|
|
579
711
|
def fetch_tickers(self, symbols: Strings = None, params={}) -> Tickers:
|
580
712
|
"""
|
581
713
|
fetches price tickers for multiple markets, statistical information calculated over the past 24 hours for each market
|
582
|
-
|
583
|
-
|
714
|
+
|
715
|
+
https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#public-get-tickers
|
716
|
+
https://exchange-docs.crypto.com/derivatives/index.html#public-get-tickers
|
717
|
+
|
584
718
|
:param str[]|None symbols: unified symbols of the markets to fetch the ticker for, all market tickers are returned if not assigned
|
585
719
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
586
720
|
:returns dict: a dictionary of `ticker structures <https://docs.ccxt.com/#/?id=ticker-structure>`
|
587
721
|
"""
|
588
722
|
self.load_markets()
|
589
723
|
market = None
|
590
|
-
request = {}
|
724
|
+
request: dict = {}
|
591
725
|
if symbols is not None:
|
592
726
|
symbol = None
|
593
727
|
if isinstance(symbols, list):
|
@@ -624,13 +758,15 @@ class cryptocom(Exchange, ImplicitAPI):
|
|
624
758
|
# }
|
625
759
|
# }
|
626
760
|
#
|
627
|
-
result = self.
|
628
|
-
data = self.
|
761
|
+
result = self.safe_dict(response, 'result', {})
|
762
|
+
data = self.safe_list(result, 'data', [])
|
629
763
|
return self.parse_tickers(data, symbols)
|
630
764
|
|
631
765
|
def fetch_ticker(self, symbol: str, params={}) -> Ticker:
|
632
766
|
"""
|
633
|
-
|
767
|
+
|
768
|
+
https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#public-get-tickers
|
769
|
+
|
634
770
|
fetches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
|
635
771
|
:param str symbol: unified symbol of the market to fetch the ticker for
|
636
772
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
@@ -644,7 +780,9 @@ class cryptocom(Exchange, ImplicitAPI):
|
|
644
780
|
def fetch_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
|
645
781
|
"""
|
646
782
|
fetches information on multiple orders made by the user
|
647
|
-
|
783
|
+
|
784
|
+
https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#private-get-order-history
|
785
|
+
|
648
786
|
:param str symbol: unified market symbol of the market the orders were made in
|
649
787
|
:param int [since]: the earliest time in ms to fetch orders for, max date range is one day
|
650
788
|
:param int [limit]: the maximum number of order structures to retrieve, default 100 max 100
|
@@ -659,7 +797,7 @@ class cryptocom(Exchange, ImplicitAPI):
|
|
659
797
|
if paginate:
|
660
798
|
return self.fetch_paginated_call_dynamic('fetchOrders', symbol, since, limit, params)
|
661
799
|
market = None
|
662
|
-
request = {}
|
800
|
+
request: dict = {}
|
663
801
|
if symbol is not None:
|
664
802
|
market = self.market(symbol)
|
665
803
|
request['instrument_name'] = market['id']
|
@@ -667,8 +805,8 @@ class cryptocom(Exchange, ImplicitAPI):
|
|
667
805
|
request['start_time'] = since
|
668
806
|
if limit is not None:
|
669
807
|
request['limit'] = limit
|
670
|
-
until = self.
|
671
|
-
params = self.omit(params, ['until'
|
808
|
+
until = self.safe_integer(params, 'until')
|
809
|
+
params = self.omit(params, ['until'])
|
672
810
|
if until is not None:
|
673
811
|
request['end_time'] = until
|
674
812
|
response = self.v1PrivatePostPrivateGetOrderHistory(self.extend(request, params))
|
@@ -711,14 +849,16 @@ class cryptocom(Exchange, ImplicitAPI):
|
|
711
849
|
# }
|
712
850
|
# }
|
713
851
|
#
|
714
|
-
data = self.
|
715
|
-
orders = self.
|
852
|
+
data = self.safe_dict(response, 'result', {})
|
853
|
+
orders = self.safe_list(data, 'data', [])
|
716
854
|
return self.parse_orders(orders, market, since, limit)
|
717
855
|
|
718
856
|
def fetch_trades(self, symbol: str, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
|
719
857
|
"""
|
720
858
|
get a list of the most recent trades for a particular symbol
|
721
|
-
|
859
|
+
|
860
|
+
https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#public-get-trades
|
861
|
+
|
722
862
|
:param str symbol: unified symbol of the market to fetch trades for
|
723
863
|
:param int [since]: timestamp in ms of the earliest trade to fetch, maximum date range is one day
|
724
864
|
:param int [limit]: the maximum number of trades to fetch
|
@@ -733,15 +873,15 @@ class cryptocom(Exchange, ImplicitAPI):
|
|
733
873
|
if paginate:
|
734
874
|
return self.fetch_paginated_call_dynamic('fetchTrades', symbol, since, limit, params)
|
735
875
|
market = self.market(symbol)
|
736
|
-
request = {
|
876
|
+
request: dict = {
|
737
877
|
'instrument_name': market['id'],
|
738
878
|
}
|
739
879
|
if since is not None:
|
740
880
|
request['start_ts'] = since
|
741
881
|
if limit is not None:
|
742
882
|
request['count'] = limit
|
743
|
-
until = self.
|
744
|
-
params = self.omit(params, ['until'
|
883
|
+
until = self.safe_integer(params, 'until')
|
884
|
+
params = self.omit(params, ['until'])
|
745
885
|
if until is not None:
|
746
886
|
request['end_ts'] = until
|
747
887
|
response = self.v1PublicGetPublicGetTrades(self.extend(request, params))
|
@@ -765,14 +905,16 @@ class cryptocom(Exchange, ImplicitAPI):
|
|
765
905
|
# }
|
766
906
|
# }
|
767
907
|
#
|
768
|
-
result = self.
|
769
|
-
trades = self.
|
908
|
+
result = self.safe_dict(response, 'result', {})
|
909
|
+
trades = self.safe_list(result, 'data', [])
|
770
910
|
return self.parse_trades(trades, market, since, limit)
|
771
911
|
|
772
912
|
def fetch_ohlcv(self, symbol: str, timeframe='1m', since: Int = None, limit: Int = None, params={}) -> List[list]:
|
773
913
|
"""
|
774
914
|
fetches historical candlestick data containing the open, high, low, and close price, and the volume of a market
|
775
|
-
|
915
|
+
|
916
|
+
https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#public-get-candlestick
|
917
|
+
|
776
918
|
:param str symbol: unified symbol of the market to fetch OHLCV data for
|
777
919
|
:param str timeframe: the length of time each candle represents
|
778
920
|
:param int [since]: timestamp in ms of the earliest candle to fetch
|
@@ -788,17 +930,25 @@ class cryptocom(Exchange, ImplicitAPI):
|
|
788
930
|
if paginate:
|
789
931
|
return self.fetch_paginated_call_deterministic('fetchOHLCV', symbol, since, limit, timeframe, params, 300)
|
790
932
|
market = self.market(symbol)
|
791
|
-
request = {
|
933
|
+
request: dict = {
|
792
934
|
'instrument_name': market['id'],
|
793
935
|
'timeframe': self.safe_string(self.timeframes, timeframe, timeframe),
|
794
936
|
}
|
795
|
-
if since is not None:
|
796
|
-
request['start_ts'] = since
|
797
937
|
if limit is not None:
|
938
|
+
if limit > 300:
|
939
|
+
limit = 300
|
798
940
|
request['count'] = limit
|
799
|
-
|
800
|
-
|
801
|
-
|
941
|
+
now = self.microseconds()
|
942
|
+
duration = self.parse_timeframe(timeframe)
|
943
|
+
until = self.safe_integer(params, 'until', now)
|
944
|
+
params = self.omit(params, ['until'])
|
945
|
+
if since is not None:
|
946
|
+
request['start_ts'] = since - duration * 1000
|
947
|
+
if limit is not None:
|
948
|
+
request['end_ts'] = self.sum(since, duration * limit * 1000)
|
949
|
+
else:
|
950
|
+
request['end_ts'] = until
|
951
|
+
else:
|
802
952
|
request['end_ts'] = until
|
803
953
|
response = self.v1PublicGetPublicGetCandlestick(self.extend(request, params))
|
804
954
|
#
|
@@ -822,14 +972,16 @@ class cryptocom(Exchange, ImplicitAPI):
|
|
822
972
|
# }
|
823
973
|
# }
|
824
974
|
#
|
825
|
-
result = self.
|
826
|
-
data = self.
|
975
|
+
result = self.safe_dict(response, 'result', {})
|
976
|
+
data = self.safe_list(result, 'data', [])
|
827
977
|
return self.parse_ohlcvs(data, market, timeframe, since, limit)
|
828
978
|
|
829
979
|
def fetch_order_book(self, symbol: str, limit: Int = None, params={}) -> OrderBook:
|
830
980
|
"""
|
831
981
|
fetches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
|
832
|
-
|
982
|
+
|
983
|
+
https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#public-get-book
|
984
|
+
|
833
985
|
:param str symbol: unified symbol of the market to fetch the order book for
|
834
986
|
:param int [limit]: the number of order book entries to return, max 50
|
835
987
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
@@ -837,7 +989,7 @@ class cryptocom(Exchange, ImplicitAPI):
|
|
837
989
|
"""
|
838
990
|
self.load_markets()
|
839
991
|
market = self.market(symbol)
|
840
|
-
request = {
|
992
|
+
request: dict = {
|
841
993
|
'instrument_name': market['id'],
|
842
994
|
}
|
843
995
|
if limit:
|
@@ -861,17 +1013,17 @@ class cryptocom(Exchange, ImplicitAPI):
|
|
861
1013
|
# }
|
862
1014
|
# }
|
863
1015
|
#
|
864
|
-
result = self.
|
865
|
-
data = self.
|
1016
|
+
result = self.safe_dict(response, 'result', {})
|
1017
|
+
data = self.safe_list(result, 'data', [])
|
866
1018
|
orderBook = self.safe_value(data, 0)
|
867
1019
|
timestamp = self.safe_integer(orderBook, 't')
|
868
1020
|
return self.parse_order_book(orderBook, symbol, timestamp)
|
869
1021
|
|
870
1022
|
def parse_balance(self, response) -> Balances:
|
871
|
-
responseResult = self.
|
872
|
-
data = self.
|
1023
|
+
responseResult = self.safe_dict(response, 'result', {})
|
1024
|
+
data = self.safe_list(responseResult, 'data', [])
|
873
1025
|
positionBalances = self.safe_value(data[0], 'position_balances', [])
|
874
|
-
result = {'info': response}
|
1026
|
+
result: dict = {'info': response}
|
875
1027
|
for i in range(0, len(positionBalances)):
|
876
1028
|
balance = positionBalances[i]
|
877
1029
|
currencyId = self.safe_string(balance, 'instrument_name')
|
@@ -885,7 +1037,9 @@ class cryptocom(Exchange, ImplicitAPI):
|
|
885
1037
|
def fetch_balance(self, params={}) -> Balances:
|
886
1038
|
"""
|
887
1039
|
query for balance and get the amount of funds available for trading or funds locked in orders
|
888
|
-
|
1040
|
+
|
1041
|
+
https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#private-user-balance
|
1042
|
+
|
889
1043
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
890
1044
|
:returns dict: a `balance structure <https://docs.ccxt.com/#/?id=balance-structure>`
|
891
1045
|
"""
|
@@ -939,7 +1093,10 @@ class cryptocom(Exchange, ImplicitAPI):
|
|
939
1093
|
def fetch_order(self, id: str, symbol: Str = None, params={}):
|
940
1094
|
"""
|
941
1095
|
fetches information on an order made by the user
|
942
|
-
|
1096
|
+
|
1097
|
+
https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#private-get-order-detail
|
1098
|
+
|
1099
|
+
:param str id: order id
|
943
1100
|
:param str symbol: unified symbol of the market the order was made in
|
944
1101
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
945
1102
|
:returns dict: An `order structure <https://docs.ccxt.com/#/?id=order-structure>`
|
@@ -948,7 +1105,7 @@ class cryptocom(Exchange, ImplicitAPI):
|
|
948
1105
|
market = None
|
949
1106
|
if symbol is not None:
|
950
1107
|
market = self.market(symbol)
|
951
|
-
request = {
|
1108
|
+
request: dict = {
|
952
1109
|
'order_id': id,
|
953
1110
|
}
|
954
1111
|
response = self.v1PrivatePostPrivateGetOrderDetail(self.extend(request, params))
|
@@ -985,13 +1142,13 @@ class cryptocom(Exchange, ImplicitAPI):
|
|
985
1142
|
# }
|
986
1143
|
# }
|
987
1144
|
#
|
988
|
-
order = self.
|
1145
|
+
order = self.safe_dict(response, 'result', {})
|
989
1146
|
return self.parse_order(order, market)
|
990
1147
|
|
991
1148
|
def create_order_request(self, symbol: str, type: OrderType, side: OrderSide, amount: float, price: Num = None, params={}):
|
992
1149
|
market = self.market(symbol)
|
993
1150
|
uppercaseType = type.upper()
|
994
|
-
request = {
|
1151
|
+
request: dict = {
|
995
1152
|
'instrument_name': market['id'],
|
996
1153
|
'side': side.upper(),
|
997
1154
|
'quantity': self.amount_to_precision(symbol, amount),
|
@@ -1073,16 +1230,18 @@ class cryptocom(Exchange, ImplicitAPI):
|
|
1073
1230
|
def create_order(self, symbol: str, type: OrderType, side: OrderSide, amount: float, price: Num = None, params={}):
|
1074
1231
|
"""
|
1075
1232
|
create a trade order
|
1076
|
-
|
1233
|
+
|
1234
|
+
https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#private-create-order
|
1235
|
+
|
1077
1236
|
:param str symbol: unified symbol of the market to create an order in
|
1078
1237
|
:param str type: 'market', 'limit', 'stop_loss', 'stop_limit', 'take_profit', 'take_profit_limit'
|
1079
1238
|
:param str side: 'buy' or 'sell'
|
1080
1239
|
:param float amount: how much you want to trade in units of base currency
|
1081
|
-
:param float [price]: the price at which the order is to be
|
1240
|
+
:param float [price]: the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
|
1082
1241
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
1083
1242
|
:param str [params.timeInForce]: 'GTC', 'IOC', 'FOK' or 'PO'
|
1084
1243
|
:param str [params.ref_price_type]: 'MARK_PRICE', 'INDEX_PRICE', 'LAST_PRICE' which trigger price type to use, default is MARK_PRICE
|
1085
|
-
:param float [params.
|
1244
|
+
:param float [params.triggerPrice]: price to trigger a trigger order
|
1086
1245
|
:param float [params.stopLossPrice]: price to trigger a stop-loss trigger order
|
1087
1246
|
:param float [params.takeProfitPrice]: price to trigger a take-profit trigger order
|
1088
1247
|
:returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
|
@@ -1102,15 +1261,18 @@ class cryptocom(Exchange, ImplicitAPI):
|
|
1102
1261
|
# }
|
1103
1262
|
# }
|
1104
1263
|
#
|
1105
|
-
result = self.
|
1264
|
+
result = self.safe_dict(response, 'result', {})
|
1106
1265
|
return self.parse_order(result, market)
|
1107
1266
|
|
1108
1267
|
def create_orders(self, orders: List[OrderRequest], params={}):
|
1109
1268
|
"""
|
1110
1269
|
create a list of trade orders
|
1111
|
-
|
1112
|
-
|
1270
|
+
|
1271
|
+
https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#private-create-order-list-list
|
1272
|
+
https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#private-create-order-list-oco
|
1273
|
+
|
1113
1274
|
:param Array orders: list of orders to create, each object should contain the parameters required by createOrder, namely symbol, type, side, amount, price and params
|
1275
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
1114
1276
|
:returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
|
1115
1277
|
"""
|
1116
1278
|
self.load_markets()
|
@@ -1122,11 +1284,11 @@ class cryptocom(Exchange, ImplicitAPI):
|
|
1122
1284
|
side = self.safe_string(rawOrder, 'side')
|
1123
1285
|
amount = self.safe_value(rawOrder, 'amount')
|
1124
1286
|
price = self.safe_value(rawOrder, 'price')
|
1125
|
-
orderParams = self.
|
1287
|
+
orderParams = self.safe_dict(rawOrder, 'params', {})
|
1126
1288
|
orderRequest = self.create_advanced_order_request(marketId, type, side, amount, price, orderParams)
|
1127
1289
|
ordersRequests.append(orderRequest)
|
1128
1290
|
contigency = self.safe_string(params, 'contingency_type', 'LIST')
|
1129
|
-
request = {
|
1291
|
+
request: dict = {
|
1130
1292
|
'contingency_type': contigency, # or OCO
|
1131
1293
|
'order_list': ordersRequests,
|
1132
1294
|
}
|
@@ -1186,7 +1348,7 @@ class cryptocom(Exchange, ImplicitAPI):
|
|
1186
1348
|
# and market-buy orders need to send notional instead of quantity
|
1187
1349
|
market = self.market(symbol)
|
1188
1350
|
uppercaseType = type.upper()
|
1189
|
-
request = {
|
1351
|
+
request: dict = {
|
1190
1352
|
'instrument_name': market['id'],
|
1191
1353
|
'side': side.upper(),
|
1192
1354
|
}
|
@@ -1278,14 +1440,16 @@ class cryptocom(Exchange, ImplicitAPI):
|
|
1278
1440
|
def cancel_all_orders(self, symbol: Str = None, params={}):
|
1279
1441
|
"""
|
1280
1442
|
cancel all open orders
|
1281
|
-
|
1443
|
+
|
1444
|
+
https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#private-cancel-all-orders
|
1445
|
+
|
1282
1446
|
:param str symbol: unified market symbol of the orders to cancel
|
1283
1447
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
1284
1448
|
:returns dict} Returns exchange raw message{@link https://docs.ccxt.com/#/?id=order-structure:
|
1285
1449
|
"""
|
1286
1450
|
self.load_markets()
|
1287
1451
|
market = None
|
1288
|
-
request = {}
|
1452
|
+
request: dict = {}
|
1289
1453
|
if symbol is not None:
|
1290
1454
|
market = self.market(symbol)
|
1291
1455
|
request['instrument_name'] = market['id']
|
@@ -1294,7 +1458,9 @@ class cryptocom(Exchange, ImplicitAPI):
|
|
1294
1458
|
def cancel_order(self, id: str, symbol: Str = None, params={}):
|
1295
1459
|
"""
|
1296
1460
|
cancels an open order
|
1297
|
-
|
1461
|
+
|
1462
|
+
https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#private-cancel-order
|
1463
|
+
|
1298
1464
|
:param str id: the order id of the order to cancel
|
1299
1465
|
:param str [symbol]: unified symbol of the market the order was made in
|
1300
1466
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
@@ -1304,7 +1470,7 @@ class cryptocom(Exchange, ImplicitAPI):
|
|
1304
1470
|
market = None
|
1305
1471
|
if symbol is not None:
|
1306
1472
|
market = self.market(symbol)
|
1307
|
-
request = {
|
1473
|
+
request: dict = {
|
1308
1474
|
'order_id': id,
|
1309
1475
|
}
|
1310
1476
|
response = self.v1PrivatePostPrivateCancelOrder(self.extend(request, params))
|
@@ -1320,13 +1486,15 @@ class cryptocom(Exchange, ImplicitAPI):
|
|
1320
1486
|
# }
|
1321
1487
|
# }
|
1322
1488
|
#
|
1323
|
-
result = self.
|
1489
|
+
result = self.safe_dict(response, 'result', {})
|
1324
1490
|
return self.parse_order(result, market)
|
1325
1491
|
|
1326
1492
|
def cancel_orders(self, ids, symbol: Str = None, params={}):
|
1327
1493
|
"""
|
1328
1494
|
cancel multiple orders
|
1329
|
-
|
1495
|
+
|
1496
|
+
https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#private-cancel-order-list-list
|
1497
|
+
|
1330
1498
|
:param str[] ids: order ids
|
1331
1499
|
:param str symbol: unified market symbol
|
1332
1500
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
@@ -1339,23 +1507,55 @@ class cryptocom(Exchange, ImplicitAPI):
|
|
1339
1507
|
orderRequests = []
|
1340
1508
|
for i in range(0, len(ids)):
|
1341
1509
|
id = ids[i]
|
1342
|
-
order = {
|
1510
|
+
order: dict = {
|
1343
1511
|
'instrument_name': market['id'],
|
1344
1512
|
'order_id': str(id),
|
1345
1513
|
}
|
1346
1514
|
orderRequests.append(order)
|
1347
|
-
request = {
|
1515
|
+
request: dict = {
|
1348
1516
|
'contingency_type': 'LIST',
|
1349
1517
|
'order_list': orderRequests,
|
1350
1518
|
}
|
1351
1519
|
response = self.v1PrivatePostPrivateCancelOrderList(self.extend(request, params))
|
1352
|
-
result = self.
|
1520
|
+
result = self.safe_list(response, 'result', [])
|
1353
1521
|
return self.parse_orders(result, market, None, None, params)
|
1354
1522
|
|
1523
|
+
def cancel_orders_for_symbols(self, orders: List[CancellationRequest], params={}):
|
1524
|
+
"""
|
1525
|
+
cancel multiple orders for multiple symbols
|
1526
|
+
|
1527
|
+
https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#private-cancel-order-list-list
|
1528
|
+
|
1529
|
+
:param CancellationRequest[] orders: each order should contain the parameters required by cancelOrder namely id and symbol, example [{"id": "a", "symbol": "BTC/USDT"}, {"id": "b", "symbol": "ETH/USDT"}]
|
1530
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
1531
|
+
:returns dict: an list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
|
1532
|
+
"""
|
1533
|
+
self.load_markets()
|
1534
|
+
orderRequests = []
|
1535
|
+
for i in range(0, len(orders)):
|
1536
|
+
order = orders[i]
|
1537
|
+
id = self.safe_string(order, 'id')
|
1538
|
+
symbol = self.safe_string(order, 'symbol')
|
1539
|
+
market = self.market(symbol)
|
1540
|
+
orderItem: dict = {
|
1541
|
+
'instrument_name': market['id'],
|
1542
|
+
'order_id': str(id),
|
1543
|
+
}
|
1544
|
+
orderRequests.append(orderItem)
|
1545
|
+
request: dict = {
|
1546
|
+
'contingency_type': 'LIST',
|
1547
|
+
'order_list': orderRequests,
|
1548
|
+
}
|
1549
|
+
response = self.v1PrivatePostPrivateCancelOrderList(self.extend(request, params))
|
1550
|
+
result = self.safe_list(response, 'result', [])
|
1551
|
+
return self.parse_orders(result, None, None, None, params)
|
1552
|
+
|
1355
1553
|
def fetch_open_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
|
1356
1554
|
"""
|
1357
1555
|
fetch all unfilled currently open orders
|
1358
|
-
|
1556
|
+
|
1557
|
+
https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#private-get-open-orders
|
1558
|
+
|
1359
1559
|
:param str symbol: unified market symbol
|
1360
1560
|
:param int [since]: the earliest time in ms to fetch open orders for
|
1361
1561
|
:param int [limit]: the maximum number of open order structures to retrieve
|
@@ -1364,7 +1564,7 @@ class cryptocom(Exchange, ImplicitAPI):
|
|
1364
1564
|
"""
|
1365
1565
|
self.load_markets()
|
1366
1566
|
market = None
|
1367
|
-
request = {}
|
1567
|
+
request: dict = {}
|
1368
1568
|
if symbol is not None:
|
1369
1569
|
market = self.market(symbol)
|
1370
1570
|
request['instrument_name'] = market['id']
|
@@ -1406,14 +1606,16 @@ class cryptocom(Exchange, ImplicitAPI):
|
|
1406
1606
|
# }
|
1407
1607
|
# }
|
1408
1608
|
#
|
1409
|
-
data = self.
|
1410
|
-
orders = self.
|
1609
|
+
data = self.safe_dict(response, 'result', {})
|
1610
|
+
orders = self.safe_list(data, 'data', [])
|
1411
1611
|
return self.parse_orders(orders, market, since, limit)
|
1412
1612
|
|
1413
1613
|
def fetch_my_trades(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}):
|
1414
1614
|
"""
|
1415
1615
|
fetch all trades made by the user
|
1416
|
-
|
1616
|
+
|
1617
|
+
https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#private-get-trades
|
1618
|
+
|
1417
1619
|
:param str symbol: unified market symbol
|
1418
1620
|
:param int [since]: the earliest time in ms to fetch trades for, maximum date range is one day
|
1419
1621
|
:param int [limit]: the maximum number of trade structures to retrieve
|
@@ -1426,8 +1628,8 @@ class cryptocom(Exchange, ImplicitAPI):
|
|
1426
1628
|
paginate = False
|
1427
1629
|
paginate, params = self.handle_option_and_params(params, 'fetchMyTrades', 'paginate')
|
1428
1630
|
if paginate:
|
1429
|
-
return self.fetch_paginated_call_dynamic('fetchMyTrades', symbol, since, limit, params)
|
1430
|
-
request = {}
|
1631
|
+
return self.fetch_paginated_call_dynamic('fetchMyTrades', symbol, since, limit, params, 100)
|
1632
|
+
request: dict = {}
|
1431
1633
|
market = None
|
1432
1634
|
if symbol is not None:
|
1433
1635
|
market = self.market(symbol)
|
@@ -1436,8 +1638,8 @@ class cryptocom(Exchange, ImplicitAPI):
|
|
1436
1638
|
request['start_time'] = since
|
1437
1639
|
if limit is not None:
|
1438
1640
|
request['limit'] = limit
|
1439
|
-
until = self.
|
1440
|
-
params = self.omit(params, ['until'
|
1641
|
+
until = self.safe_integer(params, 'until')
|
1642
|
+
params = self.omit(params, ['until'])
|
1441
1643
|
if until is not None:
|
1442
1644
|
request['end_time'] = until
|
1443
1645
|
response = self.v1PrivatePostPrivateGetTrades(self.extend(request, params))
|
@@ -1470,8 +1672,8 @@ class cryptocom(Exchange, ImplicitAPI):
|
|
1470
1672
|
# }
|
1471
1673
|
# }
|
1472
1674
|
#
|
1473
|
-
result = self.
|
1474
|
-
trades = self.
|
1675
|
+
result = self.safe_dict(response, 'result', {})
|
1676
|
+
trades = self.safe_list(result, 'data', [])
|
1475
1677
|
return self.parse_trades(trades, market, since, limit)
|
1476
1678
|
|
1477
1679
|
def parse_address(self, addressString):
|
@@ -1486,10 +1688,12 @@ class cryptocom(Exchange, ImplicitAPI):
|
|
1486
1688
|
address = addressString
|
1487
1689
|
return [address, tag]
|
1488
1690
|
|
1489
|
-
def withdraw(self, code: str, amount: float, address, tag=None, params={}):
|
1691
|
+
def withdraw(self, code: str, amount: float, address: str, tag=None, params={}) -> Transaction:
|
1490
1692
|
"""
|
1491
1693
|
make a withdrawal
|
1492
|
-
|
1694
|
+
|
1695
|
+
https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#private-create-withdrawal
|
1696
|
+
|
1493
1697
|
:param str code: unified currency code
|
1494
1698
|
:param float amount: the amount to withdraw
|
1495
1699
|
:param str address: the address to withdraw to
|
@@ -1499,8 +1703,8 @@ class cryptocom(Exchange, ImplicitAPI):
|
|
1499
1703
|
"""
|
1500
1704
|
tag, params = self.handle_withdraw_tag_and_params(tag, params)
|
1501
1705
|
self.load_markets()
|
1502
|
-
currency = self.
|
1503
|
-
request = {
|
1706
|
+
currency = self.safe_currency(code) # for instance, USDC is not inferred from markets but it's still available
|
1707
|
+
request: dict = {
|
1504
1708
|
'currency': currency['id'],
|
1505
1709
|
'amount': amount,
|
1506
1710
|
'address': address,
|
@@ -1529,20 +1733,22 @@ class cryptocom(Exchange, ImplicitAPI):
|
|
1529
1733
|
# }
|
1530
1734
|
# }
|
1531
1735
|
#
|
1532
|
-
result = self.
|
1736
|
+
result = self.safe_dict(response, 'result')
|
1533
1737
|
return self.parse_transaction(result, currency)
|
1534
1738
|
|
1535
|
-
def fetch_deposit_addresses_by_network(self, code: str, params={}):
|
1739
|
+
def fetch_deposit_addresses_by_network(self, code: str, params={}) -> List[DepositAddress]:
|
1536
1740
|
"""
|
1537
1741
|
fetch a dictionary of addresses for a currency, indexed by network
|
1538
|
-
|
1742
|
+
|
1743
|
+
https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#private-get-deposit-address
|
1744
|
+
|
1539
1745
|
:param str code: unified currency code of the currency for the deposit address
|
1540
1746
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
1541
1747
|
:returns dict: a dictionary of `address structures <https://docs.ccxt.com/#/?id=address-structure>` indexed by the network
|
1542
1748
|
"""
|
1543
1749
|
self.load_markets()
|
1544
|
-
currency = self.
|
1545
|
-
request = {
|
1750
|
+
currency = self.safe_currency(code)
|
1751
|
+
request: dict = {
|
1546
1752
|
'currency': currency['id'],
|
1547
1753
|
}
|
1548
1754
|
response = self.v1PrivatePostPrivateGetDepositAddress(self.extend(request, params))
|
@@ -1565,14 +1771,14 @@ class cryptocom(Exchange, ImplicitAPI):
|
|
1565
1771
|
# }
|
1566
1772
|
# }
|
1567
1773
|
#
|
1568
|
-
data = self.
|
1569
|
-
addresses = self.
|
1774
|
+
data = self.safe_dict(response, 'result', {})
|
1775
|
+
addresses = self.safe_list(data, 'deposit_address_list', [])
|
1570
1776
|
addressesLength = len(addresses)
|
1571
1777
|
if addressesLength == 0:
|
1572
1778
|
raise ExchangeError(self.id + ' fetchDepositAddressesByNetwork() generating address...')
|
1573
|
-
result = {}
|
1779
|
+
result: dict = {}
|
1574
1780
|
for i in range(0, addressesLength):
|
1575
|
-
value = self.
|
1781
|
+
value = self.safe_dict(addresses, i)
|
1576
1782
|
addressString = self.safe_string(value, 'address')
|
1577
1783
|
currencyId = self.safe_string(value, 'currency')
|
1578
1784
|
responseCode = self.safe_currency_code(currencyId)
|
@@ -1583,15 +1789,18 @@ class cryptocom(Exchange, ImplicitAPI):
|
|
1583
1789
|
result[network] = {
|
1584
1790
|
'info': value,
|
1585
1791
|
'currency': responseCode,
|
1792
|
+
'network': network,
|
1586
1793
|
'address': address,
|
1587
1794
|
'tag': tag,
|
1588
|
-
'network': network,
|
1589
1795
|
}
|
1590
1796
|
return result
|
1591
1797
|
|
1592
|
-
def fetch_deposit_address(self, code: str, params={}):
|
1798
|
+
def fetch_deposit_address(self, code: str, params={}) -> DepositAddress:
|
1593
1799
|
"""
|
1594
1800
|
fetch the deposit address for a currency associated with self account
|
1801
|
+
|
1802
|
+
https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#private-get-deposit-address
|
1803
|
+
|
1595
1804
|
:param str code: unified currency code
|
1596
1805
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
1597
1806
|
:returns dict: an `address structure <https://docs.ccxt.com/#/?id=address-structure>`
|
@@ -1605,22 +1814,12 @@ class cryptocom(Exchange, ImplicitAPI):
|
|
1605
1814
|
keys = list(depositAddresses.keys())
|
1606
1815
|
return depositAddresses[keys[0]]
|
1607
1816
|
|
1608
|
-
def safe_network(self, networkId):
|
1609
|
-
networksById = {
|
1610
|
-
'BTC': 'BTC',
|
1611
|
-
'ETH': 'ETH',
|
1612
|
-
'SOL': 'SOL',
|
1613
|
-
'BNB': 'BNB',
|
1614
|
-
'CRONOS': 'CRONOS',
|
1615
|
-
'MATIC': 'MATIC',
|
1616
|
-
'OP': 'OP',
|
1617
|
-
}
|
1618
|
-
return self.safe_string(networksById, networkId, networkId)
|
1619
|
-
|
1620
1817
|
def fetch_deposits(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Transaction]:
|
1621
1818
|
"""
|
1622
1819
|
fetch all deposits made to an account
|
1623
|
-
|
1820
|
+
|
1821
|
+
https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#private-get-deposit-history
|
1822
|
+
|
1624
1823
|
:param str code: unified currency code
|
1625
1824
|
:param int [since]: the earliest time in ms to fetch deposits for
|
1626
1825
|
:param int [limit]: the maximum number of deposits structures to retrieve
|
@@ -1630,17 +1829,17 @@ class cryptocom(Exchange, ImplicitAPI):
|
|
1630
1829
|
"""
|
1631
1830
|
self.load_markets()
|
1632
1831
|
currency = None
|
1633
|
-
request = {}
|
1832
|
+
request: dict = {}
|
1634
1833
|
if code is not None:
|
1635
|
-
currency = self.
|
1834
|
+
currency = self.safe_currency(code)
|
1636
1835
|
request['currency'] = currency['id']
|
1637
1836
|
if since is not None:
|
1638
1837
|
# 90 days date range
|
1639
1838
|
request['start_ts'] = since
|
1640
1839
|
if limit is not None:
|
1641
1840
|
request['page_size'] = limit
|
1642
|
-
until = self.
|
1643
|
-
params = self.omit(params, ['until'
|
1841
|
+
until = self.safe_integer(params, 'until')
|
1842
|
+
params = self.omit(params, ['until'])
|
1644
1843
|
if until is not None:
|
1645
1844
|
request['end_ts'] = until
|
1646
1845
|
response = self.v1PrivatePostPrivateGetDepositHistory(self.extend(request, params))
|
@@ -1666,14 +1865,16 @@ class cryptocom(Exchange, ImplicitAPI):
|
|
1666
1865
|
# }
|
1667
1866
|
# }
|
1668
1867
|
#
|
1669
|
-
data = self.
|
1670
|
-
depositList = self.
|
1868
|
+
data = self.safe_dict(response, 'result', {})
|
1869
|
+
depositList = self.safe_list(data, 'deposit_list', [])
|
1671
1870
|
return self.parse_transactions(depositList, currency, since, limit)
|
1672
1871
|
|
1673
1872
|
def fetch_withdrawals(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Transaction]:
|
1674
1873
|
"""
|
1675
1874
|
fetch all withdrawals made from an account
|
1676
|
-
|
1875
|
+
|
1876
|
+
https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#private-get-withdrawal-history
|
1877
|
+
|
1677
1878
|
:param str code: unified currency code
|
1678
1879
|
:param int [since]: the earliest time in ms to fetch withdrawals for
|
1679
1880
|
:param int [limit]: the maximum number of withdrawals structures to retrieve
|
@@ -1683,17 +1884,17 @@ class cryptocom(Exchange, ImplicitAPI):
|
|
1683
1884
|
"""
|
1684
1885
|
self.load_markets()
|
1685
1886
|
currency = None
|
1686
|
-
request = {}
|
1887
|
+
request: dict = {}
|
1687
1888
|
if code is not None:
|
1688
|
-
currency = self.
|
1889
|
+
currency = self.safe_currency(code)
|
1689
1890
|
request['currency'] = currency['id']
|
1690
1891
|
if since is not None:
|
1691
1892
|
# 90 days date range
|
1692
1893
|
request['start_ts'] = since
|
1693
1894
|
if limit is not None:
|
1694
1895
|
request['page_size'] = limit
|
1695
|
-
until = self.
|
1696
|
-
params = self.omit(params, ['until'
|
1896
|
+
until = self.safe_integer(params, 'until')
|
1897
|
+
params = self.omit(params, ['until'])
|
1697
1898
|
if until is not None:
|
1698
1899
|
request['end_ts'] = until
|
1699
1900
|
response = self.v1PrivatePostPrivateGetWithdrawalHistory(self.extend(request, params))
|
@@ -1721,11 +1922,11 @@ class cryptocom(Exchange, ImplicitAPI):
|
|
1721
1922
|
# }
|
1722
1923
|
# }
|
1723
1924
|
#
|
1724
|
-
data = self.
|
1725
|
-
withdrawalList = self.
|
1925
|
+
data = self.safe_dict(response, 'result', {})
|
1926
|
+
withdrawalList = self.safe_list(data, 'withdrawal_list', [])
|
1726
1927
|
return self.parse_transactions(withdrawalList, currency, since, limit)
|
1727
1928
|
|
1728
|
-
def parse_ticker(self, ticker, market: Market = None) -> Ticker:
|
1929
|
+
def parse_ticker(self, ticker: dict, market: Market = None) -> Ticker:
|
1729
1930
|
#
|
1730
1931
|
# fetchTicker
|
1731
1932
|
#
|
@@ -1786,7 +1987,7 @@ class cryptocom(Exchange, ImplicitAPI):
|
|
1786
1987
|
'info': ticker,
|
1787
1988
|
}, market)
|
1788
1989
|
|
1789
|
-
def parse_trade(self, trade, market: Market = None) -> Trade:
|
1990
|
+
def parse_trade(self, trade: dict, market: Market = None) -> Trade:
|
1790
1991
|
#
|
1791
1992
|
# fetchTrades
|
1792
1993
|
#
|
@@ -1865,8 +2066,8 @@ class cryptocom(Exchange, ImplicitAPI):
|
|
1865
2066
|
self.safe_number(ohlcv, 'v'),
|
1866
2067
|
]
|
1867
2068
|
|
1868
|
-
def parse_order_status(self, status):
|
1869
|
-
statuses = {
|
2069
|
+
def parse_order_status(self, status: Str):
|
2070
|
+
statuses: dict = {
|
1870
2071
|
'ACTIVE': 'open',
|
1871
2072
|
'CANCELED': 'canceled',
|
1872
2073
|
'FILLED': 'closed',
|
@@ -1875,15 +2076,15 @@ class cryptocom(Exchange, ImplicitAPI):
|
|
1875
2076
|
}
|
1876
2077
|
return self.safe_string(statuses, status, status)
|
1877
2078
|
|
1878
|
-
def parse_time_in_force(self, timeInForce):
|
1879
|
-
timeInForces = {
|
2079
|
+
def parse_time_in_force(self, timeInForce: Str):
|
2080
|
+
timeInForces: dict = {
|
1880
2081
|
'GOOD_TILL_CANCEL': 'GTC',
|
1881
2082
|
'IMMEDIATE_OR_CANCEL': 'IOC',
|
1882
2083
|
'FILL_OR_KILL': 'FOK',
|
1883
2084
|
}
|
1884
2085
|
return self.safe_string(timeInForces, timeInForce, timeInForce)
|
1885
2086
|
|
1886
|
-
def parse_order(self, order, market: Market = None) -> Order:
|
2087
|
+
def parse_order(self, order: dict, market: Market = None) -> Order:
|
1887
2088
|
#
|
1888
2089
|
# createOrder, cancelOrder
|
1889
2090
|
#
|
@@ -1978,7 +2179,7 @@ class cryptocom(Exchange, ImplicitAPI):
|
|
1978
2179
|
}, market)
|
1979
2180
|
|
1980
2181
|
def parse_deposit_status(self, status):
|
1981
|
-
statuses = {
|
2182
|
+
statuses: dict = {
|
1982
2183
|
'0': 'pending',
|
1983
2184
|
'1': 'ok',
|
1984
2185
|
'2': 'failed',
|
@@ -1987,7 +2188,7 @@ class cryptocom(Exchange, ImplicitAPI):
|
|
1987
2188
|
return self.safe_string(statuses, status, status)
|
1988
2189
|
|
1989
2190
|
def parse_withdrawal_status(self, status):
|
1990
|
-
statuses = {
|
2191
|
+
statuses: dict = {
|
1991
2192
|
'0': 'pending',
|
1992
2193
|
'1': 'pending',
|
1993
2194
|
'2': 'failed',
|
@@ -1998,7 +2199,7 @@ class cryptocom(Exchange, ImplicitAPI):
|
|
1998
2199
|
}
|
1999
2200
|
return self.safe_string(statuses, status, status)
|
2000
2201
|
|
2001
|
-
def parse_transaction(self, transaction, currency: Currency = None) -> Transaction:
|
2202
|
+
def parse_transaction(self, transaction: dict, currency: Currency = None) -> Transaction:
|
2002
2203
|
#
|
2003
2204
|
# fetchDeposits
|
2004
2205
|
#
|
@@ -2085,7 +2286,7 @@ class cryptocom(Exchange, ImplicitAPI):
|
|
2085
2286
|
|
2086
2287
|
def custom_handle_margin_mode_and_params(self, methodName, params={}):
|
2087
2288
|
"""
|
2088
|
-
|
2289
|
+
@ignore
|
2089
2290
|
marginMode specified by params["marginMode"], self.options["marginMode"], self.options["defaultMarginMode"], params["margin"] = True or self.options["defaultType"] = 'margin'
|
2090
2291
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
2091
2292
|
:returns Array: the marginMode in lowercase
|
@@ -2120,9 +2321,9 @@ class cryptocom(Exchange, ImplicitAPI):
|
|
2120
2321
|
# ]
|
2121
2322
|
# }
|
2122
2323
|
#
|
2123
|
-
networkList = self.
|
2324
|
+
networkList = self.safe_list(fee, 'network_list', [])
|
2124
2325
|
networkListLength = len(networkList)
|
2125
|
-
result = {
|
2326
|
+
result: dict = {
|
2126
2327
|
'info': fee,
|
2127
2328
|
'withdraw': {
|
2128
2329
|
'fee': None,
|
@@ -2152,7 +2353,9 @@ class cryptocom(Exchange, ImplicitAPI):
|
|
2152
2353
|
def fetch_deposit_withdraw_fees(self, codes: Strings = None, params={}):
|
2153
2354
|
"""
|
2154
2355
|
fetch deposit and withdraw fees
|
2155
|
-
|
2356
|
+
|
2357
|
+
https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#private-get-currency-networks
|
2358
|
+
|
2156
2359
|
:param str[]|None codes: list of unified currency codes
|
2157
2360
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
2158
2361
|
:returns dict: a list of `fee structures <https://docs.ccxt.com/#/?id=fee-structure>`
|
@@ -2160,31 +2363,33 @@ class cryptocom(Exchange, ImplicitAPI):
|
|
2160
2363
|
self.load_markets()
|
2161
2364
|
response = self.v1PrivatePostPrivateGetCurrencyNetworks(params)
|
2162
2365
|
data = self.safe_value(response, 'result')
|
2163
|
-
currencyMap = self.
|
2366
|
+
currencyMap = self.safe_list(data, 'currency_map')
|
2164
2367
|
return self.parse_deposit_withdraw_fees(currencyMap, codes, 'full_name')
|
2165
2368
|
|
2166
|
-
def fetch_ledger(self, code: Str = None, since: Int = None, limit: Int = None, params={}):
|
2369
|
+
def fetch_ledger(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[LedgerEntry]:
|
2167
2370
|
"""
|
2168
2371
|
fetch the history of changes, actions done by the user or operations that altered the balance of the user
|
2169
|
-
|
2170
|
-
|
2372
|
+
|
2373
|
+
https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#private-get-transactions
|
2374
|
+
|
2375
|
+
:param str [code]: unified currency code
|
2171
2376
|
:param int [since]: timestamp in ms of the earliest ledger entry
|
2172
2377
|
:param int [limit]: max number of ledger entries to return
|
2173
2378
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
2174
2379
|
:param int [params.until]: timestamp in ms for the ending date filter, default is the current time
|
2175
|
-
:returns dict: a `ledger structure <https://docs.ccxt.com/#/?id=ledger
|
2380
|
+
:returns dict: a `ledger structure <https://docs.ccxt.com/#/?id=ledger>`
|
2176
2381
|
"""
|
2177
2382
|
self.load_markets()
|
2178
|
-
request = {}
|
2383
|
+
request: dict = {}
|
2179
2384
|
currency = None
|
2180
2385
|
if code is not None:
|
2181
|
-
currency = self.
|
2386
|
+
currency = self.safe_currency(code)
|
2182
2387
|
if since is not None:
|
2183
2388
|
request['start_time'] = since
|
2184
2389
|
if limit is not None:
|
2185
2390
|
request['limit'] = limit
|
2186
|
-
until = self.
|
2187
|
-
params = self.omit(params, ['until'
|
2391
|
+
until = self.safe_integer(params, 'until')
|
2392
|
+
params = self.omit(params, ['until'])
|
2188
2393
|
if until is not None:
|
2189
2394
|
request['end_time'] = until
|
2190
2395
|
response = self.v1PrivatePostPrivateGetTransactions(self.extend(request, params))
|
@@ -2217,11 +2422,11 @@ class cryptocom(Exchange, ImplicitAPI):
|
|
2217
2422
|
# }
|
2218
2423
|
# }
|
2219
2424
|
#
|
2220
|
-
result = self.
|
2221
|
-
ledger = self.
|
2425
|
+
result = self.safe_dict(response, 'result', {})
|
2426
|
+
ledger = self.safe_list(result, 'data', [])
|
2222
2427
|
return self.parse_ledger(ledger, currency, since, limit)
|
2223
2428
|
|
2224
|
-
def parse_ledger_entry(self, item, currency: Currency = None):
|
2429
|
+
def parse_ledger_entry(self, item: dict, currency: Currency = None) -> LedgerEntry:
|
2225
2430
|
#
|
2226
2431
|
# {
|
2227
2432
|
# "account_id": "ce075cef-1234-4321-bd6e-gf9007351e64",
|
@@ -2244,6 +2449,8 @@ class cryptocom(Exchange, ImplicitAPI):
|
|
2244
2449
|
#
|
2245
2450
|
timestamp = self.safe_integer(item, 'event_timestamp_ms')
|
2246
2451
|
currencyId = self.safe_string(item, 'instrument_name')
|
2452
|
+
code = self.safe_currency_code(currencyId, currency)
|
2453
|
+
currency = self.safe_currency(currencyId, currency)
|
2247
2454
|
amount = self.safe_string(item, 'transaction_qty')
|
2248
2455
|
direction = None
|
2249
2456
|
if Precise.string_lt(amount, '0'):
|
@@ -2251,14 +2458,15 @@ class cryptocom(Exchange, ImplicitAPI):
|
|
2251
2458
|
amount = Precise.string_abs(amount)
|
2252
2459
|
else:
|
2253
2460
|
direction = 'in'
|
2254
|
-
return {
|
2461
|
+
return self.safe_ledger_entry({
|
2462
|
+
'info': item,
|
2255
2463
|
'id': self.safe_string(item, 'order_id'),
|
2256
2464
|
'direction': direction,
|
2257
2465
|
'account': self.safe_string(item, 'account_id'),
|
2258
2466
|
'referenceId': self.safe_string(item, 'trade_id'),
|
2259
2467
|
'referenceAccount': self.safe_string(item, 'trade_match_id'),
|
2260
2468
|
'type': self.parse_ledger_entry_type(self.safe_string(item, 'journal_type')),
|
2261
|
-
'currency':
|
2469
|
+
'currency': code,
|
2262
2470
|
'amount': self.parse_number(amount),
|
2263
2471
|
'timestamp': timestamp,
|
2264
2472
|
'datetime': self.iso8601(timestamp),
|
@@ -2269,11 +2477,10 @@ class cryptocom(Exchange, ImplicitAPI):
|
|
2269
2477
|
'currency': None,
|
2270
2478
|
'cost': None,
|
2271
2479
|
},
|
2272
|
-
|
2273
|
-
}
|
2480
|
+
}, currency)
|
2274
2481
|
|
2275
2482
|
def parse_ledger_entry_type(self, type):
|
2276
|
-
ledgerType = {
|
2483
|
+
ledgerType: dict = {
|
2277
2484
|
'TRADING': 'trade',
|
2278
2485
|
'TRADE_FEE': 'fee',
|
2279
2486
|
'WITHDRAW_FEE': 'fee',
|
@@ -2301,7 +2508,9 @@ class cryptocom(Exchange, ImplicitAPI):
|
|
2301
2508
|
def fetch_accounts(self, params={}) -> List[Account]:
|
2302
2509
|
"""
|
2303
2510
|
fetch all the accounts associated with a profile
|
2304
|
-
|
2511
|
+
|
2512
|
+
https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#private-get-accounts
|
2513
|
+
|
2305
2514
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
2306
2515
|
:returns dict: a dictionary of `account structures <https://docs.ccxt.com/#/?id=account-structure>` indexed by the account type
|
2307
2516
|
"""
|
@@ -2338,9 +2547,9 @@ class cryptocom(Exchange, ImplicitAPI):
|
|
2338
2547
|
# }
|
2339
2548
|
# }
|
2340
2549
|
#
|
2341
|
-
result = self.
|
2342
|
-
masterAccount = self.
|
2343
|
-
accounts = self.
|
2550
|
+
result = self.safe_dict(response, 'result', {})
|
2551
|
+
masterAccount = self.safe_dict(result, 'master_account', {})
|
2552
|
+
accounts = self.safe_list(result, 'sub_account_list', [])
|
2344
2553
|
accounts.append(masterAccount)
|
2345
2554
|
return self.parse_accounts(accounts, params)
|
2346
2555
|
|
@@ -2380,7 +2589,9 @@ class cryptocom(Exchange, ImplicitAPI):
|
|
2380
2589
|
def fetch_settlement_history(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}):
|
2381
2590
|
"""
|
2382
2591
|
fetches historical settlement records
|
2383
|
-
|
2592
|
+
|
2593
|
+
https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#public-get-expired-settlement-price
|
2594
|
+
|
2384
2595
|
:param str symbol: unified market symbol of the settlement history
|
2385
2596
|
:param int [since]: timestamp in ms
|
2386
2597
|
:param int [limit]: number of records
|
@@ -2397,7 +2608,7 @@ class cryptocom(Exchange, ImplicitAPI):
|
|
2397
2608
|
self.check_required_argument('fetchSettlementHistory', type, 'type', ['future', 'option', 'WARRANT', 'FUTURE'])
|
2398
2609
|
if type == 'option':
|
2399
2610
|
type = 'WARRANT'
|
2400
|
-
request = {
|
2611
|
+
request: dict = {
|
2401
2612
|
'instrument_type': type.upper(),
|
2402
2613
|
}
|
2403
2614
|
response = self.v1PublicGetPublicGetExpiredSettlementPrice(self.extend(request, params))
|
@@ -2418,8 +2629,8 @@ class cryptocom(Exchange, ImplicitAPI):
|
|
2418
2629
|
# }
|
2419
2630
|
# }
|
2420
2631
|
#
|
2421
|
-
result = self.
|
2422
|
-
data = self.
|
2632
|
+
result = self.safe_dict(response, 'result', {})
|
2633
|
+
data = self.safe_list(result, 'data', [])
|
2423
2634
|
settlements = self.parse_settlements(data, market)
|
2424
2635
|
sorted = self.sort_by(settlements, 'timestamp')
|
2425
2636
|
return self.filter_by_symbol_since_limit(sorted, symbol, since, limit)
|
@@ -2462,7 +2673,9 @@ class cryptocom(Exchange, ImplicitAPI):
|
|
2462
2673
|
def fetch_funding_rate_history(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}):
|
2463
2674
|
"""
|
2464
2675
|
fetches historical funding rates
|
2465
|
-
|
2676
|
+
|
2677
|
+
https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#public-get-valuations
|
2678
|
+
|
2466
2679
|
:param str symbol: unified symbol of the market to fetch the funding rate history for
|
2467
2680
|
:param int [since]: timestamp in ms of the earliest funding rate to fetch
|
2468
2681
|
:param int [limit]: the maximum amount of [funding rate structures] to fetch
|
@@ -2481,7 +2694,7 @@ class cryptocom(Exchange, ImplicitAPI):
|
|
2481
2694
|
market = self.market(symbol)
|
2482
2695
|
if not market['swap']:
|
2483
2696
|
raise BadSymbol(self.id + ' fetchFundingRateHistory() supports swap contracts only')
|
2484
|
-
request = {
|
2697
|
+
request: dict = {
|
2485
2698
|
'instrument_name': market['id'],
|
2486
2699
|
'valuation_type': 'funding_hist',
|
2487
2700
|
}
|
@@ -2489,8 +2702,8 @@ class cryptocom(Exchange, ImplicitAPI):
|
|
2489
2702
|
request['start_ts'] = since
|
2490
2703
|
if limit is not None:
|
2491
2704
|
request['count'] = limit
|
2492
|
-
until = self.
|
2493
|
-
params = self.omit(params, ['until'
|
2705
|
+
until = self.safe_integer(params, 'until')
|
2706
|
+
params = self.omit(params, ['until'])
|
2494
2707
|
if until is not None:
|
2495
2708
|
request['end_ts'] = until
|
2496
2709
|
response = self.v1PublicGetPublicGetValuations(self.extend(request, params))
|
@@ -2510,8 +2723,8 @@ class cryptocom(Exchange, ImplicitAPI):
|
|
2510
2723
|
# }
|
2511
2724
|
# }
|
2512
2725
|
#
|
2513
|
-
result = self.
|
2514
|
-
data = self.
|
2726
|
+
result = self.safe_dict(response, 'result', {})
|
2727
|
+
data = self.safe_list(result, 'data', [])
|
2515
2728
|
marketId = self.safe_string(result, 'instrument_name')
|
2516
2729
|
rates = []
|
2517
2730
|
for i in range(0, len(data)):
|
@@ -2530,14 +2743,16 @@ class cryptocom(Exchange, ImplicitAPI):
|
|
2530
2743
|
def fetch_position(self, symbol: str, params={}):
|
2531
2744
|
"""
|
2532
2745
|
fetch data on a single open contract trade position
|
2533
|
-
|
2746
|
+
|
2747
|
+
https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#private-get-positions
|
2748
|
+
|
2534
2749
|
:param str symbol: unified market symbol of the market the position is held in
|
2535
2750
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
2536
2751
|
:returns dict: a `position structure <https://docs.ccxt.com/#/?id=position-structure>`
|
2537
2752
|
"""
|
2538
2753
|
self.load_markets()
|
2539
2754
|
market = self.market(symbol)
|
2540
|
-
request = {
|
2755
|
+
request: dict = {
|
2541
2756
|
'instrument_name': market['id'],
|
2542
2757
|
}
|
2543
2758
|
response = self.v1PrivatePostPrivateGetPositions(self.extend(request, params))
|
@@ -2563,21 +2778,23 @@ class cryptocom(Exchange, ImplicitAPI):
|
|
2563
2778
|
# }
|
2564
2779
|
# }
|
2565
2780
|
#
|
2566
|
-
result = self.
|
2567
|
-
data = self.
|
2568
|
-
return self.parse_position(data
|
2781
|
+
result = self.safe_dict(response, 'result', {})
|
2782
|
+
data = self.safe_list(result, 'data', [])
|
2783
|
+
return self.parse_position(self.safe_dict(data, 0), market)
|
2569
2784
|
|
2570
2785
|
def fetch_positions(self, symbols: Strings = None, params={}):
|
2571
2786
|
"""
|
2572
2787
|
fetch all open positions
|
2573
|
-
|
2788
|
+
|
2789
|
+
https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#private-get-positions
|
2790
|
+
|
2574
2791
|
:param str[]|None symbols: list of unified market symbols
|
2575
2792
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
2576
2793
|
:returns dict[]: a list of `position structure <https://docs.ccxt.com/#/?id=position-structure>`
|
2577
2794
|
"""
|
2578
2795
|
self.load_markets()
|
2579
2796
|
symbols = self.market_symbols(symbols)
|
2580
|
-
request = {}
|
2797
|
+
request: dict = {}
|
2581
2798
|
market = None
|
2582
2799
|
if symbols is not None:
|
2583
2800
|
symbol = None
|
@@ -2613,8 +2830,8 @@ class cryptocom(Exchange, ImplicitAPI):
|
|
2613
2830
|
# }
|
2614
2831
|
# }
|
2615
2832
|
#
|
2616
|
-
responseResult = self.
|
2617
|
-
positions = self.
|
2833
|
+
responseResult = self.safe_dict(response, 'result', {})
|
2834
|
+
positions = self.safe_list(responseResult, 'data', [])
|
2618
2835
|
result = []
|
2619
2836
|
for i in range(0, len(positions)):
|
2620
2837
|
entry = positions[i]
|
@@ -2623,7 +2840,7 @@ class cryptocom(Exchange, ImplicitAPI):
|
|
2623
2840
|
result.append(self.parse_position(entry, marketInner))
|
2624
2841
|
return self.filter_by_array_positions(result, 'symbol', None, False)
|
2625
2842
|
|
2626
|
-
def parse_position(self, position, market: Market = None):
|
2843
|
+
def parse_position(self, position: dict, market: Market = None):
|
2627
2844
|
#
|
2628
2845
|
# {
|
2629
2846
|
# "account_id": "ce075bef-b600-4277-bd6e-ff9007251e63",
|
@@ -2702,20 +2919,21 @@ class cryptocom(Exchange, ImplicitAPI):
|
|
2702
2919
|
def close_position(self, symbol: str, side: OrderSide = None, params={}) -> Order:
|
2703
2920
|
"""
|
2704
2921
|
closes open positions for a market
|
2705
|
-
|
2922
|
+
|
2923
|
+
https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#private-close-position
|
2924
|
+
|
2706
2925
|
:param str symbol: Unified CCXT market symbol
|
2707
|
-
:param str [marginMode]: not used by cryptocom.closePositions
|
2708
2926
|
:param str [side]: not used by cryptocom.closePositions
|
2709
2927
|
:param dict [params]: extra parameters specific to the okx api endpoint
|
2710
|
-
|
2711
|
-
|
2928
|
+
|
2929
|
+
EXCHANGE SPECIFIC PARAMETERS
|
2712
2930
|
:param str [params.type]: LIMIT or MARKET
|
2713
2931
|
:param number [params.price]: for limit orders only
|
2714
2932
|
:returns dict[]: `A list of position structures <https://docs.ccxt.com/#/?id=position-structure>`
|
2715
2933
|
"""
|
2716
2934
|
self.load_markets()
|
2717
2935
|
market = self.market(symbol)
|
2718
|
-
request = {
|
2936
|
+
request: dict = {
|
2719
2937
|
'instrument_name': market['id'],
|
2720
2938
|
'type': 'MARKET',
|
2721
2939
|
}
|
@@ -2737,9 +2955,121 @@ class cryptocom(Exchange, ImplicitAPI):
|
|
2737
2955
|
# }
|
2738
2956
|
# }
|
2739
2957
|
#
|
2740
|
-
result = self.
|
2958
|
+
result = self.safe_dict(response, 'result')
|
2741
2959
|
return self.parse_order(result, market)
|
2742
2960
|
|
2961
|
+
def fetch_trading_fee(self, symbol: str, params={}) -> TradingFeeInterface:
|
2962
|
+
"""
|
2963
|
+
fetch the trading fees for a market
|
2964
|
+
|
2965
|
+
https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#private-get-instrument-fee-rate
|
2966
|
+
|
2967
|
+
:param str symbol: unified market symbol
|
2968
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
2969
|
+
:returns dict: a `fee structure <https://docs.ccxt.com/#/?id=fee-structure>`
|
2970
|
+
"""
|
2971
|
+
self.load_markets()
|
2972
|
+
market = self.market(symbol)
|
2973
|
+
request: dict = {
|
2974
|
+
'instrument_name': market['id'],
|
2975
|
+
}
|
2976
|
+
response = self.v1PrivatePostPrivateGetInstrumentFeeRate(self.extend(request, params))
|
2977
|
+
#
|
2978
|
+
# {
|
2979
|
+
# "id": 1,
|
2980
|
+
# "code": 0,
|
2981
|
+
# "method": "private/staking/unstake",
|
2982
|
+
# "result": {
|
2983
|
+
# "staking_id": "1",
|
2984
|
+
# "instrument_name": "SOL.staked",
|
2985
|
+
# "status": "NEW",
|
2986
|
+
# "quantity": "1",
|
2987
|
+
# "underlying_inst_name": "SOL",
|
2988
|
+
# "reason": "NO_ERROR"
|
2989
|
+
# }
|
2990
|
+
# }
|
2991
|
+
#
|
2992
|
+
data = self.safe_dict(response, 'result', {})
|
2993
|
+
return self.parse_trading_fee(data, market)
|
2994
|
+
|
2995
|
+
def fetch_trading_fees(self, params={}) -> TradingFees:
|
2996
|
+
"""
|
2997
|
+
|
2998
|
+
https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#private-get-fee-rate
|
2999
|
+
|
3000
|
+
fetch the trading fees for multiple markets
|
3001
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
3002
|
+
:returns dict: a dictionary of `fee structures <https://docs.ccxt.com/#/?id=fee-structure>` indexed by market symbols
|
3003
|
+
"""
|
3004
|
+
self.load_markets()
|
3005
|
+
response = self.v1PrivatePostPrivateGetFeeRate(params)
|
3006
|
+
#
|
3007
|
+
# {
|
3008
|
+
# "id": 1,
|
3009
|
+
# "method": "/private/get-fee-rate",
|
3010
|
+
# "code": 0,
|
3011
|
+
# "result": {
|
3012
|
+
# "spot_tier": "3",
|
3013
|
+
# "deriv_tier": "3",
|
3014
|
+
# "effective_spot_maker_rate_bps": "6.5",
|
3015
|
+
# "effective_spot_taker_rate_bps": "6.9",
|
3016
|
+
# "effective_deriv_maker_rate_bps": "1.1",
|
3017
|
+
# "effective_deriv_taker_rate_bps": "3"
|
3018
|
+
# }
|
3019
|
+
# }
|
3020
|
+
#
|
3021
|
+
result = self.safe_dict(response, 'result', {})
|
3022
|
+
return self.parse_trading_fees(result)
|
3023
|
+
|
3024
|
+
def parse_trading_fees(self, response):
|
3025
|
+
#
|
3026
|
+
# {
|
3027
|
+
# "spot_tier": "3",
|
3028
|
+
# "deriv_tier": "3",
|
3029
|
+
# "effective_spot_maker_rate_bps": "6.5",
|
3030
|
+
# "effective_spot_taker_rate_bps": "6.9",
|
3031
|
+
# "effective_deriv_maker_rate_bps": "1.1",
|
3032
|
+
# "effective_deriv_taker_rate_bps": "3"
|
3033
|
+
# }
|
3034
|
+
#
|
3035
|
+
result: dict = {}
|
3036
|
+
result['info'] = response
|
3037
|
+
for i in range(0, len(self.symbols)):
|
3038
|
+
symbol = self.symbols[i]
|
3039
|
+
market = self.market(symbol)
|
3040
|
+
isSwap = market['swap']
|
3041
|
+
takerFeeKey = 'effective_deriv_taker_rate_bps' if isSwap else 'effective_spot_taker_rate_bps'
|
3042
|
+
makerFeeKey = 'effective_deriv_maker_rate_bps' if isSwap else 'effective_spot_maker_rate_bps'
|
3043
|
+
tradingFee = {
|
3044
|
+
'info': response,
|
3045
|
+
'symbol': symbol,
|
3046
|
+
'maker': self.parse_number(Precise.string_div(self.safe_string(response, makerFeeKey), '10000')),
|
3047
|
+
'taker': self.parse_number(Precise.string_div(self.safe_string(response, takerFeeKey), '10000')),
|
3048
|
+
'percentage': None,
|
3049
|
+
'tierBased': None,
|
3050
|
+
}
|
3051
|
+
result[symbol] = tradingFee
|
3052
|
+
return result
|
3053
|
+
|
3054
|
+
def parse_trading_fee(self, fee: dict, market: Market = None) -> TradingFeeInterface:
|
3055
|
+
#
|
3056
|
+
# {
|
3057
|
+
# "instrument_name": "BTC_USD",
|
3058
|
+
# "effective_maker_rate_bps": "6.5",
|
3059
|
+
# "effective_taker_rate_bps": "6.9"
|
3060
|
+
# }
|
3061
|
+
#
|
3062
|
+
marketId = self.safe_string(fee, 'instrument_name')
|
3063
|
+
symbol = self.safe_symbol(marketId, market)
|
3064
|
+
return {
|
3065
|
+
'info': fee,
|
3066
|
+
'symbol': symbol,
|
3067
|
+
'maker': self.parse_number(Precise.string_div(self.safe_string(fee, 'effective_maker_rate_bps'), '10000')),
|
3068
|
+
'taker': self.parse_number(Precise.string_div(self.safe_string(fee, 'effective_taker_rate_bps'), '10000')),
|
3069
|
+
'percentage': None,
|
3070
|
+
'tierBased': None,
|
3071
|
+
}
|
3072
|
+
|
2743
3073
|
def sign(self, path, api='public', method='GET', params={}, headers=None, body=None):
|
2744
3074
|
type = self.safe_string(api, 0)
|
2745
3075
|
access = self.safe_string(api, 1)
|
@@ -2779,7 +3109,7 @@ class cryptocom(Exchange, ImplicitAPI):
|
|
2779
3109
|
}
|
2780
3110
|
return {'url': url, 'method': method, 'body': body, 'headers': headers}
|
2781
3111
|
|
2782
|
-
def handle_errors(self, code, reason, url, method, headers, body, response, requestHeaders, requestBody):
|
3112
|
+
def handle_errors(self, code: int, reason: str, url: str, method: str, headers: dict, body: str, response, requestHeaders, requestBody):
|
2783
3113
|
errorCode = self.safe_string(response, 'code')
|
2784
3114
|
if errorCode != '0':
|
2785
3115
|
feedback = self.id + ' ' + body
|