ccxt 4.2.77__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 +24 -0
- ccxt/abstract/kucoinfutures.py +34 -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 +3030 -1087
- 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 +3104 -880
- 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 +238 -49
- ccxt/async_support/bitget.py +1513 -563
- ccxt/async_support/bithumb.py +199 -65
- 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 +392 -148
- 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 +2231 -1193
- ccxt/async_support/cex.py +1409 -1329
- ccxt/async_support/coinbase.py +1454 -287
- 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 +404 -109
- ccxt/async_support/deribit.py +557 -323
- 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 +1472 -463
- 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 +1633 -268
- 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 +917 -357
- 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 +1776 -454
- 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 +1137 -296
- 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 +1722 -480
- 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 +3030 -1087
- ccxt/binancecoinm.py +2 -1
- ccxt/binanceus.py +12 -1
- ccxt/binanceusdm.py +3 -1
- ccxt/bingx.py +3104 -880
- 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 +238 -49
- ccxt/bitget.py +1513 -563
- ccxt/bithumb.py +198 -65
- 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 +392 -148
- ccxt/btcalpha.py +161 -55
- ccxt/btcbox.py +250 -34
- ccxt/btcmarkets.py +232 -85
- ccxt/btcturk.py +159 -60
- ccxt/bybit.py +2231 -1193
- ccxt/cex.py +1408 -1329
- ccxt/coinbase.py +1454 -287
- 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 +404 -109
- ccxt/deribit.py +557 -323
- ccxt/digifinex.py +340 -223
- ccxt/ellipx.py +1826 -0
- ccxt/exmo.py +259 -128
- ccxt/gate.py +1472 -463
- 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 +1632 -268
- 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 +917 -357
- 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 +1776 -454
- 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 +62 -14
- 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 +203 -81
- 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 +965 -665
- 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 +167 -31
- ccxt/pro/exmo.py +252 -20
- 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 +92 -33
- ccxt/pro/poloniex.py +128 -49
- ccxt/pro/poloniexfutures.py +53 -32
- ccxt/pro/probit.py +92 -85
- 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 +437 -65
- 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} +456 -391
- ccxt/test/tests_helpers.py +285 -0
- ccxt/test/tests_init.py +39 -0
- ccxt/test/{test_sync.py → tests_sync.py} +456 -393
- 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 +1137 -296
- 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.77.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.77.dist-info/METADATA +0 -626
- ccxt-4.2.77.dist-info/RECORD +0 -534
- {ccxt-4.2.77.dist-info → ccxt-4.4.48.dist-info}/top_level.txt +0 -0
ccxt/pro/hollaex.py
CHANGED
@@ -9,9 +9,9 @@ import hashlib
|
|
9
9
|
from ccxt.base.types import Balances, Int, Order, OrderBook, Str, Trade
|
10
10
|
from ccxt.async_support.base.ws.client import Client
|
11
11
|
from typing import List
|
12
|
+
from ccxt.base.errors import AuthenticationError
|
12
13
|
from ccxt.base.errors import BadRequest
|
13
14
|
from ccxt.base.errors import BadSymbol
|
14
|
-
from ccxt.base.errors import AuthenticationError
|
15
15
|
|
16
16
|
|
17
17
|
class hollaex(ccxt.async_support.hollaex):
|
@@ -28,6 +28,7 @@ class hollaex(ccxt.async_support.hollaex):
|
|
28
28
|
'watchTicker': False,
|
29
29
|
'watchTickers': False, # for now
|
30
30
|
'watchTrades': True,
|
31
|
+
'watchTradesForSymbols': False,
|
31
32
|
},
|
32
33
|
'urls': {
|
33
34
|
'api': {
|
@@ -61,6 +62,9 @@ class hollaex(ccxt.async_support.hollaex):
|
|
61
62
|
async def watch_order_book(self, symbol: str, limit: Int = None, params={}) -> OrderBook:
|
62
63
|
"""
|
63
64
|
watches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
|
65
|
+
|
66
|
+
https://apidocs.hollaex.com/#sending-receiving-messages
|
67
|
+
|
64
68
|
:param str symbol: unified symbol of the market to fetch the order book for
|
65
69
|
:param int [limit]: the maximum amount of order book entries to return
|
66
70
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
@@ -115,6 +119,9 @@ class hollaex(ccxt.async_support.hollaex):
|
|
115
119
|
async def watch_trades(self, symbol: str, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
|
116
120
|
"""
|
117
121
|
get the list of most recent trades for a particular symbol
|
122
|
+
|
123
|
+
https://apidocs.hollaex.com/#sending-receiving-messages
|
124
|
+
|
118
125
|
:param str symbol: unified symbol of the market to fetch trades for
|
119
126
|
:param int [since]: timestamp in ms of the earliest trade to fetch
|
120
127
|
:param int [limit]: the maximum amount of trades to fetch
|
@@ -166,11 +173,14 @@ class hollaex(ccxt.async_support.hollaex):
|
|
166
173
|
async def watch_my_trades(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
|
167
174
|
"""
|
168
175
|
watches information on multiple trades made by the user
|
176
|
+
|
177
|
+
https://apidocs.hollaex.com/#sending-receiving-messages
|
178
|
+
|
169
179
|
:param str symbol: unified market symbol of the market trades were made in
|
170
180
|
:param int [since]: the earliest time in ms to fetch trades for
|
171
181
|
:param int [limit]: the maximum number of trade structures to retrieve
|
172
182
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
173
|
-
:returns dict[]: a list of
|
183
|
+
:returns dict[]: a list of `trade structures <https://docs.ccxt.com/#/?id=trade-structure>`
|
174
184
|
"""
|
175
185
|
await self.load_markets()
|
176
186
|
messageHash = 'usertrade'
|
@@ -218,7 +228,7 @@ class hollaex(ccxt.async_support.hollaex):
|
|
218
228
|
limit = self.safe_integer(self.options, 'tradesLimit', 1000)
|
219
229
|
self.myTrades = ArrayCache(limit)
|
220
230
|
stored = self.myTrades
|
221
|
-
marketIds = {}
|
231
|
+
marketIds: dict = {}
|
222
232
|
for i in range(0, len(rawTrades)):
|
223
233
|
trade = rawTrades[i]
|
224
234
|
parsed = self.parse_trade(trade)
|
@@ -238,6 +248,9 @@ class hollaex(ccxt.async_support.hollaex):
|
|
238
248
|
async def watch_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
|
239
249
|
"""
|
240
250
|
watches information on multiple orders made by the user
|
251
|
+
|
252
|
+
https://apidocs.hollaex.com/#sending-receiving-messages
|
253
|
+
|
241
254
|
:param str symbol: unified market symbol of the market orders were made in
|
242
255
|
:param int [since]: the earliest time in ms to fetch orders for
|
243
256
|
:param int [limit]: the maximum number of order structures to retrieve
|
@@ -329,7 +342,7 @@ class hollaex(ccxt.async_support.hollaex):
|
|
329
342
|
rawOrders = [data]
|
330
343
|
else:
|
331
344
|
rawOrders = data
|
332
|
-
marketIds = {}
|
345
|
+
marketIds: dict = {}
|
333
346
|
for i in range(0, len(rawOrders)):
|
334
347
|
order = rawOrders[i]
|
335
348
|
parsed = self.parse_order(order)
|
@@ -349,6 +362,9 @@ class hollaex(ccxt.async_support.hollaex):
|
|
349
362
|
async def watch_balance(self, params={}) -> Balances:
|
350
363
|
"""
|
351
364
|
watch balance and get the amount of funds available for trading or funds locked in orders
|
365
|
+
|
366
|
+
https://apidocs.hollaex.com/#sending-receiving-messages
|
367
|
+
|
352
368
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
353
369
|
:returns dict: a `balance structure <https://docs.ccxt.com/#/?id=balance-structure>`
|
354
370
|
"""
|
@@ -394,7 +410,7 @@ class hollaex(ccxt.async_support.hollaex):
|
|
394
410
|
|
395
411
|
async def watch_public(self, messageHash, params={}):
|
396
412
|
url = self.urls['api']['ws']
|
397
|
-
request = {
|
413
|
+
request: dict = {
|
398
414
|
'op': 'subscribe',
|
399
415
|
'args': [messageHash],
|
400
416
|
}
|
@@ -414,13 +430,13 @@ class hollaex(ccxt.async_support.hollaex):
|
|
414
430
|
url = self.urls['api']['ws']
|
415
431
|
auth = 'CONNECT' + '/stream' + expires
|
416
432
|
signature = self.hmac(self.encode(auth), self.encode(self.secret), hashlib.sha256)
|
417
|
-
authParams = {
|
433
|
+
authParams: dict = {
|
418
434
|
'api-key': self.apiKey,
|
419
435
|
'api-signature': signature,
|
420
436
|
'api-expires': expires,
|
421
437
|
}
|
422
438
|
signedUrl = url + '?' + self.urlencode(authParams)
|
423
|
-
request = {
|
439
|
+
request: dict = {
|
424
440
|
'op': 'subscribe',
|
425
441
|
'args': [messageHash],
|
426
442
|
}
|
@@ -534,7 +550,7 @@ class hollaex(ccxt.async_support.hollaex):
|
|
534
550
|
if content == 'pong':
|
535
551
|
self.handle_pong(client, message)
|
536
552
|
return
|
537
|
-
methods = {
|
553
|
+
methods: dict = {
|
538
554
|
'trade': self.handle_trades,
|
539
555
|
'orderbook': self.handle_order_book,
|
540
556
|
'order': self.handle_order,
|
@@ -546,7 +562,7 @@ class hollaex(ccxt.async_support.hollaex):
|
|
546
562
|
if method is not None:
|
547
563
|
method(client, message)
|
548
564
|
|
549
|
-
def ping(self, client):
|
565
|
+
def ping(self, client: Client):
|
550
566
|
# hollaex does not support built-in ws protocol-level ping-pong
|
551
567
|
return {'op': 'ping'}
|
552
568
|
|
ccxt/pro/htx.py
CHANGED
@@ -10,12 +10,13 @@ from ccxt.base.types import Balances, Int, Order, OrderBook, Position, Str, Stri
|
|
10
10
|
from ccxt.async_support.base.ws.client import Client
|
11
11
|
from typing import List
|
12
12
|
from ccxt.base.errors import ExchangeError
|
13
|
+
from ccxt.base.errors import AuthenticationError
|
13
14
|
from ccxt.base.errors import ArgumentsRequired
|
14
15
|
from ccxt.base.errors import BadRequest
|
15
16
|
from ccxt.base.errors import BadSymbol
|
16
17
|
from ccxt.base.errors import NetworkError
|
17
18
|
from ccxt.base.errors import InvalidNonce
|
18
|
-
from ccxt.base.errors import
|
19
|
+
from ccxt.base.errors import ChecksumError
|
19
20
|
|
20
21
|
|
21
22
|
class htx(ccxt.async_support.htx):
|
@@ -38,6 +39,7 @@ class htx(ccxt.async_support.htx):
|
|
38
39
|
'watchTickers': False,
|
39
40
|
'watchTicker': True,
|
40
41
|
'watchTrades': True,
|
42
|
+
'watchTradesForSymbols': False,
|
41
43
|
'watchMyTrades': True,
|
42
44
|
'watchBalance': True,
|
43
45
|
'watchOHLCV': True,
|
@@ -109,6 +111,7 @@ class htx(ccxt.async_support.htx):
|
|
109
111
|
'api': 'api', # or api-aws for clients hosted on AWS
|
110
112
|
'watchOrderBook': {
|
111
113
|
'maxRetries': 3,
|
114
|
+
'checksum': True,
|
112
115
|
},
|
113
116
|
'ws': {
|
114
117
|
'gunzip': True,
|
@@ -124,7 +127,7 @@ class htx(ccxt.async_support.htx):
|
|
124
127
|
'2002': AuthenticationError, # {action: 'sub', code: 2002, ch: 'accounts.update#2', message: 'invalid.auth.state'}
|
125
128
|
'2021': BadRequest,
|
126
129
|
'2001': BadSymbol, # {action: 'sub', code: 2001, ch: 'orders#2ltcusdt', message: 'invalid.symbol'}
|
127
|
-
'2011': BadSymbol, # {op: 'sub', cid: '1649149285', topic: 'orders_cross.
|
130
|
+
'2011': BadSymbol, # {op: 'sub', cid: '1649149285', topic: 'orders_cross.ltc-usdt', 'err-code': 2011, 'err-msg': "Contract doesn't exist.", ts: 1649149287637}
|
128
131
|
'2040': BadRequest, # {op: 'sub', cid: '1649152947', 'err-code': 2040, 'err-msg': 'Missing required parameter.', ts: 1649152948684}
|
129
132
|
'4007': BadRequest, # {op: 'sub', cid: '1', topic: 'accounts_unify.USDT', 'err-code': 4007, 'err-msg': 'Non - single account user is not available, please check through the cross and isolated account asset interface', ts: 1698419318540}
|
130
133
|
},
|
@@ -140,6 +143,10 @@ class htx(ccxt.async_support.htx):
|
|
140
143
|
async def watch_ticker(self, symbol: str, params={}) -> Ticker:
|
141
144
|
"""
|
142
145
|
watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
|
146
|
+
|
147
|
+
https://www.htx.com/en-us/opend/newApiPages/?id=7ec53561-7773-11ed-9966-0242ac110003
|
148
|
+
https://www.htx.com/en-us/opend/newApiPages/?id=28c33ab2-77ae-11ed-9966-0242ac110003
|
149
|
+
|
143
150
|
:param str symbol: unified symbol of the market to fetch the ticker for
|
144
151
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
145
152
|
:returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
|
@@ -205,6 +212,11 @@ class htx(ccxt.async_support.htx):
|
|
205
212
|
async def watch_trades(self, symbol: str, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
|
206
213
|
"""
|
207
214
|
get the list of most recent trades for a particular symbol
|
215
|
+
|
216
|
+
https://www.htx.com/en-us/opend/newApiPages/?id=7ec53b69-7773-11ed-9966-0242ac110003
|
217
|
+
https://www.htx.com/en-us/opend/newApiPages/?id=28c33c21-77ae-11ed-9966-0242ac110003
|
218
|
+
https://www.htx.com/en-us/opend/newApiPages/?id=28c33cfe-77ae-11ed-9966-0242ac110003
|
219
|
+
|
208
220
|
:param str symbol: unified symbol of the market to fetch trades for
|
209
221
|
:param int [since]: timestamp in ms of the earliest trade to fetch
|
210
222
|
:param int [limit]: the maximum amount of trades to fetch
|
@@ -263,6 +275,11 @@ class htx(ccxt.async_support.htx):
|
|
263
275
|
async def watch_ohlcv(self, symbol: str, timeframe='1m', since: Int = None, limit: Int = None, params={}) -> List[list]:
|
264
276
|
"""
|
265
277
|
watches historical candlestick data containing the open, high, low, and close price, and the volume of a market
|
278
|
+
|
279
|
+
https://www.htx.com/en-us/opend/newApiPages/?id=7ec53241-7773-11ed-9966-0242ac110003
|
280
|
+
https://www.htx.com/en-us/opend/newApiPages/?id=28c3346a-77ae-11ed-9966-0242ac110003
|
281
|
+
https://www.htx.com/en-us/opend/newApiPages/?id=28c33563-77ae-11ed-9966-0242ac110003
|
282
|
+
|
266
283
|
:param str symbol: unified symbol of the market to fetch OHLCV data for
|
267
284
|
:param str timeframe: the length of time each candle represents
|
268
285
|
:param int [since]: timestamp in ms of the earliest candle to fetch
|
@@ -318,9 +335,11 @@ class htx(ccxt.async_support.htx):
|
|
318
335
|
|
319
336
|
async def watch_order_book(self, symbol: str, limit: Int = None, params={}) -> OrderBook:
|
320
337
|
"""
|
321
|
-
|
322
|
-
|
323
|
-
|
338
|
+
|
339
|
+
https://huobiapi.github.io/docs/dm/v1/en/#subscribe-market-depth-data
|
340
|
+
https://huobiapi.github.io/docs/coin_margined_swap/v1/en/#subscribe-incremental-market-depth-data
|
341
|
+
https://huobiapi.github.io/docs/usdt_swap/v1/en/#general-subscribe-incremental-market-depth-data
|
342
|
+
|
324
343
|
watches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
|
325
344
|
:param str symbol: unified symbol of the market to fetch the order book for
|
326
345
|
:param int [limit]: the maximum amount of order book entries to return
|
@@ -418,6 +437,8 @@ class htx(ccxt.async_support.htx):
|
|
418
437
|
self.orderbooks[symbol] = orderbook
|
419
438
|
client.resolve(orderbook, messageHash)
|
420
439
|
except Exception as e:
|
440
|
+
del client.subscriptions[messageHash]
|
441
|
+
del self.orderbooks[symbol]
|
421
442
|
client.reject(e, messageHash)
|
422
443
|
|
423
444
|
async def watch_order_book_snapshot(self, client, message, subscription):
|
@@ -430,13 +451,13 @@ class htx(ccxt.async_support.htx):
|
|
430
451
|
market = self.market(symbol)
|
431
452
|
url = self.get_url_by_market_type(market['type'], market['linear'], False, True)
|
432
453
|
requestId = self.request_id()
|
433
|
-
request = {
|
454
|
+
request: dict = {
|
434
455
|
'req': messageHash,
|
435
456
|
'id': requestId,
|
436
457
|
}
|
437
458
|
# self is a temporary subscription by a specific requestId
|
438
459
|
# it has a very short lifetime until the snapshot is received over ws
|
439
|
-
snapshotSubscription = {
|
460
|
+
snapshotSubscription: dict = {
|
440
461
|
'id': requestId,
|
441
462
|
'messageHash': messageHash,
|
442
463
|
'symbol': symbol,
|
@@ -547,7 +568,9 @@ class htx(ccxt.async_support.htx):
|
|
547
568
|
orderbook.reset(snapshot)
|
548
569
|
orderbook['nonce'] = version
|
549
570
|
if (prevSeqNum is not None) and prevSeqNum > orderbook['nonce']:
|
550
|
-
|
571
|
+
checksum = self.handle_option('watchOrderBook', 'checksum', True)
|
572
|
+
if checksum:
|
573
|
+
raise ChecksumError(self.id + ' ' + self.orderbook_checksum_message(symbol))
|
551
574
|
spotConditon = market['spot'] and (prevSeqNum == orderbook['nonce'])
|
552
575
|
nonSpotCondition = market['contract'] and (version - 1 == orderbook['nonce'])
|
553
576
|
if spotConditon or nonSpotCondition:
|
@@ -606,19 +629,18 @@ class htx(ccxt.async_support.htx):
|
|
606
629
|
# }
|
607
630
|
#
|
608
631
|
messageHash = self.safe_string(message, 'ch')
|
609
|
-
tick = self.
|
632
|
+
tick = self.safe_dict(message, 'tick')
|
610
633
|
event = self.safe_string(tick, 'event')
|
611
|
-
ch = self.
|
634
|
+
ch = self.safe_string(message, 'ch')
|
612
635
|
parts = ch.split('.')
|
613
636
|
marketId = self.safe_string(parts, 1)
|
614
637
|
symbol = self.safe_symbol(marketId)
|
615
|
-
|
616
|
-
if orderbook is None:
|
638
|
+
if not (symbol in self.orderbooks):
|
617
639
|
size = self.safe_string(parts, 3)
|
618
640
|
sizeParts = size.split('_')
|
619
641
|
limit = self.safe_integer(sizeParts, 1)
|
620
|
-
|
621
|
-
|
642
|
+
self.orderbooks[symbol] = self.order_book({}, limit)
|
643
|
+
orderbook = self.orderbooks[symbol]
|
622
644
|
if (event is None) and (orderbook['nonce'] is None):
|
623
645
|
orderbook.cache.append(message)
|
624
646
|
else:
|
@@ -636,11 +658,14 @@ class htx(ccxt.async_support.htx):
|
|
636
658
|
async def watch_my_trades(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
|
637
659
|
"""
|
638
660
|
watches information on multiple trades made by the user
|
661
|
+
|
662
|
+
https://www.htx.com/en-us/opend/newApiPages/?id=7ec53dd5-7773-11ed-9966-0242ac110003
|
663
|
+
|
639
664
|
:param str symbol: unified market symbol of the market trades were made in
|
640
665
|
:param int [since]: the earliest time in ms to fetch trades for
|
641
666
|
:param int [limit]: the maximum number of trade structures to retrieve
|
642
667
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
643
|
-
:returns dict[]: a list of
|
668
|
+
:returns dict[]: a list of `trade structures <https://docs.ccxt.com/#/?id=trade-structure>`
|
644
669
|
"""
|
645
670
|
self.check_required_credentials()
|
646
671
|
await self.load_markets()
|
@@ -722,6 +747,9 @@ class htx(ccxt.async_support.htx):
|
|
722
747
|
async def watch_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
|
723
748
|
"""
|
724
749
|
watches information on multiple orders made by the user
|
750
|
+
|
751
|
+
https://www.htx.com/en-us/opend/newApiPages/?id=7ec53c8f-7773-11ed-9966-0242ac110003
|
752
|
+
|
725
753
|
:param str symbol: unified market symbol of the market orders were made in
|
726
754
|
:param int [since]: the earliest time in ms to fetch orders for
|
727
755
|
:param int [limit]: the maximum number of order structures to retrieve
|
@@ -884,7 +912,7 @@ class htx(ccxt.async_support.htx):
|
|
884
912
|
status = self.parse_order_status(self.safe_string_2(data, 'orderStatus', 'status', 'closed'))
|
885
913
|
filled = self.safe_string(data, 'execAmt')
|
886
914
|
remaining = self.safe_string(data, 'remainAmt')
|
887
|
-
order = {
|
915
|
+
order: dict = {
|
888
916
|
'id': orderId,
|
889
917
|
'trades': trades,
|
890
918
|
'status': status,
|
@@ -901,13 +929,13 @@ class htx(ccxt.async_support.htx):
|
|
901
929
|
rawTrades = self.safe_value(message, 'trade', [])
|
902
930
|
tradesLength = len(rawTrades)
|
903
931
|
if tradesLength > 0:
|
904
|
-
tradesObject = {
|
932
|
+
tradesObject: dict = {
|
905
933
|
'trades': rawTrades,
|
906
934
|
'ch': messageHash,
|
907
935
|
'symbol': marketId,
|
908
936
|
}
|
909
937
|
# inject order params in every trade
|
910
|
-
extendTradeParams = {
|
938
|
+
extendTradeParams: dict = {
|
911
939
|
'order': self.safe_string(parsedOrder, 'id'),
|
912
940
|
'type': self.safe_string(parsedOrder, 'type'),
|
913
941
|
'side': self.safe_string(parsedOrder, 'side'),
|
@@ -1154,12 +1182,16 @@ class htx(ccxt.async_support.htx):
|
|
1154
1182
|
|
1155
1183
|
async def watch_positions(self, symbols: Strings = None, since: Int = None, limit: Int = None, params={}) -> List[Position]:
|
1156
1184
|
"""
|
1157
|
-
|
1158
|
-
|
1159
|
-
|
1160
|
-
|
1185
|
+
|
1186
|
+
https://www.huobi.com/en-in/opend/newApiPages/?id=8cb7de1c-77b5-11ed-9966-0242ac110003
|
1187
|
+
https://www.huobi.com/en-in/opend/newApiPages/?id=8cb7df0f-77b5-11ed-9966-0242ac110003
|
1188
|
+
https://www.huobi.com/en-in/opend/newApiPages/?id=28c34a7d-77ae-11ed-9966-0242ac110003
|
1189
|
+
https://www.huobi.com/en-in/opend/newApiPages/?id=5d5156b5-77b6-11ed-9966-0242ac110003
|
1190
|
+
|
1161
1191
|
watch all open positions. Note: huobi has one channel for each marginMode and type
|
1162
1192
|
:param str[]|None symbols: list of unified market symbols
|
1193
|
+
@param since
|
1194
|
+
@param limit
|
1163
1195
|
:param dict params: extra parameters specific to the exchange API endpoint
|
1164
1196
|
:returns dict[]: a list of `position structure <https://docs.ccxt.com/en/latest/manual.html#position-structure>`
|
1165
1197
|
"""
|
@@ -1263,6 +1295,12 @@ class htx(ccxt.async_support.htx):
|
|
1263
1295
|
async def watch_balance(self, params={}) -> Balances:
|
1264
1296
|
"""
|
1265
1297
|
watch balance and get the amount of funds available for trading or funds locked in orders
|
1298
|
+
|
1299
|
+
https://www.htx.com/en-us/opend/newApiPages/?id=7ec52e28-7773-11ed-9966-0242ac110003
|
1300
|
+
https://www.htx.com/en-us/opend/newApiPages/?id=10000084-77b7-11ed-9966-0242ac110003
|
1301
|
+
https://www.htx.com/en-us/opend/newApiPages/?id=8cb7dcca-77b5-11ed-9966-0242ac110003
|
1302
|
+
https://www.htx.com/en-us/opend/newApiPages/?id=28c34995-77ae-11ed-9966-0242ac110003
|
1303
|
+
|
1266
1304
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
1267
1305
|
:returns dict: a `balance structure <https://docs.ccxt.com/#/?id=balance-structure>`
|
1268
1306
|
"""
|
@@ -1332,7 +1370,7 @@ class htx(ccxt.async_support.htx):
|
|
1332
1370
|
else:
|
1333
1371
|
# subscribe to all
|
1334
1372
|
channel = prefix + '.' + '*'
|
1335
|
-
subscriptionParams = {
|
1373
|
+
subscriptionParams: dict = {
|
1336
1374
|
'type': type,
|
1337
1375
|
'subType': subType,
|
1338
1376
|
'margin': marginMode,
|
@@ -1539,7 +1577,7 @@ class htx(ccxt.async_support.htx):
|
|
1539
1577
|
account = self.account()
|
1540
1578
|
account['free'] = self.safe_string_2(balance, 'margin_balance', 'margin_available')
|
1541
1579
|
account['used'] = self.safe_string(balance, 'margin_frozen')
|
1542
|
-
accountsByCode = {}
|
1580
|
+
accountsByCode: dict = {}
|
1543
1581
|
accountsByCode[code] = account
|
1544
1582
|
symbol = market['symbol']
|
1545
1583
|
self.balance[symbol] = self.safe_balance(accountsByCode)
|
@@ -1685,7 +1723,7 @@ class htx(ccxt.async_support.htx):
|
|
1685
1723
|
type = self.safe_string(parts, 0)
|
1686
1724
|
if type == 'market':
|
1687
1725
|
methodName = self.safe_string(parts, 2)
|
1688
|
-
methods = {
|
1726
|
+
methods: dict = {
|
1689
1727
|
'depth': self.handle_order_book,
|
1690
1728
|
'mbp': self.handle_order_book,
|
1691
1729
|
'detail': self.handle_ticker,
|
@@ -1770,7 +1808,7 @@ class htx(ccxt.async_support.htx):
|
|
1770
1808
|
# "data": {"user-id": "35930539"}
|
1771
1809
|
# }
|
1772
1810
|
#
|
1773
|
-
promise = client.futures['
|
1811
|
+
promise = client.futures['auth']
|
1774
1812
|
promise.resolve(message)
|
1775
1813
|
|
1776
1814
|
def handle_error_message(self, client: Client, message):
|
@@ -1798,6 +1836,12 @@ class htx(ccxt.async_support.htx):
|
|
1798
1836
|
# 'err-msg': "Non - single account user is not available, please check through the cross and isolated account asset interface",
|
1799
1837
|
# "ts": 1698419490189
|
1800
1838
|
# }
|
1839
|
+
# {
|
1840
|
+
# "action":"req",
|
1841
|
+
# "code":2002,
|
1842
|
+
# "ch":"auth",
|
1843
|
+
# "message":"auth.fail"
|
1844
|
+
# }
|
1801
1845
|
#
|
1802
1846
|
status = self.safe_string(message, 'status')
|
1803
1847
|
if status == 'error':
|
@@ -1808,6 +1852,7 @@ class htx(ccxt.async_support.htx):
|
|
1808
1852
|
errorCode = self.safe_string(message, 'err-code')
|
1809
1853
|
try:
|
1810
1854
|
self.throw_exactly_matched_exception(self.exceptions['ws']['exact'], errorCode, self.json(message))
|
1855
|
+
raise ExchangeError(self.json(message))
|
1811
1856
|
except Exception as e:
|
1812
1857
|
messageHash = self.safe_string(subscription, 'messageHash')
|
1813
1858
|
client.reject(e, messageHash)
|
@@ -1815,11 +1860,12 @@ class htx(ccxt.async_support.htx):
|
|
1815
1860
|
if id in client.subscriptions:
|
1816
1861
|
del client.subscriptions[id]
|
1817
1862
|
return False
|
1818
|
-
code = self.
|
1819
|
-
if code is not None and ((code != 200) and (code != 0)):
|
1863
|
+
code = self.safe_string_2(message, 'code', 'err-code')
|
1864
|
+
if code is not None and ((code != '200') and (code != '0')):
|
1820
1865
|
feedback = self.id + ' ' + self.json(message)
|
1821
1866
|
try:
|
1822
1867
|
self.throw_exactly_matched_exception(self.exceptions['ws']['exact'], code, feedback)
|
1868
|
+
raise ExchangeError(feedback)
|
1823
1869
|
except Exception as e:
|
1824
1870
|
if isinstance(e, AuthenticationError):
|
1825
1871
|
client.reject(e, 'auth')
|
@@ -2073,7 +2119,7 @@ class htx(ccxt.async_support.htx):
|
|
2073
2119
|
|
2074
2120
|
def get_url_by_market_type(self, type, isLinear=True, isPrivate=False, isFeed=False):
|
2075
2121
|
api = self.safe_string(self.options, 'api', 'api')
|
2076
|
-
hostname = {'hostname': self.hostname}
|
2122
|
+
hostname: dict = {'hostname': self.hostname}
|
2077
2123
|
hostnameURL = None
|
2078
2124
|
url = None
|
2079
2125
|
if type == 'spot':
|
@@ -2093,11 +2139,11 @@ class htx(ccxt.async_support.htx):
|
|
2093
2139
|
|
2094
2140
|
async def subscribe_public(self, url, symbol, messageHash, method=None, params={}):
|
2095
2141
|
requestId = self.request_id()
|
2096
|
-
request = {
|
2142
|
+
request: dict = {
|
2097
2143
|
'sub': messageHash,
|
2098
2144
|
'id': requestId,
|
2099
2145
|
}
|
2100
|
-
subscription = {
|
2146
|
+
subscription: dict = {
|
2101
2147
|
'id': requestId,
|
2102
2148
|
'messageHash': messageHash,
|
2103
2149
|
'symbol': symbol,
|
@@ -2109,7 +2155,7 @@ class htx(ccxt.async_support.htx):
|
|
2109
2155
|
|
2110
2156
|
async def subscribe_private(self, channel, messageHash, type, subtype, params={}, subscriptionParams={}):
|
2111
2157
|
requestId = self.request_id()
|
2112
|
-
subscription = {
|
2158
|
+
subscription: dict = {
|
2113
2159
|
'id': requestId,
|
2114
2160
|
'messageHash': messageHash,
|
2115
2161
|
'params': params,
|
@@ -2130,13 +2176,11 @@ class htx(ccxt.async_support.htx):
|
|
2130
2176
|
isLinear = subtype == 'linear'
|
2131
2177
|
url = self.get_url_by_market_type(type, isLinear, True)
|
2132
2178
|
hostname = self.urls['hostnames']['spot'] if (type == 'spot') else self.urls['hostnames']['contract']
|
2133
|
-
authParams = {
|
2179
|
+
authParams: dict = {
|
2134
2180
|
'type': type,
|
2135
2181
|
'url': url,
|
2136
2182
|
'hostname': hostname,
|
2137
2183
|
}
|
2138
|
-
if type == 'spot':
|
2139
|
-
self.options['ws']['gunzip'] = False
|
2140
2184
|
await self.authenticate(authParams)
|
2141
2185
|
return await self.watch(url, messageHash, self.extend(request, params), channel, extendedSubsription)
|
2142
2186
|
|
@@ -2147,7 +2191,7 @@ class htx(ccxt.async_support.htx):
|
|
2147
2191
|
if url is None or hostname is None or type is None:
|
2148
2192
|
raise ArgumentsRequired(self.id + ' authenticate requires a url, hostname and type argument')
|
2149
2193
|
self.check_required_credentials()
|
2150
|
-
messageHash = '
|
2194
|
+
messageHash = 'auth'
|
2151
2195
|
relativePath = url.replace('wss://' + hostname, '')
|
2152
2196
|
client = self.client(url)
|
2153
2197
|
future = client.future(messageHash)
|
@@ -2175,7 +2219,7 @@ class htx(ccxt.async_support.htx):
|
|
2175
2219
|
signature = self.hmac(self.encode(payload), self.encode(self.secret), hashlib.sha256, 'base64')
|
2176
2220
|
request = None
|
2177
2221
|
if type == 'spot':
|
2178
|
-
newParams = {
|
2222
|
+
newParams: dict = {
|
2179
2223
|
'authType': 'api',
|
2180
2224
|
'accessKey': self.apiKey,
|
2181
2225
|
'signatureMethod': 'HmacSHA256',
|
@@ -2199,10 +2243,10 @@ class htx(ccxt.async_support.htx):
|
|
2199
2243
|
'Signature': signature,
|
2200
2244
|
}
|
2201
2245
|
requestId = self.request_id()
|
2202
|
-
subscription = {
|
2246
|
+
subscription: dict = {
|
2203
2247
|
'id': requestId,
|
2204
2248
|
'messageHash': messageHash,
|
2205
2249
|
'params': params,
|
2206
2250
|
}
|
2207
2251
|
self.watch(url, messageHash, request, messageHash, subscription)
|
2208
|
-
return future
|
2252
|
+
return await future
|
ccxt/pro/huobijp.py
CHANGED
@@ -21,6 +21,7 @@ class huobijp(ccxt.async_support.huobijp):
|
|
21
21
|
'watchTickers': False, # for now
|
22
22
|
'watchTicker': True,
|
23
23
|
'watchTrades': True,
|
24
|
+
'watchTradesForSymbols': False,
|
24
25
|
'watchBalance': False, # for now
|
25
26
|
'watchOHLCV': True,
|
26
27
|
},
|
@@ -62,14 +63,14 @@ class huobijp(ccxt.async_support.huobijp):
|
|
62
63
|
# only supports a limit of 150 at self time
|
63
64
|
messageHash = 'market.' + market['id'] + '.detail'
|
64
65
|
api = self.safe_string(self.options, 'api', 'api')
|
65
|
-
hostname = {'hostname': self.hostname}
|
66
|
+
hostname: dict = {'hostname': self.hostname}
|
66
67
|
url = self.implode_params(self.urls['api']['ws'][api]['public'], hostname)
|
67
68
|
requestId = self.request_id()
|
68
|
-
request = {
|
69
|
+
request: dict = {
|
69
70
|
'sub': messageHash,
|
70
71
|
'id': requestId,
|
71
72
|
}
|
72
|
-
subscription = {
|
73
|
+
subscription: dict = {
|
73
74
|
'id': requestId,
|
74
75
|
'messageHash': messageHash,
|
75
76
|
'symbol': symbol,
|
@@ -124,14 +125,14 @@ class huobijp(ccxt.async_support.huobijp):
|
|
124
125
|
# only supports a limit of 150 at self time
|
125
126
|
messageHash = 'market.' + market['id'] + '.trade.detail'
|
126
127
|
api = self.safe_string(self.options, 'api', 'api')
|
127
|
-
hostname = {'hostname': self.hostname}
|
128
|
+
hostname: dict = {'hostname': self.hostname}
|
128
129
|
url = self.implode_params(self.urls['api']['ws'][api]['public'], hostname)
|
129
130
|
requestId = self.request_id()
|
130
|
-
request = {
|
131
|
+
request: dict = {
|
131
132
|
'sub': messageHash,
|
132
133
|
'id': requestId,
|
133
134
|
}
|
134
|
-
subscription = {
|
135
|
+
subscription: dict = {
|
135
136
|
'id': requestId,
|
136
137
|
'messageHash': messageHash,
|
137
138
|
'symbol': symbol,
|
@@ -197,14 +198,14 @@ class huobijp(ccxt.async_support.huobijp):
|
|
197
198
|
interval = self.safe_string(self.timeframes, timeframe, timeframe)
|
198
199
|
messageHash = 'market.' + market['id'] + '.kline.' + interval
|
199
200
|
api = self.safe_string(self.options, 'api', 'api')
|
200
|
-
hostname = {'hostname': self.hostname}
|
201
|
+
hostname: dict = {'hostname': self.hostname}
|
201
202
|
url = self.implode_params(self.urls['api']['ws'][api]['public'], hostname)
|
202
203
|
requestId = self.request_id()
|
203
|
-
request = {
|
204
|
+
request: dict = {
|
204
205
|
'sub': messageHash,
|
205
206
|
'id': requestId,
|
206
207
|
}
|
207
|
-
subscription = {
|
208
|
+
subscription: dict = {
|
208
209
|
'id': requestId,
|
209
210
|
'messageHash': messageHash,
|
210
211
|
'symbol': symbol,
|
@@ -268,14 +269,14 @@ class huobijp(ccxt.async_support.huobijp):
|
|
268
269
|
limit = 150 if (limit is None) else limit
|
269
270
|
messageHash = 'market.' + market['id'] + '.mbp.' + str(limit)
|
270
271
|
api = self.safe_string(self.options, 'api', 'api')
|
271
|
-
hostname = {'hostname': self.hostname}
|
272
|
+
hostname: dict = {'hostname': self.hostname}
|
272
273
|
url = self.implode_params(self.urls['api']['ws'][api]['public'], hostname)
|
273
274
|
requestId = self.request_id()
|
274
|
-
request = {
|
275
|
+
request: dict = {
|
275
276
|
'sub': messageHash,
|
276
277
|
'id': requestId,
|
277
278
|
}
|
278
|
-
subscription = {
|
279
|
+
subscription: dict = {
|
279
280
|
'id': requestId,
|
280
281
|
'messageHash': messageHash,
|
281
282
|
'symbol': symbol,
|
@@ -328,16 +329,16 @@ class huobijp(ccxt.async_support.huobijp):
|
|
328
329
|
limit = self.safe_integer(subscription, 'limit')
|
329
330
|
params = self.safe_value(subscription, 'params')
|
330
331
|
api = self.safe_string(self.options, 'api', 'api')
|
331
|
-
hostname = {'hostname': self.hostname}
|
332
|
+
hostname: dict = {'hostname': self.hostname}
|
332
333
|
url = self.implode_params(self.urls['api']['ws'][api]['public'], hostname)
|
333
334
|
requestId = self.request_id()
|
334
|
-
request = {
|
335
|
+
request: dict = {
|
335
336
|
'req': messageHash,
|
336
337
|
'id': requestId,
|
337
338
|
}
|
338
339
|
# self is a temporary subscription by a specific requestId
|
339
340
|
# it has a very short lifetime until the snapshot is received over ws
|
340
|
-
snapshotSubscription = {
|
341
|
+
snapshotSubscription: dict = {
|
341
342
|
'id': requestId,
|
342
343
|
'messageHash': messageHash,
|
343
344
|
'symbol': symbol,
|
@@ -500,7 +501,7 @@ class huobijp(ccxt.async_support.huobijp):
|
|
500
501
|
type = self.safe_string(parts, 0)
|
501
502
|
if type == 'market':
|
502
503
|
methodName = self.safe_string(parts, 2)
|
503
|
-
methods = {
|
504
|
+
methods: dict = {
|
504
505
|
'mbp': self.handle_order_book,
|
505
506
|
'detail': self.handle_ticker,
|
506
507
|
'trade': self.handle_trades,
|