ccxt 4.2.76__py2.py3-none-any.whl → 4.4.48__py2.py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- ccxt/__init__.py +36 -14
- ccxt/abstract/alpaca.py +4 -0
- ccxt/abstract/bigone.py +1 -1
- ccxt/abstract/binance.py +112 -48
- ccxt/abstract/binancecoinm.py +112 -48
- ccxt/abstract/binanceus.py +147 -83
- ccxt/abstract/binanceusdm.py +112 -48
- ccxt/abstract/bingx.py +133 -78
- ccxt/abstract/bitbank.py +5 -0
- ccxt/abstract/bitfinex.py +136 -65
- ccxt/abstract/bitfinex1.py +69 -0
- ccxt/abstract/bitflyer.py +1 -0
- ccxt/abstract/bitget.py +8 -1
- ccxt/abstract/bitmart.py +13 -1
- ccxt/abstract/bitopro.py +1 -0
- ccxt/abstract/bitpanda.py +0 -12
- ccxt/abstract/bitrue.py +3 -3
- ccxt/abstract/bitstamp.py +26 -3
- ccxt/abstract/blofin.py +24 -0
- ccxt/abstract/btcbox.py +1 -0
- ccxt/abstract/bybit.py +29 -14
- ccxt/abstract/cex.py +28 -29
- ccxt/abstract/coinbase.py +6 -0
- ccxt/abstract/coinbaseadvanced.py +94 -0
- ccxt/abstract/{coinbasepro.py → coinbaseexchange.py} +1 -0
- ccxt/abstract/coinbaseinternational.py +1 -1
- ccxt/abstract/coincatch.py +94 -0
- ccxt/abstract/coinex.py +233 -123
- ccxt/abstract/coinmetro.py +1 -0
- ccxt/abstract/cryptocom.py +14 -0
- ccxt/abstract/defx.py +69 -0
- ccxt/abstract/deribit.py +1 -0
- ccxt/abstract/digifinex.py +1 -0
- ccxt/abstract/ellipx.py +25 -0
- ccxt/abstract/gate.py +20 -0
- ccxt/abstract/gateio.py +20 -0
- ccxt/abstract/gemini.py +1 -0
- ccxt/abstract/hashkey.py +67 -0
- ccxt/abstract/hyperliquid.py +1 -1
- ccxt/abstract/independentreserve.py +6 -0
- ccxt/abstract/kraken.py +4 -3
- ccxt/abstract/krakenfutures.py +4 -0
- ccxt/abstract/kucoin.py +25 -0
- ccxt/abstract/kucoinfutures.py +35 -0
- ccxt/abstract/luno.py +2 -0
- ccxt/abstract/mexc.py +4 -0
- ccxt/abstract/myokx.py +340 -0
- ccxt/abstract/oceanex.py +5 -0
- ccxt/abstract/okx.py +30 -0
- ccxt/abstract/onetrading.py +0 -12
- ccxt/abstract/oxfun.py +34 -0
- ccxt/abstract/paradex.py +40 -0
- ccxt/abstract/phemex.py +1 -0
- ccxt/abstract/upbit.py +4 -0
- ccxt/abstract/vertex.py +19 -0
- ccxt/abstract/whitebit.py +31 -1
- ccxt/abstract/woo.py +6 -2
- ccxt/abstract/woofipro.py +119 -0
- ccxt/abstract/xt.py +153 -0
- ccxt/abstract/zonda.py +6 -0
- ccxt/ace.py +164 -60
- ccxt/alpaca.py +727 -63
- ccxt/ascendex.py +395 -249
- ccxt/async_support/__init__.py +36 -14
- ccxt/async_support/ace.py +164 -60
- ccxt/async_support/alpaca.py +727 -63
- ccxt/async_support/ascendex.py +396 -249
- ccxt/async_support/base/exchange.py +531 -155
- ccxt/async_support/base/ws/aiohttp_client.py +28 -5
- ccxt/async_support/base/ws/cache.py +3 -2
- ccxt/async_support/base/ws/client.py +26 -5
- ccxt/async_support/base/ws/fast_client.py +4 -3
- ccxt/async_support/base/ws/functions.py +1 -1
- ccxt/async_support/base/ws/future.py +40 -31
- ccxt/async_support/base/ws/order_book_side.py +3 -0
- ccxt/async_support/bequant.py +1 -1
- ccxt/async_support/bigone.py +329 -202
- ccxt/async_support/binance.py +3513 -1511
- ccxt/async_support/binancecoinm.py +2 -1
- ccxt/async_support/binanceus.py +12 -1
- ccxt/async_support/binanceusdm.py +3 -1
- ccxt/async_support/bingx.py +3105 -881
- ccxt/async_support/bit2c.py +119 -38
- ccxt/async_support/bitbank.py +215 -76
- ccxt/async_support/bitbns.py +124 -53
- ccxt/async_support/bitfinex.py +3236 -1078
- ccxt/async_support/bitfinex1.py +1711 -0
- ccxt/async_support/bitflyer.py +239 -50
- ccxt/async_support/bitget.py +1513 -563
- ccxt/async_support/bithumb.py +201 -67
- ccxt/async_support/bitmart.py +1320 -435
- ccxt/async_support/bitmex.py +308 -111
- ccxt/async_support/bitopro.py +256 -96
- ccxt/async_support/bitrue.py +365 -233
- ccxt/async_support/bitso.py +201 -89
- ccxt/async_support/bitstamp.py +438 -269
- ccxt/async_support/bitteam.py +179 -73
- ccxt/async_support/bitvavo.py +180 -70
- ccxt/async_support/bl3p.py +92 -25
- ccxt/async_support/blockchaincom.py +193 -79
- ccxt/async_support/blofin.py +403 -150
- ccxt/async_support/btcalpha.py +161 -55
- ccxt/async_support/btcbox.py +250 -34
- ccxt/async_support/btcmarkets.py +232 -85
- ccxt/async_support/btcturk.py +159 -60
- ccxt/async_support/bybit.py +2326 -1255
- ccxt/async_support/cex.py +1409 -1329
- ccxt/async_support/coinbase.py +1455 -288
- ccxt/async_support/coinbaseadvanced.py +17 -0
- ccxt/async_support/{coinbasepro.py → coinbaseexchange.py} +233 -99
- ccxt/async_support/coinbaseinternational.py +428 -88
- ccxt/async_support/coincatch.py +5152 -0
- ccxt/async_support/coincheck.py +121 -38
- ccxt/async_support/coinex.py +4020 -3339
- ccxt/async_support/coinlist.py +273 -116
- ccxt/async_support/coinmate.py +204 -97
- ccxt/async_support/coinmetro.py +203 -110
- ccxt/async_support/coinone.py +142 -68
- ccxt/async_support/coinsph.py +206 -89
- ccxt/async_support/coinspot.py +137 -62
- ccxt/async_support/cryptocom.py +515 -185
- ccxt/async_support/currencycom.py +203 -85
- ccxt/async_support/defx.py +2066 -0
- ccxt/async_support/delta.py +467 -158
- ccxt/async_support/deribit.py +558 -324
- ccxt/async_support/digifinex.py +340 -223
- ccxt/async_support/ellipx.py +1826 -0
- ccxt/async_support/exmo.py +259 -128
- ccxt/async_support/gate.py +1473 -464
- ccxt/async_support/gemini.py +206 -84
- ccxt/async_support/hashkey.py +4164 -0
- ccxt/async_support/hitbtc.py +334 -178
- ccxt/async_support/hollaex.py +134 -83
- ccxt/async_support/htx.py +1095 -563
- ccxt/async_support/huobijp.py +105 -56
- ccxt/async_support/hyperliquid.py +1634 -269
- ccxt/async_support/idex.py +148 -95
- ccxt/async_support/independentreserve.py +236 -31
- ccxt/async_support/indodax.py +165 -62
- ccxt/async_support/kraken.py +871 -354
- ccxt/async_support/krakenfutures.py +324 -100
- ccxt/async_support/kucoin.py +1050 -355
- ccxt/async_support/kucoinfutures.py +1004 -149
- ccxt/async_support/kuna.py +138 -106
- ccxt/async_support/latoken.py +135 -79
- ccxt/async_support/lbank.py +290 -113
- ccxt/async_support/luno.py +112 -62
- ccxt/async_support/lykke.py +104 -55
- ccxt/async_support/mercado.py +36 -29
- ccxt/async_support/mexc.py +995 -429
- ccxt/async_support/myokx.py +43 -0
- ccxt/async_support/ndax.py +163 -82
- ccxt/async_support/novadax.py +121 -75
- ccxt/async_support/oceanex.py +175 -59
- ccxt/async_support/okcoin.py +222 -163
- ccxt/async_support/okx.py +1777 -455
- ccxt/async_support/onetrading.py +132 -414
- ccxt/async_support/oxfun.py +2832 -0
- ccxt/async_support/p2b.py +79 -51
- ccxt/async_support/paradex.py +2017 -0
- ccxt/async_support/paymium.py +56 -32
- ccxt/async_support/phemex.py +572 -196
- ccxt/async_support/poloniex.py +218 -95
- ccxt/async_support/poloniexfutures.py +260 -92
- ccxt/async_support/probit.py +143 -110
- ccxt/async_support/timex.py +123 -70
- ccxt/async_support/tokocrypto.py +129 -93
- ccxt/async_support/tradeogre.py +39 -25
- ccxt/async_support/upbit.py +322 -113
- ccxt/async_support/vertex.py +2983 -0
- ccxt/async_support/wavesexchange.py +227 -173
- ccxt/async_support/wazirx.py +145 -65
- ccxt/async_support/whitebit.py +533 -138
- ccxt/async_support/woo.py +1155 -295
- ccxt/async_support/woofipro.py +2716 -0
- ccxt/async_support/xt.py +4628 -0
- ccxt/async_support/yobit.py +160 -92
- ccxt/async_support/zaif.py +80 -33
- ccxt/async_support/zonda.py +140 -69
- ccxt/base/errors.py +51 -20
- ccxt/base/exchange.py +1729 -482
- ccxt/base/precise.py +10 -0
- ccxt/base/types.py +223 -4
- ccxt/bequant.py +1 -1
- ccxt/bigone.py +329 -202
- ccxt/binance.py +3513 -1511
- ccxt/binancecoinm.py +2 -1
- ccxt/binanceus.py +12 -1
- ccxt/binanceusdm.py +3 -1
- ccxt/bingx.py +3105 -881
- ccxt/bit2c.py +119 -38
- ccxt/bitbank.py +215 -76
- ccxt/bitbns.py +124 -53
- ccxt/bitfinex.py +3235 -1078
- ccxt/bitfinex1.py +1710 -0
- ccxt/bitflyer.py +239 -50
- ccxt/bitget.py +1513 -563
- ccxt/bithumb.py +200 -67
- ccxt/bitmart.py +1320 -435
- ccxt/bitmex.py +308 -111
- ccxt/bitopro.py +256 -96
- ccxt/bitrue.py +365 -233
- ccxt/bitso.py +201 -89
- ccxt/bitstamp.py +438 -269
- ccxt/bitteam.py +179 -73
- ccxt/bitvavo.py +180 -70
- ccxt/bl3p.py +92 -25
- ccxt/blockchaincom.py +193 -79
- ccxt/blofin.py +403 -150
- ccxt/btcalpha.py +161 -55
- ccxt/btcbox.py +250 -34
- ccxt/btcmarkets.py +232 -85
- ccxt/btcturk.py +159 -60
- ccxt/bybit.py +2326 -1255
- ccxt/cex.py +1408 -1329
- ccxt/coinbase.py +1455 -288
- ccxt/coinbaseadvanced.py +17 -0
- ccxt/{coinbasepro.py → coinbaseexchange.py} +233 -99
- ccxt/coinbaseinternational.py +428 -88
- ccxt/coincatch.py +5152 -0
- ccxt/coincheck.py +121 -38
- ccxt/coinex.py +4020 -3339
- ccxt/coinlist.py +273 -116
- ccxt/coinmate.py +204 -97
- ccxt/coinmetro.py +203 -110
- ccxt/coinone.py +142 -68
- ccxt/coinsph.py +206 -89
- ccxt/coinspot.py +137 -62
- ccxt/cryptocom.py +515 -185
- ccxt/currencycom.py +203 -85
- ccxt/defx.py +2065 -0
- ccxt/delta.py +467 -158
- ccxt/deribit.py +558 -324
- ccxt/digifinex.py +340 -223
- ccxt/ellipx.py +1826 -0
- ccxt/exmo.py +259 -128
- ccxt/gate.py +1473 -464
- ccxt/gemini.py +206 -84
- ccxt/hashkey.py +4164 -0
- ccxt/hitbtc.py +334 -178
- ccxt/hollaex.py +134 -83
- ccxt/htx.py +1095 -563
- ccxt/huobijp.py +105 -56
- ccxt/hyperliquid.py +1633 -269
- ccxt/idex.py +148 -95
- ccxt/independentreserve.py +235 -31
- ccxt/indodax.py +165 -62
- ccxt/kraken.py +871 -354
- ccxt/krakenfutures.py +324 -100
- ccxt/kucoin.py +1050 -355
- ccxt/kucoinfutures.py +1004 -149
- ccxt/kuna.py +138 -106
- ccxt/latoken.py +135 -79
- ccxt/lbank.py +290 -113
- ccxt/luno.py +112 -62
- ccxt/lykke.py +104 -55
- ccxt/mercado.py +36 -29
- ccxt/mexc.py +994 -429
- ccxt/myokx.py +43 -0
- ccxt/ndax.py +163 -82
- ccxt/novadax.py +121 -75
- ccxt/oceanex.py +175 -59
- ccxt/okcoin.py +222 -163
- ccxt/okx.py +1777 -455
- ccxt/onetrading.py +132 -414
- ccxt/oxfun.py +2831 -0
- ccxt/p2b.py +79 -51
- ccxt/paradex.py +2017 -0
- ccxt/paymium.py +56 -32
- ccxt/phemex.py +572 -196
- ccxt/poloniex.py +218 -95
- ccxt/poloniexfutures.py +260 -92
- ccxt/pro/__init__.py +29 -5
- ccxt/pro/alpaca.py +32 -17
- ccxt/pro/ascendex.py +63 -15
- ccxt/pro/bequant.py +4 -0
- ccxt/pro/binance.py +1596 -329
- ccxt/pro/binancecoinm.py +1 -0
- ccxt/pro/binanceus.py +2 -9
- ccxt/pro/binanceusdm.py +2 -0
- ccxt/pro/bingx.py +527 -134
- ccxt/pro/bitcoincom.py +4 -1
- ccxt/pro/bitfinex.py +731 -266
- ccxt/pro/bitfinex1.py +635 -0
- ccxt/pro/bitget.py +726 -357
- ccxt/pro/bithumb.py +380 -0
- ccxt/pro/bitmart.py +138 -39
- ccxt/pro/bitmex.py +199 -40
- ccxt/pro/bitopro.py +25 -13
- ccxt/pro/bitrue.py +31 -32
- ccxt/pro/bitstamp.py +7 -6
- ccxt/pro/bitvavo.py +204 -82
- ccxt/pro/blockchaincom.py +30 -17
- ccxt/pro/blofin.py +692 -0
- ccxt/pro/bybit.py +791 -82
- ccxt/pro/cex.py +99 -51
- ccxt/pro/coinbase.py +220 -30
- ccxt/{async_support/hitbtc3.py → pro/coinbaseadvanced.py} +5 -5
- ccxt/pro/{coinbasepro.py → coinbaseexchange.py} +19 -19
- ccxt/pro/coinbaseinternational.py +193 -30
- ccxt/pro/coincatch.py +1464 -0
- ccxt/pro/coincheck.py +11 -6
- ccxt/pro/coinex.py +967 -661
- ccxt/pro/coinone.py +17 -10
- ccxt/pro/cryptocom.py +446 -66
- ccxt/pro/currencycom.py +11 -10
- ccxt/pro/defx.py +832 -0
- ccxt/pro/deribit.py +168 -32
- ccxt/pro/exmo.py +253 -21
- ccxt/pro/gate.py +729 -64
- ccxt/pro/gemini.py +44 -26
- ccxt/pro/hashkey.py +802 -0
- ccxt/pro/hitbtc.py +208 -103
- ccxt/pro/hollaex.py +25 -9
- ccxt/pro/htx.py +83 -39
- ccxt/pro/huobijp.py +17 -16
- ccxt/pro/hyperliquid.py +502 -31
- ccxt/pro/idex.py +28 -13
- ccxt/pro/independentreserve.py +21 -16
- ccxt/pro/kraken.py +298 -51
- ccxt/pro/krakenfutures.py +166 -75
- ccxt/pro/kucoin.py +395 -77
- ccxt/pro/kucoinfutures.py +400 -99
- ccxt/pro/lbank.py +52 -31
- ccxt/pro/luno.py +12 -10
- ccxt/pro/mexc.py +400 -50
- ccxt/pro/myokx.py +28 -0
- ccxt/pro/ndax.py +25 -12
- ccxt/pro/okcoin.py +28 -9
- ccxt/pro/okx.py +935 -124
- ccxt/pro/onetrading.py +41 -24
- ccxt/pro/oxfun.py +1054 -0
- ccxt/pro/p2b.py +100 -24
- ccxt/pro/paradex.py +352 -0
- ccxt/pro/phemex.py +93 -34
- ccxt/pro/poloniex.py +129 -50
- ccxt/pro/poloniexfutures.py +53 -32
- ccxt/pro/probit.py +93 -86
- ccxt/pro/upbit.py +401 -8
- ccxt/pro/vertex.py +943 -0
- ccxt/pro/wazirx.py +46 -28
- ccxt/pro/whitebit.py +65 -12
- ccxt/pro/woo.py +486 -70
- ccxt/pro/woofipro.py +1271 -0
- ccxt/pro/xt.py +1067 -0
- ccxt/probit.py +143 -110
- ccxt/static_dependencies/__init__.py +1 -1
- ccxt/static_dependencies/lark/__init__.py +38 -0
- ccxt/static_dependencies/lark/__pyinstaller/__init__.py +6 -0
- ccxt/static_dependencies/lark/__pyinstaller/hook-lark.py +14 -0
- ccxt/static_dependencies/lark/ast_utils.py +59 -0
- ccxt/static_dependencies/lark/common.py +86 -0
- ccxt/static_dependencies/lark/exceptions.py +292 -0
- ccxt/static_dependencies/lark/grammar.py +130 -0
- ccxt/static_dependencies/lark/grammars/__init__.py +0 -0
- ccxt/static_dependencies/lark/indenter.py +143 -0
- ccxt/static_dependencies/lark/lark.py +658 -0
- ccxt/static_dependencies/lark/lexer.py +678 -0
- ccxt/static_dependencies/lark/load_grammar.py +1428 -0
- ccxt/static_dependencies/lark/parse_tree_builder.py +391 -0
- ccxt/static_dependencies/lark/parser_frontends.py +257 -0
- ccxt/static_dependencies/lark/parsers/__init__.py +0 -0
- ccxt/static_dependencies/lark/parsers/cyk.py +340 -0
- ccxt/static_dependencies/lark/parsers/earley.py +314 -0
- ccxt/static_dependencies/lark/parsers/earley_common.py +42 -0
- ccxt/static_dependencies/lark/parsers/earley_forest.py +801 -0
- ccxt/static_dependencies/lark/parsers/grammar_analysis.py +203 -0
- ccxt/static_dependencies/lark/parsers/lalr_analysis.py +332 -0
- ccxt/static_dependencies/lark/parsers/lalr_interactive_parser.py +158 -0
- ccxt/static_dependencies/lark/parsers/lalr_parser.py +122 -0
- ccxt/static_dependencies/lark/parsers/lalr_parser_state.py +110 -0
- ccxt/static_dependencies/lark/parsers/xearley.py +165 -0
- ccxt/static_dependencies/lark/py.typed +0 -0
- ccxt/static_dependencies/lark/reconstruct.py +107 -0
- ccxt/static_dependencies/lark/tools/__init__.py +70 -0
- ccxt/static_dependencies/lark/tools/nearley.py +202 -0
- ccxt/static_dependencies/lark/tools/serialize.py +32 -0
- ccxt/static_dependencies/lark/tools/standalone.py +196 -0
- ccxt/static_dependencies/lark/tree.py +267 -0
- ccxt/static_dependencies/lark/tree_matcher.py +186 -0
- ccxt/static_dependencies/lark/tree_templates.py +180 -0
- ccxt/static_dependencies/lark/utils.py +343 -0
- ccxt/static_dependencies/lark/visitors.py +596 -0
- ccxt/static_dependencies/marshmallow/__init__.py +81 -0
- ccxt/static_dependencies/marshmallow/base.py +65 -0
- ccxt/static_dependencies/marshmallow/class_registry.py +94 -0
- ccxt/static_dependencies/marshmallow/decorators.py +231 -0
- ccxt/static_dependencies/marshmallow/error_store.py +60 -0
- ccxt/static_dependencies/marshmallow/exceptions.py +71 -0
- ccxt/static_dependencies/marshmallow/fields.py +2114 -0
- ccxt/static_dependencies/marshmallow/orderedset.py +89 -0
- ccxt/static_dependencies/marshmallow/py.typed +0 -0
- ccxt/static_dependencies/marshmallow/schema.py +1228 -0
- ccxt/static_dependencies/marshmallow/types.py +12 -0
- ccxt/static_dependencies/marshmallow/utils.py +378 -0
- ccxt/static_dependencies/marshmallow/validate.py +678 -0
- ccxt/static_dependencies/marshmallow/warnings.py +2 -0
- ccxt/static_dependencies/marshmallow_dataclass/__init__.py +1047 -0
- ccxt/static_dependencies/marshmallow_dataclass/collection_field.py +51 -0
- ccxt/static_dependencies/marshmallow_dataclass/lazy_class_attribute.py +45 -0
- ccxt/static_dependencies/marshmallow_dataclass/mypy.py +71 -0
- ccxt/static_dependencies/marshmallow_dataclass/py.typed +0 -0
- ccxt/static_dependencies/marshmallow_dataclass/typing.py +14 -0
- ccxt/static_dependencies/marshmallow_dataclass/union_field.py +82 -0
- ccxt/static_dependencies/marshmallow_oneofschema/__init__.py +1 -0
- ccxt/static_dependencies/marshmallow_oneofschema/one_of_schema.py +193 -0
- ccxt/static_dependencies/marshmallow_oneofschema/py.typed +0 -0
- ccxt/static_dependencies/starknet/__init__.py +0 -0
- ccxt/static_dependencies/starknet/cairo/__init__.py +0 -0
- ccxt/static_dependencies/starknet/cairo/data_types.py +123 -0
- ccxt/static_dependencies/starknet/cairo/deprecated_parse/__init__.py +0 -0
- ccxt/static_dependencies/starknet/cairo/deprecated_parse/cairo_types.py +77 -0
- ccxt/static_dependencies/starknet/cairo/deprecated_parse/parser.py +46 -0
- ccxt/static_dependencies/starknet/cairo/deprecated_parse/parser_transformer.py +138 -0
- ccxt/static_dependencies/starknet/cairo/felt.py +64 -0
- ccxt/static_dependencies/starknet/cairo/type_parser.py +121 -0
- ccxt/static_dependencies/starknet/cairo/v1/__init__.py +0 -0
- ccxt/static_dependencies/starknet/cairo/v1/type_parser.py +59 -0
- ccxt/static_dependencies/starknet/cairo/v2/__init__.py +0 -0
- ccxt/static_dependencies/starknet/cairo/v2/type_parser.py +77 -0
- ccxt/static_dependencies/starknet/ccxt_utils.py +7 -0
- ccxt/static_dependencies/starknet/common.py +15 -0
- ccxt/static_dependencies/starknet/constants.py +39 -0
- ccxt/static_dependencies/starknet/hash/__init__.py +0 -0
- ccxt/static_dependencies/starknet/hash/address.py +79 -0
- ccxt/static_dependencies/starknet/hash/compiled_class_hash_objects.py +111 -0
- ccxt/static_dependencies/starknet/hash/selector.py +16 -0
- ccxt/static_dependencies/starknet/hash/storage.py +12 -0
- ccxt/static_dependencies/starknet/hash/utils.py +78 -0
- ccxt/static_dependencies/starknet/models/__init__.py +0 -0
- ccxt/static_dependencies/starknet/models/typed_data.py +45 -0
- ccxt/static_dependencies/starknet/serialization/__init__.py +24 -0
- ccxt/static_dependencies/starknet/serialization/_calldata_reader.py +40 -0
- ccxt/static_dependencies/starknet/serialization/_context.py +142 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/__init__.py +10 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/_common.py +82 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/array_serializer.py +43 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/bool_serializer.py +37 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/byte_array_serializer.py +66 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/cairo_data_serializer.py +71 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/enum_serializer.py +71 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/felt_serializer.py +50 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/named_tuple_serializer.py +58 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/option_serializer.py +43 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/output_serializer.py +40 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/payload_serializer.py +72 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/struct_serializer.py +36 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/tuple_serializer.py +36 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/uint256_serializer.py +76 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/uint_serializer.py +100 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/unit_serializer.py +32 -0
- ccxt/static_dependencies/starknet/serialization/errors.py +10 -0
- ccxt/static_dependencies/starknet/serialization/factory.py +229 -0
- ccxt/static_dependencies/starknet/serialization/function_serialization_adapter.py +110 -0
- ccxt/static_dependencies/starknet/serialization/tuple_dataclass.py +59 -0
- ccxt/static_dependencies/starknet/utils/__init__.py +0 -0
- ccxt/static_dependencies/starknet/utils/constructor_args_translator.py +86 -0
- ccxt/static_dependencies/starknet/utils/iterable.py +13 -0
- ccxt/static_dependencies/starknet/utils/schema.py +13 -0
- ccxt/static_dependencies/starknet/utils/typed_data.py +182 -0
- ccxt/static_dependencies/starkware/__init__.py +0 -0
- ccxt/static_dependencies/starkware/crypto/__init__.py +0 -0
- ccxt/static_dependencies/starkware/crypto/fast_pedersen_hash.py +50 -0
- ccxt/static_dependencies/starkware/crypto/math_utils.py +78 -0
- ccxt/static_dependencies/starkware/crypto/signature.py +2344 -0
- ccxt/static_dependencies/starkware/crypto/utils.py +63 -0
- ccxt/static_dependencies/sympy/__init__.py +0 -0
- ccxt/static_dependencies/sympy/core/__init__.py +0 -0
- ccxt/static_dependencies/sympy/core/intfunc.py +35 -0
- ccxt/static_dependencies/sympy/external/__init__.py +0 -0
- ccxt/static_dependencies/sympy/external/gmpy.py +345 -0
- ccxt/static_dependencies/sympy/external/importtools.py +187 -0
- ccxt/static_dependencies/sympy/external/ntheory.py +637 -0
- ccxt/static_dependencies/sympy/external/pythonmpq.py +341 -0
- ccxt/static_dependencies/typing_inspect/__init__.py +0 -0
- ccxt/static_dependencies/typing_inspect/typing_inspect.py +851 -0
- ccxt/test/{test_async.py → tests_async.py} +465 -407
- ccxt/test/tests_helpers.py +285 -0
- ccxt/test/tests_init.py +39 -0
- ccxt/test/{test_sync.py → tests_sync.py} +465 -409
- ccxt/timex.py +123 -70
- ccxt/tokocrypto.py +129 -93
- ccxt/tradeogre.py +39 -25
- ccxt/upbit.py +322 -113
- ccxt/vertex.py +2983 -0
- ccxt/wavesexchange.py +227 -173
- ccxt/wazirx.py +145 -65
- ccxt/whitebit.py +533 -138
- ccxt/woo.py +1155 -295
- ccxt/woofipro.py +2716 -0
- ccxt/xt.py +4627 -0
- ccxt/yobit.py +159 -92
- ccxt/zaif.py +80 -33
- ccxt/zonda.py +140 -69
- ccxt-4.4.48.dist-info/LICENSE.txt +21 -0
- ccxt-4.4.48.dist-info/METADATA +646 -0
- ccxt-4.4.48.dist-info/RECORD +669 -0
- {ccxt-4.2.76.dist-info → ccxt-4.4.48.dist-info}/WHEEL +1 -1
- ccxt/abstract/bitbay.py +0 -47
- ccxt/abstract/bitfinex2.py +0 -139
- ccxt/abstract/hitbtc3.py +0 -115
- ccxt/async_support/bitbay.py +0 -17
- ccxt/async_support/bitfinex2.py +0 -3496
- ccxt/async_support/flowbtc.py +0 -34
- ccxt/bitbay.py +0 -17
- ccxt/bitfinex2.py +0 -3496
- ccxt/flowbtc.py +0 -34
- ccxt/hitbtc3.py +0 -16
- ccxt/pro/bitfinex2.py +0 -1081
- ccxt/test/base/__init__.py +0 -28
- ccxt/test/base/test_account.py +0 -26
- ccxt/test/base/test_balance.py +0 -56
- ccxt/test/base/test_borrow_interest.py +0 -35
- ccxt/test/base/test_borrow_rate.py +0 -32
- ccxt/test/base/test_calculate_fee.py +0 -51
- ccxt/test/base/test_crypto.py +0 -127
- ccxt/test/base/test_currency.py +0 -76
- ccxt/test/base/test_datetime.py +0 -103
- ccxt/test/base/test_decimal_to_precision.py +0 -392
- ccxt/test/base/test_deep_extend.py +0 -68
- ccxt/test/base/test_deposit_withdrawal.py +0 -50
- ccxt/test/base/test_exchange_datetime_functions.py +0 -76
- ccxt/test/base/test_funding_rate_history.py +0 -29
- ccxt/test/base/test_last_price.py +0 -32
- ccxt/test/base/test_ledger_entry.py +0 -45
- ccxt/test/base/test_ledger_item.py +0 -48
- ccxt/test/base/test_leverage_tier.py +0 -33
- ccxt/test/base/test_margin_mode.py +0 -24
- ccxt/test/base/test_margin_modification.py +0 -35
- ccxt/test/base/test_market.py +0 -190
- ccxt/test/base/test_number.py +0 -411
- ccxt/test/base/test_ohlcv.py +0 -32
- ccxt/test/base/test_open_interest.py +0 -32
- ccxt/test/base/test_order.py +0 -64
- ccxt/test/base/test_order_book.py +0 -63
- ccxt/test/base/test_position.py +0 -60
- ccxt/test/base/test_shared_methods.py +0 -345
- ccxt/test/base/test_status.py +0 -24
- ccxt/test/base/test_throttle.py +0 -126
- ccxt/test/base/test_ticker.py +0 -86
- ccxt/test/base/test_trade.py +0 -47
- ccxt/test/base/test_trading_fee.py +0 -26
- ccxt/test/base/test_transaction.py +0 -39
- ccxt-4.2.76.dist-info/METADATA +0 -626
- ccxt-4.2.76.dist-info/RECORD +0 -534
- {ccxt-4.2.76.dist-info → ccxt-4.4.48.dist-info}/top_level.txt +0 -0
ccxt/async_support/blofin.py
CHANGED
@@ -6,16 +6,16 @@
|
|
6
6
|
from ccxt.async_support.base.exchange import Exchange
|
7
7
|
from ccxt.abstract.blofin import ImplicitAPI
|
8
8
|
import hashlib
|
9
|
-
from ccxt.base.types import Balances, Currency, Int, Leverage, Leverages, MarginMode, Market, Num, Order, OrderBook, OrderRequest, OrderSide, OrderType, Position, Str, Strings, Ticker, Tickers, Trade, Transaction, TransferEntry
|
9
|
+
from ccxt.base.types import Balances, Currency, Int, LedgerEntry, Leverage, Leverages, MarginMode, Market, Num, Order, OrderBook, OrderRequest, OrderSide, OrderType, Position, Str, Strings, Ticker, Tickers, FundingRate, Trade, TradingFeeInterface, Transaction, TransferEntry
|
10
10
|
from typing import List
|
11
11
|
from ccxt.base.errors import ExchangeError
|
12
|
+
from ccxt.base.errors import AuthenticationError
|
12
13
|
from ccxt.base.errors import ArgumentsRequired
|
13
14
|
from ccxt.base.errors import BadRequest
|
14
15
|
from ccxt.base.errors import InsufficientFunds
|
15
16
|
from ccxt.base.errors import InvalidOrder
|
16
17
|
from ccxt.base.errors import RateLimitExceeded
|
17
18
|
from ccxt.base.errors import ExchangeNotAvailable
|
18
|
-
from ccxt.base.errors import AuthenticationError
|
19
19
|
from ccxt.base.decimal_to_precision import TICK_SIZE
|
20
20
|
from ccxt.base.precise import Precise
|
21
21
|
|
@@ -29,6 +29,7 @@ class blofin(Exchange, ImplicitAPI):
|
|
29
29
|
'countries': ['US'],
|
30
30
|
'version': 'v1',
|
31
31
|
'rateLimit': 100,
|
32
|
+
'pro': True,
|
32
33
|
'has': {
|
33
34
|
'CORS': None,
|
34
35
|
'spot': False,
|
@@ -103,12 +104,11 @@ class blofin(Exchange, ImplicitAPI):
|
|
103
104
|
'fetchOpenInterestHistory': False,
|
104
105
|
'fetchOpenOrder': None,
|
105
106
|
'fetchOpenOrders': True,
|
106
|
-
'fetchOrder':
|
107
|
+
'fetchOrder': None,
|
107
108
|
'fetchOrderBook': True,
|
108
109
|
'fetchOrderBooks': False,
|
109
110
|
'fetchOrders': False,
|
110
111
|
'fetchOrderTrades': True,
|
111
|
-
'fetchPermissions': None,
|
112
112
|
'fetchPosition': True,
|
113
113
|
'fetchPositions': True,
|
114
114
|
'fetchPositionsForSymbol': False,
|
@@ -153,20 +153,21 @@ class blofin(Exchange, ImplicitAPI):
|
|
153
153
|
'2h': '2H',
|
154
154
|
'4h': '4H',
|
155
155
|
'6h': '6H',
|
156
|
+
'8h': '8H',
|
156
157
|
'12h': '12H',
|
157
158
|
'1d': '1D',
|
159
|
+
'3d': '3D',
|
158
160
|
'1w': '1W',
|
159
161
|
'1M': '1M',
|
160
|
-
'3M': '3M',
|
161
162
|
},
|
162
163
|
'hostname': 'www.blofin.com',
|
163
164
|
'urls': {
|
164
|
-
'logo': 'https://github.com/
|
165
|
+
'logo': 'https://github.com/user-attachments/assets/518cdf80-f05d-4821-a3e3-d48ceb41d73b',
|
165
166
|
'api': {
|
166
167
|
'rest': 'https://openapi.blofin.com',
|
167
168
|
},
|
168
169
|
'referral': {
|
169
|
-
'url': 'https://blofin.com/register?referral_code=
|
170
|
+
'url': 'https://blofin.com/register?referral_code=f79EsS',
|
170
171
|
'discount': 0.05,
|
171
172
|
},
|
172
173
|
'www': 'https://www.blofin.com',
|
@@ -201,6 +202,20 @@ class blofin(Exchange, ImplicitAPI):
|
|
201
202
|
'trade/orders-tpsl-pending': 1,
|
202
203
|
'trade/orders-history': 1,
|
203
204
|
'trade/orders-tpsl-history': 1,
|
205
|
+
'user/query-apikey': 1,
|
206
|
+
'affiliate/basic': 1,
|
207
|
+
'copytrading/instruments': 1,
|
208
|
+
'copytrading/account/balance': 1,
|
209
|
+
'copytrading/account/positions-by-order': 1,
|
210
|
+
'copytrading/account/positions-details-by-order': 1,
|
211
|
+
'copytrading/account/positions-by-contract': 1,
|
212
|
+
'copytrading/account/position-mode': 1,
|
213
|
+
'copytrading/account/leverage-info': 1,
|
214
|
+
'copytrading/trade/orders-pending': 1,
|
215
|
+
'copytrading/trade/pending-tpsl-by-contract': 1,
|
216
|
+
'copytrading/trade/position-history-by-order': 1,
|
217
|
+
'copytrading/trade/orders-history': 1,
|
218
|
+
'copytrading/trade/pending-tpsl-by-order': 1,
|
204
219
|
},
|
205
220
|
'post': {
|
206
221
|
'trade/order': 1,
|
@@ -212,6 +227,16 @@ class blofin(Exchange, ImplicitAPI):
|
|
212
227
|
'trade/cancel-tpsl': 1,
|
213
228
|
'trade/close-position': 1,
|
214
229
|
'asset/transfer': 1,
|
230
|
+
'copytrading/account/set-position-mode': 1,
|
231
|
+
'copytrading/account/set-leverage': 1,
|
232
|
+
'copytrading/trade/place-order': 1,
|
233
|
+
'copytrading/trade/cancel-order': 1,
|
234
|
+
'copytrading/trade/place-tpsl-by-contract': 1,
|
235
|
+
'copytrading/trade/cancel-tpsl-by-contract': 1,
|
236
|
+
'copytrading/trade/place-tpsl-by-order': 1,
|
237
|
+
'copytrading/trade/cancel-tpsl-by-order': 1,
|
238
|
+
'copytrading/trade/close-position-by-order': 1,
|
239
|
+
'copytrading/trade/close-position-by-contract': 1,
|
215
240
|
},
|
216
241
|
},
|
217
242
|
},
|
@@ -226,6 +251,93 @@ class blofin(Exchange, ImplicitAPI):
|
|
226
251
|
'secret': True,
|
227
252
|
'password': True,
|
228
253
|
},
|
254
|
+
'features': {
|
255
|
+
'default': {
|
256
|
+
'sandbox': False,
|
257
|
+
'createOrder': {
|
258
|
+
'timeInForce': {
|
259
|
+
'IOC': True,
|
260
|
+
'FOK': True,
|
261
|
+
'PO': True,
|
262
|
+
'GTD': False,
|
263
|
+
},
|
264
|
+
'leverage': False,
|
265
|
+
'marketBuyRequiresPrice': False,
|
266
|
+
'marketBuyByCost': False,
|
267
|
+
'selfTradePrevention': False,
|
268
|
+
'trailing': False,
|
269
|
+
'iceberg': False,
|
270
|
+
},
|
271
|
+
'createOrders': {
|
272
|
+
'max': 10,
|
273
|
+
},
|
274
|
+
'fetchMyTrades': {
|
275
|
+
'marginMode': False,
|
276
|
+
'limit': 100,
|
277
|
+
'daysBack': 100000,
|
278
|
+
'untilDays': 100000,
|
279
|
+
},
|
280
|
+
'fetchOrder': None,
|
281
|
+
'fetchOpenOrders': {
|
282
|
+
'marginMode': False,
|
283
|
+
'limit': 100,
|
284
|
+
'trigger': True,
|
285
|
+
'trailing': False,
|
286
|
+
},
|
287
|
+
'fetchOrders': None,
|
288
|
+
'fetchClosedOrders': {
|
289
|
+
'marginMode': False,
|
290
|
+
'limit': 1000,
|
291
|
+
'daysBack': 100000,
|
292
|
+
'daysBackCanceled': 1,
|
293
|
+
'untilDays': 100000,
|
294
|
+
'trigger': True,
|
295
|
+
'trailing': False,
|
296
|
+
},
|
297
|
+
'fetchOHLCV': {
|
298
|
+
'max': 1440,
|
299
|
+
},
|
300
|
+
},
|
301
|
+
'spot': {
|
302
|
+
'extends': 'default',
|
303
|
+
'createOrder': {
|
304
|
+
'marginMode': False,
|
305
|
+
'triggerPrice': False,
|
306
|
+
'triggerPriceType': None,
|
307
|
+
'triggerDirection': False,
|
308
|
+
'stopLossPrice': False,
|
309
|
+
'takeProfitPrice': False,
|
310
|
+
'attachedStopLossTakeProfit': None,
|
311
|
+
'hedged': False,
|
312
|
+
},
|
313
|
+
},
|
314
|
+
'forDerivatives': {
|
315
|
+
'extends': 'default',
|
316
|
+
'createOrder': {
|
317
|
+
'marginMode': True,
|
318
|
+
'triggerPrice': False, # todo
|
319
|
+
'triggerPriceType': None,
|
320
|
+
'triggerDirection': False,
|
321
|
+
'stopLossPrice': True,
|
322
|
+
'takeProfitPrice': True,
|
323
|
+
'attachedStopLossTakeProfit': {
|
324
|
+
'triggerPriceType': None,
|
325
|
+
'limit': True,
|
326
|
+
},
|
327
|
+
'hedged': True,
|
328
|
+
},
|
329
|
+
},
|
330
|
+
'swap': {
|
331
|
+
'linear': {
|
332
|
+
'extends': 'forDerivatives',
|
333
|
+
},
|
334
|
+
'inverse': None,
|
335
|
+
},
|
336
|
+
'future': {
|
337
|
+
'linear': None,
|
338
|
+
'inverse': None,
|
339
|
+
},
|
340
|
+
},
|
229
341
|
'exceptions': {
|
230
342
|
'exact': {
|
231
343
|
'400': BadRequest, # Body can not be empty
|
@@ -284,12 +396,19 @@ class blofin(Exchange, ImplicitAPI):
|
|
284
396
|
'brokerId': 'ec6dd3a7dd982d0b',
|
285
397
|
'accountsByType': {
|
286
398
|
'swap': 'futures',
|
399
|
+
'funding': 'funding',
|
287
400
|
'future': 'futures',
|
401
|
+
'copy_trading': 'copy_trading',
|
402
|
+
'earn': 'earn',
|
403
|
+
'spot': 'spot',
|
288
404
|
},
|
289
405
|
'accountsById': {
|
406
|
+
'funding': 'funding',
|
290
407
|
'futures': 'swap',
|
408
|
+
'copy_trading': 'copy_trading',
|
409
|
+
'earn': 'earn',
|
410
|
+
'spot': 'spot',
|
291
411
|
},
|
292
|
-
'sandboxMode': False,
|
293
412
|
'defaultNetwork': 'ERC20',
|
294
413
|
'defaultNetworks': {
|
295
414
|
'ETH': 'ERC20',
|
@@ -355,10 +474,12 @@ class blofin(Exchange, ImplicitAPI):
|
|
355
474
|
},
|
356
475
|
})
|
357
476
|
|
358
|
-
async def fetch_markets(self, params={}):
|
477
|
+
async def fetch_markets(self, params={}) -> List[Market]:
|
359
478
|
"""
|
360
479
|
retrieves data on all markets for blofin
|
361
|
-
|
480
|
+
|
481
|
+
https://blofin.com/docs#get-instruments
|
482
|
+
|
362
483
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
363
484
|
:returns dict[]: an array of objects representing market data
|
364
485
|
"""
|
@@ -366,7 +487,7 @@ class blofin(Exchange, ImplicitAPI):
|
|
366
487
|
data = self.safe_list(response, 'data', [])
|
367
488
|
return self.parse_markets(data)
|
368
489
|
|
369
|
-
def parse_market(self, market) -> Market:
|
490
|
+
def parse_market(self, market: dict) -> Market:
|
370
491
|
id = self.safe_string(market, 'instId')
|
371
492
|
type = self.safe_string_lower(market, 'instType')
|
372
493
|
spot = (type == 'spot')
|
@@ -448,7 +569,9 @@ class blofin(Exchange, ImplicitAPI):
|
|
448
569
|
async def fetch_order_book(self, symbol: str, limit: Int = None, params={}) -> OrderBook:
|
449
570
|
"""
|
450
571
|
fetches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
|
451
|
-
|
572
|
+
|
573
|
+
https://blofin.com/docs#get-order-book
|
574
|
+
|
452
575
|
:param str symbol: unified symbol of the market to fetch the order book for
|
453
576
|
:param int [limit]: the maximum amount of order book entries to return
|
454
577
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
@@ -456,7 +579,7 @@ class blofin(Exchange, ImplicitAPI):
|
|
456
579
|
"""
|
457
580
|
await self.load_markets()
|
458
581
|
market = self.market(symbol)
|
459
|
-
request = {
|
582
|
+
request: dict = {
|
460
583
|
'instId': market['id'],
|
461
584
|
}
|
462
585
|
limit = 50 if (limit is None) else limit
|
@@ -489,7 +612,26 @@ class blofin(Exchange, ImplicitAPI):
|
|
489
612
|
timestamp = self.safe_integer(first, 'ts')
|
490
613
|
return self.parse_order_book(first, symbol, timestamp)
|
491
614
|
|
492
|
-
def parse_ticker(self, ticker, market: Market = None) -> Ticker:
|
615
|
+
def parse_ticker(self, ticker: dict, market: Market = None) -> Ticker:
|
616
|
+
#
|
617
|
+
# response similar for REST & WS
|
618
|
+
#
|
619
|
+
# {
|
620
|
+
# instId: "ADA-USDT",
|
621
|
+
# ts: "1707736811486",
|
622
|
+
# last: "0.5315",
|
623
|
+
# lastSize: "4",
|
624
|
+
# askPrice: "0.5318",
|
625
|
+
# askSize: "248",
|
626
|
+
# bidPrice: "0.5315",
|
627
|
+
# bidSize: "63",
|
628
|
+
# open24h: "0.5555",
|
629
|
+
# high24h: "0.5563",
|
630
|
+
# low24h: "0.5315",
|
631
|
+
# volCurrency24h: "198560100",
|
632
|
+
# vol24h: "1985601",
|
633
|
+
# }
|
634
|
+
#
|
493
635
|
timestamp = self.safe_integer(ticker, 'ts')
|
494
636
|
marketId = self.safe_string(ticker, 'instId')
|
495
637
|
market = self.safe_market(marketId, market, '-')
|
@@ -521,20 +663,24 @@ class blofin(Exchange, ImplicitAPI):
|
|
521
663
|
'average': None,
|
522
664
|
'baseVolume': baseVolume,
|
523
665
|
'quoteVolume': quoteVolume,
|
666
|
+
'indexPrice': self.safe_string(ticker, 'indexPrice'),
|
667
|
+
'markPrice': self.safe_string(ticker, 'markPrice'),
|
524
668
|
'info': ticker,
|
525
669
|
}, market)
|
526
670
|
|
527
671
|
async def fetch_ticker(self, symbol: str, params={}) -> Ticker:
|
528
672
|
"""
|
529
673
|
fetches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
|
530
|
-
|
674
|
+
|
675
|
+
https://blofin.com/docs#get-tickers
|
676
|
+
|
531
677
|
:param str symbol: unified symbol of the market to fetch the ticker for
|
532
678
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
533
679
|
:returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
|
534
680
|
"""
|
535
681
|
await self.load_markets()
|
536
682
|
market = self.market(symbol)
|
537
|
-
request = {
|
683
|
+
request: dict = {
|
538
684
|
'instId': market['id'],
|
539
685
|
}
|
540
686
|
response = await self.publicGetMarketTickers(self.extend(request, params))
|
@@ -542,10 +688,33 @@ class blofin(Exchange, ImplicitAPI):
|
|
542
688
|
first = self.safe_dict(data, 0, {})
|
543
689
|
return self.parse_ticker(first, market)
|
544
690
|
|
691
|
+
async def fetch_mark_price(self, symbol: str, params={}) -> Ticker:
|
692
|
+
"""
|
693
|
+
fetches mark price for the market
|
694
|
+
|
695
|
+
https://docs.blofin.com/index.html#get-mark-price
|
696
|
+
|
697
|
+
:param str symbol: unified market symbol
|
698
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
699
|
+
:param str [params.subType]: "linear" or "inverse"
|
700
|
+
:returns dict: a dictionary of `ticker structures <https://docs.ccxt.com/#/?id=ticker-structure>`
|
701
|
+
"""
|
702
|
+
await self.load_markets()
|
703
|
+
market = self.market(symbol)
|
704
|
+
request = {
|
705
|
+
'symbol': market['id'],
|
706
|
+
}
|
707
|
+
response = await self.publicGetMarketMarkPrice(self.extend(request, params))
|
708
|
+
data = self.safe_list(response, 'data', [])
|
709
|
+
first = self.safe_dict(data, 0, {})
|
710
|
+
return self.parse_ticker(first, market)
|
711
|
+
|
545
712
|
async def fetch_tickers(self, symbols: Strings = None, params={}) -> Tickers:
|
546
713
|
"""
|
547
714
|
fetches price tickers for multiple markets, statistical information calculated over the past 24 hours for each market
|
548
|
-
|
715
|
+
|
716
|
+
https://blofin.com/docs#get-tickers
|
717
|
+
|
549
718
|
:param str[] [symbols]: unified symbols of the markets to fetch the ticker for, all market tickers are returned if not assigned
|
550
719
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
551
720
|
:returns dict: a dictionary of `ticker structures <https://docs.ccxt.com/#/?id=ticker-structure>`
|
@@ -556,9 +725,10 @@ class blofin(Exchange, ImplicitAPI):
|
|
556
725
|
tickers = self.safe_list(response, 'data', [])
|
557
726
|
return self.parse_tickers(tickers, symbols)
|
558
727
|
|
559
|
-
def parse_trade(self, trade, market: Market = None) -> Trade:
|
728
|
+
def parse_trade(self, trade: dict, market: Market = None) -> Trade:
|
729
|
+
#
|
730
|
+
# fetch trades(response similar for REST & WS)
|
560
731
|
#
|
561
|
-
# fetch trades
|
562
732
|
# {
|
563
733
|
# "tradeId": "3263934920",
|
564
734
|
# "instId": "LTC-USDT",
|
@@ -567,6 +737,7 @@ class blofin(Exchange, ImplicitAPI):
|
|
567
737
|
# "side": "buy",
|
568
738
|
# "ts": "1707232020854"
|
569
739
|
# }
|
740
|
+
#
|
570
741
|
# my trades
|
571
742
|
# {
|
572
743
|
# "instId": "LTC-USDT",
|
@@ -617,7 +788,9 @@ class blofin(Exchange, ImplicitAPI):
|
|
617
788
|
async def fetch_trades(self, symbol: str, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
|
618
789
|
"""
|
619
790
|
get the list of most recent trades for a particular symbol
|
620
|
-
|
791
|
+
|
792
|
+
https://blofin.com/docs#get-trades
|
793
|
+
|
621
794
|
:param str symbol: unified symbol of the market to fetch trades for
|
622
795
|
:param int [since]: timestamp in ms of the earliest trade to fetch
|
623
796
|
:param int [limit]: the maximum amount of trades to fetch
|
@@ -631,7 +804,7 @@ class blofin(Exchange, ImplicitAPI):
|
|
631
804
|
if paginate:
|
632
805
|
return await self.fetch_paginated_call_cursor('fetchTrades', symbol, since, limit, params, 'tradeId', 'after', None, 100)
|
633
806
|
market = self.market(symbol)
|
634
|
-
request = {
|
807
|
+
request: dict = {
|
635
808
|
'instId': market['id'],
|
636
809
|
}
|
637
810
|
response = None
|
@@ -670,7 +843,9 @@ class blofin(Exchange, ImplicitAPI):
|
|
670
843
|
async def fetch_ohlcv(self, symbol: str, timeframe='1m', since: Int = None, limit: Int = None, params={}) -> List[list]:
|
671
844
|
"""
|
672
845
|
fetches historical candlestick data containing the open, high, low, and close price, and the volume of a market
|
673
|
-
|
846
|
+
|
847
|
+
https://blofin.com/docs#get-candlesticks
|
848
|
+
|
674
849
|
:param str symbol: unified symbol of the market to fetch OHLCV data for
|
675
850
|
:param str timeframe: the length of time each candle represents
|
676
851
|
:param int [since]: timestamp in ms of the earliest candle to fetch
|
@@ -688,7 +863,7 @@ class blofin(Exchange, ImplicitAPI):
|
|
688
863
|
return await self.fetch_paginated_call_deterministic('fetchOHLCV', symbol, since, limit, timeframe, params, 100)
|
689
864
|
if limit is None:
|
690
865
|
limit = 100 # default 100, max 100
|
691
|
-
request = {
|
866
|
+
request: dict = {
|
692
867
|
'instId': market['id'],
|
693
868
|
'bar': self.safe_string(self.timeframes, timeframe, timeframe),
|
694
869
|
'limit': limit,
|
@@ -705,7 +880,9 @@ class blofin(Exchange, ImplicitAPI):
|
|
705
880
|
async def fetch_funding_rate_history(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}):
|
706
881
|
"""
|
707
882
|
fetches historical funding rate prices
|
708
|
-
|
883
|
+
|
884
|
+
https://blofin.com/docs#get-funding-rate-history
|
885
|
+
|
709
886
|
:param str symbol: unified symbol of the market to fetch the funding rate history for
|
710
887
|
:param int [since]: timestamp in ms of the earliest funding rate to fetch
|
711
888
|
:param int [limit]: the maximum amount of `funding rate structures <https://docs.ccxt.com/#/?id=funding-rate-history-structure>` to fetch
|
@@ -721,7 +898,7 @@ class blofin(Exchange, ImplicitAPI):
|
|
721
898
|
if paginate:
|
722
899
|
return await self.fetch_paginated_call_deterministic('fetchFundingRateHistory', symbol, since, limit, '8h', params)
|
723
900
|
market = self.market(symbol)
|
724
|
-
request = {
|
901
|
+
request: dict = {
|
725
902
|
'instId': market['id'],
|
726
903
|
}
|
727
904
|
if since is not None:
|
@@ -744,23 +921,16 @@ class blofin(Exchange, ImplicitAPI):
|
|
744
921
|
sorted = self.sort_by(rates, 'timestamp')
|
745
922
|
return self.filter_by_symbol_since_limit(sorted, market['symbol'], since, limit)
|
746
923
|
|
747
|
-
def parse_funding_rate(self, contract, market: Market = None):
|
924
|
+
def parse_funding_rate(self, contract, market: Market = None) -> FundingRate:
|
748
925
|
#
|
749
926
|
# {
|
750
927
|
# "fundingRate": "0.00027815",
|
751
928
|
# "fundingTime": "1634256000000",
|
752
929
|
# "instId": "BTC-USD-SWAP",
|
753
|
-
# "instType": "SWAP",
|
754
|
-
# "nextFundingRate": "0.00017",
|
755
|
-
# "nextFundingTime": "1634284800000"
|
756
930
|
# }
|
757
931
|
#
|
758
|
-
# in the response above nextFundingRate is actually two funding rates from now
|
759
|
-
#
|
760
|
-
nextFundingRateTimestamp = self.safe_integer(contract, 'nextFundingTime')
|
761
932
|
marketId = self.safe_string(contract, 'instId')
|
762
933
|
symbol = self.safe_symbol(marketId, market)
|
763
|
-
nextFundingRate = self.safe_number(contract, 'nextFundingRate')
|
764
934
|
fundingTime = self.safe_integer(contract, 'fundingTime')
|
765
935
|
# > The current interest is 0.
|
766
936
|
return {
|
@@ -775,18 +945,21 @@ class blofin(Exchange, ImplicitAPI):
|
|
775
945
|
'fundingRate': self.safe_number(contract, 'fundingRate'),
|
776
946
|
'fundingTimestamp': fundingTime,
|
777
947
|
'fundingDatetime': self.iso8601(fundingTime),
|
778
|
-
'nextFundingRate':
|
779
|
-
'nextFundingTimestamp':
|
780
|
-
'nextFundingDatetime':
|
948
|
+
'nextFundingRate': None,
|
949
|
+
'nextFundingTimestamp': None,
|
950
|
+
'nextFundingDatetime': None,
|
781
951
|
'previousFundingRate': None,
|
782
952
|
'previousFundingTimestamp': None,
|
783
953
|
'previousFundingDatetime': None,
|
954
|
+
'interval': None,
|
784
955
|
}
|
785
956
|
|
786
|
-
async def fetch_funding_rate(self, symbol: str, params={}):
|
957
|
+
async def fetch_funding_rate(self, symbol: str, params={}) -> FundingRate:
|
787
958
|
"""
|
788
959
|
fetch the current funding rate
|
789
|
-
|
960
|
+
|
961
|
+
https://blofin.com/docs#get-funding-rate
|
962
|
+
|
790
963
|
:param str symbol: unified market symbol
|
791
964
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
792
965
|
:returns dict: a `funding rate structure <https://docs.ccxt.com/#/?id=funding-rate-structure>`
|
@@ -795,7 +968,7 @@ class blofin(Exchange, ImplicitAPI):
|
|
795
968
|
market = self.market(symbol)
|
796
969
|
if not market['swap']:
|
797
970
|
raise ExchangeError(self.id + ' fetchFundingRate() is only valid for swap markets')
|
798
|
-
request = {
|
971
|
+
request: dict = {
|
799
972
|
'instId': market['id'],
|
800
973
|
}
|
801
974
|
response = await self.publicGetMarketFundingRate(self.extend(request, params))
|
@@ -807,9 +980,6 @@ class blofin(Exchange, ImplicitAPI):
|
|
807
980
|
# "fundingRate": "0.00027815",
|
808
981
|
# "fundingTime": "1634256000000",
|
809
982
|
# "instId": "BTC-USD-SWAP",
|
810
|
-
# "instType": "SWAP",
|
811
|
-
# "nextFundingRate": "0.00017",
|
812
|
-
# "nextFundingTime": "1634284800000"
|
813
983
|
# }
|
814
984
|
# ],
|
815
985
|
# "msg": ""
|
@@ -819,13 +989,16 @@ class blofin(Exchange, ImplicitAPI):
|
|
819
989
|
entry = self.safe_dict(data, 0, {})
|
820
990
|
return self.parse_funding_rate(entry, market)
|
821
991
|
|
822
|
-
def parse_balance_by_type(self,
|
823
|
-
|
992
|
+
def parse_balance_by_type(self, response):
|
993
|
+
data = self.safe_list(response, 'data')
|
994
|
+
if (data is not None) and isinstance(data, list):
|
824
995
|
return self.parse_funding_balance(response)
|
825
996
|
else:
|
826
|
-
return self.
|
997
|
+
return self.parse_balance(response)
|
827
998
|
|
828
|
-
def
|
999
|
+
def parse_balance(self, response):
|
1000
|
+
#
|
1001
|
+
# "data" similar for REST & WS
|
829
1002
|
#
|
830
1003
|
# {
|
831
1004
|
# "code": "0",
|
@@ -847,13 +1020,14 @@ class blofin(Exchange, ImplicitAPI):
|
|
847
1020
|
# "orderFrozen": "14920.994472632597427761",
|
848
1021
|
# "equityUsd": "10011254.077985990315787910",
|
849
1022
|
# "isolatedUnrealizedPnl": "-22.151999999999999999952",
|
850
|
-
# "bonus": "0"
|
1023
|
+
# "bonus": "0" # present only in REST
|
1024
|
+
# "unrealizedPnl": "0" # present only in WS
|
851
1025
|
# }
|
852
1026
|
# ]
|
853
1027
|
# }
|
854
1028
|
# }
|
855
1029
|
#
|
856
|
-
result = {'info': response}
|
1030
|
+
result: dict = {'info': response}
|
857
1031
|
data = self.safe_dict(response, 'data', {})
|
858
1032
|
timestamp = self.safe_integer(data, 'ts')
|
859
1033
|
details = self.safe_list(data, 'details', [])
|
@@ -892,7 +1066,7 @@ class blofin(Exchange, ImplicitAPI):
|
|
892
1066
|
# ]
|
893
1067
|
# }
|
894
1068
|
#
|
895
|
-
result = {'info': response}
|
1069
|
+
result: dict = {'info': response}
|
896
1070
|
data = self.safe_list(response, 'data', [])
|
897
1071
|
for i in range(0, len(data)):
|
898
1072
|
balance = data[i]
|
@@ -906,42 +1080,46 @@ class blofin(Exchange, ImplicitAPI):
|
|
906
1080
|
result[code] = account
|
907
1081
|
return self.safe_balance(result)
|
908
1082
|
|
909
|
-
def parse_trading_fee(self, fee, market: Market = None):
|
1083
|
+
def parse_trading_fee(self, fee: dict, market: Market = None) -> TradingFeeInterface:
|
910
1084
|
return {
|
911
1085
|
'info': fee,
|
912
1086
|
'symbol': self.safe_symbol(None, market),
|
913
1087
|
# blofin returns the fees values opposed to other exchanges, so the sign needs to be flipped
|
914
1088
|
'maker': self.parse_number(Precise.string_neg(self.safe_string_2(fee, 'maker', 'makerU'))),
|
915
1089
|
'taker': self.parse_number(Precise.string_neg(self.safe_string_2(fee, 'taker', 'takerU'))),
|
1090
|
+
'percentage': None,
|
1091
|
+
'tierBased': None,
|
916
1092
|
}
|
917
1093
|
|
918
1094
|
async def fetch_balance(self, params={}) -> Balances:
|
919
1095
|
"""
|
920
1096
|
query for balance and get the amount of funds available for trading or funds locked in orders
|
921
|
-
|
922
|
-
|
1097
|
+
|
1098
|
+
https://blofin.com/docs#get-balance
|
1099
|
+
https://blofin.com/docs#get-futures-account-balance
|
1100
|
+
|
923
1101
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
924
1102
|
:param str [params.accountType]: the type of account to fetch the balance for, either 'funding' or 'futures' or 'copy_trading' or 'earn'
|
925
1103
|
:returns dict: a `balance structure <https://docs.ccxt.com/#/?id=balance-structure>`
|
926
1104
|
"""
|
927
1105
|
await self.load_markets()
|
928
|
-
accountType =
|
929
|
-
params = self.
|
930
|
-
request = {
|
1106
|
+
accountType = None
|
1107
|
+
accountType, params = self.handle_option_and_params_2(params, 'fetchBalance', 'accountType', 'type')
|
1108
|
+
request: dict = {
|
931
1109
|
}
|
932
1110
|
response = None
|
933
|
-
if accountType is not None:
|
1111
|
+
if accountType is not None and accountType != 'swap':
|
934
1112
|
options = self.safe_dict(self.options, 'accountsByType', {})
|
935
1113
|
parsedAccountType = self.safe_string(options, accountType, accountType)
|
936
1114
|
request['accountType'] = parsedAccountType
|
937
1115
|
response = await self.privateGetAssetBalances(self.extend(request, params))
|
938
1116
|
else:
|
939
1117
|
response = await self.privateGetAccountBalance(self.extend(request, params))
|
940
|
-
return self.parse_balance_by_type(
|
1118
|
+
return self.parse_balance_by_type(response)
|
941
1119
|
|
942
1120
|
def create_order_request(self, symbol: str, type: OrderType, side: OrderSide, amount: float, price: Num = None, params={}):
|
943
1121
|
market = self.market(symbol)
|
944
|
-
request = {
|
1122
|
+
request: dict = {
|
945
1123
|
'instId': market['id'],
|
946
1124
|
'side': side,
|
947
1125
|
'orderType': type,
|
@@ -982,8 +1160,8 @@ class blofin(Exchange, ImplicitAPI):
|
|
982
1160
|
request['tpOrderPrice'] = self.price_to_precision(symbol, tpPrice)
|
983
1161
|
return self.extend(request, params)
|
984
1162
|
|
985
|
-
def parse_order_status(self, status):
|
986
|
-
statuses = {
|
1163
|
+
def parse_order_status(self, status: Str):
|
1164
|
+
statuses: dict = {
|
987
1165
|
'canceled': 'canceled',
|
988
1166
|
'order_failed': 'canceled',
|
989
1167
|
'live': 'open',
|
@@ -993,7 +1171,9 @@ class blofin(Exchange, ImplicitAPI):
|
|
993
1171
|
}
|
994
1172
|
return self.safe_string(statuses, status, status)
|
995
1173
|
|
996
|
-
def parse_order(self, order, market: Market = None) -> Order:
|
1174
|
+
def parse_order(self, order: dict, market: Market = None) -> Order:
|
1175
|
+
#
|
1176
|
+
# response similar for REST & WS
|
997
1177
|
#
|
998
1178
|
# {
|
999
1179
|
# "orderId": "2075628533",
|
@@ -1022,6 +1202,9 @@ class blofin(Exchange, ImplicitAPI):
|
|
1022
1202
|
# "cancelSource": "not_canceled",
|
1023
1203
|
# "cancelSourceReason": null,
|
1024
1204
|
# "brokerId": "ec6dd3a7dd982d0b"
|
1205
|
+
# "filled_amount": "1.000000000000000000", # filledAmount in "ws" watchOrders
|
1206
|
+
# "cancelSource": "", # only in WS
|
1207
|
+
# "instType": "SWAP", # only in WS
|
1025
1208
|
# }
|
1026
1209
|
#
|
1027
1210
|
id = self.safe_string_2(order, 'tpslId', 'orderId')
|
@@ -1108,20 +1291,22 @@ class blofin(Exchange, ImplicitAPI):
|
|
1108
1291
|
async def create_order(self, symbol: str, type: OrderType, side: OrderSide, amount: float, price: Num = None, params={}) -> Order:
|
1109
1292
|
"""
|
1110
1293
|
create a trade order
|
1111
|
-
|
1112
|
-
|
1294
|
+
|
1295
|
+
https://blofin.com/docs#place-order
|
1296
|
+
https://blofin.com/docs#place-tpsl-order
|
1297
|
+
|
1113
1298
|
:param str symbol: unified symbol of the market to create an order in
|
1114
1299
|
:param str type: 'market' or 'limit' or 'post_only' or 'ioc' or 'fok'
|
1115
1300
|
:param str side: 'buy' or 'sell'
|
1116
1301
|
:param float amount: how much of currency you want to trade in units of base currency
|
1117
|
-
:param float [price]: the price at which the order is to be
|
1302
|
+
:param float [price]: the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
|
1118
1303
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
1119
1304
|
:param bool [params.reduceOnly]: a mark to reduce the position size for margin, swap and future orders
|
1120
1305
|
:param bool [params.postOnly]: True to place a post only order
|
1121
1306
|
:param str [params.marginMode]: 'cross' or 'isolated', default is 'cross'
|
1122
1307
|
:param float [params.stopLossPrice]: stop loss trigger price(will use privatePostTradeOrderTpsl)
|
1123
1308
|
:param float [params.takeProfitPrice]: take profit trigger price(will use privatePostTradeOrderTpsl)
|
1124
|
-
:param str [
|
1309
|
+
:param str [params.positionSide]: *stopLossPrice/takeProfitPrice orders only* 'long' or 'short' or 'net' default is 'net'
|
1125
1310
|
:param str [params.clientOrderId]: a unique id for the order
|
1126
1311
|
:param dict [params.takeProfit]: *takeProfit object in params* containing the triggerPrice at which the attached take profit order will be triggered
|
1127
1312
|
:param float [params.takeProfit.triggerPrice]: take profit trigger price
|
@@ -1157,7 +1342,7 @@ class blofin(Exchange, ImplicitAPI):
|
|
1157
1342
|
def create_tpsl_order_request(self, symbol: str, type: OrderType, side: OrderSide, amount: Num = None, price: Num = None, params={}):
|
1158
1343
|
market = self.market(symbol)
|
1159
1344
|
positionSide = self.safe_string(params, 'positionSide', 'net')
|
1160
|
-
request = {
|
1345
|
+
request: dict = {
|
1161
1346
|
'instId': market['id'],
|
1162
1347
|
'side': side,
|
1163
1348
|
'positionSide': positionSide,
|
@@ -1189,26 +1374,37 @@ class blofin(Exchange, ImplicitAPI):
|
|
1189
1374
|
async def cancel_order(self, id: str, symbol: Str = None, params={}):
|
1190
1375
|
"""
|
1191
1376
|
cancels an open order
|
1192
|
-
|
1193
|
-
|
1377
|
+
|
1378
|
+
https://blofin.com/docs#cancel-order
|
1379
|
+
https://blofin.com/docs#cancel-tpsl-order
|
1380
|
+
|
1194
1381
|
:param str id: order id
|
1195
1382
|
:param str symbol: unified symbol of the market the order was made in
|
1196
1383
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
1384
|
+
:param boolean [params.trigger]: True if cancelling a trigger/conditional order/tp sl orders
|
1197
1385
|
:returns dict: An `order structure <https://docs.ccxt.com/#/?id=order-structure>`
|
1198
1386
|
"""
|
1199
1387
|
if symbol is None:
|
1200
1388
|
raise ArgumentsRequired(self.id + ' cancelOrder() requires a symbol argument')
|
1201
1389
|
await self.load_markets()
|
1202
1390
|
market = self.market(symbol)
|
1203
|
-
request = {
|
1391
|
+
request: dict = {
|
1204
1392
|
'instId': market['id'],
|
1205
1393
|
}
|
1394
|
+
isTrigger = self.safe_bool_n(params, ['stop', 'trigger', 'tpsl'], False)
|
1206
1395
|
clientOrderId = self.safe_string(params, 'clientOrderId')
|
1207
1396
|
if clientOrderId is not None:
|
1208
1397
|
request['clientOrderId'] = clientOrderId
|
1209
1398
|
else:
|
1210
|
-
|
1211
|
-
|
1399
|
+
if not isTrigger:
|
1400
|
+
request['orderId'] = str(id)
|
1401
|
+
else:
|
1402
|
+
request['tpslId'] = str(id)
|
1403
|
+
query = self.omit(params, ['orderId', 'clientOrderId', 'stop', 'trigger', 'tpsl'])
|
1404
|
+
if isTrigger:
|
1405
|
+
tpslResponse = await self.cancel_orders([id], symbol, params)
|
1406
|
+
first = self.safe_dict(tpslResponse, 0)
|
1407
|
+
return first
|
1212
1408
|
response = await self.privatePostTradeCancelOrder(self.extend(request, query))
|
1213
1409
|
data = self.safe_list(response, 'data', [])
|
1214
1410
|
order = self.safe_dict(data, 0)
|
@@ -1217,8 +1413,11 @@ class blofin(Exchange, ImplicitAPI):
|
|
1217
1413
|
async def create_orders(self, orders: List[OrderRequest], params={}) -> List[Order]:
|
1218
1414
|
"""
|
1219
1415
|
create a list of trade orders
|
1220
|
-
|
1416
|
+
|
1417
|
+
https://blofin.com/docs#place-multiple-orders
|
1418
|
+
|
1221
1419
|
:param Array orders: list of orders to create, each object should contain the parameters required by createOrder, namely symbol, type, side, amount, price and params
|
1420
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
1222
1421
|
:returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
|
1223
1422
|
"""
|
1224
1423
|
await self.load_markets()
|
@@ -1241,13 +1440,15 @@ class blofin(Exchange, ImplicitAPI):
|
|
1241
1440
|
async def fetch_open_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
|
1242
1441
|
"""
|
1243
1442
|
Fetch orders that are still open
|
1244
|
-
|
1245
|
-
|
1443
|
+
|
1444
|
+
https://blofin.com/docs#get-active-orders
|
1445
|
+
https://blofin.com/docs#get-active-tpsl-orders
|
1446
|
+
|
1246
1447
|
:param str symbol: unified market symbol
|
1247
1448
|
:param int [since]: the earliest time in ms to fetch open orders for
|
1248
1449
|
:param int [limit]: the maximum number of open orders structures to retrieve
|
1249
1450
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
1250
|
-
:param bool [params.
|
1451
|
+
:param bool [params.trigger]: True if fetching trigger or conditional orders
|
1251
1452
|
:param boolean [params.paginate]: default False, when True will automatically paginate by calling self endpoint multiple times. See in the docs all the [availble parameters](https://github.com/ccxt/ccxt/wiki/Manual#pagination-params)
|
1252
1453
|
:returns Order[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
|
1253
1454
|
"""
|
@@ -1256,7 +1457,7 @@ class blofin(Exchange, ImplicitAPI):
|
|
1256
1457
|
paginate, params = self.handle_option_and_params(params, 'fetchOpenOrders', 'paginate')
|
1257
1458
|
if paginate:
|
1258
1459
|
return await self.fetch_paginated_call_dynamic('fetchOpenOrders', symbol, since, limit, params)
|
1259
|
-
request = {
|
1460
|
+
request: dict = {
|
1260
1461
|
}
|
1261
1462
|
market = None
|
1262
1463
|
if symbol is not None:
|
@@ -1264,12 +1465,12 @@ class blofin(Exchange, ImplicitAPI):
|
|
1264
1465
|
request['instId'] = market['id']
|
1265
1466
|
if limit is not None:
|
1266
1467
|
request['limit'] = limit # default 100, max 100
|
1267
|
-
|
1468
|
+
isTrigger = self.safe_bool_n(params, ['stop', 'trigger', 'tpsl', 'TPSL'], False)
|
1268
1469
|
method: Str = None
|
1269
1470
|
method, params = self.handle_option_and_params(params, 'fetchOpenOrders', 'method', 'privateGetTradeOrdersPending')
|
1270
1471
|
query = self.omit(params, ['method', 'stop', 'trigger', 'tpsl', 'TPSL'])
|
1271
1472
|
response = None
|
1272
|
-
if
|
1473
|
+
if isTrigger or (method == 'privateGetTradeOrdersTpslPending'):
|
1273
1474
|
response = await self.privateGetTradeOrdersTpslPending(self.extend(request, query))
|
1274
1475
|
else:
|
1275
1476
|
response = await self.privateGetTradeOrdersPending(self.extend(request, query))
|
@@ -1279,7 +1480,9 @@ class blofin(Exchange, ImplicitAPI):
|
|
1279
1480
|
async def fetch_my_trades(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
|
1280
1481
|
"""
|
1281
1482
|
fetch all trades made by the user
|
1282
|
-
|
1483
|
+
|
1484
|
+
https://blofin.com/docs#get-trade-history
|
1485
|
+
|
1283
1486
|
:param str symbol: unified market symbol
|
1284
1487
|
:param int [since]: the earliest time in ms to fetch trades for
|
1285
1488
|
:param int [limit]: the maximum number of trades structures to retrieve
|
@@ -1293,7 +1496,7 @@ class blofin(Exchange, ImplicitAPI):
|
|
1293
1496
|
paginate, params = self.handle_option_and_params(params, 'fetchMyTrades', 'paginate')
|
1294
1497
|
if paginate:
|
1295
1498
|
return await self.fetch_paginated_call_dynamic('fetchMyTrades', symbol, since, limit, params)
|
1296
|
-
request = {
|
1499
|
+
request: dict = {
|
1297
1500
|
}
|
1298
1501
|
market = None
|
1299
1502
|
if symbol is not None:
|
@@ -1309,7 +1512,9 @@ class blofin(Exchange, ImplicitAPI):
|
|
1309
1512
|
async def fetch_deposits(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Transaction]:
|
1310
1513
|
"""
|
1311
1514
|
fetch all deposits made to an account
|
1312
|
-
|
1515
|
+
|
1516
|
+
https://blofin.com/docs#get-deposite-history
|
1517
|
+
|
1313
1518
|
:param str code: unified currency code
|
1314
1519
|
:param int [since]: the earliest time in ms to fetch deposits for
|
1315
1520
|
:param int [limit]: the maximum number of deposits structures to retrieve
|
@@ -1323,7 +1528,7 @@ class blofin(Exchange, ImplicitAPI):
|
|
1323
1528
|
paginate, params = self.handle_option_and_params(params, 'fetchDeposits', 'paginate')
|
1324
1529
|
if paginate:
|
1325
1530
|
return await self.fetch_paginated_call_dynamic('fetchDeposits', code, since, limit, params)
|
1326
|
-
request = {
|
1531
|
+
request: dict = {
|
1327
1532
|
}
|
1328
1533
|
currency = None
|
1329
1534
|
if code is not None:
|
@@ -1341,7 +1546,9 @@ class blofin(Exchange, ImplicitAPI):
|
|
1341
1546
|
async def fetch_withdrawals(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Transaction]:
|
1342
1547
|
"""
|
1343
1548
|
fetch all withdrawals made from an account
|
1344
|
-
|
1549
|
+
|
1550
|
+
https://blofin.com/docs#get-withdraw-history
|
1551
|
+
|
1345
1552
|
:param str code: unified currency code
|
1346
1553
|
:param int [since]: the earliest time in ms to fetch withdrawals for
|
1347
1554
|
:param int [limit]: the maximum number of withdrawals structures to retrieve
|
@@ -1355,7 +1562,7 @@ class blofin(Exchange, ImplicitAPI):
|
|
1355
1562
|
paginate, params = self.handle_option_and_params(params, 'fetchWithdrawals', 'paginate')
|
1356
1563
|
if paginate:
|
1357
1564
|
return await self.fetch_paginated_call_dynamic('fetchWithdrawals', code, since, limit, params)
|
1358
|
-
request = {
|
1565
|
+
request: dict = {
|
1359
1566
|
}
|
1360
1567
|
currency = None
|
1361
1568
|
if code is not None:
|
@@ -1370,25 +1577,27 @@ class blofin(Exchange, ImplicitAPI):
|
|
1370
1577
|
data = self.safe_list(response, 'data', [])
|
1371
1578
|
return self.parse_transactions(data, currency, since, limit, params)
|
1372
1579
|
|
1373
|
-
async def fetch_ledger(self, code: Str = None, since: Int = None, limit: Int = None, params={}):
|
1580
|
+
async def fetch_ledger(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[LedgerEntry]:
|
1374
1581
|
"""
|
1375
|
-
fetch the history of changes, actions done by the user or operations that altered balance of the user
|
1376
|
-
|
1377
|
-
|
1582
|
+
fetch the history of changes, actions done by the user or operations that altered the balance of the user
|
1583
|
+
|
1584
|
+
https://blofin.com/docs#get-funds-transfer-history
|
1585
|
+
|
1586
|
+
:param str [code]: unified currency code, default is None
|
1378
1587
|
:param int [since]: timestamp in ms of the earliest ledger entry, default is None
|
1379
|
-
:param int [limit]: max number of ledger
|
1588
|
+
:param int [limit]: max number of ledger entries to return, default is None
|
1380
1589
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
1381
1590
|
:param str [params.marginMode]: 'cross' or 'isolated'
|
1382
1591
|
:param int [params.until]: the latest time in ms to fetch entries for
|
1383
|
-
:param boolean [params.paginate]: default False, when True will automatically paginate by calling self endpoint multiple times. See in the docs all the [
|
1384
|
-
:returns dict: a `ledger structure <https://docs.ccxt.com/#/?id=ledger
|
1592
|
+
:param boolean [params.paginate]: default False, when True will automatically paginate by calling self endpoint multiple times. See in the docs all the [available parameters](https://github.com/ccxt/ccxt/wiki/Manual#pagination-params)
|
1593
|
+
:returns dict: a `ledger structure <https://docs.ccxt.com/#/?id=ledger>`
|
1385
1594
|
"""
|
1386
1595
|
await self.load_markets()
|
1387
1596
|
paginate = False
|
1388
1597
|
paginate, params = self.handle_option_and_params(params, 'fetchLedger', 'paginate')
|
1389
1598
|
if paginate:
|
1390
1599
|
return await self.fetch_paginated_call_dynamic('fetchLedger', code, since, limit, params)
|
1391
|
-
request = {
|
1600
|
+
request: dict = {
|
1392
1601
|
}
|
1393
1602
|
if limit is not None:
|
1394
1603
|
request['limit'] = limit
|
@@ -1402,7 +1611,7 @@ class blofin(Exchange, ImplicitAPI):
|
|
1402
1611
|
data = self.safe_list(response, 'data', [])
|
1403
1612
|
return self.parse_ledger(data, currency, since, limit)
|
1404
1613
|
|
1405
|
-
def parse_transaction(self, transaction, currency: Currency = None) -> Transaction:
|
1614
|
+
def parse_transaction(self, transaction: dict, currency: Currency = None) -> Transaction:
|
1406
1615
|
#
|
1407
1616
|
#
|
1408
1617
|
# fetchDeposits
|
@@ -1486,8 +1695,8 @@ class blofin(Exchange, ImplicitAPI):
|
|
1486
1695
|
},
|
1487
1696
|
}
|
1488
1697
|
|
1489
|
-
def parse_transaction_status(self, status):
|
1490
|
-
statuses = {
|
1698
|
+
def parse_transaction_status(self, status: Str):
|
1699
|
+
statuses: dict = {
|
1491
1700
|
'0': 'pending',
|
1492
1701
|
'1': 'ok',
|
1493
1702
|
'2': 'failed',
|
@@ -1496,7 +1705,7 @@ class blofin(Exchange, ImplicitAPI):
|
|
1496
1705
|
return self.safe_string(statuses, status, status)
|
1497
1706
|
|
1498
1707
|
def parse_ledger_entry_type(self, type):
|
1499
|
-
types = {
|
1708
|
+
types: dict = {
|
1500
1709
|
'1': 'transfer', # transfer
|
1501
1710
|
'2': 'trade', # trade
|
1502
1711
|
'3': 'trade', # delivery
|
@@ -1511,34 +1720,32 @@ class blofin(Exchange, ImplicitAPI):
|
|
1511
1720
|
}
|
1512
1721
|
return self.safe_string(types, type, type)
|
1513
1722
|
|
1514
|
-
def parse_ledger_entry(self, item, currency: Currency = None):
|
1515
|
-
|
1516
|
-
|
1517
|
-
|
1518
|
-
toAccount = self.safe_string(item, 'toAccount')
|
1519
|
-
type = self.parse_ledger_entry_type(self.safe_string(item, 'type'))
|
1520
|
-
code = self.safe_currency_code(self.safe_string(item, 'currency'), currency)
|
1521
|
-
amountString = self.safe_string(item, 'amount')
|
1522
|
-
amount = self.parse_number(amountString)
|
1723
|
+
def parse_ledger_entry(self, item: dict, currency: Currency = None) -> LedgerEntry:
|
1724
|
+
currencyId = self.safe_string(item, 'currency')
|
1725
|
+
code = self.safe_currency_code(currencyId, currency)
|
1726
|
+
currency = self.safe_currency(currencyId, currency)
|
1523
1727
|
timestamp = self.safe_integer(item, 'ts')
|
1524
|
-
|
1525
|
-
return {
|
1526
|
-
'id': id,
|
1728
|
+
return self.safe_ledger_entry({
|
1527
1729
|
'info': item,
|
1730
|
+
'id': self.safe_string(item, 'transferId'),
|
1731
|
+
'direction': None,
|
1732
|
+
'account': None,
|
1733
|
+
'referenceId': self.safe_string(item, 'clientId'),
|
1734
|
+
'referenceAccount': None,
|
1735
|
+
'type': self.parse_ledger_entry_type(self.safe_string(item, 'type')),
|
1736
|
+
'currency': code,
|
1737
|
+
'amount': self.safe_number(item, 'amount'),
|
1528
1738
|
'timestamp': timestamp,
|
1529
1739
|
'datetime': self.iso8601(timestamp),
|
1530
|
-
'
|
1531
|
-
'
|
1532
|
-
'
|
1533
|
-
'
|
1534
|
-
|
1535
|
-
'clientId': referenceId, # balance before
|
1536
|
-
'status': status,
|
1537
|
-
}
|
1740
|
+
'before': None,
|
1741
|
+
'after': None,
|
1742
|
+
'status': 'ok',
|
1743
|
+
'fee': None,
|
1744
|
+
}, currency)
|
1538
1745
|
|
1539
1746
|
def parse_ids(self, ids):
|
1540
1747
|
"""
|
1541
|
-
|
1748
|
+
@ignore
|
1542
1749
|
:param string[]|str ids: order ids
|
1543
1750
|
:returns str[]: list of order ids
|
1544
1751
|
"""
|
@@ -1550,7 +1757,9 @@ class blofin(Exchange, ImplicitAPI):
|
|
1550
1757
|
async def cancel_orders(self, ids, symbol: Str = None, params={}):
|
1551
1758
|
"""
|
1552
1759
|
cancel multiple orders
|
1553
|
-
|
1760
|
+
|
1761
|
+
https://blofin.com/docs#cancel-multiple-orders
|
1762
|
+
|
1554
1763
|
:param str[] ids: order ids
|
1555
1764
|
:param str symbol: unified market symbol
|
1556
1765
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
@@ -1568,8 +1777,8 @@ class blofin(Exchange, ImplicitAPI):
|
|
1568
1777
|
method = self.safe_string(params, 'method', defaultMethod)
|
1569
1778
|
clientOrderIds = self.parse_ids(self.safe_value(params, 'clientOrderId'))
|
1570
1779
|
tpslIds = self.parse_ids(self.safe_value(params, 'tpslId'))
|
1571
|
-
|
1572
|
-
if
|
1780
|
+
trigger = self.safe_bool_n(params, ['stop', 'trigger', 'tpsl'])
|
1781
|
+
if trigger:
|
1573
1782
|
method = 'privatePostTradeCancelTpsl'
|
1574
1783
|
if clientOrderIds is None:
|
1575
1784
|
ids = self.parse_ids(ids)
|
@@ -1580,7 +1789,7 @@ class blofin(Exchange, ImplicitAPI):
|
|
1580
1789
|
'instId': market['id'],
|
1581
1790
|
})
|
1582
1791
|
for i in range(0, len(ids)):
|
1583
|
-
if
|
1792
|
+
if trigger:
|
1584
1793
|
request.append({
|
1585
1794
|
'tpslId': ids[i],
|
1586
1795
|
'instId': market['id'],
|
@@ -1607,7 +1816,9 @@ class blofin(Exchange, ImplicitAPI):
|
|
1607
1816
|
async def transfer(self, code: str, amount: float, fromAccount: str, toAccount: str, params={}) -> TransferEntry:
|
1608
1817
|
"""
|
1609
1818
|
transfer currency internally between wallets on the same account
|
1610
|
-
|
1819
|
+
|
1820
|
+
https://blofin.com/docs#funds-transfer
|
1821
|
+
|
1611
1822
|
:param str code: unified currency code
|
1612
1823
|
:param float amount: amount to transfer
|
1613
1824
|
:param str fromAccount: account to transfer from(funding, swap, copy_trading, earn)
|
@@ -1620,7 +1831,7 @@ class blofin(Exchange, ImplicitAPI):
|
|
1620
1831
|
accountsByType = self.safe_dict(self.options, 'accountsByType', {})
|
1621
1832
|
fromId = self.safe_string(accountsByType, fromAccount, fromAccount)
|
1622
1833
|
toId = self.safe_string(accountsByType, toAccount, toAccount)
|
1623
|
-
request = {
|
1834
|
+
request: dict = {
|
1624
1835
|
'currency': currency['id'],
|
1625
1836
|
'amount': self.currency_to_precision(code, amount),
|
1626
1837
|
'fromAccount': fromId,
|
@@ -1630,7 +1841,7 @@ class blofin(Exchange, ImplicitAPI):
|
|
1630
1841
|
data = self.safe_dict(response, 'data', {})
|
1631
1842
|
return self.parse_transfer(data, currency)
|
1632
1843
|
|
1633
|
-
def parse_transfer(self, transfer, currency: Currency = None):
|
1844
|
+
def parse_transfer(self, transfer: dict, currency: Currency = None) -> TransferEntry:
|
1634
1845
|
id = self.safe_string(transfer, 'transferId')
|
1635
1846
|
return {
|
1636
1847
|
'info': transfer,
|
@@ -1647,7 +1858,9 @@ class blofin(Exchange, ImplicitAPI):
|
|
1647
1858
|
async def fetch_position(self, symbol: str, params={}) -> Position:
|
1648
1859
|
"""
|
1649
1860
|
fetch data on a single open contract trade position
|
1650
|
-
|
1861
|
+
|
1862
|
+
https://blofin.com/docs#get-positions
|
1863
|
+
|
1651
1864
|
:param str symbol: unified market symbol of the market the position is held in, default is None
|
1652
1865
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
1653
1866
|
:param str [params.instType]: MARGIN, SWAP, FUTURES, OPTION
|
@@ -1655,7 +1868,7 @@ class blofin(Exchange, ImplicitAPI):
|
|
1655
1868
|
"""
|
1656
1869
|
await self.load_markets()
|
1657
1870
|
market = self.market(symbol)
|
1658
|
-
request = {
|
1871
|
+
request: dict = {
|
1659
1872
|
'instId': market['id'],
|
1660
1873
|
}
|
1661
1874
|
response = await self.privateGetAccountPositions(self.extend(request, params))
|
@@ -1665,10 +1878,12 @@ class blofin(Exchange, ImplicitAPI):
|
|
1665
1878
|
return None
|
1666
1879
|
return self.parse_position(position, market)
|
1667
1880
|
|
1668
|
-
async def fetch_positions(self, symbols:
|
1881
|
+
async def fetch_positions(self, symbols: Strings = None, params={}) -> List[Position]:
|
1669
1882
|
"""
|
1670
1883
|
fetch data on a single open contract trade position
|
1671
|
-
|
1884
|
+
|
1885
|
+
https://blofin.com/docs#get-positions
|
1886
|
+
|
1672
1887
|
:param str[] [symbols]: list of unified market symbols
|
1673
1888
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
1674
1889
|
:param str [params.instType]: MARGIN, SWAP, FUTURES, OPTION
|
@@ -1681,7 +1896,33 @@ class blofin(Exchange, ImplicitAPI):
|
|
1681
1896
|
result = self.parse_positions(data)
|
1682
1897
|
return self.filter_by_array_positions(result, 'symbol', symbols, False)
|
1683
1898
|
|
1684
|
-
def parse_position(self, position, market: Market = None):
|
1899
|
+
def parse_position(self, position: dict, market: Market = None):
|
1900
|
+
#
|
1901
|
+
# response similar for REST & WS
|
1902
|
+
#
|
1903
|
+
# {
|
1904
|
+
# instType: 'SWAP',
|
1905
|
+
# instId: 'LTC-USDT',
|
1906
|
+
# marginMode: 'cross',
|
1907
|
+
# positionId: '644159',
|
1908
|
+
# positionSide: 'net',
|
1909
|
+
# positions: '1',
|
1910
|
+
# availablePositions: '1',
|
1911
|
+
# averagePrice: '68.16',
|
1912
|
+
# unrealizedPnl: '0.80631223',
|
1913
|
+
# unrealizedPnlRatio: '0.03548909463028169',
|
1914
|
+
# leverage: '3',
|
1915
|
+
# liquidationPrice: '10.116655172370356435',
|
1916
|
+
# markPrice: '68.96',
|
1917
|
+
# initialMargin: '22.988770743333333333',
|
1918
|
+
# margin: '', # self field might not exist in rest response
|
1919
|
+
# marginRatio: '152.523509620342499273',
|
1920
|
+
# maintenanceMargin: '0.34483156115',
|
1921
|
+
# adl: '4',
|
1922
|
+
# createTime: '1707235776528',
|
1923
|
+
# updateTime: '1707235776528'
|
1924
|
+
# }
|
1925
|
+
#
|
1685
1926
|
marketId = self.safe_string(position, 'instId')
|
1686
1927
|
market = self.safe_market(marketId, market)
|
1687
1928
|
symbol = market['symbol']
|
@@ -1762,10 +2003,12 @@ class blofin(Exchange, ImplicitAPI):
|
|
1762
2003
|
'takeProfitPrice': None,
|
1763
2004
|
})
|
1764
2005
|
|
1765
|
-
async def fetch_leverages(self, symbols:
|
2006
|
+
async def fetch_leverages(self, symbols: Strings = None, params={}) -> Leverages:
|
1766
2007
|
"""
|
1767
2008
|
fetch the set leverage for all contract markets
|
1768
|
-
|
2009
|
+
|
2010
|
+
https://docs.blofin.com/index.html#get-multiple-leverage
|
2011
|
+
|
1769
2012
|
:param str[] symbols: a list of unified market symbols, required on blofin
|
1770
2013
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
1771
2014
|
:param str [params.marginMode]: 'cross' or 'isolated'
|
@@ -1789,7 +2032,7 @@ class blofin(Exchange, ImplicitAPI):
|
|
1789
2032
|
instIds = instIds + ',' + entryMarket['id']
|
1790
2033
|
else:
|
1791
2034
|
instIds = instIds + entryMarket['id']
|
1792
|
-
request = {
|
2035
|
+
request: dict = {
|
1793
2036
|
'instId': instIds,
|
1794
2037
|
'marginMode': marginMode,
|
1795
2038
|
}
|
@@ -1813,7 +2056,9 @@ class blofin(Exchange, ImplicitAPI):
|
|
1813
2056
|
async def fetch_leverage(self, symbol: str, params={}) -> Leverage:
|
1814
2057
|
"""
|
1815
2058
|
fetch the set leverage for a market
|
1816
|
-
|
2059
|
+
|
2060
|
+
https://docs.blofin.com/index.html#get-leverage
|
2061
|
+
|
1817
2062
|
:param str symbol: unified market symbol
|
1818
2063
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
1819
2064
|
:param str [params.marginMode]: 'cross' or 'isolated'
|
@@ -1827,7 +2072,7 @@ class blofin(Exchange, ImplicitAPI):
|
|
1827
2072
|
if (marginMode != 'cross') and (marginMode != 'isolated'):
|
1828
2073
|
raise BadRequest(self.id + ' fetchLeverage() requires a marginMode parameter that must be either cross or isolated')
|
1829
2074
|
market = self.market(symbol)
|
1830
|
-
request = {
|
2075
|
+
request: dict = {
|
1831
2076
|
'instId': market['id'],
|
1832
2077
|
'marginMode': marginMode,
|
1833
2078
|
}
|
@@ -1846,7 +2091,7 @@ class blofin(Exchange, ImplicitAPI):
|
|
1846
2091
|
data = self.safe_dict(response, 'data', {})
|
1847
2092
|
return self.parse_leverage(data, market)
|
1848
2093
|
|
1849
|
-
def parse_leverage(self, leverage, market=None) -> Leverage:
|
2094
|
+
def parse_leverage(self, leverage: dict, market: Market = None) -> Leverage:
|
1850
2095
|
marketId = self.safe_string(leverage, 'instId')
|
1851
2096
|
leverageValue = self.safe_integer(leverage, 'leverage')
|
1852
2097
|
return {
|
@@ -1860,7 +2105,9 @@ class blofin(Exchange, ImplicitAPI):
|
|
1860
2105
|
async def set_leverage(self, leverage: Int, symbol: Str = None, params={}):
|
1861
2106
|
"""
|
1862
2107
|
set the level of leverage for a market
|
1863
|
-
|
2108
|
+
|
2109
|
+
https://blofin.com/docs#set-leverage
|
2110
|
+
|
1864
2111
|
:param int leverage: the rate of leverage
|
1865
2112
|
:param str symbol: unified market symbol
|
1866
2113
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
@@ -1879,7 +2126,7 @@ class blofin(Exchange, ImplicitAPI):
|
|
1879
2126
|
marginMode, params = self.handle_margin_mode_and_params('setLeverage', params, 'cross')
|
1880
2127
|
if (marginMode != 'cross') and (marginMode != 'isolated'):
|
1881
2128
|
raise BadRequest(self.id + ' setLeverage() requires a marginMode parameter that must be either cross or isolated')
|
1882
|
-
request = {
|
2129
|
+
request: dict = {
|
1883
2130
|
'leverage': leverage,
|
1884
2131
|
'marginMode': marginMode,
|
1885
2132
|
'instId': market['id'],
|
@@ -1890,15 +2137,17 @@ class blofin(Exchange, ImplicitAPI):
|
|
1890
2137
|
async def close_position(self, symbol: str, side: OrderSide = None, params={}) -> Order:
|
1891
2138
|
"""
|
1892
2139
|
closes open positions for a market
|
1893
|
-
|
2140
|
+
|
2141
|
+
https://blofin.com/docs#close-positions
|
2142
|
+
|
1894
2143
|
:param str symbol: Unified CCXT market symbol
|
1895
2144
|
:param str [side]: 'buy' or 'sell', leave in net mode
|
1896
2145
|
:param dict [params]: extra parameters specific to the blofin api endpoint
|
1897
2146
|
:param str [params.clientOrderId]: a unique identifier for the order
|
1898
2147
|
:param str [params.marginMode]: 'cross' or 'isolated', default is 'cross
|
1899
2148
|
:param str [params.code]: *required in the case of closing cross MARGIN position for Single-currency margin* margin currency
|
1900
|
-
|
1901
|
-
|
2149
|
+
|
2150
|
+
EXCHANGE SPECIFIC PARAMETERS
|
1902
2151
|
:param boolean [params.autoCxl]: whether any pending orders for closing out needs to be automatically canceled when close position via a market order. False or True, the default is False
|
1903
2152
|
:param str [params.tag]: order tag a combination of case-sensitive alphanumerics, all numbers, or all letters of up to 16 characters
|
1904
2153
|
:returns dict[]: `A list of position structures <https://docs.ccxt.com/#/?id=position-structure>`
|
@@ -1908,7 +2157,7 @@ class blofin(Exchange, ImplicitAPI):
|
|
1908
2157
|
clientOrderId = self.safe_string(params, 'clientOrderId')
|
1909
2158
|
marginMode = None
|
1910
2159
|
marginMode, params = self.handle_margin_mode_and_params('closePosition', params, 'cross')
|
1911
|
-
request = {
|
2160
|
+
request: dict = {
|
1912
2161
|
'instId': market['id'],
|
1913
2162
|
'marginMode': marginMode,
|
1914
2163
|
}
|
@@ -1920,13 +2169,15 @@ class blofin(Exchange, ImplicitAPI):
|
|
1920
2169
|
async def fetch_closed_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
|
1921
2170
|
"""
|
1922
2171
|
fetches information on multiple closed orders made by the user
|
1923
|
-
|
1924
|
-
|
2172
|
+
|
2173
|
+
https://blofin.com/docs#get-order-history
|
2174
|
+
https://blofin.com/docs#get-tpsl-order-history
|
2175
|
+
|
1925
2176
|
:param str symbol: unified market symbol of the market orders were made in
|
1926
2177
|
:param int [since]: the earliest time in ms to fetch orders for
|
1927
2178
|
:param int [limit]: the maximum number of orde structures to retrieve
|
1928
2179
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
1929
|
-
:param bool [params.
|
2180
|
+
:param bool [params.trigger]: True if fetching trigger or conditional orders
|
1930
2181
|
:param boolean [params.paginate]: default False, when True will automatically paginate by calling self endpoint multiple times. See in the docs all the [availble parameters](https://github.com/ccxt/ccxt/wiki/Manual#pagination-params)
|
1931
2182
|
:returns Order[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
|
1932
2183
|
"""
|
@@ -1935,7 +2186,7 @@ class blofin(Exchange, ImplicitAPI):
|
|
1935
2186
|
paginate, params = self.handle_option_and_params(params, 'fetchClosedOrders', 'paginate')
|
1936
2187
|
if paginate:
|
1937
2188
|
return await self.fetch_paginated_call_dynamic('fetchClosedOrders', symbol, since, limit, params)
|
1938
|
-
request = {
|
2189
|
+
request: dict = {
|
1939
2190
|
}
|
1940
2191
|
market = None
|
1941
2192
|
if symbol is not None:
|
@@ -1945,12 +2196,12 @@ class blofin(Exchange, ImplicitAPI):
|
|
1945
2196
|
request['limit'] = limit # default 100, max 100
|
1946
2197
|
if since is not None:
|
1947
2198
|
request['begin'] = since
|
1948
|
-
|
2199
|
+
isTrigger = self.safe_bool_n(params, ['stop', 'trigger', 'tpsl', 'TPSL'], False)
|
1949
2200
|
method: Str = None
|
1950
2201
|
method, params = self.handle_option_and_params(params, 'fetchOpenOrders', 'method', 'privateGetTradeOrdersHistory')
|
1951
2202
|
query = self.omit(params, ['method', 'stop', 'trigger', 'tpsl', 'TPSL'])
|
1952
2203
|
response = None
|
1953
|
-
if (
|
2204
|
+
if (isTrigger) or (method == 'privateGetTradeOrdersTpslHistory'):
|
1954
2205
|
response = await self.privateGetTradeOrdersTpslHistory(self.extend(request, query))
|
1955
2206
|
else:
|
1956
2207
|
response = await self.privateGetTradeOrdersHistory(self.extend(request, query))
|
@@ -1960,7 +2211,9 @@ class blofin(Exchange, ImplicitAPI):
|
|
1960
2211
|
async def fetch_margin_mode(self, symbol: str, params={}) -> MarginMode:
|
1961
2212
|
"""
|
1962
2213
|
fetches the margin mode of a trading pair
|
1963
|
-
|
2214
|
+
|
2215
|
+
https://docs.blofin.com/index.html#get-margin-mode
|
2216
|
+
|
1964
2217
|
:param str symbol: unified symbol of the market to fetch the margin mode for
|
1965
2218
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
1966
2219
|
:returns dict: a `margin mode structure <https://docs.ccxt.com/#/?id=margin-mode-structure>`
|
@@ -1980,14 +2233,14 @@ class blofin(Exchange, ImplicitAPI):
|
|
1980
2233
|
data = self.safe_dict(response, 'data', {})
|
1981
2234
|
return self.parse_margin_mode(data, market)
|
1982
2235
|
|
1983
|
-
def parse_margin_mode(self, marginMode, market=None) -> MarginMode:
|
2236
|
+
def parse_margin_mode(self, marginMode: dict, market=None) -> MarginMode:
|
1984
2237
|
return {
|
1985
2238
|
'info': marginMode,
|
1986
2239
|
'symbol': market['symbol'],
|
1987
2240
|
'marginMode': self.safe_string(marginMode, 'marginMode'),
|
1988
2241
|
}
|
1989
2242
|
|
1990
|
-
def handle_errors(self, httpCode, reason, url, method, headers, body, response, requestHeaders, requestBody):
|
2243
|
+
def handle_errors(self, httpCode: int, reason: str, url: str, method: str, headers: dict, body: str, response, requestHeaders, requestBody):
|
1991
2244
|
if response is None:
|
1992
2245
|
return None # fallback to default error handler
|
1993
2246
|
#
|