ccxt 4.2.11 → 4.2.12
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.
- package/README.md +5 -5
- package/build.sh +2 -2
- package/dist/ccxt.browser.js +640 -261
- package/dist/ccxt.browser.min.js +3 -3
- package/dist/cjs/_virtual/agent.js +7 -0
- package/dist/cjs/_virtual/parse-proxy-response.js +7 -0
- package/dist/cjs/_virtual/promisify.js +7 -0
- package/dist/cjs/ccxt.js +1 -1
- package/dist/cjs/js/ccxt.js +474 -0
- package/dist/cjs/js/src/abstract/ace.js +9 -0
- package/dist/cjs/js/src/abstract/alpaca.js +9 -0
- package/dist/cjs/js/src/abstract/ascendex.js +9 -0
- package/dist/cjs/js/src/abstract/bigone.js +9 -0
- package/dist/cjs/js/src/abstract/binance.js +9 -0
- package/dist/cjs/js/src/abstract/bingx.js +9 -0
- package/dist/cjs/js/src/abstract/bit2c.js +9 -0
- package/dist/cjs/js/src/abstract/bitbank.js +9 -0
- package/dist/cjs/js/src/abstract/bitbns.js +9 -0
- package/dist/cjs/js/src/abstract/bitfinex.js +9 -0
- package/dist/cjs/js/src/abstract/bitfinex2.js +9 -0
- package/dist/cjs/js/src/abstract/bitflyer.js +9 -0
- package/dist/cjs/js/src/abstract/bitforex.js +9 -0
- package/dist/cjs/js/src/abstract/bitget.js +9 -0
- package/dist/cjs/js/src/abstract/bithumb.js +9 -0
- package/dist/cjs/js/src/abstract/bitmart.js +9 -0
- package/dist/cjs/js/src/abstract/bitmex.js +9 -0
- package/dist/cjs/js/src/abstract/bitopro.js +9 -0
- package/dist/cjs/js/src/abstract/bitpanda.js +9 -0
- package/dist/cjs/js/src/abstract/bitrue.js +9 -0
- package/dist/cjs/js/src/abstract/bitso.js +9 -0
- package/dist/cjs/js/src/abstract/bitstamp.js +9 -0
- package/dist/cjs/js/src/abstract/bitteam.js +9 -0
- package/dist/cjs/js/src/abstract/bitvavo.js +9 -0
- package/dist/cjs/js/src/abstract/bl3p.js +9 -0
- package/dist/cjs/js/src/abstract/blockchaincom.js +9 -0
- package/dist/cjs/js/src/abstract/btcalpha.js +9 -0
- package/dist/cjs/js/src/abstract/btcbox.js +9 -0
- package/dist/cjs/js/src/abstract/btcmarkets.js +9 -0
- package/dist/cjs/js/src/abstract/btcturk.js +9 -0
- package/dist/cjs/js/src/abstract/bybit.js +9 -0
- package/dist/cjs/js/src/abstract/cex.js +9 -0
- package/dist/cjs/js/src/abstract/coinbase.js +9 -0
- package/dist/cjs/js/src/abstract/coinbasepro.js +9 -0
- package/dist/cjs/js/src/abstract/coincheck.js +9 -0
- package/dist/cjs/js/src/abstract/coinex.js +9 -0
- package/dist/cjs/js/src/abstract/coinlist.js +9 -0
- package/dist/cjs/js/src/abstract/coinmate.js +9 -0
- package/dist/cjs/js/src/abstract/coinone.js +9 -0
- package/dist/cjs/js/src/abstract/coinsph.js +9 -0
- package/dist/cjs/js/src/abstract/coinspot.js +9 -0
- package/dist/cjs/js/src/abstract/cryptocom.js +9 -0
- package/dist/cjs/js/src/abstract/currencycom.js +9 -0
- package/dist/cjs/js/src/abstract/delta.js +9 -0
- package/dist/cjs/js/src/abstract/deribit.js +9 -0
- package/dist/cjs/js/src/abstract/digifinex.js +9 -0
- package/dist/cjs/js/src/abstract/exmo.js +9 -0
- package/dist/cjs/js/src/abstract/gate.js +9 -0
- package/dist/cjs/js/src/abstract/gemini.js +9 -0
- package/dist/cjs/js/src/abstract/hitbtc.js +9 -0
- package/dist/cjs/js/src/abstract/hollaex.js +9 -0
- package/dist/cjs/js/src/abstract/htx.js +9 -0
- package/dist/cjs/js/src/abstract/huobijp.js +9 -0
- package/dist/cjs/js/src/abstract/idex.js +9 -0
- package/dist/cjs/js/src/abstract/independentreserve.js +9 -0
- package/dist/cjs/js/src/abstract/indodax.js +9 -0
- package/dist/cjs/js/src/abstract/kraken.js +9 -0
- package/dist/cjs/js/src/abstract/krakenfutures.js +9 -0
- package/dist/cjs/js/src/abstract/kucoin.js +9 -0
- package/dist/cjs/js/src/abstract/kucoinfutures.js +9 -0
- package/dist/cjs/js/src/abstract/kuna.js +9 -0
- package/dist/cjs/js/src/abstract/latoken.js +9 -0
- package/dist/cjs/js/src/abstract/lbank.js +9 -0
- package/dist/cjs/js/src/abstract/luno.js +9 -0
- package/dist/cjs/js/src/abstract/lykke.js +9 -0
- package/dist/cjs/js/src/abstract/mercado.js +9 -0
- package/dist/cjs/js/src/abstract/mexc.js +9 -0
- package/dist/cjs/js/src/abstract/ndax.js +9 -0
- package/dist/cjs/js/src/abstract/novadax.js +9 -0
- package/dist/cjs/js/src/abstract/oceanex.js +9 -0
- package/dist/cjs/js/src/abstract/okcoin.js +9 -0
- package/dist/cjs/js/src/abstract/okx.js +9 -0
- package/dist/cjs/js/src/abstract/p2b.js +9 -0
- package/dist/cjs/js/src/abstract/paymium.js +9 -0
- package/dist/cjs/js/src/abstract/phemex.js +9 -0
- package/dist/cjs/js/src/abstract/poloniex.js +9 -0
- package/dist/cjs/js/src/abstract/poloniexfutures.js +9 -0
- package/dist/cjs/js/src/abstract/probit.js +9 -0
- package/dist/cjs/js/src/abstract/timex.js +9 -0
- package/dist/cjs/js/src/abstract/tokocrypto.js +9 -0
- package/dist/cjs/js/src/abstract/upbit.js +9 -0
- package/dist/cjs/js/src/abstract/wavesexchange.js +9 -0
- package/dist/cjs/js/src/abstract/wazirx.js +9 -0
- package/dist/cjs/js/src/abstract/whitebit.js +9 -0
- package/dist/cjs/js/src/abstract/woo.js +9 -0
- package/dist/cjs/js/src/abstract/yobit.js +9 -0
- package/dist/cjs/js/src/abstract/zaif.js +9 -0
- package/dist/cjs/js/src/abstract/zonda.js +9 -0
- package/dist/cjs/js/src/ace.js +1058 -0
- package/dist/cjs/js/src/alpaca.js +1125 -0
- package/dist/cjs/js/src/ascendex.js +3360 -0
- package/dist/cjs/js/src/base/Exchange.js +5110 -0
- package/dist/cjs/js/src/base/Precise.js +263 -0
- package/dist/cjs/js/src/base/errors.js +299 -0
- package/dist/cjs/js/src/base/functions/crypto.js +78 -0
- package/dist/cjs/js/src/base/functions/encode.js +44 -0
- package/dist/cjs/js/src/base/functions/generic.js +193 -0
- package/dist/cjs/js/src/base/functions/misc.js +96 -0
- package/dist/cjs/js/src/base/functions/number.js +297 -0
- package/dist/cjs/js/src/base/functions/platform.js +28 -0
- package/dist/cjs/js/src/base/functions/rsa.js +34 -0
- package/dist/cjs/js/src/base/functions/string.js +48 -0
- package/dist/cjs/js/src/base/functions/throttle.js +66 -0
- package/dist/cjs/js/src/base/functions/time.js +187 -0
- package/dist/cjs/js/src/base/functions/totp.js +24 -0
- package/dist/cjs/js/src/base/functions/type.js +162 -0
- package/dist/cjs/js/src/base/functions.js +157 -0
- package/dist/cjs/js/src/base/ws/Cache.js +254 -0
- package/dist/cjs/js/src/base/ws/Client.js +299 -0
- package/dist/cjs/js/src/base/ws/Future.js +34 -0
- package/dist/cjs/js/src/base/ws/OrderBook.js +107 -0
- package/dist/cjs/js/src/base/ws/OrderBookSide.js +281 -0
- package/dist/cjs/js/src/base/ws/WsClient.js +69 -0
- package/dist/cjs/js/src/bequant.js +33 -0
- package/dist/cjs/js/src/bigone.js +2142 -0
- package/dist/cjs/js/src/binance.js +9729 -0
- package/dist/cjs/js/src/binancecoinm.js +45 -0
- package/dist/cjs/js/src/binanceus.js +84 -0
- package/dist/cjs/js/src/binanceusdm.js +58 -0
- package/dist/cjs/js/src/bingx.js +3737 -0
- package/dist/cjs/js/src/bit2c.js +916 -0
- package/dist/cjs/js/src/bitbank.js +1000 -0
- package/dist/cjs/js/src/bitbay.js +17 -0
- package/dist/cjs/js/src/bitbns.js +1220 -0
- package/dist/cjs/js/src/bitcoincom.js +17 -0
- package/dist/cjs/js/src/bitfinex.js +1670 -0
- package/dist/cjs/js/src/bitfinex2.js +2990 -0
- package/dist/cjs/js/src/bitflyer.js +1045 -0
- package/dist/cjs/js/src/bitforex.js +852 -0
- package/dist/cjs/js/src/bitget.js +8284 -0
- package/dist/cjs/js/src/bithumb.js +1090 -0
- package/dist/cjs/js/src/bitmart.js +4454 -0
- package/dist/cjs/js/src/bitmex.js +2884 -0
- package/dist/cjs/js/src/bitopro.js +1724 -0
- package/dist/cjs/js/src/bitpanda.js +2002 -0
- package/dist/cjs/js/src/bitrue.js +3253 -0
- package/dist/cjs/js/src/bitso.js +1753 -0
- package/dist/cjs/js/src/bitstamp.js +2188 -0
- package/dist/cjs/js/src/bitteam.js +2309 -0
- package/dist/cjs/js/src/bitvavo.js +1968 -0
- package/dist/cjs/js/src/bl3p.js +447 -0
- package/dist/cjs/js/src/blockchaincom.js +1160 -0
- package/dist/cjs/js/src/btcalpha.js +929 -0
- package/dist/cjs/js/src/btcbox.js +565 -0
- package/dist/cjs/js/src/btcmarkets.js +1237 -0
- package/dist/cjs/js/src/btcturk.js +929 -0
- package/dist/cjs/js/src/bybit.js +7646 -0
- package/dist/cjs/js/src/cex.js +1693 -0
- package/dist/cjs/js/src/coinbase.js +3274 -0
- package/dist/cjs/js/src/coinbasepro.js +1866 -0
- package/dist/cjs/js/src/coincheck.js +843 -0
- package/dist/cjs/js/src/coinex.js +5414 -0
- package/dist/cjs/js/src/coinlist.js +2329 -0
- package/dist/cjs/js/src/coinmate.js +989 -0
- package/dist/cjs/js/src/coinone.js +1185 -0
- package/dist/cjs/js/src/coinsph.js +1933 -0
- package/dist/cjs/js/src/coinspot.js +548 -0
- package/dist/cjs/js/src/cryptocom.js +3007 -0
- package/dist/cjs/js/src/currencycom.js +2015 -0
- package/dist/cjs/js/src/delta.js +3256 -0
- package/dist/cjs/js/src/deribit.js +3306 -0
- package/dist/cjs/js/src/digifinex.js +4307 -0
- package/dist/cjs/js/src/exmo.js +2645 -0
- package/dist/cjs/js/src/fmfwio.js +34 -0
- package/dist/cjs/js/src/gate.js +7054 -0
- package/dist/cjs/js/src/gateio.js +16 -0
- package/dist/cjs/js/src/gemini.js +1801 -0
- package/dist/cjs/js/src/hitbtc.js +3660 -0
- package/dist/cjs/js/src/hitbtc3.js +19 -0
- package/dist/cjs/js/src/hollaex.js +1882 -0
- package/dist/cjs/js/src/htx.js +9024 -0
- package/dist/cjs/js/src/huobi.js +16 -0
- package/dist/cjs/js/src/huobijp.js +1918 -0
- package/dist/cjs/js/src/idex.js +1770 -0
- package/dist/cjs/js/src/independentreserve.js +759 -0
- package/dist/cjs/js/src/indodax.js +1069 -0
- package/dist/cjs/js/src/kraken.js +2861 -0
- package/dist/cjs/js/src/krakenfutures.js +2407 -0
- package/dist/cjs/js/src/kucoin.js +4489 -0
- package/dist/cjs/js/src/kucoinfutures.js +2475 -0
- package/dist/cjs/js/src/kuna.js +1949 -0
- package/dist/cjs/js/src/latoken.js +1729 -0
- package/dist/cjs/js/src/lbank.js +2825 -0
- package/dist/cjs/js/src/luno.js +1044 -0
- package/dist/cjs/js/src/lykke.js +1303 -0
- package/dist/cjs/js/src/mercado.js +897 -0
- package/dist/cjs/js/src/mexc.js +5407 -0
- package/dist/cjs/js/src/ndax.js +2450 -0
- package/dist/cjs/js/src/novadax.js +1556 -0
- package/dist/cjs/js/src/oceanex.js +964 -0
- package/dist/cjs/js/src/okcoin.js +3115 -0
- package/dist/cjs/js/src/okx.js +7329 -0
- package/dist/cjs/js/src/p2b.js +1243 -0
- package/dist/cjs/js/src/paymium.js +597 -0
- package/dist/cjs/js/src/phemex.js +4715 -0
- package/dist/cjs/js/src/poloniex.js +2356 -0
- package/dist/cjs/js/src/poloniexfutures.js +1794 -0
- package/dist/cjs/js/src/pro/alpaca.js +714 -0
- package/dist/cjs/js/src/pro/ascendex.js +957 -0
- package/dist/cjs/js/src/pro/bequant.js +33 -0
- package/dist/cjs/js/src/pro/binance.js +2796 -0
- package/dist/cjs/js/src/pro/binancecoinm.js +23 -0
- package/dist/cjs/js/src/pro/binanceus.js +51 -0
- package/dist/cjs/js/src/pro/binanceusdm.js +32 -0
- package/dist/cjs/js/src/pro/bingx.js +944 -0
- package/dist/cjs/js/src/pro/bitcoincom.js +29 -0
- package/dist/cjs/js/src/pro/bitfinex.js +672 -0
- package/dist/cjs/js/src/pro/bitfinex2.js +1159 -0
- package/dist/cjs/js/src/pro/bitget.js +1733 -0
- package/dist/cjs/js/src/pro/bitmart.js +1486 -0
- package/dist/cjs/js/src/pro/bitmex.js +1576 -0
- package/dist/cjs/js/src/pro/bitopro.js +327 -0
- package/dist/cjs/js/src/pro/bitpanda.js +1341 -0
- package/dist/cjs/js/src/pro/bitrue.js +462 -0
- package/dist/cjs/js/src/pro/bitstamp.js +547 -0
- package/dist/cjs/js/src/pro/bitvavo.js +704 -0
- package/dist/cjs/js/src/pro/blockchaincom.js +794 -0
- package/dist/cjs/js/src/pro/bybit.js +1843 -0
- package/dist/cjs/js/src/pro/cex.js +1510 -0
- package/dist/cjs/js/src/pro/coinbase.js +561 -0
- package/dist/cjs/js/src/pro/coinbasepro.js +968 -0
- package/dist/cjs/js/src/pro/coinex.js +1095 -0
- package/dist/cjs/js/src/pro/cryptocom.js +1020 -0
- package/dist/cjs/js/src/pro/currencycom.js +563 -0
- package/dist/cjs/js/src/pro/deribit.js +825 -0
- package/dist/cjs/js/src/pro/exmo.js +658 -0
- package/dist/cjs/js/src/pro/gate.js +1316 -0
- package/dist/cjs/js/src/pro/gateio.js +16 -0
- package/dist/cjs/js/src/pro/gemini.js +649 -0
- package/dist/cjs/js/src/pro/hitbtc.js +1293 -0
- package/dist/cjs/js/src/pro/hollaex.js +597 -0
- package/dist/cjs/js/src/pro/htx.js +2383 -0
- package/dist/cjs/js/src/pro/huobi.js +16 -0
- package/dist/cjs/js/src/pro/huobijp.js +606 -0
- package/dist/cjs/js/src/pro/idex.js +714 -0
- package/dist/cjs/js/src/pro/independentreserve.js +280 -0
- package/dist/cjs/js/src/pro/kraken.js +1364 -0
- package/dist/cjs/js/src/pro/krakenfutures.js +1500 -0
- package/dist/cjs/js/src/pro/kucoin.js +1052 -0
- package/dist/cjs/js/src/pro/kucoinfutures.js +981 -0
- package/dist/cjs/js/src/pro/luno.js +322 -0
- package/dist/cjs/js/src/pro/mexc.js +1170 -0
- package/dist/cjs/js/src/pro/ndax.js +545 -0
- package/dist/cjs/js/src/pro/okcoin.js +760 -0
- package/dist/cjs/js/src/pro/okx.js +1558 -0
- package/dist/cjs/js/src/pro/phemex.js +1511 -0
- package/dist/cjs/js/src/pro/poloniex.js +1253 -0
- package/dist/cjs/js/src/pro/poloniexfutures.js +1014 -0
- package/dist/cjs/js/src/pro/probit.js +586 -0
- package/dist/cjs/js/src/pro/upbit.js +234 -0
- package/dist/cjs/js/src/pro/wazirx.js +776 -0
- package/dist/cjs/js/src/pro/whitebit.js +927 -0
- package/dist/cjs/js/src/pro/woo.js +769 -0
- package/dist/cjs/js/src/probit.js +1865 -0
- package/dist/cjs/js/src/static_dependencies/fflake/browser.js +401 -0
- package/dist/cjs/js/src/static_dependencies/jsencrypt/JSEncrypt.js +195 -0
- package/dist/cjs/js/src/static_dependencies/jsencrypt/JSEncryptRSAKey.js +308 -0
- package/dist/cjs/js/src/static_dependencies/jsencrypt/lib/asn1js/asn1.js +554 -0
- package/dist/cjs/js/src/static_dependencies/jsencrypt/lib/asn1js/base64.js +94 -0
- package/dist/cjs/js/src/static_dependencies/jsencrypt/lib/asn1js/hex.js +70 -0
- package/dist/cjs/js/src/static_dependencies/jsencrypt/lib/asn1js/int10.js +91 -0
- package/dist/cjs/js/src/static_dependencies/jsencrypt/lib/jsbn/base64.js +16 -0
- package/dist/cjs/js/src/static_dependencies/jsencrypt/lib/jsbn/jsbn.js +1760 -0
- package/dist/cjs/js/src/static_dependencies/jsencrypt/lib/jsbn/prng4.js +52 -0
- package/dist/cjs/js/src/static_dependencies/jsencrypt/lib/jsbn/rng.js +81 -0
- package/dist/cjs/js/src/static_dependencies/jsencrypt/lib/jsbn/rsa.js +376 -0
- package/dist/cjs/js/src/static_dependencies/jsencrypt/lib/jsbn/util.js +70 -0
- package/dist/cjs/js/src/static_dependencies/jsencrypt/lib/jsrsasign/asn1-1.0.js +1580 -0
- package/dist/cjs/js/src/static_dependencies/jsencrypt/lib/jsrsasign/yahoo.js +74 -0
- package/dist/cjs/js/src/static_dependencies/noble-curves/_shortw_utils.js +24 -0
- package/dist/cjs/js/src/static_dependencies/noble-curves/abstract/curve.js +158 -0
- package/dist/cjs/js/src/static_dependencies/noble-curves/abstract/edwards.js +429 -0
- package/dist/cjs/js/src/static_dependencies/noble-curves/abstract/hash-to-curve.js +176 -0
- package/dist/cjs/js/src/static_dependencies/noble-curves/abstract/modular.js +324 -0
- package/dist/cjs/js/src/static_dependencies/noble-curves/abstract/montgomery.js +163 -0
- package/dist/cjs/js/src/static_dependencies/noble-curves/abstract/utils.js +245 -0
- package/dist/cjs/js/src/static_dependencies/noble-curves/abstract/weierstrass.js +1018 -0
- package/dist/cjs/js/src/static_dependencies/noble-curves/ed25519.js +383 -0
- package/dist/cjs/js/src/static_dependencies/noble-curves/secp256k1.js +258 -0
- package/dist/cjs/js/src/static_dependencies/noble-hashes/_assert.js +53 -0
- package/dist/cjs/js/src/static_dependencies/noble-hashes/_sha2.js +120 -0
- package/dist/cjs/js/src/static_dependencies/noble-hashes/_u64.js +69 -0
- package/dist/cjs/js/src/static_dependencies/noble-hashes/crypto.js +7 -0
- package/dist/cjs/js/src/static_dependencies/noble-hashes/hmac.js +83 -0
- package/dist/cjs/js/src/static_dependencies/noble-hashes/md5.js +240 -0
- package/dist/cjs/js/src/static_dependencies/noble-hashes/sha1.js +91 -0
- package/dist/cjs/js/src/static_dependencies/noble-hashes/sha256.js +130 -0
- package/dist/cjs/js/src/static_dependencies/noble-hashes/sha3.js +214 -0
- package/dist/cjs/js/src/static_dependencies/noble-hashes/sha512.js +239 -0
- package/dist/cjs/js/src/static_dependencies/noble-hashes/utils.js +93 -0
- package/dist/cjs/js/src/static_dependencies/node-fetch/body.js +354 -0
- package/dist/cjs/js/src/static_dependencies/node-fetch/errors/abort-error.js +16 -0
- package/dist/cjs/js/src/static_dependencies/node-fetch/errors/base.js +20 -0
- package/dist/cjs/js/src/static_dependencies/node-fetch/errors/fetch-error.js +30 -0
- package/dist/cjs/js/src/static_dependencies/node-fetch/headers.js +239 -0
- package/dist/cjs/js/src/static_dependencies/node-fetch/index.js +372 -0
- package/dist/cjs/js/src/static_dependencies/node-fetch/request.js +273 -0
- package/dist/cjs/js/src/static_dependencies/node-fetch/response.js +139 -0
- package/dist/cjs/js/src/static_dependencies/node-fetch/utils/get-search.js +14 -0
- package/dist/cjs/js/src/static_dependencies/node-fetch/utils/is-redirect.js +16 -0
- package/dist/cjs/js/src/static_dependencies/node-fetch/utils/is.js +81 -0
- package/dist/cjs/js/src/static_dependencies/node-fetch/utils/referrer.js +292 -0
- package/dist/cjs/js/src/static_dependencies/proxies/agent-base/index.js +103 -0
- package/dist/cjs/js/src/static_dependencies/proxies/http-proxy-agent/index.js +140 -0
- package/dist/cjs/js/src/static_dependencies/proxies/https-proxy-agent/index.js +175 -0
- package/dist/cjs/js/src/static_dependencies/proxies/https-proxy-agent/parse-proxy-response.js +95 -0
- package/dist/cjs/js/src/static_dependencies/qs/index.cjs.js +7 -0
- package/dist/cjs/js/src/static_dependencies/scure-base/index.js +383 -0
- package/dist/cjs/js/src/timex.js +1562 -0
- package/dist/cjs/js/src/tokocrypto.js +2542 -0
- package/dist/cjs/js/src/upbit.js +1844 -0
- package/dist/cjs/js/src/wavesexchange.js +2607 -0
- package/dist/cjs/js/src/wazirx.js +953 -0
- package/dist/cjs/js/src/whitebit.js +2309 -0
- package/dist/cjs/js/src/woo.js +2715 -0
- package/dist/cjs/js/src/yobit.js +1314 -0
- package/dist/cjs/js/src/zaif.js +736 -0
- package/dist/cjs/js/src/zonda.js +1883 -0
- package/js/ccxt.d.ts +1 -1
- package/js/ccxt.js +1 -1
- package/js/src/abstract/bigone.d.ts +18 -0
- package/js/src/abstract/binance.d.ts +2 -0
- package/js/src/abstract/binancecoinm.d.ts +2 -0
- package/js/src/abstract/binanceus.d.ts +2 -0
- package/js/src/abstract/binanceusdm.d.ts +2 -0
- package/js/src/abstract/bybit.d.ts +1 -0
- package/js/src/abstract/gate.d.ts +11 -0
- package/js/src/abstract/gateio.d.ts +11 -0
- package/js/src/alpaca.js +18 -18
- package/js/src/base/Exchange.d.ts +5 -1
- package/js/src/base/Exchange.js +101 -12
- package/js/src/bigone.d.ts +1 -2
- package/js/src/bigone.js +340 -145
- package/js/src/binance.js +15 -8
- package/js/src/bingx.js +9 -2
- package/js/src/bitfinex.d.ts +2 -2
- package/js/src/bitfinex.js +2 -3
- package/js/src/bitget.js +21 -8
- package/js/src/bitmart.d.ts +2 -2
- package/js/src/bitmart.js +3 -3
- package/js/src/bitmex.js +1 -0
- package/js/src/bybit.js +2 -0
- package/js/src/coinlist.js +2 -3
- package/js/src/coinsph.js +2 -3
- package/js/src/deribit.js +1 -0
- package/js/src/gate.d.ts +4 -4
- package/js/src/gate.js +22 -3
- package/js/src/hitbtc.d.ts +4 -4
- package/js/src/hitbtc.js +2 -3
- package/js/src/htx.js +4 -7
- package/js/src/huobijp.js +2 -3
- package/js/src/kraken.js +1 -0
- package/js/src/mexc.js +2 -1
- package/js/src/okx.js +13 -3
- package/js/src/pro/binance.d.ts +2 -23
- package/js/src/pro/binance.js +58 -22
- package/js/src/pro/coinbase.d.ts +2 -2
- package/js/src/pro/coinbase.js +4 -1
- package/js/src/pro/coinbasepro.d.ts +2 -2
- package/js/src/pro/hitbtc.d.ts +2 -2
- package/js/src/pro/poloniex.d.ts +2 -2
- package/js/src/upbit.d.ts +3 -101
- package/js/src/upbit.js +12 -12
- package/js/src/woo.js +2 -0
- package/package.json +1 -1
- package/skip-tests.json +5 -0
|
@@ -0,0 +1,1125 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var alpaca$1 = require('./abstract/alpaca.js');
|
|
4
|
+
var errors = require('./base/errors.js');
|
|
5
|
+
var number = require('./base/functions/number.js');
|
|
6
|
+
|
|
7
|
+
// ---------------------------------------------------------------------------
|
|
8
|
+
// ---------------------------------------------------------------------------xs
|
|
9
|
+
/**
|
|
10
|
+
* @class alpaca
|
|
11
|
+
* @augments Exchange
|
|
12
|
+
*/
|
|
13
|
+
class alpaca extends alpaca$1 {
|
|
14
|
+
describe() {
|
|
15
|
+
return this.deepExtend(super.describe(), {
|
|
16
|
+
'id': 'alpaca',
|
|
17
|
+
'name': 'Alpaca',
|
|
18
|
+
'countries': ['US'],
|
|
19
|
+
// 3 req/s for free
|
|
20
|
+
// 150 req/s for subscribers: https://alpaca.markets/data
|
|
21
|
+
// for brokers: https://alpaca.markets/docs/api-references/broker-api/#authentication-and-rate-limit
|
|
22
|
+
'rateLimit': 333,
|
|
23
|
+
'hostname': 'alpaca.markets',
|
|
24
|
+
'pro': true,
|
|
25
|
+
'urls': {
|
|
26
|
+
'logo': 'https://user-images.githubusercontent.com/1294454/187234005-b864db3d-f1e3-447a-aaf9-a9fc7b955d07.jpg',
|
|
27
|
+
'www': 'https://alpaca.markets',
|
|
28
|
+
'api': {
|
|
29
|
+
'broker': 'https://broker-api.{hostname}',
|
|
30
|
+
'trader': 'https://api.{hostname}',
|
|
31
|
+
'market': 'https://data.{hostname}',
|
|
32
|
+
},
|
|
33
|
+
'test': {
|
|
34
|
+
'broker': 'https://broker-api.sandbox.{hostname}',
|
|
35
|
+
'trader': 'https://paper-api.{hostname}',
|
|
36
|
+
'market': 'https://data.sandbox.{hostname}',
|
|
37
|
+
},
|
|
38
|
+
'doc': 'https://alpaca.markets/docs/',
|
|
39
|
+
'fees': 'https://docs.alpaca.markets/docs/crypto-fees',
|
|
40
|
+
},
|
|
41
|
+
'has': {
|
|
42
|
+
'CORS': false,
|
|
43
|
+
'spot': true,
|
|
44
|
+
'margin': false,
|
|
45
|
+
'swap': false,
|
|
46
|
+
'future': false,
|
|
47
|
+
'option': false,
|
|
48
|
+
'cancelAllOrders': true,
|
|
49
|
+
'cancelOrder': true,
|
|
50
|
+
'closeAllPositions': false,
|
|
51
|
+
'closePosition': false,
|
|
52
|
+
'createOrder': true,
|
|
53
|
+
'fetchBalance': false,
|
|
54
|
+
'fetchBidsAsks': false,
|
|
55
|
+
'fetchClosedOrders': true,
|
|
56
|
+
'fetchCurrencies': false,
|
|
57
|
+
'fetchDepositAddress': false,
|
|
58
|
+
'fetchDepositAddressesByNetwork': false,
|
|
59
|
+
'fetchDeposits': false,
|
|
60
|
+
'fetchDepositsWithdrawals': false,
|
|
61
|
+
'fetchFundingHistory': false,
|
|
62
|
+
'fetchFundingRate': false,
|
|
63
|
+
'fetchFundingRates': false,
|
|
64
|
+
'fetchL1OrderBook': true,
|
|
65
|
+
'fetchL2OrderBook': false,
|
|
66
|
+
'fetchMarkets': true,
|
|
67
|
+
'fetchMyTrades': false,
|
|
68
|
+
'fetchOHLCV': true,
|
|
69
|
+
'fetchOpenOrder': false,
|
|
70
|
+
'fetchOpenOrders': true,
|
|
71
|
+
'fetchOrder': true,
|
|
72
|
+
'fetchOrderBook': true,
|
|
73
|
+
'fetchOrders': true,
|
|
74
|
+
'fetchPositions': false,
|
|
75
|
+
'fetchStatus': false,
|
|
76
|
+
'fetchTicker': false,
|
|
77
|
+
'fetchTickers': false,
|
|
78
|
+
'fetchTime': true,
|
|
79
|
+
'fetchTrades': true,
|
|
80
|
+
'fetchTradingFee': false,
|
|
81
|
+
'fetchTradingFees': false,
|
|
82
|
+
'fetchTransactionFees': false,
|
|
83
|
+
'fetchTransactions': false,
|
|
84
|
+
'fetchTransfers': false,
|
|
85
|
+
'fetchWithdrawals': false,
|
|
86
|
+
'setLeverage': false,
|
|
87
|
+
'setMarginMode': false,
|
|
88
|
+
'transfer': false,
|
|
89
|
+
'withdraw': false,
|
|
90
|
+
},
|
|
91
|
+
'api': {
|
|
92
|
+
'broker': {},
|
|
93
|
+
'trader': {
|
|
94
|
+
'private': {
|
|
95
|
+
'get': [
|
|
96
|
+
'v2/account',
|
|
97
|
+
'v2/orders',
|
|
98
|
+
'v2/orders/{order_id}',
|
|
99
|
+
'v2/positions',
|
|
100
|
+
'v2/positions/{symbol_or_asset_id}',
|
|
101
|
+
'v2/account/portfolio/history',
|
|
102
|
+
'v2/watchlists',
|
|
103
|
+
'v2/watchlists/{watchlist_id}',
|
|
104
|
+
'v2/watchlists:by_name',
|
|
105
|
+
'v2/account/configurations',
|
|
106
|
+
'v2/account/activities',
|
|
107
|
+
'v2/account/activities/{activity_type}',
|
|
108
|
+
'v2/calendar',
|
|
109
|
+
'v2/clock',
|
|
110
|
+
'v2/assets',
|
|
111
|
+
'v2/assets/{symbol_or_asset_id}',
|
|
112
|
+
'v2/corporate_actions/announcements/{id}',
|
|
113
|
+
'v2/corporate_actions/announcements',
|
|
114
|
+
],
|
|
115
|
+
'post': [
|
|
116
|
+
'v2/orders',
|
|
117
|
+
'v2/watchlists',
|
|
118
|
+
'v2/watchlists/{watchlist_id}',
|
|
119
|
+
'v2/watchlists:by_name',
|
|
120
|
+
],
|
|
121
|
+
'put': [
|
|
122
|
+
'v2/watchlists/{watchlist_id}',
|
|
123
|
+
'v2/watchlists:by_name',
|
|
124
|
+
],
|
|
125
|
+
'patch': [
|
|
126
|
+
'v2/orders/{order_id}',
|
|
127
|
+
'v2/account/configurations',
|
|
128
|
+
],
|
|
129
|
+
'delete': [
|
|
130
|
+
'v2/orders',
|
|
131
|
+
'v2/orders/{order_id}',
|
|
132
|
+
'v2/positions',
|
|
133
|
+
'v2/positions/{symbol_or_asset_id}',
|
|
134
|
+
'v2/watchlists/{watchlist_id}',
|
|
135
|
+
'v2/watchlists:by_name',
|
|
136
|
+
'v2/watchlists/{watchlist_id}/{symbol}',
|
|
137
|
+
],
|
|
138
|
+
},
|
|
139
|
+
},
|
|
140
|
+
'market': {
|
|
141
|
+
'public': {
|
|
142
|
+
'get': [
|
|
143
|
+
'v1beta3/crypto/{loc}/bars',
|
|
144
|
+
'v1beta3/crypto/{loc}/latest/bars',
|
|
145
|
+
'v1beta3/crypto/{loc}/latest/orderbooks',
|
|
146
|
+
'v1beta3/crypto/{loc}/latest/quotes',
|
|
147
|
+
'v1beta3/crypto/{loc}/latest/trades',
|
|
148
|
+
'v1beta3/crypto/{loc}/quotes',
|
|
149
|
+
'v1beta3/crypto/{loc}/snapshots',
|
|
150
|
+
'v1beta3/crypto/{loc}/trades',
|
|
151
|
+
],
|
|
152
|
+
},
|
|
153
|
+
'private': {
|
|
154
|
+
'get': [
|
|
155
|
+
'v1beta1/corporate-actions',
|
|
156
|
+
'v1beta1/forex/latest/rates',
|
|
157
|
+
'v1beta1/forex/rates',
|
|
158
|
+
'v1beta1/logos/{symbol}',
|
|
159
|
+
'v1beta1/news',
|
|
160
|
+
'v1beta1/screener/stocks/most-actives',
|
|
161
|
+
'v1beta1/screener/{market_type}/movers',
|
|
162
|
+
'v2/stocks/auctions',
|
|
163
|
+
'v2/stocks/bars',
|
|
164
|
+
'v2/stocks/bars/latest',
|
|
165
|
+
'v2/stocks/meta/conditions/{ticktype}',
|
|
166
|
+
'v2/stocks/meta/exchanges',
|
|
167
|
+
'v2/stocks/quotes',
|
|
168
|
+
'v2/stocks/quotes/latest',
|
|
169
|
+
'v2/stocks/snapshots',
|
|
170
|
+
'v2/stocks/trades',
|
|
171
|
+
'v2/stocks/trades/latest',
|
|
172
|
+
'v2/stocks/{symbol}/auctions',
|
|
173
|
+
'v2/stocks/{symbol}/bars',
|
|
174
|
+
'v2/stocks/{symbol}/bars/latest',
|
|
175
|
+
'v2/stocks/{symbol}/quotes',
|
|
176
|
+
'v2/stocks/{symbol}/quotes/latest',
|
|
177
|
+
'v2/stocks/{symbol}/snapshot',
|
|
178
|
+
'v2/stocks/{symbol}/trades',
|
|
179
|
+
'v2/stocks/{symbol}/trades/latest',
|
|
180
|
+
],
|
|
181
|
+
},
|
|
182
|
+
},
|
|
183
|
+
},
|
|
184
|
+
'timeframes': {
|
|
185
|
+
'1m': '1min',
|
|
186
|
+
'3m': '3min',
|
|
187
|
+
'5m': '5min',
|
|
188
|
+
'15m': '15min',
|
|
189
|
+
'30m': '30min',
|
|
190
|
+
'1h': '1H',
|
|
191
|
+
'2h': '2H',
|
|
192
|
+
'4h': '4H',
|
|
193
|
+
'6h': '6H',
|
|
194
|
+
'8h': '8H',
|
|
195
|
+
'12h': '12H',
|
|
196
|
+
'1d': '1D',
|
|
197
|
+
'3d': '3D',
|
|
198
|
+
'1w': '1W',
|
|
199
|
+
'1M': '1M',
|
|
200
|
+
},
|
|
201
|
+
'precisionMode': number.TICK_SIZE,
|
|
202
|
+
'requiredCredentials': {
|
|
203
|
+
'apiKey': true,
|
|
204
|
+
'secret': true,
|
|
205
|
+
},
|
|
206
|
+
'fees': {
|
|
207
|
+
'trading': {
|
|
208
|
+
'tierBased': true,
|
|
209
|
+
'percentage': true,
|
|
210
|
+
'maker': this.parseNumber('0.0015'),
|
|
211
|
+
'taker': this.parseNumber('0.0025'),
|
|
212
|
+
'tiers': {
|
|
213
|
+
'taker': [
|
|
214
|
+
[this.parseNumber('0'), this.parseNumber('0.0025')],
|
|
215
|
+
[this.parseNumber('100000'), this.parseNumber('0.0022')],
|
|
216
|
+
[this.parseNumber('500000'), this.parseNumber('0.0020')],
|
|
217
|
+
[this.parseNumber('1000000'), this.parseNumber('0.0018')],
|
|
218
|
+
[this.parseNumber('10000000'), this.parseNumber('0.0015')],
|
|
219
|
+
[this.parseNumber('25000000'), this.parseNumber('0.0013')],
|
|
220
|
+
[this.parseNumber('50000000'), this.parseNumber('0.0012')],
|
|
221
|
+
[this.parseNumber('100000000'), this.parseNumber('0.001')],
|
|
222
|
+
],
|
|
223
|
+
'maker': [
|
|
224
|
+
[this.parseNumber('0'), this.parseNumber('0.0015')],
|
|
225
|
+
[this.parseNumber('100000'), this.parseNumber('0.0012')],
|
|
226
|
+
[this.parseNumber('500000'), this.parseNumber('0.001')],
|
|
227
|
+
[this.parseNumber('1000000'), this.parseNumber('0.0008')],
|
|
228
|
+
[this.parseNumber('10000000'), this.parseNumber('0.0005')],
|
|
229
|
+
[this.parseNumber('25000000'), this.parseNumber('0.0002')],
|
|
230
|
+
[this.parseNumber('50000000'), this.parseNumber('0.0002')],
|
|
231
|
+
[this.parseNumber('100000000'), this.parseNumber('0.00')],
|
|
232
|
+
],
|
|
233
|
+
},
|
|
234
|
+
},
|
|
235
|
+
},
|
|
236
|
+
'headers': {
|
|
237
|
+
'APCA-PARTNER-ID': 'ccxt',
|
|
238
|
+
},
|
|
239
|
+
'options': {
|
|
240
|
+
'defaultExchange': 'CBSE',
|
|
241
|
+
'exchanges': [
|
|
242
|
+
'CBSE',
|
|
243
|
+
'FTX',
|
|
244
|
+
'GNSS',
|
|
245
|
+
'ERSX', // ErisX
|
|
246
|
+
],
|
|
247
|
+
'defaultTimeInForce': 'gtc',
|
|
248
|
+
'clientOrderId': 'ccxt_{id}',
|
|
249
|
+
},
|
|
250
|
+
'exceptions': {
|
|
251
|
+
'exact': {
|
|
252
|
+
'forbidden.': errors.PermissionDenied,
|
|
253
|
+
'40410000': errors.InvalidOrder,
|
|
254
|
+
'40010001': errors.BadRequest,
|
|
255
|
+
'40110000': errors.PermissionDenied,
|
|
256
|
+
'40310000': errors.InsufficientFunds,
|
|
257
|
+
'42910000': errors.RateLimitExceeded, // {"code":42910000,"message":"rate limit exceeded"}
|
|
258
|
+
},
|
|
259
|
+
'broad': {
|
|
260
|
+
'Invalid format for parameter': errors.BadRequest,
|
|
261
|
+
'Invalid symbol': errors.BadSymbol, // {"message":"Invalid symbol(s): BTC/USDdsda does not match ^[A-Z]+/[A-Z]+$"}
|
|
262
|
+
},
|
|
263
|
+
},
|
|
264
|
+
});
|
|
265
|
+
}
|
|
266
|
+
async fetchTime(params = {}) {
|
|
267
|
+
/**
|
|
268
|
+
* @method
|
|
269
|
+
* @name alpaca#fetchTime
|
|
270
|
+
* @description fetches the current integer timestamp in milliseconds from the exchange server
|
|
271
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
272
|
+
* @returns {int} the current integer timestamp in milliseconds from the exchange server
|
|
273
|
+
*/
|
|
274
|
+
const response = await this.traderPrivateGetV2Clock(params);
|
|
275
|
+
//
|
|
276
|
+
// {
|
|
277
|
+
// timestamp: '2023-11-22T08:07:57.654738097-05:00',
|
|
278
|
+
// is_open: false,
|
|
279
|
+
// next_open: '2023-11-22T09:30:00-05:00',
|
|
280
|
+
// next_close: '2023-11-22T16:00:00-05:00'
|
|
281
|
+
// }
|
|
282
|
+
//
|
|
283
|
+
const timestamp = this.safeString(response, 'timestamp');
|
|
284
|
+
const localTime = timestamp.slice(0, 23);
|
|
285
|
+
const jetlagStrStart = timestamp.length - 6;
|
|
286
|
+
const jetlagStrEnd = timestamp.length - 3;
|
|
287
|
+
const jetlag = timestamp.slice(jetlagStrStart, jetlagStrEnd);
|
|
288
|
+
const iso = this.parse8601(localTime) - this.parseToNumeric(jetlag) * 3600 * 1000;
|
|
289
|
+
return iso;
|
|
290
|
+
}
|
|
291
|
+
async fetchMarkets(params = {}) {
|
|
292
|
+
/**
|
|
293
|
+
* @method
|
|
294
|
+
* @name alpaca#fetchMarkets
|
|
295
|
+
* @description retrieves data on all markets for alpaca
|
|
296
|
+
* @see https://docs.alpaca.markets/reference/get-v2-assets
|
|
297
|
+
* @param {object} [params] extra parameters specific to the exchange api endpoint
|
|
298
|
+
* @returns {object[]} an array of objects representing market data
|
|
299
|
+
*/
|
|
300
|
+
const request = {
|
|
301
|
+
'asset_class': 'crypto',
|
|
302
|
+
'status': 'active',
|
|
303
|
+
};
|
|
304
|
+
const assets = await this.traderPrivateGetV2Assets(this.extend(request, params));
|
|
305
|
+
//
|
|
306
|
+
// [
|
|
307
|
+
// {
|
|
308
|
+
// "id": "c150e086-1e75-44e6-9c2c-093bb1e93139",
|
|
309
|
+
// "class": "crypto",
|
|
310
|
+
// "exchange": "CRYPTO",
|
|
311
|
+
// "symbol": "BTC/USDT",
|
|
312
|
+
// "name": "Bitcoin / USD Tether",
|
|
313
|
+
// "status": "active",
|
|
314
|
+
// "tradable": true,
|
|
315
|
+
// "marginable": false,
|
|
316
|
+
// "maintenance_margin_requirement": 100,
|
|
317
|
+
// "shortable": false,
|
|
318
|
+
// "easy_to_borrow": false,
|
|
319
|
+
// "fractionable": true,
|
|
320
|
+
// "attributes": [],
|
|
321
|
+
// "min_order_size": "0.000026873",
|
|
322
|
+
// "min_trade_increment": "0.000000001",
|
|
323
|
+
// "price_increment": "1"
|
|
324
|
+
// }
|
|
325
|
+
// ]
|
|
326
|
+
//
|
|
327
|
+
return this.parseMarkets(assets);
|
|
328
|
+
}
|
|
329
|
+
parseMarket(asset) {
|
|
330
|
+
//
|
|
331
|
+
// {
|
|
332
|
+
// "id": "c150e086-1e75-44e6-9c2c-093bb1e93139",
|
|
333
|
+
// "class": "crypto",
|
|
334
|
+
// "exchange": "CRYPTO",
|
|
335
|
+
// "symbol": "BTC/USDT",
|
|
336
|
+
// "name": "Bitcoin / USD Tether",
|
|
337
|
+
// "status": "active",
|
|
338
|
+
// "tradable": true,
|
|
339
|
+
// "marginable": false,
|
|
340
|
+
// "maintenance_margin_requirement": 100,
|
|
341
|
+
// "shortable": false,
|
|
342
|
+
// "easy_to_borrow": false,
|
|
343
|
+
// "fractionable": true,
|
|
344
|
+
// "attributes": [],
|
|
345
|
+
// "min_order_size": "0.000026873",
|
|
346
|
+
// "min_trade_increment": "0.000000001",
|
|
347
|
+
// "price_increment": "1"
|
|
348
|
+
// }
|
|
349
|
+
//
|
|
350
|
+
const marketId = this.safeString(asset, 'symbol');
|
|
351
|
+
const parts = marketId.split('/');
|
|
352
|
+
const assetClass = this.safeString(asset, 'class');
|
|
353
|
+
const baseId = this.safeString(parts, 0);
|
|
354
|
+
const quoteId = this.safeString(parts, 1);
|
|
355
|
+
const base = this.safeCurrencyCode(baseId);
|
|
356
|
+
let quote = this.safeCurrencyCode(quoteId);
|
|
357
|
+
// Us equity markets do not include quote in symbol.
|
|
358
|
+
// We can safely coerce us_equity quote to USD
|
|
359
|
+
if (quote === undefined && assetClass === 'us_equity') {
|
|
360
|
+
quote = 'USD';
|
|
361
|
+
}
|
|
362
|
+
const symbol = base + '/' + quote;
|
|
363
|
+
const status = this.safeString(asset, 'status');
|
|
364
|
+
const active = (status === 'active');
|
|
365
|
+
const minAmount = this.safeNumber(asset, 'min_order_size');
|
|
366
|
+
const amount = this.safeNumber(asset, 'min_trade_increment');
|
|
367
|
+
const price = this.safeNumber(asset, 'price_increment');
|
|
368
|
+
return {
|
|
369
|
+
'id': marketId,
|
|
370
|
+
'symbol': symbol,
|
|
371
|
+
'base': base,
|
|
372
|
+
'quote': quote,
|
|
373
|
+
'settle': undefined,
|
|
374
|
+
'baseId': baseId,
|
|
375
|
+
'quoteId': quoteId,
|
|
376
|
+
'settleId': undefined,
|
|
377
|
+
'type': 'spot',
|
|
378
|
+
'spot': true,
|
|
379
|
+
'margin': undefined,
|
|
380
|
+
'swap': false,
|
|
381
|
+
'future': false,
|
|
382
|
+
'option': false,
|
|
383
|
+
'active': active,
|
|
384
|
+
'contract': false,
|
|
385
|
+
'linear': undefined,
|
|
386
|
+
'inverse': undefined,
|
|
387
|
+
'contractSize': undefined,
|
|
388
|
+
'expiry': undefined,
|
|
389
|
+
'expiryDatetime': undefined,
|
|
390
|
+
'strike': undefined,
|
|
391
|
+
'optionType': undefined,
|
|
392
|
+
'precision': {
|
|
393
|
+
'amount': amount,
|
|
394
|
+
'price': price,
|
|
395
|
+
},
|
|
396
|
+
'limits': {
|
|
397
|
+
'leverage': {
|
|
398
|
+
'min': undefined,
|
|
399
|
+
'max': undefined,
|
|
400
|
+
},
|
|
401
|
+
'amount': {
|
|
402
|
+
'min': minAmount,
|
|
403
|
+
'max': undefined,
|
|
404
|
+
},
|
|
405
|
+
'price': {
|
|
406
|
+
'min': undefined,
|
|
407
|
+
'max': undefined,
|
|
408
|
+
},
|
|
409
|
+
'cost': {
|
|
410
|
+
'min': undefined,
|
|
411
|
+
'max': undefined,
|
|
412
|
+
},
|
|
413
|
+
},
|
|
414
|
+
'created': undefined,
|
|
415
|
+
'info': asset,
|
|
416
|
+
};
|
|
417
|
+
}
|
|
418
|
+
async fetchTrades(symbol, since = undefined, limit = undefined, params = {}) {
|
|
419
|
+
/**
|
|
420
|
+
* @method
|
|
421
|
+
* @name alpaca#fetchTrades
|
|
422
|
+
* @description get the list of most recent trades for a particular symbol
|
|
423
|
+
* @see https://docs.alpaca.markets/reference/cryptotrades
|
|
424
|
+
* @see https://docs.alpaca.markets/reference/cryptolatesttrades
|
|
425
|
+
* @param {string} symbol unified symbol of the market to fetch trades for
|
|
426
|
+
* @param {int} [since] timestamp in ms of the earliest trade to fetch
|
|
427
|
+
* @param {int} [limit] the maximum amount of trades to fetch
|
|
428
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
429
|
+
* @param {string} [params.loc] crypto location, default: us
|
|
430
|
+
* @param {string} [params.method] method, default: marketPublicGetV1beta3CryptoLocTrades
|
|
431
|
+
* @returns {Trade[]} a list of [trade structures]{@link https://docs.ccxt.com/#/?id=public-trades}
|
|
432
|
+
*/
|
|
433
|
+
await this.loadMarkets();
|
|
434
|
+
const market = this.market(symbol);
|
|
435
|
+
const marketId = market['id'];
|
|
436
|
+
const loc = this.safeString(params, 'loc', 'us');
|
|
437
|
+
const method = this.safeString(params, 'method', 'marketPublicGetV1beta3CryptoLocTrades');
|
|
438
|
+
const request = {
|
|
439
|
+
'symbols': marketId,
|
|
440
|
+
'loc': loc,
|
|
441
|
+
};
|
|
442
|
+
params = this.omit(params, ['loc', 'method']);
|
|
443
|
+
let response = undefined;
|
|
444
|
+
if (method === 'marketPublicGetV1beta3CryptoLocTrades') {
|
|
445
|
+
if (since !== undefined) {
|
|
446
|
+
request['start'] = this.iso8601(since);
|
|
447
|
+
}
|
|
448
|
+
if (limit !== undefined) {
|
|
449
|
+
request['limit'] = limit;
|
|
450
|
+
}
|
|
451
|
+
response = await this.marketPublicGetV1beta3CryptoLocTrades(this.extend(request, params));
|
|
452
|
+
}
|
|
453
|
+
else if (method === 'marketPublicGetV1beta3CryptoLocLatestTrades') {
|
|
454
|
+
response = await this.marketPublicGetV1beta3CryptoLocLatestTrades(this.extend(request, params));
|
|
455
|
+
}
|
|
456
|
+
else {
|
|
457
|
+
throw new errors.NotSupported(this.id + ' fetchTrades() does not support ' + method + ', marketPublicGetV1beta3CryptoLocTrades and marketPublicGetV1beta3CryptoLocLatestTrades are supported');
|
|
458
|
+
}
|
|
459
|
+
//
|
|
460
|
+
// {
|
|
461
|
+
// "next_page_token":null,
|
|
462
|
+
// "trades":{
|
|
463
|
+
// "BTC/USD":[
|
|
464
|
+
// {
|
|
465
|
+
// "i":36440704,
|
|
466
|
+
// "p":22625,
|
|
467
|
+
// "s":0.0001,
|
|
468
|
+
// "t":"2022-07-21T11:47:31.073391Z",
|
|
469
|
+
// "tks":"B"
|
|
470
|
+
// }
|
|
471
|
+
// ]
|
|
472
|
+
// }
|
|
473
|
+
// }
|
|
474
|
+
//
|
|
475
|
+
// {
|
|
476
|
+
// "trades":{
|
|
477
|
+
// "BTC/USD":{
|
|
478
|
+
// "i":36440704,
|
|
479
|
+
// "p":22625,
|
|
480
|
+
// "s":0.0001,
|
|
481
|
+
// "t":"2022-07-21T11:47:31.073391Z",
|
|
482
|
+
// "tks":"B"
|
|
483
|
+
// }
|
|
484
|
+
// }
|
|
485
|
+
// }
|
|
486
|
+
//
|
|
487
|
+
const trades = this.safeValue(response, 'trades', {});
|
|
488
|
+
let symbolTrades = this.safeValue(trades, marketId, {});
|
|
489
|
+
if (!Array.isArray(symbolTrades)) {
|
|
490
|
+
symbolTrades = [symbolTrades];
|
|
491
|
+
}
|
|
492
|
+
return this.parseTrades(symbolTrades, market, since, limit);
|
|
493
|
+
}
|
|
494
|
+
async fetchOrderBook(symbol, limit = undefined, params = {}) {
|
|
495
|
+
/**
|
|
496
|
+
* @method
|
|
497
|
+
* @name alpaca#fetchOrderBook
|
|
498
|
+
* @description fetches information on open orders with bid (buy) and ask (sell) prices, volumes and other data
|
|
499
|
+
* @see https://docs.alpaca.markets/reference/cryptolatestorderbooks
|
|
500
|
+
* @param {string} symbol unified symbol of the market to fetch the order book for
|
|
501
|
+
* @param {int} [limit] the maximum amount of order book entries to return
|
|
502
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
503
|
+
* @param {string} [params.loc] crypto location, default: us
|
|
504
|
+
* @returns {object} A dictionary of [order book structures]{@link https://github.com/ccxt/ccxt/wiki/Manual#order-book-structure} indexed by market symbols
|
|
505
|
+
*/
|
|
506
|
+
await this.loadMarkets();
|
|
507
|
+
const market = this.market(symbol);
|
|
508
|
+
const id = market['id'];
|
|
509
|
+
const loc = this.safeString(params, 'loc', 'us');
|
|
510
|
+
const request = {
|
|
511
|
+
'symbols': id,
|
|
512
|
+
'loc': loc,
|
|
513
|
+
};
|
|
514
|
+
const response = await this.marketPublicGetV1beta3CryptoLocLatestOrderbooks(this.extend(request, params));
|
|
515
|
+
//
|
|
516
|
+
// {
|
|
517
|
+
// "orderbooks":{
|
|
518
|
+
// "BTC/USD":{
|
|
519
|
+
// "a":[
|
|
520
|
+
// {
|
|
521
|
+
// "p":22208,
|
|
522
|
+
// "s":0.0051
|
|
523
|
+
// },
|
|
524
|
+
// {
|
|
525
|
+
// "p":22209,
|
|
526
|
+
// "s":0.1123
|
|
527
|
+
// },
|
|
528
|
+
// {
|
|
529
|
+
// "p":22210,
|
|
530
|
+
// "s":0.2465
|
|
531
|
+
// }
|
|
532
|
+
// ],
|
|
533
|
+
// "b":[
|
|
534
|
+
// {
|
|
535
|
+
// "p":22203,
|
|
536
|
+
// "s":0.395
|
|
537
|
+
// },
|
|
538
|
+
// {
|
|
539
|
+
// "p":22202,
|
|
540
|
+
// "s":0.2465
|
|
541
|
+
// },
|
|
542
|
+
// {
|
|
543
|
+
// "p":22201,
|
|
544
|
+
// "s":0.6455
|
|
545
|
+
// }
|
|
546
|
+
// ],
|
|
547
|
+
// "t":"2022-07-19T13:41:55.13210112Z"
|
|
548
|
+
// }
|
|
549
|
+
// }
|
|
550
|
+
// }
|
|
551
|
+
//
|
|
552
|
+
const orderbooks = this.safeValue(response, 'orderbooks', {});
|
|
553
|
+
const rawOrderbook = this.safeValue(orderbooks, id, {});
|
|
554
|
+
const timestamp = this.parse8601(this.safeString(rawOrderbook, 't'));
|
|
555
|
+
return this.parseOrderBook(rawOrderbook, market['symbol'], timestamp, 'b', 'a', 'p', 's');
|
|
556
|
+
}
|
|
557
|
+
async fetchOHLCV(symbol, timeframe = '1m', since = undefined, limit = undefined, params = {}) {
|
|
558
|
+
/**
|
|
559
|
+
* @method
|
|
560
|
+
* @name alpaca#fetchOHLCV
|
|
561
|
+
* @description fetches historical candlestick data containing the open, high, low, and close price, and the volume of a market
|
|
562
|
+
* @see https://docs.alpaca.markets/reference/cryptobars
|
|
563
|
+
* @see https://docs.alpaca.markets/reference/cryptolatestbars
|
|
564
|
+
* @param {string} symbol unified symbol of the market to fetch OHLCV data for
|
|
565
|
+
* @param {string} timeframe the length of time each candle represents
|
|
566
|
+
* @param {int} [since] timestamp in ms of the earliest candle to fetch
|
|
567
|
+
* @param {int} [limit] the maximum amount of candles to fetch
|
|
568
|
+
* @param {object} [params] extra parameters specific to the alpha api endpoint
|
|
569
|
+
* @param {string} [params.loc] crypto location, default: us
|
|
570
|
+
* @param {string} [params.method] method, default: marketPublicGetV1beta3CryptoLocBars
|
|
571
|
+
* @returns {int[][]} A list of candles ordered as timestamp, open, high, low, close, volume
|
|
572
|
+
*/
|
|
573
|
+
await this.loadMarkets();
|
|
574
|
+
const market = this.market(symbol);
|
|
575
|
+
const marketId = market['id'];
|
|
576
|
+
const loc = this.safeString(params, 'loc', 'us');
|
|
577
|
+
const method = this.safeString(params, 'method', 'marketPublicGetV1beta3CryptoLocBars');
|
|
578
|
+
const request = {
|
|
579
|
+
'symbols': marketId,
|
|
580
|
+
'loc': loc,
|
|
581
|
+
};
|
|
582
|
+
params = this.omit(params, ['loc', 'method']);
|
|
583
|
+
let response = undefined;
|
|
584
|
+
if (method === 'marketPublicGetV1beta3CryptoLocBars') {
|
|
585
|
+
if (limit !== undefined) {
|
|
586
|
+
request['limit'] = limit;
|
|
587
|
+
}
|
|
588
|
+
if (since !== undefined) {
|
|
589
|
+
request['start'] = this.yyyymmdd(since);
|
|
590
|
+
}
|
|
591
|
+
request['timeframe'] = this.safeString(this.timeframes, timeframe, timeframe);
|
|
592
|
+
response = await this.marketPublicGetV1beta3CryptoLocBars(this.extend(request, params));
|
|
593
|
+
}
|
|
594
|
+
else if (method === 'marketPublicGetV1beta3CryptoLocLatestBars') {
|
|
595
|
+
response = await this.marketPublicGetV1beta3CryptoLocLatestBars(this.extend(request, params));
|
|
596
|
+
}
|
|
597
|
+
else {
|
|
598
|
+
throw new errors.NotSupported(this.id + ' fetchOHLCV() does not support ' + method + ', marketPublicGetV1beta3CryptoLocBars and marketPublicGetV1beta3CryptoLocLatestBars are supported');
|
|
599
|
+
}
|
|
600
|
+
//
|
|
601
|
+
// {
|
|
602
|
+
// "bars":{
|
|
603
|
+
// "BTC/USD":[
|
|
604
|
+
// {
|
|
605
|
+
// "c":22887,
|
|
606
|
+
// "h":22888,
|
|
607
|
+
// "l":22873,
|
|
608
|
+
// "n":11,
|
|
609
|
+
// "o":22883,
|
|
610
|
+
// "t":"2022-07-21T05:00:00Z",
|
|
611
|
+
// "v":1.1138,
|
|
612
|
+
// "vw":22883.0155324116
|
|
613
|
+
// },
|
|
614
|
+
// {
|
|
615
|
+
// "c":22895,
|
|
616
|
+
// "h":22895,
|
|
617
|
+
// "l":22884,
|
|
618
|
+
// "n":6,
|
|
619
|
+
// "o":22884,
|
|
620
|
+
// "t":"2022-07-21T05:01:00Z",
|
|
621
|
+
// "v":0.001,
|
|
622
|
+
// "vw":22889.5
|
|
623
|
+
// }
|
|
624
|
+
// ]
|
|
625
|
+
// },
|
|
626
|
+
// "next_page_token":"QlRDL1VTRHxNfDIwMjItMDctMjFUMDU6MDE6MDAuMDAwMDAwMDAwWg=="
|
|
627
|
+
// }
|
|
628
|
+
//
|
|
629
|
+
// {
|
|
630
|
+
// "bars":{
|
|
631
|
+
// "BTC/USD":{
|
|
632
|
+
// "c":22887,
|
|
633
|
+
// "h":22888,
|
|
634
|
+
// "l":22873,
|
|
635
|
+
// "n":11,
|
|
636
|
+
// "o":22883,
|
|
637
|
+
// "t":"2022-07-21T05:00:00Z",
|
|
638
|
+
// "v":1.1138,
|
|
639
|
+
// "vw":22883.0155324116
|
|
640
|
+
// }
|
|
641
|
+
// }
|
|
642
|
+
// }
|
|
643
|
+
//
|
|
644
|
+
const bars = this.safeValue(response, 'bars', {});
|
|
645
|
+
let ohlcvs = this.safeValue(bars, marketId, {});
|
|
646
|
+
if (!Array.isArray(ohlcvs)) {
|
|
647
|
+
ohlcvs = [ohlcvs];
|
|
648
|
+
}
|
|
649
|
+
return this.parseOHLCVs(ohlcvs, market, timeframe, since, limit);
|
|
650
|
+
}
|
|
651
|
+
parseOHLCV(ohlcv, market = undefined) {
|
|
652
|
+
//
|
|
653
|
+
// {
|
|
654
|
+
// "c":22895,
|
|
655
|
+
// "h":22895,
|
|
656
|
+
// "l":22884,
|
|
657
|
+
// "n":6,
|
|
658
|
+
// "o":22884,
|
|
659
|
+
// "t":"2022-07-21T05:01:00Z",
|
|
660
|
+
// "v":0.001,
|
|
661
|
+
// "vw":22889.5
|
|
662
|
+
// }
|
|
663
|
+
//
|
|
664
|
+
const datetime = this.safeString(ohlcv, 't');
|
|
665
|
+
const timestamp = this.parse8601(datetime);
|
|
666
|
+
return [
|
|
667
|
+
timestamp,
|
|
668
|
+
this.safeNumber(ohlcv, 'o'),
|
|
669
|
+
this.safeNumber(ohlcv, 'h'),
|
|
670
|
+
this.safeNumber(ohlcv, 'l'),
|
|
671
|
+
this.safeNumber(ohlcv, 'c'),
|
|
672
|
+
this.safeNumber(ohlcv, 'v'), // volume
|
|
673
|
+
];
|
|
674
|
+
}
|
|
675
|
+
async createOrder(symbol, type, side, amount, price = undefined, params = {}) {
|
|
676
|
+
/**
|
|
677
|
+
* @method
|
|
678
|
+
* @name alpaca#createOrder
|
|
679
|
+
* @description create a trade order
|
|
680
|
+
* @see https://docs.alpaca.markets/reference/postorder
|
|
681
|
+
* @param {string} symbol unified symbol of the market to create an order in
|
|
682
|
+
* @param {string} type 'market', 'limit' or 'stop_limit'
|
|
683
|
+
* @param {string} side 'buy' or 'sell'
|
|
684
|
+
* @param {float} amount how much of currency you want to trade in units of base currency
|
|
685
|
+
* @param {float} [price] the price at which the order is to be fullfilled, in units of the quote currency, ignored in market orders
|
|
686
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
687
|
+
* @param {float} [params.triggerPrice] The price at which a trigger order is triggered at
|
|
688
|
+
* @returns {object} an [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
|
|
689
|
+
*/
|
|
690
|
+
await this.loadMarkets();
|
|
691
|
+
const market = this.market(symbol);
|
|
692
|
+
const id = market['id'];
|
|
693
|
+
const request = {
|
|
694
|
+
'symbol': id,
|
|
695
|
+
'qty': this.amountToPrecision(symbol, amount),
|
|
696
|
+
'side': side,
|
|
697
|
+
'type': type, // market, limit, stop_limit
|
|
698
|
+
};
|
|
699
|
+
const triggerPrice = this.safeStringN(params, ['triggerPrice', 'stop_price']);
|
|
700
|
+
if (triggerPrice !== undefined) {
|
|
701
|
+
let newType = undefined;
|
|
702
|
+
if (type.indexOf('limit') >= 0) {
|
|
703
|
+
newType = 'stop_limit';
|
|
704
|
+
}
|
|
705
|
+
else {
|
|
706
|
+
throw new errors.NotSupported(this.id + ' createOrder() does not support stop orders for ' + type + ' orders, only stop_limit orders are supported');
|
|
707
|
+
}
|
|
708
|
+
request['stop_price'] = this.priceToPrecision(symbol, triggerPrice);
|
|
709
|
+
request['type'] = newType;
|
|
710
|
+
}
|
|
711
|
+
if (type.indexOf('limit') >= 0) {
|
|
712
|
+
request['limit_price'] = this.priceToPrecision(symbol, price);
|
|
713
|
+
}
|
|
714
|
+
const defaultTIF = this.safeString(this.options, 'defaultTimeInForce');
|
|
715
|
+
request['time_in_force'] = this.safeString(params, 'timeInForce', defaultTIF);
|
|
716
|
+
params = this.omit(params, ['timeInForce', 'triggerPrice']);
|
|
717
|
+
const clientOrderIdprefix = this.safeString(this.options, 'clientOrderId');
|
|
718
|
+
const uuid = this.uuid();
|
|
719
|
+
const parts = uuid.split('-');
|
|
720
|
+
const random_id = parts.join('');
|
|
721
|
+
const defaultClientId = this.implodeParams(clientOrderIdprefix, { 'id': random_id });
|
|
722
|
+
const clientOrderId = this.safeString(params, 'clientOrderId', defaultClientId);
|
|
723
|
+
request['client_order_id'] = clientOrderId;
|
|
724
|
+
params = this.omit(params, ['clientOrderId']);
|
|
725
|
+
const order = await this.traderPrivatePostV2Orders(this.extend(request, params));
|
|
726
|
+
//
|
|
727
|
+
// {
|
|
728
|
+
// "id": "61e69015-8549-4bfd-b9c3-01e75843f47d",
|
|
729
|
+
// "client_order_id": "eb9e2aaa-f71a-4f51-b5b4-52a6c565dad4",
|
|
730
|
+
// "created_at": "2021-03-16T18:38:01.942282Z",
|
|
731
|
+
// "updated_at": "2021-03-16T18:38:01.942282Z",
|
|
732
|
+
// "submitted_at": "2021-03-16T18:38:01.937734Z",
|
|
733
|
+
// "filled_at": null,
|
|
734
|
+
// "expired_at": null,
|
|
735
|
+
// "canceled_at": null,
|
|
736
|
+
// "failed_at": null,
|
|
737
|
+
// "replaced_at": null,
|
|
738
|
+
// "replaced_by": null,
|
|
739
|
+
// "replaces": null,
|
|
740
|
+
// "asset_id": "b0b6dd9d-8b9b-48a9-ba46-b9d54906e415",
|
|
741
|
+
// "symbol": "AAPL",
|
|
742
|
+
// "asset_class": "us_equity",
|
|
743
|
+
// "notional": "500",
|
|
744
|
+
// "qty": null,
|
|
745
|
+
// "filled_qty": "0",
|
|
746
|
+
// "filled_avg_price": null,
|
|
747
|
+
// "order_class": "",
|
|
748
|
+
// "order_type": "market",
|
|
749
|
+
// "type": "market",
|
|
750
|
+
// "side": "buy",
|
|
751
|
+
// "time_in_force": "day",
|
|
752
|
+
// "limit_price": null,
|
|
753
|
+
// "stop_price": null,
|
|
754
|
+
// "status": "accepted",
|
|
755
|
+
// "extended_hours": false,
|
|
756
|
+
// "legs": null,
|
|
757
|
+
// "trail_percent": null,
|
|
758
|
+
// "trail_price": null,
|
|
759
|
+
// "hwm": null
|
|
760
|
+
// }
|
|
761
|
+
//
|
|
762
|
+
return this.parseOrder(order, market);
|
|
763
|
+
}
|
|
764
|
+
async cancelOrder(id, symbol = undefined, params = {}) {
|
|
765
|
+
/**
|
|
766
|
+
* @method
|
|
767
|
+
* @name alpaca#cancelOrder
|
|
768
|
+
* @description cancels an open order
|
|
769
|
+
* @see https://docs.alpaca.markets/reference/deleteorderbyorderid
|
|
770
|
+
* @param {string} id order id
|
|
771
|
+
* @param {string} symbol unified symbol of the market the order was made in
|
|
772
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
773
|
+
* @returns {object} An [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
|
|
774
|
+
*/
|
|
775
|
+
const request = {
|
|
776
|
+
'order_id': id,
|
|
777
|
+
};
|
|
778
|
+
const response = await this.traderPrivateDeleteV2OrdersOrderId(this.extend(request, params));
|
|
779
|
+
//
|
|
780
|
+
// {
|
|
781
|
+
// "code": 40410000,
|
|
782
|
+
// "message": "order is not found."
|
|
783
|
+
// }
|
|
784
|
+
//
|
|
785
|
+
return this.safeValue(response, 'message', {});
|
|
786
|
+
}
|
|
787
|
+
async cancelAllOrders(symbol = undefined, params = {}) {
|
|
788
|
+
/**
|
|
789
|
+
* @method
|
|
790
|
+
* @name alpaca#cancelAllOrders
|
|
791
|
+
* @description cancel all open orders in a market
|
|
792
|
+
* @see https://docs.alpaca.markets/reference/deleteallorders
|
|
793
|
+
* @param {string} symbol alpaca cancelAllOrders cannot setting symbol, it will cancel all open orders
|
|
794
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
795
|
+
* @returns {object[]} a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
|
|
796
|
+
*/
|
|
797
|
+
await this.loadMarkets();
|
|
798
|
+
const response = await this.traderPrivateDeleteV2Orders(params);
|
|
799
|
+
if (Array.isArray(response)) {
|
|
800
|
+
return this.parseOrders(response, undefined);
|
|
801
|
+
}
|
|
802
|
+
else {
|
|
803
|
+
return response;
|
|
804
|
+
}
|
|
805
|
+
}
|
|
806
|
+
async fetchOrder(id, symbol = undefined, params = {}) {
|
|
807
|
+
/**
|
|
808
|
+
* @method
|
|
809
|
+
* @name alpaca#fetchOrder
|
|
810
|
+
* @description fetches information on an order made by the user
|
|
811
|
+
* @see https://docs.alpaca.markets/reference/getorderbyorderid
|
|
812
|
+
* @param {string} symbol unified symbol of the market the order was made in
|
|
813
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
814
|
+
* @returns {object} An [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
|
|
815
|
+
*/
|
|
816
|
+
await this.loadMarkets();
|
|
817
|
+
const request = {
|
|
818
|
+
'order_id': id,
|
|
819
|
+
};
|
|
820
|
+
const order = await this.traderPrivateGetV2OrdersOrderId(this.extend(request, params));
|
|
821
|
+
const marketId = this.safeString(order, 'symbol');
|
|
822
|
+
const market = this.safeMarket(marketId);
|
|
823
|
+
return this.parseOrder(order, market);
|
|
824
|
+
}
|
|
825
|
+
async fetchOrders(symbol = undefined, since = undefined, limit = undefined, params = {}) {
|
|
826
|
+
/**
|
|
827
|
+
* @method
|
|
828
|
+
* @name alpaca#fetchOrders
|
|
829
|
+
* @description fetches information on multiple orders made by the user
|
|
830
|
+
* @see https://docs.alpaca.markets/reference/getallorders
|
|
831
|
+
* @param {string} symbol unified market symbol of the market orders were made in
|
|
832
|
+
* @param {int} [since] the earliest time in ms to fetch orders for
|
|
833
|
+
* @param {int} [limit] the maximum number of order structures to retrieve
|
|
834
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
835
|
+
* @param {int} [params.until] the latest time in ms to fetch orders for
|
|
836
|
+
* @returns {Order[]} a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
|
|
837
|
+
*/
|
|
838
|
+
await this.loadMarkets();
|
|
839
|
+
const request = {
|
|
840
|
+
'status': 'all',
|
|
841
|
+
};
|
|
842
|
+
let market = undefined;
|
|
843
|
+
if (symbol !== undefined) {
|
|
844
|
+
market = this.market(symbol);
|
|
845
|
+
request['symbols'] = market['id'];
|
|
846
|
+
}
|
|
847
|
+
const until = this.safeInteger(params, 'until');
|
|
848
|
+
if (until !== undefined) {
|
|
849
|
+
params = this.omit(params, 'until');
|
|
850
|
+
request['endTime'] = until;
|
|
851
|
+
}
|
|
852
|
+
if (since !== undefined) {
|
|
853
|
+
request['after'] = since;
|
|
854
|
+
}
|
|
855
|
+
if (limit !== undefined) {
|
|
856
|
+
request['limit'] = limit;
|
|
857
|
+
}
|
|
858
|
+
const response = await this.traderPrivateGetV2Orders(this.extend(request, params));
|
|
859
|
+
//
|
|
860
|
+
// [
|
|
861
|
+
// {
|
|
862
|
+
// "id": "cbaf12d7-69b8-49c0-a31b-b46af35c755c",
|
|
863
|
+
// "client_order_id": "ccxt_b36156ae6fd44d098ac9c179bab33efd",
|
|
864
|
+
// "created_at": "2023-11-17T04:21:42.234579Z",
|
|
865
|
+
// "updated_at": "2023-11-17T04:22:34.442765Z",
|
|
866
|
+
// "submitted_at": "2023-11-17T04:21:42.233357Z",
|
|
867
|
+
// "filled_at": null,
|
|
868
|
+
// "expired_at": null,
|
|
869
|
+
// "canceled_at": "2023-11-17T04:22:34.399019Z",
|
|
870
|
+
// "failed_at": null,
|
|
871
|
+
// "replaced_at": null,
|
|
872
|
+
// "replaced_by": null,
|
|
873
|
+
// "replaces": null,
|
|
874
|
+
// "asset_id": "77c6f47f-0939-4b23-b41e-47b4469c4bc8",
|
|
875
|
+
// "symbol": "LTC/USDT",
|
|
876
|
+
// "asset_class": "crypto",
|
|
877
|
+
// "notional": null,
|
|
878
|
+
// "qty": "0.001",
|
|
879
|
+
// "filled_qty": "0",
|
|
880
|
+
// "filled_avg_price": null,
|
|
881
|
+
// "order_class": "",
|
|
882
|
+
// "order_type": "limit",
|
|
883
|
+
// "type": "limit",
|
|
884
|
+
// "side": "sell",
|
|
885
|
+
// "time_in_force": "gtc",
|
|
886
|
+
// "limit_price": "1000",
|
|
887
|
+
// "stop_price": null,
|
|
888
|
+
// "status": "canceled",
|
|
889
|
+
// "extended_hours": false,
|
|
890
|
+
// "legs": null,
|
|
891
|
+
// "trail_percent": null,
|
|
892
|
+
// "trail_price": null,
|
|
893
|
+
// "hwm": null,
|
|
894
|
+
// "subtag": null,
|
|
895
|
+
// "source": "access_key"
|
|
896
|
+
// }
|
|
897
|
+
// ]
|
|
898
|
+
//
|
|
899
|
+
return this.parseOrders(response, market, since, limit);
|
|
900
|
+
}
|
|
901
|
+
async fetchOpenOrders(symbol = undefined, since = undefined, limit = undefined, params = {}) {
|
|
902
|
+
/**
|
|
903
|
+
* @method
|
|
904
|
+
* @name alpaca#fetchOpenOrders
|
|
905
|
+
* @description fetch all unfilled currently open orders
|
|
906
|
+
* @see https://docs.alpaca.markets/reference/getallorders
|
|
907
|
+
* @param {string} symbol unified market symbol of the market orders were made in
|
|
908
|
+
* @param {int} [since] the earliest time in ms to fetch orders for
|
|
909
|
+
* @param {int} [limit] the maximum number of order structures to retrieve
|
|
910
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
911
|
+
* @param {int} [params.until] the latest time in ms to fetch orders for
|
|
912
|
+
* @returns {Order[]} a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
|
|
913
|
+
*/
|
|
914
|
+
const request = {
|
|
915
|
+
'status': 'open',
|
|
916
|
+
};
|
|
917
|
+
return await this.fetchOrders(symbol, since, limit, this.extend(request, params));
|
|
918
|
+
}
|
|
919
|
+
async fetchClosedOrders(symbol = undefined, since = undefined, limit = undefined, params = {}) {
|
|
920
|
+
/**
|
|
921
|
+
* @method
|
|
922
|
+
* @name alpaca#fetchClosedOrders
|
|
923
|
+
* @description fetches information on multiple closed orders made by the user
|
|
924
|
+
* @see https://docs.alpaca.markets/reference/getallorders
|
|
925
|
+
* @param {string} symbol unified market symbol of the market orders were made in
|
|
926
|
+
* @param {int} [since] the earliest time in ms to fetch orders for
|
|
927
|
+
* @param {int} [limit] the maximum number of order structures to retrieve
|
|
928
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
929
|
+
* @param {int} [params.until] the latest time in ms to fetch orders for
|
|
930
|
+
* @returns {Order[]} a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
|
|
931
|
+
*/
|
|
932
|
+
const request = {
|
|
933
|
+
'status': 'closed',
|
|
934
|
+
};
|
|
935
|
+
return await this.fetchOrders(symbol, since, limit, this.extend(request, params));
|
|
936
|
+
}
|
|
937
|
+
parseOrder(order, market = undefined) {
|
|
938
|
+
//
|
|
939
|
+
// {
|
|
940
|
+
// "id":"6ecfcc34-4bed-4b53-83ba-c564aa832a81",
|
|
941
|
+
// "client_order_id":"ccxt_1c6ceab0b5e84727b2f1c0394ba17560",
|
|
942
|
+
// "created_at":"2022-06-14T13:59:30.224037068Z",
|
|
943
|
+
// "updated_at":"2022-06-14T13:59:30.224037068Z",
|
|
944
|
+
// "submitted_at":"2022-06-14T13:59:30.221856828Z",
|
|
945
|
+
// "filled_at":null,
|
|
946
|
+
// "expired_at":null,
|
|
947
|
+
// "canceled_at":null,
|
|
948
|
+
// "failed_at":null,
|
|
949
|
+
// "replaced_at":null,
|
|
950
|
+
// "replaced_by":null,
|
|
951
|
+
// "replaces":null,
|
|
952
|
+
// "asset_id":"64bbff51-59d6-4b3c-9351-13ad85e3c752",
|
|
953
|
+
// "symbol":"BTCUSD",
|
|
954
|
+
// "asset_class":"crypto",
|
|
955
|
+
// "notional":null,
|
|
956
|
+
// "qty":"0.01",
|
|
957
|
+
// "filled_qty":"0",
|
|
958
|
+
// "filled_avg_price":null,
|
|
959
|
+
// "order_class":"",
|
|
960
|
+
// "order_type":"limit",
|
|
961
|
+
// "type":"limit",
|
|
962
|
+
// "side":"buy",
|
|
963
|
+
// "time_in_force":"day",
|
|
964
|
+
// "limit_price":"14000",
|
|
965
|
+
// "stop_price":null,
|
|
966
|
+
// "status":"accepted",
|
|
967
|
+
// "extended_hours":false,
|
|
968
|
+
// "legs":null,
|
|
969
|
+
// "trail_percent":null,
|
|
970
|
+
// "trail_price":null,
|
|
971
|
+
// "hwm":null,
|
|
972
|
+
// "commission":"0.42",
|
|
973
|
+
// "source":null
|
|
974
|
+
// }
|
|
975
|
+
//
|
|
976
|
+
const marketId = this.safeString(order, 'symbol');
|
|
977
|
+
market = this.safeMarket(marketId, market);
|
|
978
|
+
const symbol = market['symbol'];
|
|
979
|
+
const alpacaStatus = this.safeString(order, 'status');
|
|
980
|
+
const status = this.parseOrderStatus(alpacaStatus);
|
|
981
|
+
const feeValue = this.safeString(order, 'commission');
|
|
982
|
+
let fee = undefined;
|
|
983
|
+
if (feeValue !== undefined) {
|
|
984
|
+
fee = {
|
|
985
|
+
'cost': feeValue,
|
|
986
|
+
'currency': 'USD',
|
|
987
|
+
};
|
|
988
|
+
}
|
|
989
|
+
let orderType = this.safeString(order, 'order_type');
|
|
990
|
+
if (orderType !== undefined) {
|
|
991
|
+
if (orderType.indexOf('limit') >= 0) {
|
|
992
|
+
// might be limit or stop-limit
|
|
993
|
+
orderType = 'limit';
|
|
994
|
+
}
|
|
995
|
+
}
|
|
996
|
+
const datetime = this.safeString(order, 'submitted_at');
|
|
997
|
+
const timestamp = this.parse8601(datetime);
|
|
998
|
+
return this.safeOrder({
|
|
999
|
+
'id': this.safeString(order, 'id'),
|
|
1000
|
+
'clientOrderId': this.safeString(order, 'client_order_id'),
|
|
1001
|
+
'timestamp': timestamp,
|
|
1002
|
+
'datetime': datetime,
|
|
1003
|
+
'lastTradeTimeStamp': undefined,
|
|
1004
|
+
'status': status,
|
|
1005
|
+
'symbol': symbol,
|
|
1006
|
+
'type': orderType,
|
|
1007
|
+
'timeInForce': this.parseTimeInForce(this.safeString(order, 'time_in_force')),
|
|
1008
|
+
'postOnly': undefined,
|
|
1009
|
+
'side': this.safeString(order, 'side'),
|
|
1010
|
+
'price': this.safeNumber(order, 'limit_price'),
|
|
1011
|
+
'stopPrice': this.safeNumber(order, 'stop_price'),
|
|
1012
|
+
'triggerPrice': this.safeNumber(order, 'stop_price'),
|
|
1013
|
+
'cost': undefined,
|
|
1014
|
+
'average': this.safeNumber(order, 'filled_avg_price'),
|
|
1015
|
+
'amount': this.safeNumber(order, 'qty'),
|
|
1016
|
+
'filled': this.safeNumber(order, 'filled_qty'),
|
|
1017
|
+
'remaining': undefined,
|
|
1018
|
+
'trades': undefined,
|
|
1019
|
+
'fee': fee,
|
|
1020
|
+
'info': order,
|
|
1021
|
+
}, market);
|
|
1022
|
+
}
|
|
1023
|
+
parseOrderStatus(status) {
|
|
1024
|
+
const statuses = {
|
|
1025
|
+
'pending_new': 'open',
|
|
1026
|
+
'accepted': 'open',
|
|
1027
|
+
'new': 'open',
|
|
1028
|
+
'partially_filled': 'open',
|
|
1029
|
+
'activated': 'open',
|
|
1030
|
+
'filled': 'closed',
|
|
1031
|
+
};
|
|
1032
|
+
return this.safeString(statuses, status, status);
|
|
1033
|
+
}
|
|
1034
|
+
parseTimeInForce(timeInForce) {
|
|
1035
|
+
const timeInForces = {
|
|
1036
|
+
'day': 'Day',
|
|
1037
|
+
};
|
|
1038
|
+
return this.safeString(timeInForces, timeInForce, timeInForce);
|
|
1039
|
+
}
|
|
1040
|
+
parseTrade(trade, market = undefined) {
|
|
1041
|
+
//
|
|
1042
|
+
// {
|
|
1043
|
+
// "t":"2022-06-14T05:00:00.027869Z",
|
|
1044
|
+
// "x":"CBSE",
|
|
1045
|
+
// "p":"21942.15",
|
|
1046
|
+
// "s":"0.0001",
|
|
1047
|
+
// "tks":"S",
|
|
1048
|
+
// "i":"355681339"
|
|
1049
|
+
// }
|
|
1050
|
+
//
|
|
1051
|
+
const marketId = this.safeString(trade, 'S');
|
|
1052
|
+
const symbol = this.safeSymbol(marketId, market);
|
|
1053
|
+
const datetime = this.safeString(trade, 't');
|
|
1054
|
+
const timestamp = this.parse8601(datetime);
|
|
1055
|
+
const alpacaSide = this.safeString(trade, 'tks');
|
|
1056
|
+
let side;
|
|
1057
|
+
if (alpacaSide === 'B') {
|
|
1058
|
+
side = 'buy';
|
|
1059
|
+
}
|
|
1060
|
+
else if (alpacaSide === 'S') {
|
|
1061
|
+
side = 'sell';
|
|
1062
|
+
}
|
|
1063
|
+
const priceString = this.safeString(trade, 'p');
|
|
1064
|
+
const amountString = this.safeString(trade, 's');
|
|
1065
|
+
return this.safeTrade({
|
|
1066
|
+
'info': trade,
|
|
1067
|
+
'id': this.safeString(trade, 'i'),
|
|
1068
|
+
'timestamp': timestamp,
|
|
1069
|
+
'datetime': this.iso8601(timestamp),
|
|
1070
|
+
'symbol': symbol,
|
|
1071
|
+
'order': undefined,
|
|
1072
|
+
'type': undefined,
|
|
1073
|
+
'side': side,
|
|
1074
|
+
'takerOrMaker': 'taker',
|
|
1075
|
+
'price': priceString,
|
|
1076
|
+
'amount': amountString,
|
|
1077
|
+
'cost': undefined,
|
|
1078
|
+
'fee': undefined,
|
|
1079
|
+
}, market);
|
|
1080
|
+
}
|
|
1081
|
+
sign(path, api = 'public', method = 'GET', params = {}, headers = undefined, body = undefined) {
|
|
1082
|
+
let endpoint = '/' + this.implodeParams(path, params);
|
|
1083
|
+
let url = this.implodeHostname(this.urls['api'][api[0]]);
|
|
1084
|
+
headers = (headers !== undefined) ? headers : {};
|
|
1085
|
+
if (api[1] === 'private') {
|
|
1086
|
+
headers['APCA-API-KEY-ID'] = this.apiKey;
|
|
1087
|
+
headers['APCA-API-SECRET-KEY'] = this.secret;
|
|
1088
|
+
}
|
|
1089
|
+
const query = this.omit(params, this.extractParams(path));
|
|
1090
|
+
if (Object.keys(query).length) {
|
|
1091
|
+
if ((method === 'GET') || (method === 'DELETE')) {
|
|
1092
|
+
endpoint += '?' + this.urlencode(query);
|
|
1093
|
+
}
|
|
1094
|
+
else {
|
|
1095
|
+
body = this.json(query);
|
|
1096
|
+
headers['Content-Type'] = 'application/json';
|
|
1097
|
+
}
|
|
1098
|
+
}
|
|
1099
|
+
url = url + endpoint;
|
|
1100
|
+
return { 'url': url, 'method': method, 'body': body, 'headers': headers };
|
|
1101
|
+
}
|
|
1102
|
+
handleErrors(code, reason, url, method, headers, body, response, requestHeaders, requestBody) {
|
|
1103
|
+
if (response === undefined) {
|
|
1104
|
+
return undefined; // default error handler
|
|
1105
|
+
}
|
|
1106
|
+
// {
|
|
1107
|
+
// "code": 40110000,
|
|
1108
|
+
// "message": "request is not authorized"
|
|
1109
|
+
// }
|
|
1110
|
+
const feedback = this.id + ' ' + body;
|
|
1111
|
+
const errorCode = this.safeString(response, 'code');
|
|
1112
|
+
if (code !== undefined) {
|
|
1113
|
+
this.throwExactlyMatchedException(this.exceptions['exact'], errorCode, feedback);
|
|
1114
|
+
}
|
|
1115
|
+
const message = this.safeValue(response, 'message', undefined);
|
|
1116
|
+
if (message !== undefined) {
|
|
1117
|
+
this.throwExactlyMatchedException(this.exceptions['exact'], message, feedback);
|
|
1118
|
+
this.throwBroadlyMatchedException(this.exceptions['broad'], message, feedback);
|
|
1119
|
+
throw new errors.ExchangeError(feedback);
|
|
1120
|
+
}
|
|
1121
|
+
return undefined;
|
|
1122
|
+
}
|
|
1123
|
+
}
|
|
1124
|
+
|
|
1125
|
+
module.exports = alpaca;
|