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/mexc.py
CHANGED
@@ -6,10 +6,12 @@
|
|
6
6
|
import ccxt.async_support
|
7
7
|
from ccxt.async_support.base.ws.cache import ArrayCache, ArrayCacheBySymbolById, ArrayCacheByTimestamp
|
8
8
|
import hashlib
|
9
|
-
from ccxt.base.types import Balances, Int, Order, OrderBook, Str, Ticker, Trade
|
9
|
+
from ccxt.base.types import Balances, Int, Order, OrderBook, Str, Strings, Ticker, Tickers, Trade
|
10
10
|
from ccxt.async_support.base.ws.client import Client
|
11
11
|
from typing import List
|
12
12
|
from ccxt.base.errors import AuthenticationError
|
13
|
+
from ccxt.base.errors import ArgumentsRequired
|
14
|
+
from ccxt.base.errors import NotSupported
|
13
15
|
|
14
16
|
|
15
17
|
class mexc(ccxt.async_support.mexc):
|
@@ -33,14 +35,16 @@ class mexc(ccxt.async_support.mexc):
|
|
33
35
|
'watchOrderBook': True,
|
34
36
|
'watchOrders': True,
|
35
37
|
'watchTicker': True,
|
36
|
-
'watchTickers':
|
38
|
+
'watchTickers': True,
|
39
|
+
'watchBidsAsks': True,
|
37
40
|
'watchTrades': True,
|
41
|
+
'watchTradesForSymbols': False,
|
38
42
|
},
|
39
43
|
'urls': {
|
40
44
|
'api': {
|
41
45
|
'ws': {
|
42
46
|
'spot': 'wss://wbs.mexc.com/ws',
|
43
|
-
'swap': 'wss://contract.mexc.com/
|
47
|
+
'swap': 'wss://contract.mexc.com/edge',
|
44
48
|
},
|
45
49
|
},
|
46
50
|
},
|
@@ -67,7 +71,7 @@ class mexc(ccxt.async_support.mexc):
|
|
67
71
|
},
|
68
72
|
'streaming': {
|
69
73
|
'ping': self.ping,
|
70
|
-
'keepAlive':
|
74
|
+
'keepAlive': 8000,
|
71
75
|
},
|
72
76
|
'exceptions': {
|
73
77
|
},
|
@@ -76,24 +80,68 @@ class mexc(ccxt.async_support.mexc):
|
|
76
80
|
async def watch_ticker(self, symbol: str, params={}) -> Ticker:
|
77
81
|
"""
|
78
82
|
watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
|
83
|
+
|
84
|
+
https://mexcdevelop.github.io/apidocs/spot_v3_en/#individual-symbol-book-ticker-streams
|
85
|
+
https://mexcdevelop.github.io/apidocs/contract_v1_en/#public-channels
|
86
|
+
https://mexcdevelop.github.io/apidocs/spot_v3_en/#miniticker
|
87
|
+
|
79
88
|
:param str symbol: unified symbol of the market to fetch the ticker for
|
80
89
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
90
|
+
:param boolean [params.miniTicker]: set to True for using the miniTicker endpoint
|
81
91
|
:returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
|
82
92
|
"""
|
83
93
|
await self.load_markets()
|
84
94
|
market = self.market(symbol)
|
85
95
|
messageHash = 'ticker:' + market['symbol']
|
86
96
|
if market['spot']:
|
87
|
-
|
97
|
+
miniTicker = False
|
98
|
+
miniTicker, params = self.handle_option_and_params(params, 'watchTicker', 'miniTicker')
|
99
|
+
channel = None
|
100
|
+
if miniTicker:
|
101
|
+
channel = 'spot@public.miniTicker.v3.api@' + market['id'] + '@UTC+8'
|
102
|
+
else:
|
103
|
+
channel = 'spot@public.bookTicker.v3.api@' + market['id']
|
88
104
|
return await self.watch_spot_public(channel, messageHash, params)
|
89
105
|
else:
|
90
106
|
channel = 'sub.ticker'
|
91
|
-
requestParams = {
|
107
|
+
requestParams: dict = {
|
92
108
|
'symbol': market['id'],
|
93
109
|
}
|
94
110
|
return await self.watch_swap_public(channel, messageHash, requestParams, params)
|
95
111
|
|
96
112
|
def handle_ticker(self, client: Client, message):
|
113
|
+
#
|
114
|
+
# swap
|
115
|
+
#
|
116
|
+
# {
|
117
|
+
# "symbol": "BTC_USDT",
|
118
|
+
# "data": {
|
119
|
+
# "symbol": "BTC_USDT",
|
120
|
+
# "lastPrice": 76376.2,
|
121
|
+
# "riseFallRate": -0.0006,
|
122
|
+
# "fairPrice": 76374.4,
|
123
|
+
# "indexPrice": 76385.8,
|
124
|
+
# "volume24": 962062810,
|
125
|
+
# "amount24": 7344207079.96768,
|
126
|
+
# "maxBidPrice": 84024.3,
|
127
|
+
# "minAskPrice": 68747.2,
|
128
|
+
# "lower24Price": 75620.2,
|
129
|
+
# "high24Price": 77210,
|
130
|
+
# "timestamp": 1731137509138,
|
131
|
+
# "bid1": 76376.2,
|
132
|
+
# "ask1": 76376.3,
|
133
|
+
# "holdVol": 95479623,
|
134
|
+
# "riseFallValue": -46.5,
|
135
|
+
# "fundingRate": 0.0001,
|
136
|
+
# "zone": "UTC+8",
|
137
|
+
# "riseFallRates": [-0.0006, 0.1008, 0.2262, 0.2628, 0.2439, 1.0564],
|
138
|
+
# "riseFallRatesOfTimezone": [0.0065, -0.0013, -0.0006]
|
139
|
+
# },
|
140
|
+
# "channel": "push.ticker",
|
141
|
+
# "ts": 1731137509138
|
142
|
+
# }
|
143
|
+
#
|
144
|
+
# spot
|
97
145
|
#
|
98
146
|
# {
|
99
147
|
# "c": "spot@public.bookTicker.v3.api@BTCUSDT",
|
@@ -107,7 +155,30 @@ class mexc(ccxt.async_support.mexc):
|
|
107
155
|
# "t": 1678643605721
|
108
156
|
# }
|
109
157
|
#
|
110
|
-
|
158
|
+
# spot miniTicker
|
159
|
+
#
|
160
|
+
# {
|
161
|
+
# "d": {
|
162
|
+
# "s": "BTCUSDT",
|
163
|
+
# "p": "76522",
|
164
|
+
# "r": "0.0012",
|
165
|
+
# "tr": "0.0012",
|
166
|
+
# "h": "77196.3",
|
167
|
+
# "l": "75630.77",
|
168
|
+
# "v": "584664223.92",
|
169
|
+
# "q": "7666.720258",
|
170
|
+
# "lastRT": "-1",
|
171
|
+
# "MT": "0",
|
172
|
+
# "NV": "--",
|
173
|
+
# "t": "1731135533126"
|
174
|
+
# },
|
175
|
+
# "c": "spot@public.miniTicker.v3.api@BTCUSDT@UTC+8",
|
176
|
+
# "t": 1731135533126,
|
177
|
+
# "s": "BTCUSDT"
|
178
|
+
# }
|
179
|
+
#
|
180
|
+
self.handle_bid_ask(client, message)
|
181
|
+
rawTicker = self.safe_dict_2(message, 'd', 'data')
|
111
182
|
marketId = self.safe_string_2(message, 's', 'symbol')
|
112
183
|
timestamp = self.safe_integer(message, 't')
|
113
184
|
market = self.safe_market(marketId)
|
@@ -123,24 +194,191 @@ class mexc(ccxt.async_support.mexc):
|
|
123
194
|
messageHash = 'ticker:' + symbol
|
124
195
|
client.resolve(ticker, messageHash)
|
125
196
|
|
126
|
-
def
|
197
|
+
async def watch_tickers(self, symbols: Strings = None, params={}) -> Tickers:
|
198
|
+
"""
|
199
|
+
watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for all markets of a specific list
|
200
|
+
|
201
|
+
https://mexcdevelop.github.io/apidocs/spot_v3_en/#individual-symbol-book-ticker-streams
|
202
|
+
https://mexcdevelop.github.io/apidocs/contract_v1_en/#public-channels
|
203
|
+
https://mexcdevelop.github.io/apidocs/spot_v3_en/#minitickers
|
204
|
+
|
205
|
+
:param str[] symbols: unified symbol of the market to fetch the ticker for
|
206
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
207
|
+
:param boolean [params.miniTicker]: set to True for using the miniTicker endpoint
|
208
|
+
:returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
|
209
|
+
"""
|
210
|
+
await self.load_markets()
|
211
|
+
symbols = self.market_symbols(symbols, None)
|
212
|
+
messageHashes = []
|
213
|
+
firstSymbol = self.safe_string(symbols, 0)
|
214
|
+
market = None
|
215
|
+
if firstSymbol is not None:
|
216
|
+
market = self.market(firstSymbol)
|
217
|
+
type = None
|
218
|
+
type, params = self.handle_market_type_and_params('watchTickers', market, params)
|
219
|
+
isSpot = (type == 'spot')
|
220
|
+
url = self.urls['api']['ws']['spot'] if (isSpot) else self.urls['api']['ws']['swap']
|
221
|
+
request: dict = {}
|
222
|
+
if isSpot:
|
223
|
+
miniTicker = False
|
224
|
+
miniTicker, params = self.handle_option_and_params(params, 'watchTickers', 'miniTicker')
|
225
|
+
topics = []
|
226
|
+
if not miniTicker:
|
227
|
+
if symbols is None:
|
228
|
+
raise ArgumentsRequired(self.id + 'watchTickers required symbols argument for the bookTicker channel')
|
229
|
+
marketIds = self.market_ids(symbols)
|
230
|
+
for i in range(0, len(marketIds)):
|
231
|
+
marketId = marketIds[i]
|
232
|
+
messageHashes.append('ticker:' + symbols[i])
|
233
|
+
channel = 'spot@public.bookTicker.v3.api@' + marketId
|
234
|
+
topics.append(channel)
|
235
|
+
else:
|
236
|
+
topics.append('spot@public.miniTickers.v3.api@UTC+8')
|
237
|
+
if symbols is None:
|
238
|
+
messageHashes.append('spot:ticker')
|
239
|
+
else:
|
240
|
+
for i in range(0, len(symbols)):
|
241
|
+
messageHashes.append('ticker:' + symbols[i])
|
242
|
+
request['method'] = 'SUBSCRIPTION'
|
243
|
+
request['params'] = topics
|
244
|
+
else:
|
245
|
+
request['method'] = 'sub.tickers'
|
246
|
+
request['params'] = {}
|
247
|
+
messageHashes.append('ticker')
|
248
|
+
ticker = await self.watch_multiple(url, messageHashes, self.extend(request, params), messageHashes)
|
249
|
+
if isSpot and self.newUpdates:
|
250
|
+
result: dict = {}
|
251
|
+
result[ticker['symbol']] = ticker
|
252
|
+
return result
|
253
|
+
return self.filter_by_array(self.tickers, 'symbol', symbols)
|
254
|
+
|
255
|
+
def handle_tickers(self, client: Client, message):
|
256
|
+
#
|
257
|
+
# swap
|
258
|
+
#
|
259
|
+
# {
|
260
|
+
# "channel": "push.tickers",
|
261
|
+
# "data": [
|
262
|
+
# {
|
263
|
+
# "symbol": "ETH_USDT",
|
264
|
+
# "lastPrice": 2324.5,
|
265
|
+
# "riseFallRate": 0.0356,
|
266
|
+
# "fairPrice": 2324.32,
|
267
|
+
# "indexPrice": 2325.44,
|
268
|
+
# "volume24": 25868309,
|
269
|
+
# "amount24": 591752573.9792,
|
270
|
+
# "maxBidPrice": 2557.98,
|
271
|
+
# "minAskPrice": 2092.89,
|
272
|
+
# "lower24Price": 2239.39,
|
273
|
+
# "high24Price": 2332.59,
|
274
|
+
# "timestamp": 1725872514111
|
275
|
+
# }
|
276
|
+
# ],
|
277
|
+
# "ts": 1725872514111
|
278
|
+
# }
|
127
279
|
#
|
128
280
|
# spot
|
281
|
+
#
|
129
282
|
# {
|
130
|
-
# "
|
131
|
-
# "
|
132
|
-
#
|
133
|
-
#
|
283
|
+
# "c": "spot@public.bookTicker.v3.api@BTCUSDT",
|
284
|
+
# "d": {
|
285
|
+
# "A": "4.70432",
|
286
|
+
# "B": "6.714863",
|
287
|
+
# "a": "20744.54",
|
288
|
+
# "b": "20744.17"
|
289
|
+
# },
|
290
|
+
# "s": "BTCUSDT",
|
291
|
+
# "t": 1678643605721
|
134
292
|
# }
|
135
293
|
#
|
294
|
+
# spot miniTicker
|
295
|
+
#
|
296
|
+
# {
|
297
|
+
# "d": {
|
298
|
+
# "s": "BTCUSDT",
|
299
|
+
# "p": "76522",
|
300
|
+
# "r": "0.0012",
|
301
|
+
# "tr": "0.0012",
|
302
|
+
# "h": "77196.3",
|
303
|
+
# "l": "75630.77",
|
304
|
+
# "v": "584664223.92",
|
305
|
+
# "q": "7666.720258",
|
306
|
+
# "lastRT": "-1",
|
307
|
+
# "MT": "0",
|
308
|
+
# "NV": "--",
|
309
|
+
# "t": "1731135533126"
|
310
|
+
# },
|
311
|
+
# "c": "spot@public.miniTicker.v3.api@BTCUSDT@UTC+8",
|
312
|
+
# "t": 1731135533126,
|
313
|
+
# "s": "BTCUSDT"
|
314
|
+
# }
|
315
|
+
#
|
316
|
+
data = self.safe_list_2(message, 'data', 'd')
|
317
|
+
channel = self.safe_string(message, 'c', '')
|
318
|
+
marketId = self.safe_string(message, 's')
|
319
|
+
market = self.safe_market(marketId)
|
320
|
+
channelStartsWithSpot = channel.startswith('spot')
|
321
|
+
marketIdIsUndefined = marketId is None
|
322
|
+
isSpot = channelStartsWithSpot if marketIdIsUndefined else market['spot']
|
323
|
+
spotPrefix = 'spot:'
|
324
|
+
messageHashPrefix = spotPrefix if isSpot else ''
|
325
|
+
topic = messageHashPrefix + 'ticker'
|
326
|
+
result = []
|
327
|
+
for i in range(0, len(data)):
|
328
|
+
entry = data[i]
|
329
|
+
ticker = None
|
330
|
+
if isSpot:
|
331
|
+
ticker = self.parse_ws_ticker(entry, market)
|
332
|
+
else:
|
333
|
+
ticker = self.parse_ticker(entry)
|
334
|
+
symbol = ticker['symbol']
|
335
|
+
self.tickers[symbol] = ticker
|
336
|
+
result.append(ticker)
|
337
|
+
messageHash = 'ticker:' + symbol
|
338
|
+
client.resolve(ticker, messageHash)
|
339
|
+
client.resolve(result, topic)
|
340
|
+
|
341
|
+
def parse_ws_ticker(self, ticker, market=None):
|
342
|
+
#
|
343
|
+
# spot
|
344
|
+
#
|
345
|
+
# {
|
346
|
+
# "A": "4.70432",
|
347
|
+
# "B": "6.714863",
|
348
|
+
# "a": "20744.54",
|
349
|
+
# "b": "20744.17"
|
350
|
+
# }
|
351
|
+
#
|
352
|
+
# spot miniTicker
|
353
|
+
#
|
354
|
+
# {
|
355
|
+
# "s": "BTCUSDT",
|
356
|
+
# "p": "76522",
|
357
|
+
# "r": "0.0012",
|
358
|
+
# "tr": "0.0012",
|
359
|
+
# "h": "77196.3",
|
360
|
+
# "l": "75630.77",
|
361
|
+
# "v": "584664223.92",
|
362
|
+
# "q": "7666.720258",
|
363
|
+
# "lastRT": "-1",
|
364
|
+
# "MT": "0",
|
365
|
+
# "NV": "--",
|
366
|
+
# "t": "1731135533126"
|
367
|
+
# }
|
368
|
+
#
|
369
|
+
marketId = self.safe_string(ticker, 's')
|
370
|
+
timestamp = self.safe_integer(ticker, 't')
|
371
|
+
price = self.safe_string(ticker, 'p')
|
136
372
|
return self.safe_ticker({
|
137
|
-
'
|
138
|
-
'
|
139
|
-
'
|
373
|
+
'info': ticker,
|
374
|
+
'symbol': self.safe_symbol(marketId, market),
|
375
|
+
'timestamp': timestamp,
|
376
|
+
'datetime': self.iso8601(timestamp),
|
140
377
|
'open': None,
|
141
|
-
'high':
|
142
|
-
'low':
|
143
|
-
'close':
|
378
|
+
'high': self.safe_number(ticker, 'h'),
|
379
|
+
'low': self.safe_number(ticker, 'l'),
|
380
|
+
'close': price,
|
381
|
+
'last': price,
|
144
382
|
'bid': self.safe_number(ticker, 'b'),
|
145
383
|
'bidVolume': self.safe_number(ticker, 'B'),
|
146
384
|
'ask': self.safe_number(ticker, 'a'),
|
@@ -148,16 +386,91 @@ class mexc(ccxt.async_support.mexc):
|
|
148
386
|
'vwap': None,
|
149
387
|
'previousClose': None,
|
150
388
|
'change': None,
|
151
|
-
'percentage':
|
389
|
+
'percentage': self.safe_number(ticker, 'tr'),
|
152
390
|
'average': None,
|
153
|
-
'baseVolume':
|
154
|
-
'quoteVolume':
|
391
|
+
'baseVolume': self.safe_number(ticker, 'v'),
|
392
|
+
'quoteVolume': self.safe_number(ticker, 'q'),
|
393
|
+
}, market)
|
394
|
+
|
395
|
+
async def watch_bids_asks(self, symbols: Strings = None, params={}) -> Tickers:
|
396
|
+
"""
|
397
|
+
|
398
|
+
https://mexcdevelop.github.io/apidocs/spot_v3_en/#individual-symbol-book-ticker-streams
|
399
|
+
|
400
|
+
watches best bid & ask for symbols
|
401
|
+
:param str[] symbols: unified symbol of the market to fetch the ticker for
|
402
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
403
|
+
:returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
|
404
|
+
"""
|
405
|
+
await self.load_markets()
|
406
|
+
symbols = self.market_symbols(symbols, None, True, False, True)
|
407
|
+
marketType = None
|
408
|
+
if symbols is None:
|
409
|
+
raise ArgumentsRequired(self.id + 'watchBidsAsks required symbols argument')
|
410
|
+
markets = self.markets_for_symbols(symbols)
|
411
|
+
marketType, params = self.handle_market_type_and_params('watchBidsAsks', markets[0], params)
|
412
|
+
isSpot = marketType == 'spot'
|
413
|
+
if not isSpot:
|
414
|
+
raise NotSupported(self.id + 'watchBidsAsks only support spot market')
|
415
|
+
messageHashes = []
|
416
|
+
topics = []
|
417
|
+
for i in range(0, len(symbols)):
|
418
|
+
if isSpot:
|
419
|
+
market = self.market(symbols[i])
|
420
|
+
topics.append('spot@public.bookTicker.v3.api@' + market['id'])
|
421
|
+
messageHashes.append('bidask:' + symbols[i])
|
422
|
+
url = self.urls['api']['ws']['spot']
|
423
|
+
request: dict = {
|
424
|
+
'method': 'SUBSCRIPTION',
|
425
|
+
'params': topics,
|
426
|
+
}
|
427
|
+
ticker = await self.watch_multiple(url, messageHashes, self.extend(request, params), messageHashes)
|
428
|
+
if self.newUpdates:
|
429
|
+
tickers: dict = {}
|
430
|
+
tickers[ticker['symbol']] = ticker
|
431
|
+
return tickers
|
432
|
+
return self.filter_by_array(self.bidsasks, 'symbol', symbols)
|
433
|
+
|
434
|
+
def handle_bid_ask(self, client: Client, message):
|
435
|
+
#
|
436
|
+
# {
|
437
|
+
# "c": "spot@public.bookTicker.v3.api@BTCUSDT",
|
438
|
+
# "d": {
|
439
|
+
# "A": "4.70432",
|
440
|
+
# "B": "6.714863",
|
441
|
+
# "a": "20744.54",
|
442
|
+
# "b": "20744.17"
|
443
|
+
# },
|
444
|
+
# "s": "BTCUSDT",
|
445
|
+
# "t": 1678643605721
|
446
|
+
# }
|
447
|
+
#
|
448
|
+
parsedTicker = self.parse_ws_bid_ask(message)
|
449
|
+
symbol = parsedTicker['symbol']
|
450
|
+
self.bidsasks[symbol] = parsedTicker
|
451
|
+
messageHash = 'bidask:' + symbol
|
452
|
+
client.resolve(parsedTicker, messageHash)
|
453
|
+
|
454
|
+
def parse_ws_bid_ask(self, ticker, market=None):
|
455
|
+
data = self.safe_dict(ticker, 'd')
|
456
|
+
marketId = self.safe_string(ticker, 's')
|
457
|
+
market = self.safe_market(marketId, market)
|
458
|
+
symbol = self.safe_string(market, 'symbol')
|
459
|
+
timestamp = self.safe_integer(ticker, 't')
|
460
|
+
return self.safe_ticker({
|
461
|
+
'symbol': symbol,
|
462
|
+
'timestamp': timestamp,
|
463
|
+
'datetime': self.iso8601(timestamp),
|
464
|
+
'ask': self.safe_number(data, 'a'),
|
465
|
+
'askVolume': self.safe_number(data, 'A'),
|
466
|
+
'bid': self.safe_number(data, 'b'),
|
467
|
+
'bidVolume': self.safe_number(data, 'B'),
|
155
468
|
'info': ticker,
|
156
469
|
}, market)
|
157
470
|
|
158
471
|
async def watch_spot_public(self, channel, messageHash, params={}):
|
159
472
|
url = self.urls['api']['ws']['spot']
|
160
|
-
request = {
|
473
|
+
request: dict = {
|
161
474
|
'method': 'SUBSCRIPTION',
|
162
475
|
'params': [channel],
|
163
476
|
}
|
@@ -167,7 +480,7 @@ class mexc(ccxt.async_support.mexc):
|
|
167
480
|
self.check_required_credentials()
|
168
481
|
listenKey = await self.authenticate(channel)
|
169
482
|
url = self.urls['api']['ws']['spot'] + '?listenKey=' + listenKey
|
170
|
-
request = {
|
483
|
+
request: dict = {
|
171
484
|
'method': 'SUBSCRIPTION',
|
172
485
|
'params': [channel],
|
173
486
|
}
|
@@ -175,7 +488,7 @@ class mexc(ccxt.async_support.mexc):
|
|
175
488
|
|
176
489
|
async def watch_swap_public(self, channel, messageHash, requestParams, params={}):
|
177
490
|
url = self.urls['api']['ws']['swap']
|
178
|
-
request = {
|
491
|
+
request: dict = {
|
179
492
|
'method': channel,
|
180
493
|
'param': requestParams,
|
181
494
|
}
|
@@ -189,7 +502,7 @@ class mexc(ccxt.async_support.mexc):
|
|
189
502
|
timestamp = str(self.milliseconds())
|
190
503
|
payload = self.apiKey + timestamp
|
191
504
|
signature = self.hmac(self.encode(payload), self.encode(self.secret), hashlib.sha256)
|
192
|
-
request = {
|
505
|
+
request: dict = {
|
193
506
|
'method': channel,
|
194
507
|
'param': {
|
195
508
|
'apiKey': self.apiKey,
|
@@ -202,7 +515,9 @@ class mexc(ccxt.async_support.mexc):
|
|
202
515
|
|
203
516
|
async def watch_ohlcv(self, symbol: str, timeframe='1m', since: Int = None, limit: Int = None, params={}) -> List[list]:
|
204
517
|
"""
|
205
|
-
|
518
|
+
|
519
|
+
https://mexcdevelop.github.io/apidocs/spot_v3_en/#kline-streams
|
520
|
+
|
206
521
|
watches historical candlestick data containing the open, high, low, and close price, and the volume of a market
|
207
522
|
:param str symbol: unified symbol of the market to fetch OHLCV data for
|
208
523
|
:param str timeframe: the length of time each candle represents
|
@@ -223,7 +538,7 @@ class mexc(ccxt.async_support.mexc):
|
|
223
538
|
ohlcv = await self.watch_spot_public(channel, messageHash, params)
|
224
539
|
else:
|
225
540
|
channel = 'sub.kline'
|
226
|
-
requestParams = {
|
541
|
+
requestParams: dict = {
|
227
542
|
'symbol': market['id'],
|
228
543
|
'interval': timeframeId,
|
229
544
|
}
|
@@ -342,7 +657,10 @@ class mexc(ccxt.async_support.mexc):
|
|
342
657
|
|
343
658
|
async def watch_order_book(self, symbol: str, limit: Int = None, params={}) -> OrderBook:
|
344
659
|
"""
|
345
|
-
|
660
|
+
|
661
|
+
https://mexcdevelop.github.io/apidocs/spot_v3_en/#diff-depth-stream
|
662
|
+
https://mexcdevelop.github.io/apidocs/contract_v1_en/#public-channels
|
663
|
+
|
346
664
|
watches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
|
347
665
|
:param str symbol: unified symbol of the market to fetch the order book for
|
348
666
|
:param int [limit]: the maximum amount of order book entries to return
|
@@ -359,7 +677,7 @@ class mexc(ccxt.async_support.mexc):
|
|
359
677
|
orderbook = await self.watch_spot_public(channel, messageHash, params)
|
360
678
|
else:
|
361
679
|
channel = 'sub.depth'
|
362
|
-
requestParams = {
|
680
|
+
requestParams: dict = {
|
363
681
|
'symbol': market['id'],
|
364
682
|
}
|
365
683
|
orderbook = await self.watch_swap_public(channel, messageHash, requestParams, params)
|
@@ -487,8 +805,8 @@ class mexc(ccxt.async_support.mexc):
|
|
487
805
|
# so, we just skip old updates
|
488
806
|
return
|
489
807
|
orderbook['nonce'] = deltaNonce
|
490
|
-
asks = self.
|
491
|
-
bids = self.
|
808
|
+
asks = self.safe_list(delta, 'asks', [])
|
809
|
+
bids = self.safe_list(delta, 'bids', [])
|
492
810
|
asksOrderSide = orderbook['asks']
|
493
811
|
bidsOrderSide = orderbook['bids']
|
494
812
|
self.handle_bookside_delta(asksOrderSide, asks)
|
@@ -496,7 +814,10 @@ class mexc(ccxt.async_support.mexc):
|
|
496
814
|
|
497
815
|
async def watch_trades(self, symbol: str, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
|
498
816
|
"""
|
499
|
-
|
817
|
+
|
818
|
+
https://mexcdevelop.github.io/apidocs/spot_v3_en/#trade-streams
|
819
|
+
https://mexcdevelop.github.io/apidocs/contract_v1_en/#public-channels
|
820
|
+
|
500
821
|
get the list of most recent trades for a particular symbol
|
501
822
|
:param str symbol: unified symbol of the market to fetch trades for
|
502
823
|
:param int [since]: timestamp in ms of the earliest trade to fetch
|
@@ -514,7 +835,7 @@ class mexc(ccxt.async_support.mexc):
|
|
514
835
|
trades = await self.watch_spot_public(channel, messageHash, params)
|
515
836
|
else:
|
516
837
|
channel = 'sub.deal'
|
517
|
-
requestParams = {
|
838
|
+
requestParams: dict = {
|
518
839
|
'symbol': market['id'],
|
519
840
|
}
|
520
841
|
trades = await self.watch_swap_public(channel, messageHash, requestParams, params)
|
@@ -576,13 +897,16 @@ class mexc(ccxt.async_support.mexc):
|
|
576
897
|
|
577
898
|
async def watch_my_trades(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
|
578
899
|
"""
|
579
|
-
|
900
|
+
|
901
|
+
https://mexcdevelop.github.io/apidocs/spot_v3_en/#spot-account-deals
|
902
|
+
https://mexcdevelop.github.io/apidocs/contract_v1_en/#private-channels
|
903
|
+
|
580
904
|
watches information on multiple trades made by the user
|
581
905
|
:param str symbol: unified market symbol of the market trades were made in
|
582
906
|
:param int [since]: the earliest time in ms to fetch trades for
|
583
907
|
:param int [limit]: the maximum number of trade structures to retrieve
|
584
908
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
585
|
-
:returns dict[]: a list of
|
909
|
+
:returns dict[]: a list of `trade structures <https://docs.ccxt.com/#/?id=trade-structure>`
|
586
910
|
"""
|
587
911
|
await self.load_markets()
|
588
912
|
messageHash = 'myTrades'
|
@@ -665,6 +989,21 @@ class mexc(ccxt.async_support.mexc):
|
|
665
989
|
# "v": "5"
|
666
990
|
# }
|
667
991
|
#
|
992
|
+
#
|
993
|
+
# d: {
|
994
|
+
# p: '1.0005',
|
995
|
+
# v: '5.71',
|
996
|
+
# a: '5.712855',
|
997
|
+
# S: 1,
|
998
|
+
# T: 1714325698237,
|
999
|
+
# t: 'edafcd9fdc2f426e82443d114691f724',
|
1000
|
+
# c: '',
|
1001
|
+
# i: 'C02__413321238354677760043',
|
1002
|
+
# m: 0,
|
1003
|
+
# st: 0,
|
1004
|
+
# n: '0.005712855',
|
1005
|
+
# N: 'USDT'
|
1006
|
+
# }
|
668
1007
|
timestamp = self.safe_integer(trade, 'T')
|
669
1008
|
tradeId = self.safe_string(trade, 't')
|
670
1009
|
if timestamp is None:
|
@@ -675,6 +1014,8 @@ class mexc(ccxt.async_support.mexc):
|
|
675
1014
|
rawSide = self.safe_string(trade, 'S')
|
676
1015
|
side = 'buy' if (rawSide == '1') else 'sell'
|
677
1016
|
isMaker = self.safe_integer(trade, 'm')
|
1017
|
+
feeAmount = self.safe_number(trade, 'n')
|
1018
|
+
feeCurrencyId = self.safe_string(trade, 'N')
|
678
1019
|
return self.safe_trade({
|
679
1020
|
'info': trade,
|
680
1021
|
'id': tradeId,
|
@@ -688,13 +1029,18 @@ class mexc(ccxt.async_support.mexc):
|
|
688
1029
|
'price': priceString,
|
689
1030
|
'amount': amountString,
|
690
1031
|
'cost': None,
|
691
|
-
'fee':
|
1032
|
+
'fee': {
|
1033
|
+
'cost': feeAmount,
|
1034
|
+
'currency': self.safe_currency_code(feeCurrencyId),
|
1035
|
+
},
|
692
1036
|
}, market)
|
693
1037
|
|
694
1038
|
async def watch_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
|
695
1039
|
"""
|
696
|
-
|
697
|
-
|
1040
|
+
|
1041
|
+
https://mexcdevelop.github.io/apidocs/spot_v3_en/#spot-account-orders
|
1042
|
+
https://mexcdevelop.github.io/apidocs/spot_v3_en/#margin-account-orders
|
1043
|
+
|
698
1044
|
watches information on multiple orders made by the user
|
699
1045
|
:param str symbol: unified market symbol of the market orders were made in
|
700
1046
|
:param int [since]: the earliest time in ms to fetch orders for
|
@@ -897,13 +1243,12 @@ class mexc(ccxt.async_support.mexc):
|
|
897
1243
|
}, market)
|
898
1244
|
|
899
1245
|
def parse_ws_order_status(self, status, market=None):
|
900
|
-
statuses = {
|
1246
|
+
statuses: dict = {
|
901
1247
|
'1': 'open', # new order
|
902
1248
|
'2': 'closed', # filled
|
903
1249
|
'3': 'open', # partially filled
|
904
1250
|
'4': 'canceled', # canceled
|
905
|
-
'5': '
|
906
|
-
'6': 'closed', # partially filled then canceled
|
1251
|
+
'5': 'closed', # partially filled then canceled
|
907
1252
|
'NEW': 'open',
|
908
1253
|
'CANCELED': 'canceled',
|
909
1254
|
'EXECUTED': 'closed',
|
@@ -912,7 +1257,7 @@ class mexc(ccxt.async_support.mexc):
|
|
912
1257
|
return self.safe_string(statuses, status, status)
|
913
1258
|
|
914
1259
|
def parse_ws_order_type(self, type):
|
915
|
-
types = {
|
1260
|
+
types: dict = {
|
916
1261
|
'1': 'limit', # LIMIT_ORDER
|
917
1262
|
'2': None, # POST_ONLY
|
918
1263
|
'3': None, # IMMEDIATE_OR_CANCEL
|
@@ -923,7 +1268,7 @@ class mexc(ccxt.async_support.mexc):
|
|
923
1268
|
return self.safe_string(types, type)
|
924
1269
|
|
925
1270
|
def parse_ws_time_in_force(self, timeInForce):
|
926
|
-
timeInForceIds = {
|
1271
|
+
timeInForceIds: dict = {
|
927
1272
|
'1': 'GTC', # LIMIT_ORDER
|
928
1273
|
'2': 'PO', # POST_ONLY
|
929
1274
|
'3': 'IOC', # IMMEDIATE_OR_CANCEL
|
@@ -935,7 +1280,9 @@ class mexc(ccxt.async_support.mexc):
|
|
935
1280
|
|
936
1281
|
async def watch_balance(self, params={}) -> Balances:
|
937
1282
|
"""
|
938
|
-
|
1283
|
+
|
1284
|
+
https://mexcdevelop.github.io/apidocs/spot_v3_en/#spot-account-upadte
|
1285
|
+
|
939
1286
|
watch balance and get the amount of funds available for trading or funds locked in orders
|
940
1287
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
941
1288
|
:returns dict: a `balance structure <https://docs.ccxt.com/#/?id=balance-structure>`
|
@@ -1022,7 +1369,7 @@ class mexc(ccxt.async_support.mexc):
|
|
1022
1369
|
async def keep_alive_listen_key(self, listenKey, params={}):
|
1023
1370
|
if listenKey is None:
|
1024
1371
|
return
|
1025
|
-
request = {
|
1372
|
+
request: dict = {
|
1026
1373
|
'listenKey': listenKey,
|
1027
1374
|
}
|
1028
1375
|
try:
|
@@ -1047,14 +1394,14 @@ class mexc(ccxt.async_support.mexc):
|
|
1047
1394
|
# "code": 0,
|
1048
1395
|
# "msg": "spot@public.increase.depth.v3.api@BTCUSDT"
|
1049
1396
|
# }
|
1050
|
-
#
|
1051
|
-
msg = self.safe_string(message, 'msg')
|
1397
|
+
# Set the default to an empty string if the message is empty during the test.
|
1398
|
+
msg = self.safe_string(message, 'msg', '')
|
1052
1399
|
if msg == 'PONG':
|
1053
1400
|
self.handle_pong(client, message)
|
1054
1401
|
elif msg.find('@') > -1:
|
1055
1402
|
parts = msg.split('@')
|
1056
1403
|
channel = self.safe_string(parts, 1)
|
1057
|
-
methods = {
|
1404
|
+
methods: dict = {
|
1058
1405
|
'public.increase.depth.v3.api': self.handle_order_book_subscription,
|
1059
1406
|
}
|
1060
1407
|
method = self.safe_value(methods, channel)
|
@@ -1077,13 +1424,16 @@ class mexc(ccxt.async_support.mexc):
|
|
1077
1424
|
else:
|
1078
1425
|
parts = c.split('@')
|
1079
1426
|
channel = self.safe_string(parts, 1)
|
1080
|
-
methods = {
|
1427
|
+
methods: dict = {
|
1081
1428
|
'public.deals.v3.api': self.handle_trades,
|
1082
1429
|
'push.deal': self.handle_trades,
|
1083
1430
|
'public.kline.v3.api': self.handle_ohlcv,
|
1084
1431
|
'push.kline': self.handle_ohlcv,
|
1085
1432
|
'public.bookTicker.v3.api': self.handle_ticker,
|
1433
|
+
'public.miniTicker.v3.api': self.handle_ticker,
|
1434
|
+
'public.miniTickers.v3.api': self.handle_tickers,
|
1086
1435
|
'push.ticker': self.handle_ticker,
|
1436
|
+
'push.tickers': self.handle_tickers,
|
1087
1437
|
'public.increase.depth.v3.api': self.handle_order_book,
|
1088
1438
|
'push.depth': self.handle_order_book,
|
1089
1439
|
'private.orders.v3.api': self.handle_order,
|
@@ -1098,5 +1448,5 @@ class mexc(ccxt.async_support.mexc):
|
|
1098
1448
|
method = methods[channel]
|
1099
1449
|
method(client, message)
|
1100
1450
|
|
1101
|
-
def ping(self, client):
|
1451
|
+
def ping(self, client: Client):
|
1102
1452
|
return {'method': 'ping'}
|