ccxt 4.2.77__py2.py3-none-any.whl → 4.4.49__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 +3205 -937
- 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 +1525 -573
- 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 +223 -97
- 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 +639 -323
- ccxt/async_support/digifinex.py +465 -233
- ccxt/async_support/ellipx.py +1887 -0
- ccxt/async_support/exmo.py +317 -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 +433 -178
- ccxt/async_support/hollaex.py +207 -83
- ccxt/async_support/htx.py +1095 -563
- ccxt/async_support/huobijp.py +178 -56
- ccxt/async_support/hyperliquid.py +1678 -292
- ccxt/async_support/idex.py +219 -95
- ccxt/async_support/independentreserve.py +300 -31
- ccxt/async_support/indodax.py +226 -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 +198 -107
- ccxt/async_support/latoken.py +199 -79
- ccxt/async_support/lbank.py +360 -113
- ccxt/async_support/luno.py +185 -62
- ccxt/async_support/lykke.py +168 -55
- ccxt/async_support/mercado.py +101 -29
- ccxt/async_support/mexc.py +995 -429
- ccxt/async_support/myokx.py +53 -0
- ccxt/async_support/ndax.py +234 -82
- ccxt/async_support/novadax.py +195 -75
- ccxt/async_support/oceanex.py +244 -59
- ccxt/async_support/okcoin.py +301 -165
- ccxt/async_support/okx.py +1776 -454
- ccxt/async_support/onetrading.py +198 -414
- ccxt/async_support/oxfun.py +2898 -0
- ccxt/async_support/p2b.py +142 -52
- ccxt/async_support/paradex.py +2085 -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 +3205 -937
- 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 +1525 -573
- 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 +223 -97
- 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 +639 -323
- ccxt/digifinex.py +465 -233
- ccxt/ellipx.py +1887 -0
- ccxt/exmo.py +317 -128
- ccxt/gate.py +1472 -463
- ccxt/gemini.py +206 -84
- ccxt/hashkey.py +4164 -0
- ccxt/hitbtc.py +433 -178
- ccxt/hollaex.py +207 -83
- ccxt/htx.py +1095 -563
- ccxt/huobijp.py +178 -56
- ccxt/hyperliquid.py +1677 -292
- ccxt/idex.py +219 -95
- ccxt/independentreserve.py +299 -31
- ccxt/indodax.py +226 -62
- ccxt/kraken.py +871 -354
- ccxt/krakenfutures.py +324 -100
- ccxt/kucoin.py +917 -357
- ccxt/kucoinfutures.py +1004 -149
- ccxt/kuna.py +198 -107
- ccxt/latoken.py +199 -79
- ccxt/lbank.py +360 -113
- ccxt/luno.py +185 -62
- ccxt/lykke.py +168 -55
- ccxt/mercado.py +101 -29
- ccxt/mexc.py +994 -429
- ccxt/myokx.py +53 -0
- ccxt/ndax.py +234 -82
- ccxt/novadax.py +195 -75
- ccxt/oceanex.py +244 -59
- ccxt/okcoin.py +301 -165
- ccxt/okx.py +1776 -454
- ccxt/onetrading.py +198 -414
- ccxt/oxfun.py +2897 -0
- ccxt/p2b.py +142 -52
- ccxt/paradex.py +2085 -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 +143 -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.49.dist-info/LICENSE.txt +21 -0
- ccxt-4.4.49.dist-info/METADATA +646 -0
- ccxt-4.4.49.dist-info/RECORD +669 -0
- {ccxt-4.2.77.dist-info → ccxt-4.4.49.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.49.dist-info}/top_level.txt +0 -0
ccxt/pro/hitbtc.py
CHANGED
@@ -10,8 +10,8 @@ from ccxt.base.types import Balances, Int, Num, Order, OrderBook, OrderSide, Ord
|
|
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 NotSupported
|
14
13
|
from ccxt.base.errors import AuthenticationError
|
14
|
+
from ccxt.base.errors import NotSupported
|
15
15
|
|
16
16
|
|
17
17
|
class hitbtc(ccxt.async_support.hitbtc):
|
@@ -22,7 +22,9 @@ class hitbtc(ccxt.async_support.hitbtc):
|
|
22
22
|
'ws': True,
|
23
23
|
'watchTicker': True,
|
24
24
|
'watchTickers': True,
|
25
|
+
'watchBidsAsks': True,
|
25
26
|
'watchTrades': True,
|
27
|
+
'watchTradesForSymbols': False,
|
26
28
|
'watchOrderBook': True,
|
27
29
|
'watchBalance': True,
|
28
30
|
'watchOrders': True,
|
@@ -55,8 +57,11 @@ class hitbtc(ccxt.async_support.hitbtc):
|
|
55
57
|
'watchTickers': {
|
56
58
|
'method': 'ticker/{speed}', # 'ticker/{speed}','ticker/price/{speed}', 'ticker/{speed}/batch', or 'ticker/{speed}/price/batch''
|
57
59
|
},
|
60
|
+
'watchBidsAsks': {
|
61
|
+
'method': 'orderbook/top/{speed}', # 'orderbook/top/{speed}', 'orderbook/top/{speed}/batch'
|
62
|
+
},
|
58
63
|
'watchOrderBook': {
|
59
|
-
'method': 'orderbook/full', # 'orderbook/full', 'orderbook/{depth}/{speed}', 'orderbook/{depth}/{speed}/batch'
|
64
|
+
'method': 'orderbook/full', # 'orderbook/full', 'orderbook/{depth}/{speed}', 'orderbook/{depth}/{speed}/batch'
|
60
65
|
},
|
61
66
|
},
|
62
67
|
'timeframes': {
|
@@ -78,9 +83,11 @@ class hitbtc(ccxt.async_support.hitbtc):
|
|
78
83
|
|
79
84
|
async def authenticate(self):
|
80
85
|
"""
|
81
|
-
|
86
|
+
@ignore
|
82
87
|
authenticates the user to access private web socket channels
|
83
|
-
|
88
|
+
|
89
|
+
https://api.hitbtc.com/#socket-authentication
|
90
|
+
|
84
91
|
:returns dict: response from exchange
|
85
92
|
"""
|
86
93
|
self.check_required_credentials()
|
@@ -92,7 +99,7 @@ class hitbtc(ccxt.async_support.hitbtc):
|
|
92
99
|
if authenticated is None:
|
93
100
|
timestamp = self.milliseconds()
|
94
101
|
signature = self.hmac(self.encode(self.number_to_string(timestamp)), self.encode(self.secret), hashlib.sha256, 'hex')
|
95
|
-
request = {
|
102
|
+
request: dict = {
|
96
103
|
'method': 'login',
|
97
104
|
'params': {
|
98
105
|
'type': 'HS256',
|
@@ -119,31 +126,37 @@ class hitbtc(ccxt.async_support.hitbtc):
|
|
119
126
|
# }
|
120
127
|
# }
|
121
128
|
#
|
122
|
-
return future
|
129
|
+
return await future
|
123
130
|
|
124
131
|
async def subscribe_public(self, name: str, messageHashPrefix: str, symbols: Strings = None, params={}):
|
125
132
|
"""
|
126
|
-
|
133
|
+
@ignore
|
127
134
|
:param str name: websocket endpoint name
|
135
|
+
:param str messageHashPrefix: prefix for the message hash
|
128
136
|
:param str[] [symbols]: unified CCXT symbol(s)
|
129
137
|
:param dict [params]: extra parameters specific to the hitbtc api
|
130
138
|
"""
|
131
139
|
await self.load_markets()
|
140
|
+
symbols = self.market_symbols(symbols)
|
141
|
+
isBatch = name.find('batch') >= 0
|
132
142
|
url = self.urls['api']['ws']['public']
|
133
|
-
|
134
|
-
if symbols is not None:
|
135
|
-
|
136
|
-
|
143
|
+
messageHashes = []
|
144
|
+
if symbols is not None and not isBatch:
|
145
|
+
for i in range(0, len(symbols)):
|
146
|
+
messageHashes.append(messageHashPrefix + '::' + symbols[i])
|
147
|
+
else:
|
148
|
+
messageHashes.append(messageHashPrefix)
|
149
|
+
subscribe: dict = {
|
137
150
|
'method': 'subscribe',
|
138
151
|
'id': self.nonce(),
|
139
152
|
'ch': name,
|
140
153
|
}
|
141
154
|
request = self.extend(subscribe, params)
|
142
|
-
return await self.
|
155
|
+
return await self.watch_multiple(url, messageHashes, request, messageHashes)
|
143
156
|
|
144
157
|
async def subscribe_private(self, name: str, symbol: Str = None, params={}):
|
145
158
|
"""
|
146
|
-
|
159
|
+
@ignore
|
147
160
|
:param str name: websocket endpoint name
|
148
161
|
:param str [symbol]: unified CCXT symbol
|
149
162
|
:param dict [params]: extra parameters specific to the hitbtc api
|
@@ -155,7 +168,7 @@ class hitbtc(ccxt.async_support.hitbtc):
|
|
155
168
|
messageHash = self.safe_string(splitName, 0)
|
156
169
|
if symbol is not None:
|
157
170
|
messageHash = messageHash + '::' + symbol
|
158
|
-
subscribe = {
|
171
|
+
subscribe: dict = {
|
159
172
|
'method': name,
|
160
173
|
'params': params,
|
161
174
|
'id': self.nonce(),
|
@@ -164,16 +177,15 @@ class hitbtc(ccxt.async_support.hitbtc):
|
|
164
177
|
|
165
178
|
async def trade_request(self, name: str, params={}):
|
166
179
|
"""
|
167
|
-
|
180
|
+
@ignore
|
168
181
|
:param str name: websocket endpoint name
|
169
|
-
:param str [symbol]: unified CCXT symbol
|
170
182
|
:param dict [params]: extra parameters specific to the hitbtc api
|
171
183
|
"""
|
172
184
|
await self.load_markets()
|
173
185
|
await self.authenticate()
|
174
186
|
url = self.urls['api']['ws']['private']
|
175
187
|
messageHash = str(self.nonce())
|
176
|
-
subscribe = {
|
188
|
+
subscribe: dict = {
|
177
189
|
'method': name,
|
178
190
|
'params': params,
|
179
191
|
'id': messageHash,
|
@@ -183,15 +195,17 @@ class hitbtc(ccxt.async_support.hitbtc):
|
|
183
195
|
async def watch_order_book(self, symbol: str, limit: Int = None, params={}) -> OrderBook:
|
184
196
|
"""
|
185
197
|
watches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
198
|
+
|
199
|
+
https://api.hitbtc.com/#subscribe-to-full-order-book
|
200
|
+
https://api.hitbtc.com/#subscribe-to-partial-order-book
|
201
|
+
https://api.hitbtc.com/#subscribe-to-partial-order-book-in-batches
|
202
|
+
https://api.hitbtc.com/#subscribe-to-top-of-book
|
203
|
+
https://api.hitbtc.com/#subscribe-to-top-of-book-in-batches
|
204
|
+
|
191
205
|
:param str symbol: unified symbol of the market to fetch the order book for
|
192
206
|
:param int [limit]: the maximum amount of order book entries to return
|
193
207
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
194
|
-
:param str [params.method]: 'orderbook/full', 'orderbook/{depth}/{speed}', 'orderbook/{depth}/{speed}/batch'
|
208
|
+
:param str [params.method]: 'orderbook/full', 'orderbook/{depth}/{speed}', 'orderbook/{depth}/{speed}/batch'
|
195
209
|
:param int [params.depth]: 5 , 10, or 20(default)
|
196
210
|
:param int [params.speed]: 100(default), 500, or 1000
|
197
211
|
:returns dict: A dictionary of `order book structures <https://docs.ccxt.com/#/?id=order-book-structure>` indexed by market symbols
|
@@ -205,12 +219,8 @@ class hitbtc(ccxt.async_support.hitbtc):
|
|
205
219
|
name = 'orderbook/D' + depth + '/' + speed + 'ms'
|
206
220
|
elif name == 'orderbook/{depth}/{speed}/batch':
|
207
221
|
name = 'orderbook/D' + depth + '/' + speed + 'ms/batch'
|
208
|
-
elif name == 'orderbook/top/{speed}':
|
209
|
-
name = 'orderbook/top/' + speed + 'ms'
|
210
|
-
elif name == 'orderbook/top/{speed}/batch':
|
211
|
-
name = 'orderbook/top/' + speed + 'ms/batch'
|
212
222
|
market = self.market(symbol)
|
213
|
-
request = {
|
223
|
+
request: dict = {
|
214
224
|
'params': {
|
215
225
|
'symbols': [market['id']],
|
216
226
|
},
|
@@ -287,43 +297,34 @@ class hitbtc(ccxt.async_support.hitbtc):
|
|
287
297
|
async def watch_ticker(self, symbol: str, params={}) -> Ticker:
|
288
298
|
"""
|
289
299
|
watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
300
|
+
|
301
|
+
https://api.hitbtc.com/#subscribe-to-ticker
|
302
|
+
https://api.hitbtc.com/#subscribe-to-ticker-in-batches
|
303
|
+
https://api.hitbtc.com/#subscribe-to-mini-ticker
|
304
|
+
https://api.hitbtc.com/#subscribe-to-mini-ticker-in-batches
|
305
|
+
|
294
306
|
:param str symbol: unified symbol of the market to fetch the ticker for
|
295
307
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
296
308
|
:param str [params.method]: 'ticker/{speed}'(default), or 'ticker/price/{speed}'
|
297
309
|
:param str [params.speed]: '1s'(default), or '3s'
|
298
310
|
:returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
|
299
311
|
"""
|
300
|
-
|
301
|
-
|
302
|
-
method = self.safe_string_2(params, 'method', 'defaultMethod', defaultMethod)
|
303
|
-
speed = self.safe_string(params, 'speed', '1s')
|
304
|
-
name = self.implode_params(method, {'speed': speed})
|
305
|
-
params = self.omit(params, ['method', 'speed'])
|
306
|
-
market = self.market(symbol)
|
307
|
-
request = {
|
308
|
-
'params': {
|
309
|
-
'symbols': [market['id']],
|
310
|
-
},
|
311
|
-
}
|
312
|
-
result = await self.subscribe_public(name, 'tickers', [symbol], self.deep_extend(request, params))
|
313
|
-
return self.safe_value(result, symbol)
|
312
|
+
ticker = await self.watch_tickers([symbol], params)
|
313
|
+
return self.safe_value(ticker, symbol)
|
314
314
|
|
315
315
|
async def watch_tickers(self, symbols: Strings = None, params={}) -> Tickers:
|
316
316
|
"""
|
317
317
|
watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
|
318
|
-
:param str
|
318
|
+
:param str[] [symbols]:
|
319
319
|
:param dict params: extra parameters specific to the exchange API endpoint
|
320
|
-
:param str params['method']: 'ticker/{speed}'
|
320
|
+
:param str params['method']: 'ticker/{speed}' ,'ticker/price/{speed}', 'ticker/{speed}/batch'(default), or 'ticker/{speed}/price/batch''
|
321
321
|
:param str params['speed']: '1s'(default), or '3s'
|
322
322
|
:returns dict: a `ticker structure <https://docs.ccxt.com/en/latest/manual.html#ticker-structure>`
|
323
323
|
"""
|
324
324
|
await self.load_markets()
|
325
|
+
symbols = self.market_symbols(symbols)
|
325
326
|
options = self.safe_value(self.options, 'watchTicker')
|
326
|
-
defaultMethod = self.safe_string(options, 'method', 'ticker/{speed}')
|
327
|
+
defaultMethod = self.safe_string(options, 'method', 'ticker/{speed}/batch')
|
327
328
|
method = self.safe_string_2(params, 'method', 'defaultMethod', defaultMethod)
|
328
329
|
speed = self.safe_string(params, 'speed', '1s')
|
329
330
|
name = self.implode_params(method, {'speed': speed})
|
@@ -335,15 +336,18 @@ class hitbtc(ccxt.async_support.hitbtc):
|
|
335
336
|
for i in range(0, len(symbols)):
|
336
337
|
marketId = self.market_id(symbols[i])
|
337
338
|
marketIds.append(marketId)
|
338
|
-
request = {
|
339
|
+
request: dict = {
|
339
340
|
'params': {
|
340
341
|
'symbols': marketIds,
|
341
342
|
},
|
342
343
|
}
|
343
|
-
|
344
|
+
newTickers = await self.subscribe_public(name, 'tickers', symbols, self.deep_extend(request, params))
|
344
345
|
if self.newUpdates:
|
345
|
-
|
346
|
-
|
346
|
+
if not isinstance(newTickers, list):
|
347
|
+
tickers: dict = {}
|
348
|
+
tickers[newTickers['symbol']] = newTickers
|
349
|
+
return tickers
|
350
|
+
return self.filter_by_array(newTickers, 'symbol', symbols)
|
347
351
|
|
348
352
|
def handle_ticker(self, client: Client, message):
|
349
353
|
#
|
@@ -386,27 +390,18 @@ class hitbtc(ccxt.async_support.hitbtc):
|
|
386
390
|
#
|
387
391
|
data = self.safe_value(message, 'data', {})
|
388
392
|
marketIds = list(data.keys())
|
389
|
-
|
393
|
+
result = []
|
394
|
+
topic = 'tickers'
|
390
395
|
for i in range(0, len(marketIds)):
|
391
396
|
marketId = marketIds[i]
|
392
397
|
market = self.safe_market(marketId)
|
393
398
|
symbol = market['symbol']
|
394
399
|
ticker = self.parse_ws_ticker(data[marketId], market)
|
395
400
|
self.tickers[symbol] = ticker
|
396
|
-
|
397
|
-
|
398
|
-
|
399
|
-
|
400
|
-
messageHash = messageHashes[i]
|
401
|
-
parts = messageHash.split('::')
|
402
|
-
symbolsString = parts[1]
|
403
|
-
symbols = symbolsString.split(',')
|
404
|
-
tickers = self.filter_by_array(newTickers, 'symbol', symbols)
|
405
|
-
tickersSymbols = list(tickers.keys())
|
406
|
-
numTickers = len(tickersSymbols)
|
407
|
-
if numTickers > 0:
|
408
|
-
client.resolve(tickers, messageHash)
|
409
|
-
return message
|
401
|
+
result.append(ticker)
|
402
|
+
messageHash = topic + '::' + symbol
|
403
|
+
client.resolve(ticker, messageHash)
|
404
|
+
client.resolve(result, topic)
|
410
405
|
|
411
406
|
def parse_ws_ticker(self, ticker, market=None):
|
412
407
|
#
|
@@ -463,10 +458,89 @@ class hitbtc(ccxt.async_support.hitbtc):
|
|
463
458
|
'info': ticker,
|
464
459
|
}, market)
|
465
460
|
|
461
|
+
async def watch_bids_asks(self, symbols: Strings = None, params={}) -> Tickers:
|
462
|
+
"""
|
463
|
+
watches best bid & ask for symbols
|
464
|
+
|
465
|
+
https://api.hitbtc.com/#subscribe-to-top-of-book
|
466
|
+
|
467
|
+
:param str[] symbols: unified symbol of the market to fetch the ticker for
|
468
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
469
|
+
:param str [params.method]: 'orderbook/top/{speed}' or 'orderbook/top/{speed}/batch(default)'
|
470
|
+
:param str [params.speed]: '100ms'(default) or '500ms' or '1000ms'
|
471
|
+
:returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
|
472
|
+
"""
|
473
|
+
await self.load_markets()
|
474
|
+
symbols = self.market_symbols(symbols, None, False)
|
475
|
+
options = self.safe_value(self.options, 'watchBidsAsks')
|
476
|
+
defaultMethod = self.safe_string(options, 'method', 'orderbook/top/{speed}/batch')
|
477
|
+
method = self.safe_string_2(params, 'method', 'defaultMethod', defaultMethod)
|
478
|
+
speed = self.safe_string(params, 'speed', '100ms')
|
479
|
+
name = self.implode_params(method, {'speed': speed})
|
480
|
+
params = self.omit(params, ['method', 'speed'])
|
481
|
+
marketIds = self.market_ids(symbols)
|
482
|
+
request: dict = {
|
483
|
+
'params': {
|
484
|
+
'symbols': marketIds,
|
485
|
+
},
|
486
|
+
}
|
487
|
+
newTickers = await self.subscribe_public(name, 'bidask', symbols, self.deep_extend(request, params))
|
488
|
+
if self.newUpdates:
|
489
|
+
if not isinstance(newTickers, list):
|
490
|
+
tickers: dict = {}
|
491
|
+
tickers[newTickers['symbol']] = newTickers
|
492
|
+
return tickers
|
493
|
+
return self.filter_by_array(newTickers, 'symbol', symbols)
|
494
|
+
|
495
|
+
def handle_bid_ask(self, client: Client, message):
|
496
|
+
#
|
497
|
+
# {
|
498
|
+
# "ch": "orderbook/top/100ms", # or 'orderbook/top/100ms/batch'
|
499
|
+
# "data": {
|
500
|
+
# "BTCUSDT": {
|
501
|
+
# "t": 1727276919771,
|
502
|
+
# "a": "63931.45",
|
503
|
+
# "A": "0.02879",
|
504
|
+
# "b": "63926.97",
|
505
|
+
# "B": "0.00100"
|
506
|
+
# }
|
507
|
+
# }
|
508
|
+
# }
|
509
|
+
#
|
510
|
+
data = self.safe_dict(message, 'data', {})
|
511
|
+
marketIds = list(data.keys())
|
512
|
+
result = []
|
513
|
+
topic = 'bidask'
|
514
|
+
for i in range(0, len(marketIds)):
|
515
|
+
marketId = marketIds[i]
|
516
|
+
market = self.safe_market(marketId)
|
517
|
+
symbol = market['symbol']
|
518
|
+
ticker = self.parse_ws_bid_ask(data[marketId], market)
|
519
|
+
self.bidsasks[symbol] = ticker
|
520
|
+
result.append(ticker)
|
521
|
+
messageHash = topic + '::' + symbol
|
522
|
+
client.resolve(ticker, messageHash)
|
523
|
+
client.resolve(result, topic)
|
524
|
+
|
525
|
+
def parse_ws_bid_ask(self, ticker, market=None):
|
526
|
+
timestamp = self.safe_integer(ticker, 't')
|
527
|
+
return self.safe_ticker({
|
528
|
+
'symbol': market['symbol'],
|
529
|
+
'timestamp': timestamp,
|
530
|
+
'datetime': self.iso8601(timestamp),
|
531
|
+
'ask': self.safe_string(ticker, 'a'),
|
532
|
+
'askVolume': self.safe_string(ticker, 'A'),
|
533
|
+
'bid': self.safe_string(ticker, 'b'),
|
534
|
+
'bidVolume': self.safe_string(ticker, 'B'),
|
535
|
+
'info': ticker,
|
536
|
+
}, market)
|
537
|
+
|
466
538
|
async def watch_trades(self, symbol: str, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
|
467
539
|
"""
|
468
540
|
get the list of most recent trades for a particular symbol
|
469
|
-
|
541
|
+
|
542
|
+
https://api.hitbtc.com/#subscribe-to-trades
|
543
|
+
|
470
544
|
:param str symbol: unified symbol of the market to fetch trades for
|
471
545
|
:param int [since]: timestamp in ms of the earliest trade to fetch
|
472
546
|
:param int [limit]: the maximum amount of trades to fetch
|
@@ -475,7 +549,7 @@ class hitbtc(ccxt.async_support.hitbtc):
|
|
475
549
|
"""
|
476
550
|
await self.load_markets()
|
477
551
|
market = self.market(symbol)
|
478
|
-
request = {
|
552
|
+
request: dict = {
|
479
553
|
'params': {
|
480
554
|
'symbols': [market['id']],
|
481
555
|
},
|
@@ -586,7 +660,9 @@ class hitbtc(ccxt.async_support.hitbtc):
|
|
586
660
|
async def watch_ohlcv(self, symbol: str, timeframe='1m', since: Int = None, limit: Int = None, params={}) -> List[list]:
|
587
661
|
"""
|
588
662
|
watches historical candlestick data containing the open, high, low, and close price, and the volume of a market
|
589
|
-
|
663
|
+
|
664
|
+
https://api.hitbtc.com/#subscribe-to-candles
|
665
|
+
|
590
666
|
:param str symbol: unified symbol of the market to fetch OHLCV data for
|
591
667
|
:param str [timeframe]: the length of time each candle represents
|
592
668
|
:param int [since]: not used by hitbtc watchOHLCV
|
@@ -597,7 +673,7 @@ class hitbtc(ccxt.async_support.hitbtc):
|
|
597
673
|
period = self.safe_string(self.timeframes, timeframe, timeframe)
|
598
674
|
name = 'candles/' + period
|
599
675
|
market = self.market(symbol)
|
600
|
-
request = {
|
676
|
+
request: dict = {
|
601
677
|
'params': {
|
602
678
|
'symbols': [market['id']],
|
603
679
|
},
|
@@ -690,9 +766,11 @@ class hitbtc(ccxt.async_support.hitbtc):
|
|
690
766
|
async def watch_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
|
691
767
|
"""
|
692
768
|
watches information on multiple orders made by the user
|
693
|
-
|
694
|
-
|
695
|
-
|
769
|
+
|
770
|
+
https://api.hitbtc.com/#subscribe-to-reports
|
771
|
+
https://api.hitbtc.com/#subscribe-to-reports-2
|
772
|
+
https://api.hitbtc.com/#subscribe-to-reports-3
|
773
|
+
|
696
774
|
:param str [symbol]: unified CCXT market symbol
|
697
775
|
:param int [since]: timestamp in ms of the earliest order to fetch
|
698
776
|
:param int [limit]: the maximum amount of orders to fetch
|
@@ -920,12 +998,14 @@ class hitbtc(ccxt.async_support.hitbtc):
|
|
920
998
|
async def watch_balance(self, params={}) -> Balances:
|
921
999
|
"""
|
922
1000
|
watches balance updates, cannot subscribe to margin account balances
|
923
|
-
|
924
|
-
|
1001
|
+
|
1002
|
+
https://api.hitbtc.com/#subscribe-to-spot-balances
|
1003
|
+
https://api.hitbtc.com/#subscribe-to-futures-balances
|
1004
|
+
|
925
1005
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
926
1006
|
:param str [params.type]: 'spot', 'swap', or 'future'
|
927
|
-
|
928
|
-
|
1007
|
+
|
1008
|
+
EXCHANGE SPECIFIC PARAMETERS
|
929
1009
|
:param str [params.mode]: 'updates' or 'batches'(default), 'updates' = messages arrive after balance updates, 'batches' = messages arrive at equal intervals if there were any updates
|
930
1010
|
:returns dict[]: a list of `balance structures <https://docs.ccxt.com/#/?id=balance-structure>`
|
931
1011
|
"""
|
@@ -939,7 +1019,7 @@ class hitbtc(ccxt.async_support.hitbtc):
|
|
939
1019
|
})
|
940
1020
|
mode = self.safe_string(params, 'mode', 'batches')
|
941
1021
|
params = self.omit(params, 'mode')
|
942
|
-
request = {
|
1022
|
+
request: dict = {
|
943
1023
|
'mode': mode,
|
944
1024
|
}
|
945
1025
|
return await self.subscribe_private(name, None, self.extend(request, params))
|
@@ -947,14 +1027,16 @@ class hitbtc(ccxt.async_support.hitbtc):
|
|
947
1027
|
async def create_order_ws(self, symbol: str, type: OrderType, side: OrderSide, amount: float, price: Num = None, params={}) -> Order:
|
948
1028
|
"""
|
949
1029
|
create a trade order
|
950
|
-
|
951
|
-
|
952
|
-
|
1030
|
+
|
1031
|
+
https://api.hitbtc.com/#create-new-spot-order
|
1032
|
+
https://api.hitbtc.com/#create-margin-order
|
1033
|
+
https://api.hitbtc.com/#create-futures-order
|
1034
|
+
|
953
1035
|
:param str symbol: unified symbol of the market to create an order in
|
954
1036
|
:param str type: 'market' or 'limit'
|
955
1037
|
:param str side: 'buy' or 'sell'
|
956
1038
|
:param float amount: how much of currency you want to trade in units of base currency
|
957
|
-
:param float [price]: the price at which the order is to be
|
1039
|
+
:param float [price]: the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
|
958
1040
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
959
1041
|
:param str [params.marginMode]: 'cross' or 'isolated' only 'isolated' is supported for spot-margin, swap supports both, default is 'cross'
|
960
1042
|
:param bool [params.margin]: True for creating a margin order
|
@@ -981,9 +1063,11 @@ class hitbtc(ccxt.async_support.hitbtc):
|
|
981
1063
|
|
982
1064
|
async def cancel_order_ws(self, id: str, symbol: Str = None, params={}) -> Order:
|
983
1065
|
"""
|
984
|
-
|
985
|
-
|
986
|
-
|
1066
|
+
|
1067
|
+
https://api.hitbtc.com/#cancel-spot-order-2
|
1068
|
+
https://api.hitbtc.com/#cancel-futures-order-2
|
1069
|
+
https://api.hitbtc.com/#cancel-margin-order-2
|
1070
|
+
|
987
1071
|
cancels an open order
|
988
1072
|
:param str id: order id
|
989
1073
|
:param str symbol: unified symbol of the market the order was made in
|
@@ -1012,8 +1096,10 @@ class hitbtc(ccxt.async_support.hitbtc):
|
|
1012
1096
|
|
1013
1097
|
async def cancel_all_orders_ws(self, symbol: Str = None, params={}):
|
1014
1098
|
"""
|
1015
|
-
|
1016
|
-
|
1099
|
+
|
1100
|
+
https://api.hitbtc.com/#cancel-spot-orders
|
1101
|
+
https://api.hitbtc.com/#cancel-futures-order-3
|
1102
|
+
|
1017
1103
|
cancel all open orders
|
1018
1104
|
:param str symbol: unified market symbol, only orders in the market of self symbol are cancelled when symbol is not None
|
1019
1105
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
@@ -1038,9 +1124,11 @@ class hitbtc(ccxt.async_support.hitbtc):
|
|
1038
1124
|
|
1039
1125
|
async def fetch_open_orders_ws(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
|
1040
1126
|
"""
|
1041
|
-
|
1042
|
-
|
1043
|
-
|
1127
|
+
|
1128
|
+
https://api.hitbtc.com/#get-active-futures-orders-2
|
1129
|
+
https://api.hitbtc.com/#get-margin-orders
|
1130
|
+
https://api.hitbtc.com/#get-active-spot-orders
|
1131
|
+
|
1044
1132
|
fetch all unfilled currently open orders
|
1045
1133
|
:param str symbol: unified market symbol
|
1046
1134
|
:param int [since]: the earliest time in ms to fetch open orders for
|
@@ -1052,7 +1140,7 @@ class hitbtc(ccxt.async_support.hitbtc):
|
|
1052
1140
|
"""
|
1053
1141
|
await self.load_markets()
|
1054
1142
|
market = None
|
1055
|
-
request = {}
|
1143
|
+
request: dict = {}
|
1056
1144
|
if symbol is not None:
|
1057
1145
|
market = self.market(symbol)
|
1058
1146
|
request['symbol'] = market['id']
|
@@ -1123,7 +1211,7 @@ class hitbtc(ccxt.async_support.hitbtc):
|
|
1123
1211
|
# "id": 1700233093414
|
1124
1212
|
# }
|
1125
1213
|
#
|
1126
|
-
messageHash = self.
|
1214
|
+
messageHash = self.safe_string(message, 'id')
|
1127
1215
|
result = self.safe_value(message, 'result', {})
|
1128
1216
|
if isinstance(result, list):
|
1129
1217
|
parsedOrders = []
|
@@ -1137,16 +1225,22 @@ class hitbtc(ccxt.async_support.hitbtc):
|
|
1137
1225
|
return message
|
1138
1226
|
|
1139
1227
|
def handle_message(self, client: Client, message):
|
1140
|
-
self.handle_error(client, message)
|
1228
|
+
if self.handle_error(client, message):
|
1229
|
+
return
|
1141
1230
|
channel = self.safe_string_2(message, 'ch', 'method')
|
1142
1231
|
if channel is not None:
|
1143
1232
|
splitChannel = channel.split('/')
|
1144
1233
|
channel = self.safe_string(splitChannel, 0)
|
1145
|
-
|
1234
|
+
if channel == 'orderbook':
|
1235
|
+
channel2 = self.safe_string(splitChannel, 1)
|
1236
|
+
if channel2 is not None and channel2 == 'top':
|
1237
|
+
channel = 'orderbook/top'
|
1238
|
+
methods: dict = {
|
1146
1239
|
'candles': self.handle_ohlcv,
|
1147
1240
|
'ticker': self.handle_ticker,
|
1148
1241
|
'trades': self.handle_trades,
|
1149
1242
|
'orderbook': self.handle_order_book,
|
1243
|
+
'orderbook/top': self.handle_bid_ask,
|
1150
1244
|
'spot_order': self.handle_order,
|
1151
1245
|
'spot_orders': self.handle_order,
|
1152
1246
|
'margin_order': self.handle_order,
|
@@ -1206,11 +1300,22 @@ class hitbtc(ccxt.async_support.hitbtc):
|
|
1206
1300
|
#
|
1207
1301
|
error = self.safe_value(message, 'error')
|
1208
1302
|
if error is not None:
|
1209
|
-
|
1210
|
-
|
1211
|
-
|
1212
|
-
|
1213
|
-
|
1214
|
-
|
1215
|
-
|
1303
|
+
try:
|
1304
|
+
code = self.safe_value(error, 'code')
|
1305
|
+
errorMessage = self.safe_string(error, 'message')
|
1306
|
+
description = self.safe_string(error, 'description')
|
1307
|
+
feedback = self.id + ' ' + description
|
1308
|
+
self.throw_exactly_matched_exception(self.exceptions['exact'], code, feedback)
|
1309
|
+
self.throw_broadly_matched_exception(self.exceptions['broad'], errorMessage, feedback)
|
1310
|
+
raise ExchangeError(feedback) # unknown message
|
1311
|
+
except Exception as e:
|
1312
|
+
if isinstance(e, AuthenticationError):
|
1313
|
+
messageHash = 'authenticated'
|
1314
|
+
client.reject(e, messageHash)
|
1315
|
+
if messageHash in client.subscriptions:
|
1316
|
+
del client.subscriptions[messageHash]
|
1317
|
+
else:
|
1318
|
+
id = self.safe_string(message, 'id')
|
1319
|
+
client.reject(e, id)
|
1320
|
+
return True
|
1216
1321
|
return None
|