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