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/bitrue.py
CHANGED
@@ -7,9 +7,10 @@ from ccxt.base.exchange import Exchange
|
|
7
7
|
from ccxt.abstract.bitrue import ImplicitAPI
|
8
8
|
import hashlib
|
9
9
|
import json
|
10
|
-
from ccxt.base.types import Balances, Currency, Int, Market, Num, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, Transaction, TransferEntry
|
10
|
+
from ccxt.base.types import Balances, Currencies, Currency, Int, MarginModification, Market, Num, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, Transaction, TransferEntry
|
11
11
|
from typing import List
|
12
12
|
from ccxt.base.errors import ExchangeError
|
13
|
+
from ccxt.base.errors import AuthenticationError
|
13
14
|
from ccxt.base.errors import PermissionDenied
|
14
15
|
from ccxt.base.errors import AccountSuspended
|
15
16
|
from ccxt.base.errors import ArgumentsRequired
|
@@ -25,7 +26,6 @@ from ccxt.base.errors import RateLimitExceeded
|
|
25
26
|
from ccxt.base.errors import ExchangeNotAvailable
|
26
27
|
from ccxt.base.errors import OnMaintenance
|
27
28
|
from ccxt.base.errors import InvalidNonce
|
28
|
-
from ccxt.base.errors import AuthenticationError
|
29
29
|
from ccxt.base.decimal_to_precision import TRUNCATE
|
30
30
|
from ccxt.base.decimal_to_precision import TICK_SIZE
|
31
31
|
from ccxt.base.precise import Precise
|
@@ -72,7 +72,10 @@ class bitrue(Exchange, ImplicitAPI):
|
|
72
72
|
'fetchDepositsWithdrawals': False,
|
73
73
|
'fetchDepositWithdrawFee': 'emulated',
|
74
74
|
'fetchDepositWithdrawFees': True,
|
75
|
+
'fetchFundingHistory': False,
|
75
76
|
'fetchFundingRate': False,
|
77
|
+
'fetchFundingRateHistory': False,
|
78
|
+
'fetchFundingRates': False,
|
76
79
|
'fetchIsolatedBorrowRate': False,
|
77
80
|
'fetchIsolatedBorrowRates': False,
|
78
81
|
'fetchMarginMode': False,
|
@@ -112,7 +115,7 @@ class bitrue(Exchange, ImplicitAPI):
|
|
112
115
|
'1w': '1W',
|
113
116
|
},
|
114
117
|
'urls': {
|
115
|
-
'logo': 'https://
|
118
|
+
'logo': 'https://github.com/user-attachments/assets/67abe346-1273-461a-bd7c-42fa32907c8e',
|
116
119
|
'api': {
|
117
120
|
'spot': 'https://www.bitrue.com/api',
|
118
121
|
'fapi': 'https://fapi.bitrue.com/fapi',
|
@@ -344,6 +347,7 @@ class bitrue(Exchange, ImplicitAPI):
|
|
344
347
|
# 'fetchTradesMethod': 'publicGetAggTrades', # publicGetTrades, publicGetHistoricalTrades
|
345
348
|
'fetchMyTradesMethod': 'v2PrivateGetMyTrades', # spotV1PrivateGetMyTrades
|
346
349
|
'hasAlreadyAuthenticatedSuccessfully': False,
|
350
|
+
'currencyToPrecisionRoundingMode': TRUNCATE,
|
347
351
|
'recvWindow': 5 * 1000, # 5 sec, binance default
|
348
352
|
'timeDifference': 0, # the difference between system clock and Binance clock
|
349
353
|
'adjustForTimeDifference': False, # controls the adjustment logic upon instantiation
|
@@ -355,6 +359,67 @@ class bitrue(Exchange, ImplicitAPI):
|
|
355
359
|
'networks': {
|
356
360
|
'ERC20': 'ETH',
|
357
361
|
'TRC20': 'TRX',
|
362
|
+
'AETERNITY': 'Aeternity',
|
363
|
+
'AION': 'AION',
|
364
|
+
'ALGO': 'Algorand',
|
365
|
+
'ASK': 'ASK',
|
366
|
+
'ATOM': 'ATOM',
|
367
|
+
'AVAXC': 'AVAX C-Chain',
|
368
|
+
'BCH': 'BCH',
|
369
|
+
'BEP2': 'BEP2',
|
370
|
+
'BEP20': 'BEP20',
|
371
|
+
'Bitcoin': 'Bitcoin',
|
372
|
+
'BRP20': 'BRP20',
|
373
|
+
'ADA': 'Cardano',
|
374
|
+
'CASINOCOIN': 'CasinoCoin',
|
375
|
+
'CASINOCOIN-XRPL': 'CasinoCoin XRPL',
|
376
|
+
'CONTENTOS': 'Contentos',
|
377
|
+
'DASH': 'Dash',
|
378
|
+
'DECOIN': 'Decoin',
|
379
|
+
'DFI': 'DeFiChain',
|
380
|
+
'DGB': 'DGB',
|
381
|
+
'DIVI': 'Divi',
|
382
|
+
'DOGE': 'dogecoin',
|
383
|
+
'EOS': 'EOS',
|
384
|
+
'ETC': 'ETC',
|
385
|
+
'FILECOIN': 'Filecoin',
|
386
|
+
'FREETON': 'FREETON',
|
387
|
+
'HBAR': 'HBAR',
|
388
|
+
'HEDERA': 'Hedera Hashgraph',
|
389
|
+
'HRC20': 'HRC20',
|
390
|
+
'ICON': 'ICON',
|
391
|
+
'ICP': 'ICP',
|
392
|
+
'IGNIS': 'Ignis',
|
393
|
+
'INTERNETCOMPUTER': 'Internet Computer',
|
394
|
+
'IOTA': 'IOTA',
|
395
|
+
'KAVA': 'KAVA',
|
396
|
+
'KSM': 'KSM',
|
397
|
+
'LTC': 'LiteCoin',
|
398
|
+
'LUNA': 'Luna',
|
399
|
+
'MATIC': 'MATIC',
|
400
|
+
'MOBILECOIN': 'Mobile Coin',
|
401
|
+
'MONACOIN': 'MonaCoin',
|
402
|
+
'XMR': 'Monero',
|
403
|
+
'NEM': 'NEM',
|
404
|
+
'NEP5': 'NEP5',
|
405
|
+
'OMNI': 'OMNI',
|
406
|
+
'PAC': 'PAC',
|
407
|
+
'DOT': 'Polkadot',
|
408
|
+
'RAVEN': 'Ravencoin',
|
409
|
+
'SAFEX': 'Safex',
|
410
|
+
'SOL': 'SOLANA',
|
411
|
+
'SGB': 'Songbird',
|
412
|
+
'XML': 'Stellar Lumens',
|
413
|
+
'XYM': 'Symbol',
|
414
|
+
'XTZ': 'Tezos',
|
415
|
+
'theta': 'theta',
|
416
|
+
'THETA': 'THETA',
|
417
|
+
'VECHAIN': 'VeChain',
|
418
|
+
'WANCHAIN': 'Wanchain',
|
419
|
+
'XINFIN': 'XinFin Network',
|
420
|
+
'XRP': 'XRP',
|
421
|
+
'XRPL': 'XRPL',
|
422
|
+
'ZIL': 'ZIL',
|
358
423
|
},
|
359
424
|
'defaultType': 'spot',
|
360
425
|
'timeframes': {
|
@@ -394,7 +459,92 @@ class bitrue(Exchange, ImplicitAPI):
|
|
394
459
|
'MIM': 'MIM Swarm',
|
395
460
|
},
|
396
461
|
'precisionMode': TICK_SIZE,
|
397
|
-
|
462
|
+
'features': {
|
463
|
+
'default': {
|
464
|
+
'sandbox': False,
|
465
|
+
'createOrder': {
|
466
|
+
'marginMode': False,
|
467
|
+
'triggerPrice': True,
|
468
|
+
'triggerPriceType': None,
|
469
|
+
'triggerDirection': None,
|
470
|
+
'stopLossPrice': False, # todo
|
471
|
+
'takeProfitPrice': False, # todo
|
472
|
+
'attachedStopLossTakeProfit': None,
|
473
|
+
'timeInForce': {
|
474
|
+
'IOC': True,
|
475
|
+
'FOK': True,
|
476
|
+
'PO': True,
|
477
|
+
'GTD': False,
|
478
|
+
},
|
479
|
+
'hedged': False,
|
480
|
+
'trailing': False,
|
481
|
+
'leverage': False,
|
482
|
+
'marketBuyRequiresPrice': True, # todo revise
|
483
|
+
'marketBuyByCost': True,
|
484
|
+
'selfTradePrevention': False,
|
485
|
+
'iceberg': True, # todo implement
|
486
|
+
},
|
487
|
+
'createOrders': None,
|
488
|
+
'fetchMyTrades': {
|
489
|
+
'marginMode': False,
|
490
|
+
'limit': 1000,
|
491
|
+
'daysBack': 100000,
|
492
|
+
'untilDays': 100000,
|
493
|
+
},
|
494
|
+
'fetchOrder': {
|
495
|
+
'marginMode': False,
|
496
|
+
'trigger': False,
|
497
|
+
'trailing': False,
|
498
|
+
},
|
499
|
+
'fetchOpenOrders': {
|
500
|
+
'marginMode': False,
|
501
|
+
'limit': None,
|
502
|
+
'trigger': False,
|
503
|
+
'trailing': False,
|
504
|
+
},
|
505
|
+
'fetchOrders': None,
|
506
|
+
'fetchClosedOrders': {
|
507
|
+
'marginMode': False,
|
508
|
+
'limit': 1000,
|
509
|
+
'daysBack': 90,
|
510
|
+
'daysBackCanceled': 1,
|
511
|
+
'untilDays': 90,
|
512
|
+
'trigger': False,
|
513
|
+
'trailing': False,
|
514
|
+
},
|
515
|
+
'fetchOHLCV': {
|
516
|
+
'limit': 1440,
|
517
|
+
},
|
518
|
+
},
|
519
|
+
'spot': {
|
520
|
+
'extends': 'default',
|
521
|
+
},
|
522
|
+
'forDerivatives': {
|
523
|
+
'extends': 'default',
|
524
|
+
'createOrder': {
|
525
|
+
'marginMode': True,
|
526
|
+
'leverage': True,
|
527
|
+
'marketBuyRequiresPrice': False,
|
528
|
+
'marketBuyByCost': False,
|
529
|
+
},
|
530
|
+
'fetchOHLCV': {
|
531
|
+
'limit': 300,
|
532
|
+
},
|
533
|
+
'fetchClosedOrders': None,
|
534
|
+
},
|
535
|
+
'swap': {
|
536
|
+
'linear': {
|
537
|
+
'extends': 'forDerivatives',
|
538
|
+
},
|
539
|
+
'inverse': {
|
540
|
+
'extends': 'forDerivatives',
|
541
|
+
},
|
542
|
+
},
|
543
|
+
'future': {
|
544
|
+
'linear': None,
|
545
|
+
'inverse': None,
|
546
|
+
},
|
547
|
+
},
|
398
548
|
'exceptions': {
|
399
549
|
'exact': {
|
400
550
|
'System is under maintenance.': OnMaintenance, # {"code":1,"msg":"System is under maintenance."}
|
@@ -421,7 +571,7 @@ class bitrue(Exchange, ImplicitAPI):
|
|
421
571
|
'-1022': AuthenticationError, # {"code":-1022,"msg":"Signature for self request is not valid."}
|
422
572
|
'-1100': BadRequest, # createOrder(symbol, 1, asdf) -> 'Illegal characters found in parameter 'price'
|
423
573
|
'-1101': BadRequest, # Too many parameters; expected %s and received %s.
|
424
|
-
'-1102': BadRequest, # Param %s or %s must be sent, but both were empty
|
574
|
+
'-1102': BadRequest, # Param %s or %s must be sent, but both were empty # {"code":-1102,"msg":"timestamp IllegalArgumentException.","data":null}
|
425
575
|
'-1103': BadRequest, # An unknown parameter was sent.
|
426
576
|
'-1104': BadRequest, # Not all sent parameters were read, read 8 parameters but was sent 9
|
427
577
|
'-1105': BadRequest, # Parameter %s was empty.
|
@@ -466,26 +616,22 @@ class bitrue(Exchange, ImplicitAPI):
|
|
466
616
|
'-4051': InsufficientFunds, # {"code":-4051,"msg":"Isolated balance insufficient."}
|
467
617
|
},
|
468
618
|
'broad': {
|
619
|
+
'Insufficient account balance': InsufficientFunds, # {"code":-2010,"msg":"Insufficient account balance.","data":null}
|
469
620
|
'has no operation privilege': PermissionDenied,
|
470
621
|
'MAX_POSITION': InvalidOrder, # {"code":-2010,"msg":"Filter failure: MAX_POSITION"}
|
471
622
|
},
|
472
623
|
},
|
473
624
|
})
|
474
625
|
|
475
|
-
def currency_to_precision(self, code, fee, networkCode=None):
|
476
|
-
# info is available in currencies only if the user has configured his api keys
|
477
|
-
if self.safe_value(self.currencies[code], 'precision') is not None:
|
478
|
-
return self.decimal_to_precision(fee, TRUNCATE, self.currencies[code]['precision'], self.precisionMode, self.paddingMode)
|
479
|
-
else:
|
480
|
-
return self.number_to_string(fee)
|
481
|
-
|
482
626
|
def nonce(self):
|
483
627
|
return self.milliseconds() - self.options['timeDifference']
|
484
628
|
|
485
629
|
def fetch_status(self, params={}):
|
486
630
|
"""
|
487
631
|
the latest known information on the availability of the exchange API
|
488
|
-
|
632
|
+
|
633
|
+
https://github.com/Bitrue-exchange/Spot-official-api-docs#test-connectivity
|
634
|
+
|
489
635
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
490
636
|
:returns dict: a `status structure <https://docs.ccxt.com/#/?id=exchange-status-structure>`
|
491
637
|
"""
|
@@ -509,7 +655,9 @@ class bitrue(Exchange, ImplicitAPI):
|
|
509
655
|
def fetch_time(self, params={}):
|
510
656
|
"""
|
511
657
|
fetches the current integer timestamp in milliseconds from the exchange server
|
512
|
-
|
658
|
+
|
659
|
+
https://github.com/Bitrue-exchange/Spot-official-api-docs#check-server-time
|
660
|
+
|
513
661
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
514
662
|
:returns int: the current integer timestamp in milliseconds from the exchange server
|
515
663
|
"""
|
@@ -521,78 +669,7 @@ class bitrue(Exchange, ImplicitAPI):
|
|
521
669
|
#
|
522
670
|
return self.safe_integer(response, 'serverTime')
|
523
671
|
|
524
|
-
def
|
525
|
-
uppercaseNetworkId = networkId.upper()
|
526
|
-
networksById = {
|
527
|
-
'Aeternity': 'Aeternity',
|
528
|
-
'AION': 'AION',
|
529
|
-
'Algorand': 'Algorand',
|
530
|
-
'ASK': 'ASK',
|
531
|
-
'ATOM': 'ATOM',
|
532
|
-
'AVAX C-Chain': 'AVAX C-Chain',
|
533
|
-
'bch': 'bch',
|
534
|
-
'BCH': 'BCH',
|
535
|
-
'BEP2': 'BEP2',
|
536
|
-
'BEP20': 'BEP20',
|
537
|
-
'Bitcoin': 'Bitcoin',
|
538
|
-
'BRP20': 'BRP20',
|
539
|
-
'Cardano': 'ADA',
|
540
|
-
'CasinoCoin': 'CasinoCoin',
|
541
|
-
'CasinoCoin XRPL': 'CasinoCoin XRPL',
|
542
|
-
'Contentos': 'Contentos',
|
543
|
-
'Dash': 'Dash',
|
544
|
-
'Decoin': 'Decoin',
|
545
|
-
'DeFiChain': 'DeFiChain',
|
546
|
-
'DGB': 'DGB',
|
547
|
-
'Divi': 'Divi',
|
548
|
-
'dogecoin': 'DOGE',
|
549
|
-
'EOS': 'EOS',
|
550
|
-
'ERC20': 'ERC20',
|
551
|
-
'ETC': 'ETC',
|
552
|
-
'Filecoin': 'Filecoin',
|
553
|
-
'FREETON': 'FREETON',
|
554
|
-
'HBAR': 'HBAR',
|
555
|
-
'Hedera Hashgraph': 'Hedera Hashgraph',
|
556
|
-
'HRC20': 'HRC20',
|
557
|
-
'ICON': 'ICON',
|
558
|
-
'ICP': 'ICP',
|
559
|
-
'Ignis': 'Ignis',
|
560
|
-
'Internet Computer': 'Internet Computer',
|
561
|
-
'IOTA': 'IOTA',
|
562
|
-
'KAVA': 'KAVA',
|
563
|
-
'KSM': 'KSM',
|
564
|
-
'LiteCoin': 'LiteCoin',
|
565
|
-
'Luna': 'Luna',
|
566
|
-
'MATIC': 'MATIC',
|
567
|
-
'Mobile Coin': 'Mobile Coin',
|
568
|
-
'MonaCoin': 'MonaCoin',
|
569
|
-
'Monero': 'Monero',
|
570
|
-
'NEM': 'NEM',
|
571
|
-
'NEP5': 'NEP5',
|
572
|
-
'OMNI': 'OMNI',
|
573
|
-
'PAC': 'PAC',
|
574
|
-
'Polkadot': 'Polkadot',
|
575
|
-
'Ravencoin': 'Ravencoin',
|
576
|
-
'Safex': 'Safex',
|
577
|
-
'SOLANA': 'SOL',
|
578
|
-
'Songbird': 'Songbird',
|
579
|
-
'Stellar Lumens': 'Stellar Lumens',
|
580
|
-
'Symbol': 'Symbol',
|
581
|
-
'Tezos': 'XTZ',
|
582
|
-
'theta': 'theta',
|
583
|
-
'THETA': 'THETA',
|
584
|
-
'TRC20': 'TRC20',
|
585
|
-
'VeChain': 'VeChain',
|
586
|
-
'VECHAIN': 'VECHAIN',
|
587
|
-
'Wanchain': 'Wanchain',
|
588
|
-
'XinFin Network': 'XinFin Network',
|
589
|
-
'XRP': 'XRP',
|
590
|
-
'XRPL': 'XRPL',
|
591
|
-
'ZIL': 'ZIL',
|
592
|
-
}
|
593
|
-
return self.safe_string_2(networksById, networkId, uppercaseNetworkId, networkId)
|
594
|
-
|
595
|
-
def fetch_currencies(self, params={}):
|
672
|
+
def fetch_currencies(self, params={}) -> Currencies:
|
596
673
|
"""
|
597
674
|
fetches all available currencies on an exchange
|
598
675
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
@@ -645,8 +722,8 @@ class bitrue(Exchange, ImplicitAPI):
|
|
645
722
|
# ],
|
646
723
|
# }
|
647
724
|
#
|
648
|
-
result = {}
|
649
|
-
coins = self.
|
725
|
+
result: dict = {}
|
726
|
+
coins = self.safe_list(response, 'coins', [])
|
650
727
|
for i in range(0, len(coins)):
|
651
728
|
currency = coins[i]
|
652
729
|
id = self.safe_string(currency, 'coin')
|
@@ -657,15 +734,15 @@ class bitrue(Exchange, ImplicitAPI):
|
|
657
734
|
minWithdrawString = None
|
658
735
|
maxWithdrawString = None
|
659
736
|
minWithdrawFeeString = None
|
660
|
-
networkDetails = self.
|
661
|
-
networks = {}
|
737
|
+
networkDetails = self.safe_list(currency, 'chainDetail', [])
|
738
|
+
networks: dict = {}
|
662
739
|
for j in range(0, len(networkDetails)):
|
663
740
|
entry = networkDetails[j]
|
664
741
|
networkId = self.safe_string(entry, 'chain')
|
665
742
|
network = self.network_id_to_code(networkId, code)
|
666
|
-
enableDeposit = self.
|
743
|
+
enableDeposit = self.safe_bool(entry, 'enableDeposit')
|
667
744
|
deposit = enableDeposit if (enableDeposit) else deposit
|
668
|
-
enableWithdraw = self.
|
745
|
+
enableWithdraw = self.safe_bool(entry, 'enableWithdraw')
|
669
746
|
withdraw = enableWithdraw if (enableWithdraw) else withdraw
|
670
747
|
networkWithdrawFeeString = self.safe_string(entry, 'withdrawFee')
|
671
748
|
if networkWithdrawFeeString is not None:
|
@@ -713,12 +790,14 @@ class bitrue(Exchange, ImplicitAPI):
|
|
713
790
|
}
|
714
791
|
return result
|
715
792
|
|
716
|
-
def fetch_markets(self, params={}):
|
793
|
+
def fetch_markets(self, params={}) -> List[Market]:
|
717
794
|
"""
|
718
795
|
retrieves data on all markets for bitrue
|
719
|
-
|
720
|
-
|
721
|
-
|
796
|
+
|
797
|
+
https://github.com/Bitrue-exchange/Spot-official-api-docs#exchangeInfo_endpoint
|
798
|
+
https://www.bitrue.com/api-docs#current-open-contract
|
799
|
+
https://www.bitrue.com/api_docs_includes_file/delivery.html#current-open-contract
|
800
|
+
|
722
801
|
:param dict [params]: extra parameters specific to the exchange api endpoint
|
723
802
|
:returns dict[]: an array of objects representing market data
|
724
803
|
"""
|
@@ -809,7 +888,7 @@ class bitrue(Exchange, ImplicitAPI):
|
|
809
888
|
self.load_time_difference()
|
810
889
|
return self.parse_markets(markets)
|
811
890
|
|
812
|
-
def parse_market(self, market) -> Market:
|
891
|
+
def parse_market(self, market: dict) -> Market:
|
813
892
|
id = self.safe_string(market, 'symbol')
|
814
893
|
lowercaseId = self.safe_string_lower(market, 'symbol')
|
815
894
|
side = self.safe_integer(market, 'side') # 1 linear, 0 inverse, None spot
|
@@ -841,11 +920,11 @@ class bitrue(Exchange, ImplicitAPI):
|
|
841
920
|
symbol = base + '/' + quote
|
842
921
|
if settle is not None:
|
843
922
|
symbol += ':' + settle
|
844
|
-
filters = self.
|
923
|
+
filters = self.safe_list(market, 'filters', [])
|
845
924
|
filtersByType = self.index_by(filters, 'filterType')
|
846
925
|
status = self.safe_string(market, 'status')
|
847
|
-
priceFilter = self.
|
848
|
-
amountFilter = self.
|
926
|
+
priceFilter = self.safe_dict(filtersByType, 'PRICE_FILTER', {})
|
927
|
+
amountFilter = self.safe_dict(filtersByType, 'LOT_SIZE', {})
|
849
928
|
defaultPricePrecision = self.safe_string(market, 'pricePrecision')
|
850
929
|
defaultAmountPrecision = self.safe_string(market, 'quantityPrecision')
|
851
930
|
pricePrecision = self.safe_string(priceFilter, 'priceScale', defaultPricePrecision)
|
@@ -955,7 +1034,7 @@ class bitrue(Exchange, ImplicitAPI):
|
|
955
1034
|
# ]
|
956
1035
|
# }
|
957
1036
|
#
|
958
|
-
result = {
|
1037
|
+
result: dict = {
|
959
1038
|
'info': response,
|
960
1039
|
}
|
961
1040
|
timestamp = self.safe_integer(response, 'updateTime')
|
@@ -975,9 +1054,11 @@ class bitrue(Exchange, ImplicitAPI):
|
|
975
1054
|
def fetch_balance(self, params={}) -> Balances:
|
976
1055
|
"""
|
977
1056
|
query for balance and get the amount of funds available for trading or funds locked in orders
|
978
|
-
|
979
|
-
|
980
|
-
|
1057
|
+
|
1058
|
+
https://github.com/Bitrue-exchange/Spot-official-api-docs#account-information-user_data
|
1059
|
+
https://www.bitrue.com/api-docs#account-information-v2-user_data-hmac-sha256
|
1060
|
+
https://www.bitrue.com/api_docs_includes_file/delivery.html#account-information-v2-user_data-hmac-sha256
|
1061
|
+
|
981
1062
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
982
1063
|
:param str [params.type]: 'future', 'delivery', 'spot', 'swap'
|
983
1064
|
:param str [params.subType]: 'linear', 'inverse'
|
@@ -993,7 +1074,7 @@ class bitrue(Exchange, ImplicitAPI):
|
|
993
1074
|
if type == 'swap':
|
994
1075
|
if subType is not None and subType == 'inverse':
|
995
1076
|
response = self.dapiV2PrivateGetAccount(params)
|
996
|
-
result = self.
|
1077
|
+
result = self.safe_dict(response, 'data', {})
|
997
1078
|
#
|
998
1079
|
# {
|
999
1080
|
# "code":"0",
|
@@ -1026,7 +1107,7 @@ class bitrue(Exchange, ImplicitAPI):
|
|
1026
1107
|
#
|
1027
1108
|
else:
|
1028
1109
|
response = self.fapiV2PrivateGetAccount(params)
|
1029
|
-
result = self.
|
1110
|
+
result = self.safe_dict(response, 'data', {})
|
1030
1111
|
#
|
1031
1112
|
# {
|
1032
1113
|
# "code":"0",
|
@@ -1082,9 +1163,11 @@ class bitrue(Exchange, ImplicitAPI):
|
|
1082
1163
|
def fetch_order_book(self, symbol: str, limit: Int = None, params={}) -> OrderBook:
|
1083
1164
|
"""
|
1084
1165
|
fetches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
|
1085
|
-
|
1086
|
-
|
1087
|
-
|
1166
|
+
|
1167
|
+
https://github.com/Bitrue-exchange/Spot-official-api-docs#order-book
|
1168
|
+
https://www.bitrue.com/api-docs#order-book
|
1169
|
+
https://www.bitrue.com/api_docs_includes_file/delivery.html#order-book
|
1170
|
+
|
1088
1171
|
:param str symbol: unified symbol of the market to fetch the order book for
|
1089
1172
|
:param int [limit]: the maximum amount of order book entries to return
|
1090
1173
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
@@ -1094,7 +1177,7 @@ class bitrue(Exchange, ImplicitAPI):
|
|
1094
1177
|
market = self.market(symbol)
|
1095
1178
|
response = None
|
1096
1179
|
if market['swap']:
|
1097
|
-
request = {
|
1180
|
+
request: dict = {
|
1098
1181
|
'contractName': market['id'],
|
1099
1182
|
}
|
1100
1183
|
if limit is not None:
|
@@ -1106,7 +1189,7 @@ class bitrue(Exchange, ImplicitAPI):
|
|
1106
1189
|
elif market['inverse']:
|
1107
1190
|
response = self.dapiV1PublicGetDepth(self.extend(request, params))
|
1108
1191
|
elif market['spot']:
|
1109
|
-
request = {
|
1192
|
+
request: dict = {
|
1110
1193
|
'symbol': market['id'],
|
1111
1194
|
}
|
1112
1195
|
if limit is not None:
|
@@ -1146,7 +1229,7 @@ class bitrue(Exchange, ImplicitAPI):
|
|
1146
1229
|
orderbook['nonce'] = self.safe_integer(response, 'lastUpdateId')
|
1147
1230
|
return orderbook
|
1148
1231
|
|
1149
|
-
def parse_ticker(self, ticker, market: Market = None) -> Ticker:
|
1232
|
+
def parse_ticker(self, ticker: dict, market: Market = None) -> Ticker:
|
1150
1233
|
#
|
1151
1234
|
# fetchBidsAsks
|
1152
1235
|
#
|
@@ -1216,9 +1299,11 @@ class bitrue(Exchange, ImplicitAPI):
|
|
1216
1299
|
def fetch_ticker(self, symbol: str, params={}) -> Ticker:
|
1217
1300
|
"""
|
1218
1301
|
fetches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
|
1219
|
-
|
1220
|
-
|
1221
|
-
|
1302
|
+
|
1303
|
+
https://github.com/Bitrue-exchange/Spot-official-api-docs#24hr-ticker-price-change-statistics
|
1304
|
+
https://www.bitrue.com/api-docs#ticker
|
1305
|
+
https://www.bitrue.com/api_docs_includes_file/delivery.html#ticker
|
1306
|
+
|
1222
1307
|
:param str symbol: unified symbol of the market to fetch the ticker for
|
1223
1308
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
1224
1309
|
:returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
|
@@ -1228,7 +1313,7 @@ class bitrue(Exchange, ImplicitAPI):
|
|
1228
1313
|
response = None
|
1229
1314
|
data = None
|
1230
1315
|
if market['swap']:
|
1231
|
-
request = {
|
1316
|
+
request: dict = {
|
1232
1317
|
'contractName': market['id'],
|
1233
1318
|
}
|
1234
1319
|
if market['linear']:
|
@@ -1237,11 +1322,11 @@ class bitrue(Exchange, ImplicitAPI):
|
|
1237
1322
|
response = self.dapiV1PublicGetTicker(self.extend(request, params))
|
1238
1323
|
data = response
|
1239
1324
|
elif market['spot']:
|
1240
|
-
request = {
|
1325
|
+
request: dict = {
|
1241
1326
|
'symbol': market['id'],
|
1242
1327
|
}
|
1243
1328
|
response = self.spotV1PublicGetTicker24hr(self.extend(request, params))
|
1244
|
-
data = self.
|
1329
|
+
data = self.safe_dict(response, 0, {})
|
1245
1330
|
else:
|
1246
1331
|
raise NotSupported(self.id + ' fetchTicker only support spot & swap markets')
|
1247
1332
|
#
|
@@ -1287,9 +1372,10 @@ class bitrue(Exchange, ImplicitAPI):
|
|
1287
1372
|
def fetch_ohlcv(self, symbol: str, timeframe='1m', since: Int = None, limit: Int = None, params={}) -> List[list]:
|
1288
1373
|
"""
|
1289
1374
|
fetches historical candlestick data containing the open, high, low, and close price, and the volume of a market
|
1290
|
-
|
1291
|
-
|
1292
|
-
|
1375
|
+
|
1376
|
+
https://www.bitrue.com/api_docs_includes_file/spot/index.html#kline-data
|
1377
|
+
https://www.bitrue.com/api_docs_includes_file/futures/index.html#kline-candlestick-data
|
1378
|
+
|
1293
1379
|
:param str symbol: unified symbol of the market to fetch OHLCV data for
|
1294
1380
|
:param str timeframe: the length of time each candle represents
|
1295
1381
|
:param int [since]: timestamp in ms of the earliest candle to fetch
|
@@ -1299,19 +1385,17 @@ class bitrue(Exchange, ImplicitAPI):
|
|
1299
1385
|
"""
|
1300
1386
|
self.load_markets()
|
1301
1387
|
market = self.market(symbol)
|
1302
|
-
timeframes = self.
|
1388
|
+
timeframes = self.safe_dict(self.options, 'timeframes', {})
|
1303
1389
|
response = None
|
1304
1390
|
data = None
|
1305
1391
|
if market['swap']:
|
1306
|
-
timeframesFuture = self.
|
1307
|
-
request = {
|
1392
|
+
timeframesFuture = self.safe_dict(timeframes, 'future', {})
|
1393
|
+
request: dict = {
|
1308
1394
|
'contractName': market['id'],
|
1309
1395
|
# 1min / 5min / 15min / 30min / 1h / 1day / 1week / 1month
|
1310
1396
|
'interval': self.safe_string(timeframesFuture, timeframe, '1min'),
|
1311
1397
|
}
|
1312
1398
|
if limit is not None:
|
1313
|
-
if limit > 300:
|
1314
|
-
limit = 300
|
1315
1399
|
request['limit'] = limit
|
1316
1400
|
if market['linear']:
|
1317
1401
|
response = self.fapiV1PublicGetKlines(self.extend(request, params))
|
@@ -1319,20 +1403,18 @@ class bitrue(Exchange, ImplicitAPI):
|
|
1319
1403
|
response = self.dapiV1PublicGetKlines(self.extend(request, params))
|
1320
1404
|
data = response
|
1321
1405
|
elif market['spot']:
|
1322
|
-
timeframesSpot = self.
|
1323
|
-
request = {
|
1406
|
+
timeframesSpot = self.safe_dict(timeframes, 'spot', {})
|
1407
|
+
request: dict = {
|
1324
1408
|
'symbol': market['id'],
|
1325
1409
|
# 1m / 5m / 15m / 30m / 1H / 2H / 4H / 12H / 1D / 1W
|
1326
1410
|
'scale': self.safe_string(timeframesSpot, timeframe, '1m'),
|
1327
1411
|
}
|
1328
1412
|
if limit is not None:
|
1329
|
-
if limit > 1440:
|
1330
|
-
limit = 1440
|
1331
1413
|
request['limit'] = limit
|
1332
1414
|
if since is not None:
|
1333
1415
|
request['fromIdx'] = since
|
1334
1416
|
response = self.spotV1PublicGetMarketKline(self.extend(request, params))
|
1335
|
-
data = self.
|
1417
|
+
data = self.safe_list(response, 'data', [])
|
1336
1418
|
else:
|
1337
1419
|
raise NotSupported(self.id + ' fetchOHLCV only support spot & swap markets')
|
1338
1420
|
#
|
@@ -1409,9 +1491,11 @@ class bitrue(Exchange, ImplicitAPI):
|
|
1409
1491
|
def fetch_bids_asks(self, symbols: Strings = None, params={}):
|
1410
1492
|
"""
|
1411
1493
|
fetches the bid and ask price and volume for multiple markets
|
1412
|
-
|
1413
|
-
|
1414
|
-
|
1494
|
+
|
1495
|
+
https://github.com/Bitrue-exchange/Spot-official-api-docs#symbol-order-book-ticker
|
1496
|
+
https://www.bitrue.com/api-docs#ticker
|
1497
|
+
https://www.bitrue.com/api_docs_includes_file/delivery.html#ticker
|
1498
|
+
|
1415
1499
|
:param str[]|None symbols: unified symbols of the markets to fetch the bids and asks for, all markets are returned if not assigned
|
1416
1500
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
1417
1501
|
:returns dict: a dictionary of `ticker structures <https://docs.ccxt.com/#/?id=ticker-structure>`
|
@@ -1422,7 +1506,7 @@ class bitrue(Exchange, ImplicitAPI):
|
|
1422
1506
|
market = self.market(first)
|
1423
1507
|
response = None
|
1424
1508
|
if market['swap']:
|
1425
|
-
request = {
|
1509
|
+
request: dict = {
|
1426
1510
|
'contractName': market['id'],
|
1427
1511
|
}
|
1428
1512
|
if market['linear']:
|
@@ -1430,7 +1514,7 @@ class bitrue(Exchange, ImplicitAPI):
|
|
1430
1514
|
elif market['inverse']:
|
1431
1515
|
response = self.dapiV1PublicGetTicker(self.extend(request, params))
|
1432
1516
|
elif market['spot']:
|
1433
|
-
request = {
|
1517
|
+
request: dict = {
|
1434
1518
|
'symbol': market['id'],
|
1435
1519
|
}
|
1436
1520
|
response = self.spotV1PublicGetTickerBookTicker(self.extend(request, params))
|
@@ -1460,16 +1544,18 @@ class bitrue(Exchange, ImplicitAPI):
|
|
1460
1544
|
# "time": 1699348013000
|
1461
1545
|
# }
|
1462
1546
|
#
|
1463
|
-
data = {}
|
1547
|
+
data: dict = {}
|
1464
1548
|
data[market['id']] = response
|
1465
1549
|
return self.parse_tickers(data, symbols)
|
1466
1550
|
|
1467
1551
|
def fetch_tickers(self, symbols: Strings = None, params={}) -> Tickers:
|
1468
1552
|
"""
|
1469
1553
|
fetches price tickers for multiple markets, statistical information calculated over the past 24 hours for each market
|
1470
|
-
|
1471
|
-
|
1472
|
-
|
1554
|
+
|
1555
|
+
https://github.com/Bitrue-exchange/Spot-official-api-docs#24hr-ticker-price-change-statistics
|
1556
|
+
https://www.bitrue.com/api-docs#ticker
|
1557
|
+
https://www.bitrue.com/api_docs_includes_file/delivery.html#ticker
|
1558
|
+
|
1473
1559
|
:param str[]|None symbols: unified symbols of the markets to fetch the ticker for, all market tickers are returned if not assigned
|
1474
1560
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
1475
1561
|
:returns dict: a dictionary of `ticker structures <https://docs.ccxt.com/#/?id=ticker-structure>`
|
@@ -1478,7 +1564,7 @@ class bitrue(Exchange, ImplicitAPI):
|
|
1478
1564
|
symbols = self.market_symbols(symbols)
|
1479
1565
|
response = None
|
1480
1566
|
data = None
|
1481
|
-
request = {}
|
1567
|
+
request: dict = {}
|
1482
1568
|
type = None
|
1483
1569
|
if symbols is not None:
|
1484
1570
|
first = self.safe_string(symbols, 0)
|
@@ -1537,14 +1623,14 @@ class bitrue(Exchange, ImplicitAPI):
|
|
1537
1623
|
# the exchange returns market ids with an underscore from the tickers endpoint
|
1538
1624
|
# the market ids do not have an underscore, so it has to be removed
|
1539
1625
|
# https://github.com/ccxt/ccxt/issues/13856
|
1540
|
-
tickers = {}
|
1626
|
+
tickers: dict = {}
|
1541
1627
|
for i in range(0, len(data)):
|
1542
|
-
ticker = self.
|
1628
|
+
ticker = self.safe_dict(data, i, {})
|
1543
1629
|
market = self.market(self.safe_value(ticker, 'symbol'))
|
1544
1630
|
tickers[market['id']] = ticker
|
1545
1631
|
return self.parse_tickers(tickers, symbols)
|
1546
1632
|
|
1547
|
-
def parse_trade(self, trade, market: Market = None) -> Trade:
|
1633
|
+
def parse_trade(self, trade: dict, market: Market = None) -> Trade:
|
1548
1634
|
#
|
1549
1635
|
# fetchTrades
|
1550
1636
|
#
|
@@ -1601,8 +1687,8 @@ class bitrue(Exchange, ImplicitAPI):
|
|
1601
1687
|
orderId = self.safe_string(trade, 'orderId')
|
1602
1688
|
id = self.safe_string_2(trade, 'id', 'tradeId')
|
1603
1689
|
side = None
|
1604
|
-
buyerMaker = self.
|
1605
|
-
isBuyer = self.
|
1690
|
+
buyerMaker = self.safe_bool(trade, 'isBuyerMaker') # ignore "m" until Bitrue fixes api
|
1691
|
+
isBuyer = self.safe_bool(trade, 'isBuyer')
|
1606
1692
|
if buyerMaker is not None:
|
1607
1693
|
side = 'sell' if buyerMaker else 'buy'
|
1608
1694
|
if isBuyer is not None:
|
@@ -1614,7 +1700,7 @@ class bitrue(Exchange, ImplicitAPI):
|
|
1614
1700
|
'currency': self.safe_currency_code(self.safe_string(trade, 'commissionAssert')),
|
1615
1701
|
}
|
1616
1702
|
takerOrMaker = None
|
1617
|
-
isMaker = self.
|
1703
|
+
isMaker = self.safe_bool(trade, 'isMaker')
|
1618
1704
|
if isMaker is not None:
|
1619
1705
|
takerOrMaker = 'maker' if isMaker else 'taker'
|
1620
1706
|
return self.safe_trade({
|
@@ -1636,7 +1722,9 @@ class bitrue(Exchange, ImplicitAPI):
|
|
1636
1722
|
def fetch_trades(self, symbol: str, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
|
1637
1723
|
"""
|
1638
1724
|
get the list of most recent trades for a particular symbol
|
1639
|
-
|
1725
|
+
|
1726
|
+
https://github.com/Bitrue-exchange/Spot-official-api-docs#recent-trades-list
|
1727
|
+
|
1640
1728
|
:param str symbol: unified symbol of the market to fetch trades for
|
1641
1729
|
:param int [since]: timestamp in ms of the earliest trade to fetch
|
1642
1730
|
:param int [limit]: the maximum amount of trades to fetch
|
@@ -1647,7 +1735,7 @@ class bitrue(Exchange, ImplicitAPI):
|
|
1647
1735
|
market = self.market(symbol)
|
1648
1736
|
response = None
|
1649
1737
|
if market['spot']:
|
1650
|
-
request = {
|
1738
|
+
request: dict = {
|
1651
1739
|
'symbol': market['id'],
|
1652
1740
|
# 'limit': 100, # default 100, max = 1000
|
1653
1741
|
}
|
@@ -1672,8 +1760,8 @@ class bitrue(Exchange, ImplicitAPI):
|
|
1672
1760
|
#
|
1673
1761
|
return self.parse_trades(response, market, since, limit)
|
1674
1762
|
|
1675
|
-
def parse_order_status(self, status):
|
1676
|
-
statuses = {
|
1763
|
+
def parse_order_status(self, status: Str):
|
1764
|
+
statuses: dict = {
|
1677
1765
|
'INIT': 'open',
|
1678
1766
|
'PENDING_CREATE': 'open',
|
1679
1767
|
'NEW': 'open',
|
@@ -1686,7 +1774,7 @@ class bitrue(Exchange, ImplicitAPI):
|
|
1686
1774
|
}
|
1687
1775
|
return self.safe_string(statuses, status, status)
|
1688
1776
|
|
1689
|
-
def parse_order(self, order, market: Market = None) -> Order:
|
1777
|
+
def parse_order(self, order: dict, market: Market = None) -> Order:
|
1690
1778
|
#
|
1691
1779
|
# createOrder - spot
|
1692
1780
|
#
|
@@ -1767,14 +1855,13 @@ class bitrue(Exchange, ImplicitAPI):
|
|
1767
1855
|
id = self.safe_string(order, 'orderId')
|
1768
1856
|
type = self.safe_string_lower(order, 'type')
|
1769
1857
|
side = self.safe_string_lower(order, 'side')
|
1770
|
-
fills = self.
|
1858
|
+
fills = self.safe_list(order, 'fills', [])
|
1771
1859
|
clientOrderId = self.safe_string(order, 'clientOrderId')
|
1772
1860
|
timeInForce = self.safe_string(order, 'timeInForce')
|
1773
1861
|
postOnly = (type == 'limit_maker') or (timeInForce == 'GTX') or (type == 'post_only')
|
1774
1862
|
if type == 'limit_maker':
|
1775
1863
|
type = 'limit'
|
1776
|
-
|
1777
|
-
stopPrice = self.parse_number(self.omit_zero(stopPriceString))
|
1864
|
+
triggerPrice = self.parse_number(self.omit_zero(self.safe_string(order, 'stopPrice')))
|
1778
1865
|
return self.safe_order({
|
1779
1866
|
'info': order,
|
1780
1867
|
'id': id,
|
@@ -1788,8 +1875,7 @@ class bitrue(Exchange, ImplicitAPI):
|
|
1788
1875
|
'postOnly': postOnly,
|
1789
1876
|
'side': side,
|
1790
1877
|
'price': price,
|
1791
|
-
'
|
1792
|
-
'triggerPrice': stopPrice,
|
1878
|
+
'triggerPrice': triggerPrice,
|
1793
1879
|
'amount': amount,
|
1794
1880
|
'cost': cost,
|
1795
1881
|
'average': average,
|
@@ -1803,8 +1889,10 @@ class bitrue(Exchange, ImplicitAPI):
|
|
1803
1889
|
def create_market_buy_order_with_cost(self, symbol: str, cost: float, params={}):
|
1804
1890
|
"""
|
1805
1891
|
create a market buy order by providing the symbol and cost
|
1806
|
-
|
1807
|
-
|
1892
|
+
|
1893
|
+
https://www.bitrue.com/api-docs#new-order-trade-hmac-sha256
|
1894
|
+
https://www.bitrue.com/api_docs_includes_file/delivery.html#new-order-trade-hmac-sha256
|
1895
|
+
|
1808
1896
|
:param str symbol: unified symbol of the market to create an order in
|
1809
1897
|
:param float cost: how much you want to trade in units of the quote currency
|
1810
1898
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
@@ -1820,14 +1908,15 @@ class bitrue(Exchange, ImplicitAPI):
|
|
1820
1908
|
def create_order(self, symbol: str, type: OrderType, side: OrderSide, amount: float, price: Num = None, params={}):
|
1821
1909
|
"""
|
1822
1910
|
create a trade order
|
1823
|
-
|
1824
|
-
|
1825
|
-
|
1911
|
+
|
1912
|
+
https://www.bitrue.com/api_docs_includes_file/spot/index.html#new-order-trade
|
1913
|
+
https://www.bitrue.com/api_docs_includes_file/futures/index.html#new-order-trade-hmac-sha256
|
1914
|
+
|
1826
1915
|
:param str symbol: unified symbol of the market to create an order in
|
1827
1916
|
:param str type: 'market' or 'limit'
|
1828
1917
|
:param str side: 'buy' or 'sell'
|
1829
1918
|
:param float amount: how much of currency you want to trade in units of base currency
|
1830
|
-
:param float [price]: the price at which the order is to be
|
1919
|
+
:param float [price]: the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
|
1831
1920
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
1832
1921
|
:param float [params.triggerPrice]: *spot only* the price at which a trigger order is triggered at
|
1833
1922
|
:param str [params.clientOrderId]: a unique id for the order, automatically generated if not sent
|
@@ -1835,7 +1924,7 @@ class bitrue(Exchange, ImplicitAPI):
|
|
1835
1924
|
:param str [params.timeInForce]: 'fok', 'ioc' or 'po'
|
1836
1925
|
:param bool [params.postOnly]: default False
|
1837
1926
|
:param bool [params.reduceOnly]: default False
|
1838
|
-
|
1927
|
+
EXCHANGE SPECIFIC PARAMETERS
|
1839
1928
|
:param decimal [params.icebergQty]:
|
1840
1929
|
:param long [params.recvWindow]:
|
1841
1930
|
:param float [params.cost]: *swap market buy only* the quote quantity that can be used alternative for the amount
|
@@ -1846,7 +1935,7 @@ class bitrue(Exchange, ImplicitAPI):
|
|
1846
1935
|
response = None
|
1847
1936
|
data = None
|
1848
1937
|
uppercaseType = type.upper()
|
1849
|
-
request = {
|
1938
|
+
request: dict = {
|
1850
1939
|
'side': side.upper(),
|
1851
1940
|
'type': uppercaseType,
|
1852
1941
|
# 'timeInForce': '',
|
@@ -1897,7 +1986,7 @@ class bitrue(Exchange, ImplicitAPI):
|
|
1897
1986
|
response = self.fapiV2PrivatePostOrder(self.extend(request, params))
|
1898
1987
|
elif market['inverse']:
|
1899
1988
|
response = self.dapiV2PrivatePostOrder(self.extend(request, params))
|
1900
|
-
data = self.
|
1989
|
+
data = self.safe_dict(response, 'data', {})
|
1901
1990
|
elif market['spot']:
|
1902
1991
|
request['symbol'] = market['id']
|
1903
1992
|
request['quantity'] = self.amount_to_precision(symbol, amount)
|
@@ -1908,10 +1997,10 @@ class bitrue(Exchange, ImplicitAPI):
|
|
1908
1997
|
if clientOrderId is not None:
|
1909
1998
|
params = self.omit(params, ['newClientOrderId', 'clientOrderId'])
|
1910
1999
|
request['newClientOrderId'] = clientOrderId
|
1911
|
-
|
1912
|
-
if
|
2000
|
+
triggerPrice = self.safe_value_2(params, 'triggerPrice', 'stopPrice')
|
2001
|
+
if triggerPrice is not None:
|
1913
2002
|
params = self.omit(params, ['triggerPrice', 'stopPrice'])
|
1914
|
-
request['stopPrice'] = self.price_to_precision(symbol,
|
2003
|
+
request['stopPrice'] = self.price_to_precision(symbol, triggerPrice)
|
1915
2004
|
response = self.spotV1PrivatePostOrder(self.extend(request, params))
|
1916
2005
|
data = response
|
1917
2006
|
else:
|
@@ -1942,9 +2031,11 @@ class bitrue(Exchange, ImplicitAPI):
|
|
1942
2031
|
def fetch_order(self, id: str, symbol: Str = None, params={}):
|
1943
2032
|
"""
|
1944
2033
|
fetches information on an order made by the user
|
1945
|
-
|
1946
|
-
|
1947
|
-
|
2034
|
+
|
2035
|
+
https://www.bitrue.com/api_docs_includes_file/spot/index.html#query-order-user_data
|
2036
|
+
https://www.bitrue.com/api_docs_includes_file/futures/index.html#query-order-user_data-hmac-sha256
|
2037
|
+
|
2038
|
+
:param str id: the order id
|
1948
2039
|
:param str symbol: unified symbol of the market the order was made in
|
1949
2040
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
1950
2041
|
:returns dict: An `order structure <https://docs.ccxt.com/#/?id=order-structure>`
|
@@ -1957,7 +2048,7 @@ class bitrue(Exchange, ImplicitAPI):
|
|
1957
2048
|
params = self.omit(params, ['origClientOrderId', 'clientOrderId'])
|
1958
2049
|
response = None
|
1959
2050
|
data = None
|
1960
|
-
request = {}
|
2051
|
+
request: dict = {}
|
1961
2052
|
if origClientOrderId is None:
|
1962
2053
|
request['orderId'] = id
|
1963
2054
|
else:
|
@@ -1971,7 +2062,7 @@ class bitrue(Exchange, ImplicitAPI):
|
|
1971
2062
|
response = self.fapiV2PrivateGetOrder(self.extend(request, params))
|
1972
2063
|
elif market['inverse']:
|
1973
2064
|
response = self.dapiV2PrivateGetOrder(self.extend(request, params))
|
1974
|
-
data = self.
|
2065
|
+
data = self.safe_dict(response, 'data', {})
|
1975
2066
|
elif market['spot']:
|
1976
2067
|
request['orderId'] = id # spot market id is mandatory
|
1977
2068
|
request['symbol'] = market['id']
|
@@ -2027,7 +2118,9 @@ class bitrue(Exchange, ImplicitAPI):
|
|
2027
2118
|
def fetch_closed_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
|
2028
2119
|
"""
|
2029
2120
|
fetches information on multiple closed orders made by the user
|
2030
|
-
|
2121
|
+
|
2122
|
+
https://www.bitrue.com/api_docs_includes_file/spot/index.html#all-orders-user_data
|
2123
|
+
|
2031
2124
|
:param str symbol: unified market symbol of the market orders were made in
|
2032
2125
|
:param int [since]: the earliest time in ms to fetch orders for
|
2033
2126
|
:param int [limit]: the maximum number of order structures to retrieve
|
@@ -2040,7 +2133,7 @@ class bitrue(Exchange, ImplicitAPI):
|
|
2040
2133
|
market = self.market(symbol)
|
2041
2134
|
if not market['spot']:
|
2042
2135
|
raise NotSupported(self.id + ' fetchClosedOrders only support spot markets')
|
2043
|
-
request = {
|
2136
|
+
request: dict = {
|
2044
2137
|
'symbol': market['id'],
|
2045
2138
|
# 'orderId': 123445, # long
|
2046
2139
|
# 'startTime': since,
|
@@ -2079,9 +2172,10 @@ class bitrue(Exchange, ImplicitAPI):
|
|
2079
2172
|
def fetch_open_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
|
2080
2173
|
"""
|
2081
2174
|
fetch all unfilled currently open orders
|
2082
|
-
|
2083
|
-
|
2084
|
-
|
2175
|
+
|
2176
|
+
https://www.bitrue.com/api_docs_includes_file/spot/index.html#current-open-orders-user_data
|
2177
|
+
https://www.bitrue.com/api_docs_includes_file/futures/index.html#cancel-all-open-orders-trade-hmac-sha256
|
2178
|
+
|
2085
2179
|
:param str symbol: unified market symbol
|
2086
2180
|
:param int [since]: the earliest time in ms to fetch open orders for
|
2087
2181
|
:param int [limit]: the maximum number of open order structures to retrieve
|
@@ -2094,14 +2188,14 @@ class bitrue(Exchange, ImplicitAPI):
|
|
2094
2188
|
market = self.market(symbol)
|
2095
2189
|
response = None
|
2096
2190
|
data = None
|
2097
|
-
request = {}
|
2191
|
+
request: dict = {}
|
2098
2192
|
if market['swap']:
|
2099
2193
|
request['contractName'] = market['id']
|
2100
2194
|
if market['linear']:
|
2101
2195
|
response = self.fapiV2PrivateGetOpenOrders(self.extend(request, params))
|
2102
2196
|
elif market['inverse']:
|
2103
2197
|
response = self.dapiV2PrivateGetOpenOrders(self.extend(request, params))
|
2104
|
-
data = self.
|
2198
|
+
data = self.safe_list(response, 'data', [])
|
2105
2199
|
elif market['spot']:
|
2106
2200
|
request['symbol'] = market['id']
|
2107
2201
|
response = self.spotV1PrivateGetOpenOrders(self.extend(request, params))
|
@@ -2159,9 +2253,11 @@ class bitrue(Exchange, ImplicitAPI):
|
|
2159
2253
|
def cancel_order(self, id: str, symbol: Str = None, params={}):
|
2160
2254
|
"""
|
2161
2255
|
cancels an open order
|
2162
|
-
|
2163
|
-
|
2164
|
-
|
2256
|
+
|
2257
|
+
https://github.com/Bitrue-exchange/Spot-official-api-docs#cancel-order-trade
|
2258
|
+
https://www.bitrue.com/api-docs#cancel-order-trade-hmac-sha256
|
2259
|
+
https://www.bitrue.com/api_docs_includes_file/delivery.html#cancel-order-trade-hmac-sha256
|
2260
|
+
|
2165
2261
|
:param str id: order id
|
2166
2262
|
:param str symbol: unified symbol of the market the order was made in
|
2167
2263
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
@@ -2175,7 +2271,7 @@ class bitrue(Exchange, ImplicitAPI):
|
|
2175
2271
|
params = self.omit(params, ['origClientOrderId', 'clientOrderId'])
|
2176
2272
|
response = None
|
2177
2273
|
data = None
|
2178
|
-
request = {}
|
2274
|
+
request: dict = {}
|
2179
2275
|
if origClientOrderId is None:
|
2180
2276
|
request['orderId'] = id
|
2181
2277
|
else:
|
@@ -2189,7 +2285,7 @@ class bitrue(Exchange, ImplicitAPI):
|
|
2189
2285
|
response = self.fapiV2PrivatePostCancel(self.extend(request, params))
|
2190
2286
|
elif market['inverse']:
|
2191
2287
|
response = self.dapiV2PrivatePostCancel(self.extend(request, params))
|
2192
|
-
data = self.
|
2288
|
+
data = self.safe_dict(response, 'data', {})
|
2193
2289
|
elif market['spot']:
|
2194
2290
|
request['symbol'] = market['id']
|
2195
2291
|
response = self.spotV1PrivateDeleteOrder(self.extend(request, params))
|
@@ -2221,8 +2317,10 @@ class bitrue(Exchange, ImplicitAPI):
|
|
2221
2317
|
def cancel_all_orders(self, symbol: Str = None, params={}):
|
2222
2318
|
"""
|
2223
2319
|
cancel all open orders in a market
|
2224
|
-
|
2225
|
-
|
2320
|
+
|
2321
|
+
https://www.bitrue.com/api-docs#cancel-all-open-orders-trade-hmac-sha256
|
2322
|
+
https://www.bitrue.com/api_docs_includes_file/delivery.html#cancel-all-open-orders-trade-hmac-sha256
|
2323
|
+
|
2226
2324
|
:param str symbol: unified market symbol of the market to cancel orders in
|
2227
2325
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
2228
2326
|
:param str [params.marginMode]: 'cross' or 'isolated', for spot margin trading
|
@@ -2233,14 +2331,14 @@ class bitrue(Exchange, ImplicitAPI):
|
|
2233
2331
|
response = None
|
2234
2332
|
data = None
|
2235
2333
|
if market['swap']:
|
2236
|
-
request = {
|
2334
|
+
request: dict = {
|
2237
2335
|
'contractName': market['id'],
|
2238
2336
|
}
|
2239
2337
|
if market['linear']:
|
2240
2338
|
response = self.fapiV2PrivatePostAllOpenOrders(self.extend(request, params))
|
2241
2339
|
elif market['inverse']:
|
2242
2340
|
response = self.dapiV2PrivatePostAllOpenOrders(self.extend(request, params))
|
2243
|
-
data = self.
|
2341
|
+
data = self.safe_list(response, 'data', [])
|
2244
2342
|
else:
|
2245
2343
|
raise NotSupported(self.id + ' cancelAllOrders only support future markets')
|
2246
2344
|
#
|
@@ -2257,9 +2355,10 @@ class bitrue(Exchange, ImplicitAPI):
|
|
2257
2355
|
def fetch_my_trades(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}):
|
2258
2356
|
"""
|
2259
2357
|
fetch all trades made by the user
|
2260
|
-
|
2261
|
-
|
2262
|
-
|
2358
|
+
|
2359
|
+
https://www.bitrue.com/api_docs_includes_file/spot/index.html#account-trade-list-user_data
|
2360
|
+
https://www.bitrue.com/api_docs_includes_file/futures/index.html#account-trade-list-user_data-hmac-sha256
|
2361
|
+
|
2263
2362
|
:param str symbol: unified market symbol
|
2264
2363
|
:param int [since]: the earliest time in ms to fetch trades for
|
2265
2364
|
:param int [limit]: the maximum number of trades structures to retrieve
|
@@ -2272,7 +2371,7 @@ class bitrue(Exchange, ImplicitAPI):
|
|
2272
2371
|
market = self.market(symbol)
|
2273
2372
|
response = None
|
2274
2373
|
data = None
|
2275
|
-
request = {}
|
2374
|
+
request: dict = {}
|
2276
2375
|
if since is not None:
|
2277
2376
|
request['startTime'] = since
|
2278
2377
|
if limit is not None:
|
@@ -2285,7 +2384,7 @@ class bitrue(Exchange, ImplicitAPI):
|
|
2285
2384
|
response = self.fapiV2PrivateGetMyTrades(self.extend(request, params))
|
2286
2385
|
elif market['inverse']:
|
2287
2386
|
response = self.dapiV2PrivateGetMyTrades(self.extend(request, params))
|
2288
|
-
data = self.
|
2387
|
+
data = self.safe_list(response, 'data', [])
|
2289
2388
|
elif market['spot']:
|
2290
2389
|
request['symbol'] = market['id']
|
2291
2390
|
response = self.spotV2PrivateGetMyTrades(self.extend(request, params))
|
@@ -2342,7 +2441,9 @@ class bitrue(Exchange, ImplicitAPI):
|
|
2342
2441
|
def fetch_deposits(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Transaction]:
|
2343
2442
|
"""
|
2344
2443
|
fetch all deposits made to an account
|
2345
|
-
|
2444
|
+
|
2445
|
+
https://github.com/Bitrue-exchange/Spot-official-api-docs#deposit-history--withdraw_data
|
2446
|
+
|
2346
2447
|
:param str code: unified currency code
|
2347
2448
|
:param int [since]: the earliest time in ms to fetch deposits for
|
2348
2449
|
:param int [limit]: the maximum number of deposits structures to retrieve
|
@@ -2353,7 +2454,7 @@ class bitrue(Exchange, ImplicitAPI):
|
|
2353
2454
|
raise ArgumentsRequired(self.id + ' fetchDeposits() requires a code argument')
|
2354
2455
|
self.load_markets()
|
2355
2456
|
currency = self.currency(code)
|
2356
|
-
request = {
|
2457
|
+
request: dict = {
|
2357
2458
|
'coin': currency['id'],
|
2358
2459
|
'status': 1, # 0 init, 1 finished, default 0
|
2359
2460
|
# 'offset': 0,
|
@@ -2403,13 +2504,15 @@ class bitrue(Exchange, ImplicitAPI):
|
|
2403
2504
|
# ]
|
2404
2505
|
# }
|
2405
2506
|
#
|
2406
|
-
data = self.
|
2507
|
+
data = self.safe_list(response, 'data', [])
|
2407
2508
|
return self.parse_transactions(data, currency, since, limit)
|
2408
2509
|
|
2409
2510
|
def fetch_withdrawals(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Transaction]:
|
2410
2511
|
"""
|
2411
2512
|
fetch all withdrawals made from an account
|
2412
|
-
|
2513
|
+
|
2514
|
+
https://github.com/Bitrue-exchange/Spot-official-api-docs#withdraw-history--withdraw_data
|
2515
|
+
|
2413
2516
|
:param str code: unified currency code
|
2414
2517
|
:param int [since]: the earliest time in ms to fetch withdrawals for
|
2415
2518
|
:param int [limit]: the maximum number of withdrawals structures to retrieve
|
@@ -2420,7 +2523,7 @@ class bitrue(Exchange, ImplicitAPI):
|
|
2420
2523
|
raise ArgumentsRequired(self.id + ' fetchWithdrawals() requires a code argument')
|
2421
2524
|
self.load_markets()
|
2422
2525
|
currency = self.currency(code)
|
2423
|
-
request = {
|
2526
|
+
request: dict = {
|
2424
2527
|
'coin': currency['id'],
|
2425
2528
|
'status': 5, # 0 init, 5 finished, 6 canceled, default 0
|
2426
2529
|
# 'offset': 0,
|
@@ -2461,7 +2564,7 @@ class bitrue(Exchange, ImplicitAPI):
|
|
2461
2564
|
return self.parse_transactions(data, currency)
|
2462
2565
|
|
2463
2566
|
def parse_transaction_status_by_type(self, status, type=None):
|
2464
|
-
statusesByType = {
|
2567
|
+
statusesByType: dict = {
|
2465
2568
|
'deposit': {
|
2466
2569
|
'0': 'pending',
|
2467
2570
|
'1': 'ok',
|
@@ -2472,10 +2575,10 @@ class bitrue(Exchange, ImplicitAPI):
|
|
2472
2575
|
'6': 'canceled',
|
2473
2576
|
},
|
2474
2577
|
}
|
2475
|
-
statuses = self.
|
2578
|
+
statuses = self.safe_dict(statusesByType, type, {})
|
2476
2579
|
return self.safe_string(statuses, status, status)
|
2477
2580
|
|
2478
|
-
def parse_transaction(self, transaction, currency: Currency = None) -> Transaction:
|
2581
|
+
def parse_transaction(self, transaction: dict, currency: Currency = None) -> Transaction:
|
2479
2582
|
#
|
2480
2583
|
# fetchDeposits
|
2481
2584
|
#
|
@@ -2595,10 +2698,12 @@ class bitrue(Exchange, ImplicitAPI):
|
|
2595
2698
|
'fee': fee,
|
2596
2699
|
}
|
2597
2700
|
|
2598
|
-
def withdraw(self, code: str, amount: float, address, tag=None, params={}):
|
2701
|
+
def withdraw(self, code: str, amount: float, address: str, tag=None, params={}) -> Transaction:
|
2599
2702
|
"""
|
2600
2703
|
make a withdrawal
|
2601
|
-
|
2704
|
+
|
2705
|
+
https://github.com/Bitrue-exchange/Spot-official-api-docs#withdraw-commit--withdraw_data
|
2706
|
+
|
2602
2707
|
:param str code: unified currency code
|
2603
2708
|
:param float amount: the amount to withdraw
|
2604
2709
|
:param str address: the address to withdraw to
|
@@ -2610,7 +2715,7 @@ class bitrue(Exchange, ImplicitAPI):
|
|
2610
2715
|
self.check_address(address)
|
2611
2716
|
self.load_markets()
|
2612
2717
|
currency = self.currency(code)
|
2613
|
-
request = {
|
2718
|
+
request: dict = {
|
2614
2719
|
'coin': currency['id'],
|
2615
2720
|
'amount': amount,
|
2616
2721
|
'addressTo': address,
|
@@ -2641,7 +2746,7 @@ class bitrue(Exchange, ImplicitAPI):
|
|
2641
2746
|
# }
|
2642
2747
|
# }
|
2643
2748
|
#
|
2644
|
-
data = self.
|
2749
|
+
data = self.safe_dict(response, 'data', {})
|
2645
2750
|
return self.parse_transaction(data, currency)
|
2646
2751
|
|
2647
2752
|
def parse_deposit_withdraw_fee(self, fee, currency: Currency = None):
|
@@ -2653,9 +2758,9 @@ class bitrue(Exchange, ImplicitAPI):
|
|
2653
2758
|
# "chainDetail": [[Object]]
|
2654
2759
|
# }
|
2655
2760
|
#
|
2656
|
-
chainDetails = self.
|
2761
|
+
chainDetails = self.safe_list(fee, 'chainDetail', [])
|
2657
2762
|
chainDetailLength = len(chainDetails)
|
2658
|
-
result = {
|
2763
|
+
result: dict = {
|
2659
2764
|
'info': fee,
|
2660
2765
|
'withdraw': {
|
2661
2766
|
'fee': None,
|
@@ -2685,14 +2790,16 @@ class bitrue(Exchange, ImplicitAPI):
|
|
2685
2790
|
def fetch_deposit_withdraw_fees(self, codes: Strings = None, params={}):
|
2686
2791
|
"""
|
2687
2792
|
fetch deposit and withdraw fees
|
2688
|
-
|
2793
|
+
|
2794
|
+
https://github.com/Bitrue-exchange/Spot-official-api-docs#exchangeInfo_endpoint
|
2795
|
+
|
2689
2796
|
:param str[]|None codes: list of unified currency codes
|
2690
2797
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
2691
2798
|
:returns dict: a list of `fee structures <https://docs.ccxt.com/#/?id=fee-structure>`
|
2692
2799
|
"""
|
2693
2800
|
self.load_markets()
|
2694
2801
|
response = self.spotV1PublicGetExchangeInfo(params)
|
2695
|
-
coins = self.
|
2802
|
+
coins = self.safe_list(response, 'coins')
|
2696
2803
|
return self.parse_deposit_withdraw_fees(coins, codes, 'coin')
|
2697
2804
|
|
2698
2805
|
def parse_transfer(self, transfer, currency=None):
|
@@ -2731,11 +2838,13 @@ class bitrue(Exchange, ImplicitAPI):
|
|
2731
2838
|
'status': 'ok',
|
2732
2839
|
}
|
2733
2840
|
|
2734
|
-
def fetch_transfers(self, code: Str = None, since: Int = None, limit: Int = None, params={}):
|
2841
|
+
def fetch_transfers(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[TransferEntry]:
|
2735
2842
|
"""
|
2736
2843
|
fetch a history of internal transfers made on an account
|
2737
|
-
|
2738
|
-
|
2844
|
+
|
2845
|
+
https://www.bitrue.com/api-docs#get-future-account-transfer-history-list-user_data-hmac-sha256
|
2846
|
+
https://www.bitrue.com/api_docs_includes_file/delivery.html#get-future-account-transfer-history-list-user_data-hmac-sha256
|
2847
|
+
|
2739
2848
|
:param str code: unified currency code of the currency transferred
|
2740
2849
|
:param int [since]: the earliest time in ms to fetch transfers for
|
2741
2850
|
:param int [limit]: the maximum number of transfers structures to retrieve
|
@@ -2746,7 +2855,7 @@ class bitrue(Exchange, ImplicitAPI):
|
|
2746
2855
|
"""
|
2747
2856
|
self.load_markets()
|
2748
2857
|
type = self.safe_string_2(params, 'type', 'transferType')
|
2749
|
-
request = {
|
2858
|
+
request: dict = {
|
2750
2859
|
'transferType': type,
|
2751
2860
|
}
|
2752
2861
|
currency = None
|
@@ -2783,8 +2892,10 @@ class bitrue(Exchange, ImplicitAPI):
|
|
2783
2892
|
def transfer(self, code: str, amount: float, fromAccount: str, toAccount: str, params={}) -> TransferEntry:
|
2784
2893
|
"""
|
2785
2894
|
transfer currency internally between wallets on the same account
|
2786
|
-
|
2787
|
-
|
2895
|
+
|
2896
|
+
https://www.bitrue.com/api-docs#new-future-account-transfer-user_data-hmac-sha256
|
2897
|
+
https://www.bitrue.com/api_docs_includes_file/delivery.html#user-commission-rate-user_data-hmac-sha256
|
2898
|
+
|
2788
2899
|
:param str code: unified currency code
|
2789
2900
|
:param float amount: amount to transfer
|
2790
2901
|
:param str fromAccount: account to transfer from
|
@@ -2794,10 +2905,10 @@ class bitrue(Exchange, ImplicitAPI):
|
|
2794
2905
|
"""
|
2795
2906
|
self.load_markets()
|
2796
2907
|
currency = self.currency(code)
|
2797
|
-
accountTypes = self.
|
2908
|
+
accountTypes = self.safe_dict(self.options, 'accountsByType', {})
|
2798
2909
|
fromId = self.safe_string(accountTypes, fromAccount, fromAccount)
|
2799
2910
|
toId = self.safe_string(accountTypes, toAccount, toAccount)
|
2800
|
-
request = {
|
2911
|
+
request: dict = {
|
2801
2912
|
'coinSymbol': currency['id'],
|
2802
2913
|
'amount': self.currency_to_precision(code, amount),
|
2803
2914
|
'transferType': fromId + '_to_' + toId,
|
@@ -2810,14 +2921,16 @@ class bitrue(Exchange, ImplicitAPI):
|
|
2810
2921
|
# 'data': null
|
2811
2922
|
# }
|
2812
2923
|
#
|
2813
|
-
data = self.
|
2924
|
+
data = self.safe_dict(response, 'data', {})
|
2814
2925
|
return self.parse_transfer(data, currency)
|
2815
2926
|
|
2816
2927
|
def set_leverage(self, leverage: Int, symbol: Str = None, params={}):
|
2817
2928
|
"""
|
2818
2929
|
set the level of leverage for a market
|
2819
|
-
|
2820
|
-
|
2930
|
+
|
2931
|
+
https://www.bitrue.com/api-docs#change-initial-leverage-trade-hmac-sha256
|
2932
|
+
https://www.bitrue.com/api_docs_includes_file/delivery.html#change-initial-leverage-trade-hmac-sha256
|
2933
|
+
|
2821
2934
|
:param float leverage: the rate of leverage
|
2822
2935
|
:param str symbol: unified market symbol
|
2823
2936
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
@@ -2830,7 +2943,7 @@ class bitrue(Exchange, ImplicitAPI):
|
|
2830
2943
|
self.load_markets()
|
2831
2944
|
market = self.market(symbol)
|
2832
2945
|
response = None
|
2833
|
-
request = {
|
2946
|
+
request: dict = {
|
2834
2947
|
'contractName': market['id'],
|
2835
2948
|
'leverage': leverage,
|
2836
2949
|
}
|
@@ -2842,21 +2955,36 @@ class bitrue(Exchange, ImplicitAPI):
|
|
2842
2955
|
response = self.dapiV2PrivatePostLevelEdit(self.extend(request, params))
|
2843
2956
|
return response
|
2844
2957
|
|
2845
|
-
def parse_margin_modification(self, data, market=None):
|
2958
|
+
def parse_margin_modification(self, data, market=None) -> MarginModification:
|
2959
|
+
#
|
2960
|
+
# setMargin
|
2961
|
+
#
|
2962
|
+
# {
|
2963
|
+
# "code": 0,
|
2964
|
+
# "msg": "success"
|
2965
|
+
# "data": null
|
2966
|
+
# }
|
2967
|
+
#
|
2846
2968
|
return {
|
2847
2969
|
'info': data,
|
2970
|
+
'symbol': market['symbol'],
|
2848
2971
|
'type': None,
|
2972
|
+
'marginMode': 'isolated',
|
2849
2973
|
'amount': None,
|
2974
|
+
'total': None,
|
2850
2975
|
'code': None,
|
2851
|
-
'symbol': market['symbol'],
|
2852
2976
|
'status': None,
|
2977
|
+
'timestamp': None,
|
2978
|
+
'datetime': None,
|
2853
2979
|
}
|
2854
2980
|
|
2855
|
-
def set_margin(self, symbol: str, amount: float, params={}):
|
2981
|
+
def set_margin(self, symbol: str, amount: float, params={}) -> MarginModification:
|
2856
2982
|
"""
|
2857
2983
|
Either adds or reduces margin in an isolated position in order to set the margin to a specific value
|
2858
|
-
|
2859
|
-
|
2984
|
+
|
2985
|
+
https://www.bitrue.com/api-docs#modify-isolated-position-margin-trade-hmac-sha256
|
2986
|
+
https://www.bitrue.com/api_docs_includes_file/delivery.html#modify-isolated-position-margin-trade-hmac-sha256
|
2987
|
+
|
2860
2988
|
:param str symbol: unified market symbol of the market to set margin in
|
2861
2989
|
:param float amount: the amount to set the margin to
|
2862
2990
|
:param dict [params]: parameters specific to the exchange API endpoint
|
@@ -2867,7 +2995,7 @@ class bitrue(Exchange, ImplicitAPI):
|
|
2867
2995
|
if not market['swap']:
|
2868
2996
|
raise NotSupported(self.id + ' setMargin only support swap markets')
|
2869
2997
|
response = None
|
2870
|
-
request = {
|
2998
|
+
request: dict = {
|
2871
2999
|
'contractName': market['id'],
|
2872
3000
|
'amount': self.parse_to_numeric(amount),
|
2873
3001
|
}
|
@@ -2889,7 +3017,7 @@ class bitrue(Exchange, ImplicitAPI):
|
|
2889
3017
|
version = self.safe_string(api, 1)
|
2890
3018
|
access = self.safe_string(api, 2)
|
2891
3019
|
url = None
|
2892
|
-
if type == 'api' and version == 'kline':
|
3020
|
+
if (type == 'api' and version == 'kline') or (type == 'open' and path.find('listenKey') >= 0):
|
2893
3021
|
url = self.urls['api'][type]
|
2894
3022
|
else:
|
2895
3023
|
url = self.urls['api'][type] + '/' + version
|
@@ -2898,7 +3026,7 @@ class bitrue(Exchange, ImplicitAPI):
|
|
2898
3026
|
if access == 'private':
|
2899
3027
|
self.check_required_credentials()
|
2900
3028
|
recvWindow = self.safe_integer(self.options, 'recvWindow', 5000)
|
2901
|
-
if type == 'spot':
|
3029
|
+
if type == 'spot' or type == 'open':
|
2902
3030
|
query = self.urlencode(self.extend({
|
2903
3031
|
'timestamp': self.nonce(),
|
2904
3032
|
'recvWindow': recvWindow,
|
@@ -2923,6 +3051,10 @@ class bitrue(Exchange, ImplicitAPI):
|
|
2923
3051
|
signPath = signPath + '/' + version + '/' + path
|
2924
3052
|
signMessage = timestamp + method + signPath
|
2925
3053
|
if method == 'GET':
|
3054
|
+
keys = list(params.keys())
|
3055
|
+
keysLength = len(keys)
|
3056
|
+
if keysLength > 0:
|
3057
|
+
signMessage += '?' + self.urlencode(params)
|
2926
3058
|
signature = self.hmac(self.encode(signMessage), self.encode(self.secret), hashlib.sha256)
|
2927
3059
|
headers = {
|
2928
3060
|
'X-CH-APIKEY': self.apiKey,
|
@@ -2935,7 +3067,7 @@ class bitrue(Exchange, ImplicitAPI):
|
|
2935
3067
|
'recvWindow': recvWindow,
|
2936
3068
|
}, params)
|
2937
3069
|
body = self.json(query)
|
2938
|
-
signMessage
|
3070
|
+
signMessage += body
|
2939
3071
|
signature = self.hmac(self.encode(signMessage), self.encode(self.secret), hashlib.sha256)
|
2940
3072
|
headers = {
|
2941
3073
|
'Content-Type': 'application/json',
|
@@ -2948,7 +3080,7 @@ class bitrue(Exchange, ImplicitAPI):
|
|
2948
3080
|
url += '?' + self.urlencode(params)
|
2949
3081
|
return {'url': url, 'method': method, 'body': body, 'headers': headers}
|
2950
3082
|
|
2951
|
-
def handle_errors(self, code, reason, url, method, headers, body, response, requestHeaders, requestBody):
|
3083
|
+
def handle_errors(self, code: int, reason: str, url: str, method: str, headers: dict, body: str, response, requestHeaders, requestBody):
|
2952
3084
|
if (code == 418) or (code == 429):
|
2953
3085
|
raise DDoSProtection(self.id + ' ' + str(code) + ' ' + reason + ' ' + body)
|
2954
3086
|
# error response in a form: {"code": -1013, "msg": "Invalid quantity."}
|