ccxt 4.2.11 → 4.2.13
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 +1347 -490
- 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 +2209 -0
- package/dist/cjs/js/src/binance.js +9736 -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 +3807 -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 +8291 -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 +3424 -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 +7072 -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 +9049 -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 +761 -0
- package/dist/cjs/js/src/indodax.js +1069 -0
- package/dist/cjs/js/src/kraken.js +2857 -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 +2851 -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 +7330 -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 +4722 -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 +1608 -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 +1867 -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 +2765 -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/bingx.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/abstract/okx.d.ts +1 -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 +3 -2
- package/js/src/bigone.js +429 -167
- package/js/src/binance.js +48 -34
- package/js/src/bingx.js +115 -38
- package/js/src/bitfinex.d.ts +2 -2
- package/js/src/bitfinex.js +2 -3
- package/js/src/bitget.js +33 -13
- package/js/src/bitmart.d.ts +2 -2
- package/js/src/bitmart.js +5 -5
- package/js/src/bitmex.js +1 -0
- package/js/src/bybit.js +2 -0
- package/js/src/coinbase.d.ts +26 -3
- package/js/src/coinbase.js +176 -26
- package/js/src/coinlist.js +3 -4
- package/js/src/coinone.js +1 -1
- 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 +96 -59
- package/js/src/gemini.js +1 -1
- package/js/src/hitbtc.d.ts +4 -4
- package/js/src/hitbtc.js +2 -3
- package/js/src/htx.d.ts +1 -0
- package/js/src/htx.js +29 -7
- package/js/src/huobijp.js +2 -3
- package/js/src/independentreserve.js +7 -5
- package/js/src/kraken.js +3 -6
- package/js/src/lbank.js +59 -33
- package/js/src/mexc.js +2 -1
- package/js/src/oceanex.js +1 -1
- package/js/src/okx.js +14 -3
- package/js/src/phemex.js +9 -2
- 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/kraken.js +1 -1
- package/js/src/pro/okx.d.ts +1 -0
- package/js/src/pro/okx.js +52 -2
- package/js/src/pro/poloniex.d.ts +2 -2
- package/js/src/probit.js +4 -2
- package/js/src/upbit.d.ts +3 -101
- package/js/src/upbit.js +12 -12
- package/js/src/wavesexchange.js +1 -1
- package/js/src/woo.d.ts +2 -0
- package/js/src/woo.js +52 -0
- package/package.json +1 -1
- package/skip-tests.json +5 -0
|
@@ -0,0 +1,760 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var okcoin$1 = require('../okcoin.js');
|
|
4
|
+
var errors = require('../base/errors.js');
|
|
5
|
+
var Cache = require('../base/ws/Cache.js');
|
|
6
|
+
var sha256 = require('../static_dependencies/noble-hashes/sha256.js');
|
|
7
|
+
|
|
8
|
+
// ---------------------------------------------------------------------------
|
|
9
|
+
// ---------------------------------------------------------------------------
|
|
10
|
+
class okcoin extends okcoin$1 {
|
|
11
|
+
describe() {
|
|
12
|
+
return this.deepExtend(super.describe(), {
|
|
13
|
+
'has': {
|
|
14
|
+
'ws': true,
|
|
15
|
+
'watchTicker': true,
|
|
16
|
+
'watchTickers': false,
|
|
17
|
+
'watchOrderBook': true,
|
|
18
|
+
'watchOrders': true,
|
|
19
|
+
'watchTrades': true,
|
|
20
|
+
'watchBalance': true,
|
|
21
|
+
'watchOHLCV': true,
|
|
22
|
+
},
|
|
23
|
+
'urls': {
|
|
24
|
+
'api': {
|
|
25
|
+
'ws': 'wss://real.okcoin.com:8443/ws/v3',
|
|
26
|
+
},
|
|
27
|
+
'logo': 'https://user-images.githubusercontent.com/1294454/27766791-89ffb502-5ee5-11e7-8a5b-c5950b68ac65.jpg',
|
|
28
|
+
'www': 'https://www.okcoin.com',
|
|
29
|
+
'doc': 'https://www.okcoin.com/docs/en/',
|
|
30
|
+
'fees': 'https://www.okcoin.com/coin-fees',
|
|
31
|
+
'referral': 'https://www.okcoin.com/account/register?flag=activity&channelId=600001513',
|
|
32
|
+
},
|
|
33
|
+
'options': {
|
|
34
|
+
'fetchMarkets': ['spot'],
|
|
35
|
+
'watchOrders': 'order',
|
|
36
|
+
'watchOrderBook': {
|
|
37
|
+
'limit': 400,
|
|
38
|
+
'type': 'spot',
|
|
39
|
+
'depth': 'depth_l2_tbt', // depth5, depth
|
|
40
|
+
},
|
|
41
|
+
'watchBalance': 'spot',
|
|
42
|
+
'ws': {
|
|
43
|
+
'inflate': true,
|
|
44
|
+
},
|
|
45
|
+
},
|
|
46
|
+
'streaming': {
|
|
47
|
+
// okex does not support built-in ws protocol-level ping-pong
|
|
48
|
+
// instead it requires a custom text-based ping-pong
|
|
49
|
+
'ping': this.ping,
|
|
50
|
+
'keepAlive': 20000,
|
|
51
|
+
},
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
async subscribe(channel, symbol, params = {}) {
|
|
55
|
+
await this.loadMarkets();
|
|
56
|
+
const market = this.market(symbol);
|
|
57
|
+
const url = this.urls['api']['ws'];
|
|
58
|
+
const messageHash = market['type'] + '/' + channel + ':' + market['id'];
|
|
59
|
+
const request = {
|
|
60
|
+
'op': 'subscribe',
|
|
61
|
+
'args': [messageHash],
|
|
62
|
+
};
|
|
63
|
+
return await this.watch(url, messageHash, this.deepExtend(request, params), messageHash);
|
|
64
|
+
}
|
|
65
|
+
async watchTrades(symbol, since = undefined, limit = undefined, params = {}) {
|
|
66
|
+
/**
|
|
67
|
+
* @method
|
|
68
|
+
* @name okcoin#watchTrades
|
|
69
|
+
* @description get the list of most recent trades for a particular symbol
|
|
70
|
+
* @param {string} symbol unified symbol of the market to fetch trades for
|
|
71
|
+
* @param {int} [since] timestamp in ms of the earliest trade to fetch
|
|
72
|
+
* @param {int} [limit] the maximum amount of trades to fetch
|
|
73
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
74
|
+
* @returns {object[]} a list of [trade structures]{@link https://docs.ccxt.com/#/?id=public-trades}
|
|
75
|
+
*/
|
|
76
|
+
await this.loadMarkets();
|
|
77
|
+
symbol = this.symbol(symbol);
|
|
78
|
+
const trades = await this.subscribe('trade', symbol, params);
|
|
79
|
+
if (this.newUpdates) {
|
|
80
|
+
limit = trades.getLimit(symbol, limit);
|
|
81
|
+
}
|
|
82
|
+
return this.filterBySinceLimit(trades, since, limit, 'timestamp', true);
|
|
83
|
+
}
|
|
84
|
+
async watchOrders(symbol = undefined, since = undefined, limit = undefined, params = {}) {
|
|
85
|
+
/**
|
|
86
|
+
* @method
|
|
87
|
+
* @name okcoin#watchOrders
|
|
88
|
+
* @description watches information on multiple orders made by the user
|
|
89
|
+
* @param {string} symbol unified market symbol of the market orders were made in
|
|
90
|
+
* @param {int} [since] the earliest time in ms to fetch orders for
|
|
91
|
+
* @param {int} [limit] the maximum number of order structures to retrieve
|
|
92
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
93
|
+
* @returns {object[]} a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
|
|
94
|
+
*/
|
|
95
|
+
await this.loadMarkets();
|
|
96
|
+
await this.authenticate();
|
|
97
|
+
if (symbol !== undefined) {
|
|
98
|
+
symbol = this.symbol(symbol);
|
|
99
|
+
}
|
|
100
|
+
const orderType = this.safeString(this.options, 'watchOrders', 'order');
|
|
101
|
+
const trades = await this.subscribe(orderType, symbol, params);
|
|
102
|
+
if (this.newUpdates) {
|
|
103
|
+
limit = trades.getLimit(symbol, limit);
|
|
104
|
+
}
|
|
105
|
+
return this.filterBySinceLimit(trades, since, limit, 'timestamp', true);
|
|
106
|
+
}
|
|
107
|
+
handleOrders(client, message, subscription = undefined) {
|
|
108
|
+
//
|
|
109
|
+
// {
|
|
110
|
+
// "table": "spot/order",
|
|
111
|
+
// "data": [
|
|
112
|
+
// {
|
|
113
|
+
// "client_oid": '',
|
|
114
|
+
// "created_at": "2022-03-04T16:44:58.530Z",
|
|
115
|
+
// "event_code": "0",
|
|
116
|
+
// "event_message": '',
|
|
117
|
+
// "fee": '',
|
|
118
|
+
// "fee_currency": '',
|
|
119
|
+
// "filled_notional": "0",
|
|
120
|
+
// "filled_size": "0",
|
|
121
|
+
// "instrument_id": "LTC-USD",
|
|
122
|
+
// "last_amend_result": '',
|
|
123
|
+
// "last_fill_id": "0",
|
|
124
|
+
// "last_fill_px": "0",
|
|
125
|
+
// "last_fill_qty": "0",
|
|
126
|
+
// "last_fill_time": "1970-01-01T00:00:00.000Z",
|
|
127
|
+
// "last_request_id": '',
|
|
128
|
+
// "margin_trading": "1",
|
|
129
|
+
// "notional": '',
|
|
130
|
+
// "order_id": "8629537900471296",
|
|
131
|
+
// "order_type": "0",
|
|
132
|
+
// "price": "1500",
|
|
133
|
+
// "rebate": '',
|
|
134
|
+
// "rebate_currency": '',
|
|
135
|
+
// "side": "sell",
|
|
136
|
+
// "size": "0.0133",
|
|
137
|
+
// "state": "0",
|
|
138
|
+
// "status": "open",
|
|
139
|
+
// "timestamp": "2022-03-04T16:44:58.530Z",
|
|
140
|
+
// "type": "limit"
|
|
141
|
+
// }
|
|
142
|
+
// ]
|
|
143
|
+
// }
|
|
144
|
+
//
|
|
145
|
+
const table = this.safeString(message, 'table');
|
|
146
|
+
const orders = this.safeValue(message, 'data', []);
|
|
147
|
+
const ordersLength = orders.length;
|
|
148
|
+
if (ordersLength > 0) {
|
|
149
|
+
const limit = this.safeInteger(this.options, 'ordersLimit', 1000);
|
|
150
|
+
if (this.orders === undefined) {
|
|
151
|
+
this.orders = new Cache.ArrayCacheBySymbolById(limit);
|
|
152
|
+
}
|
|
153
|
+
const stored = this.orders;
|
|
154
|
+
const marketIds = {};
|
|
155
|
+
const parsed = this.parseOrders(orders);
|
|
156
|
+
for (let i = 0; i < parsed.length; i++) {
|
|
157
|
+
const order = parsed[i];
|
|
158
|
+
stored.append(order);
|
|
159
|
+
const symbol = order['symbol'];
|
|
160
|
+
const market = this.market(symbol);
|
|
161
|
+
marketIds[market['id']] = true;
|
|
162
|
+
}
|
|
163
|
+
const keys = Object.keys(marketIds);
|
|
164
|
+
for (let i = 0; i < keys.length; i++) {
|
|
165
|
+
const messageHash = table + ':' + keys[i];
|
|
166
|
+
client.resolve(this.orders, messageHash);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
async watchTicker(symbol, params = {}) {
|
|
171
|
+
/**
|
|
172
|
+
* @method
|
|
173
|
+
* @name okcoin#watchTicker
|
|
174
|
+
* @description watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
|
|
175
|
+
* @param {string} symbol unified symbol of the market to fetch the ticker for
|
|
176
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
177
|
+
* @returns {object} a [ticker structure]{@link https://docs.ccxt.com/#/?id=ticker-structure}
|
|
178
|
+
*/
|
|
179
|
+
return await this.subscribe('ticker', symbol, params);
|
|
180
|
+
}
|
|
181
|
+
handleTrade(client, message) {
|
|
182
|
+
//
|
|
183
|
+
// {
|
|
184
|
+
// "table": "spot/trade",
|
|
185
|
+
// "data": [
|
|
186
|
+
// {
|
|
187
|
+
// "side": "buy",
|
|
188
|
+
// "trade_id": "30770973",
|
|
189
|
+
// "price": "4665.4",
|
|
190
|
+
// "size": "0.019",
|
|
191
|
+
// "instrument_id": "BTC-USDT",
|
|
192
|
+
// "timestamp": "2020-03-16T13:41:46.526Z"
|
|
193
|
+
// }
|
|
194
|
+
// ]
|
|
195
|
+
// }
|
|
196
|
+
//
|
|
197
|
+
const table = this.safeString(message, 'table');
|
|
198
|
+
const data = this.safeValue(message, 'data', []);
|
|
199
|
+
const tradesLimit = this.safeInteger(this.options, 'tradesLimit', 1000);
|
|
200
|
+
for (let i = 0; i < data.length; i++) {
|
|
201
|
+
const trade = this.parseTrade(data[i]);
|
|
202
|
+
const symbol = trade['symbol'];
|
|
203
|
+
const marketId = this.safeString(trade['info'], 'instrument_id');
|
|
204
|
+
const messageHash = table + ':' + marketId;
|
|
205
|
+
let stored = this.safeValue(this.trades, symbol);
|
|
206
|
+
if (stored === undefined) {
|
|
207
|
+
stored = new Cache.ArrayCache(tradesLimit);
|
|
208
|
+
this.trades[symbol] = stored;
|
|
209
|
+
}
|
|
210
|
+
stored.append(trade);
|
|
211
|
+
client.resolve(stored, messageHash);
|
|
212
|
+
}
|
|
213
|
+
return message;
|
|
214
|
+
}
|
|
215
|
+
handleTicker(client, message) {
|
|
216
|
+
//
|
|
217
|
+
// {
|
|
218
|
+
// "table": "spot/ticker",
|
|
219
|
+
// "data": [
|
|
220
|
+
// {
|
|
221
|
+
// "last": "4634.1",
|
|
222
|
+
// "open_24h": "5305.6",
|
|
223
|
+
// "best_bid": "4631.6",
|
|
224
|
+
// "high_24h": "5950",
|
|
225
|
+
// "low_24h": "4448.8",
|
|
226
|
+
// "base_volume_24h": "147913.11435388",
|
|
227
|
+
// "quote_volume_24h": "756850119.99108082",
|
|
228
|
+
// "best_ask": "4631.7",
|
|
229
|
+
// "instrument_id": "BTC-USDT",
|
|
230
|
+
// "timestamp": "2020-03-16T13:16:25.677Z",
|
|
231
|
+
// "best_bid_size": "0.12348942",
|
|
232
|
+
// "best_ask_size": "0.00100014",
|
|
233
|
+
// "last_qty": "0.00331822"
|
|
234
|
+
// }
|
|
235
|
+
// ]
|
|
236
|
+
// }
|
|
237
|
+
//
|
|
238
|
+
const table = this.safeString(message, 'table');
|
|
239
|
+
const data = this.safeValue(message, 'data', []);
|
|
240
|
+
for (let i = 0; i < data.length; i++) {
|
|
241
|
+
const ticker = this.parseTicker(data[i]);
|
|
242
|
+
const symbol = ticker['symbol'];
|
|
243
|
+
const marketId = this.safeString(ticker['info'], 'instrument_id');
|
|
244
|
+
const messageHash = table + ':' + marketId;
|
|
245
|
+
this.tickers[symbol] = ticker;
|
|
246
|
+
client.resolve(ticker, messageHash);
|
|
247
|
+
}
|
|
248
|
+
return message;
|
|
249
|
+
}
|
|
250
|
+
async watchOHLCV(symbol, timeframe = '1m', since = undefined, limit = undefined, params = {}) {
|
|
251
|
+
/**
|
|
252
|
+
* @method
|
|
253
|
+
* @name okcoin#watchOHLCV
|
|
254
|
+
* @description watches historical candlestick data containing the open, high, low, and close price, and the volume of a market
|
|
255
|
+
* @param {string} symbol unified symbol of the market to fetch OHLCV data for
|
|
256
|
+
* @param {string} timeframe the length of time each candle represents
|
|
257
|
+
* @param {int} [since] timestamp in ms of the earliest candle to fetch
|
|
258
|
+
* @param {int} [limit] the maximum amount of candles to fetch
|
|
259
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
260
|
+
* @returns {int[][]} A list of candles ordered as timestamp, open, high, low, close, volume
|
|
261
|
+
*/
|
|
262
|
+
await this.loadMarkets();
|
|
263
|
+
symbol = this.symbol(symbol);
|
|
264
|
+
const interval = this.safeString(this.timeframes, timeframe, timeframe);
|
|
265
|
+
const name = 'candle' + interval + 's';
|
|
266
|
+
const ohlcv = await this.subscribe(name, symbol, params);
|
|
267
|
+
if (this.newUpdates) {
|
|
268
|
+
limit = ohlcv.getLimit(symbol, limit);
|
|
269
|
+
}
|
|
270
|
+
return this.filterBySinceLimit(ohlcv, since, limit, 0, true);
|
|
271
|
+
}
|
|
272
|
+
handleOHLCV(client, message) {
|
|
273
|
+
//
|
|
274
|
+
// {
|
|
275
|
+
// "table": "spot/candle60s",
|
|
276
|
+
// "data": [
|
|
277
|
+
// {
|
|
278
|
+
// "candle": [
|
|
279
|
+
// "2020-03-16T14:29:00.000Z",
|
|
280
|
+
// "4948.3",
|
|
281
|
+
// "4966.7",
|
|
282
|
+
// "4939.1",
|
|
283
|
+
// "4945.3",
|
|
284
|
+
// "238.36021657"
|
|
285
|
+
// ],
|
|
286
|
+
// "instrument_id": "BTC-USDT"
|
|
287
|
+
// }
|
|
288
|
+
// ]
|
|
289
|
+
// }
|
|
290
|
+
//
|
|
291
|
+
const table = this.safeString(message, 'table');
|
|
292
|
+
const data = this.safeValue(message, 'data', []);
|
|
293
|
+
const parts = table.split('/');
|
|
294
|
+
const part1 = this.safeString(parts, 1);
|
|
295
|
+
let interval = part1.replace('candle', '');
|
|
296
|
+
interval = interval.replace('s', '');
|
|
297
|
+
// use a reverse lookup in a static map instead
|
|
298
|
+
const timeframe = this.findTimeframe(interval);
|
|
299
|
+
for (let i = 0; i < data.length; i++) {
|
|
300
|
+
const marketId = this.safeString(data[i], 'instrument_id');
|
|
301
|
+
const candle = this.safeValue(data[i], 'candle');
|
|
302
|
+
const market = this.safeMarket(marketId);
|
|
303
|
+
const symbol = market['symbol'];
|
|
304
|
+
const parsed = this.parseOHLCV(candle, market);
|
|
305
|
+
this.ohlcvs[symbol] = this.safeValue(this.ohlcvs, symbol, {});
|
|
306
|
+
let stored = this.safeValue(this.ohlcvs[symbol], timeframe);
|
|
307
|
+
if (stored === undefined) {
|
|
308
|
+
const limit = this.safeInteger(this.options, 'OHLCVLimit', 1000);
|
|
309
|
+
stored = new Cache.ArrayCacheByTimestamp(limit);
|
|
310
|
+
this.ohlcvs[symbol][timeframe] = stored;
|
|
311
|
+
}
|
|
312
|
+
stored.append(parsed);
|
|
313
|
+
const messageHash = table + ':' + marketId;
|
|
314
|
+
client.resolve(stored, messageHash);
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
async watchOrderBook(symbol, limit = undefined, params = {}) {
|
|
318
|
+
/**
|
|
319
|
+
* @method
|
|
320
|
+
* @name okcoin#watchOrderBook
|
|
321
|
+
* @description watches information on open orders with bid (buy) and ask (sell) prices, volumes and other data
|
|
322
|
+
* @param {string} symbol unified symbol of the market to fetch the order book for
|
|
323
|
+
* @param {int} [limit] the maximum amount of order book entries to return
|
|
324
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
325
|
+
* @returns {object} A dictionary of [order book structures]{@link https://docs.ccxt.com/#/?id=order-book-structure} indexed by market symbols
|
|
326
|
+
*/
|
|
327
|
+
const options = this.safeValue(this.options, 'watchOrderBook', {});
|
|
328
|
+
const depth = this.safeString(options, 'depth', 'depth_l2_tbt');
|
|
329
|
+
const orderbook = await this.subscribe(depth, symbol, params);
|
|
330
|
+
return orderbook.limit();
|
|
331
|
+
}
|
|
332
|
+
handleDelta(bookside, delta) {
|
|
333
|
+
const price = this.safeFloat(delta, 0);
|
|
334
|
+
const amount = this.safeFloat(delta, 1);
|
|
335
|
+
bookside.store(price, amount);
|
|
336
|
+
}
|
|
337
|
+
handleDeltas(bookside, deltas) {
|
|
338
|
+
for (let i = 0; i < deltas.length; i++) {
|
|
339
|
+
this.handleDelta(bookside, deltas[i]);
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
handleOrderBookMessage(client, message, orderbook) {
|
|
343
|
+
//
|
|
344
|
+
// {
|
|
345
|
+
// "instrument_id": "BTC-USDT",
|
|
346
|
+
// "asks": [
|
|
347
|
+
// ["4568.5", "0.49723138", "2"],
|
|
348
|
+
// ["4568.7", "0.5013", "1"],
|
|
349
|
+
// ["4569.1", "0.4398", "1"],
|
|
350
|
+
// ],
|
|
351
|
+
// "bids": [
|
|
352
|
+
// ["4568.4", "0.84187666", "5"],
|
|
353
|
+
// ["4568.3", "0.75661506", "6"],
|
|
354
|
+
// ["4567.8", "2.01", "2"],
|
|
355
|
+
// ],
|
|
356
|
+
// "timestamp": "2020-03-16T11:11:43.388Z",
|
|
357
|
+
// "checksum": 473370408
|
|
358
|
+
// }
|
|
359
|
+
//
|
|
360
|
+
const asks = this.safeValue(message, 'asks', []);
|
|
361
|
+
const bids = this.safeValue(message, 'bids', []);
|
|
362
|
+
this.handleDeltas(orderbook['asks'], asks);
|
|
363
|
+
this.handleDeltas(orderbook['bids'], bids);
|
|
364
|
+
const timestamp = this.parse8601(this.safeString(message, 'timestamp'));
|
|
365
|
+
orderbook['timestamp'] = timestamp;
|
|
366
|
+
orderbook['datetime'] = this.iso8601(timestamp);
|
|
367
|
+
return orderbook;
|
|
368
|
+
}
|
|
369
|
+
handleOrderBook(client, message) {
|
|
370
|
+
//
|
|
371
|
+
// first message (snapshot)
|
|
372
|
+
//
|
|
373
|
+
// {
|
|
374
|
+
// "table": "spot/depth",
|
|
375
|
+
// "action": "partial",
|
|
376
|
+
// "data": [
|
|
377
|
+
// {
|
|
378
|
+
// "instrument_id": "BTC-USDT",
|
|
379
|
+
// "asks": [
|
|
380
|
+
// ["4568.5", "0.49723138", "2"],
|
|
381
|
+
// ["4568.7", "0.5013", "1"],
|
|
382
|
+
// ["4569.1", "0.4398", "1"],
|
|
383
|
+
// ],
|
|
384
|
+
// "bids": [
|
|
385
|
+
// ["4568.4", "0.84187666", "5"],
|
|
386
|
+
// ["4568.3", "0.75661506", "6"],
|
|
387
|
+
// ["4567.8", "2.01", "2"],
|
|
388
|
+
// ],
|
|
389
|
+
// "timestamp": "2020-03-16T11:11:43.388Z",
|
|
390
|
+
// "checksum": 473370408
|
|
391
|
+
// }
|
|
392
|
+
// ]
|
|
393
|
+
// }
|
|
394
|
+
//
|
|
395
|
+
// subsequent updates
|
|
396
|
+
//
|
|
397
|
+
// {
|
|
398
|
+
// "table": "spot/depth",
|
|
399
|
+
// "action": "update",
|
|
400
|
+
// "data": [
|
|
401
|
+
// {
|
|
402
|
+
// "instrument_id": "BTC-USDT",
|
|
403
|
+
// "asks": [
|
|
404
|
+
// ["4598.8", "0", "0"],
|
|
405
|
+
// ["4599.1", "0", "0"],
|
|
406
|
+
// ["4600.3", "0", "0"],
|
|
407
|
+
// ],
|
|
408
|
+
// "bids": [
|
|
409
|
+
// ["4598.5", "0.08", "1"],
|
|
410
|
+
// ["4598.2", "0.0337323", "1"],
|
|
411
|
+
// ["4598.1", "0.12681801", "3"],
|
|
412
|
+
// ],
|
|
413
|
+
// "timestamp": "2020-03-16T11:20:35.139Z",
|
|
414
|
+
// "checksum": 740786981
|
|
415
|
+
// }
|
|
416
|
+
// ]
|
|
417
|
+
// }
|
|
418
|
+
//
|
|
419
|
+
const action = this.safeString(message, 'action');
|
|
420
|
+
const data = this.safeValue(message, 'data', []);
|
|
421
|
+
const table = this.safeString(message, 'table');
|
|
422
|
+
if (action === 'partial') {
|
|
423
|
+
for (let i = 0; i < data.length; i++) {
|
|
424
|
+
const update = data[i];
|
|
425
|
+
const marketId = this.safeString(update, 'instrument_id');
|
|
426
|
+
const market = this.safeMarket(marketId);
|
|
427
|
+
const symbol = market['symbol'];
|
|
428
|
+
const options = this.safeValue(this.options, 'watchOrderBook', {});
|
|
429
|
+
// default limit is 400 bidasks
|
|
430
|
+
const limit = this.safeInteger(options, 'limit', 400);
|
|
431
|
+
const orderbook = this.orderBook({}, limit);
|
|
432
|
+
this.orderbooks[symbol] = orderbook;
|
|
433
|
+
this.handleOrderBookMessage(client, update, orderbook);
|
|
434
|
+
const messageHash = table + ':' + marketId;
|
|
435
|
+
client.resolve(orderbook, messageHash);
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
else {
|
|
439
|
+
for (let i = 0; i < data.length; i++) {
|
|
440
|
+
const update = data[i];
|
|
441
|
+
const marketId = this.safeString(update, 'instrument_id');
|
|
442
|
+
const market = this.safeMarket(marketId);
|
|
443
|
+
const symbol = market['symbol'];
|
|
444
|
+
if (symbol in this.orderbooks) {
|
|
445
|
+
const orderbook = this.orderbooks[symbol];
|
|
446
|
+
this.handleOrderBookMessage(client, update, orderbook);
|
|
447
|
+
const messageHash = table + ':' + marketId;
|
|
448
|
+
client.resolve(orderbook, messageHash);
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
return message;
|
|
453
|
+
}
|
|
454
|
+
async authenticate(params = {}) {
|
|
455
|
+
this.checkRequiredCredentials();
|
|
456
|
+
const url = this.urls['api']['ws'];
|
|
457
|
+
const messageHash = 'login';
|
|
458
|
+
const client = this.client(url);
|
|
459
|
+
let future = this.safeValue(client.subscriptions, messageHash);
|
|
460
|
+
if (future === undefined) {
|
|
461
|
+
future = client.future('authenticated');
|
|
462
|
+
const timestamp = this.seconds().toString();
|
|
463
|
+
const method = 'GET';
|
|
464
|
+
const path = '/users/self/verify';
|
|
465
|
+
const auth = timestamp + method + path;
|
|
466
|
+
const signature = this.hmac(this.encode(auth), this.encode(this.secret), sha256.sha256, 'base64');
|
|
467
|
+
const request = {
|
|
468
|
+
'op': messageHash,
|
|
469
|
+
'args': [
|
|
470
|
+
this.apiKey,
|
|
471
|
+
this.password,
|
|
472
|
+
timestamp,
|
|
473
|
+
signature,
|
|
474
|
+
],
|
|
475
|
+
};
|
|
476
|
+
this.spawn(this.watch, url, messageHash, request, messageHash, future);
|
|
477
|
+
}
|
|
478
|
+
return await future;
|
|
479
|
+
}
|
|
480
|
+
async watchBalance(params = {}) {
|
|
481
|
+
/**
|
|
482
|
+
* @method
|
|
483
|
+
* @name okcoin#watchBalance
|
|
484
|
+
* @description watch balance and get the amount of funds available for trading or funds locked in orders
|
|
485
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
486
|
+
* @returns {object} a [balance structure]{@link https://docs.ccxt.com/#/?id=balance-structure}
|
|
487
|
+
*/
|
|
488
|
+
const defaultType = this.safeString2(this.options, 'watchBalance', 'defaultType');
|
|
489
|
+
const type = this.safeString(params, 'type', defaultType);
|
|
490
|
+
if (type === undefined) {
|
|
491
|
+
throw new errors.ArgumentsRequired(this.id + " watchBalance requires a type parameter (one of 'spot', 'margin', 'futures', 'swap')");
|
|
492
|
+
}
|
|
493
|
+
// const query = this.omit (params, 'type');
|
|
494
|
+
const negotiation = await this.authenticate();
|
|
495
|
+
return await this.subscribeToUserAccount(negotiation, params);
|
|
496
|
+
}
|
|
497
|
+
async subscribeToUserAccount(negotiation, params = {}) {
|
|
498
|
+
const defaultType = this.safeString2(this.options, 'watchBalance', 'defaultType');
|
|
499
|
+
const type = this.safeString(params, 'type', defaultType);
|
|
500
|
+
if (type === undefined) {
|
|
501
|
+
throw new errors.ArgumentsRequired(this.id + " watchBalance requires a type parameter (one of 'spot', 'margin', 'futures', 'swap')");
|
|
502
|
+
}
|
|
503
|
+
await this.loadMarkets();
|
|
504
|
+
const currencyId = this.safeString(params, 'currency');
|
|
505
|
+
const code = this.safeString(params, 'code', this.safeCurrencyCode(currencyId));
|
|
506
|
+
let currency = undefined;
|
|
507
|
+
if (code !== undefined) {
|
|
508
|
+
currency = this.currency(code);
|
|
509
|
+
}
|
|
510
|
+
const symbol = this.safeString(params, 'symbol');
|
|
511
|
+
const market = this.market(symbol);
|
|
512
|
+
const marketUndefined = (market === undefined);
|
|
513
|
+
const currencyUndefined = (currency === undefined);
|
|
514
|
+
if (type === 'spot') {
|
|
515
|
+
if (currencyUndefined) {
|
|
516
|
+
throw new errors.ArgumentsRequired(this.id + " watchBalance requires a 'currency' (id) or a unified 'code' parameter for " + type + ' accounts');
|
|
517
|
+
}
|
|
518
|
+
}
|
|
519
|
+
else if ((type === 'margin') || (type === 'swap') || (type === 'option')) {
|
|
520
|
+
if (marketUndefined) {
|
|
521
|
+
throw new errors.ArgumentsRequired(this.id + " watchBalance requires a 'instrument_id' (id) or a unified 'symbol' parameter for " + type + ' accounts');
|
|
522
|
+
}
|
|
523
|
+
}
|
|
524
|
+
else if (type === 'futures') {
|
|
525
|
+
if (currencyUndefined && marketUndefined) {
|
|
526
|
+
throw new errors.ArgumentsRequired(this.id + " watchBalance requires a 'currency' (id), or unified 'code', or 'instrument_id' (id), or unified 'symbol' parameter for " + type + ' accounts');
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
let suffix = undefined;
|
|
530
|
+
if (!currencyUndefined) {
|
|
531
|
+
suffix = currency['id'];
|
|
532
|
+
}
|
|
533
|
+
else if (!marketUndefined) {
|
|
534
|
+
suffix = market['id'];
|
|
535
|
+
}
|
|
536
|
+
const accountType = (type === 'margin') ? 'spot' : type;
|
|
537
|
+
const account = (type === 'margin') ? 'margin_account' : 'account';
|
|
538
|
+
const messageHash = accountType + '/' + account;
|
|
539
|
+
const subscriptionHash = messageHash + ':' + suffix;
|
|
540
|
+
const url = this.urls['api']['ws'];
|
|
541
|
+
const request = {
|
|
542
|
+
'op': 'subscribe',
|
|
543
|
+
'args': [subscriptionHash],
|
|
544
|
+
};
|
|
545
|
+
const query = this.omit(params, ['currency', 'code', 'instrument_id', 'symbol', 'type']);
|
|
546
|
+
return await this.watch(url, messageHash, this.deepExtend(request, query), subscriptionHash);
|
|
547
|
+
}
|
|
548
|
+
handleBalance(client, message) {
|
|
549
|
+
//
|
|
550
|
+
// spot
|
|
551
|
+
//
|
|
552
|
+
// {
|
|
553
|
+
// "table": "spot/account",
|
|
554
|
+
// "data": [
|
|
555
|
+
// {
|
|
556
|
+
// "available": "11.044827320825",
|
|
557
|
+
// "currency": "USDT",
|
|
558
|
+
// "id": '',
|
|
559
|
+
// "balance": "11.044827320825",
|
|
560
|
+
// "hold": "0"
|
|
561
|
+
// }
|
|
562
|
+
// ]
|
|
563
|
+
// }
|
|
564
|
+
//
|
|
565
|
+
// margin
|
|
566
|
+
//
|
|
567
|
+
// {
|
|
568
|
+
// "table": "spot/margin_account",
|
|
569
|
+
// "data": [
|
|
570
|
+
// {
|
|
571
|
+
// "maint_margin_ratio": "0.08",
|
|
572
|
+
// "liquidation_price": "0",
|
|
573
|
+
// "currency:USDT": { available: "0", balance: "0", borrowed: "0", hold: "0", lending_fee: "0" },
|
|
574
|
+
// "tiers": "1",
|
|
575
|
+
// "instrument_id": "ETH-USDT",
|
|
576
|
+
// "currency:ETH": { available: "0", balance: "0", borrowed: "0", hold: "0", lending_fee: "0" }
|
|
577
|
+
// }
|
|
578
|
+
// ]
|
|
579
|
+
// }
|
|
580
|
+
//
|
|
581
|
+
const table = this.safeString(message, 'table');
|
|
582
|
+
const parts = table.split('/');
|
|
583
|
+
const data = this.safeValue(message, 'data', []);
|
|
584
|
+
this.balance['info'] = data;
|
|
585
|
+
let type = this.safeString(parts, 0);
|
|
586
|
+
if (type === 'spot') {
|
|
587
|
+
const part1 = this.safeString(parts, 1);
|
|
588
|
+
if (part1 === 'margin_account') {
|
|
589
|
+
type = 'margin';
|
|
590
|
+
}
|
|
591
|
+
}
|
|
592
|
+
for (let i = 0; i < data.length; i++) {
|
|
593
|
+
const balance = this.parseBalanceByType(type, data);
|
|
594
|
+
const oldBalance = this.safeValue(this.balance, type, {});
|
|
595
|
+
const newBalance = this.deepExtend(oldBalance, balance);
|
|
596
|
+
this.balance[type] = this.safeBalance(newBalance);
|
|
597
|
+
client.resolve(this.balance[type], table);
|
|
598
|
+
}
|
|
599
|
+
}
|
|
600
|
+
handleSubscriptionStatus(client, message) {
|
|
601
|
+
//
|
|
602
|
+
// {"event":"subscribe","channel":"spot/depth:BTC-USDT"}
|
|
603
|
+
//
|
|
604
|
+
// const channel = this.safeString (message, 'channel');
|
|
605
|
+
// client.subscriptions[channel] = message;
|
|
606
|
+
return message;
|
|
607
|
+
}
|
|
608
|
+
handleAuthenticate(client, message) {
|
|
609
|
+
//
|
|
610
|
+
// { event: "login", success: true }
|
|
611
|
+
//
|
|
612
|
+
client.resolve(message, 'authenticated');
|
|
613
|
+
return message;
|
|
614
|
+
}
|
|
615
|
+
ping(client) {
|
|
616
|
+
// okex does not support built-in ws protocol-level ping-pong
|
|
617
|
+
// instead it requires custom text-based ping-pong
|
|
618
|
+
return 'ping';
|
|
619
|
+
}
|
|
620
|
+
handlePong(client, message) {
|
|
621
|
+
client.lastPong = this.milliseconds();
|
|
622
|
+
return message;
|
|
623
|
+
}
|
|
624
|
+
handleErrorMessage(client, message) {
|
|
625
|
+
//
|
|
626
|
+
// { event: "error", message: "Invalid sign", errorCode: 30013 }
|
|
627
|
+
// {"event":"error","message":"Unrecognized request: {\"event\":\"subscribe\",\"channel\":\"spot/depth:BTC-USDT\"}","errorCode":30039}
|
|
628
|
+
// { event: "error", message: "Channel spot/order doesn't exist", errorCode: 30040 }
|
|
629
|
+
//
|
|
630
|
+
const errorCode = this.safeString(message, 'errorCode');
|
|
631
|
+
try {
|
|
632
|
+
if (errorCode !== undefined) {
|
|
633
|
+
const feedback = this.id + ' ' + this.json(message);
|
|
634
|
+
this.throwExactlyMatchedException(this.exceptions['exact'], errorCode, feedback);
|
|
635
|
+
const messageString = this.safeValue(message, 'message');
|
|
636
|
+
if (messageString !== undefined) {
|
|
637
|
+
this.throwBroadlyMatchedException(this.exceptions['broad'], messageString, feedback);
|
|
638
|
+
}
|
|
639
|
+
}
|
|
640
|
+
}
|
|
641
|
+
catch (e) {
|
|
642
|
+
if (e instanceof errors.AuthenticationError) {
|
|
643
|
+
client.reject(e, 'authenticated');
|
|
644
|
+
const method = 'login';
|
|
645
|
+
if (method in client.subscriptions) {
|
|
646
|
+
delete client.subscriptions[method];
|
|
647
|
+
}
|
|
648
|
+
return false;
|
|
649
|
+
}
|
|
650
|
+
}
|
|
651
|
+
return message;
|
|
652
|
+
}
|
|
653
|
+
handleMessage(client, message) {
|
|
654
|
+
if (!this.handleErrorMessage(client, message)) {
|
|
655
|
+
return;
|
|
656
|
+
}
|
|
657
|
+
//
|
|
658
|
+
// {"event":"error","message":"Unrecognized request: {\"event\":\"subscribe\",\"channel\":\"spot/depth:BTC-USDT\"}","errorCode":30039}
|
|
659
|
+
// {"event":"subscribe","channel":"spot/depth:BTC-USDT"}
|
|
660
|
+
// {
|
|
661
|
+
// "table": "spot/depth",
|
|
662
|
+
// "action": "partial",
|
|
663
|
+
// "data": [
|
|
664
|
+
// {
|
|
665
|
+
// "instrument_id": "BTC-USDT",
|
|
666
|
+
// "asks": [
|
|
667
|
+
// ["5301.8", "0.03763319", "1"],
|
|
668
|
+
// ["5302.4", "0.00305", "2"],
|
|
669
|
+
// ],
|
|
670
|
+
// "bids": [
|
|
671
|
+
// ["5301.7", "0.58911427", "6"],
|
|
672
|
+
// ["5301.6", "0.01222922", "4"],
|
|
673
|
+
// ],
|
|
674
|
+
// "timestamp": "2020-03-16T03:25:00.440Z",
|
|
675
|
+
// "checksum": -2088736623
|
|
676
|
+
// }
|
|
677
|
+
// ]
|
|
678
|
+
// }
|
|
679
|
+
// {
|
|
680
|
+
// "table":"spot/order",
|
|
681
|
+
// "data":[
|
|
682
|
+
// {
|
|
683
|
+
// "client_oid":"",
|
|
684
|
+
// "filled_notional":"0",
|
|
685
|
+
// "filled_size":"0",
|
|
686
|
+
// "instrument_id":"ETC-USDT",
|
|
687
|
+
// "last_fill_px":"0",
|
|
688
|
+
// "last_fill_qty":"0",
|
|
689
|
+
// "last_fill_time":"1970-01-01T00:00:00.000Z",
|
|
690
|
+
// "margin_trading":"1",
|
|
691
|
+
// "notional":"",
|
|
692
|
+
// "order_id":"3576398568830976",
|
|
693
|
+
// "order_type":"0",
|
|
694
|
+
// "price":"5.826",
|
|
695
|
+
// "side":"buy",
|
|
696
|
+
// "size":"0.1",
|
|
697
|
+
// "state":"0",
|
|
698
|
+
// "status":"open",
|
|
699
|
+
// "fee_currency":"ETC",
|
|
700
|
+
// "fee":"-0.01",
|
|
701
|
+
// "rebate_currency":"open",
|
|
702
|
+
// "rebate":"0.05",
|
|
703
|
+
// "timestamp":"2019-09-24T06:45:11.394Z",
|
|
704
|
+
// "type":"limit",
|
|
705
|
+
// "created_at":"2019-09-24T06:45:11.394Z"
|
|
706
|
+
// }
|
|
707
|
+
// ]
|
|
708
|
+
// }
|
|
709
|
+
//
|
|
710
|
+
if (message === 'pong') {
|
|
711
|
+
return this.handlePong(client, message);
|
|
712
|
+
}
|
|
713
|
+
const table = this.safeString(message, 'table');
|
|
714
|
+
if (table === undefined) {
|
|
715
|
+
const event = this.safeString(message, 'event');
|
|
716
|
+
if (event !== undefined) {
|
|
717
|
+
const methods = {
|
|
718
|
+
// 'info': this.handleSystemStatus,
|
|
719
|
+
// 'book': 'handleOrderBook',
|
|
720
|
+
'login': this.handleAuthenticate,
|
|
721
|
+
'subscribe': this.handleSubscriptionStatus,
|
|
722
|
+
};
|
|
723
|
+
const method = this.safeValue(methods, event);
|
|
724
|
+
if (method === undefined) {
|
|
725
|
+
return message;
|
|
726
|
+
}
|
|
727
|
+
else {
|
|
728
|
+
return method.call(this, client, message);
|
|
729
|
+
}
|
|
730
|
+
}
|
|
731
|
+
}
|
|
732
|
+
else {
|
|
733
|
+
const parts = table.split('/');
|
|
734
|
+
const name = this.safeString(parts, 1);
|
|
735
|
+
const methods = {
|
|
736
|
+
'depth': this.handleOrderBook,
|
|
737
|
+
'depth5': this.handleOrderBook,
|
|
738
|
+
'depth_l2_tbt': this.handleOrderBook,
|
|
739
|
+
'ticker': this.handleTicker,
|
|
740
|
+
'trade': this.handleTrade,
|
|
741
|
+
'account': this.handleBalance,
|
|
742
|
+
'margin_account': this.handleBalance,
|
|
743
|
+
'order': this.handleOrders,
|
|
744
|
+
// ...
|
|
745
|
+
};
|
|
746
|
+
let method = this.safeValue(methods, name);
|
|
747
|
+
if (name.indexOf('candle') >= 0) {
|
|
748
|
+
method = this.handleOHLCV;
|
|
749
|
+
}
|
|
750
|
+
if (method === undefined) {
|
|
751
|
+
return message;
|
|
752
|
+
}
|
|
753
|
+
else {
|
|
754
|
+
return method.call(this, client, message);
|
|
755
|
+
}
|
|
756
|
+
}
|
|
757
|
+
}
|
|
758
|
+
}
|
|
759
|
+
|
|
760
|
+
module.exports = okcoin;
|