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/async_support/gemini.py
CHANGED
@@ -7,9 +7,10 @@ from ccxt.async_support.base.exchange import Exchange
|
|
7
7
|
from ccxt.abstract.gemini import ImplicitAPI
|
8
8
|
import asyncio
|
9
9
|
import hashlib
|
10
|
-
from ccxt.base.types import Balances, Currency, Int, Market, Num, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, Transaction
|
10
|
+
from ccxt.base.types import Balances, Currencies, Currency, DepositAddress, Int, Market, Num, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, TradingFees, Transaction
|
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 ArgumentsRequired
|
15
16
|
from ccxt.base.errors import BadRequest
|
@@ -21,7 +22,6 @@ from ccxt.base.errors import RateLimitExceeded
|
|
21
22
|
from ccxt.base.errors import ExchangeNotAvailable
|
22
23
|
from ccxt.base.errors import OnMaintenance
|
23
24
|
from ccxt.base.errors import InvalidNonce
|
24
|
-
from ccxt.base.errors import AuthenticationError
|
25
25
|
from ccxt.base.decimal_to_precision import TICK_SIZE
|
26
26
|
from ccxt.base.precise import Precise
|
27
27
|
|
@@ -62,6 +62,7 @@ class gemini(Exchange, ImplicitAPI):
|
|
62
62
|
'fetchCrossBorrowRates': False,
|
63
63
|
'fetchCurrencies': True,
|
64
64
|
'fetchDepositAddress': True,
|
65
|
+
'fetchDepositAddresses': False,
|
65
66
|
'fetchDepositAddressesByNetwork': True,
|
66
67
|
'fetchDepositsWithdrawals': True,
|
67
68
|
'fetchFundingHistory': False,
|
@@ -96,6 +97,7 @@ class gemini(Exchange, ImplicitAPI):
|
|
96
97
|
'fetchTransactions': 'emulated',
|
97
98
|
'postOnly': True,
|
98
99
|
'reduceMargin': False,
|
100
|
+
'sandbox': True,
|
99
101
|
'setLeverage': False,
|
100
102
|
'setMarginMode': False,
|
101
103
|
'setPositionMode': False,
|
@@ -122,6 +124,7 @@ class gemini(Exchange, ImplicitAPI):
|
|
122
124
|
# https://github.com/ccxt/ccxt/issues/7874
|
123
125
|
# https://github.com/ccxt/ccxt/issues/7894
|
124
126
|
'web': 'https://docs.gemini.com',
|
127
|
+
'webExchange': 'https://exchange.gemini.com',
|
125
128
|
},
|
126
129
|
'fees': [
|
127
130
|
'https://gemini.com/api-fee-schedule',
|
@@ -198,6 +201,7 @@ class gemini(Exchange, ImplicitAPI):
|
|
198
201
|
'v1/account/create': 1,
|
199
202
|
'v1/account/list': 1,
|
200
203
|
'v1/heartbeat': 1,
|
204
|
+
'v1/roles': 1,
|
201
205
|
},
|
202
206
|
},
|
203
207
|
},
|
@@ -264,6 +268,7 @@ class gemini(Exchange, ImplicitAPI):
|
|
264
268
|
'broad': {
|
265
269
|
'The Gemini Exchange is currently undergoing maintenance.': OnMaintenance, # The Gemini Exchange is currently undergoing maintenance. Please check https://status.gemini.com/ for more information.
|
266
270
|
'We are investigating technical issues with the Gemini Exchange.': ExchangeNotAvailable, # We are investigating technical issues with the Gemini Exchange. Please check https://status.gemini.com/ for more information.
|
271
|
+
'Internal Server Error': ExchangeNotAvailable,
|
267
272
|
},
|
268
273
|
},
|
269
274
|
'options': {
|
@@ -298,11 +303,80 @@ class gemini(Exchange, ImplicitAPI):
|
|
298
303
|
'ATOM': 'cosmos',
|
299
304
|
'DOT': 'polkadot',
|
300
305
|
},
|
301
|
-
'nonce': 'milliseconds', # if getting a Network 400 error change to seconds
|
306
|
+
'nonce': 'milliseconds', # if getting a Network 400 error change to seconds,
|
307
|
+
'conflictingMarkets': {
|
308
|
+
'paxgusd': {
|
309
|
+
'base': 'PAXG',
|
310
|
+
'quote': 'USD',
|
311
|
+
},
|
312
|
+
},
|
313
|
+
},
|
314
|
+
'features': {
|
315
|
+
'default': {
|
316
|
+
'sandbox': True,
|
317
|
+
'createOrder': {
|
318
|
+
'marginMode': False,
|
319
|
+
'triggerPrice': True,
|
320
|
+
'triggerPriceType': None,
|
321
|
+
'triggerDirection': False,
|
322
|
+
'stopLossPrice': False, # todo
|
323
|
+
'takeProfitPrice': False, # todo
|
324
|
+
'attachedStopLossTakeProfit': None,
|
325
|
+
'timeInForce': {
|
326
|
+
'IOC': True,
|
327
|
+
'FOK': True,
|
328
|
+
'PO': True,
|
329
|
+
'GTD': False,
|
330
|
+
},
|
331
|
+
'hedged': False,
|
332
|
+
'trailing': False,
|
333
|
+
'leverage': False,
|
334
|
+
'marketBuyByCost': True,
|
335
|
+
'marketBuyRequiresPrice': False,
|
336
|
+
'selfTradePrevention': False,
|
337
|
+
'iceberg': False,
|
338
|
+
},
|
339
|
+
'createOrders': None,
|
340
|
+
'fetchMyTrades': {
|
341
|
+
'marginMode': False,
|
342
|
+
'limit': 500,
|
343
|
+
'daysBack': None,
|
344
|
+
'untilDays': None,
|
345
|
+
},
|
346
|
+
'fetchOrder': {
|
347
|
+
'marginMode': False,
|
348
|
+
'trigger': False,
|
349
|
+
'trailing': False,
|
350
|
+
},
|
351
|
+
'fetchOpenOrders': {
|
352
|
+
'marginMode': False,
|
353
|
+
'limit': None,
|
354
|
+
'trigger': False,
|
355
|
+
'trailing': False,
|
356
|
+
},
|
357
|
+
'fetchOrders': None,
|
358
|
+
'fetchClosedOrders': None, # todo: implement
|
359
|
+
'fetchOHLCV': {
|
360
|
+
'limit': None,
|
361
|
+
},
|
362
|
+
},
|
363
|
+
'spot': {
|
364
|
+
'extends': 'default',
|
365
|
+
},
|
366
|
+
'swap': {
|
367
|
+
'linear': {
|
368
|
+
'extends': 'default',
|
369
|
+
},
|
370
|
+
'inverse': None,
|
371
|
+
},
|
372
|
+
'future': {
|
373
|
+
'linear': None,
|
374
|
+
'inverse': None,
|
375
|
+
},
|
302
376
|
},
|
303
377
|
})
|
304
378
|
|
305
|
-
async def fetch_currencies(self, params={}):
|
379
|
+
async def fetch_currencies(self, params={}) -> Currencies:
|
306
380
|
"""
|
307
381
|
fetches all available currencies on an exchange
|
308
382
|
:param dict [params]: extra parameters specific to the endpoint
|
@@ -312,7 +386,7 @@ class gemini(Exchange, ImplicitAPI):
|
|
312
386
|
|
313
387
|
async def fetch_currencies_from_web(self, params={}):
|
314
388
|
"""
|
315
|
-
|
389
|
+
@ignore
|
316
390
|
fetches all available currencies on an exchange
|
317
391
|
:param dict [params]: extra parameters specific to the endpoint
|
318
392
|
:returns dict: an associative dictionary of currencies
|
@@ -340,7 +414,7 @@ class gemini(Exchange, ImplicitAPI):
|
|
340
414
|
# ]
|
341
415
|
# }
|
342
416
|
#
|
343
|
-
result = {}
|
417
|
+
result: dict = {}
|
344
418
|
self.options['tradingPairs'] = self.safe_list(data, 'tradingPairs')
|
345
419
|
currenciesArray = self.safe_value(data, 'currencies', [])
|
346
420
|
for i in range(0, len(currenciesArray)):
|
@@ -349,7 +423,7 @@ class gemini(Exchange, ImplicitAPI):
|
|
349
423
|
code = self.safe_currency_code(id)
|
350
424
|
type = 'fiat' if self.safe_string(currency, 7) else 'crypto'
|
351
425
|
precision = self.parse_number(self.parse_precision(self.safe_string(currency, 5)))
|
352
|
-
networks = {}
|
426
|
+
networks: dict = {}
|
353
427
|
networkId = self.safe_string(currency, 9)
|
354
428
|
networkCode = None
|
355
429
|
if networkId is not None:
|
@@ -400,10 +474,12 @@ class gemini(Exchange, ImplicitAPI):
|
|
400
474
|
}
|
401
475
|
return result
|
402
476
|
|
403
|
-
async def fetch_markets(self, params={}):
|
477
|
+
async def fetch_markets(self, params={}) -> List[Market]:
|
404
478
|
"""
|
405
479
|
retrieves data on all markets for gemini
|
406
|
-
|
480
|
+
|
481
|
+
https://docs.gemini.com/rest-api/#symbols
|
482
|
+
|
407
483
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
408
484
|
:returns dict[]: an array of objects representing market data
|
409
485
|
"""
|
@@ -443,6 +519,7 @@ class gemini(Exchange, ImplicitAPI):
|
|
443
519
|
# '</tr>'
|
444
520
|
# ]
|
445
521
|
marketId = cells[0].replace('<td>', '')
|
522
|
+
marketId = marketId.replace('*', '')
|
446
523
|
# base = self.safe_currency_code(baseId)
|
447
524
|
minAmountString = cells[1].replace('<td>', '')
|
448
525
|
minAmountParts = minAmountString.split(' ')
|
@@ -509,7 +586,7 @@ class gemini(Exchange, ImplicitAPI):
|
|
509
586
|
return result
|
510
587
|
|
511
588
|
def parse_market_active(self, status):
|
512
|
-
statuses = {
|
589
|
+
statuses: dict = {
|
513
590
|
'open': True,
|
514
591
|
'closed': False,
|
515
592
|
'cancel_only': True,
|
@@ -529,7 +606,7 @@ class gemini(Exchange, ImplicitAPI):
|
|
529
606
|
result = []
|
530
607
|
for i in range(0, len(fetchUsdtMarkets)):
|
531
608
|
marketId = fetchUsdtMarkets[i]
|
532
|
-
request = {
|
609
|
+
request: dict = {
|
533
610
|
'symbol': marketId,
|
534
611
|
}
|
535
612
|
# don't use Promise.all here, for some reason the exchange can't handle it and crashes
|
@@ -557,7 +634,7 @@ class gemini(Exchange, ImplicitAPI):
|
|
557
634
|
promises = []
|
558
635
|
for i in range(0, len(marketIds)):
|
559
636
|
marketId = marketIds[i]
|
560
|
-
request = {
|
637
|
+
request: dict = {
|
561
638
|
'symbol': marketId,
|
562
639
|
}
|
563
640
|
promises.append(self.publicGetV1SymbolsDetailsSymbol(self.extend(request, params)))
|
@@ -629,7 +706,7 @@ class gemini(Exchange, ImplicitAPI):
|
|
629
706
|
quoteId = None
|
630
707
|
settleId = None
|
631
708
|
tickSize = None
|
632
|
-
|
709
|
+
amountPrecision = None
|
633
710
|
minSize = None
|
634
711
|
status = None
|
635
712
|
swap = False
|
@@ -640,9 +717,9 @@ class gemini(Exchange, ImplicitAPI):
|
|
640
717
|
isArray = (isinstance(response, list))
|
641
718
|
if not isString and not isArray:
|
642
719
|
marketId = self.safe_string_lower(response, 'symbol')
|
720
|
+
amountPrecision = self.safe_number(response, 'tick_size') # right, exchange has an imperfect naming and self turns out to be an amount-precision
|
721
|
+
tickSize = self.safe_number(response, 'quote_increment') # self is tick-size actually
|
643
722
|
minSize = self.safe_number(response, 'min_order_size')
|
644
|
-
tickSize = self.safe_number(response, 'tick_size')
|
645
|
-
increment = self.safe_number(response, 'quote_increment')
|
646
723
|
status = self.parse_market_active(self.safe_string(response, 'status'))
|
647
724
|
baseId = self.safe_string(response, 'base_currency')
|
648
725
|
quoteId = self.safe_string(response, 'quote_currency')
|
@@ -653,21 +730,31 @@ class gemini(Exchange, ImplicitAPI):
|
|
653
730
|
marketId = response
|
654
731
|
else:
|
655
732
|
marketId = self.safe_string_lower(response, 0)
|
656
|
-
|
657
|
-
|
658
|
-
|
733
|
+
tickSize = self.parse_number(self.parse_precision(self.safe_string(response, 1))) # priceTickDecimalPlaces
|
734
|
+
amountPrecision = self.parse_number(self.parse_precision(self.safe_string(response, 2))) # quantityTickDecimalPlaces
|
735
|
+
minSize = self.safe_number(response, 3) # quantityMinimum
|
659
736
|
marketIdUpper = marketId.upper()
|
660
737
|
isPerp = (marketIdUpper.find('PERP') >= 0)
|
661
738
|
marketIdWithoutPerp = marketIdUpper.replace('PERP', '')
|
662
|
-
|
663
|
-
|
664
|
-
|
665
|
-
|
666
|
-
|
667
|
-
|
668
|
-
|
669
|
-
|
670
|
-
|
739
|
+
conflictingMarkets = self.safe_dict(self.options, 'conflictingMarkets', {})
|
740
|
+
lowerCaseId = marketIdWithoutPerp.lower()
|
741
|
+
if lowerCaseId in conflictingMarkets:
|
742
|
+
conflictingMarket = conflictingMarkets[lowerCaseId]
|
743
|
+
baseId = conflictingMarket['base']
|
744
|
+
quoteId = conflictingMarket['quote']
|
745
|
+
if isPerp:
|
746
|
+
settleId = conflictingMarket['quote']
|
747
|
+
else:
|
748
|
+
quoteCurrencies = self.handle_option('fetchMarketsFromAPI', 'quoteCurrencies', [])
|
749
|
+
for i in range(0, len(quoteCurrencies)):
|
750
|
+
quoteCurrency = quoteCurrencies[i]
|
751
|
+
if marketIdWithoutPerp.endswith(quoteCurrency):
|
752
|
+
quoteLength = self.parse_to_int(-1 * len(quoteCurrency))
|
753
|
+
baseId = marketIdWithoutPerp[0:quoteLength]
|
754
|
+
quoteId = quoteCurrency
|
755
|
+
if isPerp:
|
756
|
+
settleId = quoteCurrency # always same
|
757
|
+
break
|
671
758
|
base = self.safe_currency_code(baseId)
|
672
759
|
quote = self.safe_currency_code(quoteId)
|
673
760
|
settle = self.safe_currency_code(settleId)
|
@@ -704,8 +791,8 @@ class gemini(Exchange, ImplicitAPI):
|
|
704
791
|
'strike': None,
|
705
792
|
'optionType': None,
|
706
793
|
'precision': {
|
707
|
-
'price':
|
708
|
-
'amount':
|
794
|
+
'price': tickSize,
|
795
|
+
'amount': amountPrecision,
|
709
796
|
},
|
710
797
|
'limits': {
|
711
798
|
'leverage': {
|
@@ -732,7 +819,9 @@ class gemini(Exchange, ImplicitAPI):
|
|
732
819
|
async def fetch_order_book(self, symbol: str, limit: Int = None, params={}) -> OrderBook:
|
733
820
|
"""
|
734
821
|
fetches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
|
735
|
-
|
822
|
+
|
823
|
+
https://docs.gemini.com/rest-api/#current-order-book
|
824
|
+
|
736
825
|
:param str symbol: unified symbol of the market to fetch the order book for
|
737
826
|
:param int [limit]: the maximum amount of order book entries to return
|
738
827
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
@@ -740,7 +829,7 @@ class gemini(Exchange, ImplicitAPI):
|
|
740
829
|
"""
|
741
830
|
await self.load_markets()
|
742
831
|
market = self.market(symbol)
|
743
|
-
request = {
|
832
|
+
request: dict = {
|
744
833
|
'symbol': market['id'],
|
745
834
|
}
|
746
835
|
if limit is not None:
|
@@ -752,7 +841,7 @@ class gemini(Exchange, ImplicitAPI):
|
|
752
841
|
async def fetch_ticker_v1(self, symbol: str, params={}):
|
753
842
|
await self.load_markets()
|
754
843
|
market = self.market(symbol)
|
755
|
-
request = {
|
844
|
+
request: dict = {
|
756
845
|
'symbol': market['id'],
|
757
846
|
}
|
758
847
|
response = await self.publicGetV1PubtickerSymbol(self.extend(request, params))
|
@@ -773,7 +862,7 @@ class gemini(Exchange, ImplicitAPI):
|
|
773
862
|
async def fetch_ticker_v2(self, symbol: str, params={}):
|
774
863
|
await self.load_markets()
|
775
864
|
market = self.market(symbol)
|
776
|
-
request = {
|
865
|
+
request: dict = {
|
777
866
|
'symbol': market['id'],
|
778
867
|
}
|
779
868
|
response = await self.publicGetV2TickerSymbol(self.extend(request, params))
|
@@ -793,8 +882,9 @@ class gemini(Exchange, ImplicitAPI):
|
|
793
882
|
return self.parse_ticker(response, market)
|
794
883
|
|
795
884
|
async def fetch_ticker_v1_and_v2(self, symbol: str, params={}):
|
796
|
-
|
797
|
-
|
885
|
+
tickerPromiseA = self.fetch_ticker_v1(symbol, params)
|
886
|
+
tickerPromiseB = self.fetch_ticker_v2(symbol, params)
|
887
|
+
tickerA, tickerB = await asyncio.gather(*[tickerPromiseA, tickerPromiseB])
|
798
888
|
return self.deep_extend(tickerA, {
|
799
889
|
'open': tickerB['open'],
|
800
890
|
'high': tickerB['high'],
|
@@ -808,11 +898,13 @@ class gemini(Exchange, ImplicitAPI):
|
|
808
898
|
async def fetch_ticker(self, symbol: str, params={}) -> Ticker:
|
809
899
|
"""
|
810
900
|
fetches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
|
811
|
-
|
812
|
-
|
901
|
+
|
902
|
+
https://docs.gemini.com/rest-api/#ticker
|
903
|
+
https://docs.gemini.com/rest-api/#ticker-v2
|
904
|
+
|
813
905
|
:param str symbol: unified symbol of the market to fetch the ticker for
|
814
906
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
815
|
-
:param dict [params.fetchTickerMethod]: 'fetchTickerV2', 'fetchTickerV1' or 'fetchTickerV1AndV2' - 'fetchTickerV1' for original ccxt.gemini.
|
907
|
+
:param dict [params.fetchTickerMethod]: 'fetchTickerV2', 'fetchTickerV1' or 'fetchTickerV1AndV2' - 'fetchTickerV1' for original ccxt.gemini.fetchTicker - 'fetchTickerV1AndV2' for 2 api calls to get the result of both fetchTicker methods - default = 'fetchTickerV1'
|
816
908
|
:returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
|
817
909
|
"""
|
818
910
|
method = self.safe_value(self.options, 'fetchTickerMethod', 'fetchTickerV1')
|
@@ -822,7 +914,7 @@ class gemini(Exchange, ImplicitAPI):
|
|
822
914
|
return await self.fetch_ticker_v2(symbol, params)
|
823
915
|
return await self.fetch_ticker_v1_and_v2(symbol, params)
|
824
916
|
|
825
|
-
def parse_ticker(self, ticker, market: Market = None) -> Ticker:
|
917
|
+
def parse_ticker(self, ticker: dict, market: Market = None) -> Ticker:
|
826
918
|
#
|
827
919
|
# fetchTickers
|
828
920
|
#
|
@@ -915,7 +1007,9 @@ class gemini(Exchange, ImplicitAPI):
|
|
915
1007
|
async def fetch_tickers(self, symbols: Strings = None, params={}) -> Tickers:
|
916
1008
|
"""
|
917
1009
|
fetches price tickers for multiple markets, statistical information calculated over the past 24 hours for each market
|
918
|
-
|
1010
|
+
|
1011
|
+
https://docs.gemini.com/rest-api/#price-feed
|
1012
|
+
|
919
1013
|
:param str[]|None symbols: unified symbols of the markets to fetch the ticker for, all market tickers are returned if not assigned
|
920
1014
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
921
1015
|
:returns dict: a dictionary of `ticker structures <https://docs.ccxt.com/#/?id=ticker-structure>`
|
@@ -938,7 +1032,7 @@ class gemini(Exchange, ImplicitAPI):
|
|
938
1032
|
#
|
939
1033
|
return self.parse_tickers(response, symbols)
|
940
1034
|
|
941
|
-
def parse_trade(self, trade, market: Market = None) -> Trade:
|
1035
|
+
def parse_trade(self, trade: dict, market: Market = None) -> Trade:
|
942
1036
|
#
|
943
1037
|
# public fetchTrades
|
944
1038
|
#
|
@@ -1004,7 +1098,9 @@ class gemini(Exchange, ImplicitAPI):
|
|
1004
1098
|
async def fetch_trades(self, symbol: str, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
|
1005
1099
|
"""
|
1006
1100
|
get the list of most recent trades for a particular symbol
|
1007
|
-
|
1101
|
+
|
1102
|
+
https://docs.gemini.com/rest-api/#trade-history
|
1103
|
+
|
1008
1104
|
:param str symbol: unified symbol of the market to fetch trades for
|
1009
1105
|
:param int [since]: timestamp in ms of the earliest trade to fetch
|
1010
1106
|
:param int [limit]: the maximum amount of trades to fetch
|
@@ -1013,7 +1109,7 @@ class gemini(Exchange, ImplicitAPI):
|
|
1013
1109
|
"""
|
1014
1110
|
await self.load_markets()
|
1015
1111
|
market = self.market(symbol)
|
1016
|
-
request = {
|
1112
|
+
request: dict = {
|
1017
1113
|
'symbol': market['id'],
|
1018
1114
|
}
|
1019
1115
|
if limit is not None:
|
@@ -1037,7 +1133,7 @@ class gemini(Exchange, ImplicitAPI):
|
|
1037
1133
|
return self.parse_trades(response, market, since, limit)
|
1038
1134
|
|
1039
1135
|
def parse_balance(self, response) -> Balances:
|
1040
|
-
result = {'info': response}
|
1136
|
+
result: dict = {'info': response}
|
1041
1137
|
for i in range(0, len(response)):
|
1042
1138
|
balance = response[i]
|
1043
1139
|
currencyId = self.safe_string(balance, 'currency')
|
@@ -1048,10 +1144,12 @@ class gemini(Exchange, ImplicitAPI):
|
|
1048
1144
|
result[code] = account
|
1049
1145
|
return self.safe_balance(result)
|
1050
1146
|
|
1051
|
-
async def fetch_trading_fees(self, params={}):
|
1147
|
+
async def fetch_trading_fees(self, params={}) -> TradingFees:
|
1052
1148
|
"""
|
1053
1149
|
fetch the trading fees for multiple markets
|
1054
|
-
|
1150
|
+
|
1151
|
+
https://docs.gemini.com/rest-api/#get-notional-volume
|
1152
|
+
|
1055
1153
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
1056
1154
|
:returns dict: a dictionary of `fee structures <https://docs.ccxt.com/#/?id=fee-structure>` indexed by market symbols
|
1057
1155
|
"""
|
@@ -1091,7 +1189,7 @@ class gemini(Exchange, ImplicitAPI):
|
|
1091
1189
|
takerString = Precise.string_div(takerBps, '10000')
|
1092
1190
|
maker = self.parse_number(makerString)
|
1093
1191
|
taker = self.parse_number(takerString)
|
1094
|
-
result = {}
|
1192
|
+
result: dict = {}
|
1095
1193
|
for i in range(0, len(self.symbols)):
|
1096
1194
|
symbol = self.symbols[i]
|
1097
1195
|
result[symbol] = {
|
@@ -1107,7 +1205,9 @@ class gemini(Exchange, ImplicitAPI):
|
|
1107
1205
|
async def fetch_balance(self, params={}) -> Balances:
|
1108
1206
|
"""
|
1109
1207
|
query for balance and get the amount of funds available for trading or funds locked in orders
|
1110
|
-
|
1208
|
+
|
1209
|
+
https://docs.gemini.com/rest-api/#get-available-balances
|
1210
|
+
|
1111
1211
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
1112
1212
|
:returns dict: a `balance structure <https://docs.ccxt.com/#/?id=balance-structure>`
|
1113
1213
|
"""
|
@@ -1115,7 +1215,7 @@ class gemini(Exchange, ImplicitAPI):
|
|
1115
1215
|
response = await self.privatePostV1Balances(params)
|
1116
1216
|
return self.parse_balance(response)
|
1117
1217
|
|
1118
|
-
def parse_order(self, order, market: Market = None) -> Order:
|
1218
|
+
def parse_order(self, order: dict, market: Market = None) -> Order:
|
1119
1219
|
#
|
1120
1220
|
# createOrder(private)
|
1121
1221
|
#
|
@@ -1264,7 +1364,6 @@ class gemini(Exchange, ImplicitAPI):
|
|
1264
1364
|
'postOnly': postOnly,
|
1265
1365
|
'side': side,
|
1266
1366
|
'price': price,
|
1267
|
-
'stopPrice': None,
|
1268
1367
|
'triggerPrice': None,
|
1269
1368
|
'average': average,
|
1270
1369
|
'cost': None,
|
@@ -1278,13 +1377,16 @@ class gemini(Exchange, ImplicitAPI):
|
|
1278
1377
|
async def fetch_order(self, id: str, symbol: Str = None, params={}):
|
1279
1378
|
"""
|
1280
1379
|
fetches information on an order made by the user
|
1281
|
-
|
1380
|
+
|
1381
|
+
https://docs.gemini.com/rest-api/#order-status
|
1382
|
+
|
1383
|
+
:param str id: order id
|
1282
1384
|
:param str symbol: unified symbol of the market the order was made in
|
1283
1385
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
1284
1386
|
:returns dict: An `order structure <https://docs.ccxt.com/#/?id=order-structure>`
|
1285
1387
|
"""
|
1286
1388
|
await self.load_markets()
|
1287
|
-
request = {
|
1389
|
+
request: dict = {
|
1288
1390
|
'order_id': id,
|
1289
1391
|
}
|
1290
1392
|
response = await self.privatePostV1OrderStatus(self.extend(request, params))
|
@@ -1316,7 +1418,9 @@ class gemini(Exchange, ImplicitAPI):
|
|
1316
1418
|
async def fetch_open_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
|
1317
1419
|
"""
|
1318
1420
|
fetch all unfilled currently open orders
|
1319
|
-
|
1421
|
+
|
1422
|
+
https://docs.gemini.com/rest-api/#get-active-orders
|
1423
|
+
|
1320
1424
|
:param str symbol: unified market symbol
|
1321
1425
|
:param int [since]: the earliest time in ms to fetch open orders for
|
1322
1426
|
:param int [limit]: the maximum number of open orders structures to retrieve
|
@@ -1358,12 +1462,14 @@ class gemini(Exchange, ImplicitAPI):
|
|
1358
1462
|
async def create_order(self, symbol: str, type: OrderType, side: OrderSide, amount: float, price: Num = None, params={}):
|
1359
1463
|
"""
|
1360
1464
|
create a trade order
|
1361
|
-
|
1465
|
+
|
1466
|
+
https://docs.gemini.com/rest-api/#new-order
|
1467
|
+
|
1362
1468
|
:param str symbol: unified symbol of the market to create an order in
|
1363
1469
|
:param str type: must be 'limit'
|
1364
1470
|
:param str side: 'buy' or 'sell'
|
1365
1471
|
:param float amount: how much of currency you want to trade in units of base currency
|
1366
|
-
:param float [price]: the price at which the order is to be
|
1472
|
+
:param float [price]: the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
|
1367
1473
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
1368
1474
|
:returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
|
1369
1475
|
"""
|
@@ -1377,7 +1483,7 @@ class gemini(Exchange, ImplicitAPI):
|
|
1377
1483
|
market = self.market(symbol)
|
1378
1484
|
amountString = self.amount_to_precision(symbol, amount)
|
1379
1485
|
priceString = self.price_to_precision(symbol, price)
|
1380
|
-
request = {
|
1486
|
+
request: dict = {
|
1381
1487
|
'client_order_id': clientOrderId,
|
1382
1488
|
'symbol': market['id'],
|
1383
1489
|
'amount': amountString,
|
@@ -1388,12 +1494,12 @@ class gemini(Exchange, ImplicitAPI):
|
|
1388
1494
|
}
|
1389
1495
|
type = self.safe_string(params, 'type', type)
|
1390
1496
|
params = self.omit(params, 'type')
|
1391
|
-
|
1392
|
-
params = self.omit(params, ['stop_price', 'stopPrice', 'type'])
|
1497
|
+
triggerPrice = self.safe_string_n(params, ['triggerPrice', 'stop_price', 'stopPrice'])
|
1498
|
+
params = self.omit(params, ['triggerPrice', 'stop_price', 'stopPrice', 'type'])
|
1393
1499
|
if type == 'stopLimit':
|
1394
|
-
raise ArgumentsRequired(self.id + ' createOrder() requires a
|
1395
|
-
if
|
1396
|
-
request['stop_price'] = self.price_to_precision(symbol,
|
1500
|
+
raise ArgumentsRequired(self.id + ' createOrder() requires a triggerPrice parameter or a stop_price parameter for ' + type + ' orders')
|
1501
|
+
if triggerPrice is not None:
|
1502
|
+
request['stop_price'] = self.price_to_precision(symbol, triggerPrice)
|
1397
1503
|
request['type'] = 'exchange stop limit'
|
1398
1504
|
else:
|
1399
1505
|
# No options can be applied to stop-limit orders at self time.
|
@@ -1443,14 +1549,16 @@ class gemini(Exchange, ImplicitAPI):
|
|
1443
1549
|
async def cancel_order(self, id: str, symbol: Str = None, params={}):
|
1444
1550
|
"""
|
1445
1551
|
cancels an open order
|
1446
|
-
|
1552
|
+
|
1553
|
+
https://docs.gemini.com/rest-api/#cancel-order
|
1554
|
+
|
1447
1555
|
:param str id: order id
|
1448
1556
|
:param str symbol: unified symbol of the market the order was made in
|
1449
1557
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
1450
1558
|
:returns dict: An `order structure <https://docs.ccxt.com/#/?id=order-structure>`
|
1451
1559
|
"""
|
1452
1560
|
await self.load_markets()
|
1453
|
-
request = {
|
1561
|
+
request: dict = {
|
1454
1562
|
'order_id': id,
|
1455
1563
|
}
|
1456
1564
|
response = await self.privatePostV1OrderCancel(self.extend(request, params))
|
@@ -1483,7 +1591,9 @@ class gemini(Exchange, ImplicitAPI):
|
|
1483
1591
|
async def fetch_my_trades(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}):
|
1484
1592
|
"""
|
1485
1593
|
fetch all trades made by the user
|
1486
|
-
|
1594
|
+
|
1595
|
+
https://docs.gemini.com/rest-api/#get-past-trades
|
1596
|
+
|
1487
1597
|
:param str symbol: unified market symbol
|
1488
1598
|
:param int [since]: the earliest time in ms to fetch trades for
|
1489
1599
|
:param int [limit]: the maximum number of trades structures to retrieve
|
@@ -1494,7 +1604,7 @@ class gemini(Exchange, ImplicitAPI):
|
|
1494
1604
|
raise ArgumentsRequired(self.id + ' fetchMyTrades() requires a symbol argument')
|
1495
1605
|
await self.load_markets()
|
1496
1606
|
market = self.market(symbol)
|
1497
|
-
request = {
|
1607
|
+
request: dict = {
|
1498
1608
|
'symbol': market['id'],
|
1499
1609
|
}
|
1500
1610
|
if limit is not None:
|
@@ -1504,10 +1614,12 @@ class gemini(Exchange, ImplicitAPI):
|
|
1504
1614
|
response = await self.privatePostV1Mytrades(self.extend(request, params))
|
1505
1615
|
return self.parse_trades(response, market, since, limit)
|
1506
1616
|
|
1507
|
-
async def withdraw(self, code: str, amount: float, address, tag=None, params={}):
|
1617
|
+
async def withdraw(self, code: str, amount: float, address: str, tag=None, params={}) -> Transaction:
|
1508
1618
|
"""
|
1509
1619
|
make a withdrawal
|
1510
|
-
|
1620
|
+
|
1621
|
+
https://docs.gemini.com/rest-api/#withdraw-crypto-funds
|
1622
|
+
|
1511
1623
|
:param str code: unified currency code
|
1512
1624
|
:param float amount: the amount to withdraw
|
1513
1625
|
:param str address: the address to withdraw to
|
@@ -1519,7 +1631,7 @@ class gemini(Exchange, ImplicitAPI):
|
|
1519
1631
|
self.check_address(address)
|
1520
1632
|
await self.load_markets()
|
1521
1633
|
currency = self.currency(code)
|
1522
|
-
request = {
|
1634
|
+
request: dict = {
|
1523
1635
|
'currency': currency['id'],
|
1524
1636
|
'amount': amount,
|
1525
1637
|
'address': address,
|
@@ -1562,7 +1674,9 @@ class gemini(Exchange, ImplicitAPI):
|
|
1562
1674
|
async def fetch_deposits_withdrawals(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Transaction]:
|
1563
1675
|
"""
|
1564
1676
|
fetch history of deposits and withdrawals
|
1565
|
-
|
1677
|
+
|
1678
|
+
https://docs.gemini.com/rest-api/#transfers
|
1679
|
+
|
1566
1680
|
:param str [code]: unified currency code for the currency of the deposit/withdrawals, default is None
|
1567
1681
|
:param int [since]: timestamp in ms of the earliest deposit/withdrawal, default is None
|
1568
1682
|
:param int [limit]: max number of deposit/withdrawals to return, default is None
|
@@ -1570,7 +1684,7 @@ class gemini(Exchange, ImplicitAPI):
|
|
1570
1684
|
:returns dict: a list of `transaction structure <https://docs.ccxt.com/#/?id=transaction-structure>`
|
1571
1685
|
"""
|
1572
1686
|
await self.load_markets()
|
1573
|
-
request = {}
|
1687
|
+
request: dict = {}
|
1574
1688
|
if limit is not None:
|
1575
1689
|
request['limit_transfers'] = limit
|
1576
1690
|
if since is not None:
|
@@ -1578,7 +1692,7 @@ class gemini(Exchange, ImplicitAPI):
|
|
1578
1692
|
response = await self.privatePostV1Transfers(self.extend(request, params))
|
1579
1693
|
return self.parse_transactions(response)
|
1580
1694
|
|
1581
|
-
def parse_transaction(self, transaction, currency: Currency = None) -> Transaction:
|
1695
|
+
def parse_transaction(self, transaction: dict, currency: Currency = None) -> Transaction:
|
1582
1696
|
#
|
1583
1697
|
# withdraw
|
1584
1698
|
#
|
@@ -1634,8 +1748,8 @@ class gemini(Exchange, ImplicitAPI):
|
|
1634
1748
|
'fee': fee,
|
1635
1749
|
}
|
1636
1750
|
|
1637
|
-
def parse_transaction_status(self, status):
|
1638
|
-
statuses = {
|
1751
|
+
def parse_transaction_status(self, status: Str):
|
1752
|
+
statuses: dict = {
|
1639
1753
|
'Advanced': 'ok',
|
1640
1754
|
'Complete': 'ok',
|
1641
1755
|
}
|
@@ -1659,9 +1773,11 @@ class gemini(Exchange, ImplicitAPI):
|
|
1659
1773
|
'info': depositAddress,
|
1660
1774
|
}
|
1661
1775
|
|
1662
|
-
async def fetch_deposit_address(self, code: str, params={}):
|
1776
|
+
async def fetch_deposit_address(self, code: str, params={}) -> DepositAddress:
|
1663
1777
|
"""
|
1664
|
-
|
1778
|
+
|
1779
|
+
https://docs.gemini.com/rest-api/#get-deposit-addresses
|
1780
|
+
|
1665
1781
|
fetch the deposit address for a currency associated with self account
|
1666
1782
|
:param str code: unified currency code
|
1667
1783
|
:param dict [params]: extra parameters specific to the endpoint
|
@@ -1675,10 +1791,12 @@ class gemini(Exchange, ImplicitAPI):
|
|
1675
1791
|
networkGroup = self.index_by(self.safe_value(groupedByNetwork, networkCode), 'currency')
|
1676
1792
|
return self.safe_value(networkGroup, code)
|
1677
1793
|
|
1678
|
-
async def fetch_deposit_addresses_by_network(self, code: str, params={}):
|
1794
|
+
async def fetch_deposit_addresses_by_network(self, code: str, params={}) -> List[DepositAddress]:
|
1679
1795
|
"""
|
1680
1796
|
fetch a dictionary of addresses for a currency, indexed by network
|
1681
|
-
|
1797
|
+
|
1798
|
+
https://docs.gemini.com/rest-api/#get-deposit-addresses
|
1799
|
+
|
1682
1800
|
:param str code: unified currency code of the currency for the deposit address
|
1683
1801
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
1684
1802
|
:param str [params.network]: *required* The chain of currency
|
@@ -1692,7 +1810,7 @@ class gemini(Exchange, ImplicitAPI):
|
|
1692
1810
|
if networkCode is None:
|
1693
1811
|
raise ArgumentsRequired(self.id + ' fetchDepositAddresses() requires a network parameter')
|
1694
1812
|
networkId = self.network_code_to_id(networkCode)
|
1695
|
-
request = {
|
1813
|
+
request: dict = {
|
1696
1814
|
'network': networkId,
|
1697
1815
|
}
|
1698
1816
|
response = await self.privatePostV1AddressesNetwork(self.extend(request, params))
|
@@ -1707,7 +1825,7 @@ class gemini(Exchange, ImplicitAPI):
|
|
1707
1825
|
apiKey = self.apiKey
|
1708
1826
|
if apiKey.find('account') < 0:
|
1709
1827
|
raise AuthenticationError(self.id + ' sign() requires an account-key, master-keys are not-supported')
|
1710
|
-
nonce = self.nonce()
|
1828
|
+
nonce = str(self.nonce())
|
1711
1829
|
request = self.extend({
|
1712
1830
|
'request': url,
|
1713
1831
|
'nonce': nonce,
|
@@ -1729,7 +1847,7 @@ class gemini(Exchange, ImplicitAPI):
|
|
1729
1847
|
body = self.json(query)
|
1730
1848
|
return {'url': url, 'method': method, 'body': body, 'headers': headers}
|
1731
1849
|
|
1732
|
-
def handle_errors(self, httpCode, reason, url, method, headers, body, response, requestHeaders, requestBody):
|
1850
|
+
def handle_errors(self, httpCode: int, reason: str, url: str, method: str, headers: dict, body: str, response, requestHeaders, requestBody):
|
1733
1851
|
if response is None:
|
1734
1852
|
if isinstance(body, str):
|
1735
1853
|
feedback = self.id + ' ' + body
|
@@ -1756,14 +1874,16 @@ class gemini(Exchange, ImplicitAPI):
|
|
1756
1874
|
async def create_deposit_address(self, code: str, params={}):
|
1757
1875
|
"""
|
1758
1876
|
create a currency deposit address
|
1759
|
-
|
1877
|
+
|
1878
|
+
https://docs.gemini.com/rest-api/#new-deposit-address
|
1879
|
+
|
1760
1880
|
:param str code: unified currency code of the currency for the deposit address
|
1761
1881
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
1762
1882
|
:returns dict: an `address structure <https://docs.ccxt.com/#/?id=address-structure>`
|
1763
1883
|
"""
|
1764
1884
|
await self.load_markets()
|
1765
1885
|
currency = self.currency(code)
|
1766
|
-
request = {
|
1886
|
+
request: dict = {
|
1767
1887
|
'currency': currency['id'],
|
1768
1888
|
}
|
1769
1889
|
response = await self.privatePostV1DepositCurrencyNewAddress(self.extend(request, params))
|
@@ -1779,7 +1899,9 @@ class gemini(Exchange, ImplicitAPI):
|
|
1779
1899
|
async def fetch_ohlcv(self, symbol: str, timeframe='1m', since: Int = None, limit: Int = None, params={}) -> List[list]:
|
1780
1900
|
"""
|
1781
1901
|
fetches historical candlestick data containing the open, high, low, and close price, and the volume of a market
|
1782
|
-
|
1902
|
+
|
1903
|
+
https://docs.gemini.com/rest-api/#candles
|
1904
|
+
|
1783
1905
|
:param str symbol: unified symbol of the market to fetch OHLCV data for
|
1784
1906
|
:param str timeframe: the length of time each candle represents
|
1785
1907
|
:param int [since]: timestamp in ms of the earliest candle to fetch
|
@@ -1790,7 +1912,7 @@ class gemini(Exchange, ImplicitAPI):
|
|
1790
1912
|
await self.load_markets()
|
1791
1913
|
market = self.market(symbol)
|
1792
1914
|
timeframeId = self.safe_string(self.timeframes, timeframe, timeframe)
|
1793
|
-
request = {
|
1915
|
+
request: dict = {
|
1794
1916
|
'timeframe': timeframeId,
|
1795
1917
|
'symbol': market['id'],
|
1796
1918
|
}
|