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/blofin.py
CHANGED
@@ -6,16 +6,16 @@
|
|
6
6
|
from ccxt.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
|
-
def fetch_markets(self, params={}):
|
477
|
+
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
|
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
|
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
|
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
|
self.load_markets()
|
536
682
|
market = self.market(symbol)
|
537
|
-
request = {
|
683
|
+
request: dict = {
|
538
684
|
'instId': market['id'],
|
539
685
|
}
|
540
686
|
response = 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
|
+
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
|
+
self.load_markets()
|
703
|
+
market = self.market(symbol)
|
704
|
+
request = {
|
705
|
+
'symbol': market['id'],
|
706
|
+
}
|
707
|
+
response = 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
|
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
|
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 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
|
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 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
|
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 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
|
-
def fetch_funding_rate(self, symbol: str, params={}):
|
957
|
+
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 = 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
|
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
|
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 = self.privateGetAssetBalances(self.extend(request, params))
|
938
1116
|
else:
|
939
1117
|
response = 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
|
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,8 +1374,10 @@ class blofin(Exchange, ImplicitAPI):
|
|
1189
1374
|
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
|
@@ -1201,7 +1388,7 @@ class blofin(Exchange, ImplicitAPI):
|
|
1201
1388
|
raise ArgumentsRequired(self.id + ' cancelOrder() requires a symbol argument')
|
1202
1389
|
self.load_markets()
|
1203
1390
|
market = self.market(symbol)
|
1204
|
-
request = {
|
1391
|
+
request: dict = {
|
1205
1392
|
'instId': market['id'],
|
1206
1393
|
}
|
1207
1394
|
isTrigger = self.safe_bool_n(params, ['stop', 'trigger', 'tpsl'], False)
|
@@ -1226,8 +1413,11 @@ class blofin(Exchange, ImplicitAPI):
|
|
1226
1413
|
def create_orders(self, orders: List[OrderRequest], params={}) -> List[Order]:
|
1227
1414
|
"""
|
1228
1415
|
create a list of trade orders
|
1229
|
-
|
1416
|
+
|
1417
|
+
https://blofin.com/docs#place-multiple-orders
|
1418
|
+
|
1230
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
|
1231
1421
|
:returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
|
1232
1422
|
"""
|
1233
1423
|
self.load_markets()
|
@@ -1250,13 +1440,15 @@ class blofin(Exchange, ImplicitAPI):
|
|
1250
1440
|
def fetch_open_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
|
1251
1441
|
"""
|
1252
1442
|
Fetch orders that are still open
|
1253
|
-
|
1254
|
-
|
1443
|
+
|
1444
|
+
https://blofin.com/docs#get-active-orders
|
1445
|
+
https://blofin.com/docs#get-active-tpsl-orders
|
1446
|
+
|
1255
1447
|
:param str symbol: unified market symbol
|
1256
1448
|
:param int [since]: the earliest time in ms to fetch open orders for
|
1257
1449
|
:param int [limit]: the maximum number of open orders structures to retrieve
|
1258
1450
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
1259
|
-
:param bool [params.
|
1451
|
+
:param bool [params.trigger]: True if fetching trigger or conditional orders
|
1260
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)
|
1261
1453
|
:returns Order[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
|
1262
1454
|
"""
|
@@ -1265,7 +1457,7 @@ class blofin(Exchange, ImplicitAPI):
|
|
1265
1457
|
paginate, params = self.handle_option_and_params(params, 'fetchOpenOrders', 'paginate')
|
1266
1458
|
if paginate:
|
1267
1459
|
return self.fetch_paginated_call_dynamic('fetchOpenOrders', symbol, since, limit, params)
|
1268
|
-
request = {
|
1460
|
+
request: dict = {
|
1269
1461
|
}
|
1270
1462
|
market = None
|
1271
1463
|
if symbol is not None:
|
@@ -1273,12 +1465,12 @@ class blofin(Exchange, ImplicitAPI):
|
|
1273
1465
|
request['instId'] = market['id']
|
1274
1466
|
if limit is not None:
|
1275
1467
|
request['limit'] = limit # default 100, max 100
|
1276
|
-
|
1468
|
+
isTrigger = self.safe_bool_n(params, ['stop', 'trigger', 'tpsl', 'TPSL'], False)
|
1277
1469
|
method: Str = None
|
1278
1470
|
method, params = self.handle_option_and_params(params, 'fetchOpenOrders', 'method', 'privateGetTradeOrdersPending')
|
1279
1471
|
query = self.omit(params, ['method', 'stop', 'trigger', 'tpsl', 'TPSL'])
|
1280
1472
|
response = None
|
1281
|
-
if
|
1473
|
+
if isTrigger or (method == 'privateGetTradeOrdersTpslPending'):
|
1282
1474
|
response = self.privateGetTradeOrdersTpslPending(self.extend(request, query))
|
1283
1475
|
else:
|
1284
1476
|
response = self.privateGetTradeOrdersPending(self.extend(request, query))
|
@@ -1288,7 +1480,9 @@ class blofin(Exchange, ImplicitAPI):
|
|
1288
1480
|
def fetch_my_trades(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
|
1289
1481
|
"""
|
1290
1482
|
fetch all trades made by the user
|
1291
|
-
|
1483
|
+
|
1484
|
+
https://blofin.com/docs#get-trade-history
|
1485
|
+
|
1292
1486
|
:param str symbol: unified market symbol
|
1293
1487
|
:param int [since]: the earliest time in ms to fetch trades for
|
1294
1488
|
:param int [limit]: the maximum number of trades structures to retrieve
|
@@ -1302,7 +1496,7 @@ class blofin(Exchange, ImplicitAPI):
|
|
1302
1496
|
paginate, params = self.handle_option_and_params(params, 'fetchMyTrades', 'paginate')
|
1303
1497
|
if paginate:
|
1304
1498
|
return self.fetch_paginated_call_dynamic('fetchMyTrades', symbol, since, limit, params)
|
1305
|
-
request = {
|
1499
|
+
request: dict = {
|
1306
1500
|
}
|
1307
1501
|
market = None
|
1308
1502
|
if symbol is not None:
|
@@ -1318,7 +1512,9 @@ class blofin(Exchange, ImplicitAPI):
|
|
1318
1512
|
def fetch_deposits(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Transaction]:
|
1319
1513
|
"""
|
1320
1514
|
fetch all deposits made to an account
|
1321
|
-
|
1515
|
+
|
1516
|
+
https://blofin.com/docs#get-deposite-history
|
1517
|
+
|
1322
1518
|
:param str code: unified currency code
|
1323
1519
|
:param int [since]: the earliest time in ms to fetch deposits for
|
1324
1520
|
:param int [limit]: the maximum number of deposits structures to retrieve
|
@@ -1332,7 +1528,7 @@ class blofin(Exchange, ImplicitAPI):
|
|
1332
1528
|
paginate, params = self.handle_option_and_params(params, 'fetchDeposits', 'paginate')
|
1333
1529
|
if paginate:
|
1334
1530
|
return self.fetch_paginated_call_dynamic('fetchDeposits', code, since, limit, params)
|
1335
|
-
request = {
|
1531
|
+
request: dict = {
|
1336
1532
|
}
|
1337
1533
|
currency = None
|
1338
1534
|
if code is not None:
|
@@ -1350,7 +1546,9 @@ class blofin(Exchange, ImplicitAPI):
|
|
1350
1546
|
def fetch_withdrawals(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Transaction]:
|
1351
1547
|
"""
|
1352
1548
|
fetch all withdrawals made from an account
|
1353
|
-
|
1549
|
+
|
1550
|
+
https://blofin.com/docs#get-withdraw-history
|
1551
|
+
|
1354
1552
|
:param str code: unified currency code
|
1355
1553
|
:param int [since]: the earliest time in ms to fetch withdrawals for
|
1356
1554
|
:param int [limit]: the maximum number of withdrawals structures to retrieve
|
@@ -1364,7 +1562,7 @@ class blofin(Exchange, ImplicitAPI):
|
|
1364
1562
|
paginate, params = self.handle_option_and_params(params, 'fetchWithdrawals', 'paginate')
|
1365
1563
|
if paginate:
|
1366
1564
|
return self.fetch_paginated_call_dynamic('fetchWithdrawals', code, since, limit, params)
|
1367
|
-
request = {
|
1565
|
+
request: dict = {
|
1368
1566
|
}
|
1369
1567
|
currency = None
|
1370
1568
|
if code is not None:
|
@@ -1379,25 +1577,27 @@ class blofin(Exchange, ImplicitAPI):
|
|
1379
1577
|
data = self.safe_list(response, 'data', [])
|
1380
1578
|
return self.parse_transactions(data, currency, since, limit, params)
|
1381
1579
|
|
1382
|
-
def fetch_ledger(self, code: Str = None, since: Int = None, limit: Int = None, params={}):
|
1580
|
+
def fetch_ledger(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[LedgerEntry]:
|
1383
1581
|
"""
|
1384
|
-
fetch the history of changes, actions done by the user or operations that altered balance of the user
|
1385
|
-
|
1386
|
-
|
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
|
1387
1587
|
:param int [since]: timestamp in ms of the earliest ledger entry, default is None
|
1388
|
-
:param int [limit]: max number of ledger
|
1588
|
+
:param int [limit]: max number of ledger entries to return, default is None
|
1389
1589
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
1390
1590
|
:param str [params.marginMode]: 'cross' or 'isolated'
|
1391
1591
|
:param int [params.until]: the latest time in ms to fetch entries for
|
1392
|
-
:param boolean [params.paginate]: default False, when True will automatically paginate by calling self endpoint multiple times. See in the docs all the [
|
1393
|
-
: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>`
|
1394
1594
|
"""
|
1395
1595
|
self.load_markets()
|
1396
1596
|
paginate = False
|
1397
1597
|
paginate, params = self.handle_option_and_params(params, 'fetchLedger', 'paginate')
|
1398
1598
|
if paginate:
|
1399
1599
|
return self.fetch_paginated_call_dynamic('fetchLedger', code, since, limit, params)
|
1400
|
-
request = {
|
1600
|
+
request: dict = {
|
1401
1601
|
}
|
1402
1602
|
if limit is not None:
|
1403
1603
|
request['limit'] = limit
|
@@ -1411,7 +1611,7 @@ class blofin(Exchange, ImplicitAPI):
|
|
1411
1611
|
data = self.safe_list(response, 'data', [])
|
1412
1612
|
return self.parse_ledger(data, currency, since, limit)
|
1413
1613
|
|
1414
|
-
def parse_transaction(self, transaction, currency: Currency = None) -> Transaction:
|
1614
|
+
def parse_transaction(self, transaction: dict, currency: Currency = None) -> Transaction:
|
1415
1615
|
#
|
1416
1616
|
#
|
1417
1617
|
# fetchDeposits
|
@@ -1495,8 +1695,8 @@ class blofin(Exchange, ImplicitAPI):
|
|
1495
1695
|
},
|
1496
1696
|
}
|
1497
1697
|
|
1498
|
-
def parse_transaction_status(self, status):
|
1499
|
-
statuses = {
|
1698
|
+
def parse_transaction_status(self, status: Str):
|
1699
|
+
statuses: dict = {
|
1500
1700
|
'0': 'pending',
|
1501
1701
|
'1': 'ok',
|
1502
1702
|
'2': 'failed',
|
@@ -1505,7 +1705,7 @@ class blofin(Exchange, ImplicitAPI):
|
|
1505
1705
|
return self.safe_string(statuses, status, status)
|
1506
1706
|
|
1507
1707
|
def parse_ledger_entry_type(self, type):
|
1508
|
-
types = {
|
1708
|
+
types: dict = {
|
1509
1709
|
'1': 'transfer', # transfer
|
1510
1710
|
'2': 'trade', # trade
|
1511
1711
|
'3': 'trade', # delivery
|
@@ -1520,34 +1720,32 @@ class blofin(Exchange, ImplicitAPI):
|
|
1520
1720
|
}
|
1521
1721
|
return self.safe_string(types, type, type)
|
1522
1722
|
|
1523
|
-
def parse_ledger_entry(self, item, currency: Currency = None):
|
1524
|
-
|
1525
|
-
|
1526
|
-
|
1527
|
-
toAccount = self.safe_string(item, 'toAccount')
|
1528
|
-
type = self.parse_ledger_entry_type(self.safe_string(item, 'type'))
|
1529
|
-
code = self.safe_currency_code(self.safe_string(item, 'currency'), currency)
|
1530
|
-
amountString = self.safe_string(item, 'amount')
|
1531
|
-
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)
|
1532
1727
|
timestamp = self.safe_integer(item, 'ts')
|
1533
|
-
|
1534
|
-
return {
|
1535
|
-
'id': id,
|
1728
|
+
return self.safe_ledger_entry({
|
1536
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'),
|
1537
1738
|
'timestamp': timestamp,
|
1538
1739
|
'datetime': self.iso8601(timestamp),
|
1539
|
-
'
|
1540
|
-
'
|
1541
|
-
'
|
1542
|
-
'
|
1543
|
-
|
1544
|
-
'clientId': referenceId, # balance before
|
1545
|
-
'status': status,
|
1546
|
-
}
|
1740
|
+
'before': None,
|
1741
|
+
'after': None,
|
1742
|
+
'status': 'ok',
|
1743
|
+
'fee': None,
|
1744
|
+
}, currency)
|
1547
1745
|
|
1548
1746
|
def parse_ids(self, ids):
|
1549
1747
|
"""
|
1550
|
-
|
1748
|
+
@ignore
|
1551
1749
|
:param string[]|str ids: order ids
|
1552
1750
|
:returns str[]: list of order ids
|
1553
1751
|
"""
|
@@ -1559,7 +1757,9 @@ class blofin(Exchange, ImplicitAPI):
|
|
1559
1757
|
def cancel_orders(self, ids, symbol: Str = None, params={}):
|
1560
1758
|
"""
|
1561
1759
|
cancel multiple orders
|
1562
|
-
|
1760
|
+
|
1761
|
+
https://blofin.com/docs#cancel-multiple-orders
|
1762
|
+
|
1563
1763
|
:param str[] ids: order ids
|
1564
1764
|
:param str symbol: unified market symbol
|
1565
1765
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
@@ -1577,8 +1777,8 @@ class blofin(Exchange, ImplicitAPI):
|
|
1577
1777
|
method = self.safe_string(params, 'method', defaultMethod)
|
1578
1778
|
clientOrderIds = self.parse_ids(self.safe_value(params, 'clientOrderId'))
|
1579
1779
|
tpslIds = self.parse_ids(self.safe_value(params, 'tpslId'))
|
1580
|
-
|
1581
|
-
if
|
1780
|
+
trigger = self.safe_bool_n(params, ['stop', 'trigger', 'tpsl'])
|
1781
|
+
if trigger:
|
1582
1782
|
method = 'privatePostTradeCancelTpsl'
|
1583
1783
|
if clientOrderIds is None:
|
1584
1784
|
ids = self.parse_ids(ids)
|
@@ -1589,7 +1789,7 @@ class blofin(Exchange, ImplicitAPI):
|
|
1589
1789
|
'instId': market['id'],
|
1590
1790
|
})
|
1591
1791
|
for i in range(0, len(ids)):
|
1592
|
-
if
|
1792
|
+
if trigger:
|
1593
1793
|
request.append({
|
1594
1794
|
'tpslId': ids[i],
|
1595
1795
|
'instId': market['id'],
|
@@ -1616,7 +1816,9 @@ class blofin(Exchange, ImplicitAPI):
|
|
1616
1816
|
def transfer(self, code: str, amount: float, fromAccount: str, toAccount: str, params={}) -> TransferEntry:
|
1617
1817
|
"""
|
1618
1818
|
transfer currency internally between wallets on the same account
|
1619
|
-
|
1819
|
+
|
1820
|
+
https://blofin.com/docs#funds-transfer
|
1821
|
+
|
1620
1822
|
:param str code: unified currency code
|
1621
1823
|
:param float amount: amount to transfer
|
1622
1824
|
:param str fromAccount: account to transfer from(funding, swap, copy_trading, earn)
|
@@ -1629,7 +1831,7 @@ class blofin(Exchange, ImplicitAPI):
|
|
1629
1831
|
accountsByType = self.safe_dict(self.options, 'accountsByType', {})
|
1630
1832
|
fromId = self.safe_string(accountsByType, fromAccount, fromAccount)
|
1631
1833
|
toId = self.safe_string(accountsByType, toAccount, toAccount)
|
1632
|
-
request = {
|
1834
|
+
request: dict = {
|
1633
1835
|
'currency': currency['id'],
|
1634
1836
|
'amount': self.currency_to_precision(code, amount),
|
1635
1837
|
'fromAccount': fromId,
|
@@ -1639,7 +1841,7 @@ class blofin(Exchange, ImplicitAPI):
|
|
1639
1841
|
data = self.safe_dict(response, 'data', {})
|
1640
1842
|
return self.parse_transfer(data, currency)
|
1641
1843
|
|
1642
|
-
def parse_transfer(self, transfer, currency: Currency = None):
|
1844
|
+
def parse_transfer(self, transfer: dict, currency: Currency = None) -> TransferEntry:
|
1643
1845
|
id = self.safe_string(transfer, 'transferId')
|
1644
1846
|
return {
|
1645
1847
|
'info': transfer,
|
@@ -1656,7 +1858,9 @@ class blofin(Exchange, ImplicitAPI):
|
|
1656
1858
|
def fetch_position(self, symbol: str, params={}) -> Position:
|
1657
1859
|
"""
|
1658
1860
|
fetch data on a single open contract trade position
|
1659
|
-
|
1861
|
+
|
1862
|
+
https://blofin.com/docs#get-positions
|
1863
|
+
|
1660
1864
|
:param str symbol: unified market symbol of the market the position is held in, default is None
|
1661
1865
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
1662
1866
|
:param str [params.instType]: MARGIN, SWAP, FUTURES, OPTION
|
@@ -1664,7 +1868,7 @@ class blofin(Exchange, ImplicitAPI):
|
|
1664
1868
|
"""
|
1665
1869
|
self.load_markets()
|
1666
1870
|
market = self.market(symbol)
|
1667
|
-
request = {
|
1871
|
+
request: dict = {
|
1668
1872
|
'instId': market['id'],
|
1669
1873
|
}
|
1670
1874
|
response = self.privateGetAccountPositions(self.extend(request, params))
|
@@ -1674,10 +1878,12 @@ class blofin(Exchange, ImplicitAPI):
|
|
1674
1878
|
return None
|
1675
1879
|
return self.parse_position(position, market)
|
1676
1880
|
|
1677
|
-
def fetch_positions(self, symbols:
|
1881
|
+
def fetch_positions(self, symbols: Strings = None, params={}) -> List[Position]:
|
1678
1882
|
"""
|
1679
1883
|
fetch data on a single open contract trade position
|
1680
|
-
|
1884
|
+
|
1885
|
+
https://blofin.com/docs#get-positions
|
1886
|
+
|
1681
1887
|
:param str[] [symbols]: list of unified market symbols
|
1682
1888
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
1683
1889
|
:param str [params.instType]: MARGIN, SWAP, FUTURES, OPTION
|
@@ -1690,7 +1896,33 @@ class blofin(Exchange, ImplicitAPI):
|
|
1690
1896
|
result = self.parse_positions(data)
|
1691
1897
|
return self.filter_by_array_positions(result, 'symbol', symbols, False)
|
1692
1898
|
|
1693
|
-
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
|
+
#
|
1694
1926
|
marketId = self.safe_string(position, 'instId')
|
1695
1927
|
market = self.safe_market(marketId, market)
|
1696
1928
|
symbol = market['symbol']
|
@@ -1771,10 +2003,12 @@ class blofin(Exchange, ImplicitAPI):
|
|
1771
2003
|
'takeProfitPrice': None,
|
1772
2004
|
})
|
1773
2005
|
|
1774
|
-
def fetch_leverages(self, symbols:
|
2006
|
+
def fetch_leverages(self, symbols: Strings = None, params={}) -> Leverages:
|
1775
2007
|
"""
|
1776
2008
|
fetch the set leverage for all contract markets
|
1777
|
-
|
2009
|
+
|
2010
|
+
https://docs.blofin.com/index.html#get-multiple-leverage
|
2011
|
+
|
1778
2012
|
:param str[] symbols: a list of unified market symbols, required on blofin
|
1779
2013
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
1780
2014
|
:param str [params.marginMode]: 'cross' or 'isolated'
|
@@ -1798,7 +2032,7 @@ class blofin(Exchange, ImplicitAPI):
|
|
1798
2032
|
instIds = instIds + ',' + entryMarket['id']
|
1799
2033
|
else:
|
1800
2034
|
instIds = instIds + entryMarket['id']
|
1801
|
-
request = {
|
2035
|
+
request: dict = {
|
1802
2036
|
'instId': instIds,
|
1803
2037
|
'marginMode': marginMode,
|
1804
2038
|
}
|
@@ -1822,7 +2056,9 @@ class blofin(Exchange, ImplicitAPI):
|
|
1822
2056
|
def fetch_leverage(self, symbol: str, params={}) -> Leverage:
|
1823
2057
|
"""
|
1824
2058
|
fetch the set leverage for a market
|
1825
|
-
|
2059
|
+
|
2060
|
+
https://docs.blofin.com/index.html#get-leverage
|
2061
|
+
|
1826
2062
|
:param str symbol: unified market symbol
|
1827
2063
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
1828
2064
|
:param str [params.marginMode]: 'cross' or 'isolated'
|
@@ -1836,7 +2072,7 @@ class blofin(Exchange, ImplicitAPI):
|
|
1836
2072
|
if (marginMode != 'cross') and (marginMode != 'isolated'):
|
1837
2073
|
raise BadRequest(self.id + ' fetchLeverage() requires a marginMode parameter that must be either cross or isolated')
|
1838
2074
|
market = self.market(symbol)
|
1839
|
-
request = {
|
2075
|
+
request: dict = {
|
1840
2076
|
'instId': market['id'],
|
1841
2077
|
'marginMode': marginMode,
|
1842
2078
|
}
|
@@ -1855,7 +2091,7 @@ class blofin(Exchange, ImplicitAPI):
|
|
1855
2091
|
data = self.safe_dict(response, 'data', {})
|
1856
2092
|
return self.parse_leverage(data, market)
|
1857
2093
|
|
1858
|
-
def parse_leverage(self, leverage, market=None) -> Leverage:
|
2094
|
+
def parse_leverage(self, leverage: dict, market: Market = None) -> Leverage:
|
1859
2095
|
marketId = self.safe_string(leverage, 'instId')
|
1860
2096
|
leverageValue = self.safe_integer(leverage, 'leverage')
|
1861
2097
|
return {
|
@@ -1869,7 +2105,9 @@ class blofin(Exchange, ImplicitAPI):
|
|
1869
2105
|
def set_leverage(self, leverage: Int, symbol: Str = None, params={}):
|
1870
2106
|
"""
|
1871
2107
|
set the level of leverage for a market
|
1872
|
-
|
2108
|
+
|
2109
|
+
https://blofin.com/docs#set-leverage
|
2110
|
+
|
1873
2111
|
:param int leverage: the rate of leverage
|
1874
2112
|
:param str symbol: unified market symbol
|
1875
2113
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
@@ -1888,7 +2126,7 @@ class blofin(Exchange, ImplicitAPI):
|
|
1888
2126
|
marginMode, params = self.handle_margin_mode_and_params('setLeverage', params, 'cross')
|
1889
2127
|
if (marginMode != 'cross') and (marginMode != 'isolated'):
|
1890
2128
|
raise BadRequest(self.id + ' setLeverage() requires a marginMode parameter that must be either cross or isolated')
|
1891
|
-
request = {
|
2129
|
+
request: dict = {
|
1892
2130
|
'leverage': leverage,
|
1893
2131
|
'marginMode': marginMode,
|
1894
2132
|
'instId': market['id'],
|
@@ -1899,15 +2137,17 @@ class blofin(Exchange, ImplicitAPI):
|
|
1899
2137
|
def close_position(self, symbol: str, side: OrderSide = None, params={}) -> Order:
|
1900
2138
|
"""
|
1901
2139
|
closes open positions for a market
|
1902
|
-
|
2140
|
+
|
2141
|
+
https://blofin.com/docs#close-positions
|
2142
|
+
|
1903
2143
|
:param str symbol: Unified CCXT market symbol
|
1904
2144
|
:param str [side]: 'buy' or 'sell', leave in net mode
|
1905
2145
|
:param dict [params]: extra parameters specific to the blofin api endpoint
|
1906
2146
|
:param str [params.clientOrderId]: a unique identifier for the order
|
1907
2147
|
:param str [params.marginMode]: 'cross' or 'isolated', default is 'cross
|
1908
2148
|
:param str [params.code]: *required in the case of closing cross MARGIN position for Single-currency margin* margin currency
|
1909
|
-
|
1910
|
-
|
2149
|
+
|
2150
|
+
EXCHANGE SPECIFIC PARAMETERS
|
1911
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
|
1912
2152
|
:param str [params.tag]: order tag a combination of case-sensitive alphanumerics, all numbers, or all letters of up to 16 characters
|
1913
2153
|
:returns dict[]: `A list of position structures <https://docs.ccxt.com/#/?id=position-structure>`
|
@@ -1917,7 +2157,7 @@ class blofin(Exchange, ImplicitAPI):
|
|
1917
2157
|
clientOrderId = self.safe_string(params, 'clientOrderId')
|
1918
2158
|
marginMode = None
|
1919
2159
|
marginMode, params = self.handle_margin_mode_and_params('closePosition', params, 'cross')
|
1920
|
-
request = {
|
2160
|
+
request: dict = {
|
1921
2161
|
'instId': market['id'],
|
1922
2162
|
'marginMode': marginMode,
|
1923
2163
|
}
|
@@ -1929,13 +2169,15 @@ class blofin(Exchange, ImplicitAPI):
|
|
1929
2169
|
def fetch_closed_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
|
1930
2170
|
"""
|
1931
2171
|
fetches information on multiple closed orders made by the user
|
1932
|
-
|
1933
|
-
|
2172
|
+
|
2173
|
+
https://blofin.com/docs#get-order-history
|
2174
|
+
https://blofin.com/docs#get-tpsl-order-history
|
2175
|
+
|
1934
2176
|
:param str symbol: unified market symbol of the market orders were made in
|
1935
2177
|
:param int [since]: the earliest time in ms to fetch orders for
|
1936
2178
|
:param int [limit]: the maximum number of orde structures to retrieve
|
1937
2179
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
1938
|
-
:param bool [params.
|
2180
|
+
:param bool [params.trigger]: True if fetching trigger or conditional orders
|
1939
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)
|
1940
2182
|
:returns Order[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
|
1941
2183
|
"""
|
@@ -1944,7 +2186,7 @@ class blofin(Exchange, ImplicitAPI):
|
|
1944
2186
|
paginate, params = self.handle_option_and_params(params, 'fetchClosedOrders', 'paginate')
|
1945
2187
|
if paginate:
|
1946
2188
|
return self.fetch_paginated_call_dynamic('fetchClosedOrders', symbol, since, limit, params)
|
1947
|
-
request = {
|
2189
|
+
request: dict = {
|
1948
2190
|
}
|
1949
2191
|
market = None
|
1950
2192
|
if symbol is not None:
|
@@ -1954,12 +2196,12 @@ class blofin(Exchange, ImplicitAPI):
|
|
1954
2196
|
request['limit'] = limit # default 100, max 100
|
1955
2197
|
if since is not None:
|
1956
2198
|
request['begin'] = since
|
1957
|
-
|
2199
|
+
isTrigger = self.safe_bool_n(params, ['stop', 'trigger', 'tpsl', 'TPSL'], False)
|
1958
2200
|
method: Str = None
|
1959
2201
|
method, params = self.handle_option_and_params(params, 'fetchOpenOrders', 'method', 'privateGetTradeOrdersHistory')
|
1960
2202
|
query = self.omit(params, ['method', 'stop', 'trigger', 'tpsl', 'TPSL'])
|
1961
2203
|
response = None
|
1962
|
-
if (
|
2204
|
+
if (isTrigger) or (method == 'privateGetTradeOrdersTpslHistory'):
|
1963
2205
|
response = self.privateGetTradeOrdersTpslHistory(self.extend(request, query))
|
1964
2206
|
else:
|
1965
2207
|
response = self.privateGetTradeOrdersHistory(self.extend(request, query))
|
@@ -1969,7 +2211,9 @@ class blofin(Exchange, ImplicitAPI):
|
|
1969
2211
|
def fetch_margin_mode(self, symbol: str, params={}) -> MarginMode:
|
1970
2212
|
"""
|
1971
2213
|
fetches the margin mode of a trading pair
|
1972
|
-
|
2214
|
+
|
2215
|
+
https://docs.blofin.com/index.html#get-margin-mode
|
2216
|
+
|
1973
2217
|
:param str symbol: unified symbol of the market to fetch the margin mode for
|
1974
2218
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
1975
2219
|
:returns dict: a `margin mode structure <https://docs.ccxt.com/#/?id=margin-mode-structure>`
|
@@ -1989,14 +2233,14 @@ class blofin(Exchange, ImplicitAPI):
|
|
1989
2233
|
data = self.safe_dict(response, 'data', {})
|
1990
2234
|
return self.parse_margin_mode(data, market)
|
1991
2235
|
|
1992
|
-
def parse_margin_mode(self, marginMode, market=None) -> MarginMode:
|
2236
|
+
def parse_margin_mode(self, marginMode: dict, market=None) -> MarginMode:
|
1993
2237
|
return {
|
1994
2238
|
'info': marginMode,
|
1995
2239
|
'symbol': market['symbol'],
|
1996
2240
|
'marginMode': self.safe_string(marginMode, 'marginMode'),
|
1997
2241
|
}
|
1998
2242
|
|
1999
|
-
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):
|
2000
2244
|
if response is None:
|
2001
2245
|
return None # fallback to default error handler
|
2002
2246
|
#
|