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/krakenfutures.py
CHANGED
@@ -10,8 +10,8 @@ from ccxt.base.types import Balances, Int, Order, OrderBook, Position, Str, Stri
|
|
10
10
|
from ccxt.async_support.base.ws.client import Client
|
11
11
|
from typing import List
|
12
12
|
from ccxt.base.errors import ExchangeError
|
13
|
-
from ccxt.base.errors import ArgumentsRequired
|
14
13
|
from ccxt.base.errors import AuthenticationError
|
14
|
+
from ccxt.base.errors import ArgumentsRequired
|
15
15
|
from ccxt.base.precise import Precise
|
16
16
|
|
17
17
|
|
@@ -32,9 +32,12 @@ class krakenfutures(ccxt.async_support.krakenfutures):
|
|
32
32
|
'fetchTradesWs': False,
|
33
33
|
'watchOHLCV': False,
|
34
34
|
'watchOrderBook': True,
|
35
|
+
'watchOrderBookForSymbols': True,
|
35
36
|
'watchTicker': True,
|
36
37
|
'watchTickers': True,
|
38
|
+
'watchBidsAsks': True,
|
37
39
|
'watchTrades': True,
|
40
|
+
'watchTradesForSymbols': True,
|
38
41
|
'watchBalance': True,
|
39
42
|
# 'watchStatus': True, # https://docs.futures.kraken.com/#websocket-api-public-feeds-heartbeat
|
40
43
|
'watchOrders': True,
|
@@ -55,12 +58,6 @@ class krakenfutures(ccxt.async_support.krakenfutures):
|
|
55
58
|
'OHLCVLimit': 1000,
|
56
59
|
'connectionLimit': 100, # https://docs.futures.kraken.com/#websocket-api-websocket-api-introduction-subscriptions-limits
|
57
60
|
'requestLimit': 100, # per second
|
58
|
-
'watchTicker': {
|
59
|
-
'method': 'ticker', # or ticker_lite
|
60
|
-
},
|
61
|
-
'watchTickers': {
|
62
|
-
'method': 'ticker', # or ticker_lite
|
63
|
-
},
|
64
61
|
'fetchBalance': {
|
65
62
|
'type': None,
|
66
63
|
},
|
@@ -72,9 +69,11 @@ class krakenfutures(ccxt.async_support.krakenfutures):
|
|
72
69
|
|
73
70
|
async def authenticate(self, params={}):
|
74
71
|
"""
|
75
|
-
|
72
|
+
@ignore
|
76
73
|
authenticates the user to access private web socket channels
|
77
|
-
|
74
|
+
|
75
|
+
https://docs.futures.kraken.com/#websocket-api-public-feeds-challenge
|
76
|
+
|
78
77
|
:returns dict: response from exchange
|
79
78
|
"""
|
80
79
|
self.check_required_credentials()
|
@@ -85,20 +84,34 @@ class krakenfutures(ccxt.async_support.krakenfutures):
|
|
85
84
|
url = self.urls['api']['ws']
|
86
85
|
messageHash = 'challenge'
|
87
86
|
client = self.client(url)
|
88
|
-
future =
|
89
|
-
|
90
|
-
|
87
|
+
future = client.future(messageHash)
|
88
|
+
authenticated = self.safe_value(client.subscriptions, messageHash)
|
89
|
+
if authenticated is None:
|
90
|
+
request: dict = {
|
91
91
|
'event': 'challenge',
|
92
92
|
'api_key': self.apiKey,
|
93
93
|
}
|
94
94
|
message = self.extend(request, params)
|
95
|
-
|
96
|
-
|
97
|
-
|
95
|
+
self.watch(url, messageHash, message, messageHash)
|
96
|
+
return await future
|
97
|
+
|
98
|
+
async def watch_order_book_for_symbols(self, symbols: List[str], limit: Int = None, params={}) -> OrderBook:
|
99
|
+
"""
|
100
|
+
watches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
|
101
|
+
|
102
|
+
https://docs.futures.kraken.com/#websocket-api-public-feeds-challenge
|
103
|
+
|
104
|
+
:param str[] symbols: unified array of symbols
|
105
|
+
:param int [limit]: the maximum amount of order book entries to return
|
106
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
107
|
+
:returns dict: A dictionary of `order book structures <https://docs.ccxt.com/#/?id=order-book-structure>` indexed by market symbols
|
108
|
+
"""
|
109
|
+
orderbook = await self.watch_multi_helper('orderbook', 'book', symbols, {'limit': limit}, params)
|
110
|
+
return orderbook.limit()
|
98
111
|
|
99
112
|
async def subscribe_public(self, name: str, symbols: List[str], params={}):
|
100
113
|
"""
|
101
|
-
|
114
|
+
@ignore
|
102
115
|
Connects to a websocket channel
|
103
116
|
:param str name: name of the channel
|
104
117
|
:param str[] symbols: CCXT market symbols
|
@@ -107,7 +120,7 @@ class krakenfutures(ccxt.async_support.krakenfutures):
|
|
107
120
|
"""
|
108
121
|
await self.load_markets()
|
109
122
|
url = self.urls['api']['ws']
|
110
|
-
subscribe = {
|
123
|
+
subscribe: dict = {
|
111
124
|
'event': 'subscribe',
|
112
125
|
'feed': name,
|
113
126
|
}
|
@@ -128,17 +141,17 @@ class krakenfutures(ccxt.async_support.krakenfutures):
|
|
128
141
|
|
129
142
|
async def subscribe_private(self, name: str, messageHash: str, params={}):
|
130
143
|
"""
|
131
|
-
|
144
|
+
@ignore
|
132
145
|
Connects to a websocket channel
|
133
146
|
:param str name: name of the channel
|
134
|
-
:param str
|
147
|
+
:param str messageHash: unique identifier for the message
|
135
148
|
:param dict [params]: extra parameters specific to the krakenfutures api
|
136
149
|
:returns dict: data from the websocket stream
|
137
150
|
"""
|
138
151
|
await self.load_markets()
|
139
152
|
await self.authenticate()
|
140
153
|
url = self.urls['api']['ws']
|
141
|
-
subscribe = {
|
154
|
+
subscribe: dict = {
|
142
155
|
'event': 'subscribe',
|
143
156
|
'feed': name,
|
144
157
|
'api_key': self.apiKey,
|
@@ -151,70 +164,109 @@ class krakenfutures(ccxt.async_support.krakenfutures):
|
|
151
164
|
async def watch_ticker(self, symbol: str, params={}) -> Ticker:
|
152
165
|
"""
|
153
166
|
watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
|
154
|
-
|
167
|
+
|
168
|
+
https://docs.futures.kraken.com/#websocket-api-public-feeds-ticker
|
169
|
+
|
155
170
|
:param str symbol: unified symbol of the market to fetch the ticker for
|
156
171
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
157
172
|
:returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
|
158
173
|
"""
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
return await self.subscribe_public(name, [symbol], params)
|
174
|
+
await self.load_markets()
|
175
|
+
symbol = self.symbol(symbol)
|
176
|
+
tickers = await self.watch_tickers([symbol], params)
|
177
|
+
return tickers[symbol]
|
164
178
|
|
165
179
|
async def watch_tickers(self, symbols: Strings = None, params={}) -> Tickers:
|
166
180
|
"""
|
167
181
|
watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
|
168
|
-
|
169
|
-
|
182
|
+
|
183
|
+
https://docs.futures.kraken.com/#websocket-api-public-feeds-ticker
|
184
|
+
|
185
|
+
:param str[] symbols: unified symbols of the markets to fetch the ticker for
|
170
186
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
171
187
|
:returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
|
172
188
|
"""
|
173
|
-
|
174
|
-
name = self.safe_string_2(params, 'method', 'watchTickerMethod', method)
|
175
|
-
params = self.omit(params, ['watchTickerMethod', 'method'])
|
189
|
+
await self.load_markets()
|
176
190
|
symbols = self.market_symbols(symbols, None, False)
|
177
|
-
ticker = await self.
|
191
|
+
ticker = await self.watch_multi_helper('ticker', 'ticker', symbols, None, params)
|
178
192
|
if self.newUpdates:
|
179
|
-
|
180
|
-
|
181
|
-
return
|
193
|
+
result: dict = {}
|
194
|
+
result[ticker['symbol']] = ticker
|
195
|
+
return result
|
182
196
|
return self.filter_by_array(self.tickers, 'symbol', symbols)
|
183
197
|
|
198
|
+
async def watch_bids_asks(self, symbols: Strings = None, params={}) -> Tickers:
|
199
|
+
"""
|
200
|
+
|
201
|
+
https://docs.futures.kraken.com/#websocket-api-public-feeds-ticker-lite
|
202
|
+
|
203
|
+
watches best bid & ask for symbols
|
204
|
+
:param str[] symbols: unified symbol of the market to fetch the ticker for
|
205
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
206
|
+
:returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
|
207
|
+
"""
|
208
|
+
ticker = await self.watch_multi_helper('bidask', 'ticker_lite', symbols, None, params)
|
209
|
+
if self.newUpdates:
|
210
|
+
result: dict = {}
|
211
|
+
result[ticker['symbol']] = ticker
|
212
|
+
return result
|
213
|
+
return self.filter_by_array(self.bidsasks, 'symbol', symbols)
|
214
|
+
|
184
215
|
async def watch_trades(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
|
185
216
|
"""
|
186
217
|
get the list of most recent trades for a particular symbol
|
187
|
-
|
218
|
+
|
219
|
+
https://docs.futures.kraken.com/#websocket-api-public-feeds-trade
|
220
|
+
|
188
221
|
:param str symbol: unified symbol of the market to fetch trades for
|
189
222
|
:param int [since]: timestamp in ms of the earliest trade to fetch
|
190
223
|
:param int [limit]: the maximum amount of trades to fetch
|
191
224
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
192
225
|
:returns dict[]: a list of `trade structures <https://docs.ccxt.com/#/?id=public-trades>`
|
193
226
|
"""
|
194
|
-
await self.
|
195
|
-
|
196
|
-
|
227
|
+
return await self.watch_trades_for_symbols([symbol], since, limit, params)
|
228
|
+
|
229
|
+
async def watch_trades_for_symbols(self, symbols: List[str], since: Int = None, limit: Int = None, params={}) -> List[Trade]:
|
230
|
+
"""
|
231
|
+
|
232
|
+
https://docs.futures.kraken.com/#websocket-api-public-feeds-trade
|
233
|
+
|
234
|
+
get the list of most recent trades for a list of symbols
|
235
|
+
:param str[] symbols: unified symbol of the market to fetch trades for
|
236
|
+
:param int [since]: timestamp in ms of the earliest trade to fetch
|
237
|
+
:param int [limit]: the maximum amount of trades to fetch
|
238
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
239
|
+
:returns dict[]: a list of `trade structures <https://docs.ccxt.com/#/?id=public-trades>`
|
240
|
+
"""
|
241
|
+
trades = await self.watch_multi_helper('trade', 'trade', symbols, None, params)
|
197
242
|
if self.newUpdates:
|
198
|
-
|
243
|
+
first = self.safe_list(trades, 0)
|
244
|
+
tradeSymbol = self.safe_string(first, 'symbol')
|
245
|
+
limit = trades.getLimit(tradeSymbol, limit)
|
199
246
|
return self.filter_by_since_limit(trades, since, limit, 'timestamp', True)
|
200
247
|
|
201
248
|
async def watch_order_book(self, symbol: str, limit: Int = None, params={}) -> OrderBook:
|
202
249
|
"""
|
203
250
|
watches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
|
204
|
-
|
251
|
+
|
252
|
+
https://docs.futures.kraken.com/#websocket-api-public-feeds-book
|
253
|
+
|
205
254
|
:param str symbol: unified symbol of the market to fetch the order book for
|
206
255
|
:param int [limit]: not used by krakenfutures watchOrderBook
|
207
256
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
208
257
|
:returns dict: A dictionary of `order book structures <https://docs.ccxt.com/#/?id=order-book-structure>` indexed by market symbols
|
209
258
|
"""
|
210
|
-
|
211
|
-
return orderbook.limit()
|
259
|
+
return await self.watch_order_book_for_symbols([symbol], limit, params)
|
212
260
|
|
213
261
|
async def watch_positions(self, symbols: Strings = None, since: Int = None, limit: Int = None, params={}) -> List[Position]:
|
214
262
|
"""
|
215
|
-
|
263
|
+
|
264
|
+
https://docs.futures.kraken.com/#websocket-api-private-feeds-open-positions
|
265
|
+
|
216
266
|
watch all open positions
|
217
267
|
:param str[]|None symbols: list of unified market symbols
|
268
|
+
@param since
|
269
|
+
@param limit
|
218
270
|
:param dict params: extra parameters specific to the exchange API endpoint
|
219
271
|
:returns dict[]: a list of `position structure <https://docs.ccxt.com/en/latest/manual.html#position-structure>`
|
220
272
|
"""
|
@@ -332,8 +384,10 @@ class krakenfutures(ccxt.async_support.krakenfutures):
|
|
332
384
|
async def watch_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
|
333
385
|
"""
|
334
386
|
watches information on multiple orders made by the user
|
335
|
-
|
336
|
-
|
387
|
+
|
388
|
+
https://docs.futures.kraken.com/#websocket-api-private-feeds-open-orders
|
389
|
+
https://docs.futures.kraken.com/#websocket-api-private-feeds-open-orders-verbose
|
390
|
+
|
337
391
|
:param str symbol: not used by krakenfutures watchOrders
|
338
392
|
:param int [since]: not used by krakenfutures watchOrders
|
339
393
|
:param int [limit]: not used by krakenfutures watchOrders
|
@@ -354,7 +408,9 @@ class krakenfutures(ccxt.async_support.krakenfutures):
|
|
354
408
|
async def watch_my_trades(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
|
355
409
|
"""
|
356
410
|
watches information on multiple trades made by the user
|
357
|
-
|
411
|
+
|
412
|
+
https://docs.futures.kraken.com/#websocket-api-private-feeds-fills
|
413
|
+
|
358
414
|
:param str symbol: unified market symbol of the market orders were made in
|
359
415
|
:param int [since]: the earliest time in ms to fetch orders for
|
360
416
|
:param int [limit]: the maximum number of order structures to retrieve
|
@@ -374,11 +430,10 @@ class krakenfutures(ccxt.async_support.krakenfutures):
|
|
374
430
|
|
375
431
|
async def watch_balance(self, params={}) -> Balances:
|
376
432
|
"""
|
377
|
-
watches information on
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
:param int [limit]: not used by krakenfutures watchBalance
|
433
|
+
watches information on the user's account balance
|
434
|
+
|
435
|
+
https://docs.futures.kraken.com/#websocket-api-private-feeds-balances
|
436
|
+
|
382
437
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
383
438
|
:param str [params.account]: can be either 'futures' or 'flex_futures'
|
384
439
|
:returns dict} a object of wallet types each with a balance structure {@link https://docs.ccxt.com/#/?id=balance-structure:
|
@@ -436,7 +491,7 @@ class krakenfutures(ccxt.async_support.krakenfutures):
|
|
436
491
|
if marketId is not None:
|
437
492
|
market = self.market(marketId)
|
438
493
|
symbol = market['symbol']
|
439
|
-
messageHash = 'trade
|
494
|
+
messageHash = self.get_message_hash('trade', None, symbol)
|
440
495
|
if self.safe_list(self.trades, symbol) is None:
|
441
496
|
tradesLimit = self.safe_integer(self.options, 'tradesLimit', 1000)
|
442
497
|
self.trades[symbol] = ArrayCache(tradesLimit)
|
@@ -453,7 +508,6 @@ class krakenfutures(ccxt.async_support.krakenfutures):
|
|
453
508
|
trade = self.parse_ws_trade(message)
|
454
509
|
tradesArray.append(trade)
|
455
510
|
client.resolve(tradesArray, messageHash)
|
456
|
-
return message
|
457
511
|
|
458
512
|
def parse_ws_trade(self, trade, market=None):
|
459
513
|
#
|
@@ -732,7 +786,7 @@ class krakenfutures(ccxt.async_support.krakenfutures):
|
|
732
786
|
orders = self.safe_value(message, 'orders', [])
|
733
787
|
limit = self.safe_integer(self.options, 'ordersLimit')
|
734
788
|
self.orders = ArrayCacheBySymbolById(limit)
|
735
|
-
symbols = {}
|
789
|
+
symbols: dict = {}
|
736
790
|
cachedOrders = self.orders
|
737
791
|
for i in range(0, len(orders)):
|
738
792
|
order = orders[i]
|
@@ -859,7 +913,15 @@ class krakenfutures(ccxt.async_support.krakenfutures):
|
|
859
913
|
# "volumeQuote": 19628180
|
860
914
|
# }
|
861
915
|
#
|
862
|
-
|
916
|
+
marketId = self.safe_string(message, 'product_id')
|
917
|
+
if marketId is not None:
|
918
|
+
ticker = self.parse_ws_ticker(message)
|
919
|
+
symbol = ticker['symbol']
|
920
|
+
self.tickers[symbol] = ticker
|
921
|
+
messageHash = self.get_message_hash('ticker', None, symbol)
|
922
|
+
client.resolve(ticker, messageHash)
|
923
|
+
|
924
|
+
def handle_bid_ask(self, client: Client, message):
|
863
925
|
#
|
864
926
|
# {
|
865
927
|
# "feed": "ticker_lite",
|
@@ -877,15 +939,12 @@ class krakenfutures(ccxt.async_support.krakenfutures):
|
|
877
939
|
# }
|
878
940
|
#
|
879
941
|
marketId = self.safe_string(message, 'product_id')
|
880
|
-
feed = self.safe_string(message, 'feed')
|
881
942
|
if marketId is not None:
|
882
943
|
ticker = self.parse_ws_ticker(message)
|
883
944
|
symbol = ticker['symbol']
|
884
|
-
self.
|
885
|
-
messageHash =
|
945
|
+
self.bidsasks[symbol] = ticker
|
946
|
+
messageHash = self.get_message_hash('bidask', None, symbol)
|
886
947
|
client.resolve(ticker, messageHash)
|
887
|
-
client.resolve(self.tickers, feed)
|
888
|
-
return message
|
889
948
|
|
890
949
|
def parse_ws_ticker(self, ticker, market=None):
|
891
950
|
#
|
@@ -962,6 +1021,8 @@ class krakenfutures(ccxt.async_support.krakenfutures):
|
|
962
1021
|
'average': None,
|
963
1022
|
'baseVolume': self.safe_string(ticker, 'volume'),
|
964
1023
|
'quoteVolume': self.safe_string(ticker, 'volumeQuote'),
|
1024
|
+
'markPrice': self.safe_string(ticker, 'markPrice'),
|
1025
|
+
'indexPrice': self.safe_string(ticker, 'index'),
|
965
1026
|
})
|
966
1027
|
|
967
1028
|
def handle_order_book_snapshot(self, client: Client, message):
|
@@ -997,14 +1058,14 @@ class krakenfutures(ccxt.async_support.krakenfutures):
|
|
997
1058
|
marketId = self.safe_string(message, 'product_id')
|
998
1059
|
market = self.safe_market(marketId)
|
999
1060
|
symbol = market['symbol']
|
1000
|
-
messageHash = '
|
1001
|
-
subscription = self.
|
1061
|
+
messageHash = self.get_message_hash('orderbook', None, symbol)
|
1062
|
+
subscription = self.safe_dict(client.subscriptions, messageHash, {})
|
1002
1063
|
limit = self.safe_integer(subscription, 'limit')
|
1003
1064
|
timestamp = self.safe_integer(message, 'timestamp')
|
1004
1065
|
self.orderbooks[symbol] = self.order_book({}, limit)
|
1005
1066
|
orderbook = self.orderbooks[symbol]
|
1006
|
-
bids = self.
|
1007
|
-
asks = self.
|
1067
|
+
bids = self.safe_list(message, 'bids')
|
1068
|
+
asks = self.safe_list(message, 'asks')
|
1008
1069
|
for i in range(0, len(bids)):
|
1009
1070
|
bid = bids[i]
|
1010
1071
|
price = self.safe_number(bid, 'price')
|
@@ -1037,7 +1098,7 @@ class krakenfutures(ccxt.async_support.krakenfutures):
|
|
1037
1098
|
marketId = self.safe_string(message, 'product_id')
|
1038
1099
|
market = self.safe_market(marketId)
|
1039
1100
|
symbol = market['symbol']
|
1040
|
-
messageHash = '
|
1101
|
+
messageHash = self.get_message_hash('orderbook', None, symbol)
|
1041
1102
|
orderbook = self.orderbooks[symbol]
|
1042
1103
|
side = self.safe_string(message, 'side')
|
1043
1104
|
price = self.safe_number(message, 'price')
|
@@ -1206,7 +1267,7 @@ class krakenfutures(ccxt.async_support.krakenfutures):
|
|
1206
1267
|
timestamp = self.safe_integer(message, 'timestamp')
|
1207
1268
|
if holding is not None:
|
1208
1269
|
holdingKeys = list(holding.keys()) # cashAccount
|
1209
|
-
holdingResult = {
|
1270
|
+
holdingResult: dict = {
|
1210
1271
|
'info': message,
|
1211
1272
|
'timestamp': timestamp,
|
1212
1273
|
'datetime': self.iso8601(timestamp),
|
@@ -1222,7 +1283,7 @@ class krakenfutures(ccxt.async_support.krakenfutures):
|
|
1222
1283
|
client.resolve(holdingResult, messageHash)
|
1223
1284
|
if futures is not None:
|
1224
1285
|
futuresKeys = list(futures.keys()) # marginAccount
|
1225
|
-
futuresResult = {
|
1286
|
+
futuresResult: dict = {
|
1226
1287
|
'info': message,
|
1227
1288
|
'timestamp': timestamp,
|
1228
1289
|
'datetime': self.iso8601(timestamp),
|
@@ -1245,7 +1306,7 @@ class krakenfutures(ccxt.async_support.krakenfutures):
|
|
1245
1306
|
if flexFutures is not None:
|
1246
1307
|
flexFutureCurrencies = self.safe_value(flexFutures, 'currencies', {})
|
1247
1308
|
flexFuturesKeys = list(flexFutureCurrencies.keys()) # multi-collateral margin account
|
1248
|
-
flexFuturesResult = {
|
1309
|
+
flexFuturesResult: dict = {
|
1249
1310
|
'info': message,
|
1250
1311
|
'timestamp': timestamp,
|
1251
1312
|
'datetime': self.iso8601(timestamp),
|
@@ -1296,7 +1357,7 @@ class krakenfutures(ccxt.async_support.krakenfutures):
|
|
1296
1357
|
limit = self.safe_integer(self.options, 'tradesLimit', 1000)
|
1297
1358
|
stored = ArrayCacheBySymbolById(limit)
|
1298
1359
|
self.myTrades = stored
|
1299
|
-
tradeSymbols = {}
|
1360
|
+
tradeSymbols: dict = {}
|
1300
1361
|
for i in range(0, len(trades)):
|
1301
1362
|
trade = trades[i]
|
1302
1363
|
parsedTrade = self.parse_ws_my_trade(trade)
|
@@ -1353,6 +1414,35 @@ class krakenfutures(ccxt.async_support.krakenfutures):
|
|
1353
1414
|
},
|
1354
1415
|
})
|
1355
1416
|
|
1417
|
+
async def watch_multi_helper(self, unifiedName: str, channelName: str, symbols: Strings = None, subscriptionArgs=None, params={}):
|
1418
|
+
await self.load_markets()
|
1419
|
+
# symbols are required
|
1420
|
+
symbols = self.market_symbols(symbols, None, False, True, False)
|
1421
|
+
messageHashes = []
|
1422
|
+
for i in range(0, len(symbols)):
|
1423
|
+
messageHashes.append(self.get_message_hash(unifiedName, None, self.symbol(symbols[i])))
|
1424
|
+
marketIds = self.market_ids(symbols)
|
1425
|
+
request: dict = {
|
1426
|
+
'event': 'subscribe',
|
1427
|
+
'feed': channelName,
|
1428
|
+
'product_ids': marketIds,
|
1429
|
+
}
|
1430
|
+
url = self.urls['api']['ws']
|
1431
|
+
return await self.watch_multiple(url, messageHashes, self.extend(request, params), messageHashes, subscriptionArgs)
|
1432
|
+
|
1433
|
+
def get_message_hash(self, unifiedElementName: str, subChannelName: Str = None, symbol: Str = None):
|
1434
|
+
# unifiedElementName can be : orderbook, trade, ticker, bidask ...
|
1435
|
+
# subChannelName only applies to channel that needs specific variation(i.e. depth_50, depth_100..) to be selected
|
1436
|
+
withSymbol = symbol is not None
|
1437
|
+
messageHash = unifiedElementName
|
1438
|
+
if not withSymbol:
|
1439
|
+
messageHash += 's'
|
1440
|
+
else:
|
1441
|
+
messageHash += ':' + symbol
|
1442
|
+
if subChannelName is not None:
|
1443
|
+
messageHash += '#' + subChannelName
|
1444
|
+
return messageHash
|
1445
|
+
|
1356
1446
|
def handle_error_message(self, client: Client, message):
|
1357
1447
|
#
|
1358
1448
|
# {
|
@@ -1376,12 +1466,12 @@ class krakenfutures(ccxt.async_support.krakenfutures):
|
|
1376
1466
|
client.lastPong = self.milliseconds()
|
1377
1467
|
elif event is None:
|
1378
1468
|
feed = self.safe_string(message, 'feed')
|
1379
|
-
methods = {
|
1469
|
+
methods: dict = {
|
1380
1470
|
'ticker': self.handle_ticker,
|
1471
|
+
'ticker_lite': self.handle_bid_ask,
|
1381
1472
|
'trade': self.handle_trade,
|
1382
1473
|
'trade_snapshot': self.handle_trade,
|
1383
1474
|
# 'heartbeat': self.handleStatus,
|
1384
|
-
'ticker_lite': self.handle_ticker,
|
1385
1475
|
'book': self.handle_order_book,
|
1386
1476
|
'book_snapshot': self.handle_order_book_snapshot,
|
1387
1477
|
'open_orders_verbose': self.handle_order,
|
@@ -1400,8 +1490,8 @@ class krakenfutures(ccxt.async_support.krakenfutures):
|
|
1400
1490
|
|
1401
1491
|
def handle_authenticate(self, client: Client, message):
|
1402
1492
|
"""
|
1403
|
-
|
1404
|
-
|
1493
|
+
@ignore
|
1494
|
+
https://docs.futures.kraken.com/#websocket-api-websocket-api-introduction-sign-challenge-challenge
|
1405
1495
|
"""
|
1406
1496
|
#
|
1407
1497
|
# {
|
@@ -1418,7 +1508,8 @@ class krakenfutures(ccxt.async_support.krakenfutures):
|
|
1418
1508
|
signature = self.hmac(hashedChallenge, base64Secret, hashlib.sha512, 'base64')
|
1419
1509
|
self.options['challenge'] = challenge
|
1420
1510
|
self.options['signedChallenge'] = signature
|
1421
|
-
client.
|
1511
|
+
future = self.safe_value(client.futures, messageHash)
|
1512
|
+
future.resolve(True)
|
1422
1513
|
else:
|
1423
1514
|
error = AuthenticationError(self.id + ' ' + self.json(message))
|
1424
1515
|
client.reject(error, messageHash)
|