ccxt-ir 4.3.46.0.2__py2.py3-none-any.whl → 4.5.0__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 +39 -35
- ccxt/abantether.py +9 -9
- ccxt/abstract/alpaca.py +4 -0
- ccxt/abstract/apex.py +31 -0
- ccxt/abstract/bigone.py +1 -1
- ccxt/abstract/binance.py +106 -48
- ccxt/abstract/binancecoinm.py +106 -48
- ccxt/abstract/binanceus.py +141 -83
- ccxt/abstract/binanceusdm.py +106 -48
- ccxt/abstract/bingx.py +50 -1
- ccxt/abstract/bitbank.py +5 -0
- ccxt/abstract/bitfinex.py +136 -65
- ccxt/abstract/bitflyer.py +1 -0
- ccxt/abstract/bitget.py +67 -0
- ccxt/abstract/bitmart.py +19 -1
- ccxt/abstract/bitopro.py +1 -0
- ccxt/abstract/bitrue.py +68 -68
- ccxt/abstract/bitstamp.py +1 -0
- ccxt/abstract/blofin.py +30 -0
- ccxt/abstract/btcbox.py +2 -0
- ccxt/abstract/bybit.py +28 -13
- ccxt/abstract/cex.py +28 -29
- ccxt/abstract/coinbaseexchange.py +1 -0
- ccxt/abstract/coinbaseinternational.py +1 -1
- ccxt/abstract/cryptocom.py +16 -0
- ccxt/abstract/cryptomus.py +20 -0
- ccxt/abstract/defx.py +69 -0
- ccxt/abstract/deribit.py +1 -0
- ccxt/abstract/derive.py +117 -0
- ccxt/abstract/digifinex.py +1 -0
- ccxt/abstract/ellipx.py +25 -0
- ccxt/abstract/foxbit.py +26 -0
- ccxt/abstract/gate.py +19 -0
- ccxt/abstract/gateio.py +19 -0
- ccxt/abstract/gemini.py +1 -0
- ccxt/abstract/hibachi.py +26 -0
- ccxt/abstract/hyperliquid.py +1 -1
- ccxt/abstract/independentreserve.py +6 -0
- ccxt/abstract/kraken.py +1 -0
- ccxt/abstract/krakenfutures.py +4 -0
- ccxt/abstract/kucoin.py +10 -0
- ccxt/abstract/kucoinfutures.py +18 -0
- ccxt/abstract/lbank.py +2 -1
- ccxt/abstract/luno.py +1 -0
- ccxt/abstract/mexc.py +2 -0
- ccxt/abstract/modetrade.py +119 -0
- ccxt/abstract/myokx.py +349 -0
- ccxt/abstract/oceanex.py +5 -0
- ccxt/abstract/okx.py +25 -0
- ccxt/abstract/okxus.py +349 -0
- ccxt/abstract/onetrading.py +0 -12
- ccxt/abstract/paradex.py +23 -0
- ccxt/abstract/phemex.py +2 -0
- ccxt/abstract/poloniex.py +36 -0
- ccxt/abstract/tradeogre.py +3 -1
- ccxt/abstract/upbit.py +51 -34
- ccxt/abstract/whitebit.py +16 -0
- ccxt/abstract/woo.py +64 -6
- ccxt/abstract/xt.py +10 -5
- ccxt/afratether.py +7 -7
- ccxt/alpaca.py +828 -51
- ccxt/apex.py +1875 -0
- ccxt/arzinja.py +7 -7
- ccxt/arzplus.py +9 -9
- ccxt/ascendex.py +501 -306
- ccxt/async_support/__init__.py +39 -35
- ccxt/async_support/abantether.py +10 -10
- ccxt/async_support/afratether.py +9 -9
- ccxt/async_support/alpaca.py +828 -51
- ccxt/async_support/apex.py +1875 -0
- ccxt/async_support/arzinja.py +10 -10
- ccxt/async_support/arzplus.py +12 -12
- ccxt/async_support/ascendex.py +502 -306
- ccxt/async_support/base/exchange.py +303 -89
- ccxt/async_support/base/ws/cache.py +9 -3
- ccxt/async_support/base/ws/client.py +173 -38
- ccxt/async_support/base/ws/future.py +25 -37
- ccxt/async_support/bequant.py +5 -3
- ccxt/async_support/bigone.py +279 -144
- ccxt/async_support/binance.py +2347 -1158
- ccxt/async_support/binancecoinm.py +9 -3
- ccxt/async_support/binanceus.py +17 -3
- ccxt/async_support/binanceusdm.py +9 -4
- ccxt/async_support/bingx.py +2962 -920
- ccxt/async_support/bit2c.py +147 -27
- ccxt/async_support/bitbank.py +151 -23
- ccxt/async_support/bitbns.py +104 -30
- ccxt/async_support/bitfinex.py +3291 -1113
- ccxt/async_support/bitflyer.py +202 -27
- ccxt/async_support/bitget.py +3683 -1538
- ccxt/async_support/bithumb.py +195 -38
- ccxt/async_support/bitimen.py +12 -12
- ccxt/async_support/bitir.py +38 -38
- ccxt/async_support/bitmart.py +1288 -350
- ccxt/async_support/bitmex.py +260 -75
- ccxt/async_support/bitopro.py +262 -62
- ccxt/async_support/bitpin.py +17 -16
- ccxt/async_support/bitrue.py +459 -290
- ccxt/async_support/bitso.py +199 -54
- ccxt/async_support/bitstamp.py +230 -96
- ccxt/async_support/bitteam.py +167 -25
- ccxt/async_support/{huobijp.py → bittrade.py} +158 -30
- ccxt/async_support/bitvavo.py +213 -49
- ccxt/async_support/blockchaincom.py +160 -46
- ccxt/async_support/blofin.py +502 -120
- ccxt/async_support/btcalpha.py +169 -31
- ccxt/async_support/btcbox.py +292 -23
- ccxt/async_support/btcmarkets.py +211 -58
- ccxt/async_support/btcturk.py +161 -38
- ccxt/async_support/bybit.py +1775 -1030
- ccxt/async_support/cex.py +1440 -1303
- ccxt/async_support/coinbase.py +724 -212
- ccxt/async_support/coinbaseadvanced.py +2 -1
- ccxt/async_support/coinbaseexchange.py +388 -89
- ccxt/async_support/coinbaseinternational.py +412 -57
- ccxt/async_support/coincatch.py +177 -78
- ccxt/async_support/coincheck.py +135 -19
- ccxt/async_support/coinex.py +606 -232
- ccxt/async_support/coinmate.py +189 -63
- ccxt/async_support/coinmetro.py +195 -54
- ccxt/async_support/coinone.py +158 -51
- ccxt/async_support/coinsph.py +336 -61
- ccxt/async_support/coinspot.py +151 -52
- ccxt/async_support/cryptocom.py +661 -111
- ccxt/async_support/cryptomus.py +1137 -0
- ccxt/async_support/defx.py +2071 -0
- ccxt/async_support/delta.py +299 -99
- ccxt/async_support/deribit.py +348 -126
- ccxt/async_support/derive.py +2572 -0
- ccxt/async_support/digifinex.py +430 -214
- ccxt/async_support/ellipx.py +2029 -0
- ccxt/async_support/eterex.py +10 -10
- ccxt/async_support/excoino.py +31 -31
- ccxt/async_support/exir.py +14 -14
- ccxt/async_support/exmo.py +344 -131
- ccxt/async_support/exnovin.py +10 -10
- ccxt/async_support/farhadexchange.py +12 -12
- ccxt/async_support/fmfwio.py +2 -1
- ccxt/async_support/foxbit.py +1935 -0
- ccxt/async_support/gate.py +1351 -529
- ccxt/async_support/gateio.py +2 -1
- ccxt/async_support/gemini.py +144 -39
- ccxt/async_support/hashkey.py +152 -109
- ccxt/async_support/hibachi.py +2080 -0
- ccxt/async_support/hitbtc.py +395 -167
- ccxt/async_support/hitobit.py +12 -12
- ccxt/async_support/hollaex.py +307 -119
- ccxt/async_support/htx.py +851 -383
- ccxt/async_support/huobi.py +2 -1
- ccxt/async_support/hyperliquid.py +1848 -536
- ccxt/async_support/independentreserve.py +288 -15
- ccxt/async_support/indodax.py +190 -33
- ccxt/async_support/jibitex.py +12 -12
- ccxt/async_support/kraken.py +795 -351
- ccxt/async_support/krakenfutures.py +214 -62
- ccxt/async_support/kucoin.py +715 -396
- ccxt/async_support/kucoinfutures.py +652 -89
- ccxt/async_support/latoken.py +217 -113
- ccxt/async_support/lbank.py +425 -97
- ccxt/async_support/luno.py +382 -35
- ccxt/async_support/mercado.py +113 -6
- ccxt/async_support/mexc.py +874 -437
- ccxt/async_support/modetrade.py +2818 -0
- ccxt/async_support/myokx.py +54 -0
- ccxt/async_support/ndax.py +221 -64
- ccxt/async_support/nobitex.py +31 -37
- ccxt/async_support/novadax.py +190 -34
- ccxt/async_support/oceanex.py +217 -28
- ccxt/async_support/okcoin.py +253 -145
- ccxt/async_support/okexchange.py +11 -11
- ccxt/async_support/okx.py +1088 -351
- ccxt/async_support/okxus.py +54 -0
- ccxt/async_support/ompfinex.py +25 -24
- ccxt/async_support/onetrading.py +213 -392
- ccxt/async_support/oxfun.py +245 -166
- ccxt/async_support/p2b.py +151 -29
- ccxt/async_support/paradex.py +562 -49
- ccxt/async_support/paymium.py +82 -19
- ccxt/async_support/phemex.py +713 -172
- ccxt/async_support/poloniex.py +1602 -283
- ccxt/async_support/probit.py +224 -95
- ccxt/async_support/ramzinex.py +30 -27
- ccxt/async_support/sarmayex.py +9 -9
- ccxt/async_support/sarrafex.py +13 -13
- ccxt/async_support/tabdeal.py +14 -13
- ccxt/async_support/tetherland.py +9 -9
- ccxt/async_support/timex.py +210 -51
- ccxt/async_support/tokocrypto.py +167 -47
- ccxt/async_support/tradeogre.py +266 -31
- ccxt/async_support/twox.py +9 -9
- ccxt/async_support/ubitex.py +12 -12
- ccxt/async_support/upbit.py +568 -165
- ccxt/async_support/vertex.py +160 -32
- ccxt/async_support/wallex.py +12 -12
- ccxt/async_support/wavesexchange.py +165 -30
- ccxt/async_support/whitebit.py +975 -127
- ccxt/async_support/woo.py +1918 -1016
- ccxt/async_support/woofipro.py +433 -141
- ccxt/async_support/xt.py +649 -193
- ccxt/async_support/yobit.py +195 -70
- ccxt/async_support/zaif.py +91 -15
- ccxt/async_support/zonda.py +151 -36
- ccxt/base/decimal_to_precision.py +14 -10
- ccxt/base/errors.py +49 -18
- ccxt/base/exchange.py +1556 -450
- ccxt/base/precise.py +10 -0
- ccxt/base/types.py +114 -6
- ccxt/bequant.py +5 -3
- ccxt/bigone.py +279 -144
- ccxt/binance.py +2347 -1158
- ccxt/binancecoinm.py +9 -3
- ccxt/binanceus.py +17 -3
- ccxt/binanceusdm.py +9 -4
- ccxt/bingx.py +2962 -920
- ccxt/bit2c.py +147 -27
- ccxt/bitbank.py +151 -23
- ccxt/bitbns.py +104 -30
- ccxt/bitfinex.py +3290 -1113
- ccxt/bitflyer.py +202 -27
- ccxt/bitget.py +3683 -1538
- ccxt/bithumb.py +194 -38
- ccxt/bitimen.py +9 -9
- ccxt/bitir.py +35 -35
- ccxt/bitmart.py +1288 -350
- ccxt/bitmex.py +260 -75
- ccxt/bitopro.py +262 -62
- ccxt/bitpin.py +15 -14
- ccxt/bitrue.py +459 -290
- ccxt/bitso.py +199 -54
- ccxt/bitstamp.py +230 -96
- ccxt/bitteam.py +167 -25
- ccxt/{huobijp.py → bittrade.py} +158 -30
- ccxt/bitvavo.py +213 -49
- ccxt/blockchaincom.py +160 -46
- ccxt/blofin.py +502 -120
- ccxt/btcalpha.py +169 -31
- ccxt/btcbox.py +291 -23
- ccxt/btcmarkets.py +211 -58
- ccxt/btcturk.py +161 -38
- ccxt/bybit.py +1775 -1030
- ccxt/cex.py +1439 -1303
- ccxt/coinbase.py +724 -212
- ccxt/coinbaseadvanced.py +2 -1
- ccxt/coinbaseexchange.py +388 -89
- ccxt/coinbaseinternational.py +412 -57
- ccxt/coincatch.py +177 -78
- ccxt/coincheck.py +135 -19
- ccxt/coinex.py +606 -232
- ccxt/coinmate.py +189 -63
- ccxt/coinmetro.py +194 -54
- ccxt/coinone.py +158 -51
- ccxt/coinsph.py +336 -61
- ccxt/coinspot.py +151 -52
- ccxt/cryptocom.py +661 -111
- ccxt/cryptomus.py +1137 -0
- ccxt/defx.py +2070 -0
- ccxt/delta.py +299 -99
- ccxt/deribit.py +348 -126
- ccxt/derive.py +2571 -0
- ccxt/digifinex.py +430 -214
- ccxt/ellipx.py +2029 -0
- ccxt/eterex.py +7 -7
- ccxt/excoino.py +29 -29
- ccxt/exir.py +11 -11
- ccxt/exmo.py +343 -131
- ccxt/exnovin.py +8 -8
- ccxt/farhadexchange.py +10 -10
- ccxt/fmfwio.py +2 -1
- ccxt/foxbit.py +1935 -0
- ccxt/gate.py +1351 -529
- ccxt/gateio.py +2 -1
- ccxt/gemini.py +144 -39
- ccxt/hashkey.py +152 -109
- ccxt/hibachi.py +2079 -0
- ccxt/hitbtc.py +395 -167
- ccxt/hitobit.py +9 -9
- ccxt/hollaex.py +307 -119
- ccxt/htx.py +851 -383
- ccxt/huobi.py +2 -1
- ccxt/hyperliquid.py +1848 -536
- ccxt/independentreserve.py +287 -15
- ccxt/indodax.py +190 -33
- ccxt/jibitex.py +9 -9
- ccxt/kraken.py +794 -351
- ccxt/krakenfutures.py +214 -62
- ccxt/kucoin.py +715 -396
- ccxt/kucoinfutures.py +652 -89
- ccxt/latoken.py +217 -113
- ccxt/lbank.py +425 -97
- ccxt/luno.py +382 -35
- ccxt/mercado.py +113 -6
- ccxt/mexc.py +873 -437
- ccxt/modetrade.py +2818 -0
- ccxt/myokx.py +54 -0
- ccxt/ndax.py +221 -64
- ccxt/nobitex.py +29 -35
- ccxt/novadax.py +190 -34
- ccxt/oceanex.py +217 -28
- ccxt/okcoin.py +253 -145
- ccxt/okexchange.py +9 -9
- ccxt/okx.py +1088 -351
- ccxt/okxus.py +54 -0
- ccxt/ompfinex.py +22 -21
- ccxt/onetrading.py +213 -392
- ccxt/oxfun.py +245 -166
- ccxt/p2b.py +151 -29
- ccxt/paradex.py +562 -49
- ccxt/paymium.py +82 -19
- ccxt/phemex.py +712 -172
- ccxt/poloniex.py +1601 -283
- ccxt/pro/__init__.py +76 -17
- ccxt/pro/alpaca.py +21 -6
- ccxt/pro/apex.py +984 -0
- ccxt/pro/ascendex.py +58 -10
- ccxt/pro/bequant.py +6 -1
- ccxt/pro/binance.py +728 -156
- ccxt/pro/binancecoinm.py +6 -2
- ccxt/pro/binanceus.py +8 -4
- ccxt/pro/binanceusdm.py +7 -2
- ccxt/pro/bingx.py +333 -142
- ccxt/pro/bitfinex.py +727 -262
- ccxt/pro/bitget.py +570 -79
- ccxt/pro/bithumb.py +20 -6
- ccxt/pro/bitmart.py +216 -87
- ccxt/pro/bitmex.py +47 -9
- ccxt/pro/bitopro.py +26 -14
- ccxt/pro/bitrue.py +22 -22
- ccxt/pro/bitstamp.py +54 -21
- ccxt/pro/{huobijp.py → bittrade.py} +7 -6
- ccxt/pro/bitvavo.py +191 -67
- ccxt/pro/blockchaincom.py +21 -8
- ccxt/pro/blofin.py +9 -1
- ccxt/pro/bybit.py +632 -245
- ccxt/pro/cex.py +59 -24
- ccxt/pro/coinbase.py +102 -73
- ccxt/pro/coinbaseadvanced.py +2 -1
- ccxt/pro/coinbaseexchange.py +8 -8
- ccxt/pro/coinbaseinternational.py +181 -25
- ccxt/pro/coincatch.py +6 -7
- ccxt/pro/coincheck.py +11 -6
- ccxt/pro/coinex.py +967 -665
- ccxt/pro/coinone.py +16 -9
- ccxt/pro/cryptocom.py +448 -45
- ccxt/pro/defx.py +831 -0
- ccxt/pro/deribit.py +150 -14
- ccxt/pro/derive.py +704 -0
- ccxt/pro/exmo.py +239 -6
- ccxt/pro/gate.py +623 -65
- ccxt/pro/gateio.py +2 -1
- ccxt/pro/gemini.py +27 -11
- ccxt/pro/hashkey.py +2 -2
- ccxt/pro/hitbtc.py +196 -91
- ccxt/pro/hollaex.py +23 -7
- ccxt/pro/htx.py +51 -14
- ccxt/pro/huobi.py +2 -1
- ccxt/pro/hyperliquid.py +591 -27
- ccxt/pro/independentreserve.py +9 -6
- ccxt/pro/kraken.py +640 -320
- ccxt/pro/krakenfutures.py +62 -35
- ccxt/pro/kucoin.py +267 -46
- ccxt/pro/kucoinfutures.py +165 -21
- ccxt/pro/lbank.py +102 -21
- ccxt/pro/luno.py +12 -8
- ccxt/pro/mexc.py +877 -111
- ccxt/pro/modetrade.py +1271 -0
- ccxt/pro/myokx.py +38 -0
- ccxt/pro/ndax.py +15 -2
- ccxt/pro/okcoin.py +23 -4
- ccxt/pro/okx.py +573 -98
- ccxt/pro/okxus.py +38 -0
- ccxt/pro/onetrading.py +30 -13
- ccxt/pro/oxfun.py +131 -27
- ccxt/pro/p2b.py +88 -22
- ccxt/pro/paradex.py +3 -3
- ccxt/pro/phemex.py +75 -21
- ccxt/pro/poloniex.py +124 -41
- ccxt/pro/probit.py +87 -80
- ccxt/pro/tradeogre.py +272 -0
- ccxt/pro/upbit.py +152 -12
- ccxt/pro/vertex.py +8 -3
- ccxt/pro/whitebit.py +58 -5
- ccxt/pro/woo.py +228 -37
- ccxt/pro/woofipro.py +106 -18
- ccxt/pro/xt.py +111 -5
- ccxt/probit.py +224 -95
- ccxt/protobuf/__init__.py +0 -0
- ccxt/protobuf/mexc/PrivateAccountV3Api_pb2.py +37 -0
- ccxt/protobuf/mexc/PrivateDealsV3Api_pb2.py +37 -0
- ccxt/protobuf/mexc/PrivateOrdersV3Api_pb2.py +37 -0
- ccxt/protobuf/mexc/PublicAggreBookTickerV3Api_pb2.py +37 -0
- ccxt/protobuf/mexc/PublicAggreDealsV3Api_pb2.py +39 -0
- ccxt/protobuf/mexc/PublicAggreDepthsV3Api_pb2.py +39 -0
- ccxt/protobuf/mexc/PublicBookTickerBatchV3Api_pb2.py +38 -0
- ccxt/protobuf/mexc/PublicBookTickerV3Api_pb2.py +37 -0
- ccxt/protobuf/mexc/PublicDealsV3Api_pb2.py +39 -0
- ccxt/protobuf/mexc/PublicIncreaseDepthsBatchV3Api_pb2.py +38 -0
- ccxt/protobuf/mexc/PublicIncreaseDepthsV3Api_pb2.py +39 -0
- ccxt/protobuf/mexc/PublicLimitDepthsV3Api_pb2.py +39 -0
- ccxt/protobuf/mexc/PublicMiniTickerV3Api_pb2.py +37 -0
- ccxt/protobuf/mexc/PublicMiniTickersV3Api_pb2.py +38 -0
- ccxt/protobuf/mexc/PublicSpotKlineV3Api_pb2.py +37 -0
- ccxt/protobuf/mexc/PushDataV3ApiWrapper_pb2.py +52 -0
- ccxt/protobuf/mexc/__init__.py +0 -0
- ccxt/ramzinex.py +28 -25
- ccxt/sarmayex.py +7 -7
- ccxt/sarrafex.py +10 -10
- ccxt/static_dependencies/__init__.py +1 -1
- ccxt/static_dependencies/lark/py.typed +0 -0
- ccxt/static_dependencies/marshmallow/py.typed +0 -0
- ccxt/static_dependencies/marshmallow_dataclass/py.typed +0 -0
- ccxt/static_dependencies/marshmallow_oneofschema/py.typed +0 -0
- ccxt/tabdeal.py +12 -11
- ccxt/test/tests_async.py +261 -57
- ccxt/test/tests_helpers.py +1 -3
- ccxt/test/tests_init.py +4 -3
- ccxt/test/tests_sync.py +261 -57
- ccxt/tetherland.py +7 -7
- ccxt/timex.py +210 -51
- ccxt/tokocrypto.py +167 -47
- ccxt/tradeogre.py +266 -31
- ccxt/twox.py +7 -7
- ccxt/ubitex.py +9 -9
- ccxt/upbit.py +568 -165
- ccxt/vertex.py +160 -32
- ccxt/wallex.py +9 -9
- ccxt/wavesexchange.py +165 -30
- ccxt/whitebit.py +975 -127
- ccxt/woo.py +1917 -1016
- ccxt/woofipro.py +432 -141
- ccxt/xt.py +649 -193
- ccxt/yobit.py +194 -70
- ccxt/zaif.py +91 -15
- ccxt/zonda.py +151 -36
- {ccxt_ir-4.3.46.0.2.dist-info → ccxt_ir-4.5.0.dist-info}/METADATA +225 -73
- ccxt_ir-4.5.0.dist-info/RECORD +743 -0
- {ccxt_ir-4.3.46.0.2.dist-info → ccxt_ir-4.5.0.dist-info}/WHEEL +1 -1
- ccxt/abstract/ace.py +0 -15
- ccxt/abstract/bitbay.py +0 -53
- ccxt/abstract/bitcoincom.py +0 -115
- ccxt/abstract/bitfinex2.py +0 -139
- ccxt/abstract/bitpanda.py +0 -35
- ccxt/abstract/bl3p.py +0 -19
- ccxt/abstract/coinlist.py +0 -54
- ccxt/abstract/currencycom.py +0 -68
- ccxt/abstract/hitbtc3.py +0 -115
- ccxt/abstract/idex.py +0 -26
- ccxt/abstract/kuna.py +0 -182
- ccxt/abstract/lykke.py +0 -29
- ccxt/abstract/poloniexfutures.py +0 -48
- ccxt/abstract/wazirx.py +0 -30
- ccxt/ace.py +0 -1012
- ccxt/async_support/ace.py +0 -1012
- ccxt/async_support/base/ws/aiohttp_client.py +0 -125
- ccxt/async_support/base/ws/fast_client.py +0 -96
- ccxt/async_support/bitbay.py +0 -17
- ccxt/async_support/bitcoincom.py +0 -17
- ccxt/async_support/bitfinex2.py +0 -3552
- ccxt/async_support/bitpanda.py +0 -16
- ccxt/async_support/bl3p.py +0 -485
- ccxt/async_support/coinlist.py +0 -2243
- ccxt/async_support/currencycom.py +0 -1950
- ccxt/async_support/hitbtc3.py +0 -16
- ccxt/async_support/idex.py +0 -1766
- ccxt/async_support/kuna.py +0 -1841
- ccxt/async_support/lykke.py +0 -1270
- ccxt/async_support/poloniexfutures.py +0 -1717
- ccxt/async_support/wazirx.py +0 -1224
- ccxt/bitbay.py +0 -17
- ccxt/bitcoincom.py +0 -17
- ccxt/bitfinex2.py +0 -3552
- ccxt/bitpanda.py +0 -16
- ccxt/bl3p.py +0 -485
- ccxt/coinlist.py +0 -2243
- ccxt/currencycom.py +0 -1950
- ccxt/hitbtc3.py +0 -16
- ccxt/idex.py +0 -1766
- ccxt/kuna.py +0 -1841
- ccxt/lykke.py +0 -1270
- ccxt/poloniexfutures.py +0 -1717
- ccxt/pro/bitcoincom.py +0 -34
- ccxt/pro/bitfinex2.py +0 -1083
- ccxt/pro/bitpanda.py +0 -15
- ccxt/pro/currencycom.py +0 -536
- ccxt/pro/idex.py +0 -672
- ccxt/pro/poloniexfutures.py +0 -990
- ccxt/pro/wazirx.py +0 -749
- ccxt/test/base/__init__.py +0 -29
- 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 -109
- 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 -31
- 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_liquidation.py +0 -50
- 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 -193
- ccxt/test/base/test_number.py +0 -411
- ccxt/test/base/test_ohlcv.py +0 -33
- 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 -69
- ccxt/test/base/test_position.py +0 -60
- ccxt/test/base/test_shared_methods.py +0 -353
- ccxt/test/base/test_status.py +0 -24
- ccxt/test/base/test_throttle.py +0 -126
- ccxt/test/base/test_ticker.py +0 -92
- 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/test/test_async.py +0 -1649
- ccxt/test/test_sync.py +0 -1648
- ccxt/wazirx.py +0 -1224
- ccxt_ir-4.3.46.0.2.dist-info/RECORD +0 -772
- /ccxt/abstract/{huobijp.py → bittrade.py} +0 -0
- {ccxt_ir-4.3.46.0.2.dist-info → ccxt_ir-4.5.0.dist-info/licenses}/LICENSE.txt +0 -0
- {ccxt_ir-4.3.46.0.2.dist-info → ccxt_ir-4.5.0.dist-info}/top_level.txt +0 -0
ccxt/alpaca.py
CHANGED
|
@@ -5,10 +5,11 @@
|
|
|
5
5
|
|
|
6
6
|
from ccxt.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 Any, 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,11 +17,12 @@ 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):
|
|
22
24
|
|
|
23
|
-
def describe(self):
|
|
25
|
+
def describe(self) -> Any:
|
|
24
26
|
return self.deep_extend(super(alpaca, self).describe(), {
|
|
25
27
|
'id': 'alpaca',
|
|
26
28
|
'name': 'Alpaca',
|
|
@@ -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',
|
|
@@ -54,29 +56,77 @@ class alpaca(Exchange, ImplicitAPI):
|
|
|
54
56
|
'swap': False,
|
|
55
57
|
'future': False,
|
|
56
58
|
'option': False,
|
|
59
|
+
'addMargin': False,
|
|
60
|
+
'borrowCrossMargin': False,
|
|
61
|
+
'borrowIsolatedMargin': False,
|
|
62
|
+
'borrowMargin': False,
|
|
57
63
|
'cancelAllOrders': True,
|
|
58
64
|
'cancelOrder': True,
|
|
59
65
|
'closeAllPositions': False,
|
|
60
66
|
'closePosition': False,
|
|
67
|
+
'createMarketBuyOrder': True,
|
|
68
|
+
'createMarketBuyOrderWithCost': True,
|
|
69
|
+
'createMarketOrderWithCost': True,
|
|
61
70
|
'createOrder': True,
|
|
62
|
-
'
|
|
71
|
+
'createOrderWithTakeProfitAndStopLoss': False,
|
|
72
|
+
'createOrderWithTakeProfitAndStopLossWs': False,
|
|
73
|
+
'createReduceOnlyOrder': False,
|
|
74
|
+
'createStopOrder': True,
|
|
75
|
+
'createTriggerOrder': True,
|
|
76
|
+
'editOrder': True,
|
|
77
|
+
'fetchBalance': True,
|
|
63
78
|
'fetchBidsAsks': False,
|
|
79
|
+
'fetchBorrowInterest': False,
|
|
80
|
+
'fetchBorrowRate': False,
|
|
81
|
+
'fetchBorrowRateHistories': False,
|
|
82
|
+
'fetchBorrowRateHistory': False,
|
|
83
|
+
'fetchBorrowRates': False,
|
|
84
|
+
'fetchBorrowRatesPerSymbol': False,
|
|
64
85
|
'fetchClosedOrders': True,
|
|
86
|
+
'fetchCrossBorrowRate': False,
|
|
87
|
+
'fetchCrossBorrowRates': False,
|
|
65
88
|
'fetchCurrencies': False,
|
|
66
|
-
'fetchDepositAddress':
|
|
89
|
+
'fetchDepositAddress': True,
|
|
67
90
|
'fetchDepositAddressesByNetwork': False,
|
|
68
|
-
'fetchDeposits':
|
|
69
|
-
'fetchDepositsWithdrawals':
|
|
91
|
+
'fetchDeposits': True,
|
|
92
|
+
'fetchDepositsWithdrawals': True,
|
|
70
93
|
'fetchFundingHistory': False,
|
|
94
|
+
'fetchFundingInterval': False,
|
|
95
|
+
'fetchFundingIntervals': False,
|
|
71
96
|
'fetchFundingRate': False,
|
|
97
|
+
'fetchFundingRateHistory': False,
|
|
72
98
|
'fetchFundingRates': False,
|
|
99
|
+
'fetchGreeks': False,
|
|
100
|
+
'fetchIndexOHLCV': False,
|
|
101
|
+
'fetchIsolatedBorrowRate': False,
|
|
102
|
+
'fetchIsolatedBorrowRates': False,
|
|
103
|
+
'fetchIsolatedPositions': False,
|
|
73
104
|
'fetchL1OrderBook': True,
|
|
74
105
|
'fetchL2OrderBook': False,
|
|
106
|
+
'fetchLeverage': False,
|
|
107
|
+
'fetchLeverages': False,
|
|
108
|
+
'fetchLeverageTiers': False,
|
|
109
|
+
'fetchLiquidations': False,
|
|
110
|
+
'fetchLongShortRatio': False,
|
|
111
|
+
'fetchLongShortRatioHistory': False,
|
|
112
|
+
'fetchMarginAdjustmentHistory': False,
|
|
113
|
+
'fetchMarginMode': False,
|
|
114
|
+
'fetchMarginModes': False,
|
|
115
|
+
'fetchMarketLeverageTiers': False,
|
|
75
116
|
'fetchMarkets': True,
|
|
76
|
-
'
|
|
117
|
+
'fetchMarkOHLCV': False,
|
|
118
|
+
'fetchMarkPrices': False,
|
|
119
|
+
'fetchMyLiquidations': False,
|
|
120
|
+
'fetchMySettlementHistory': False,
|
|
121
|
+
'fetchMyTrades': True,
|
|
77
122
|
'fetchOHLCV': True,
|
|
123
|
+
'fetchOpenInterest': False,
|
|
124
|
+
'fetchOpenInterestHistory': False,
|
|
125
|
+
'fetchOpenInterests': False,
|
|
78
126
|
'fetchOpenOrder': False,
|
|
79
127
|
'fetchOpenOrders': True,
|
|
128
|
+
'fetchOption': False,
|
|
129
|
+
'fetchOptionChain': False,
|
|
80
130
|
'fetchOrder': True,
|
|
81
131
|
'fetchOrderBook': True,
|
|
82
132
|
'fetchOrders': True,
|
|
@@ -87,9 +137,11 @@ class alpaca(Exchange, ImplicitAPI):
|
|
|
87
137
|
'fetchPositionsForSymbol': False,
|
|
88
138
|
'fetchPositionsHistory': False,
|
|
89
139
|
'fetchPositionsRisk': False,
|
|
140
|
+
'fetchPremiumIndexOHLCV': False,
|
|
141
|
+
'fetchSettlementHistory': False,
|
|
90
142
|
'fetchStatus': False,
|
|
91
|
-
'fetchTicker':
|
|
92
|
-
'fetchTickers':
|
|
143
|
+
'fetchTicker': True,
|
|
144
|
+
'fetchTickers': True,
|
|
93
145
|
'fetchTime': True,
|
|
94
146
|
'fetchTrades': True,
|
|
95
147
|
'fetchTradingFee': False,
|
|
@@ -97,12 +149,18 @@ class alpaca(Exchange, ImplicitAPI):
|
|
|
97
149
|
'fetchTransactionFees': False,
|
|
98
150
|
'fetchTransactions': False,
|
|
99
151
|
'fetchTransfers': False,
|
|
100
|
-
'
|
|
152
|
+
'fetchVolatilityHistory': False,
|
|
153
|
+
'fetchWithdrawals': True,
|
|
154
|
+
'reduceMargin': False,
|
|
155
|
+
'repayCrossMargin': False,
|
|
156
|
+
'repayIsolatedMargin': False,
|
|
101
157
|
'sandbox': True,
|
|
102
158
|
'setLeverage': False,
|
|
159
|
+
'setMargin': False,
|
|
103
160
|
'setMarginMode': False,
|
|
161
|
+
'setPositionMode': False,
|
|
104
162
|
'transfer': False,
|
|
105
|
-
'withdraw':
|
|
163
|
+
'withdraw': True,
|
|
106
164
|
},
|
|
107
165
|
'api': {
|
|
108
166
|
'broker': {
|
|
@@ -128,14 +186,18 @@ class alpaca(Exchange, ImplicitAPI):
|
|
|
128
186
|
'v2/assets/{symbol_or_asset_id}',
|
|
129
187
|
'v2/corporate_actions/announcements/{id}',
|
|
130
188
|
'v2/corporate_actions/announcements',
|
|
189
|
+
'v2/wallets',
|
|
190
|
+
'v2/wallets/transfers',
|
|
131
191
|
],
|
|
132
192
|
'post': [
|
|
133
193
|
'v2/orders',
|
|
134
194
|
'v2/watchlists',
|
|
135
195
|
'v2/watchlists/{watchlist_id}',
|
|
136
196
|
'v2/watchlists:by_name',
|
|
197
|
+
'v2/wallets/transfers',
|
|
137
198
|
],
|
|
138
199
|
'put': [
|
|
200
|
+
'v2/orders/{order_id}',
|
|
139
201
|
'v2/watchlists/{watchlist_id}',
|
|
140
202
|
'v2/watchlists:by_name',
|
|
141
203
|
],
|
|
@@ -264,6 +326,91 @@ class alpaca(Exchange, ImplicitAPI):
|
|
|
264
326
|
'defaultTimeInForce': 'gtc', # fok, gtc, ioc
|
|
265
327
|
'clientOrderId': 'ccxt_{id}',
|
|
266
328
|
},
|
|
329
|
+
'features': {
|
|
330
|
+
'spot': {
|
|
331
|
+
'sandbox': True,
|
|
332
|
+
'createOrder': {
|
|
333
|
+
'marginMode': False,
|
|
334
|
+
'triggerPrice': True,
|
|
335
|
+
'triggerPriceType': None,
|
|
336
|
+
'triggerDirection': False,
|
|
337
|
+
'stopLossPrice': False, # todo
|
|
338
|
+
'takeProfitPrice': False, # todo
|
|
339
|
+
'attachedStopLossTakeProfit': {
|
|
340
|
+
'triggerPriceType': {
|
|
341
|
+
'last': True,
|
|
342
|
+
'mark': True,
|
|
343
|
+
'index': True,
|
|
344
|
+
},
|
|
345
|
+
'price': True,
|
|
346
|
+
},
|
|
347
|
+
'timeInForce': {
|
|
348
|
+
'IOC': True,
|
|
349
|
+
'FOK': True,
|
|
350
|
+
'PO': True,
|
|
351
|
+
'GTD': False,
|
|
352
|
+
},
|
|
353
|
+
'hedged': False,
|
|
354
|
+
'trailing': True, # todo: implementation
|
|
355
|
+
'leverage': False,
|
|
356
|
+
'marketBuyRequiresPrice': False,
|
|
357
|
+
'marketBuyByCost': False,
|
|
358
|
+
'selfTradePrevention': False,
|
|
359
|
+
'iceberg': False,
|
|
360
|
+
},
|
|
361
|
+
'createOrders': None,
|
|
362
|
+
'fetchMyTrades': {
|
|
363
|
+
'marginMode': False,
|
|
364
|
+
'limit': 100,
|
|
365
|
+
'daysBack': 100000,
|
|
366
|
+
'untilDays': 100000,
|
|
367
|
+
'symbolRequired': False,
|
|
368
|
+
},
|
|
369
|
+
'fetchOrder': {
|
|
370
|
+
'marginMode': False,
|
|
371
|
+
'trigger': False,
|
|
372
|
+
'trailing': False,
|
|
373
|
+
'symbolRequired': False,
|
|
374
|
+
},
|
|
375
|
+
'fetchOpenOrders': {
|
|
376
|
+
'marginMode': False,
|
|
377
|
+
'limit': 500,
|
|
378
|
+
'trigger': False,
|
|
379
|
+
'trailing': False,
|
|
380
|
+
'symbolRequired': False,
|
|
381
|
+
},
|
|
382
|
+
'fetchOrders': {
|
|
383
|
+
'marginMode': False,
|
|
384
|
+
'limit': 500,
|
|
385
|
+
'daysBack': 100000,
|
|
386
|
+
'untilDays': 100000,
|
|
387
|
+
'trigger': False,
|
|
388
|
+
'trailing': False,
|
|
389
|
+
'symbolRequired': False,
|
|
390
|
+
},
|
|
391
|
+
'fetchClosedOrders': {
|
|
392
|
+
'marginMode': False,
|
|
393
|
+
'limit': 500,
|
|
394
|
+
'daysBack': 100000,
|
|
395
|
+
'daysBackCanceled': None,
|
|
396
|
+
'untilDays': 100000,
|
|
397
|
+
'trigger': False,
|
|
398
|
+
'trailing': False,
|
|
399
|
+
'symbolRequired': False,
|
|
400
|
+
},
|
|
401
|
+
'fetchOHLCV': {
|
|
402
|
+
'limit': 1000,
|
|
403
|
+
},
|
|
404
|
+
},
|
|
405
|
+
'swap': {
|
|
406
|
+
'linear': None,
|
|
407
|
+
'inverse': None,
|
|
408
|
+
},
|
|
409
|
+
'future': {
|
|
410
|
+
'linear': None,
|
|
411
|
+
'inverse': None,
|
|
412
|
+
},
|
|
413
|
+
},
|
|
267
414
|
'exceptions': {
|
|
268
415
|
'exact': {
|
|
269
416
|
'forbidden.': PermissionDenied, # {"message": "forbidden."}
|
|
@@ -280,7 +427,7 @@ class alpaca(Exchange, ImplicitAPI):
|
|
|
280
427
|
},
|
|
281
428
|
})
|
|
282
429
|
|
|
283
|
-
def fetch_time(self, params={}):
|
|
430
|
+
def fetch_time(self, params={}) -> Int:
|
|
284
431
|
"""
|
|
285
432
|
fetches the current integer timestamp in milliseconds from the exchange server
|
|
286
433
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
|
@@ -306,7 +453,9 @@ class alpaca(Exchange, ImplicitAPI):
|
|
|
306
453
|
def fetch_markets(self, params={}) -> List[Market]:
|
|
307
454
|
"""
|
|
308
455
|
retrieves data on all markets for alpaca
|
|
309
|
-
|
|
456
|
+
|
|
457
|
+
https://docs.alpaca.markets/reference/get-v2-assets
|
|
458
|
+
|
|
310
459
|
:param dict [params]: extra parameters specific to the exchange api endpoint
|
|
311
460
|
:returns dict[]: an array of objects representing market data
|
|
312
461
|
"""
|
|
@@ -350,7 +499,7 @@ class alpaca(Exchange, ImplicitAPI):
|
|
|
350
499
|
# "status": "active",
|
|
351
500
|
# "tradable": True,
|
|
352
501
|
# "marginable": False,
|
|
353
|
-
# "maintenance_margin_requirement":
|
|
502
|
+
# "maintenance_margin_requirement": 101,
|
|
354
503
|
# "shortable": False,
|
|
355
504
|
# "easy_to_borrow": False,
|
|
356
505
|
# "fractionable": True,
|
|
@@ -430,8 +579,10 @@ class alpaca(Exchange, ImplicitAPI):
|
|
|
430
579
|
def fetch_trades(self, symbol: str, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
|
|
431
580
|
"""
|
|
432
581
|
get the list of most recent trades for a particular symbol
|
|
433
|
-
|
|
434
|
-
|
|
582
|
+
|
|
583
|
+
https://docs.alpaca.markets/reference/cryptotrades
|
|
584
|
+
https://docs.alpaca.markets/reference/cryptolatesttrades
|
|
585
|
+
|
|
435
586
|
:param str symbol: unified symbol of the market to fetch trades for
|
|
436
587
|
:param int [since]: timestamp in ms of the earliest trade to fetch
|
|
437
588
|
:param int [limit]: the maximum amount of trades to fetch
|
|
@@ -500,7 +651,9 @@ class alpaca(Exchange, ImplicitAPI):
|
|
|
500
651
|
def fetch_order_book(self, symbol: str, limit: Int = None, params={}) -> OrderBook:
|
|
501
652
|
"""
|
|
502
653
|
fetches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
|
|
503
|
-
|
|
654
|
+
|
|
655
|
+
https://docs.alpaca.markets/reference/cryptolatestorderbooks
|
|
656
|
+
|
|
504
657
|
:param str symbol: unified symbol of the market to fetch the order book for
|
|
505
658
|
:param int [limit]: the maximum amount of order book entries to return
|
|
506
659
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
|
@@ -553,16 +706,18 @@ class alpaca(Exchange, ImplicitAPI):
|
|
|
553
706
|
# }
|
|
554
707
|
# }
|
|
555
708
|
#
|
|
556
|
-
orderbooks = self.
|
|
557
|
-
rawOrderbook = self.
|
|
709
|
+
orderbooks = self.safe_dict(response, 'orderbooks', {})
|
|
710
|
+
rawOrderbook = self.safe_dict(orderbooks, id, {})
|
|
558
711
|
timestamp = self.parse8601(self.safe_string(rawOrderbook, 't'))
|
|
559
712
|
return self.parse_order_book(rawOrderbook, market['symbol'], timestamp, 'b', 'a', 'p', 's')
|
|
560
713
|
|
|
561
714
|
def fetch_ohlcv(self, symbol: str, timeframe='1m', since: Int = None, limit: Int = None, params={}) -> List[list]:
|
|
562
715
|
"""
|
|
563
716
|
fetches historical candlestick data containing the open, high, low, and close price, and the volume of a market
|
|
564
|
-
|
|
565
|
-
|
|
717
|
+
|
|
718
|
+
https://docs.alpaca.markets/reference/cryptobars
|
|
719
|
+
https://docs.alpaca.markets/reference/cryptolatestbars
|
|
720
|
+
|
|
566
721
|
:param str symbol: unified symbol of the market to fetch OHLCV data for
|
|
567
722
|
:param str timeframe: the length of time each candle represents
|
|
568
723
|
:param int [since]: timestamp in ms of the earliest candle to fetch
|
|
@@ -670,17 +825,209 @@ class alpaca(Exchange, ImplicitAPI):
|
|
|
670
825
|
self.safe_number(ohlcv, 'v'), # volume
|
|
671
826
|
]
|
|
672
827
|
|
|
828
|
+
def fetch_ticker(self, symbol: str, params={}) -> Ticker:
|
|
829
|
+
"""
|
|
830
|
+
fetches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
|
|
831
|
+
|
|
832
|
+
https://docs.alpaca.markets/reference/cryptosnapshots-1
|
|
833
|
+
|
|
834
|
+
:param str symbol: unified symbol of the market to fetch the ticker for
|
|
835
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
|
836
|
+
:param str [params.loc]: crypto location, default: us
|
|
837
|
+
:returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
|
|
838
|
+
"""
|
|
839
|
+
self.load_markets()
|
|
840
|
+
symbol = self.symbol(symbol)
|
|
841
|
+
tickers = self.fetch_tickers([symbol], params)
|
|
842
|
+
return self.safe_dict(tickers, symbol)
|
|
843
|
+
|
|
844
|
+
def fetch_tickers(self, symbols: Strings = None, params={}) -> Tickers:
|
|
845
|
+
"""
|
|
846
|
+
fetches price tickers for multiple markets, statistical information calculated over the past 24 hours for each market
|
|
847
|
+
|
|
848
|
+
https://docs.alpaca.markets/reference/cryptosnapshots-1
|
|
849
|
+
|
|
850
|
+
:param str[] symbols: unified symbols of the markets to fetch tickers for
|
|
851
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
|
852
|
+
:param str [params.loc]: crypto location, default: us
|
|
853
|
+
:returns dict: a dictionary of `ticker structures <https://docs.ccxt.com/#/?id=ticker-structure>`
|
|
854
|
+
"""
|
|
855
|
+
if symbols is None:
|
|
856
|
+
raise ArgumentsRequired(self.id + ' fetchTickers() requires a symbols argument')
|
|
857
|
+
self.load_markets()
|
|
858
|
+
symbols = self.market_symbols(symbols)
|
|
859
|
+
loc = self.safe_string(params, 'loc', 'us')
|
|
860
|
+
ids = self.market_ids(symbols)
|
|
861
|
+
request = {
|
|
862
|
+
'symbols': ','.join(ids),
|
|
863
|
+
'loc': loc,
|
|
864
|
+
}
|
|
865
|
+
params = self.omit(params, 'loc')
|
|
866
|
+
response = self.marketPublicGetV1beta3CryptoLocSnapshots(self.extend(request, params))
|
|
867
|
+
#
|
|
868
|
+
# {
|
|
869
|
+
# "snapshots": {
|
|
870
|
+
# "BTC/USD": {
|
|
871
|
+
# "dailyBar": {
|
|
872
|
+
# "c": 69403.554,
|
|
873
|
+
# "h": 69609.6515,
|
|
874
|
+
# "l": 69013.26,
|
|
875
|
+
# "n": 9,
|
|
876
|
+
# "o": 69536.7,
|
|
877
|
+
# "t": "2024-11-01T05:00:00Z",
|
|
878
|
+
# "v": 0.210809181,
|
|
879
|
+
# "vw": 69327.655393908
|
|
880
|
+
# },
|
|
881
|
+
# "latestQuote": {
|
|
882
|
+
# "ap": 69424.19,
|
|
883
|
+
# "as": 0.68149,
|
|
884
|
+
# "bp": 69366.086,
|
|
885
|
+
# "bs": 0.68312,
|
|
886
|
+
# "t": "2024-11-01T08:31:41.880246926Z"
|
|
887
|
+
# },
|
|
888
|
+
# "latestTrade": {
|
|
889
|
+
# "i": 5272941104897543146,
|
|
890
|
+
# "p": 69416.9,
|
|
891
|
+
# "s": 0.014017324,
|
|
892
|
+
# "t": "2024-11-01T08:14:28.245088803Z",
|
|
893
|
+
# "tks": "B"
|
|
894
|
+
# },
|
|
895
|
+
# "minuteBar": {
|
|
896
|
+
# "c": 69403.554,
|
|
897
|
+
# "h": 69403.554,
|
|
898
|
+
# "l": 69399.125,
|
|
899
|
+
# "n": 0,
|
|
900
|
+
# "o": 69399.125,
|
|
901
|
+
# "t": "2024-11-01T08:30:00Z",
|
|
902
|
+
# "v": 0,
|
|
903
|
+
# "vw": 0
|
|
904
|
+
# },
|
|
905
|
+
# "prevDailyBar": {
|
|
906
|
+
# "c": 69515.1415,
|
|
907
|
+
# "h": 72668.837,
|
|
908
|
+
# "l": 68796.85,
|
|
909
|
+
# "n": 129,
|
|
910
|
+
# "o": 72258.9,
|
|
911
|
+
# "t": "2024-10-31T05:00:00Z",
|
|
912
|
+
# "v": 2.217683307,
|
|
913
|
+
# "vw": 70782.6811608144
|
|
914
|
+
# }
|
|
915
|
+
# },
|
|
916
|
+
# }
|
|
917
|
+
# }
|
|
918
|
+
#
|
|
919
|
+
results = []
|
|
920
|
+
snapshots = self.safe_dict(response, 'snapshots', {})
|
|
921
|
+
marketIds = list(snapshots.keys())
|
|
922
|
+
for i in range(0, len(marketIds)):
|
|
923
|
+
marketId = marketIds[i]
|
|
924
|
+
market = self.safe_market(marketId)
|
|
925
|
+
entry = self.safe_dict(snapshots, marketId)
|
|
926
|
+
dailyBar = self.safe_dict(entry, 'dailyBar', {})
|
|
927
|
+
prevDailyBar = self.safe_dict(entry, 'prevDailyBar', {})
|
|
928
|
+
latestQuote = self.safe_dict(entry, 'latestQuote', {})
|
|
929
|
+
latestTrade = self.safe_dict(entry, 'latestTrade', {})
|
|
930
|
+
datetime = self.safe_string(latestQuote, 't')
|
|
931
|
+
ticker = self.safe_ticker({
|
|
932
|
+
'info': entry,
|
|
933
|
+
'symbol': market['symbol'],
|
|
934
|
+
'timestamp': self.parse8601(datetime),
|
|
935
|
+
'datetime': datetime,
|
|
936
|
+
'high': self.safe_string(dailyBar, 'h'),
|
|
937
|
+
'low': self.safe_string(dailyBar, 'l'),
|
|
938
|
+
'bid': self.safe_string(latestQuote, 'bp'),
|
|
939
|
+
'bidVolume': self.safe_string(latestQuote, 'bs'),
|
|
940
|
+
'ask': self.safe_string(latestQuote, 'ap'),
|
|
941
|
+
'askVolume': self.safe_string(latestQuote, 'as'),
|
|
942
|
+
'vwap': self.safe_string(dailyBar, 'vw'),
|
|
943
|
+
'open': self.safe_string(dailyBar, 'o'),
|
|
944
|
+
'close': self.safe_string(dailyBar, 'c'),
|
|
945
|
+
'last': self.safe_string(latestTrade, 'p'),
|
|
946
|
+
'previousClose': self.safe_string(prevDailyBar, 'c'),
|
|
947
|
+
'change': None,
|
|
948
|
+
'percentage': None,
|
|
949
|
+
'average': None,
|
|
950
|
+
'baseVolume': self.safe_string(dailyBar, 'v'),
|
|
951
|
+
'quoteVolume': self.safe_string(dailyBar, 'n'),
|
|
952
|
+
}, market)
|
|
953
|
+
results.append(ticker)
|
|
954
|
+
return self.filter_by_array(results, 'symbol', symbols)
|
|
955
|
+
|
|
956
|
+
def generate_client_order_id(self, params):
|
|
957
|
+
clientOrderIdprefix = self.safe_string(self.options, 'clientOrderId')
|
|
958
|
+
uuid = self.uuid()
|
|
959
|
+
parts = uuid.split('-')
|
|
960
|
+
random_id = ''.join(parts)
|
|
961
|
+
defaultClientId = self.implode_params(clientOrderIdprefix, {'id': random_id})
|
|
962
|
+
clientOrderId = self.safe_string(params, 'clientOrderId', defaultClientId)
|
|
963
|
+
return clientOrderId
|
|
964
|
+
|
|
965
|
+
def create_market_order_with_cost(self, symbol: str, side: OrderSide, cost: float, params={}):
|
|
966
|
+
"""
|
|
967
|
+
create a market order by providing the symbol, side and cost
|
|
968
|
+
|
|
969
|
+
https://docs.alpaca.markets/reference/postorder
|
|
970
|
+
|
|
971
|
+
:param str symbol: unified symbol of the market to create an order in
|
|
972
|
+
:param str side: 'buy' or 'sell'
|
|
973
|
+
:param float cost: how much you want to trade in units of the quote currency
|
|
974
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
|
975
|
+
:returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
|
|
976
|
+
"""
|
|
977
|
+
self.load_markets()
|
|
978
|
+
req = {
|
|
979
|
+
'cost': cost,
|
|
980
|
+
}
|
|
981
|
+
return self.create_order(symbol, 'market', side, 0, None, self.extend(req, params))
|
|
982
|
+
|
|
983
|
+
def create_market_buy_order_with_cost(self, symbol: str, cost: float, params={}):
|
|
984
|
+
"""
|
|
985
|
+
create a market buy order by providing the symbol and cost
|
|
986
|
+
|
|
987
|
+
https://docs.alpaca.markets/reference/postorder
|
|
988
|
+
|
|
989
|
+
:param str symbol: unified symbol of the market to create an order in
|
|
990
|
+
:param float cost: how much you want to trade in units of the quote currency
|
|
991
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
|
992
|
+
:returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
|
|
993
|
+
"""
|
|
994
|
+
self.load_markets()
|
|
995
|
+
req = {
|
|
996
|
+
'cost': cost,
|
|
997
|
+
}
|
|
998
|
+
return self.create_order(symbol, 'market', 'buy', 0, None, self.extend(req, params))
|
|
999
|
+
|
|
1000
|
+
def create_market_sell_order_with_cost(self, symbol: str, cost: float, params={}):
|
|
1001
|
+
"""
|
|
1002
|
+
create a market sell order by providing the symbol and cost
|
|
1003
|
+
|
|
1004
|
+
https://docs.alpaca.markets/reference/postorder
|
|
1005
|
+
|
|
1006
|
+
:param str symbol: unified symbol of the market to create an order in
|
|
1007
|
+
:param float cost: how much you want to trade in units of the quote currency
|
|
1008
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
|
1009
|
+
:returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
|
|
1010
|
+
"""
|
|
1011
|
+
self.load_markets()
|
|
1012
|
+
req = {
|
|
1013
|
+
'cost': cost,
|
|
1014
|
+
}
|
|
1015
|
+
return self.create_order(symbol, 'market', 'sell', cost, None, self.extend(req, params))
|
|
1016
|
+
|
|
673
1017
|
def create_order(self, symbol: str, type: OrderType, side: OrderSide, amount: float, price: Num = None, params={}):
|
|
674
1018
|
"""
|
|
675
1019
|
create a trade order
|
|
676
|
-
|
|
1020
|
+
|
|
1021
|
+
https://docs.alpaca.markets/reference/postorder
|
|
1022
|
+
|
|
677
1023
|
:param str symbol: unified symbol of the market to create an order in
|
|
678
1024
|
:param str type: 'market', 'limit' or 'stop_limit'
|
|
679
1025
|
:param str side: 'buy' or 'sell'
|
|
680
1026
|
:param float amount: how much of currency you want to trade in units of base currency
|
|
681
|
-
:param float [price]: the price at which the order is to be
|
|
1027
|
+
:param float [price]: the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
|
|
682
1028
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
|
683
1029
|
:param float [params.triggerPrice]: The price at which a trigger order is triggered at
|
|
1030
|
+
:param float [params.cost]: *market orders only* the cost of the order in units of the quote currency
|
|
684
1031
|
:returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
|
|
685
1032
|
"""
|
|
686
1033
|
self.load_markets()
|
|
@@ -688,13 +1035,12 @@ class alpaca(Exchange, ImplicitAPI):
|
|
|
688
1035
|
id = market['id']
|
|
689
1036
|
request: dict = {
|
|
690
1037
|
'symbol': id,
|
|
691
|
-
'qty': self.amount_to_precision(symbol, amount),
|
|
692
1038
|
'side': side,
|
|
693
1039
|
'type': type, # market, limit, stop_limit
|
|
694
1040
|
}
|
|
695
1041
|
triggerPrice = self.safe_string_n(params, ['triggerPrice', 'stop_price'])
|
|
696
1042
|
if triggerPrice is not None:
|
|
697
|
-
newType
|
|
1043
|
+
newType: str
|
|
698
1044
|
if type.find('limit') >= 0:
|
|
699
1045
|
newType = 'stop_limit'
|
|
700
1046
|
else:
|
|
@@ -703,16 +1049,16 @@ class alpaca(Exchange, ImplicitAPI):
|
|
|
703
1049
|
request['type'] = newType
|
|
704
1050
|
if type.find('limit') >= 0:
|
|
705
1051
|
request['limit_price'] = self.price_to_precision(symbol, price)
|
|
1052
|
+
cost = self.safe_string(params, 'cost')
|
|
1053
|
+
if cost is not None:
|
|
1054
|
+
params = self.omit(params, 'cost')
|
|
1055
|
+
request['notional'] = self.cost_to_precision(symbol, cost)
|
|
1056
|
+
else:
|
|
1057
|
+
request['qty'] = self.amount_to_precision(symbol, amount)
|
|
706
1058
|
defaultTIF = self.safe_string(self.options, 'defaultTimeInForce')
|
|
707
1059
|
request['time_in_force'] = self.safe_string(params, 'timeInForce', defaultTIF)
|
|
708
1060
|
params = self.omit(params, ['timeInForce', 'triggerPrice'])
|
|
709
|
-
|
|
710
|
-
uuid = self.uuid()
|
|
711
|
-
parts = uuid.split('-')
|
|
712
|
-
random_id = ''.join(parts)
|
|
713
|
-
defaultClientId = self.implode_params(clientOrderIdprefix, {'id': random_id})
|
|
714
|
-
clientOrderId = self.safe_string(params, 'clientOrderId', defaultClientId)
|
|
715
|
-
request['client_order_id'] = clientOrderId
|
|
1061
|
+
request['client_order_id'] = self.generate_client_order_id(params)
|
|
716
1062
|
params = self.omit(params, ['clientOrderId'])
|
|
717
1063
|
order = self.traderPrivatePostV2Orders(self.extend(request, params))
|
|
718
1064
|
#
|
|
@@ -756,7 +1102,9 @@ class alpaca(Exchange, ImplicitAPI):
|
|
|
756
1102
|
def cancel_order(self, id: str, symbol: Str = None, params={}):
|
|
757
1103
|
"""
|
|
758
1104
|
cancels an open order
|
|
759
|
-
|
|
1105
|
+
|
|
1106
|
+
https://docs.alpaca.markets/reference/deleteorderbyorderid
|
|
1107
|
+
|
|
760
1108
|
:param str id: order id
|
|
761
1109
|
:param str symbol: unified symbol of the market the order was made in
|
|
762
1110
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
|
@@ -777,7 +1125,9 @@ class alpaca(Exchange, ImplicitAPI):
|
|
|
777
1125
|
def cancel_all_orders(self, symbol: Str = None, params={}):
|
|
778
1126
|
"""
|
|
779
1127
|
cancel all open orders in a market
|
|
780
|
-
|
|
1128
|
+
|
|
1129
|
+
https://docs.alpaca.markets/reference/deleteallorders
|
|
1130
|
+
|
|
781
1131
|
:param str symbol: alpaca cancelAllOrders cannot setting symbol, it will cancel all open orders
|
|
782
1132
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
|
783
1133
|
:returns dict[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
|
|
@@ -787,12 +1137,19 @@ class alpaca(Exchange, ImplicitAPI):
|
|
|
787
1137
|
if isinstance(response, list):
|
|
788
1138
|
return self.parse_orders(response, None)
|
|
789
1139
|
else:
|
|
790
|
-
return
|
|
1140
|
+
return [
|
|
1141
|
+
self.safe_order({
|
|
1142
|
+
'info': response,
|
|
1143
|
+
}),
|
|
1144
|
+
]
|
|
791
1145
|
|
|
792
1146
|
def fetch_order(self, id: str, symbol: Str = None, params={}):
|
|
793
1147
|
"""
|
|
794
1148
|
fetches information on an order made by the user
|
|
795
|
-
|
|
1149
|
+
|
|
1150
|
+
https://docs.alpaca.markets/reference/getorderbyorderid
|
|
1151
|
+
|
|
1152
|
+
:param str id: the order id
|
|
796
1153
|
:param str symbol: unified symbol of the market the order was made in
|
|
797
1154
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
|
798
1155
|
:returns dict: An `order structure <https://docs.ccxt.com/#/?id=order-structure>`
|
|
@@ -809,7 +1166,9 @@ class alpaca(Exchange, ImplicitAPI):
|
|
|
809
1166
|
def fetch_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
|
|
810
1167
|
"""
|
|
811
1168
|
fetches information on multiple orders made by the user
|
|
812
|
-
|
|
1169
|
+
|
|
1170
|
+
https://docs.alpaca.markets/reference/getallorders
|
|
1171
|
+
|
|
813
1172
|
:param str symbol: unified market symbol of the market orders were made in
|
|
814
1173
|
:param int [since]: the earliest time in ms to fetch orders for
|
|
815
1174
|
:param int [limit]: the maximum number of order structures to retrieve
|
|
@@ -828,9 +1187,9 @@ class alpaca(Exchange, ImplicitAPI):
|
|
|
828
1187
|
until = self.safe_integer(params, 'until')
|
|
829
1188
|
if until is not None:
|
|
830
1189
|
params = self.omit(params, 'until')
|
|
831
|
-
request['endTime'] = until
|
|
1190
|
+
request['endTime'] = self.iso8601(until)
|
|
832
1191
|
if since is not None:
|
|
833
|
-
request['after'] = since
|
|
1192
|
+
request['after'] = self.iso8601(since)
|
|
834
1193
|
if limit is not None:
|
|
835
1194
|
request['limit'] = limit
|
|
836
1195
|
response = self.traderPrivateGetV2Orders(self.extend(request, params))
|
|
@@ -879,7 +1238,9 @@ class alpaca(Exchange, ImplicitAPI):
|
|
|
879
1238
|
def fetch_open_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
|
|
880
1239
|
"""
|
|
881
1240
|
fetch all unfilled currently open orders
|
|
882
|
-
|
|
1241
|
+
|
|
1242
|
+
https://docs.alpaca.markets/reference/getallorders
|
|
1243
|
+
|
|
883
1244
|
:param str symbol: unified market symbol of the market orders were made in
|
|
884
1245
|
:param int [since]: the earliest time in ms to fetch orders for
|
|
885
1246
|
:param int [limit]: the maximum number of order structures to retrieve
|
|
@@ -895,7 +1256,9 @@ class alpaca(Exchange, ImplicitAPI):
|
|
|
895
1256
|
def fetch_closed_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
|
|
896
1257
|
"""
|
|
897
1258
|
fetches information on multiple closed orders made by the user
|
|
898
|
-
|
|
1259
|
+
|
|
1260
|
+
https://docs.alpaca.markets/reference/getallorders
|
|
1261
|
+
|
|
899
1262
|
:param str symbol: unified market symbol of the market orders were made in
|
|
900
1263
|
:param int [since]: the earliest time in ms to fetch orders for
|
|
901
1264
|
:param int [limit]: the maximum number of order structures to retrieve
|
|
@@ -908,6 +1271,48 @@ class alpaca(Exchange, ImplicitAPI):
|
|
|
908
1271
|
}
|
|
909
1272
|
return self.fetch_orders(symbol, since, limit, self.extend(request, params))
|
|
910
1273
|
|
|
1274
|
+
def edit_order(self, id: str, symbol: str, type: OrderType, side: OrderSide, amount: Num = None, price: Num = None, params={}):
|
|
1275
|
+
"""
|
|
1276
|
+
edit a trade order
|
|
1277
|
+
|
|
1278
|
+
https://docs.alpaca.markets/reference/patchorderbyorderid-1
|
|
1279
|
+
|
|
1280
|
+
:param str id: order id
|
|
1281
|
+
:param str [symbol]: unified symbol of the market to create an order in
|
|
1282
|
+
:param str [type]: 'market', 'limit' or 'stop_limit'
|
|
1283
|
+
:param str [side]: 'buy' or 'sell'
|
|
1284
|
+
:param float [amount]: how much of the currency you want to trade in units of the base currency
|
|
1285
|
+
:param float [price]: the price for the order, in units of the quote currency, ignored in market orders
|
|
1286
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
|
1287
|
+
:param str [params.triggerPrice]: the price to trigger a stop order
|
|
1288
|
+
:param str [params.timeInForce]: for crypto trading either 'gtc' or 'ioc' can be used
|
|
1289
|
+
:param str [params.clientOrderId]: a unique identifier for the order, automatically generated if not sent
|
|
1290
|
+
:returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
|
|
1291
|
+
"""
|
|
1292
|
+
self.load_markets()
|
|
1293
|
+
request: dict = {
|
|
1294
|
+
'order_id': id,
|
|
1295
|
+
}
|
|
1296
|
+
market = None
|
|
1297
|
+
if symbol is not None:
|
|
1298
|
+
market = self.market(symbol)
|
|
1299
|
+
if amount is not None:
|
|
1300
|
+
request['qty'] = self.amount_to_precision(symbol, amount)
|
|
1301
|
+
triggerPrice = self.safe_string_n(params, ['triggerPrice', 'stop_price'])
|
|
1302
|
+
if triggerPrice is not None:
|
|
1303
|
+
request['stop_price'] = self.price_to_precision(symbol, triggerPrice)
|
|
1304
|
+
params = self.omit(params, 'triggerPrice')
|
|
1305
|
+
if price is not None:
|
|
1306
|
+
request['limit_price'] = self.price_to_precision(symbol, price)
|
|
1307
|
+
timeInForce = None
|
|
1308
|
+
timeInForce, params = self.handle_option_and_params_2(params, 'editOrder', 'timeInForce', 'defaultTimeInForce')
|
|
1309
|
+
if timeInForce is not None:
|
|
1310
|
+
request['time_in_force'] = timeInForce
|
|
1311
|
+
request['client_order_id'] = self.generate_client_order_id(params)
|
|
1312
|
+
params = self.omit(params, ['clientOrderId'])
|
|
1313
|
+
response = self.traderPrivatePatchV2OrdersOrderId(self.extend(request, params))
|
|
1314
|
+
return self.parse_order(response, market)
|
|
1315
|
+
|
|
911
1316
|
def parse_order(self, order: dict, market: Market = None) -> Order:
|
|
912
1317
|
#
|
|
913
1318
|
# {
|
|
@@ -979,7 +1384,6 @@ class alpaca(Exchange, ImplicitAPI):
|
|
|
979
1384
|
'postOnly': None,
|
|
980
1385
|
'side': self.safe_string(order, 'side'),
|
|
981
1386
|
'price': self.safe_number(order, 'limit_price'),
|
|
982
|
-
'stopPrice': self.safe_number(order, 'stop_price'),
|
|
983
1387
|
'triggerPrice': self.safe_number(order, 'stop_price'),
|
|
984
1388
|
'cost': None,
|
|
985
1389
|
'average': self.safe_number(order, 'filled_avg_price'),
|
|
@@ -1008,7 +1412,61 @@ class alpaca(Exchange, ImplicitAPI):
|
|
|
1008
1412
|
}
|
|
1009
1413
|
return self.safe_string(timeInForces, timeInForce, timeInForce)
|
|
1010
1414
|
|
|
1415
|
+
def fetch_my_trades(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}):
|
|
1416
|
+
"""
|
|
1417
|
+
fetch all trades made by the user
|
|
1418
|
+
|
|
1419
|
+
https://docs.alpaca.markets/reference/getaccountactivitiesbyactivitytype-1
|
|
1420
|
+
|
|
1421
|
+
:param str [symbol]: unified market symbol
|
|
1422
|
+
:param int [since]: the earliest time in ms to fetch trades for
|
|
1423
|
+
:param int [limit]: the maximum number of trade structures to retrieve
|
|
1424
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
|
1425
|
+
:param int [params.until]: the latest time in ms to fetch trades for
|
|
1426
|
+
:param str [params.page_token]: page_token - used for paging
|
|
1427
|
+
:returns Trade[]: a list of `trade structures <https://docs.ccxt.com/#/?id=trade-structure>`
|
|
1428
|
+
"""
|
|
1429
|
+
self.load_markets()
|
|
1430
|
+
market = None
|
|
1431
|
+
request: dict = {
|
|
1432
|
+
'activity_type': 'FILL',
|
|
1433
|
+
}
|
|
1434
|
+
if symbol is not None:
|
|
1435
|
+
market = self.market(symbol)
|
|
1436
|
+
until = self.safe_integer(params, 'until')
|
|
1437
|
+
if until is not None:
|
|
1438
|
+
params = self.omit(params, 'until')
|
|
1439
|
+
request['until'] = self.iso8601(until)
|
|
1440
|
+
if since is not None:
|
|
1441
|
+
request['after'] = self.iso8601(since)
|
|
1442
|
+
if limit is not None:
|
|
1443
|
+
request['page_size'] = limit
|
|
1444
|
+
request, params = self.handle_until_option('until', request, params)
|
|
1445
|
+
response = self.traderPrivateGetV2AccountActivitiesActivityType(self.extend(request, params))
|
|
1446
|
+
#
|
|
1447
|
+
# [
|
|
1448
|
+
# {
|
|
1449
|
+
# "id": "20221228071929579::ca2aafd0-1270-4b56-b0a9-85423b4a07c8",
|
|
1450
|
+
# "activity_type": "FILL",
|
|
1451
|
+
# "transaction_time": "2022-12-28T12:19:29.579352Z",
|
|
1452
|
+
# "type": "fill",
|
|
1453
|
+
# "price": "67.31",
|
|
1454
|
+
# "qty": "0.07",
|
|
1455
|
+
# "side": "sell",
|
|
1456
|
+
# "symbol": "LTC/USD",
|
|
1457
|
+
# "leaves_qty": "0",
|
|
1458
|
+
# "order_id": "82eebcf7-6e66-4b7e-93f8-be0df0e4f12e",
|
|
1459
|
+
# "cum_qty": "0.07",
|
|
1460
|
+
# "order_status": "filled",
|
|
1461
|
+
# "swap_rate": "1"
|
|
1462
|
+
# },
|
|
1463
|
+
# ]
|
|
1464
|
+
#
|
|
1465
|
+
return self.parse_trades(response, market, since, limit)
|
|
1466
|
+
|
|
1011
1467
|
def parse_trade(self, trade: dict, market: Market = None) -> Trade:
|
|
1468
|
+
#
|
|
1469
|
+
# fetchTrades
|
|
1012
1470
|
#
|
|
1013
1471
|
# {
|
|
1014
1472
|
# "t":"2022-06-14T05:00:00.027869Z",
|
|
@@ -1019,25 +1477,43 @@ class alpaca(Exchange, ImplicitAPI):
|
|
|
1019
1477
|
# "i":"355681339"
|
|
1020
1478
|
# }
|
|
1021
1479
|
#
|
|
1022
|
-
|
|
1480
|
+
# fetchMyTrades
|
|
1481
|
+
#
|
|
1482
|
+
# {
|
|
1483
|
+
# "id": "20221228071929579::ca2aafd0-1270-4b56-b0a9-85423b4a07c8",
|
|
1484
|
+
# "activity_type": "FILL",
|
|
1485
|
+
# "transaction_time": "2022-12-28T12:19:29.579352Z",
|
|
1486
|
+
# "type": "fill",
|
|
1487
|
+
# "price": "67.31",
|
|
1488
|
+
# "qty": "0.07",
|
|
1489
|
+
# "side": "sell",
|
|
1490
|
+
# "symbol": "LTC/USD",
|
|
1491
|
+
# "leaves_qty": "0",
|
|
1492
|
+
# "order_id": "82eebcf7-6e66-4b7e-93f8-be0df0e4f12e",
|
|
1493
|
+
# "cum_qty": "0.07",
|
|
1494
|
+
# "order_status": "filled",
|
|
1495
|
+
# "swap_rate": "1"
|
|
1496
|
+
# },
|
|
1497
|
+
#
|
|
1498
|
+
marketId = self.safe_string_2(trade, 'S', 'symbol')
|
|
1023
1499
|
symbol = self.safe_symbol(marketId, market)
|
|
1024
|
-
datetime = self.
|
|
1500
|
+
datetime = self.safe_string_2(trade, 't', 'transaction_time')
|
|
1025
1501
|
timestamp = self.parse8601(datetime)
|
|
1026
1502
|
alpacaSide = self.safe_string(trade, 'tks')
|
|
1027
|
-
side
|
|
1503
|
+
side = self.safe_string(trade, 'side')
|
|
1028
1504
|
if alpacaSide == 'B':
|
|
1029
1505
|
side = 'buy'
|
|
1030
1506
|
elif alpacaSide == 'S':
|
|
1031
1507
|
side = 'sell'
|
|
1032
|
-
priceString = self.
|
|
1033
|
-
amountString = self.
|
|
1508
|
+
priceString = self.safe_string_2(trade, 'p', 'price')
|
|
1509
|
+
amountString = self.safe_string_2(trade, 's', 'qty')
|
|
1034
1510
|
return self.safe_trade({
|
|
1035
1511
|
'info': trade,
|
|
1036
|
-
'id': self.
|
|
1512
|
+
'id': self.safe_string_2(trade, 'i', 'id'),
|
|
1037
1513
|
'timestamp': timestamp,
|
|
1038
1514
|
'datetime': self.iso8601(timestamp),
|
|
1039
1515
|
'symbol': symbol,
|
|
1040
|
-
'order':
|
|
1516
|
+
'order': self.safe_string(trade, 'order_id'),
|
|
1041
1517
|
'type': None,
|
|
1042
1518
|
'side': side,
|
|
1043
1519
|
'takerOrMaker': 'taker',
|
|
@@ -1047,11 +1523,312 @@ class alpaca(Exchange, ImplicitAPI):
|
|
|
1047
1523
|
'fee': None,
|
|
1048
1524
|
}, market)
|
|
1049
1525
|
|
|
1526
|
+
def fetch_deposit_address(self, code: str, params={}) -> DepositAddress:
|
|
1527
|
+
"""
|
|
1528
|
+
fetch the deposit address for a currency associated with self account
|
|
1529
|
+
|
|
1530
|
+
https://docs.alpaca.markets/reference/listcryptofundingwallets
|
|
1531
|
+
|
|
1532
|
+
:param str code: unified currency code
|
|
1533
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
|
1534
|
+
:returns dict: an `address structure <https://docs.ccxt.com/#/?id=address-structure>`
|
|
1535
|
+
"""
|
|
1536
|
+
self.load_markets()
|
|
1537
|
+
currency = self.currency(code)
|
|
1538
|
+
request: dict = {
|
|
1539
|
+
'asset': currency['id'],
|
|
1540
|
+
}
|
|
1541
|
+
response = self.traderPrivateGetV2Wallets(self.extend(request, params))
|
|
1542
|
+
#
|
|
1543
|
+
# {
|
|
1544
|
+
# "asset_id": "4fa30c85-77b7-4cbc-92dd-7b7513640aad",
|
|
1545
|
+
# "address": "bc1q2fpskfnwem3uq9z8660e4z6pfv7aqfamysk75r",
|
|
1546
|
+
# "created_at": "2024-11-03T07:30:05.609976344Z"
|
|
1547
|
+
# }
|
|
1548
|
+
#
|
|
1549
|
+
return self.parse_deposit_address(response, currency)
|
|
1550
|
+
|
|
1551
|
+
def parse_deposit_address(self, depositAddress, currency: Currency = None) -> DepositAddress:
|
|
1552
|
+
#
|
|
1553
|
+
# {
|
|
1554
|
+
# "asset_id": "4fa30c85-77b7-4cbc-92dd-7b7513640aad",
|
|
1555
|
+
# "address": "bc1q2fpskfnwem3uq9z8660e4z6pfv7aqfamysk75r",
|
|
1556
|
+
# "created_at": "2024-11-03T07:30:05.609976344Z"
|
|
1557
|
+
# }
|
|
1558
|
+
#
|
|
1559
|
+
parsedCurrency = None
|
|
1560
|
+
if currency is not None:
|
|
1561
|
+
parsedCurrency = currency['id']
|
|
1562
|
+
return {
|
|
1563
|
+
'info': depositAddress,
|
|
1564
|
+
'currency': parsedCurrency,
|
|
1565
|
+
'network': None,
|
|
1566
|
+
'address': self.safe_string(depositAddress, 'address'),
|
|
1567
|
+
'tag': None,
|
|
1568
|
+
}
|
|
1569
|
+
|
|
1570
|
+
def withdraw(self, code: str, amount: float, address: str, tag: Str = None, params={}) -> Transaction:
|
|
1571
|
+
"""
|
|
1572
|
+
make a withdrawal
|
|
1573
|
+
|
|
1574
|
+
https://docs.alpaca.markets/reference/createcryptotransferforaccount
|
|
1575
|
+
|
|
1576
|
+
:param str code: unified currency code
|
|
1577
|
+
:param float amount: the amount to withdraw
|
|
1578
|
+
:param str address: the address to withdraw to
|
|
1579
|
+
:param str tag: a memo for the transaction
|
|
1580
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
|
1581
|
+
:returns dict: a `transaction structure <https://docs.ccxt.com/#/?id=transaction-structure>`
|
|
1582
|
+
"""
|
|
1583
|
+
tag, params = self.handle_withdraw_tag_and_params(tag, params)
|
|
1584
|
+
self.check_address(address)
|
|
1585
|
+
self.load_markets()
|
|
1586
|
+
currency = self.currency(code)
|
|
1587
|
+
if tag:
|
|
1588
|
+
address = address + ':' + tag
|
|
1589
|
+
request: dict = {
|
|
1590
|
+
'asset': currency['id'],
|
|
1591
|
+
'address': address,
|
|
1592
|
+
'amount': self.number_to_string(amount),
|
|
1593
|
+
}
|
|
1594
|
+
response = self.traderPrivatePostV2WalletsTransfers(self.extend(request, params))
|
|
1595
|
+
#
|
|
1596
|
+
# {
|
|
1597
|
+
# "id": "e27b70a6-5610-40d7-8468-a516a284b776",
|
|
1598
|
+
# "tx_hash": null,
|
|
1599
|
+
# "direction": "OUTGOING",
|
|
1600
|
+
# "amount": "20",
|
|
1601
|
+
# "usd_value": "19.99856",
|
|
1602
|
+
# "chain": "ETH",
|
|
1603
|
+
# "asset": "USDT",
|
|
1604
|
+
# "from_address": "0x123930E4dCA196E070d39B60c644C8Aae02f23",
|
|
1605
|
+
# "to_address": "0x1232c0925196e4dcf05945f67f690153190fbaab",
|
|
1606
|
+
# "status": "PROCESSING",
|
|
1607
|
+
# "created_at": "2024-11-07T02:39:01.775495Z",
|
|
1608
|
+
# "network_fee": "4",
|
|
1609
|
+
# "fees": "0.1"
|
|
1610
|
+
# }
|
|
1611
|
+
#
|
|
1612
|
+
return self.parse_transaction(response, currency)
|
|
1613
|
+
|
|
1614
|
+
def fetch_transactions_helper(self, type, code, since, limit, params):
|
|
1615
|
+
self.load_markets()
|
|
1616
|
+
currency = None
|
|
1617
|
+
if code is not None:
|
|
1618
|
+
currency = self.currency(code)
|
|
1619
|
+
response = self.traderPrivateGetV2WalletsTransfers(params)
|
|
1620
|
+
#
|
|
1621
|
+
# {
|
|
1622
|
+
# "id": "e27b70a6-5610-40d7-8468-a516a284b776",
|
|
1623
|
+
# "tx_hash": null,
|
|
1624
|
+
# "direction": "OUTGOING",
|
|
1625
|
+
# "amount": "20",
|
|
1626
|
+
# "usd_value": "19.99856",
|
|
1627
|
+
# "chain": "ETH",
|
|
1628
|
+
# "asset": "USDT",
|
|
1629
|
+
# "from_address": "0x123930E4dCA196E070d39B60c644C8Aae02f23",
|
|
1630
|
+
# "to_address": "0x1232c0925196e4dcf05945f67f690153190fbaab",
|
|
1631
|
+
# "status": "PROCESSING",
|
|
1632
|
+
# "created_at": "2024-11-07T02:39:01.775495Z",
|
|
1633
|
+
# "network_fee": "4",
|
|
1634
|
+
# "fees": "0.1"
|
|
1635
|
+
# }
|
|
1636
|
+
#
|
|
1637
|
+
results = []
|
|
1638
|
+
for i in range(0, len(response)):
|
|
1639
|
+
entry = response[i]
|
|
1640
|
+
direction = self.safe_string(entry, 'direction')
|
|
1641
|
+
if direction == type:
|
|
1642
|
+
results.append(entry)
|
|
1643
|
+
elif type == 'BOTH':
|
|
1644
|
+
results.append(entry)
|
|
1645
|
+
return self.parse_transactions(results, currency, since, limit, params)
|
|
1646
|
+
|
|
1647
|
+
def fetch_deposits_withdrawals(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Transaction]:
|
|
1648
|
+
"""
|
|
1649
|
+
fetch history of deposits and withdrawals
|
|
1650
|
+
|
|
1651
|
+
https://docs.alpaca.markets/reference/listcryptofundingtransfers
|
|
1652
|
+
|
|
1653
|
+
:param str [code]: unified currency code for the currency of the deposit/withdrawals, default is None
|
|
1654
|
+
:param int [since]: timestamp in ms of the earliest deposit/withdrawal, default is None
|
|
1655
|
+
:param int [limit]: max number of deposit/withdrawals to return, default is None
|
|
1656
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
|
1657
|
+
:returns dict: a list of `transaction structure <https://docs.ccxt.com/#/?id=transaction-structure>`
|
|
1658
|
+
"""
|
|
1659
|
+
return self.fetch_transactions_helper('BOTH', code, since, limit, params)
|
|
1660
|
+
|
|
1661
|
+
def fetch_deposits(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Transaction]:
|
|
1662
|
+
"""
|
|
1663
|
+
fetch all deposits made to an account
|
|
1664
|
+
|
|
1665
|
+
https://docs.alpaca.markets/reference/listcryptofundingtransfers
|
|
1666
|
+
|
|
1667
|
+
:param str [code]: unified currency code
|
|
1668
|
+
:param int [since]: the earliest time in ms to fetch deposits for
|
|
1669
|
+
:param int [limit]: the maximum number of deposit structures to retrieve
|
|
1670
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
|
1671
|
+
:returns dict[]: a list of `transaction structures <https://docs.ccxt.com/#/?id=transaction-structure>`
|
|
1672
|
+
"""
|
|
1673
|
+
return self.fetch_transactions_helper('INCOMING', code, since, limit, params)
|
|
1674
|
+
|
|
1675
|
+
def fetch_withdrawals(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Transaction]:
|
|
1676
|
+
"""
|
|
1677
|
+
fetch all withdrawals made from an account
|
|
1678
|
+
|
|
1679
|
+
https://docs.alpaca.markets/reference/listcryptofundingtransfers
|
|
1680
|
+
|
|
1681
|
+
:param str [code]: unified currency code
|
|
1682
|
+
:param int [since]: the earliest time in ms to fetch withdrawals for
|
|
1683
|
+
:param int [limit]: the maximum number of withdrawal structures to retrieve
|
|
1684
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
|
1685
|
+
:returns dict[]: a list of `transaction structures <https://docs.ccxt.com/#/?id=transaction-structure>`
|
|
1686
|
+
"""
|
|
1687
|
+
return self.fetch_transactions_helper('OUTGOING', code, since, limit, params)
|
|
1688
|
+
|
|
1689
|
+
def parse_transaction(self, transaction: dict, currency: Currency = None) -> Transaction:
|
|
1690
|
+
#
|
|
1691
|
+
# {
|
|
1692
|
+
# "id": "e27b70a6-5610-40d7-8468-a516a284b776",
|
|
1693
|
+
# "tx_hash": null,
|
|
1694
|
+
# "direction": "OUTGOING",
|
|
1695
|
+
# "amount": "20",
|
|
1696
|
+
# "usd_value": "19.99856",
|
|
1697
|
+
# "chain": "ETH",
|
|
1698
|
+
# "asset": "USDT",
|
|
1699
|
+
# "from_address": "0x123930E4dCA196E070d39B60c644C8Aae02f23",
|
|
1700
|
+
# "to_address": "0x1232c0925196e4dcf05945f67f690153190fbaab",
|
|
1701
|
+
# "status": "PROCESSING",
|
|
1702
|
+
# "created_at": "2024-11-07T02:39:01.775495Z",
|
|
1703
|
+
# "network_fee": "4",
|
|
1704
|
+
# "fees": "0.1"
|
|
1705
|
+
# }
|
|
1706
|
+
#
|
|
1707
|
+
datetime = self.safe_string(transaction, 'created_at')
|
|
1708
|
+
currencyId = self.safe_string(transaction, 'asset')
|
|
1709
|
+
code = self.safe_currency_code(currencyId, currency)
|
|
1710
|
+
fees = self.safe_string(transaction, 'fees')
|
|
1711
|
+
networkFee = self.safe_string(transaction, 'network_fee')
|
|
1712
|
+
totalFee = Precise.string_add(fees, networkFee)
|
|
1713
|
+
fee = {
|
|
1714
|
+
'cost': self.parse_number(totalFee),
|
|
1715
|
+
'currency': code,
|
|
1716
|
+
}
|
|
1717
|
+
return {
|
|
1718
|
+
'info': transaction,
|
|
1719
|
+
'id': self.safe_string(transaction, 'id'),
|
|
1720
|
+
'txid': self.safe_string(transaction, 'tx_hash'),
|
|
1721
|
+
'timestamp': self.parse8601(datetime),
|
|
1722
|
+
'datetime': datetime,
|
|
1723
|
+
'network': self.safe_string(transaction, 'chain'),
|
|
1724
|
+
'address': self.safe_string(transaction, 'to_address'),
|
|
1725
|
+
'addressTo': self.safe_string(transaction, 'to_address'),
|
|
1726
|
+
'addressFrom': self.safe_string(transaction, 'from_address'),
|
|
1727
|
+
'tag': None,
|
|
1728
|
+
'tagTo': None,
|
|
1729
|
+
'tagFrom': None,
|
|
1730
|
+
'type': self.parse_transaction_type(self.safe_string(transaction, 'direction')),
|
|
1731
|
+
'amount': self.safe_number(transaction, 'amount'),
|
|
1732
|
+
'currency': code,
|
|
1733
|
+
'status': self.parse_transaction_status(self.safe_string(transaction, 'status')),
|
|
1734
|
+
'updated': None,
|
|
1735
|
+
'fee': fee,
|
|
1736
|
+
'comment': None,
|
|
1737
|
+
'internal': None,
|
|
1738
|
+
}
|
|
1739
|
+
|
|
1740
|
+
def parse_transaction_status(self, status: Str):
|
|
1741
|
+
statuses: dict = {
|
|
1742
|
+
'PROCESSING': 'pending',
|
|
1743
|
+
'FAILED': 'failed',
|
|
1744
|
+
'COMPLETE': 'ok',
|
|
1745
|
+
}
|
|
1746
|
+
return self.safe_string(statuses, status, status)
|
|
1747
|
+
|
|
1748
|
+
def parse_transaction_type(self, type):
|
|
1749
|
+
types: dict = {
|
|
1750
|
+
'INCOMING': 'deposit',
|
|
1751
|
+
'OUTGOING': 'withdrawal',
|
|
1752
|
+
}
|
|
1753
|
+
return self.safe_string(types, type, type)
|
|
1754
|
+
|
|
1755
|
+
def fetch_balance(self, params={}) -> Balances:
|
|
1756
|
+
"""
|
|
1757
|
+
query for balance and get the amount of funds available for trading or funds locked in orders
|
|
1758
|
+
|
|
1759
|
+
https://docs.alpaca.markets/reference/getaccount-1
|
|
1760
|
+
|
|
1761
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
|
1762
|
+
:returns dict: a `balance structure <https://docs.ccxt.com/#/?id=balance-structure>`
|
|
1763
|
+
"""
|
|
1764
|
+
self.load_markets()
|
|
1765
|
+
response = self.traderPrivateGetV2Account(params)
|
|
1766
|
+
#
|
|
1767
|
+
# {
|
|
1768
|
+
# "id": "43a01bde-4eb1-64fssc26adb5",
|
|
1769
|
+
# "admin_configurations": {
|
|
1770
|
+
# "allow_instant_ach": True,
|
|
1771
|
+
# "max_margin_multiplier": "4"
|
|
1772
|
+
# },
|
|
1773
|
+
# "user_configurations": {
|
|
1774
|
+
# "fractional_trading": True,
|
|
1775
|
+
# "max_margin_multiplier": "4"
|
|
1776
|
+
# },
|
|
1777
|
+
# "account_number": "744873727",
|
|
1778
|
+
# "status": "ACTIVE",
|
|
1779
|
+
# "crypto_status": "ACTIVE",
|
|
1780
|
+
# "currency": "USD",
|
|
1781
|
+
# "buying_power": "5.92",
|
|
1782
|
+
# "regt_buying_power": "5.92",
|
|
1783
|
+
# "daytrading_buying_power": "0",
|
|
1784
|
+
# "effective_buying_power": "5.92",
|
|
1785
|
+
# "non_marginable_buying_power": "5.92",
|
|
1786
|
+
# "bod_dtbp": "0",
|
|
1787
|
+
# "cash": "5.92",
|
|
1788
|
+
# "accrued_fees": "0",
|
|
1789
|
+
# "portfolio_value": "48.6",
|
|
1790
|
+
# "pattern_day_trader": False,
|
|
1791
|
+
# "trading_blocked": False,
|
|
1792
|
+
# "transfers_blocked": False,
|
|
1793
|
+
# "account_blocked": False,
|
|
1794
|
+
# "created_at": "2022-06-13T14:59:18.318096Z",
|
|
1795
|
+
# "trade_suspended_by_user": False,
|
|
1796
|
+
# "multiplier": "1",
|
|
1797
|
+
# "shorting_enabled": False,
|
|
1798
|
+
# "equity": "48.6",
|
|
1799
|
+
# "last_equity": "48.8014266",
|
|
1800
|
+
# "long_market_value": "42.68",
|
|
1801
|
+
# "short_market_value": "0",
|
|
1802
|
+
# "position_market_value": "42.68",
|
|
1803
|
+
# "initial_margin": "0",
|
|
1804
|
+
# "maintenance_margin": "0",
|
|
1805
|
+
# "last_maintenance_margin": "0",
|
|
1806
|
+
# "sma": "5.92",
|
|
1807
|
+
# "daytrade_count": 0,
|
|
1808
|
+
# "balance_asof": "2024-12-10",
|
|
1809
|
+
# "crypto_tier": 1,
|
|
1810
|
+
# "intraday_adjustments": "0",
|
|
1811
|
+
# "pending_reg_taf_fees": "0"
|
|
1812
|
+
# }
|
|
1813
|
+
#
|
|
1814
|
+
return self.parse_balance(response)
|
|
1815
|
+
|
|
1816
|
+
def parse_balance(self, response) -> Balances:
|
|
1817
|
+
result: dict = {'info': response}
|
|
1818
|
+
account = self.account()
|
|
1819
|
+
currencyId = self.safe_string(response, 'currency')
|
|
1820
|
+
code = self.safe_currency_code(currencyId)
|
|
1821
|
+
account['free'] = self.safe_string(response, 'cash')
|
|
1822
|
+
account['total'] = self.safe_string(response, 'equity')
|
|
1823
|
+
result[code] = account
|
|
1824
|
+
return self.safe_balance(result)
|
|
1825
|
+
|
|
1050
1826
|
def sign(self, path, api='public', method='GET', params={}, headers=None, body=None):
|
|
1051
1827
|
endpoint = '/' + self.implode_params(path, params)
|
|
1052
1828
|
url = self.implode_hostname(self.urls['api'][api[0]])
|
|
1053
1829
|
headers = headers if (headers is not None) else {}
|
|
1054
1830
|
if api[1] == 'private':
|
|
1831
|
+
self.check_required_credentials()
|
|
1055
1832
|
headers['APCA-API-KEY-ID'] = self.apiKey
|
|
1056
1833
|
headers['APCA-API-SECRET-KEY'] = self.secret
|
|
1057
1834
|
query = self.omit(params, self.extract_params(path))
|