ccxt 4.2.77__py2.py3-none-any.whl → 4.4.48__py2.py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- ccxt/__init__.py +36 -14
- ccxt/abstract/alpaca.py +4 -0
- ccxt/abstract/bigone.py +1 -1
- ccxt/abstract/binance.py +112 -48
- ccxt/abstract/binancecoinm.py +112 -48
- ccxt/abstract/binanceus.py +147 -83
- ccxt/abstract/binanceusdm.py +112 -48
- ccxt/abstract/bingx.py +133 -78
- ccxt/abstract/bitbank.py +5 -0
- ccxt/abstract/bitfinex.py +136 -65
- ccxt/abstract/bitfinex1.py +69 -0
- ccxt/abstract/bitflyer.py +1 -0
- ccxt/abstract/bitget.py +8 -1
- ccxt/abstract/bitmart.py +13 -1
- ccxt/abstract/bitopro.py +1 -0
- ccxt/abstract/bitpanda.py +0 -12
- ccxt/abstract/bitrue.py +3 -3
- ccxt/abstract/bitstamp.py +26 -3
- ccxt/abstract/blofin.py +24 -0
- ccxt/abstract/btcbox.py +1 -0
- ccxt/abstract/bybit.py +29 -14
- ccxt/abstract/cex.py +28 -29
- ccxt/abstract/coinbase.py +6 -0
- ccxt/abstract/coinbaseadvanced.py +94 -0
- ccxt/abstract/{coinbasepro.py → coinbaseexchange.py} +1 -0
- ccxt/abstract/coinbaseinternational.py +1 -1
- ccxt/abstract/coincatch.py +94 -0
- ccxt/abstract/coinex.py +233 -123
- ccxt/abstract/coinmetro.py +1 -0
- ccxt/abstract/cryptocom.py +14 -0
- ccxt/abstract/defx.py +69 -0
- ccxt/abstract/deribit.py +1 -0
- ccxt/abstract/digifinex.py +1 -0
- ccxt/abstract/ellipx.py +25 -0
- ccxt/abstract/gate.py +20 -0
- ccxt/abstract/gateio.py +20 -0
- ccxt/abstract/gemini.py +1 -0
- ccxt/abstract/hashkey.py +67 -0
- ccxt/abstract/hyperliquid.py +1 -1
- ccxt/abstract/independentreserve.py +6 -0
- ccxt/abstract/kraken.py +4 -3
- ccxt/abstract/krakenfutures.py +4 -0
- ccxt/abstract/kucoin.py +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 +3104 -880
- 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 +1513 -563
- 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 +206 -89
- ccxt/async_support/coinspot.py +137 -62
- ccxt/async_support/cryptocom.py +515 -185
- ccxt/async_support/currencycom.py +203 -85
- ccxt/async_support/defx.py +2066 -0
- ccxt/async_support/delta.py +404 -109
- ccxt/async_support/deribit.py +557 -323
- ccxt/async_support/digifinex.py +340 -223
- ccxt/async_support/ellipx.py +1826 -0
- ccxt/async_support/exmo.py +259 -128
- ccxt/async_support/gate.py +1472 -463
- ccxt/async_support/gemini.py +206 -84
- ccxt/async_support/hashkey.py +4164 -0
- ccxt/async_support/hitbtc.py +334 -178
- ccxt/async_support/hollaex.py +134 -83
- ccxt/async_support/htx.py +1095 -563
- ccxt/async_support/huobijp.py +105 -56
- ccxt/async_support/hyperliquid.py +1633 -268
- ccxt/async_support/idex.py +148 -95
- ccxt/async_support/independentreserve.py +236 -31
- ccxt/async_support/indodax.py +165 -62
- ccxt/async_support/kraken.py +871 -354
- ccxt/async_support/krakenfutures.py +324 -100
- ccxt/async_support/kucoin.py +917 -357
- ccxt/async_support/kucoinfutures.py +1004 -149
- ccxt/async_support/kuna.py +138 -106
- ccxt/async_support/latoken.py +135 -79
- ccxt/async_support/lbank.py +290 -113
- ccxt/async_support/luno.py +112 -62
- ccxt/async_support/lykke.py +104 -55
- ccxt/async_support/mercado.py +36 -29
- ccxt/async_support/mexc.py +995 -429
- ccxt/async_support/myokx.py +43 -0
- ccxt/async_support/ndax.py +163 -82
- ccxt/async_support/novadax.py +121 -75
- ccxt/async_support/oceanex.py +175 -59
- ccxt/async_support/okcoin.py +222 -163
- ccxt/async_support/okx.py +1776 -454
- ccxt/async_support/onetrading.py +132 -414
- ccxt/async_support/oxfun.py +2832 -0
- ccxt/async_support/p2b.py +79 -51
- ccxt/async_support/paradex.py +2017 -0
- ccxt/async_support/paymium.py +56 -32
- ccxt/async_support/phemex.py +572 -196
- ccxt/async_support/poloniex.py +218 -95
- ccxt/async_support/poloniexfutures.py +260 -92
- ccxt/async_support/probit.py +143 -110
- ccxt/async_support/timex.py +123 -70
- ccxt/async_support/tokocrypto.py +129 -93
- ccxt/async_support/tradeogre.py +39 -25
- ccxt/async_support/upbit.py +322 -113
- ccxt/async_support/vertex.py +2983 -0
- ccxt/async_support/wavesexchange.py +227 -173
- ccxt/async_support/wazirx.py +145 -65
- ccxt/async_support/whitebit.py +533 -138
- ccxt/async_support/woo.py +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 +3104 -880
- 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 +1513 -563
- 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 +206 -89
- ccxt/coinspot.py +137 -62
- ccxt/cryptocom.py +515 -185
- ccxt/currencycom.py +203 -85
- ccxt/defx.py +2065 -0
- ccxt/delta.py +404 -109
- ccxt/deribit.py +557 -323
- ccxt/digifinex.py +340 -223
- ccxt/ellipx.py +1826 -0
- ccxt/exmo.py +259 -128
- ccxt/gate.py +1472 -463
- ccxt/gemini.py +206 -84
- ccxt/hashkey.py +4164 -0
- ccxt/hitbtc.py +334 -178
- ccxt/hollaex.py +134 -83
- ccxt/htx.py +1095 -563
- ccxt/huobijp.py +105 -56
- ccxt/hyperliquid.py +1632 -268
- ccxt/idex.py +148 -95
- ccxt/independentreserve.py +235 -31
- ccxt/indodax.py +165 -62
- ccxt/kraken.py +871 -354
- ccxt/krakenfutures.py +324 -100
- ccxt/kucoin.py +917 -357
- ccxt/kucoinfutures.py +1004 -149
- ccxt/kuna.py +138 -106
- ccxt/latoken.py +135 -79
- ccxt/lbank.py +290 -113
- ccxt/luno.py +112 -62
- ccxt/lykke.py +104 -55
- ccxt/mercado.py +36 -29
- ccxt/mexc.py +994 -429
- ccxt/myokx.py +43 -0
- ccxt/ndax.py +163 -82
- ccxt/novadax.py +121 -75
- ccxt/oceanex.py +175 -59
- ccxt/okcoin.py +222 -163
- ccxt/okx.py +1776 -454
- ccxt/onetrading.py +132 -414
- ccxt/oxfun.py +2831 -0
- ccxt/p2b.py +79 -51
- ccxt/paradex.py +2017 -0
- ccxt/paymium.py +56 -32
- ccxt/phemex.py +572 -196
- ccxt/poloniex.py +218 -95
- ccxt/poloniexfutures.py +260 -92
- ccxt/pro/__init__.py +29 -5
- ccxt/pro/alpaca.py +32 -17
- ccxt/pro/ascendex.py +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 +138 -39
- ccxt/pro/bitmex.py +199 -40
- ccxt/pro/bitopro.py +25 -13
- ccxt/pro/bitrue.py +31 -32
- ccxt/pro/bitstamp.py +7 -6
- ccxt/pro/bitvavo.py +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.48.dist-info/LICENSE.txt +21 -0
- ccxt-4.4.48.dist-info/METADATA +646 -0
- ccxt-4.4.48.dist-info/RECORD +669 -0
- {ccxt-4.2.77.dist-info → ccxt-4.4.48.dist-info}/WHEEL +1 -1
- ccxt/abstract/bitbay.py +0 -47
- ccxt/abstract/bitfinex2.py +0 -139
- ccxt/abstract/hitbtc3.py +0 -115
- ccxt/async_support/bitbay.py +0 -17
- ccxt/async_support/bitfinex2.py +0 -3496
- ccxt/async_support/flowbtc.py +0 -34
- ccxt/bitbay.py +0 -17
- ccxt/bitfinex2.py +0 -3496
- ccxt/flowbtc.py +0 -34
- ccxt/hitbtc3.py +0 -16
- ccxt/pro/bitfinex2.py +0 -1081
- ccxt/test/base/__init__.py +0 -28
- ccxt/test/base/test_account.py +0 -26
- ccxt/test/base/test_balance.py +0 -56
- ccxt/test/base/test_borrow_interest.py +0 -35
- ccxt/test/base/test_borrow_rate.py +0 -32
- ccxt/test/base/test_calculate_fee.py +0 -51
- ccxt/test/base/test_crypto.py +0 -127
- ccxt/test/base/test_currency.py +0 -76
- ccxt/test/base/test_datetime.py +0 -103
- ccxt/test/base/test_decimal_to_precision.py +0 -392
- ccxt/test/base/test_deep_extend.py +0 -68
- ccxt/test/base/test_deposit_withdrawal.py +0 -50
- ccxt/test/base/test_exchange_datetime_functions.py +0 -76
- ccxt/test/base/test_funding_rate_history.py +0 -29
- ccxt/test/base/test_last_price.py +0 -32
- ccxt/test/base/test_ledger_entry.py +0 -45
- ccxt/test/base/test_ledger_item.py +0 -48
- ccxt/test/base/test_leverage_tier.py +0 -33
- ccxt/test/base/test_margin_mode.py +0 -24
- ccxt/test/base/test_margin_modification.py +0 -35
- ccxt/test/base/test_market.py +0 -190
- ccxt/test/base/test_number.py +0 -411
- ccxt/test/base/test_ohlcv.py +0 -32
- ccxt/test/base/test_open_interest.py +0 -32
- ccxt/test/base/test_order.py +0 -64
- ccxt/test/base/test_order_book.py +0 -63
- ccxt/test/base/test_position.py +0 -60
- ccxt/test/base/test_shared_methods.py +0 -345
- ccxt/test/base/test_status.py +0 -24
- ccxt/test/base/test_throttle.py +0 -126
- ccxt/test/base/test_ticker.py +0 -86
- ccxt/test/base/test_trade.py +0 -47
- ccxt/test/base/test_trading_fee.py +0 -26
- ccxt/test/base/test_transaction.py +0 -39
- ccxt-4.2.77.dist-info/METADATA +0 -626
- ccxt-4.2.77.dist-info/RECORD +0 -534
- {ccxt-4.2.77.dist-info → ccxt-4.4.48.dist-info}/top_level.txt +0 -0
ccxt/async_support/alpaca.py
CHANGED
@@ -5,10 +5,11 @@
|
|
5
5
|
|
6
6
|
from ccxt.async_support.base.exchange import Exchange
|
7
7
|
from ccxt.abstract.alpaca import ImplicitAPI
|
8
|
-
from ccxt.base.types import Int, Market, Num, Order, OrderBook, OrderSide, OrderType, Str, Trade
|
8
|
+
from ccxt.base.types import Balances, Currency, DepositAddress, Int, Market, Num, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, Transaction
|
9
9
|
from typing import List
|
10
10
|
from ccxt.base.errors import ExchangeError
|
11
11
|
from ccxt.base.errors import PermissionDenied
|
12
|
+
from ccxt.base.errors import ArgumentsRequired
|
12
13
|
from ccxt.base.errors import BadRequest
|
13
14
|
from ccxt.base.errors import BadSymbol
|
14
15
|
from ccxt.base.errors import InsufficientFunds
|
@@ -16,6 +17,7 @@ from ccxt.base.errors import InvalidOrder
|
|
16
17
|
from ccxt.base.errors import NotSupported
|
17
18
|
from ccxt.base.errors import RateLimitExceeded
|
18
19
|
from ccxt.base.decimal_to_precision import TICK_SIZE
|
20
|
+
from ccxt.base.precise import Precise
|
19
21
|
|
20
22
|
|
21
23
|
class alpaca(Exchange, ImplicitAPI):
|
@@ -32,7 +34,7 @@ class alpaca(Exchange, ImplicitAPI):
|
|
32
34
|
'hostname': 'alpaca.markets',
|
33
35
|
'pro': True,
|
34
36
|
'urls': {
|
35
|
-
'logo': 'https://
|
37
|
+
'logo': 'https://github.com/user-attachments/assets/e9476df8-a450-4c3e-ab9a-1a7794219e1b',
|
36
38
|
'www': 'https://alpaca.markets',
|
37
39
|
'api': {
|
38
40
|
'broker': 'https://broker-api.{hostname}',
|
@@ -42,7 +44,7 @@ class alpaca(Exchange, ImplicitAPI):
|
|
42
44
|
'test': {
|
43
45
|
'broker': 'https://broker-api.sandbox.{hostname}',
|
44
46
|
'trader': 'https://paper-api.{hostname}',
|
45
|
-
'market': 'https://data.
|
47
|
+
'market': 'https://data.{hostname}',
|
46
48
|
},
|
47
49
|
'doc': 'https://alpaca.markets/docs/',
|
48
50
|
'fees': 'https://docs.alpaca.markets/docs/crypto-fees',
|
@@ -59,31 +61,41 @@ class alpaca(Exchange, ImplicitAPI):
|
|
59
61
|
'closeAllPositions': False,
|
60
62
|
'closePosition': False,
|
61
63
|
'createOrder': True,
|
62
|
-
'
|
64
|
+
'createStopOrder': True,
|
65
|
+
'createTriggerOrder': True,
|
66
|
+
'editOrder': True,
|
67
|
+
'fetchBalance': True,
|
63
68
|
'fetchBidsAsks': False,
|
64
69
|
'fetchClosedOrders': True,
|
65
70
|
'fetchCurrencies': False,
|
66
|
-
'fetchDepositAddress':
|
71
|
+
'fetchDepositAddress': True,
|
67
72
|
'fetchDepositAddressesByNetwork': False,
|
68
|
-
'fetchDeposits':
|
69
|
-
'fetchDepositsWithdrawals':
|
73
|
+
'fetchDeposits': True,
|
74
|
+
'fetchDepositsWithdrawals': True,
|
70
75
|
'fetchFundingHistory': False,
|
71
76
|
'fetchFundingRate': False,
|
77
|
+
'fetchFundingRateHistory': False,
|
72
78
|
'fetchFundingRates': False,
|
73
79
|
'fetchL1OrderBook': True,
|
74
80
|
'fetchL2OrderBook': False,
|
75
81
|
'fetchMarkets': True,
|
76
|
-
'fetchMyTrades':
|
82
|
+
'fetchMyTrades': True,
|
77
83
|
'fetchOHLCV': True,
|
78
84
|
'fetchOpenOrder': False,
|
79
85
|
'fetchOpenOrders': True,
|
80
86
|
'fetchOrder': True,
|
81
87
|
'fetchOrderBook': True,
|
82
88
|
'fetchOrders': True,
|
89
|
+
'fetchPosition': False,
|
90
|
+
'fetchPositionHistory': False,
|
91
|
+
'fetchPositionMode': False,
|
83
92
|
'fetchPositions': False,
|
93
|
+
'fetchPositionsForSymbol': False,
|
94
|
+
'fetchPositionsHistory': False,
|
95
|
+
'fetchPositionsRisk': False,
|
84
96
|
'fetchStatus': False,
|
85
|
-
'fetchTicker':
|
86
|
-
'fetchTickers':
|
97
|
+
'fetchTicker': True,
|
98
|
+
'fetchTickers': True,
|
87
99
|
'fetchTime': True,
|
88
100
|
'fetchTrades': True,
|
89
101
|
'fetchTradingFee': False,
|
@@ -91,11 +103,12 @@ class alpaca(Exchange, ImplicitAPI):
|
|
91
103
|
'fetchTransactionFees': False,
|
92
104
|
'fetchTransactions': False,
|
93
105
|
'fetchTransfers': False,
|
94
|
-
'fetchWithdrawals':
|
106
|
+
'fetchWithdrawals': True,
|
107
|
+
'sandbox': True,
|
95
108
|
'setLeverage': False,
|
96
109
|
'setMarginMode': False,
|
97
110
|
'transfer': False,
|
98
|
-
'withdraw':
|
111
|
+
'withdraw': True,
|
99
112
|
},
|
100
113
|
'api': {
|
101
114
|
'broker': {
|
@@ -121,14 +134,18 @@ class alpaca(Exchange, ImplicitAPI):
|
|
121
134
|
'v2/assets/{symbol_or_asset_id}',
|
122
135
|
'v2/corporate_actions/announcements/{id}',
|
123
136
|
'v2/corporate_actions/announcements',
|
137
|
+
'v2/wallets',
|
138
|
+
'v2/wallets/transfers',
|
124
139
|
],
|
125
140
|
'post': [
|
126
141
|
'v2/orders',
|
127
142
|
'v2/watchlists',
|
128
143
|
'v2/watchlists/{watchlist_id}',
|
129
144
|
'v2/watchlists:by_name',
|
145
|
+
'v2/wallets/transfers',
|
130
146
|
],
|
131
147
|
'put': [
|
148
|
+
'v2/orders/{order_id}',
|
132
149
|
'v2/watchlists/{watchlist_id}',
|
133
150
|
'v2/watchlists:by_name',
|
134
151
|
],
|
@@ -257,6 +274,86 @@ class alpaca(Exchange, ImplicitAPI):
|
|
257
274
|
'defaultTimeInForce': 'gtc', # fok, gtc, ioc
|
258
275
|
'clientOrderId': 'ccxt_{id}',
|
259
276
|
},
|
277
|
+
'features': {
|
278
|
+
'spot': {
|
279
|
+
'sandbox': True,
|
280
|
+
'createOrder': {
|
281
|
+
'marginMode': False,
|
282
|
+
'triggerPrice': True,
|
283
|
+
'triggerPriceType': None,
|
284
|
+
'triggerDirection': False,
|
285
|
+
'stopLossPrice': False, # todo
|
286
|
+
'takeProfitPrice': False, # todo
|
287
|
+
'attachedStopLossTakeProfit': {
|
288
|
+
'triggerPriceType': {
|
289
|
+
'last': True,
|
290
|
+
'mark': True,
|
291
|
+
'index': True,
|
292
|
+
},
|
293
|
+
'price': True,
|
294
|
+
},
|
295
|
+
'timeInForce': {
|
296
|
+
'IOC': True,
|
297
|
+
'FOK': True,
|
298
|
+
'PO': True,
|
299
|
+
'GTD': False,
|
300
|
+
},
|
301
|
+
'hedged': False,
|
302
|
+
'trailing': True, # todo: implementation
|
303
|
+
'leverage': False,
|
304
|
+
'marketBuyRequiresPrice': False,
|
305
|
+
'marketBuyByCost': False,
|
306
|
+
'selfTradePrevention': False,
|
307
|
+
'iceberg': False,
|
308
|
+
},
|
309
|
+
'createOrders': None,
|
310
|
+
'fetchMyTrades': {
|
311
|
+
'marginMode': False,
|
312
|
+
'limit': 100,
|
313
|
+
'daysBack': 100000,
|
314
|
+
'untilDays': 100000,
|
315
|
+
},
|
316
|
+
'fetchOrder': {
|
317
|
+
'marginMode': False,
|
318
|
+
'trigger': False,
|
319
|
+
'trailing': False,
|
320
|
+
},
|
321
|
+
'fetchOpenOrders': {
|
322
|
+
'marginMode': False,
|
323
|
+
'limit': 500,
|
324
|
+
'trigger': False,
|
325
|
+
'trailing': False,
|
326
|
+
},
|
327
|
+
'fetchOrders': {
|
328
|
+
'marginMode': False,
|
329
|
+
'limit': 500,
|
330
|
+
'daysBack': 100000,
|
331
|
+
'untilDays': 100000,
|
332
|
+
'trigger': False,
|
333
|
+
'trailing': False,
|
334
|
+
},
|
335
|
+
'fetchClosedOrders': {
|
336
|
+
'marginMode': False,
|
337
|
+
'limit': 500,
|
338
|
+
'daysBack': 100000,
|
339
|
+
'daysBackCanceled': None,
|
340
|
+
'untilDays': 100000,
|
341
|
+
'trigger': False,
|
342
|
+
'trailing': False,
|
343
|
+
},
|
344
|
+
'fetchOHLCV': {
|
345
|
+
'limit': 1000,
|
346
|
+
},
|
347
|
+
},
|
348
|
+
'swap': {
|
349
|
+
'linear': None,
|
350
|
+
'inverse': None,
|
351
|
+
},
|
352
|
+
'future': {
|
353
|
+
'linear': None,
|
354
|
+
'inverse': None,
|
355
|
+
},
|
356
|
+
},
|
260
357
|
'exceptions': {
|
261
358
|
'exact': {
|
262
359
|
'forbidden.': PermissionDenied, # {"message": "forbidden."}
|
@@ -296,14 +393,16 @@ class alpaca(Exchange, ImplicitAPI):
|
|
296
393
|
iso = self.parse8601(localTime) - self.parse_to_numeric(jetlag) * 3600 * 1000
|
297
394
|
return iso
|
298
395
|
|
299
|
-
async def fetch_markets(self, params={}):
|
396
|
+
async def fetch_markets(self, params={}) -> List[Market]:
|
300
397
|
"""
|
301
398
|
retrieves data on all markets for alpaca
|
302
|
-
|
399
|
+
|
400
|
+
https://docs.alpaca.markets/reference/get-v2-assets
|
401
|
+
|
303
402
|
:param dict [params]: extra parameters specific to the exchange api endpoint
|
304
403
|
:returns dict[]: an array of objects representing market data
|
305
404
|
"""
|
306
|
-
request = {
|
405
|
+
request: dict = {
|
307
406
|
'asset_class': 'crypto',
|
308
407
|
'status': 'active',
|
309
408
|
}
|
@@ -423,8 +522,10 @@ class alpaca(Exchange, ImplicitAPI):
|
|
423
522
|
async def fetch_trades(self, symbol: str, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
|
424
523
|
"""
|
425
524
|
get the list of most recent trades for a particular symbol
|
426
|
-
|
427
|
-
|
525
|
+
|
526
|
+
https://docs.alpaca.markets/reference/cryptotrades
|
527
|
+
https://docs.alpaca.markets/reference/cryptolatesttrades
|
528
|
+
|
428
529
|
:param str symbol: unified symbol of the market to fetch trades for
|
429
530
|
:param int [since]: timestamp in ms of the earliest trade to fetch
|
430
531
|
:param int [limit]: the maximum amount of trades to fetch
|
@@ -438,7 +539,7 @@ class alpaca(Exchange, ImplicitAPI):
|
|
438
539
|
marketId = market['id']
|
439
540
|
loc = self.safe_string(params, 'loc', 'us')
|
440
541
|
method = self.safe_string(params, 'method', 'marketPublicGetV1beta3CryptoLocTrades')
|
441
|
-
request = {
|
542
|
+
request: dict = {
|
442
543
|
'symbols': marketId,
|
443
544
|
'loc': loc,
|
444
545
|
}
|
@@ -493,7 +594,9 @@ class alpaca(Exchange, ImplicitAPI):
|
|
493
594
|
async def fetch_order_book(self, symbol: str, limit: Int = None, params={}) -> OrderBook:
|
494
595
|
"""
|
495
596
|
fetches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
|
496
|
-
|
597
|
+
|
598
|
+
https://docs.alpaca.markets/reference/cryptolatestorderbooks
|
599
|
+
|
497
600
|
:param str symbol: unified symbol of the market to fetch the order book for
|
498
601
|
:param int [limit]: the maximum amount of order book entries to return
|
499
602
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
@@ -504,7 +607,7 @@ class alpaca(Exchange, ImplicitAPI):
|
|
504
607
|
market = self.market(symbol)
|
505
608
|
id = market['id']
|
506
609
|
loc = self.safe_string(params, 'loc', 'us')
|
507
|
-
request = {
|
610
|
+
request: dict = {
|
508
611
|
'symbols': id,
|
509
612
|
'loc': loc,
|
510
613
|
}
|
@@ -546,16 +649,18 @@ class alpaca(Exchange, ImplicitAPI):
|
|
546
649
|
# }
|
547
650
|
# }
|
548
651
|
#
|
549
|
-
orderbooks = self.
|
550
|
-
rawOrderbook = self.
|
652
|
+
orderbooks = self.safe_dict(response, 'orderbooks', {})
|
653
|
+
rawOrderbook = self.safe_dict(orderbooks, id, {})
|
551
654
|
timestamp = self.parse8601(self.safe_string(rawOrderbook, 't'))
|
552
655
|
return self.parse_order_book(rawOrderbook, market['symbol'], timestamp, 'b', 'a', 'p', 's')
|
553
656
|
|
554
657
|
async def fetch_ohlcv(self, symbol: str, timeframe='1m', since: Int = None, limit: Int = None, params={}) -> List[list]:
|
555
658
|
"""
|
556
659
|
fetches historical candlestick data containing the open, high, low, and close price, and the volume of a market
|
557
|
-
|
558
|
-
|
660
|
+
|
661
|
+
https://docs.alpaca.markets/reference/cryptobars
|
662
|
+
https://docs.alpaca.markets/reference/cryptolatestbars
|
663
|
+
|
559
664
|
:param str symbol: unified symbol of the market to fetch OHLCV data for
|
560
665
|
:param str timeframe: the length of time each candle represents
|
561
666
|
:param int [since]: timestamp in ms of the earliest candle to fetch
|
@@ -570,7 +675,7 @@ class alpaca(Exchange, ImplicitAPI):
|
|
570
675
|
marketId = market['id']
|
571
676
|
loc = self.safe_string(params, 'loc', 'us')
|
572
677
|
method = self.safe_string(params, 'method', 'marketPublicGetV1beta3CryptoLocBars')
|
573
|
-
request = {
|
678
|
+
request: dict = {
|
574
679
|
'symbols': marketId,
|
575
680
|
'loc': loc,
|
576
681
|
}
|
@@ -663,15 +768,154 @@ class alpaca(Exchange, ImplicitAPI):
|
|
663
768
|
self.safe_number(ohlcv, 'v'), # volume
|
664
769
|
]
|
665
770
|
|
771
|
+
async def fetch_ticker(self, symbol: str, params={}) -> Ticker:
|
772
|
+
"""
|
773
|
+
fetches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
|
774
|
+
|
775
|
+
https://docs.alpaca.markets/reference/cryptosnapshots-1
|
776
|
+
|
777
|
+
:param str symbol: unified symbol of the market to fetch the ticker for
|
778
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
779
|
+
:param str [params.loc]: crypto location, default: us
|
780
|
+
:returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
|
781
|
+
"""
|
782
|
+
await self.load_markets()
|
783
|
+
symbol = self.symbol(symbol)
|
784
|
+
tickers = await self.fetch_tickers([symbol], params)
|
785
|
+
return self.safe_dict(tickers, symbol)
|
786
|
+
|
787
|
+
async def fetch_tickers(self, symbols: Strings = None, params={}) -> Tickers:
|
788
|
+
"""
|
789
|
+
fetches price tickers for multiple markets, statistical information calculated over the past 24 hours for each market
|
790
|
+
|
791
|
+
https://docs.alpaca.markets/reference/cryptosnapshots-1
|
792
|
+
|
793
|
+
:param str[] symbols: unified symbols of the markets to fetch tickers for
|
794
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
795
|
+
:param str [params.loc]: crypto location, default: us
|
796
|
+
:returns dict: a dictionary of `ticker structures <https://docs.ccxt.com/#/?id=ticker-structure>`
|
797
|
+
"""
|
798
|
+
if symbols is None:
|
799
|
+
raise ArgumentsRequired(self.id + ' fetchTickers() requires a symbols argument')
|
800
|
+
await self.load_markets()
|
801
|
+
symbols = self.market_symbols(symbols)
|
802
|
+
loc = self.safe_string(params, 'loc', 'us')
|
803
|
+
ids = self.market_ids(symbols)
|
804
|
+
request = {
|
805
|
+
'symbols': ','.join(ids),
|
806
|
+
'loc': loc,
|
807
|
+
}
|
808
|
+
params = self.omit(params, 'loc')
|
809
|
+
response = await self.marketPublicGetV1beta3CryptoLocSnapshots(self.extend(request, params))
|
810
|
+
#
|
811
|
+
# {
|
812
|
+
# "snapshots": {
|
813
|
+
# "BTC/USD": {
|
814
|
+
# "dailyBar": {
|
815
|
+
# "c": 69403.554,
|
816
|
+
# "h": 69609.6515,
|
817
|
+
# "l": 69013.26,
|
818
|
+
# "n": 9,
|
819
|
+
# "o": 69536.7,
|
820
|
+
# "t": "2024-11-01T05:00:00Z",
|
821
|
+
# "v": 0.210809181,
|
822
|
+
# "vw": 69327.655393908
|
823
|
+
# },
|
824
|
+
# "latestQuote": {
|
825
|
+
# "ap": 69424.19,
|
826
|
+
# "as": 0.68149,
|
827
|
+
# "bp": 69366.086,
|
828
|
+
# "bs": 0.68312,
|
829
|
+
# "t": "2024-11-01T08:31:41.880246926Z"
|
830
|
+
# },
|
831
|
+
# "latestTrade": {
|
832
|
+
# "i": 5272941104897543146,
|
833
|
+
# "p": 69416.9,
|
834
|
+
# "s": 0.014017324,
|
835
|
+
# "t": "2024-11-01T08:14:28.245088803Z",
|
836
|
+
# "tks": "B"
|
837
|
+
# },
|
838
|
+
# "minuteBar": {
|
839
|
+
# "c": 69403.554,
|
840
|
+
# "h": 69403.554,
|
841
|
+
# "l": 69399.125,
|
842
|
+
# "n": 0,
|
843
|
+
# "o": 69399.125,
|
844
|
+
# "t": "2024-11-01T08:30:00Z",
|
845
|
+
# "v": 0,
|
846
|
+
# "vw": 0
|
847
|
+
# },
|
848
|
+
# "prevDailyBar": {
|
849
|
+
# "c": 69515.1415,
|
850
|
+
# "h": 72668.837,
|
851
|
+
# "l": 68796.85,
|
852
|
+
# "n": 129,
|
853
|
+
# "o": 72258.9,
|
854
|
+
# "t": "2024-10-31T05:00:00Z",
|
855
|
+
# "v": 2.217683307,
|
856
|
+
# "vw": 70782.6811608144
|
857
|
+
# }
|
858
|
+
# },
|
859
|
+
# }
|
860
|
+
# }
|
861
|
+
#
|
862
|
+
results = []
|
863
|
+
snapshots = self.safe_dict(response, 'snapshots', {})
|
864
|
+
marketIds = list(snapshots.keys())
|
865
|
+
for i in range(0, len(marketIds)):
|
866
|
+
marketId = marketIds[i]
|
867
|
+
market = self.safe_market(marketId)
|
868
|
+
entry = self.safe_dict(snapshots, marketId)
|
869
|
+
dailyBar = self.safe_dict(entry, 'dailyBar', {})
|
870
|
+
prevDailyBar = self.safe_dict(entry, 'prevDailyBar', {})
|
871
|
+
latestQuote = self.safe_dict(entry, 'latestQuote', {})
|
872
|
+
latestTrade = self.safe_dict(entry, 'latestTrade', {})
|
873
|
+
datetime = self.safe_string(latestQuote, 't')
|
874
|
+
ticker = self.safe_ticker({
|
875
|
+
'info': entry,
|
876
|
+
'symbol': market['symbol'],
|
877
|
+
'timestamp': self.parse8601(datetime),
|
878
|
+
'datetime': datetime,
|
879
|
+
'high': self.safe_string(dailyBar, 'h'),
|
880
|
+
'low': self.safe_string(dailyBar, 'l'),
|
881
|
+
'bid': self.safe_string(latestQuote, 'bp'),
|
882
|
+
'bidVolume': self.safe_string(latestQuote, 'bs'),
|
883
|
+
'ask': self.safe_string(latestQuote, 'ap'),
|
884
|
+
'askVolume': self.safe_string(latestQuote, 'as'),
|
885
|
+
'vwap': self.safe_string(dailyBar, 'vw'),
|
886
|
+
'open': self.safe_string(dailyBar, 'o'),
|
887
|
+
'close': self.safe_string(dailyBar, 'c'),
|
888
|
+
'last': self.safe_string(latestTrade, 'p'),
|
889
|
+
'previousClose': self.safe_string(prevDailyBar, 'c'),
|
890
|
+
'change': None,
|
891
|
+
'percentage': None,
|
892
|
+
'average': None,
|
893
|
+
'baseVolume': self.safe_string(dailyBar, 'v'),
|
894
|
+
'quoteVolume': self.safe_string(dailyBar, 'n'),
|
895
|
+
}, market)
|
896
|
+
results.append(ticker)
|
897
|
+
return self.filter_by_array(results, 'symbol', symbols)
|
898
|
+
|
899
|
+
def generate_client_order_id(self, params):
|
900
|
+
clientOrderIdprefix = self.safe_string(self.options, 'clientOrderId')
|
901
|
+
uuid = self.uuid()
|
902
|
+
parts = uuid.split('-')
|
903
|
+
random_id = ''.join(parts)
|
904
|
+
defaultClientId = self.implode_params(clientOrderIdprefix, {'id': random_id})
|
905
|
+
clientOrderId = self.safe_string(params, 'clientOrderId', defaultClientId)
|
906
|
+
return clientOrderId
|
907
|
+
|
666
908
|
async def create_order(self, symbol: str, type: OrderType, side: OrderSide, amount: float, price: Num = None, params={}):
|
667
909
|
"""
|
668
910
|
create a trade order
|
669
|
-
|
911
|
+
|
912
|
+
https://docs.alpaca.markets/reference/postorder
|
913
|
+
|
670
914
|
:param str symbol: unified symbol of the market to create an order in
|
671
915
|
:param str type: 'market', 'limit' or 'stop_limit'
|
672
916
|
:param str side: 'buy' or 'sell'
|
673
917
|
:param float amount: how much of currency you want to trade in units of base currency
|
674
|
-
:param float [price]: the price at which the order is to be
|
918
|
+
:param float [price]: the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
|
675
919
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
676
920
|
:param float [params.triggerPrice]: The price at which a trigger order is triggered at
|
677
921
|
:returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
|
@@ -679,7 +923,7 @@ class alpaca(Exchange, ImplicitAPI):
|
|
679
923
|
await self.load_markets()
|
680
924
|
market = self.market(symbol)
|
681
925
|
id = market['id']
|
682
|
-
request = {
|
926
|
+
request: dict = {
|
683
927
|
'symbol': id,
|
684
928
|
'qty': self.amount_to_precision(symbol, amount),
|
685
929
|
'side': side,
|
@@ -699,13 +943,7 @@ class alpaca(Exchange, ImplicitAPI):
|
|
699
943
|
defaultTIF = self.safe_string(self.options, 'defaultTimeInForce')
|
700
944
|
request['time_in_force'] = self.safe_string(params, 'timeInForce', defaultTIF)
|
701
945
|
params = self.omit(params, ['timeInForce', 'triggerPrice'])
|
702
|
-
|
703
|
-
uuid = self.uuid()
|
704
|
-
parts = uuid.split('-')
|
705
|
-
random_id = ''.join(parts)
|
706
|
-
defaultClientId = self.implode_params(clientOrderIdprefix, {'id': random_id})
|
707
|
-
clientOrderId = self.safe_string(params, 'clientOrderId', defaultClientId)
|
708
|
-
request['client_order_id'] = clientOrderId
|
946
|
+
request['client_order_id'] = self.generate_client_order_id(params)
|
709
947
|
params = self.omit(params, ['clientOrderId'])
|
710
948
|
order = await self.traderPrivatePostV2Orders(self.extend(request, params))
|
711
949
|
#
|
@@ -749,13 +987,15 @@ class alpaca(Exchange, ImplicitAPI):
|
|
749
987
|
async def cancel_order(self, id: str, symbol: Str = None, params={}):
|
750
988
|
"""
|
751
989
|
cancels an open order
|
752
|
-
|
990
|
+
|
991
|
+
https://docs.alpaca.markets/reference/deleteorderbyorderid
|
992
|
+
|
753
993
|
:param str id: order id
|
754
994
|
:param str symbol: unified symbol of the market the order was made in
|
755
995
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
756
996
|
:returns dict: An `order structure <https://docs.ccxt.com/#/?id=order-structure>`
|
757
997
|
"""
|
758
|
-
request = {
|
998
|
+
request: dict = {
|
759
999
|
'order_id': id,
|
760
1000
|
}
|
761
1001
|
response = await self.traderPrivateDeleteV2OrdersOrderId(self.extend(request, params))
|
@@ -765,12 +1005,14 @@ class alpaca(Exchange, ImplicitAPI):
|
|
765
1005
|
# "message": "order is not found."
|
766
1006
|
# }
|
767
1007
|
#
|
768
|
-
return self.
|
1008
|
+
return self.parse_order(response)
|
769
1009
|
|
770
1010
|
async def cancel_all_orders(self, symbol: Str = None, params={}):
|
771
1011
|
"""
|
772
1012
|
cancel all open orders in a market
|
773
|
-
|
1013
|
+
|
1014
|
+
https://docs.alpaca.markets/reference/deleteallorders
|
1015
|
+
|
774
1016
|
:param str symbol: alpaca cancelAllOrders cannot setting symbol, it will cancel all open orders
|
775
1017
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
776
1018
|
:returns dict[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
|
@@ -780,18 +1022,25 @@ class alpaca(Exchange, ImplicitAPI):
|
|
780
1022
|
if isinstance(response, list):
|
781
1023
|
return self.parse_orders(response, None)
|
782
1024
|
else:
|
783
|
-
return
|
1025
|
+
return [
|
1026
|
+
self.safe_order({
|
1027
|
+
'info': response,
|
1028
|
+
}),
|
1029
|
+
]
|
784
1030
|
|
785
1031
|
async def fetch_order(self, id: str, symbol: Str = None, params={}):
|
786
1032
|
"""
|
787
1033
|
fetches information on an order made by the user
|
788
|
-
|
1034
|
+
|
1035
|
+
https://docs.alpaca.markets/reference/getorderbyorderid
|
1036
|
+
|
1037
|
+
:param str id: the order id
|
789
1038
|
:param str symbol: unified symbol of the market the order was made in
|
790
1039
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
791
1040
|
:returns dict: An `order structure <https://docs.ccxt.com/#/?id=order-structure>`
|
792
1041
|
"""
|
793
1042
|
await self.load_markets()
|
794
|
-
request = {
|
1043
|
+
request: dict = {
|
795
1044
|
'order_id': id,
|
796
1045
|
}
|
797
1046
|
order = await self.traderPrivateGetV2OrdersOrderId(self.extend(request, params))
|
@@ -802,7 +1051,9 @@ class alpaca(Exchange, ImplicitAPI):
|
|
802
1051
|
async def fetch_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
|
803
1052
|
"""
|
804
1053
|
fetches information on multiple orders made by the user
|
805
|
-
|
1054
|
+
|
1055
|
+
https://docs.alpaca.markets/reference/getallorders
|
1056
|
+
|
806
1057
|
:param str symbol: unified market symbol of the market orders were made in
|
807
1058
|
:param int [since]: the earliest time in ms to fetch orders for
|
808
1059
|
:param int [limit]: the maximum number of order structures to retrieve
|
@@ -811,7 +1062,7 @@ class alpaca(Exchange, ImplicitAPI):
|
|
811
1062
|
:returns Order[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
|
812
1063
|
"""
|
813
1064
|
await self.load_markets()
|
814
|
-
request = {
|
1065
|
+
request: dict = {
|
815
1066
|
'status': 'all',
|
816
1067
|
}
|
817
1068
|
market = None
|
@@ -872,7 +1123,9 @@ class alpaca(Exchange, ImplicitAPI):
|
|
872
1123
|
async def fetch_open_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
|
873
1124
|
"""
|
874
1125
|
fetch all unfilled currently open orders
|
875
|
-
|
1126
|
+
|
1127
|
+
https://docs.alpaca.markets/reference/getallorders
|
1128
|
+
|
876
1129
|
:param str symbol: unified market symbol of the market orders were made in
|
877
1130
|
:param int [since]: the earliest time in ms to fetch orders for
|
878
1131
|
:param int [limit]: the maximum number of order structures to retrieve
|
@@ -880,7 +1133,7 @@ class alpaca(Exchange, ImplicitAPI):
|
|
880
1133
|
:param int [params.until]: the latest time in ms to fetch orders for
|
881
1134
|
:returns Order[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
|
882
1135
|
"""
|
883
|
-
request = {
|
1136
|
+
request: dict = {
|
884
1137
|
'status': 'open',
|
885
1138
|
}
|
886
1139
|
return await self.fetch_orders(symbol, since, limit, self.extend(request, params))
|
@@ -888,7 +1141,9 @@ class alpaca(Exchange, ImplicitAPI):
|
|
888
1141
|
async def fetch_closed_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
|
889
1142
|
"""
|
890
1143
|
fetches information on multiple closed orders made by the user
|
891
|
-
|
1144
|
+
|
1145
|
+
https://docs.alpaca.markets/reference/getallorders
|
1146
|
+
|
892
1147
|
:param str symbol: unified market symbol of the market orders were made in
|
893
1148
|
:param int [since]: the earliest time in ms to fetch orders for
|
894
1149
|
:param int [limit]: the maximum number of order structures to retrieve
|
@@ -896,12 +1151,54 @@ class alpaca(Exchange, ImplicitAPI):
|
|
896
1151
|
:param int [params.until]: the latest time in ms to fetch orders for
|
897
1152
|
:returns Order[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
|
898
1153
|
"""
|
899
|
-
request = {
|
1154
|
+
request: dict = {
|
900
1155
|
'status': 'closed',
|
901
1156
|
}
|
902
1157
|
return await self.fetch_orders(symbol, since, limit, self.extend(request, params))
|
903
1158
|
|
904
|
-
def
|
1159
|
+
async def edit_order(self, id: str, symbol: str, type: OrderType, side: OrderSide, amount: Num = None, price: Num = None, params={}):
|
1160
|
+
"""
|
1161
|
+
edit a trade order
|
1162
|
+
|
1163
|
+
https://docs.alpaca.markets/reference/patchorderbyorderid-1
|
1164
|
+
|
1165
|
+
:param str id: order id
|
1166
|
+
:param str [symbol]: unified symbol of the market to create an order in
|
1167
|
+
:param str [type]: 'market', 'limit' or 'stop_limit'
|
1168
|
+
:param str [side]: 'buy' or 'sell'
|
1169
|
+
:param float [amount]: how much of the currency you want to trade in units of the base currency
|
1170
|
+
:param float [price]: the price for the order, in units of the quote currency, ignored in market orders
|
1171
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
1172
|
+
:param str [params.triggerPrice]: the price to trigger a stop order
|
1173
|
+
:param str [params.timeInForce]: for crypto trading either 'gtc' or 'ioc' can be used
|
1174
|
+
:param str [params.clientOrderId]: a unique identifier for the order, automatically generated if not sent
|
1175
|
+
:returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
|
1176
|
+
"""
|
1177
|
+
await self.load_markets()
|
1178
|
+
request: dict = {
|
1179
|
+
'order_id': id,
|
1180
|
+
}
|
1181
|
+
market = None
|
1182
|
+
if symbol is not None:
|
1183
|
+
market = self.market(symbol)
|
1184
|
+
if amount is not None:
|
1185
|
+
request['qty'] = self.amount_to_precision(symbol, amount)
|
1186
|
+
triggerPrice = self.safe_string_n(params, ['triggerPrice', 'stop_price'])
|
1187
|
+
if triggerPrice is not None:
|
1188
|
+
request['stop_price'] = self.price_to_precision(symbol, triggerPrice)
|
1189
|
+
params = self.omit(params, 'triggerPrice')
|
1190
|
+
if price is not None:
|
1191
|
+
request['limit_price'] = self.price_to_precision(symbol, price)
|
1192
|
+
timeInForce = None
|
1193
|
+
timeInForce, params = self.handle_option_and_params_2(params, 'editOrder', 'timeInForce', 'defaultTimeInForce')
|
1194
|
+
if timeInForce is not None:
|
1195
|
+
request['time_in_force'] = timeInForce
|
1196
|
+
request['client_order_id'] = self.generate_client_order_id(params)
|
1197
|
+
params = self.omit(params, ['clientOrderId'])
|
1198
|
+
response = await self.traderPrivatePatchV2OrdersOrderId(self.extend(request, params))
|
1199
|
+
return self.parse_order(response, market)
|
1200
|
+
|
1201
|
+
def parse_order(self, order: dict, market: Market = None) -> Order:
|
905
1202
|
#
|
906
1203
|
# {
|
907
1204
|
# "id":"6ecfcc34-4bed-4b53-83ba-c564aa832a81",
|
@@ -972,7 +1269,6 @@ class alpaca(Exchange, ImplicitAPI):
|
|
972
1269
|
'postOnly': None,
|
973
1270
|
'side': self.safe_string(order, 'side'),
|
974
1271
|
'price': self.safe_number(order, 'limit_price'),
|
975
|
-
'stopPrice': self.safe_number(order, 'stop_price'),
|
976
1272
|
'triggerPrice': self.safe_number(order, 'stop_price'),
|
977
1273
|
'cost': None,
|
978
1274
|
'average': self.safe_number(order, 'filled_avg_price'),
|
@@ -984,8 +1280,8 @@ class alpaca(Exchange, ImplicitAPI):
|
|
984
1280
|
'info': order,
|
985
1281
|
}, market)
|
986
1282
|
|
987
|
-
def parse_order_status(self, status):
|
988
|
-
statuses = {
|
1283
|
+
def parse_order_status(self, status: Str):
|
1284
|
+
statuses: dict = {
|
989
1285
|
'pending_new': 'open',
|
990
1286
|
'accepted': 'open',
|
991
1287
|
'new': 'open',
|
@@ -995,13 +1291,62 @@ class alpaca(Exchange, ImplicitAPI):
|
|
995
1291
|
}
|
996
1292
|
return self.safe_string(statuses, status, status)
|
997
1293
|
|
998
|
-
def parse_time_in_force(self, timeInForce):
|
999
|
-
timeInForces = {
|
1294
|
+
def parse_time_in_force(self, timeInForce: Str):
|
1295
|
+
timeInForces: dict = {
|
1000
1296
|
'day': 'Day',
|
1001
1297
|
}
|
1002
1298
|
return self.safe_string(timeInForces, timeInForce, timeInForce)
|
1003
1299
|
|
1004
|
-
def
|
1300
|
+
async def fetch_my_trades(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}):
|
1301
|
+
"""
|
1302
|
+
fetch all trades made by the user
|
1303
|
+
|
1304
|
+
https://docs.alpaca.markets/reference/getaccountactivitiesbyactivitytype-1
|
1305
|
+
|
1306
|
+
:param str [symbol]: unified market symbol
|
1307
|
+
:param int [since]: the earliest time in ms to fetch trades for
|
1308
|
+
:param int [limit]: the maximum number of trade structures to retrieve
|
1309
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
1310
|
+
:param int [params.until]: the latest time in ms to fetch trades for
|
1311
|
+
:returns Trade[]: a list of `trade structures <https://docs.ccxt.com/#/?id=trade-structure>`
|
1312
|
+
"""
|
1313
|
+
await self.load_markets()
|
1314
|
+
market = None
|
1315
|
+
request: dict = {
|
1316
|
+
'activity_type': 'FILL',
|
1317
|
+
}
|
1318
|
+
if symbol is not None:
|
1319
|
+
market = self.market(symbol)
|
1320
|
+
if since is not None:
|
1321
|
+
request['after'] = since
|
1322
|
+
if limit is not None:
|
1323
|
+
request['page_size'] = limit
|
1324
|
+
request, params = self.handle_until_option('until', request, params)
|
1325
|
+
response = await self.traderPrivateGetV2AccountActivitiesActivityType(self.extend(request, params))
|
1326
|
+
#
|
1327
|
+
# [
|
1328
|
+
# {
|
1329
|
+
# "id": "20221228071929579::ca2aafd0-1270-4b56-b0a9-85423b4a07c8",
|
1330
|
+
# "activity_type": "FILL",
|
1331
|
+
# "transaction_time": "2022-12-28T12:19:29.579352Z",
|
1332
|
+
# "type": "fill",
|
1333
|
+
# "price": "67.31",
|
1334
|
+
# "qty": "0.07",
|
1335
|
+
# "side": "sell",
|
1336
|
+
# "symbol": "LTC/USD",
|
1337
|
+
# "leaves_qty": "0",
|
1338
|
+
# "order_id": "82eebcf7-6e66-4b7e-93f8-be0df0e4f12e",
|
1339
|
+
# "cum_qty": "0.07",
|
1340
|
+
# "order_status": "filled",
|
1341
|
+
# "swap_rate": "1"
|
1342
|
+
# },
|
1343
|
+
# ]
|
1344
|
+
#
|
1345
|
+
return self.parse_trades(response, market, since, limit)
|
1346
|
+
|
1347
|
+
def parse_trade(self, trade: dict, market: Market = None) -> Trade:
|
1348
|
+
#
|
1349
|
+
# fetchTrades
|
1005
1350
|
#
|
1006
1351
|
# {
|
1007
1352
|
# "t":"2022-06-14T05:00:00.027869Z",
|
@@ -1012,25 +1357,43 @@ class alpaca(Exchange, ImplicitAPI):
|
|
1012
1357
|
# "i":"355681339"
|
1013
1358
|
# }
|
1014
1359
|
#
|
1015
|
-
|
1360
|
+
# fetchMyTrades
|
1361
|
+
#
|
1362
|
+
# {
|
1363
|
+
# "id": "20221228071929579::ca2aafd0-1270-4b56-b0a9-85423b4a07c8",
|
1364
|
+
# "activity_type": "FILL",
|
1365
|
+
# "transaction_time": "2022-12-28T12:19:29.579352Z",
|
1366
|
+
# "type": "fill",
|
1367
|
+
# "price": "67.31",
|
1368
|
+
# "qty": "0.07",
|
1369
|
+
# "side": "sell",
|
1370
|
+
# "symbol": "LTC/USD",
|
1371
|
+
# "leaves_qty": "0",
|
1372
|
+
# "order_id": "82eebcf7-6e66-4b7e-93f8-be0df0e4f12e",
|
1373
|
+
# "cum_qty": "0.07",
|
1374
|
+
# "order_status": "filled",
|
1375
|
+
# "swap_rate": "1"
|
1376
|
+
# },
|
1377
|
+
#
|
1378
|
+
marketId = self.safe_string_2(trade, 'S', 'symbol')
|
1016
1379
|
symbol = self.safe_symbol(marketId, market)
|
1017
|
-
datetime = self.
|
1380
|
+
datetime = self.safe_string_2(trade, 't', 'transaction_time')
|
1018
1381
|
timestamp = self.parse8601(datetime)
|
1019
1382
|
alpacaSide = self.safe_string(trade, 'tks')
|
1020
|
-
side
|
1383
|
+
side = self.safe_string(trade, 'side')
|
1021
1384
|
if alpacaSide == 'B':
|
1022
1385
|
side = 'buy'
|
1023
1386
|
elif alpacaSide == 'S':
|
1024
1387
|
side = 'sell'
|
1025
|
-
priceString = self.
|
1026
|
-
amountString = self.
|
1388
|
+
priceString = self.safe_string_2(trade, 'p', 'price')
|
1389
|
+
amountString = self.safe_string_2(trade, 's', 'qty')
|
1027
1390
|
return self.safe_trade({
|
1028
1391
|
'info': trade,
|
1029
|
-
'id': self.
|
1392
|
+
'id': self.safe_string_2(trade, 'i', 'id'),
|
1030
1393
|
'timestamp': timestamp,
|
1031
1394
|
'datetime': self.iso8601(timestamp),
|
1032
1395
|
'symbol': symbol,
|
1033
|
-
'order':
|
1396
|
+
'order': self.safe_string(trade, 'order_id'),
|
1034
1397
|
'type': None,
|
1035
1398
|
'side': side,
|
1036
1399
|
'takerOrMaker': 'taker',
|
@@ -1040,11 +1403,312 @@ class alpaca(Exchange, ImplicitAPI):
|
|
1040
1403
|
'fee': None,
|
1041
1404
|
}, market)
|
1042
1405
|
|
1406
|
+
async def fetch_deposit_address(self, code: str, params={}) -> DepositAddress:
|
1407
|
+
"""
|
1408
|
+
fetch the deposit address for a currency associated with self account
|
1409
|
+
|
1410
|
+
https://docs.alpaca.markets/reference/listcryptofundingwallets
|
1411
|
+
|
1412
|
+
:param str code: unified currency code
|
1413
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
1414
|
+
:returns dict: an `address structure <https://docs.ccxt.com/#/?id=address-structure>`
|
1415
|
+
"""
|
1416
|
+
await self.load_markets()
|
1417
|
+
currency = self.currency(code)
|
1418
|
+
request: dict = {
|
1419
|
+
'asset': currency['id'],
|
1420
|
+
}
|
1421
|
+
response = await self.traderPrivateGetV2Wallets(self.extend(request, params))
|
1422
|
+
#
|
1423
|
+
# {
|
1424
|
+
# "asset_id": "4fa30c85-77b7-4cbc-92dd-7b7513640aad",
|
1425
|
+
# "address": "bc1q2fpskfnwem3uq9z8660e4z6pfv7aqfamysk75r",
|
1426
|
+
# "created_at": "2024-11-03T07:30:05.609976344Z"
|
1427
|
+
# }
|
1428
|
+
#
|
1429
|
+
return self.parse_deposit_address(response, currency)
|
1430
|
+
|
1431
|
+
def parse_deposit_address(self, depositAddress, currency: Currency = None) -> DepositAddress:
|
1432
|
+
#
|
1433
|
+
# {
|
1434
|
+
# "asset_id": "4fa30c85-77b7-4cbc-92dd-7b7513640aad",
|
1435
|
+
# "address": "bc1q2fpskfnwem3uq9z8660e4z6pfv7aqfamysk75r",
|
1436
|
+
# "created_at": "2024-11-03T07:30:05.609976344Z"
|
1437
|
+
# }
|
1438
|
+
#
|
1439
|
+
parsedCurrency = None
|
1440
|
+
if currency is not None:
|
1441
|
+
parsedCurrency = currency['id']
|
1442
|
+
return {
|
1443
|
+
'info': depositAddress,
|
1444
|
+
'currency': parsedCurrency,
|
1445
|
+
'network': None,
|
1446
|
+
'address': self.safe_string(depositAddress, 'address'),
|
1447
|
+
'tag': None,
|
1448
|
+
}
|
1449
|
+
|
1450
|
+
async def withdraw(self, code: str, amount: float, address: str, tag=None, params={}) -> Transaction:
|
1451
|
+
"""
|
1452
|
+
make a withdrawal
|
1453
|
+
|
1454
|
+
https://docs.alpaca.markets/reference/createcryptotransferforaccount
|
1455
|
+
|
1456
|
+
:param str code: unified currency code
|
1457
|
+
:param float amount: the amount to withdraw
|
1458
|
+
:param str address: the address to withdraw to
|
1459
|
+
:param str tag: a memo for the transaction
|
1460
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
1461
|
+
:returns dict: a `transaction structure <https://docs.ccxt.com/#/?id=transaction-structure>`
|
1462
|
+
"""
|
1463
|
+
tag, params = self.handle_withdraw_tag_and_params(tag, params)
|
1464
|
+
self.check_address(address)
|
1465
|
+
await self.load_markets()
|
1466
|
+
currency = self.currency(code)
|
1467
|
+
if tag:
|
1468
|
+
address = address + ':' + tag
|
1469
|
+
request: dict = {
|
1470
|
+
'asset': currency['id'],
|
1471
|
+
'address': address,
|
1472
|
+
'amount': self.number_to_string(amount),
|
1473
|
+
}
|
1474
|
+
response = await self.traderPrivatePostV2WalletsTransfers(self.extend(request, params))
|
1475
|
+
#
|
1476
|
+
# {
|
1477
|
+
# "id": "e27b70a6-5610-40d7-8468-a516a284b776",
|
1478
|
+
# "tx_hash": null,
|
1479
|
+
# "direction": "OUTGOING",
|
1480
|
+
# "amount": "20",
|
1481
|
+
# "usd_value": "19.99856",
|
1482
|
+
# "chain": "ETH",
|
1483
|
+
# "asset": "USDT",
|
1484
|
+
# "from_address": "0x123930E4dCA196E070d39B60c644C8Aae02f23",
|
1485
|
+
# "to_address": "0x1232c0925196e4dcf05945f67f690153190fbaab",
|
1486
|
+
# "status": "PROCESSING",
|
1487
|
+
# "created_at": "2024-11-07T02:39:01.775495Z",
|
1488
|
+
# "network_fee": "4",
|
1489
|
+
# "fees": "0.1"
|
1490
|
+
# }
|
1491
|
+
#
|
1492
|
+
return self.parse_transaction(response, currency)
|
1493
|
+
|
1494
|
+
async def fetch_transactions_helper(self, type, code, since, limit, params):
|
1495
|
+
await self.load_markets()
|
1496
|
+
currency = None
|
1497
|
+
if code is not None:
|
1498
|
+
currency = self.currency(code)
|
1499
|
+
response = await self.traderPrivateGetV2WalletsTransfers(params)
|
1500
|
+
#
|
1501
|
+
# {
|
1502
|
+
# "id": "e27b70a6-5610-40d7-8468-a516a284b776",
|
1503
|
+
# "tx_hash": null,
|
1504
|
+
# "direction": "OUTGOING",
|
1505
|
+
# "amount": "20",
|
1506
|
+
# "usd_value": "19.99856",
|
1507
|
+
# "chain": "ETH",
|
1508
|
+
# "asset": "USDT",
|
1509
|
+
# "from_address": "0x123930E4dCA196E070d39B60c644C8Aae02f23",
|
1510
|
+
# "to_address": "0x1232c0925196e4dcf05945f67f690153190fbaab",
|
1511
|
+
# "status": "PROCESSING",
|
1512
|
+
# "created_at": "2024-11-07T02:39:01.775495Z",
|
1513
|
+
# "network_fee": "4",
|
1514
|
+
# "fees": "0.1"
|
1515
|
+
# }
|
1516
|
+
#
|
1517
|
+
results = []
|
1518
|
+
for i in range(0, len(response)):
|
1519
|
+
entry = response[i]
|
1520
|
+
direction = self.safe_string(entry, 'direction')
|
1521
|
+
if direction == type:
|
1522
|
+
results.append(entry)
|
1523
|
+
elif type == 'BOTH':
|
1524
|
+
results.append(entry)
|
1525
|
+
return self.parse_transactions(results, currency, since, limit, params)
|
1526
|
+
|
1527
|
+
async def fetch_deposits_withdrawals(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Transaction]:
|
1528
|
+
"""
|
1529
|
+
fetch history of deposits and withdrawals
|
1530
|
+
|
1531
|
+
https://docs.alpaca.markets/reference/listcryptofundingtransfers
|
1532
|
+
|
1533
|
+
:param str [code]: unified currency code for the currency of the deposit/withdrawals, default is None
|
1534
|
+
:param int [since]: timestamp in ms of the earliest deposit/withdrawal, default is None
|
1535
|
+
:param int [limit]: max number of deposit/withdrawals to return, default is None
|
1536
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
1537
|
+
:returns dict: a list of `transaction structure <https://docs.ccxt.com/#/?id=transaction-structure>`
|
1538
|
+
"""
|
1539
|
+
return await self.fetch_transactions_helper('BOTH', code, since, limit, params)
|
1540
|
+
|
1541
|
+
async def fetch_deposits(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Transaction]:
|
1542
|
+
"""
|
1543
|
+
fetch all deposits made to an account
|
1544
|
+
|
1545
|
+
https://docs.alpaca.markets/reference/listcryptofundingtransfers
|
1546
|
+
|
1547
|
+
:param str [code]: unified currency code
|
1548
|
+
:param int [since]: the earliest time in ms to fetch deposits for
|
1549
|
+
:param int [limit]: the maximum number of deposit structures to retrieve
|
1550
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
1551
|
+
:returns dict[]: a list of `transaction structures <https://docs.ccxt.com/#/?id=transaction-structure>`
|
1552
|
+
"""
|
1553
|
+
return await self.fetch_transactions_helper('INCOMING', code, since, limit, params)
|
1554
|
+
|
1555
|
+
async def fetch_withdrawals(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Transaction]:
|
1556
|
+
"""
|
1557
|
+
fetch all withdrawals made from an account
|
1558
|
+
|
1559
|
+
https://docs.alpaca.markets/reference/listcryptofundingtransfers
|
1560
|
+
|
1561
|
+
:param str [code]: unified currency code
|
1562
|
+
:param int [since]: the earliest time in ms to fetch withdrawals for
|
1563
|
+
:param int [limit]: the maximum number of withdrawal structures to retrieve
|
1564
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
1565
|
+
:returns dict[]: a list of `transaction structures <https://docs.ccxt.com/#/?id=transaction-structure>`
|
1566
|
+
"""
|
1567
|
+
return await self.fetch_transactions_helper('OUTGOING', code, since, limit, params)
|
1568
|
+
|
1569
|
+
def parse_transaction(self, transaction: dict, currency: Currency = None) -> Transaction:
|
1570
|
+
#
|
1571
|
+
# {
|
1572
|
+
# "id": "e27b70a6-5610-40d7-8468-a516a284b776",
|
1573
|
+
# "tx_hash": null,
|
1574
|
+
# "direction": "OUTGOING",
|
1575
|
+
# "amount": "20",
|
1576
|
+
# "usd_value": "19.99856",
|
1577
|
+
# "chain": "ETH",
|
1578
|
+
# "asset": "USDT",
|
1579
|
+
# "from_address": "0x123930E4dCA196E070d39B60c644C8Aae02f23",
|
1580
|
+
# "to_address": "0x1232c0925196e4dcf05945f67f690153190fbaab",
|
1581
|
+
# "status": "PROCESSING",
|
1582
|
+
# "created_at": "2024-11-07T02:39:01.775495Z",
|
1583
|
+
# "network_fee": "4",
|
1584
|
+
# "fees": "0.1"
|
1585
|
+
# }
|
1586
|
+
#
|
1587
|
+
datetime = self.safe_string(transaction, 'created_at')
|
1588
|
+
currencyId = self.safe_string(transaction, 'asset')
|
1589
|
+
code = self.safe_currency_code(currencyId, currency)
|
1590
|
+
fees = self.safe_string(transaction, 'fees')
|
1591
|
+
networkFee = self.safe_string(transaction, 'network_fee')
|
1592
|
+
totalFee = Precise.string_add(fees, networkFee)
|
1593
|
+
fee = {
|
1594
|
+
'cost': self.parse_number(totalFee),
|
1595
|
+
'currency': code,
|
1596
|
+
}
|
1597
|
+
return {
|
1598
|
+
'info': transaction,
|
1599
|
+
'id': self.safe_string(transaction, 'id'),
|
1600
|
+
'txid': self.safe_string(transaction, 'tx_hash'),
|
1601
|
+
'timestamp': self.parse8601(datetime),
|
1602
|
+
'datetime': datetime,
|
1603
|
+
'network': self.safe_string(transaction, 'chain'),
|
1604
|
+
'address': self.safe_string(transaction, 'to_address'),
|
1605
|
+
'addressTo': self.safe_string(transaction, 'to_address'),
|
1606
|
+
'addressFrom': self.safe_string(transaction, 'from_address'),
|
1607
|
+
'tag': None,
|
1608
|
+
'tagTo': None,
|
1609
|
+
'tagFrom': None,
|
1610
|
+
'type': self.parse_transaction_type(self.safe_string(transaction, 'direction')),
|
1611
|
+
'amount': self.safe_number(transaction, 'amount'),
|
1612
|
+
'currency': code,
|
1613
|
+
'status': self.parse_transaction_status(self.safe_string(transaction, 'status')),
|
1614
|
+
'updated': None,
|
1615
|
+
'fee': fee,
|
1616
|
+
'comment': None,
|
1617
|
+
'internal': None,
|
1618
|
+
}
|
1619
|
+
|
1620
|
+
def parse_transaction_status(self, status: Str):
|
1621
|
+
statuses: dict = {
|
1622
|
+
'PROCESSING': 'pending',
|
1623
|
+
'FAILED': 'failed',
|
1624
|
+
'COMPLETE': 'ok',
|
1625
|
+
}
|
1626
|
+
return self.safe_string(statuses, status, status)
|
1627
|
+
|
1628
|
+
def parse_transaction_type(self, type):
|
1629
|
+
types: dict = {
|
1630
|
+
'INCOMING': 'deposit',
|
1631
|
+
'OUTGOING': 'withdrawal',
|
1632
|
+
}
|
1633
|
+
return self.safe_string(types, type, type)
|
1634
|
+
|
1635
|
+
async def fetch_balance(self, params={}) -> Balances:
|
1636
|
+
"""
|
1637
|
+
query for balance and get the amount of funds available for trading or funds locked in orders
|
1638
|
+
|
1639
|
+
https://docs.alpaca.markets/reference/getaccount-1
|
1640
|
+
|
1641
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
1642
|
+
:returns dict: a `balance structure <https://docs.ccxt.com/#/?id=balance-structure>`
|
1643
|
+
"""
|
1644
|
+
await self.load_markets()
|
1645
|
+
response = await self.traderPrivateGetV2Account(params)
|
1646
|
+
#
|
1647
|
+
# {
|
1648
|
+
# "id": "43a01bde-4eb1-64fssc26adb5",
|
1649
|
+
# "admin_configurations": {
|
1650
|
+
# "allow_instant_ach": True,
|
1651
|
+
# "max_margin_multiplier": "4"
|
1652
|
+
# },
|
1653
|
+
# "user_configurations": {
|
1654
|
+
# "fractional_trading": True,
|
1655
|
+
# "max_margin_multiplier": "4"
|
1656
|
+
# },
|
1657
|
+
# "account_number": "744873727",
|
1658
|
+
# "status": "ACTIVE",
|
1659
|
+
# "crypto_status": "ACTIVE",
|
1660
|
+
# "currency": "USD",
|
1661
|
+
# "buying_power": "5.92",
|
1662
|
+
# "regt_buying_power": "5.92",
|
1663
|
+
# "daytrading_buying_power": "0",
|
1664
|
+
# "effective_buying_power": "5.92",
|
1665
|
+
# "non_marginable_buying_power": "5.92",
|
1666
|
+
# "bod_dtbp": "0",
|
1667
|
+
# "cash": "5.92",
|
1668
|
+
# "accrued_fees": "0",
|
1669
|
+
# "portfolio_value": "48.6",
|
1670
|
+
# "pattern_day_trader": False,
|
1671
|
+
# "trading_blocked": False,
|
1672
|
+
# "transfers_blocked": False,
|
1673
|
+
# "account_blocked": False,
|
1674
|
+
# "created_at": "2022-06-13T14:59:18.318096Z",
|
1675
|
+
# "trade_suspended_by_user": False,
|
1676
|
+
# "multiplier": "1",
|
1677
|
+
# "shorting_enabled": False,
|
1678
|
+
# "equity": "48.6",
|
1679
|
+
# "last_equity": "48.8014266",
|
1680
|
+
# "long_market_value": "42.68",
|
1681
|
+
# "short_market_value": "0",
|
1682
|
+
# "position_market_value": "42.68",
|
1683
|
+
# "initial_margin": "0",
|
1684
|
+
# "maintenance_margin": "0",
|
1685
|
+
# "last_maintenance_margin": "0",
|
1686
|
+
# "sma": "5.92",
|
1687
|
+
# "daytrade_count": 0,
|
1688
|
+
# "balance_asof": "2024-12-10",
|
1689
|
+
# "crypto_tier": 1,
|
1690
|
+
# "intraday_adjustments": "0",
|
1691
|
+
# "pending_reg_taf_fees": "0"
|
1692
|
+
# }
|
1693
|
+
#
|
1694
|
+
return self.parse_balance(response)
|
1695
|
+
|
1696
|
+
def parse_balance(self, response) -> Balances:
|
1697
|
+
result: dict = {'info': response}
|
1698
|
+
account = self.account()
|
1699
|
+
currencyId = self.safe_string(response, 'currency')
|
1700
|
+
code = self.safe_currency_code(currencyId)
|
1701
|
+
account['free'] = self.safe_string(response, 'cash')
|
1702
|
+
account['total'] = self.safe_string(response, 'equity')
|
1703
|
+
result[code] = account
|
1704
|
+
return self.safe_balance(result)
|
1705
|
+
|
1043
1706
|
def sign(self, path, api='public', method='GET', params={}, headers=None, body=None):
|
1044
1707
|
endpoint = '/' + self.implode_params(path, params)
|
1045
1708
|
url = self.implode_hostname(self.urls['api'][api[0]])
|
1046
1709
|
headers = headers if (headers is not None) else {}
|
1047
1710
|
if api[1] == 'private':
|
1711
|
+
self.check_required_credentials()
|
1048
1712
|
headers['APCA-API-KEY-ID'] = self.apiKey
|
1049
1713
|
headers['APCA-API-SECRET-KEY'] = self.secret
|
1050
1714
|
query = self.omit(params, self.extract_params(path))
|
@@ -1057,7 +1721,7 @@ class alpaca(Exchange, ImplicitAPI):
|
|
1057
1721
|
url = url + endpoint
|
1058
1722
|
return {'url': url, 'method': method, 'body': body, 'headers': headers}
|
1059
1723
|
|
1060
|
-
def handle_errors(self, code, reason, url, method, headers, body, response, requestHeaders, requestBody):
|
1724
|
+
def handle_errors(self, code: int, reason: str, url: str, method: str, headers: dict, body: str, response, requestHeaders, requestBody):
|
1061
1725
|
if response is None:
|
1062
1726
|
return None # default error handler
|
1063
1727
|
# {
|