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,1510 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var cex$1 = require('../cex.js');
|
|
4
|
+
var sha256 = require('../static_dependencies/noble-hashes/sha256.js');
|
|
5
|
+
var errors = require('../base/errors.js');
|
|
6
|
+
var Precise = require('../base/Precise.js');
|
|
7
|
+
var Cache = require('../base/ws/Cache.js');
|
|
8
|
+
|
|
9
|
+
// ---------------------------------------------------------------------------
|
|
10
|
+
// ---------------------------------------------------------------------------
|
|
11
|
+
class cex extends cex$1 {
|
|
12
|
+
describe() {
|
|
13
|
+
return this.deepExtend(super.describe(), {
|
|
14
|
+
'has': {
|
|
15
|
+
'ws': true,
|
|
16
|
+
'watchBalance': true,
|
|
17
|
+
'watchTicker': true,
|
|
18
|
+
'watchTickers': true,
|
|
19
|
+
'watchTrades': true,
|
|
20
|
+
'watchMyTrades': true,
|
|
21
|
+
'watchOrders': true,
|
|
22
|
+
'watchOrderBook': true,
|
|
23
|
+
'watchOHLCV': true,
|
|
24
|
+
'watchPosition': undefined,
|
|
25
|
+
'createOrderWs': true,
|
|
26
|
+
'editOrderWs': true,
|
|
27
|
+
'cancelOrderWs': true,
|
|
28
|
+
'cancelOrdersWs': true,
|
|
29
|
+
'fetchOrderWs': true,
|
|
30
|
+
'fetchOpenOrdersWs': true,
|
|
31
|
+
'fetchTickerWs': true,
|
|
32
|
+
'fetchBalanceWs': true,
|
|
33
|
+
},
|
|
34
|
+
'urls': {
|
|
35
|
+
'api': {
|
|
36
|
+
'ws': 'wss://ws.cex.io/ws',
|
|
37
|
+
},
|
|
38
|
+
},
|
|
39
|
+
'options': {
|
|
40
|
+
'orderbook': {},
|
|
41
|
+
},
|
|
42
|
+
'streaming': {},
|
|
43
|
+
'exceptions': {},
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
requestId() {
|
|
47
|
+
const requestId = this.sum(this.safeInteger(this.options, 'requestId', 0), 1);
|
|
48
|
+
this.options['requestId'] = requestId;
|
|
49
|
+
return requestId.toString();
|
|
50
|
+
}
|
|
51
|
+
async watchBalance(params = {}) {
|
|
52
|
+
/**
|
|
53
|
+
* @method
|
|
54
|
+
* @name cex#watchBalance
|
|
55
|
+
* @description watch balance and get the amount of funds available for trading or funds locked in orders
|
|
56
|
+
* @see https://cex.io/websocket-api#get-balance
|
|
57
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
58
|
+
* @returns {object} a [balance structure]{@link https://docs.ccxt.com/#/?id=balance-structure}
|
|
59
|
+
*/
|
|
60
|
+
await this.authenticate(params);
|
|
61
|
+
const messageHash = this.requestId();
|
|
62
|
+
const url = this.urls['api']['ws'];
|
|
63
|
+
const subscribe = {
|
|
64
|
+
'e': 'get-balance',
|
|
65
|
+
'data': {},
|
|
66
|
+
'oid': this.requestId(),
|
|
67
|
+
};
|
|
68
|
+
const request = this.deepExtend(subscribe, params);
|
|
69
|
+
return await this.watch(url, messageHash, request, messageHash, request);
|
|
70
|
+
}
|
|
71
|
+
handleBalance(client, message) {
|
|
72
|
+
//
|
|
73
|
+
// {
|
|
74
|
+
// "e": "get-balance",
|
|
75
|
+
// "data": {
|
|
76
|
+
// "balance": {
|
|
77
|
+
// "BTC": "0.00000000",
|
|
78
|
+
// "USD": "0.00",
|
|
79
|
+
// ...
|
|
80
|
+
// },
|
|
81
|
+
// "obalance": {
|
|
82
|
+
// "BTC": "0.00000000",
|
|
83
|
+
// "USD": "0.00",
|
|
84
|
+
// ...
|
|
85
|
+
// },
|
|
86
|
+
// "time": 1663761159605
|
|
87
|
+
// },
|
|
88
|
+
// "oid": 1,
|
|
89
|
+
// "ok": "ok"
|
|
90
|
+
// }
|
|
91
|
+
//
|
|
92
|
+
const data = this.safeValue(message, 'data', {});
|
|
93
|
+
const freeBalance = this.safeValue(data, 'balance', {});
|
|
94
|
+
const usedBalance = this.safeValue(data, 'obalance', {});
|
|
95
|
+
const result = {
|
|
96
|
+
'info': data,
|
|
97
|
+
};
|
|
98
|
+
const currencyIds = Object.keys(freeBalance);
|
|
99
|
+
for (let i = 0; i < currencyIds.length; i++) {
|
|
100
|
+
const currencyId = currencyIds[i];
|
|
101
|
+
const account = this.account();
|
|
102
|
+
account['free'] = this.safeString(freeBalance, currencyId);
|
|
103
|
+
account['used'] = this.safeString(usedBalance, currencyId);
|
|
104
|
+
const code = this.safeCurrencyCode(currencyId);
|
|
105
|
+
result[code] = account;
|
|
106
|
+
}
|
|
107
|
+
this.balance = this.safeBalance(result);
|
|
108
|
+
const messageHash = this.safeString(message, 'oid');
|
|
109
|
+
client.resolve(this.balance, messageHash);
|
|
110
|
+
}
|
|
111
|
+
async watchTrades(symbol, since = undefined, limit = undefined, params = {}) {
|
|
112
|
+
/**
|
|
113
|
+
* @method
|
|
114
|
+
* @name cex#watchTrades
|
|
115
|
+
* @description get the list of most recent trades for a particular symbol. Note: can only watch one symbol at a time.
|
|
116
|
+
* @see https://cex.io/websocket-api#old-pair-room
|
|
117
|
+
* @param {string} symbol unified symbol of the market to fetch trades for
|
|
118
|
+
* @param {int} [since] timestamp in ms of the earliest trade to fetch
|
|
119
|
+
* @param {int} [limit] the maximum amount of trades to fetch
|
|
120
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
121
|
+
* @returns {object[]} a list of [trade structures]{@link https://docs.ccxt.com/#/?id=public-trades}
|
|
122
|
+
*/
|
|
123
|
+
await this.loadMarkets();
|
|
124
|
+
const market = this.market(symbol);
|
|
125
|
+
symbol = market['symbol'];
|
|
126
|
+
const url = this.urls['api']['ws'];
|
|
127
|
+
const messageHash = 'trades';
|
|
128
|
+
const subscriptionHash = 'old:' + symbol;
|
|
129
|
+
const client = this.safeValue(this.clients, url);
|
|
130
|
+
if (client !== undefined) {
|
|
131
|
+
const subscriptionKeys = Object.keys(client.subscriptions);
|
|
132
|
+
for (let i = 0; i < subscriptionKeys.length; i++) {
|
|
133
|
+
let subscriptionKey = subscriptionKeys[i];
|
|
134
|
+
if (subscriptionKey === subscriptionHash) {
|
|
135
|
+
continue;
|
|
136
|
+
}
|
|
137
|
+
subscriptionKey = subscriptionKey.slice(0, 3);
|
|
138
|
+
if (subscriptionKey === 'old') {
|
|
139
|
+
throw new errors.ExchangeError(this.id + ' watchTrades() only supports watching one symbol at a time.');
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
const message = {
|
|
144
|
+
'e': 'subscribe',
|
|
145
|
+
'rooms': ['pair-' + market['base'] + '-' + market['quote']],
|
|
146
|
+
};
|
|
147
|
+
const request = this.deepExtend(message, params);
|
|
148
|
+
const trades = await this.watch(url, messageHash, request, subscriptionHash);
|
|
149
|
+
// assing symbol to the trades as message does not contain symbol information
|
|
150
|
+
for (let i = 0; i < trades.length; i++) {
|
|
151
|
+
trades[i]['symbol'] = symbol;
|
|
152
|
+
}
|
|
153
|
+
return this.filterBySinceLimit(trades, since, limit, 'timestamp', true);
|
|
154
|
+
}
|
|
155
|
+
handleTradesSnapshot(client, message) {
|
|
156
|
+
//
|
|
157
|
+
// {
|
|
158
|
+
// "e": "history",
|
|
159
|
+
// "data": [
|
|
160
|
+
// "sell:1665467367741:3888551:19058.8:14541219",
|
|
161
|
+
// "buy:1665467367741:1059339:19071.5:14541218",
|
|
162
|
+
// ]
|
|
163
|
+
// }
|
|
164
|
+
//
|
|
165
|
+
const data = this.safeValue(message, 'data', []);
|
|
166
|
+
const limit = this.safeInteger(this.options, 'tradesLimit', 1000);
|
|
167
|
+
const stored = new Cache.ArrayCache(limit);
|
|
168
|
+
for (let i = 0; i < data.length; i++) {
|
|
169
|
+
const rawTrade = data[i];
|
|
170
|
+
const parsed = this.parseWsOldTrade(rawTrade);
|
|
171
|
+
stored.append(parsed);
|
|
172
|
+
}
|
|
173
|
+
const messageHash = 'trades';
|
|
174
|
+
this.trades = stored;
|
|
175
|
+
client.resolve(this.trades, messageHash);
|
|
176
|
+
}
|
|
177
|
+
parseWsOldTrade(trade, market = undefined) {
|
|
178
|
+
//
|
|
179
|
+
// snapshot trade
|
|
180
|
+
// "sell:1665467367741:3888551:19058.8:14541219"
|
|
181
|
+
// update trade
|
|
182
|
+
// ['buy', '1665467516704', '98070', "19057.7", "14541220"]
|
|
183
|
+
//
|
|
184
|
+
if (!Array.isArray(trade)) {
|
|
185
|
+
trade = trade.split(':');
|
|
186
|
+
}
|
|
187
|
+
const side = this.safeString(trade, 0);
|
|
188
|
+
const timestamp = this.safeNumber(trade, 1);
|
|
189
|
+
const amount = this.safeString(trade, 2);
|
|
190
|
+
const price = this.safeString(trade, 3);
|
|
191
|
+
const id = this.safeString(trade, 4);
|
|
192
|
+
return this.safeTrade({
|
|
193
|
+
'info': trade,
|
|
194
|
+
'id': id,
|
|
195
|
+
'timestamp': timestamp,
|
|
196
|
+
'datetime': this.iso8601(timestamp),
|
|
197
|
+
'symbol': undefined,
|
|
198
|
+
'type': undefined,
|
|
199
|
+
'side': side,
|
|
200
|
+
'order': undefined,
|
|
201
|
+
'takerOrMaker': undefined,
|
|
202
|
+
'price': price,
|
|
203
|
+
'amount': amount,
|
|
204
|
+
'cost': undefined,
|
|
205
|
+
'fee': undefined,
|
|
206
|
+
}, market);
|
|
207
|
+
}
|
|
208
|
+
handleTrade(client, message) {
|
|
209
|
+
//
|
|
210
|
+
// {
|
|
211
|
+
// "e": "history-update",
|
|
212
|
+
// "data": [
|
|
213
|
+
// ['buy', '1665467516704', '98070', "19057.7", "14541220"]
|
|
214
|
+
// ]
|
|
215
|
+
// }
|
|
216
|
+
//
|
|
217
|
+
const data = this.safeValue(message, 'data', []);
|
|
218
|
+
const stored = this.trades;
|
|
219
|
+
for (let i = 0; i < data.length; i++) {
|
|
220
|
+
const rawTrade = data[i];
|
|
221
|
+
const parsed = this.parseWsOldTrade(rawTrade);
|
|
222
|
+
stored.append(parsed);
|
|
223
|
+
}
|
|
224
|
+
const messageHash = 'trades';
|
|
225
|
+
this.trades = stored;
|
|
226
|
+
client.resolve(this.trades, messageHash);
|
|
227
|
+
}
|
|
228
|
+
async watchTicker(symbol, params = {}) {
|
|
229
|
+
/**
|
|
230
|
+
* @method
|
|
231
|
+
* @name cex#watchTicker
|
|
232
|
+
* @see https://cex.io/websocket-api#ticker-subscription
|
|
233
|
+
* @description watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
|
|
234
|
+
* @param {string} symbol unified symbol of the market to fetch the ticker for
|
|
235
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
236
|
+
* @param {string} [params.method] public or private
|
|
237
|
+
* @returns {object} a [ticker structure]{@link https://docs.ccxt.com/#/?id=ticker-structure}
|
|
238
|
+
*/
|
|
239
|
+
await this.loadMarkets();
|
|
240
|
+
const market = this.market(symbol);
|
|
241
|
+
symbol = market['symbol'];
|
|
242
|
+
const url = this.urls['api']['ws'];
|
|
243
|
+
const messageHash = 'ticker:' + symbol;
|
|
244
|
+
const method = this.safeString(params, 'method', 'private'); // default to private because the specified ticker is received quicker
|
|
245
|
+
let message = {
|
|
246
|
+
'e': 'subscribe',
|
|
247
|
+
'rooms': [
|
|
248
|
+
'tickers',
|
|
249
|
+
],
|
|
250
|
+
};
|
|
251
|
+
let subscriptionHash = 'tickers';
|
|
252
|
+
if (method === 'private') {
|
|
253
|
+
await this.authenticate();
|
|
254
|
+
message = {
|
|
255
|
+
'e': 'ticker',
|
|
256
|
+
'data': [
|
|
257
|
+
market['baseId'], market['quoteId'],
|
|
258
|
+
],
|
|
259
|
+
'oid': this.requestId(),
|
|
260
|
+
};
|
|
261
|
+
subscriptionHash = 'ticker:' + symbol;
|
|
262
|
+
}
|
|
263
|
+
const request = this.deepExtend(message, params);
|
|
264
|
+
return await this.watch(url, messageHash, request, subscriptionHash);
|
|
265
|
+
}
|
|
266
|
+
async watchTickers(symbols = undefined, params = {}) {
|
|
267
|
+
/**
|
|
268
|
+
* @method
|
|
269
|
+
* @name cex#watchTickers
|
|
270
|
+
* @see https://cex.io/websocket-api#ticker-subscription
|
|
271
|
+
* @description watches price tickers for multiple markets, statistical information calculated over the past 24 hours for each market
|
|
272
|
+
* @param {string[]|undefined} symbols unified symbols of the markets to fetch the ticker for, all market tickers are returned if not assigned
|
|
273
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
274
|
+
* @returns {object} a dictionary of [ticker structures]{@link https://docs.ccxt.com/#/?id=ticker-structure}
|
|
275
|
+
*/
|
|
276
|
+
await this.loadMarkets();
|
|
277
|
+
symbols = this.marketSymbols(symbols);
|
|
278
|
+
const url = this.urls['api']['ws'];
|
|
279
|
+
const messageHash = 'tickers';
|
|
280
|
+
const message = {
|
|
281
|
+
'e': 'subscribe',
|
|
282
|
+
'rooms': [
|
|
283
|
+
'tickers',
|
|
284
|
+
],
|
|
285
|
+
};
|
|
286
|
+
const request = this.deepExtend(message, params);
|
|
287
|
+
const ticker = await this.watch(url, messageHash, request, messageHash);
|
|
288
|
+
const tickerSymbol = ticker['symbol'];
|
|
289
|
+
if (symbols !== undefined && !this.inArray(tickerSymbol, symbols)) {
|
|
290
|
+
return await this.watchTickers(symbols, params);
|
|
291
|
+
}
|
|
292
|
+
if (this.newUpdates) {
|
|
293
|
+
const result = {};
|
|
294
|
+
result[tickerSymbol] = ticker;
|
|
295
|
+
return result;
|
|
296
|
+
}
|
|
297
|
+
return this.filterByArray(this.tickers, 'symbol', symbols);
|
|
298
|
+
}
|
|
299
|
+
async fetchTickerWs(symbol, params = {}) {
|
|
300
|
+
/**
|
|
301
|
+
* @method
|
|
302
|
+
* @name cex#fetchTickerWs
|
|
303
|
+
* @see https://docs.cex.io/#ws-api-ticker-deprecated
|
|
304
|
+
* @description fetches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
|
|
305
|
+
* @param {string} symbol unified symbol of the market to fetch the ticker for
|
|
306
|
+
* @param {object} [params] extra parameters specific to the cex api endpoint
|
|
307
|
+
* @returns {object} a [ticker structure]{@link https://docs.ccxt.com/#/?id=ticker-structure}
|
|
308
|
+
*/
|
|
309
|
+
await this.loadMarkets();
|
|
310
|
+
const market = this.market(symbol);
|
|
311
|
+
const url = this.urls['api']['ws'];
|
|
312
|
+
const messageHash = this.requestId();
|
|
313
|
+
const request = this.extend({
|
|
314
|
+
'e': 'ticker',
|
|
315
|
+
'oid': messageHash,
|
|
316
|
+
'data': [market['base'], market['quote']],
|
|
317
|
+
}, params);
|
|
318
|
+
return await this.watch(url, messageHash, request, messageHash);
|
|
319
|
+
}
|
|
320
|
+
handleTicker(client, message) {
|
|
321
|
+
//
|
|
322
|
+
// {
|
|
323
|
+
// "e": "tick",
|
|
324
|
+
// "data": {
|
|
325
|
+
// "symbol1": "LRC",
|
|
326
|
+
// "symbol2": "USD",
|
|
327
|
+
// "price": "0.305",
|
|
328
|
+
// "open24": "0.301",
|
|
329
|
+
// "volume": "241421.641700"
|
|
330
|
+
// }
|
|
331
|
+
// }
|
|
332
|
+
//
|
|
333
|
+
const data = this.safeValue(message, 'data', {});
|
|
334
|
+
const ticker = this.parseWsTicker(data);
|
|
335
|
+
const symbol = ticker['symbol'];
|
|
336
|
+
this.tickers[symbol] = ticker;
|
|
337
|
+
let messageHash = 'ticker:' + symbol;
|
|
338
|
+
client.resolve(ticker, messageHash);
|
|
339
|
+
client.resolve(ticker, 'tickers');
|
|
340
|
+
messageHash = this.safeString(message, 'oid');
|
|
341
|
+
client.resolve(ticker, messageHash);
|
|
342
|
+
}
|
|
343
|
+
parseWsTicker(ticker, market = undefined) {
|
|
344
|
+
//
|
|
345
|
+
// public
|
|
346
|
+
// {
|
|
347
|
+
// "symbol1": "LRC",
|
|
348
|
+
// "symbol2": "USD",
|
|
349
|
+
// "price": "0.305",
|
|
350
|
+
// "open24": "0.301",
|
|
351
|
+
// "volume": "241421.641700"
|
|
352
|
+
// }
|
|
353
|
+
// private
|
|
354
|
+
// {
|
|
355
|
+
// "timestamp": "1663764969",
|
|
356
|
+
// "low": "18756.3",
|
|
357
|
+
// "high": "19200",
|
|
358
|
+
// "last": "19200",
|
|
359
|
+
// "volume": "0.94735907",
|
|
360
|
+
// "volume30d": "64.61299999",
|
|
361
|
+
// "bid": 19217.2,
|
|
362
|
+
// "ask": 19247.5,
|
|
363
|
+
// "priceChange": "44.3",
|
|
364
|
+
// "priceChangePercentage": "0.23",
|
|
365
|
+
// "pair": ["BTC", "USDT"]
|
|
366
|
+
// }
|
|
367
|
+
const pair = this.safeValue(ticker, 'pair', []);
|
|
368
|
+
let baseId = this.safeString(ticker, 'symbol1');
|
|
369
|
+
if (baseId === undefined) {
|
|
370
|
+
baseId = this.safeString(pair, 0);
|
|
371
|
+
}
|
|
372
|
+
let quoteId = this.safeString(ticker, 'symbol2');
|
|
373
|
+
if (quoteId === undefined) {
|
|
374
|
+
quoteId = this.safeString(pair, 1);
|
|
375
|
+
}
|
|
376
|
+
const base = this.safeCurrencyCode(baseId);
|
|
377
|
+
const quote = this.safeCurrencyCode(quoteId);
|
|
378
|
+
const symbol = base + '/' + quote;
|
|
379
|
+
let timestamp = this.safeInteger(ticker, 'timestamp');
|
|
380
|
+
if (timestamp !== undefined) {
|
|
381
|
+
timestamp = timestamp * 1000;
|
|
382
|
+
}
|
|
383
|
+
return this.safeTicker({
|
|
384
|
+
'symbol': symbol,
|
|
385
|
+
'timestamp': timestamp,
|
|
386
|
+
'datetime': this.iso8601(timestamp),
|
|
387
|
+
'high': this.safeString(ticker, 'high'),
|
|
388
|
+
'low': this.safeString(ticker, 'low'),
|
|
389
|
+
'bid': this.safeString(ticker, 'bid'),
|
|
390
|
+
'bidVolume': undefined,
|
|
391
|
+
'ask': this.safeString(ticker, 'ask'),
|
|
392
|
+
'askVolume': undefined,
|
|
393
|
+
'vwap': undefined,
|
|
394
|
+
'open': this.safeString(ticker, 'open24'),
|
|
395
|
+
'close': undefined,
|
|
396
|
+
'last': this.safeString2(ticker, 'price', 'last'),
|
|
397
|
+
'previousClose': undefined,
|
|
398
|
+
'change': this.safeString(ticker, 'priceChange'),
|
|
399
|
+
'percentage': this.safeString(ticker, 'priceChangePercentage'),
|
|
400
|
+
'average': undefined,
|
|
401
|
+
'baseVolume': undefined,
|
|
402
|
+
'quoteVolume': this.safeString(ticker, 'volume'),
|
|
403
|
+
'info': ticker,
|
|
404
|
+
}, market);
|
|
405
|
+
}
|
|
406
|
+
async fetchBalanceWs(params = {}) {
|
|
407
|
+
/**
|
|
408
|
+
* @method
|
|
409
|
+
* @name cex#fetchBalanceWs
|
|
410
|
+
* @see https://docs.cex.io/#ws-api-get-balance
|
|
411
|
+
* @description query for balance and get the amount of funds available for trading or funds locked in orders
|
|
412
|
+
* @param {object} [params] extra parameters specific to the cex api endpoint
|
|
413
|
+
* @returns {object} a [balance structure]{@link https://docs.ccxt.com/#/?id=balance-structure}
|
|
414
|
+
*/
|
|
415
|
+
await this.loadMarkets();
|
|
416
|
+
await this.authenticate();
|
|
417
|
+
const url = this.urls['api']['ws'];
|
|
418
|
+
const messageHash = this.requestId();
|
|
419
|
+
const request = this.extend({
|
|
420
|
+
'e': 'get-balance',
|
|
421
|
+
'oid': messageHash,
|
|
422
|
+
}, params);
|
|
423
|
+
return await this.watch(url, messageHash, request, messageHash);
|
|
424
|
+
}
|
|
425
|
+
async watchOrders(symbol = undefined, since = undefined, limit = undefined, params = {}) {
|
|
426
|
+
/**
|
|
427
|
+
* @method
|
|
428
|
+
* @name cex#watchOrders
|
|
429
|
+
* @description get the list of orders associated with the user. Note: In CEX.IO system, orders can be present in trade engine or in archive database. There can be time periods (~2 seconds or more), when order is done/canceled, but still not moved to archive database. That means, you cannot see it using calls: archived-orders/open-orders.
|
|
430
|
+
* @see https://docs.cex.io/#ws-api-open-orders
|
|
431
|
+
* @param {string} symbol unified symbol of the market to fetch trades for
|
|
432
|
+
* @param {int} [since] timestamp in ms of the earliest trade to fetch
|
|
433
|
+
* @param {int} [limit] the maximum amount of trades to fetch
|
|
434
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
435
|
+
* @returns {object[]} a list of [trade structures]{@link https://docs.ccxt.com/#/?id=public-trades}
|
|
436
|
+
*/
|
|
437
|
+
if (symbol === undefined) {
|
|
438
|
+
throw new errors.ArgumentsRequired(this.id + ' watchOrders() requires a symbol argument');
|
|
439
|
+
}
|
|
440
|
+
await this.loadMarkets();
|
|
441
|
+
await this.authenticate(params);
|
|
442
|
+
const url = this.urls['api']['ws'];
|
|
443
|
+
const market = this.market(symbol);
|
|
444
|
+
symbol = market['symbol'];
|
|
445
|
+
const messageHash = 'orders:' + symbol;
|
|
446
|
+
const message = {
|
|
447
|
+
'e': 'open-orders',
|
|
448
|
+
'data': {
|
|
449
|
+
'pair': [
|
|
450
|
+
market['baseId'],
|
|
451
|
+
market['quoteId'],
|
|
452
|
+
],
|
|
453
|
+
},
|
|
454
|
+
'oid': symbol,
|
|
455
|
+
};
|
|
456
|
+
const request = this.deepExtend(message, params);
|
|
457
|
+
const orders = await this.watch(url, messageHash, request, messageHash, request);
|
|
458
|
+
if (this.newUpdates) {
|
|
459
|
+
limit = orders.getLimit(symbol, limit);
|
|
460
|
+
}
|
|
461
|
+
return this.filterBySymbolSinceLimit(orders, symbol, since, limit, true);
|
|
462
|
+
}
|
|
463
|
+
async watchMyTrades(symbol = undefined, since = undefined, limit = undefined, params = {}) {
|
|
464
|
+
/**
|
|
465
|
+
* @method
|
|
466
|
+
* @name cex#watchMyTrades
|
|
467
|
+
* @description get the list of trades associated with the user. Note: In CEX.IO system, orders can be present in trade engine or in archive database. There can be time periods (~2 seconds or more), when order is done/canceled, but still not moved to archive database. That means, you cannot see it using calls: archived-orders/open-orders.
|
|
468
|
+
* @see https://docs.cex.io/#ws-api-open-orders
|
|
469
|
+
* @param {string} symbol unified symbol of the market to fetch trades for
|
|
470
|
+
* @param {int} [since] timestamp in ms of the earliest trade to fetch
|
|
471
|
+
* @param {int} [limit] the maximum amount of trades to fetch
|
|
472
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
473
|
+
* @returns {object[]} a list of [trade structures]{@link https://docs.ccxt.com/#/?id=public-trades}
|
|
474
|
+
*/
|
|
475
|
+
if (symbol === undefined) {
|
|
476
|
+
throw new errors.ArgumentsRequired(this.id + ' watchMyTrades() requires a symbol argument');
|
|
477
|
+
}
|
|
478
|
+
await this.loadMarkets();
|
|
479
|
+
await this.authenticate(params);
|
|
480
|
+
const url = this.urls['api']['ws'];
|
|
481
|
+
const market = this.market(symbol);
|
|
482
|
+
const messageHash = 'myTrades:' + market['symbol'];
|
|
483
|
+
const subscriptionHash = 'orders:' + market['symbol'];
|
|
484
|
+
const message = {
|
|
485
|
+
'e': 'open-orders',
|
|
486
|
+
'data': {
|
|
487
|
+
'pair': [
|
|
488
|
+
market['baseId'],
|
|
489
|
+
market['quoteId'],
|
|
490
|
+
],
|
|
491
|
+
},
|
|
492
|
+
'oid': market['symbol'],
|
|
493
|
+
};
|
|
494
|
+
const request = this.deepExtend(message, params);
|
|
495
|
+
const orders = await this.watch(url, messageHash, request, subscriptionHash, request);
|
|
496
|
+
return this.filterBySymbolSinceLimit(orders, market['symbol'], since, limit);
|
|
497
|
+
}
|
|
498
|
+
handleTransaction(client, message) {
|
|
499
|
+
const data = this.safeValue(message, 'data');
|
|
500
|
+
const symbol2 = this.safeString(data, 'symbol2');
|
|
501
|
+
if (symbol2 === undefined) {
|
|
502
|
+
return;
|
|
503
|
+
}
|
|
504
|
+
this.handleOrderUpdate(client, message);
|
|
505
|
+
this.handleMyTrades(client, message);
|
|
506
|
+
}
|
|
507
|
+
handleMyTrades(client, message) {
|
|
508
|
+
//
|
|
509
|
+
// {
|
|
510
|
+
// "e": "tx",
|
|
511
|
+
// "data": {
|
|
512
|
+
// "d": "order:59091012956:a:USD",
|
|
513
|
+
// "c": "user:up105393824:a:USD",
|
|
514
|
+
// "a": "0.01",
|
|
515
|
+
// "ds": 0,
|
|
516
|
+
// "cs": "15.27",
|
|
517
|
+
// "user": "up105393824",
|
|
518
|
+
// "symbol": "USD",
|
|
519
|
+
// "order": 59091012956,
|
|
520
|
+
// "amount": "-18.49",
|
|
521
|
+
// "type": "buy",
|
|
522
|
+
// "time": "2022-09-24T19:36:18.466Z",
|
|
523
|
+
// "balance": "15.27",
|
|
524
|
+
// "id": "59091012966"
|
|
525
|
+
// }
|
|
526
|
+
// }
|
|
527
|
+
// {
|
|
528
|
+
// "e": "tx",
|
|
529
|
+
// "data": {
|
|
530
|
+
// "d": "order:59091012956:a:BTC",
|
|
531
|
+
// "c": "user:up105393824:a:BTC",
|
|
532
|
+
// "a": "0.00096420",
|
|
533
|
+
// "ds": 0,
|
|
534
|
+
// "cs": "0.00096420",
|
|
535
|
+
// "user": "up105393824",
|
|
536
|
+
// "symbol": "BTC",
|
|
537
|
+
// "symbol2": "USD",
|
|
538
|
+
// "amount": "0.00096420",
|
|
539
|
+
// "buy": 59091012956,
|
|
540
|
+
// "order": 59091012956,
|
|
541
|
+
// "sell": 59090796005,
|
|
542
|
+
// "price": 19135,
|
|
543
|
+
// "type": "buy",
|
|
544
|
+
// "time": "2022-09-24T19:36:18.466Z",
|
|
545
|
+
// "balance": "0.00096420",
|
|
546
|
+
// "fee_amount": "0.05",
|
|
547
|
+
// "id": "59091012962"
|
|
548
|
+
// }
|
|
549
|
+
// }
|
|
550
|
+
const data = this.safeValue(message, 'data', {});
|
|
551
|
+
let stored = this.myTrades;
|
|
552
|
+
if (stored === undefined) {
|
|
553
|
+
const limit = this.safeInteger(this.options, 'tradesLimit', 1000);
|
|
554
|
+
stored = new Cache.ArrayCacheBySymbolById(limit);
|
|
555
|
+
this.myTrades = stored;
|
|
556
|
+
}
|
|
557
|
+
const trade = this.parseWsTrade(data);
|
|
558
|
+
stored.append(trade);
|
|
559
|
+
const messageHash = 'myTrades:' + trade['symbol'];
|
|
560
|
+
client.resolve(stored, messageHash);
|
|
561
|
+
}
|
|
562
|
+
parseWsTrade(trade, market = undefined) {
|
|
563
|
+
//
|
|
564
|
+
// {
|
|
565
|
+
// "d": "order:59091012956:a:BTC",
|
|
566
|
+
// "c": "user:up105393824:a:BTC",
|
|
567
|
+
// "a": "0.00096420",
|
|
568
|
+
// "ds": 0,
|
|
569
|
+
// "cs": "0.00096420",
|
|
570
|
+
// "user": "up105393824",
|
|
571
|
+
// "symbol": "BTC",
|
|
572
|
+
// "symbol2": "USD",
|
|
573
|
+
// "amount": "0.00096420",
|
|
574
|
+
// "buy": 59091012956,
|
|
575
|
+
// "order": 59091012956,
|
|
576
|
+
// "sell": 59090796005,
|
|
577
|
+
// "price": 19135,
|
|
578
|
+
// "type": "buy",
|
|
579
|
+
// "time": "2022-09-24T19:36:18.466Z",
|
|
580
|
+
// "balance": "0.00096420",
|
|
581
|
+
// "fee_amount": "0.05",
|
|
582
|
+
// "id": "59091012962"
|
|
583
|
+
// }
|
|
584
|
+
// Note symbol and symbol2 are inverse on sell and ammount is in symbol currency.
|
|
585
|
+
//
|
|
586
|
+
const side = this.safeString(trade, 'type');
|
|
587
|
+
const price = this.safeString(trade, 'price');
|
|
588
|
+
const datetime = this.safeString(trade, 'time');
|
|
589
|
+
const baseId = this.safeString(trade, 'symbol');
|
|
590
|
+
const quoteId = this.safeString(trade, 'symbol2');
|
|
591
|
+
const base = this.safeCurrencyCode(baseId);
|
|
592
|
+
const quote = this.safeCurrencyCode(quoteId);
|
|
593
|
+
let symbol = base + '/' + quote;
|
|
594
|
+
let amount = this.safeString(trade, 'amount');
|
|
595
|
+
if (side === 'sell') {
|
|
596
|
+
symbol = quote + '/' + base;
|
|
597
|
+
amount = Precise["default"].stringDiv(amount, price); // due to rounding errors amount in not exact to trade
|
|
598
|
+
}
|
|
599
|
+
const parsedTrade = {
|
|
600
|
+
'id': this.safeString(trade, 'id'),
|
|
601
|
+
'order': this.safeString(trade, 'order'),
|
|
602
|
+
'info': trade,
|
|
603
|
+
'timestamp': this.parse8601(datetime),
|
|
604
|
+
'datetime': datetime,
|
|
605
|
+
'symbol': symbol,
|
|
606
|
+
'type': undefined,
|
|
607
|
+
'side': side,
|
|
608
|
+
'takerOrMaker': undefined,
|
|
609
|
+
'price': price,
|
|
610
|
+
'cost': undefined,
|
|
611
|
+
'amount': amount,
|
|
612
|
+
'fee': undefined,
|
|
613
|
+
};
|
|
614
|
+
const fee = this.safeString(trade, 'fee_amount');
|
|
615
|
+
if (fee !== undefined) {
|
|
616
|
+
parsedTrade['fee'] = {
|
|
617
|
+
'cost': fee,
|
|
618
|
+
'currency': quote,
|
|
619
|
+
'rate': undefined,
|
|
620
|
+
};
|
|
621
|
+
}
|
|
622
|
+
return this.safeTrade(parsedTrade, market);
|
|
623
|
+
}
|
|
624
|
+
handleOrderUpdate(client, message) {
|
|
625
|
+
//
|
|
626
|
+
// partialExecution
|
|
627
|
+
// {
|
|
628
|
+
// "e": "order",
|
|
629
|
+
// "data": {
|
|
630
|
+
// "id": "150714937",
|
|
631
|
+
// "remains": "1000000",
|
|
632
|
+
// "price": "17513",
|
|
633
|
+
// "amount": 2000000, As Precision
|
|
634
|
+
// "time": "1654506118448",
|
|
635
|
+
// "type": "buy",
|
|
636
|
+
// "pair": {
|
|
637
|
+
// "symbol1": "BTC",
|
|
638
|
+
// "symbol2": "USD"
|
|
639
|
+
// },
|
|
640
|
+
// "fee": "0.15"
|
|
641
|
+
// }
|
|
642
|
+
// }
|
|
643
|
+
// canceled order
|
|
644
|
+
// {
|
|
645
|
+
// "e": "order",
|
|
646
|
+
// "data": {
|
|
647
|
+
// "id": "6310857",
|
|
648
|
+
// "remains": "200000000"
|
|
649
|
+
// "fremains": "2.00000000"
|
|
650
|
+
// "cancel": true,
|
|
651
|
+
// "pair": {
|
|
652
|
+
// "symbol1": "BTC",
|
|
653
|
+
// "symbol2": "USD"
|
|
654
|
+
// }
|
|
655
|
+
// }
|
|
656
|
+
// }
|
|
657
|
+
// fullfilledOrder
|
|
658
|
+
// {
|
|
659
|
+
// "e": "order",
|
|
660
|
+
// "data": {
|
|
661
|
+
// "id": "59098421630",
|
|
662
|
+
// "remains": "0",
|
|
663
|
+
// "pair": {
|
|
664
|
+
// "symbol1": "BTC",
|
|
665
|
+
// "symbol2": "USD"
|
|
666
|
+
// }
|
|
667
|
+
// }
|
|
668
|
+
// }
|
|
669
|
+
// {
|
|
670
|
+
// "e": "tx",
|
|
671
|
+
// "data": {
|
|
672
|
+
// "d": "order:59425993014:a:BTC",
|
|
673
|
+
// "c": "user:up105393824:a:BTC",
|
|
674
|
+
// "a": "0.00098152",
|
|
675
|
+
// "ds": 0,
|
|
676
|
+
// "cs": "0.00098152",
|
|
677
|
+
// "user": "up105393824",
|
|
678
|
+
// "symbol": "BTC",
|
|
679
|
+
// "symbol2": "USD",
|
|
680
|
+
// "amount": "0.00098152",
|
|
681
|
+
// "buy": 59425993014,
|
|
682
|
+
// "order": 59425993014,
|
|
683
|
+
// "sell": 59425986168,
|
|
684
|
+
// "price": 19306.6,
|
|
685
|
+
// "type": "buy",
|
|
686
|
+
// "time": "2022-10-02T01:11:15.148Z",
|
|
687
|
+
// "balance": "0.00098152",
|
|
688
|
+
// "fee_amount": "0.05",
|
|
689
|
+
// "id": "59425993020"
|
|
690
|
+
// }
|
|
691
|
+
// }
|
|
692
|
+
//
|
|
693
|
+
const data = this.safeValue(message, 'data', {});
|
|
694
|
+
const isTransaction = this.safeString(message, 'e') === 'tx';
|
|
695
|
+
const orderId = this.safeString2(data, 'id', 'order');
|
|
696
|
+
let remains = this.safeString(data, 'remains');
|
|
697
|
+
let baseId = this.safeString(data, 'symbol');
|
|
698
|
+
let quoteId = this.safeString(data, 'symbol2');
|
|
699
|
+
const pair = this.safeValue(data, 'pair');
|
|
700
|
+
if (pair !== undefined) {
|
|
701
|
+
baseId = this.safeString(pair, 'symbol1');
|
|
702
|
+
quoteId = this.safeString(pair, 'symbol2');
|
|
703
|
+
}
|
|
704
|
+
const base = this.safeCurrencyCode(baseId);
|
|
705
|
+
const quote = this.safeCurrencyCode(quoteId);
|
|
706
|
+
const symbol = base + '/' + quote;
|
|
707
|
+
const market = this.safeMarket(symbol);
|
|
708
|
+
remains = this.currencyFromPrecision(base, remains);
|
|
709
|
+
if (this.orders === undefined) {
|
|
710
|
+
const limit = this.safeInteger(this.options, 'ordersLimit', 1000);
|
|
711
|
+
this.orders = new Cache.ArrayCacheBySymbolById(limit);
|
|
712
|
+
}
|
|
713
|
+
const storedOrders = this.orders;
|
|
714
|
+
const ordersBySymbol = this.safeValue(storedOrders.hashmap, symbol, {});
|
|
715
|
+
let order = this.safeValue(ordersBySymbol, orderId);
|
|
716
|
+
if (order === undefined) {
|
|
717
|
+
order = this.parseWsOrderUpdate(data, market);
|
|
718
|
+
}
|
|
719
|
+
order['remaining'] = remains;
|
|
720
|
+
const canceled = this.safeValue(data, 'cancel', false);
|
|
721
|
+
if (canceled) {
|
|
722
|
+
order['status'] = 'canceled';
|
|
723
|
+
}
|
|
724
|
+
if (isTransaction) {
|
|
725
|
+
order['status'] = 'closed';
|
|
726
|
+
}
|
|
727
|
+
const fee = this.safeNumber(data, 'fee');
|
|
728
|
+
if (fee !== undefined) {
|
|
729
|
+
order['fee'] = {
|
|
730
|
+
'cost': fee,
|
|
731
|
+
'currency': quote,
|
|
732
|
+
'rate': undefined,
|
|
733
|
+
};
|
|
734
|
+
}
|
|
735
|
+
const timestamp = this.safeInteger(data, 'time');
|
|
736
|
+
order['timestamp'] = timestamp;
|
|
737
|
+
order['datetime'] = this.iso8601(timestamp);
|
|
738
|
+
order = this.safeOrder(order);
|
|
739
|
+
storedOrders.append(order);
|
|
740
|
+
const messageHash = 'orders:' + symbol;
|
|
741
|
+
client.resolve(storedOrders, messageHash);
|
|
742
|
+
}
|
|
743
|
+
parseWsOrderUpdate(order, market = undefined) {
|
|
744
|
+
//
|
|
745
|
+
// {
|
|
746
|
+
// "id": "150714937",
|
|
747
|
+
// "remains": "1000000",
|
|
748
|
+
// "price": "17513",
|
|
749
|
+
// "amount": 2000000, As Precision
|
|
750
|
+
// "time": "1654506118448",
|
|
751
|
+
// "type": "buy",
|
|
752
|
+
// "pair": {
|
|
753
|
+
// "symbol1": "BTC",
|
|
754
|
+
// "symbol2": "USD"
|
|
755
|
+
// },
|
|
756
|
+
// "fee": "0.15"
|
|
757
|
+
// }
|
|
758
|
+
// transaction
|
|
759
|
+
// {
|
|
760
|
+
// "d": "order:59425993014:a:BTC",
|
|
761
|
+
// "c": "user:up105393824:a:BTC",
|
|
762
|
+
// "a": "0.00098152",
|
|
763
|
+
// "ds": 0,
|
|
764
|
+
// "cs": "0.00098152",
|
|
765
|
+
// "user": "up105393824",
|
|
766
|
+
// "symbol": "BTC",
|
|
767
|
+
// "symbol2": "USD",
|
|
768
|
+
// "amount": "0.00098152",
|
|
769
|
+
// "buy": 59425993014,
|
|
770
|
+
// "order": 59425993014,
|
|
771
|
+
// "sell": 59425986168,
|
|
772
|
+
// "price": 19306.6,
|
|
773
|
+
// "type": "buy",
|
|
774
|
+
// "time": "2022-10-02T01:11:15.148Z",
|
|
775
|
+
// "balance": "0.00098152",
|
|
776
|
+
// "fee_amount": "0.05",
|
|
777
|
+
// "id": "59425993020"
|
|
778
|
+
// }
|
|
779
|
+
//
|
|
780
|
+
const isTransaction = this.safeValue(order, 'd') !== undefined;
|
|
781
|
+
const remainsPrecision = this.safeString(order, 'remains');
|
|
782
|
+
let remaining = undefined;
|
|
783
|
+
if (remainsPrecision !== undefined) {
|
|
784
|
+
remaining = this.currencyFromPrecision(market['base'], remainsPrecision);
|
|
785
|
+
}
|
|
786
|
+
const amount = this.safeString(order, 'amount');
|
|
787
|
+
if (!isTransaction) {
|
|
788
|
+
this.currencyFromPrecision(market['base'], amount);
|
|
789
|
+
}
|
|
790
|
+
let baseId = this.safeString(order, 'symbol');
|
|
791
|
+
let quoteId = this.safeString(order, 'symbol2');
|
|
792
|
+
const pair = this.safeValue(order, 'pair');
|
|
793
|
+
if (pair !== undefined) {
|
|
794
|
+
baseId = this.safeString(order, 'symbol1');
|
|
795
|
+
quoteId = this.safeString(order, 'symbol2');
|
|
796
|
+
}
|
|
797
|
+
const base = this.safeCurrencyCode(baseId);
|
|
798
|
+
const quote = this.safeCurrencyCode(quoteId);
|
|
799
|
+
let symbol = undefined;
|
|
800
|
+
if (base !== undefined && quote !== undefined) {
|
|
801
|
+
symbol = base + '/' + quote;
|
|
802
|
+
}
|
|
803
|
+
market = this.safeMarket(symbol, market);
|
|
804
|
+
const time = this.safeInteger(order, 'time', this.milliseconds());
|
|
805
|
+
let timestamp = time;
|
|
806
|
+
if (isTransaction) {
|
|
807
|
+
timestamp = this.parse8601(time);
|
|
808
|
+
}
|
|
809
|
+
const canceled = this.safeValue(order, 'cancel', false);
|
|
810
|
+
let status = 'open';
|
|
811
|
+
if (canceled) {
|
|
812
|
+
status = 'canceled';
|
|
813
|
+
}
|
|
814
|
+
else if (isTransaction) {
|
|
815
|
+
status = 'closed';
|
|
816
|
+
}
|
|
817
|
+
const parsedOrder = {
|
|
818
|
+
'id': this.safeString2(order, 'id', 'order'),
|
|
819
|
+
'clientOrderId': undefined,
|
|
820
|
+
'info': order,
|
|
821
|
+
'timestamp': timestamp,
|
|
822
|
+
'datetime': this.iso8601(timestamp),
|
|
823
|
+
'lastTradeTimestamp': undefined,
|
|
824
|
+
'status': status,
|
|
825
|
+
'symbol': symbol,
|
|
826
|
+
'type': undefined,
|
|
827
|
+
'timeInForce': undefined,
|
|
828
|
+
'postOnly': undefined,
|
|
829
|
+
'side': this.safeString(order, 'type'),
|
|
830
|
+
'price': this.safeNumber(order, 'price'),
|
|
831
|
+
'stopPrice': undefined,
|
|
832
|
+
'triggerPrice': undefined,
|
|
833
|
+
'average': undefined,
|
|
834
|
+
'cost': undefined,
|
|
835
|
+
'amount': amount,
|
|
836
|
+
'filled': undefined,
|
|
837
|
+
'remaining': remaining,
|
|
838
|
+
'fee': {
|
|
839
|
+
'cost': this.safeNumber2(order, 'fee', 'fee_amount'),
|
|
840
|
+
'currency': quote,
|
|
841
|
+
'rate': undefined,
|
|
842
|
+
},
|
|
843
|
+
'trades': undefined,
|
|
844
|
+
};
|
|
845
|
+
if (isTransaction) {
|
|
846
|
+
parsedOrder['trades'] = this.parseWsTrade(order, market);
|
|
847
|
+
}
|
|
848
|
+
return this.safeOrder(parsedOrder, market);
|
|
849
|
+
}
|
|
850
|
+
fromPrecision(amount, scale) {
|
|
851
|
+
if (amount === undefined) {
|
|
852
|
+
return undefined;
|
|
853
|
+
}
|
|
854
|
+
const precise = new Precise["default"](amount);
|
|
855
|
+
precise.decimals = this.sum(precise.decimals, scale);
|
|
856
|
+
precise.reduce();
|
|
857
|
+
return precise.toString();
|
|
858
|
+
}
|
|
859
|
+
currencyFromPrecision(currency, amount) {
|
|
860
|
+
const scale = this.safeInteger(this.currencies[currency], 'precision', 0);
|
|
861
|
+
return this.fromPrecision(amount, scale);
|
|
862
|
+
}
|
|
863
|
+
handleOrdersSnapshot(client, message) {
|
|
864
|
+
//
|
|
865
|
+
// {
|
|
866
|
+
// "e": "open-orders",
|
|
867
|
+
// "data": [{
|
|
868
|
+
// "id": "59098421630",
|
|
869
|
+
// "time": "1664062285425",
|
|
870
|
+
// "type": "buy",
|
|
871
|
+
// "price": "18920",
|
|
872
|
+
// "amount": "0.00100000",
|
|
873
|
+
// "pending": "0.00100000"
|
|
874
|
+
// }],
|
|
875
|
+
// "oid": 1,
|
|
876
|
+
// "ok": "ok"
|
|
877
|
+
// }
|
|
878
|
+
//
|
|
879
|
+
const symbol = this.safeString(message, 'oid'); // symbol is set as requestId in watchOrders
|
|
880
|
+
const rawOrders = this.safeValue(message, 'data', []);
|
|
881
|
+
let myOrders = this.orders;
|
|
882
|
+
if (this.orders === undefined) {
|
|
883
|
+
const limit = this.safeInteger(this.options, 'ordersLimit', 1000);
|
|
884
|
+
myOrders = new Cache.ArrayCacheBySymbolById(limit);
|
|
885
|
+
}
|
|
886
|
+
for (let i = 0; i < rawOrders.length; i++) {
|
|
887
|
+
const rawOrder = rawOrders[i];
|
|
888
|
+
const market = this.safeMarket(symbol);
|
|
889
|
+
const order = this.parseOrder(rawOrder, market);
|
|
890
|
+
order['status'] = 'open';
|
|
891
|
+
myOrders.append(order);
|
|
892
|
+
}
|
|
893
|
+
this.orders = myOrders;
|
|
894
|
+
const messageHash = 'orders:' + symbol;
|
|
895
|
+
const ordersLength = myOrders.length;
|
|
896
|
+
if (ordersLength > 0) {
|
|
897
|
+
client.resolve(myOrders, messageHash);
|
|
898
|
+
}
|
|
899
|
+
}
|
|
900
|
+
async watchOrderBook(symbol, limit = undefined, params = {}) {
|
|
901
|
+
/**
|
|
902
|
+
* @method
|
|
903
|
+
* @name cex#watchOrderBook
|
|
904
|
+
* @description watches information on open orders with bid (buy) and ask (sell) prices, volumes and other data
|
|
905
|
+
* @see https://cex.io/websocket-api#orderbook-subscribe
|
|
906
|
+
* @param {string} symbol unified symbol of the market to fetch the order book for
|
|
907
|
+
* @param {int} [limit] the maximum amount of order book entries to return
|
|
908
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
909
|
+
* @returns {object} A dictionary of [order book structures]{@link https://docs.ccxt.com/#/?id=order-book-structure} indexed by market symbols
|
|
910
|
+
*/
|
|
911
|
+
await this.loadMarkets();
|
|
912
|
+
await this.authenticate();
|
|
913
|
+
const market = this.market(symbol);
|
|
914
|
+
symbol = market['symbol'];
|
|
915
|
+
const url = this.urls['api']['ws'];
|
|
916
|
+
const messageHash = 'orderbook:' + symbol;
|
|
917
|
+
const depth = (limit === undefined) ? 0 : limit;
|
|
918
|
+
const subscribe = {
|
|
919
|
+
'e': 'order-book-subscribe',
|
|
920
|
+
'data': {
|
|
921
|
+
'pair': [
|
|
922
|
+
market['baseId'],
|
|
923
|
+
market['quoteId'],
|
|
924
|
+
],
|
|
925
|
+
'subscribe': true,
|
|
926
|
+
'depth': depth,
|
|
927
|
+
},
|
|
928
|
+
'oid': this.requestId(),
|
|
929
|
+
};
|
|
930
|
+
const request = this.deepExtend(subscribe, params);
|
|
931
|
+
const orderbook = await this.watch(url, messageHash, request, messageHash);
|
|
932
|
+
return orderbook.limit();
|
|
933
|
+
}
|
|
934
|
+
handleOrderBookSnapshot(client, message) {
|
|
935
|
+
//
|
|
936
|
+
// {
|
|
937
|
+
// "e": "order-book-subscribe",
|
|
938
|
+
// "data": {
|
|
939
|
+
// "timestamp": 1663762032,
|
|
940
|
+
// "timestamp_ms": 1663762031680,
|
|
941
|
+
// "bids": [
|
|
942
|
+
// [ 241.947, 155.91626 ],
|
|
943
|
+
// [ 241, 154 ],
|
|
944
|
+
// ],
|
|
945
|
+
// "asks": [
|
|
946
|
+
// [ 242.947, 155.91626 ],
|
|
947
|
+
// [ 243, 154 ], ],
|
|
948
|
+
// "pair": "BTC:USDT",
|
|
949
|
+
// "id": 616267120,
|
|
950
|
+
// "sell_total": "13.59066946",
|
|
951
|
+
// "buy_total": "163553.625948"
|
|
952
|
+
// },
|
|
953
|
+
// "oid": "1",
|
|
954
|
+
// "ok": "ok"
|
|
955
|
+
// }
|
|
956
|
+
//
|
|
957
|
+
const data = this.safeValue(message, 'data', {});
|
|
958
|
+
const pair = this.safeString(data, 'pair');
|
|
959
|
+
const symbol = this.pairToSymbol(pair);
|
|
960
|
+
const messageHash = 'orderbook:' + symbol;
|
|
961
|
+
const timestamp = this.safeInteger2(data, 'timestamp_ms', 'timestamp');
|
|
962
|
+
const incrementalId = this.safeNumber(data, 'id');
|
|
963
|
+
const storedOrderBook = this.orderBook({});
|
|
964
|
+
const snapshot = this.parseOrderBook(data, symbol, timestamp, 'bids', 'asks');
|
|
965
|
+
snapshot['nonce'] = incrementalId;
|
|
966
|
+
storedOrderBook.reset(snapshot);
|
|
967
|
+
this.options['orderbook'][symbol] = {
|
|
968
|
+
'incrementalId': incrementalId,
|
|
969
|
+
};
|
|
970
|
+
this.orderbooks[symbol] = storedOrderBook;
|
|
971
|
+
client.resolve(storedOrderBook, messageHash);
|
|
972
|
+
}
|
|
973
|
+
pairToSymbol(pair) {
|
|
974
|
+
const parts = pair.split(':');
|
|
975
|
+
const baseId = this.safeString(parts, 0);
|
|
976
|
+
const quoteId = this.safeString(parts, 1);
|
|
977
|
+
const base = this.safeCurrencyCode(baseId);
|
|
978
|
+
const quote = this.safeCurrencyCode(quoteId);
|
|
979
|
+
const symbol = base + '/' + quote;
|
|
980
|
+
return symbol;
|
|
981
|
+
}
|
|
982
|
+
handleOrderBookUpdate(client, message) {
|
|
983
|
+
//
|
|
984
|
+
// {
|
|
985
|
+
// "e": "md_update",
|
|
986
|
+
// "data": {
|
|
987
|
+
// "id": 616267121,
|
|
988
|
+
// "pair": "BTC:USDT",
|
|
989
|
+
// "time": 1663762031719,
|
|
990
|
+
// "bids": [],
|
|
991
|
+
// "asks": [
|
|
992
|
+
// [122, 23]
|
|
993
|
+
// ]
|
|
994
|
+
// }
|
|
995
|
+
// }
|
|
996
|
+
//
|
|
997
|
+
const data = this.safeValue(message, 'data', {});
|
|
998
|
+
const incrementalId = this.safeNumber(data, 'id');
|
|
999
|
+
const pair = this.safeString(data, 'pair', '');
|
|
1000
|
+
const symbol = this.pairToSymbol(pair);
|
|
1001
|
+
const storedOrderBook = this.safeValue(this.orderbooks, symbol);
|
|
1002
|
+
const messageHash = 'orderbook:' + symbol;
|
|
1003
|
+
if (incrementalId !== storedOrderBook['nonce'] + 1) {
|
|
1004
|
+
delete client.subscriptions[messageHash];
|
|
1005
|
+
client.reject(this.id + ' watchOrderBook() skipped a message', messageHash);
|
|
1006
|
+
}
|
|
1007
|
+
const timestamp = this.safeInteger(data, 'time');
|
|
1008
|
+
const asks = this.safeValue(data, 'asks', []);
|
|
1009
|
+
const bids = this.safeValue(data, 'bids', []);
|
|
1010
|
+
this.handleDeltas(storedOrderBook['asks'], asks);
|
|
1011
|
+
this.handleDeltas(storedOrderBook['bids'], bids);
|
|
1012
|
+
storedOrderBook['timestamp'] = timestamp;
|
|
1013
|
+
storedOrderBook['datetime'] = this.iso8601(timestamp);
|
|
1014
|
+
storedOrderBook['nonce'] = incrementalId;
|
|
1015
|
+
client.resolve(storedOrderBook, messageHash);
|
|
1016
|
+
}
|
|
1017
|
+
handleDelta(bookside, delta) {
|
|
1018
|
+
const bidAsk = this.parseBidAsk(delta, 0, 1);
|
|
1019
|
+
bookside.storeArray(bidAsk);
|
|
1020
|
+
}
|
|
1021
|
+
handleDeltas(bookside, deltas) {
|
|
1022
|
+
for (let i = 0; i < deltas.length; i++) {
|
|
1023
|
+
this.handleDelta(bookside, deltas[i]);
|
|
1024
|
+
}
|
|
1025
|
+
}
|
|
1026
|
+
async watchOHLCV(symbol, timeframe = '1m', since = undefined, limit = undefined, params = {}) {
|
|
1027
|
+
/**
|
|
1028
|
+
* @method
|
|
1029
|
+
* @name cex#watchOHLCV
|
|
1030
|
+
* @see https://cex.io/websocket-api#minute-data
|
|
1031
|
+
* @description watches historical candlestick data containing the open, high, low, and close price, and the volume of a market. It will return the last 120 minutes with the selected timeframe and then 1m candle updates after that.
|
|
1032
|
+
* @param {string} symbol unified symbol of the market to fetch OHLCV data for
|
|
1033
|
+
* @param {string} timeframe the length of time each candle represents.
|
|
1034
|
+
* @param {int} [since] timestamp in ms of the earliest candle to fetch
|
|
1035
|
+
* @param {int} [limit] the maximum amount of candles to fetch
|
|
1036
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
1037
|
+
* @returns {int[][]} A list of candles ordered as timestamp, open, high, low, close, volume
|
|
1038
|
+
*/
|
|
1039
|
+
await this.loadMarkets();
|
|
1040
|
+
const market = this.market(symbol);
|
|
1041
|
+
symbol = market['symbol'];
|
|
1042
|
+
const messageHash = 'ohlcv:' + symbol;
|
|
1043
|
+
const url = this.urls['api']['ws'];
|
|
1044
|
+
const request = {
|
|
1045
|
+
'e': 'init-ohlcv',
|
|
1046
|
+
'i': timeframe,
|
|
1047
|
+
'rooms': [
|
|
1048
|
+
'pair-' + market['baseId'] + '-' + market['quoteId'],
|
|
1049
|
+
],
|
|
1050
|
+
};
|
|
1051
|
+
const ohlcv = await this.watch(url, messageHash, this.extend(request, params), messageHash);
|
|
1052
|
+
if (this.newUpdates) {
|
|
1053
|
+
limit = ohlcv.getLimit(symbol, limit);
|
|
1054
|
+
}
|
|
1055
|
+
return this.filterBySinceLimit(ohlcv, since, limit, 0, true);
|
|
1056
|
+
}
|
|
1057
|
+
handleInitOHLCV(client, message) {
|
|
1058
|
+
//
|
|
1059
|
+
// {
|
|
1060
|
+
// "e": "init-ohlcv-data",
|
|
1061
|
+
// "data": [
|
|
1062
|
+
// [
|
|
1063
|
+
// 1663660680,
|
|
1064
|
+
// "19396.4",
|
|
1065
|
+
// "19396.4",
|
|
1066
|
+
// "19396.4",
|
|
1067
|
+
// "19396.4",
|
|
1068
|
+
// "1262861"
|
|
1069
|
+
// ],
|
|
1070
|
+
// ...
|
|
1071
|
+
// ],
|
|
1072
|
+
// "pair": "BTC:USDT"
|
|
1073
|
+
// }
|
|
1074
|
+
//
|
|
1075
|
+
const pair = this.safeString(message, 'pair');
|
|
1076
|
+
const parts = pair.split(':');
|
|
1077
|
+
const baseId = this.safeString(parts, 0);
|
|
1078
|
+
const quoteId = this.safeString(parts, 1);
|
|
1079
|
+
const base = this.safeCurrencyCode(baseId);
|
|
1080
|
+
const quote = this.safeCurrencyCode(quoteId);
|
|
1081
|
+
const symbol = base + '/' + quote;
|
|
1082
|
+
const market = this.safeMarket(symbol);
|
|
1083
|
+
const messageHash = 'ohlcv:' + symbol;
|
|
1084
|
+
const data = this.safeValue(message, 'data', []);
|
|
1085
|
+
const limit = this.safeInteger(this.options, 'OHLCVLimit', 1000);
|
|
1086
|
+
const stored = new Cache.ArrayCacheByTimestamp(limit);
|
|
1087
|
+
const sorted = this.sortBy(data, 0);
|
|
1088
|
+
for (let i = 0; i < sorted.length; i++) {
|
|
1089
|
+
stored.append(this.parseOHLCV(sorted[i], market));
|
|
1090
|
+
}
|
|
1091
|
+
this.ohlcvs[symbol] = stored;
|
|
1092
|
+
client.resolve(stored, messageHash);
|
|
1093
|
+
}
|
|
1094
|
+
handleOHLCV24(client, message) {
|
|
1095
|
+
//
|
|
1096
|
+
// {
|
|
1097
|
+
// "e": "ohlcv24",
|
|
1098
|
+
// "data": [ '18793.2', '19630', '18793.2', "19104.1", "314157273" ],
|
|
1099
|
+
// "pair": "BTC:USDT"
|
|
1100
|
+
// }
|
|
1101
|
+
//
|
|
1102
|
+
return message;
|
|
1103
|
+
}
|
|
1104
|
+
handleOHLCV1m(client, message) {
|
|
1105
|
+
//
|
|
1106
|
+
// {
|
|
1107
|
+
// "e": "ohlcv1m",
|
|
1108
|
+
// "data": {
|
|
1109
|
+
// "pair": "BTC:USD",
|
|
1110
|
+
// "time": "1665436800",
|
|
1111
|
+
// "o": "19279.6",
|
|
1112
|
+
// "h": "19279.6",
|
|
1113
|
+
// "l": "19266.7",
|
|
1114
|
+
// "c": "19266.7",
|
|
1115
|
+
// "v": 3343884,
|
|
1116
|
+
// "d": 3343884
|
|
1117
|
+
// }
|
|
1118
|
+
// }
|
|
1119
|
+
//
|
|
1120
|
+
const data = this.safeValue(message, 'data', {});
|
|
1121
|
+
const pair = this.safeString(data, 'pair');
|
|
1122
|
+
const symbol = this.pairToSymbol(pair);
|
|
1123
|
+
const messageHash = 'ohlcv:' + symbol;
|
|
1124
|
+
const ohlcv = [
|
|
1125
|
+
this.safeTimestamp(data, 'time'),
|
|
1126
|
+
this.safeNumber(data, 'o'),
|
|
1127
|
+
this.safeNumber(data, 'h'),
|
|
1128
|
+
this.safeNumber(data, 'l'),
|
|
1129
|
+
this.safeNumber(data, 'c'),
|
|
1130
|
+
this.safeNumber(data, 'v'),
|
|
1131
|
+
];
|
|
1132
|
+
const stored = this.safeValue(this.ohlcvs, symbol);
|
|
1133
|
+
stored.append(ohlcv);
|
|
1134
|
+
client.resolve(stored, messageHash);
|
|
1135
|
+
}
|
|
1136
|
+
handleOHLCV(client, message) {
|
|
1137
|
+
//
|
|
1138
|
+
// {
|
|
1139
|
+
// "e": "ohlcv",
|
|
1140
|
+
// "data": [
|
|
1141
|
+
// [1665461100, '19068.2', '19068.2', '19068.2', "19068.2", 268478]
|
|
1142
|
+
// ],
|
|
1143
|
+
// "pair": "BTC:USD"
|
|
1144
|
+
// }
|
|
1145
|
+
//
|
|
1146
|
+
const data = this.safeValue(message, 'data', []);
|
|
1147
|
+
const pair = this.safeString(message, 'pair');
|
|
1148
|
+
const symbol = this.pairToSymbol(pair);
|
|
1149
|
+
const messageHash = 'ohlcv:' + symbol;
|
|
1150
|
+
const stored = this.safeValue(this.ohlcvs, symbol);
|
|
1151
|
+
for (let i = 0; i < data.length; i++) {
|
|
1152
|
+
const ohlcv = [
|
|
1153
|
+
this.safeTimestamp(data[i], 0),
|
|
1154
|
+
this.safeNumber(data[i], 1),
|
|
1155
|
+
this.safeNumber(data[i], 2),
|
|
1156
|
+
this.safeNumber(data[i], 3),
|
|
1157
|
+
this.safeNumber(data[i], 4),
|
|
1158
|
+
this.safeNumber(data[i], 5),
|
|
1159
|
+
];
|
|
1160
|
+
stored.append(ohlcv);
|
|
1161
|
+
}
|
|
1162
|
+
const dataLength = data.length;
|
|
1163
|
+
if (dataLength > 0) {
|
|
1164
|
+
client.resolve(stored, messageHash);
|
|
1165
|
+
}
|
|
1166
|
+
}
|
|
1167
|
+
async fetchOrderWs(id, symbol = undefined, params = {}) {
|
|
1168
|
+
/**
|
|
1169
|
+
* @method
|
|
1170
|
+
* @name cex#fetchOrderWs
|
|
1171
|
+
* @description fetches information on an order made by the user
|
|
1172
|
+
* @see https://docs.cex.io/#ws-api-get-order
|
|
1173
|
+
* @param {string} symbol not used by cex fetchOrder
|
|
1174
|
+
* @param {object} [params] extra parameters specific to the cex api endpoint
|
|
1175
|
+
* @returns {object} An [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
|
|
1176
|
+
*/
|
|
1177
|
+
await this.loadMarkets();
|
|
1178
|
+
await this.authenticate();
|
|
1179
|
+
let market = undefined;
|
|
1180
|
+
if (symbol !== undefined) {
|
|
1181
|
+
market = this.market(symbol);
|
|
1182
|
+
}
|
|
1183
|
+
const data = this.extend({
|
|
1184
|
+
'order_id': id.toString(),
|
|
1185
|
+
}, params);
|
|
1186
|
+
const url = this.urls['api']['ws'];
|
|
1187
|
+
const messageHash = this.requestId();
|
|
1188
|
+
const request = {
|
|
1189
|
+
'e': 'get-order',
|
|
1190
|
+
'oid': messageHash,
|
|
1191
|
+
'data': data,
|
|
1192
|
+
};
|
|
1193
|
+
const response = await this.watch(url, messageHash, request, messageHash);
|
|
1194
|
+
return this.parseOrder(response, market);
|
|
1195
|
+
}
|
|
1196
|
+
async fetchOpenOrdersWs(symbol = undefined, since = undefined, limit = undefined, params = {}) {
|
|
1197
|
+
/**
|
|
1198
|
+
* @method
|
|
1199
|
+
* @name cex#fetchOpenOrdersWs
|
|
1200
|
+
* @see https://docs.cex.io/#ws-api-open-orders
|
|
1201
|
+
* @description fetch all unfilled currently open orders
|
|
1202
|
+
* @param {string} symbol unified market symbol
|
|
1203
|
+
* @param {int} [since] the earliest time in ms to fetch open orders for
|
|
1204
|
+
* @param {int} [limit] the maximum number of open orders structures to retrieve
|
|
1205
|
+
* @param {object} [params] extra parameters specific to the cex api endpoint
|
|
1206
|
+
* @returns {Order[]} a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
|
|
1207
|
+
*/
|
|
1208
|
+
if (symbol === undefined) {
|
|
1209
|
+
throw new errors.ArgumentsRequired(this.id + 'fetchOpenOrdersWs requires a symbol.');
|
|
1210
|
+
}
|
|
1211
|
+
await this.loadMarkets();
|
|
1212
|
+
await this.authenticate();
|
|
1213
|
+
const market = this.market(symbol);
|
|
1214
|
+
const url = this.urls['api']['ws'];
|
|
1215
|
+
const messageHash = this.requestId();
|
|
1216
|
+
const data = this.extend({
|
|
1217
|
+
'pair': [market['baseId'], market['quoteId']],
|
|
1218
|
+
}, params);
|
|
1219
|
+
const request = {
|
|
1220
|
+
'e': 'open-orders',
|
|
1221
|
+
'oid': messageHash,
|
|
1222
|
+
'data': data,
|
|
1223
|
+
};
|
|
1224
|
+
const response = await this.watch(url, messageHash, request, messageHash);
|
|
1225
|
+
return this.parseOrders(response, market, since, limit, params);
|
|
1226
|
+
}
|
|
1227
|
+
async createOrderWs(symbol, type, side, amount, price = undefined, params = {}) {
|
|
1228
|
+
/**
|
|
1229
|
+
* @method
|
|
1230
|
+
* @name cex#createOrderWs
|
|
1231
|
+
* @see https://docs.cex.io/#ws-api-order-placement
|
|
1232
|
+
* @description create a trade order
|
|
1233
|
+
* @param {string} symbol unified symbol of the market to create an order in
|
|
1234
|
+
* @param {string} type 'market' or 'limit'
|
|
1235
|
+
* @param {string} side 'buy' or 'sell'
|
|
1236
|
+
* @param {float} amount how much of currency you want to trade in units of base currency
|
|
1237
|
+
* @param {float} price the price at which the order is to be fullfilled, in units of the quote currency, ignored in market orders
|
|
1238
|
+
* @param {object} [params] extra parameters specific to the kraken api endpoint
|
|
1239
|
+
* @param {boolean} [params.maker_only] Optional, maker only places an order only if offers best sell (<= max) or buy(>= max) price for this pair, if not order placement will be rejected with an error - "Order is not maker"
|
|
1240
|
+
* @returns {object} an [order structure]{@link https://docs.ccxt.com/en/latest/manual.html#order-structure}
|
|
1241
|
+
*/
|
|
1242
|
+
if (price === undefined) {
|
|
1243
|
+
throw new errors.BadRequest(this.id + ' createOrderWs requires a price argument');
|
|
1244
|
+
}
|
|
1245
|
+
await this.loadMarkets();
|
|
1246
|
+
await this.authenticate();
|
|
1247
|
+
const market = this.market(symbol);
|
|
1248
|
+
const url = this.urls['api']['ws'];
|
|
1249
|
+
const messageHash = this.requestId();
|
|
1250
|
+
const data = this.extend({
|
|
1251
|
+
'pair': [market['baseId'], market['quoteId']],
|
|
1252
|
+
'amount': amount,
|
|
1253
|
+
'price': price,
|
|
1254
|
+
'type': side,
|
|
1255
|
+
}, params);
|
|
1256
|
+
const request = {
|
|
1257
|
+
'e': 'place-order',
|
|
1258
|
+
'oid': messageHash,
|
|
1259
|
+
'data': data,
|
|
1260
|
+
};
|
|
1261
|
+
const rawOrder = await this.watch(url, messageHash, request, messageHash);
|
|
1262
|
+
return this.parseOrder(rawOrder, market);
|
|
1263
|
+
}
|
|
1264
|
+
async editOrderWs(id, symbol, type, side, amount = undefined, price = undefined, params = {}) {
|
|
1265
|
+
/**
|
|
1266
|
+
* @method
|
|
1267
|
+
* @name cex#editOrderWs
|
|
1268
|
+
* @description edit a trade order
|
|
1269
|
+
* @see https://docs.cex.io/#ws-api-cancel-replace
|
|
1270
|
+
* @param {string} id order id
|
|
1271
|
+
* @param {string} symbol unified symbol of the market to create an order in
|
|
1272
|
+
* @param {string} type 'market' or 'limit'
|
|
1273
|
+
* @param {string} side 'buy' or 'sell'
|
|
1274
|
+
* @param {float} amount how much of the currency you want to trade in units of the base currency
|
|
1275
|
+
* @param {float|undefined} [price] the price at which the order is to be fullfilled, in units of the quote currency, ignored in market orders
|
|
1276
|
+
* @param {object} [params] extra parameters specific to the cex api endpoint
|
|
1277
|
+
* @returns {object} an [order structure]{@link https://docs.ccxt.com/en/latest/manual.html#order-structure}
|
|
1278
|
+
*/
|
|
1279
|
+
if (amount === undefined) {
|
|
1280
|
+
throw new errors.ArgumentsRequired(this.id + ' editOrder() requires a amount argument');
|
|
1281
|
+
}
|
|
1282
|
+
if (price === undefined) {
|
|
1283
|
+
throw new errors.ArgumentsRequired(this.id + ' editOrder() requires a price argument');
|
|
1284
|
+
}
|
|
1285
|
+
await this.loadMarkets();
|
|
1286
|
+
await this.authenticate();
|
|
1287
|
+
const market = this.market(symbol);
|
|
1288
|
+
const data = this.extend({
|
|
1289
|
+
'pair': [market['baseId'], market['quoteId']],
|
|
1290
|
+
'type': side,
|
|
1291
|
+
'amount': amount,
|
|
1292
|
+
'price': price,
|
|
1293
|
+
'order_id': id,
|
|
1294
|
+
}, params);
|
|
1295
|
+
const messageHash = this.requestId();
|
|
1296
|
+
const url = this.urls['api']['ws'];
|
|
1297
|
+
const request = {
|
|
1298
|
+
'e': 'cancel-replace-order',
|
|
1299
|
+
'oid': messageHash,
|
|
1300
|
+
'data': data,
|
|
1301
|
+
};
|
|
1302
|
+
const response = await this.watch(url, messageHash, request, messageHash, messageHash);
|
|
1303
|
+
return this.parseOrder(response, market);
|
|
1304
|
+
}
|
|
1305
|
+
async cancelOrderWs(id, symbol = undefined, params = {}) {
|
|
1306
|
+
/**
|
|
1307
|
+
* @method
|
|
1308
|
+
* @name cex#cancelOrderWs
|
|
1309
|
+
* @see https://docs.cex.io/#ws-api-order-cancel
|
|
1310
|
+
* @description cancels an open order
|
|
1311
|
+
* @param {string} id order id
|
|
1312
|
+
* @param {string} symbol not used by cex cancelOrder ()
|
|
1313
|
+
* @param {object} [params] extra parameters specific to the cex api endpoint
|
|
1314
|
+
* @returns {object} An [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
|
|
1315
|
+
*/
|
|
1316
|
+
await this.loadMarkets();
|
|
1317
|
+
await this.authenticate();
|
|
1318
|
+
let market = undefined;
|
|
1319
|
+
if (symbol !== undefined) {
|
|
1320
|
+
market = this.market(symbol);
|
|
1321
|
+
}
|
|
1322
|
+
const data = this.extend({
|
|
1323
|
+
'order_id': id,
|
|
1324
|
+
}, params);
|
|
1325
|
+
const messageHash = this.requestId();
|
|
1326
|
+
const url = this.urls['api']['ws'];
|
|
1327
|
+
const request = {
|
|
1328
|
+
'e': 'cancel-order',
|
|
1329
|
+
'oid': messageHash,
|
|
1330
|
+
'data': data,
|
|
1331
|
+
};
|
|
1332
|
+
const response = await this.watch(url, messageHash, request, messageHash, messageHash);
|
|
1333
|
+
return this.parseOrder(response, market);
|
|
1334
|
+
}
|
|
1335
|
+
async cancelOrdersWs(ids, symbol = undefined, params = {}) {
|
|
1336
|
+
/**
|
|
1337
|
+
* @method
|
|
1338
|
+
* @name cex#cancelOrdersWs
|
|
1339
|
+
* @description cancel multiple orders
|
|
1340
|
+
* @see https://docs.cex.io/#ws-api-mass-cancel-place
|
|
1341
|
+
* @param {string[]} ids order ids
|
|
1342
|
+
* @param {string} symbol not used by cex cancelOrders()
|
|
1343
|
+
* @param {object} [params] extra parameters specific to the cex api endpoint
|
|
1344
|
+
* @returns {object} a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
|
|
1345
|
+
*/
|
|
1346
|
+
if (symbol !== undefined) {
|
|
1347
|
+
throw new errors.BadRequest(this.id + ' cancelOrderWs does not allow filtering by symbol');
|
|
1348
|
+
}
|
|
1349
|
+
await this.loadMarkets();
|
|
1350
|
+
await this.authenticate();
|
|
1351
|
+
const messageHash = this.requestId();
|
|
1352
|
+
const data = this.extend({
|
|
1353
|
+
'cancel-orders': ids,
|
|
1354
|
+
}, params);
|
|
1355
|
+
const url = this.urls['api']['ws'];
|
|
1356
|
+
const request = {
|
|
1357
|
+
'e': 'mass-cancel-place-orders',
|
|
1358
|
+
'oid': messageHash,
|
|
1359
|
+
'data': data,
|
|
1360
|
+
};
|
|
1361
|
+
const response = await this.watch(url, messageHash, request, messageHash, messageHash);
|
|
1362
|
+
//
|
|
1363
|
+
// {
|
|
1364
|
+
// "cancel-orders": [{
|
|
1365
|
+
// "order_id": 69202557979,
|
|
1366
|
+
// "fremains": "0.15000000"
|
|
1367
|
+
// }],
|
|
1368
|
+
// "place-orders": [],
|
|
1369
|
+
// "placed-cancelled": []
|
|
1370
|
+
// }
|
|
1371
|
+
//
|
|
1372
|
+
const canceledOrders = this.safeValue(response, 'cancel-orders');
|
|
1373
|
+
return this.parseOrders(canceledOrders, undefined, undefined, undefined, params);
|
|
1374
|
+
}
|
|
1375
|
+
resolveData(client, message) {
|
|
1376
|
+
//
|
|
1377
|
+
// "e": "open-orders",
|
|
1378
|
+
// "data": [
|
|
1379
|
+
// {
|
|
1380
|
+
// "id": "2477098",
|
|
1381
|
+
// "time": "1435927928618",
|
|
1382
|
+
// "type": "buy",
|
|
1383
|
+
// "price": "241.9477",
|
|
1384
|
+
// "amount": "0.02000000",
|
|
1385
|
+
// "pending": "0.02000000"
|
|
1386
|
+
// },
|
|
1387
|
+
// ...
|
|
1388
|
+
// ],
|
|
1389
|
+
// "oid": "1435927928274_9_open-orders",
|
|
1390
|
+
// "ok": "ok"
|
|
1391
|
+
// }
|
|
1392
|
+
//
|
|
1393
|
+
const data = this.safeValue(message, 'data');
|
|
1394
|
+
const messageHash = this.safeString(message, 'oid');
|
|
1395
|
+
client.resolve(data, messageHash);
|
|
1396
|
+
}
|
|
1397
|
+
handleConnected(client, message) {
|
|
1398
|
+
//
|
|
1399
|
+
// {
|
|
1400
|
+
// "e": "connected"
|
|
1401
|
+
// }
|
|
1402
|
+
//
|
|
1403
|
+
return message;
|
|
1404
|
+
}
|
|
1405
|
+
handleErrorMessage(client, message) {
|
|
1406
|
+
//
|
|
1407
|
+
// {
|
|
1408
|
+
// "e": "get-balance",
|
|
1409
|
+
// "data": { error: "Please Login" },
|
|
1410
|
+
// "oid": 1,
|
|
1411
|
+
// "ok": "error"
|
|
1412
|
+
// }
|
|
1413
|
+
//
|
|
1414
|
+
try {
|
|
1415
|
+
const data = this.safeValue(message, 'data', {});
|
|
1416
|
+
const error = this.safeString(data, 'error');
|
|
1417
|
+
const event = this.safeString(message, 'e', '');
|
|
1418
|
+
const feedback = this.id + ' ' + event + ' ' + error;
|
|
1419
|
+
this.throwExactlyMatchedException(this.exceptions['exact'], error, feedback);
|
|
1420
|
+
this.throwBroadlyMatchedException(this.exceptions['broad'], error, feedback);
|
|
1421
|
+
throw new errors.ExchangeError(feedback);
|
|
1422
|
+
}
|
|
1423
|
+
catch (error) {
|
|
1424
|
+
const messageHash = this.safeString(message, 'oid');
|
|
1425
|
+
const future = this.safeValue(client['futures'], messageHash);
|
|
1426
|
+
if (future !== undefined) {
|
|
1427
|
+
client.reject(error, messageHash);
|
|
1428
|
+
}
|
|
1429
|
+
else {
|
|
1430
|
+
throw error;
|
|
1431
|
+
}
|
|
1432
|
+
}
|
|
1433
|
+
}
|
|
1434
|
+
handleMessage(client, message) {
|
|
1435
|
+
const ok = this.safeString(message, 'ok');
|
|
1436
|
+
if (ok === 'error') {
|
|
1437
|
+
return this.handleErrorMessage(client, message);
|
|
1438
|
+
}
|
|
1439
|
+
const event = this.safeString(message, 'e');
|
|
1440
|
+
const handlers = {
|
|
1441
|
+
'auth': this.handleAuthenticationMessage,
|
|
1442
|
+
'connected': this.handleConnected,
|
|
1443
|
+
'tick': this.handleTicker,
|
|
1444
|
+
'ticker': this.handleTicker,
|
|
1445
|
+
'init-ohlcv-data': this.handleInitOHLCV,
|
|
1446
|
+
'ohlcv24': this.handleOHLCV24,
|
|
1447
|
+
'ohlcv1m': this.handleOHLCV1m,
|
|
1448
|
+
'ohlcv': this.handleOHLCV,
|
|
1449
|
+
'get-balance': this.handleBalance,
|
|
1450
|
+
'order-book-subscribe': this.handleOrderBookSnapshot,
|
|
1451
|
+
'md_update': this.handleOrderBookUpdate,
|
|
1452
|
+
'open-orders': this.resolveData,
|
|
1453
|
+
'order': this.handleOrderUpdate,
|
|
1454
|
+
'history-update': this.handleTrade,
|
|
1455
|
+
'history': this.handleTradesSnapshot,
|
|
1456
|
+
'tx': this.handleTransaction,
|
|
1457
|
+
'place-order': this.resolveData,
|
|
1458
|
+
'cancel-replace-order': this.resolveData,
|
|
1459
|
+
'cancel-order': this.resolveData,
|
|
1460
|
+
'mass-cancel-place-orders': this.resolveData,
|
|
1461
|
+
'get-order': this.resolveData,
|
|
1462
|
+
};
|
|
1463
|
+
const handler = this.safeValue(handlers, event);
|
|
1464
|
+
if (handler !== undefined) {
|
|
1465
|
+
return handler.call(this, client, message);
|
|
1466
|
+
}
|
|
1467
|
+
return message;
|
|
1468
|
+
}
|
|
1469
|
+
handleAuthenticationMessage(client, message) {
|
|
1470
|
+
//
|
|
1471
|
+
// {
|
|
1472
|
+
// "e": "auth",
|
|
1473
|
+
// "data": {
|
|
1474
|
+
// "ok": "ok"
|
|
1475
|
+
// },
|
|
1476
|
+
// "ok": "ok",
|
|
1477
|
+
// "timestamp":1448034593
|
|
1478
|
+
// }
|
|
1479
|
+
//
|
|
1480
|
+
const future = this.safeValue(client.futures, 'authenticated');
|
|
1481
|
+
if (future !== undefined) {
|
|
1482
|
+
future.resolve(true);
|
|
1483
|
+
}
|
|
1484
|
+
}
|
|
1485
|
+
async authenticate(params = {}) {
|
|
1486
|
+
const url = this.urls['api']['ws'];
|
|
1487
|
+
const client = this.client(url);
|
|
1488
|
+
const messageHash = 'authenticated';
|
|
1489
|
+
const future = client.future('authenticated');
|
|
1490
|
+
const authenticated = this.safeValue(client.subscriptions, messageHash);
|
|
1491
|
+
if (authenticated === undefined) {
|
|
1492
|
+
this.checkRequiredCredentials();
|
|
1493
|
+
const nonce = this.seconds().toString();
|
|
1494
|
+
const auth = nonce + this.apiKey;
|
|
1495
|
+
const signature = this.hmac(this.encode(auth), this.encode(this.secret), sha256.sha256);
|
|
1496
|
+
const request = {
|
|
1497
|
+
'e': 'auth',
|
|
1498
|
+
'auth': {
|
|
1499
|
+
'key': this.apiKey,
|
|
1500
|
+
'signature': signature.toUpperCase(),
|
|
1501
|
+
'timestamp': nonce,
|
|
1502
|
+
},
|
|
1503
|
+
};
|
|
1504
|
+
await this.watch(url, messageHash, this.extend(request, params), messageHash);
|
|
1505
|
+
}
|
|
1506
|
+
return await future;
|
|
1507
|
+
}
|
|
1508
|
+
}
|
|
1509
|
+
|
|
1510
|
+
module.exports = cex;
|