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,1014 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var poloniexfutures$1 = require('../poloniexfutures.js');
|
|
4
|
+
var errors = require('../base/errors.js');
|
|
5
|
+
var Cache = require('../base/ws/Cache.js');
|
|
6
|
+
|
|
7
|
+
// ---------------------------------------------------------------------------
|
|
8
|
+
class poloniexfutures extends poloniexfutures$1 {
|
|
9
|
+
describe() {
|
|
10
|
+
return this.deepExtend(super.describe(), {
|
|
11
|
+
'has': {
|
|
12
|
+
'ws': true,
|
|
13
|
+
'cancelAllOrdersWs': false,
|
|
14
|
+
'cancelOrdersWs': false,
|
|
15
|
+
'cancelOrderWs': false,
|
|
16
|
+
'createOrderWs': false,
|
|
17
|
+
'editOrderWs': false,
|
|
18
|
+
'fetchBalanceWs': false,
|
|
19
|
+
'fetchOpenOrdersWs': false,
|
|
20
|
+
'fetchOrderWs': false,
|
|
21
|
+
'fetchTradesWs': false,
|
|
22
|
+
'watchOHLCV': false,
|
|
23
|
+
'watchOrderBook': true,
|
|
24
|
+
'watchTicker': true,
|
|
25
|
+
'watchTickers': false,
|
|
26
|
+
'watchTrades': true,
|
|
27
|
+
'watchBalance': true,
|
|
28
|
+
'watchOrders': true,
|
|
29
|
+
'watchMyTrades': false,
|
|
30
|
+
'watchPosition': undefined,
|
|
31
|
+
'watchPositions': false,
|
|
32
|
+
},
|
|
33
|
+
'urls': {
|
|
34
|
+
'api': {
|
|
35
|
+
'ws': 'wss://futures-apiws.poloniex.com/endpoint',
|
|
36
|
+
},
|
|
37
|
+
},
|
|
38
|
+
'options': {
|
|
39
|
+
'tradesLimit': 1000,
|
|
40
|
+
'ordersLimit': 1000,
|
|
41
|
+
'watchTicker': {
|
|
42
|
+
'method': '/contractMarket/ticker', // can also be /contractMarket/snapshot
|
|
43
|
+
},
|
|
44
|
+
'watchOrders': {
|
|
45
|
+
'method': '/contractMarket/tradeOrders', // can also be /contractMarket/advancedOrders
|
|
46
|
+
},
|
|
47
|
+
'watchOrderBook': {
|
|
48
|
+
'method': '/contractMarket/level2',
|
|
49
|
+
'snapshotDelay': 5,
|
|
50
|
+
'snapshotMaxRetries': 3,
|
|
51
|
+
},
|
|
52
|
+
'streamLimit': 5,
|
|
53
|
+
'streamBySubscriptionsHash': {},
|
|
54
|
+
'streamIndex': -1,
|
|
55
|
+
},
|
|
56
|
+
'streaming': {
|
|
57
|
+
'keepAlive': 30000,
|
|
58
|
+
'maxPingPongMisses': 2.0,
|
|
59
|
+
},
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
negotiate(privateChannel, params = {}) {
|
|
63
|
+
const connectId = privateChannel ? 'private' : 'public';
|
|
64
|
+
const urls = this.safeValue(this.options, 'urls', {});
|
|
65
|
+
if (connectId in urls) {
|
|
66
|
+
return urls[connectId];
|
|
67
|
+
}
|
|
68
|
+
// we store an awaitable to the url
|
|
69
|
+
// so that multiple calls don't asynchronously
|
|
70
|
+
// fetch different urls and overwrite each other
|
|
71
|
+
urls[connectId] = this.spawn(this.negotiateHelper, privateChannel, params);
|
|
72
|
+
this.options['urls'] = urls;
|
|
73
|
+
return urls[connectId];
|
|
74
|
+
}
|
|
75
|
+
async negotiateHelper(privateChannel, params = {}) {
|
|
76
|
+
let response = undefined;
|
|
77
|
+
const connectId = privateChannel ? 'private' : 'public';
|
|
78
|
+
if (privateChannel) {
|
|
79
|
+
response = await this.privatePostBulletPrivate(params);
|
|
80
|
+
//
|
|
81
|
+
// {
|
|
82
|
+
// "code": "200000",
|
|
83
|
+
// "data": {
|
|
84
|
+
// "instanceServers": [
|
|
85
|
+
// {
|
|
86
|
+
// "pingInterval": 50000,
|
|
87
|
+
// "endpoint": "wss://push-private.kucoin.com/endpoint",
|
|
88
|
+
// "protocol": "websocket",
|
|
89
|
+
// "encrypt": true,
|
|
90
|
+
// "pingTimeout": 10000
|
|
91
|
+
// }
|
|
92
|
+
// ],
|
|
93
|
+
// "token": "2neAiuYvAU61ZDXANAGAsiL4-iAExhsBXZxftpOeh_55i3Ysy2q2LEsEWU64mdzUOPusi34M_wGoSf7iNyEWJ1UQy47YbpY4zVdzilNP-Bj3iXzrjjGlWtiYB9J6i9GjsxUuhPw3BlrzazF6ghq4Lzf7scStOz3KkxjwpsOBCH4=.WNQmhZQeUKIkh97KYgU0Lg=="
|
|
94
|
+
// }
|
|
95
|
+
// }
|
|
96
|
+
//
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
response = await this.publicPostBulletPublic(params);
|
|
100
|
+
}
|
|
101
|
+
const data = this.safeValue(response, 'data', {});
|
|
102
|
+
const instanceServers = this.safeValue(data, 'instanceServers', []);
|
|
103
|
+
const firstInstanceServer = this.safeValue(instanceServers, 0);
|
|
104
|
+
const pingInterval = this.safeInteger(firstInstanceServer, 'pingInterval');
|
|
105
|
+
const endpoint = this.safeString(firstInstanceServer, 'endpoint');
|
|
106
|
+
const token = this.safeString(data, 'token');
|
|
107
|
+
const result = endpoint + '?' + this.urlencode({
|
|
108
|
+
'token': token,
|
|
109
|
+
'privateChannel': privateChannel,
|
|
110
|
+
'connectId': connectId,
|
|
111
|
+
});
|
|
112
|
+
const client = this.client(result);
|
|
113
|
+
client.keepAlive = pingInterval;
|
|
114
|
+
return result;
|
|
115
|
+
}
|
|
116
|
+
requestId() {
|
|
117
|
+
const requestId = this.sum(this.safeInteger(this.options, 'requestId', 0), 1);
|
|
118
|
+
this.options['requestId'] = requestId;
|
|
119
|
+
return requestId;
|
|
120
|
+
}
|
|
121
|
+
async subscribe(name, isPrivate, symbol = undefined, subscription = undefined, params = {}) {
|
|
122
|
+
/**
|
|
123
|
+
* @ignore
|
|
124
|
+
* @method
|
|
125
|
+
* @description Connects to a websocket channel
|
|
126
|
+
* @param {string} name name of the channel and suscriptionHash
|
|
127
|
+
* @param {bool} isPrivate true for the authenticated url, false for the public url
|
|
128
|
+
* @param {string} symbol is required for all public channels, not required for private channels (except position)
|
|
129
|
+
* @param {object} subscription subscription parameters
|
|
130
|
+
* @param {object} [params] extra parameters specific to the poloniex api
|
|
131
|
+
* @returns {object} data from the websocket stream
|
|
132
|
+
*/
|
|
133
|
+
const url = await this.negotiate(isPrivate);
|
|
134
|
+
if (symbol !== undefined) {
|
|
135
|
+
const market = this.market(symbol);
|
|
136
|
+
const marketId = market['id'];
|
|
137
|
+
name += ':' + marketId;
|
|
138
|
+
}
|
|
139
|
+
const messageHash = name;
|
|
140
|
+
const tunnelId = await this.stream(url, messageHash);
|
|
141
|
+
const requestId = this.requestId();
|
|
142
|
+
const subscribe = {
|
|
143
|
+
'id': requestId,
|
|
144
|
+
'type': 'subscribe',
|
|
145
|
+
'topic': name,
|
|
146
|
+
'privateChannel': isPrivate,
|
|
147
|
+
'response': true,
|
|
148
|
+
'tunnelId': tunnelId,
|
|
149
|
+
};
|
|
150
|
+
const subscriptionRequest = {
|
|
151
|
+
'id': requestId,
|
|
152
|
+
};
|
|
153
|
+
if (subscription === undefined) {
|
|
154
|
+
subscription = subscriptionRequest;
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
subscription = this.extend(subscriptionRequest, subscription);
|
|
158
|
+
}
|
|
159
|
+
const request = this.extend(subscribe, params);
|
|
160
|
+
return await this.watch(url, messageHash, request, name, subscriptionRequest);
|
|
161
|
+
}
|
|
162
|
+
onClose(client, error) {
|
|
163
|
+
this.options['streamBySubscriptionsHash'] = {};
|
|
164
|
+
super.onClose(client, error);
|
|
165
|
+
}
|
|
166
|
+
async stream(url, subscriptionHash) {
|
|
167
|
+
const streamBySubscriptionsHash = this.safeValue(this.options, 'streamBySubscriptionsHash', {});
|
|
168
|
+
let stream = this.safeString(streamBySubscriptionsHash, subscriptionHash);
|
|
169
|
+
if (stream === undefined) {
|
|
170
|
+
let streamIndex = this.safeInteger(this.options, 'streamIndex', -1);
|
|
171
|
+
const streamLimit = this.safeValue(this.options, 'streamLimit');
|
|
172
|
+
streamIndex = streamIndex + 1;
|
|
173
|
+
const normalizedIndex = streamIndex % streamLimit;
|
|
174
|
+
this.options['streamIndex'] = streamIndex;
|
|
175
|
+
const streamIndexString = this.numberToString(normalizedIndex);
|
|
176
|
+
stream = 'stream-' + streamIndexString;
|
|
177
|
+
this.options['streamBySubscriptionsHash'][subscriptionHash] = stream;
|
|
178
|
+
const messageHash = 'tunnel:' + stream;
|
|
179
|
+
const request = {
|
|
180
|
+
'id': messageHash,
|
|
181
|
+
'type': 'openTunnel',
|
|
182
|
+
'newTunnelId': stream,
|
|
183
|
+
'response': true,
|
|
184
|
+
};
|
|
185
|
+
const subscription = {
|
|
186
|
+
'id': messageHash,
|
|
187
|
+
'method': this.handleNewStream,
|
|
188
|
+
};
|
|
189
|
+
await this.watch(url, messageHash, request, messageHash, subscription);
|
|
190
|
+
}
|
|
191
|
+
return stream;
|
|
192
|
+
}
|
|
193
|
+
handleOrderBookSubscription(client, message, subscription) {
|
|
194
|
+
const symbol = this.safeString(subscription, 'symbol');
|
|
195
|
+
const limit = this.safeInteger(subscription, 'limit');
|
|
196
|
+
this.orderbooks[symbol] = this.orderBook({}, limit);
|
|
197
|
+
}
|
|
198
|
+
handleSubscriptionStatus(client, message) {
|
|
199
|
+
//
|
|
200
|
+
// {
|
|
201
|
+
// "id": "1578090438322",
|
|
202
|
+
// "type": "ack"
|
|
203
|
+
// }
|
|
204
|
+
//
|
|
205
|
+
const id = this.safeString(message, 'id');
|
|
206
|
+
const subscriptionsById = this.indexBy(client.subscriptions, 'id');
|
|
207
|
+
const subscription = this.safeValue(subscriptionsById, id, {});
|
|
208
|
+
const method = this.safeValue(subscription, 'method');
|
|
209
|
+
if (method !== undefined) {
|
|
210
|
+
method.call(this, client, message, subscription);
|
|
211
|
+
}
|
|
212
|
+
return message;
|
|
213
|
+
}
|
|
214
|
+
handleNewStream(client, message, subscription) {
|
|
215
|
+
//
|
|
216
|
+
// {
|
|
217
|
+
// "id": "1545910840805",
|
|
218
|
+
// "type": "ack"
|
|
219
|
+
// }
|
|
220
|
+
//
|
|
221
|
+
const messageHash = this.safeString(message, 'id');
|
|
222
|
+
client.resolve(message, messageHash);
|
|
223
|
+
}
|
|
224
|
+
async watchTicker(symbol, params = {}) {
|
|
225
|
+
/**
|
|
226
|
+
* @method
|
|
227
|
+
* @name poloniexfutures#watchTicker
|
|
228
|
+
* @description watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
|
|
229
|
+
* @see https://futures-docs.poloniex.com/#get-real-time-symbol-ticker
|
|
230
|
+
* @param {string} symbol unified symbol of the market to fetch the ticker for
|
|
231
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
232
|
+
* @returns {object} a [ticker structure]{@link https://docs.ccxt.com/#/?id=ticker-structure}
|
|
233
|
+
*/
|
|
234
|
+
await this.loadMarkets();
|
|
235
|
+
symbol = this.symbol(symbol);
|
|
236
|
+
const name = '/contractMarket/ticker';
|
|
237
|
+
return await this.subscribe(name, false, symbol, undefined, params);
|
|
238
|
+
}
|
|
239
|
+
async watchTrades(symbol, since = undefined, limit = undefined, params = {}) {
|
|
240
|
+
/**
|
|
241
|
+
* @method
|
|
242
|
+
* @name poloniexfutures#watchTrades
|
|
243
|
+
* @description get the list of most recent trades for a particular symbol
|
|
244
|
+
* @see https://futures-docs.poloniex.com/#full-matching-engine-data-level-3
|
|
245
|
+
* @param {string} symbol unified symbol of the market to fetch trades for
|
|
246
|
+
* @param {int} [since] timestamp in ms of the earliest trade to fetch
|
|
247
|
+
* @param {int} [limit] the maximum amount of trades to fetch
|
|
248
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
249
|
+
* @returns {object[]} a list of [trade structures]{@link https://docs.ccxt.com/#/?id=public-trades}
|
|
250
|
+
*/
|
|
251
|
+
await this.loadMarkets();
|
|
252
|
+
const options = this.safeValue(this.options, 'watchTrades');
|
|
253
|
+
let name = this.safeString(options, 'method', '/contractMarket/execution'); // can also be /contractMarket/snapshot
|
|
254
|
+
[name, params] = this.handleOptionAndParams(params, 'method', 'name', name);
|
|
255
|
+
symbol = this.symbol(symbol);
|
|
256
|
+
const trades = await this.subscribe(name, false, symbol, undefined, params);
|
|
257
|
+
if (this.newUpdates) {
|
|
258
|
+
limit = trades.getLimit(symbol, limit);
|
|
259
|
+
}
|
|
260
|
+
return this.filterBySinceLimit(trades, since, limit, 'timestamp', true);
|
|
261
|
+
}
|
|
262
|
+
async watchOrderBook(symbol, limit = undefined, params = {}) {
|
|
263
|
+
/**
|
|
264
|
+
* @method
|
|
265
|
+
* @name poloniexfutures#watchOrderBook
|
|
266
|
+
* @description watches information on open orders with bid (buy) and ask (sell) prices, volumes and other data
|
|
267
|
+
* @see https://futures-docs.poloniex.com/#level-2-market-data
|
|
268
|
+
* @param {string} symbol unified symbol of the market to fetch the order book for
|
|
269
|
+
* @param {int} [limit] not used by poloniexfutures watchOrderBook
|
|
270
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
271
|
+
* @param {string} [params.method] the method to use. Defaults to /contractMarket/level2 can also be /contractMarket/level3v2 to receive the raw stream of orders
|
|
272
|
+
* @returns {object} A dictionary of [order book structures]{@link https://docs.ccxt.com/#/?id=order-book-structure} indexed by market symbols
|
|
273
|
+
*/
|
|
274
|
+
await this.loadMarkets();
|
|
275
|
+
const options = this.safeValue(this.options, 'watchOrderBook');
|
|
276
|
+
let name = this.safeString(options, 'method', '/contractMarket/level2'); // can also be /contractMarket/level2, /contractMarket/level2Depth5:{symbol}, /contractMarket/level2Depth50:{symbol}
|
|
277
|
+
[name, params] = this.handleOptionAndParams(params, 'method', 'name', name);
|
|
278
|
+
if (name === '/contractMarket/level2' && limit !== undefined) {
|
|
279
|
+
if (limit !== 5 && limit !== 50) {
|
|
280
|
+
throw new errors.BadRequest(this.id + ' watchOrderBook limit argument must be none, 5 or 50 if using method /contractMarket/level2');
|
|
281
|
+
}
|
|
282
|
+
name += 'Depth' + this.numberToString(limit);
|
|
283
|
+
}
|
|
284
|
+
const subscription = {
|
|
285
|
+
'symbol': symbol,
|
|
286
|
+
'limit': limit,
|
|
287
|
+
'method': this.handleOrderBookSubscription,
|
|
288
|
+
};
|
|
289
|
+
const orderbook = await this.subscribe(name, false, symbol, subscription, params);
|
|
290
|
+
return orderbook.limit();
|
|
291
|
+
}
|
|
292
|
+
async watchOrders(symbol = undefined, since = undefined, limit = undefined, params = {}) {
|
|
293
|
+
/**
|
|
294
|
+
* @method
|
|
295
|
+
* @name poloniexfutures#watchOrders
|
|
296
|
+
* @description watches information on multiple orders made by the user
|
|
297
|
+
* @see https://futures-docs.poloniex.com/#private-messages
|
|
298
|
+
* @param {string} symbol filter by unified market symbol of the market orders were made in
|
|
299
|
+
* @param {int} [since] the earliest time in ms to fetch orders for
|
|
300
|
+
* @param {int} [limit] the maximum number of order structures to retrieve
|
|
301
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
302
|
+
* @param {string} [params.method] the method to use will default to /contractMarket/tradeOrders. Set to /contractMarket/advancedOrders to watch stop orders
|
|
303
|
+
* @returns {object[]} a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
|
|
304
|
+
*/
|
|
305
|
+
await this.loadMarkets();
|
|
306
|
+
const options = this.safeValue(this.options, 'watchOrders');
|
|
307
|
+
const name = this.safeString(options, 'method', '/contractMarket/tradeOrders');
|
|
308
|
+
let orders = await this.subscribe(name, true, undefined, undefined, params);
|
|
309
|
+
if (this.newUpdates) {
|
|
310
|
+
limit = orders.getLimit(symbol, limit);
|
|
311
|
+
}
|
|
312
|
+
orders = this.filterBySymbolSinceLimit(orders, symbol, since, limit);
|
|
313
|
+
const length = orders.length;
|
|
314
|
+
if (length === 0) {
|
|
315
|
+
return await this.watchOrders(symbol, since, limit, params);
|
|
316
|
+
}
|
|
317
|
+
return orders;
|
|
318
|
+
}
|
|
319
|
+
async watchBalance(params = {}) {
|
|
320
|
+
/**
|
|
321
|
+
* @method
|
|
322
|
+
* @name poloniexfutures#watchBalance
|
|
323
|
+
* @description watch balance and get the amount of funds available for trading or funds locked in orders
|
|
324
|
+
* @see https://futures-docs.poloniex.com/#account-balance-events
|
|
325
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
326
|
+
* @returns {object} a [balance structure]{@link https://docs.ccxt.com/#/?id=balance-structure}
|
|
327
|
+
*/
|
|
328
|
+
await this.loadMarkets();
|
|
329
|
+
const name = '/contractAccount/wallet';
|
|
330
|
+
return await this.subscribe(name, true, undefined, undefined, params);
|
|
331
|
+
}
|
|
332
|
+
handleTrade(client, message) {
|
|
333
|
+
//
|
|
334
|
+
// {
|
|
335
|
+
// "data": {
|
|
336
|
+
// "makerUserId": "1410336",
|
|
337
|
+
// "symbol": "BTCUSDTPERP",
|
|
338
|
+
// "sequence": 267913,
|
|
339
|
+
// "side": "buy",
|
|
340
|
+
// "size": 2,
|
|
341
|
+
// "price": 28409.5,
|
|
342
|
+
// "takerOrderId": "6426f9f15782c8000776995f",
|
|
343
|
+
// "makerOrderId": "6426f9f141406b0008df976e",
|
|
344
|
+
// "takerUserId": "1410880",
|
|
345
|
+
// "tradeId": "6426f9f1de029f0001e334dd",
|
|
346
|
+
// "ts": 1680275953739092500,
|
|
347
|
+
// },
|
|
348
|
+
// "subject": "match",
|
|
349
|
+
// "topic": "/contractMarket/execution:BTCUSDTPERP",
|
|
350
|
+
// "type": "message",
|
|
351
|
+
// }
|
|
352
|
+
//
|
|
353
|
+
const data = this.safeValue(message, 'data', {});
|
|
354
|
+
const marketId = this.safeString(data, 'symbol');
|
|
355
|
+
if (marketId !== undefined) {
|
|
356
|
+
const trade = this.parseWsTrade(data);
|
|
357
|
+
const symbol = trade['symbol'];
|
|
358
|
+
const messageHash = '/contractMarket/execution:' + marketId;
|
|
359
|
+
let stored = this.safeValue(this.trades, symbol);
|
|
360
|
+
if (stored === undefined) {
|
|
361
|
+
const tradesLimit = this.safeInteger(this.options, 'tradesLimit', 1000);
|
|
362
|
+
stored = new Cache.ArrayCache(tradesLimit);
|
|
363
|
+
this.trades[symbol] = stored;
|
|
364
|
+
}
|
|
365
|
+
stored.append(trade);
|
|
366
|
+
client.resolve(stored, messageHash);
|
|
367
|
+
}
|
|
368
|
+
return message;
|
|
369
|
+
}
|
|
370
|
+
parseWsTrade(trade, market = undefined) {
|
|
371
|
+
//
|
|
372
|
+
// handleTrade
|
|
373
|
+
//
|
|
374
|
+
// {
|
|
375
|
+
// "makerUserId": "1410880",
|
|
376
|
+
// "symbol": "BTCUSDTPERP",
|
|
377
|
+
// "sequence": 731390,
|
|
378
|
+
// "side": "sell",
|
|
379
|
+
// "size": 2,
|
|
380
|
+
// "price": 29372.4,
|
|
381
|
+
// "takerOrderId": "644ef0fdd64748000759218a",
|
|
382
|
+
// "makerOrderId": "644ef0fd25f4a50007f12fc5",
|
|
383
|
+
// "takerUserId": "1410880",
|
|
384
|
+
// "tradeId": "644ef0fdde029f0001eec346",
|
|
385
|
+
// "ts": 1682895101923194000
|
|
386
|
+
// }
|
|
387
|
+
//
|
|
388
|
+
const marketId = this.safeString(trade, 'symbol');
|
|
389
|
+
market = this.safeMarket(marketId, market);
|
|
390
|
+
const timestamp = this.safeIntegerProduct(trade, 'ts', 0.000001);
|
|
391
|
+
return this.safeTrade({
|
|
392
|
+
'info': trade,
|
|
393
|
+
'id': this.safeString(trade, 'tradeId'),
|
|
394
|
+
'symbol': this.safeString(market, 'symbol'),
|
|
395
|
+
'timestamp': timestamp,
|
|
396
|
+
'datetime': this.iso8601(timestamp),
|
|
397
|
+
'order': this.safeString2(trade, 'takerOrderId', 'makerOrderId'),
|
|
398
|
+
'type': undefined,
|
|
399
|
+
'side': this.safeString(trade, 'side'),
|
|
400
|
+
'takerOrMaker': undefined,
|
|
401
|
+
'price': this.safeString(trade, 'price'),
|
|
402
|
+
'amount': this.safeString2(trade, 'matchSize', 'size'),
|
|
403
|
+
'cost': undefined,
|
|
404
|
+
'fee': undefined,
|
|
405
|
+
}, market);
|
|
406
|
+
}
|
|
407
|
+
parseWsOrderTrade(trade, market = undefined) {
|
|
408
|
+
//
|
|
409
|
+
// {
|
|
410
|
+
// "symbol": "BTC_USDT",
|
|
411
|
+
// "type": "LIMIT",
|
|
412
|
+
// "quantity": "1",
|
|
413
|
+
// "orderId": "32471407854219264",
|
|
414
|
+
// "tradeFee": "0",
|
|
415
|
+
// "clientOrderId": "",
|
|
416
|
+
// "accountType": "SPOT",
|
|
417
|
+
// "feeCurrency": "",
|
|
418
|
+
// "eventType": "place",
|
|
419
|
+
// "source": "API",
|
|
420
|
+
// "side": "BUY",
|
|
421
|
+
// "filledQuantity": "0",
|
|
422
|
+
// "filledAmount": "0",
|
|
423
|
+
// "matchRole": "MAKER",
|
|
424
|
+
// "state": "NEW",
|
|
425
|
+
// "tradeTime": 0,
|
|
426
|
+
// "tradeAmount": "0",
|
|
427
|
+
// "orderAmount": "0",
|
|
428
|
+
// "createTime": 1648708186922,
|
|
429
|
+
// "price": "47112.1",
|
|
430
|
+
// "tradeQty": "0",
|
|
431
|
+
// "tradePrice": "0",
|
|
432
|
+
// "tradeId": "0",
|
|
433
|
+
// "ts": 1648708187469
|
|
434
|
+
// }
|
|
435
|
+
//
|
|
436
|
+
const timestamp = this.safeInteger(trade, 'tradeTime');
|
|
437
|
+
const marketId = this.safeString(trade, 'symbol');
|
|
438
|
+
return this.safeTrade({
|
|
439
|
+
'info': trade,
|
|
440
|
+
'id': this.safeString(trade, 'tradeId'),
|
|
441
|
+
'symbol': this.safeSymbol(marketId, market),
|
|
442
|
+
'timestamp': timestamp,
|
|
443
|
+
'datetime': this.iso8601(timestamp),
|
|
444
|
+
'order': this.safeString(trade, 'orderId'),
|
|
445
|
+
'type': this.safeStringLower(trade, 'type'),
|
|
446
|
+
'side': this.safeString(trade, 'side'),
|
|
447
|
+
'takerOrMaker': this.safeStringLower(trade, 'matchRole'),
|
|
448
|
+
'price': this.safeString(trade, 'price'),
|
|
449
|
+
'amount': this.safeString(trade, 'tradeAmount'),
|
|
450
|
+
'cost': undefined,
|
|
451
|
+
'fee': {
|
|
452
|
+
'rate': undefined,
|
|
453
|
+
'cost': this.safeString(trade, 'tradeFee'),
|
|
454
|
+
'currency': this.safeString(trade, 'feeCurrency'),
|
|
455
|
+
},
|
|
456
|
+
}, market);
|
|
457
|
+
}
|
|
458
|
+
handleOrder(client, message) {
|
|
459
|
+
//
|
|
460
|
+
// {
|
|
461
|
+
// "data": {
|
|
462
|
+
// "symbol": "ADAUSDTPERP",
|
|
463
|
+
// "orderType": "limit",
|
|
464
|
+
// "side": "buy",
|
|
465
|
+
// "canceledSize": "1",
|
|
466
|
+
// "orderId": "642b4d4c0494cd0007c76813",
|
|
467
|
+
// "type": "canceled",
|
|
468
|
+
// "orderTime": "1680559436101909048",
|
|
469
|
+
// "size": "1",
|
|
470
|
+
// "filledSize": "0",
|
|
471
|
+
// "marginType": 1,
|
|
472
|
+
// "price": "0.25",
|
|
473
|
+
// "remainSize": "0",
|
|
474
|
+
// "clientOid": "112cbbf1-95a3-4917-957c-d3a87d81f853",
|
|
475
|
+
// "status": "done",
|
|
476
|
+
// "ts": 1680559677560686600
|
|
477
|
+
// },
|
|
478
|
+
// "subject": "orderChange",
|
|
479
|
+
// "topic": "/contractMarket/tradeOrders",
|
|
480
|
+
// "channelType": "private",
|
|
481
|
+
// "type": "message",
|
|
482
|
+
// "userId": "1139790"
|
|
483
|
+
// }
|
|
484
|
+
// stop order
|
|
485
|
+
// {
|
|
486
|
+
// "data": {
|
|
487
|
+
// "orderType": "stop",
|
|
488
|
+
// "symbol": "BTCUSDTPERP",
|
|
489
|
+
// "side": "buy",
|
|
490
|
+
// "stopPriceType": "TP",
|
|
491
|
+
// "orderId": "64514fe1850d2100074378f6",
|
|
492
|
+
// "type": "open",
|
|
493
|
+
// "createdAt": 1683050465847,
|
|
494
|
+
// "stopPrice": "29000",
|
|
495
|
+
// "size": 2,
|
|
496
|
+
// "stop": "up",
|
|
497
|
+
// "marginType": 0,
|
|
498
|
+
// "orderPrice": "28552.9",
|
|
499
|
+
// "ts": 1683050465847597300
|
|
500
|
+
// },
|
|
501
|
+
// "subject": "stopOrder",
|
|
502
|
+
// "topic": "/contractMarket/advancedOrders",
|
|
503
|
+
// "channelType": "private",
|
|
504
|
+
// "id": "64514fe1850d2100074378fa",
|
|
505
|
+
// "type": "message",
|
|
506
|
+
// "userId": "1160396"
|
|
507
|
+
// }
|
|
508
|
+
//
|
|
509
|
+
const data = this.safeValue(message, 'data', {});
|
|
510
|
+
let orders = this.orders;
|
|
511
|
+
if (orders === undefined) {
|
|
512
|
+
const limit = this.safeInteger(this.options, 'ordersLimit');
|
|
513
|
+
orders = new Cache.ArrayCacheBySymbolById(limit);
|
|
514
|
+
this.orders = orders;
|
|
515
|
+
}
|
|
516
|
+
const messageHash = '/contractMarket/tradeOrders';
|
|
517
|
+
const parsed = this.parseWsOrder(data);
|
|
518
|
+
orders.append(parsed);
|
|
519
|
+
client.resolve(orders, messageHash);
|
|
520
|
+
return message;
|
|
521
|
+
}
|
|
522
|
+
parseOrderStatus(status, type) {
|
|
523
|
+
/**
|
|
524
|
+
* @ignore
|
|
525
|
+
* @method
|
|
526
|
+
* @param {string} status "match", "open", "done"
|
|
527
|
+
* @param {string} type "open", "match", "filled", "canceled", "update"
|
|
528
|
+
* @returns {string}
|
|
529
|
+
*/
|
|
530
|
+
const types = {
|
|
531
|
+
'canceled': 'canceled',
|
|
532
|
+
'cancel': 'canceled',
|
|
533
|
+
'filled': 'closed',
|
|
534
|
+
};
|
|
535
|
+
let parsedStatus = this.safeString(types, type);
|
|
536
|
+
if (parsedStatus === undefined) {
|
|
537
|
+
const statuses = {
|
|
538
|
+
'open': 'open',
|
|
539
|
+
'match': 'open',
|
|
540
|
+
'done': 'closed',
|
|
541
|
+
};
|
|
542
|
+
parsedStatus = this.safeString(statuses, status, status);
|
|
543
|
+
}
|
|
544
|
+
return parsedStatus;
|
|
545
|
+
}
|
|
546
|
+
parseWsOrder(order, market = undefined) {
|
|
547
|
+
//
|
|
548
|
+
// {
|
|
549
|
+
// "symbol": "ADAUSDTPERP",
|
|
550
|
+
// "orderType": "limit",
|
|
551
|
+
// "side": "buy",
|
|
552
|
+
// "canceledSize": "1",
|
|
553
|
+
// "orderId": "642b4d4c0494cd0007c76813",
|
|
554
|
+
// "type": "canceled",
|
|
555
|
+
// "orderTime": "1680559436101909048",
|
|
556
|
+
// "size": "1",
|
|
557
|
+
// "filledSize": "0",
|
|
558
|
+
// "marginType": 1,
|
|
559
|
+
// "price": "0.25",
|
|
560
|
+
// "remainSize": "0",
|
|
561
|
+
// "clientOid": "112cbbf1-95a3-4917-957c-d3a87d81f853",
|
|
562
|
+
// "status": "done",
|
|
563
|
+
// "ts": 1680559677560686600
|
|
564
|
+
// }
|
|
565
|
+
// stop
|
|
566
|
+
// {
|
|
567
|
+
// "orderType": "stop",
|
|
568
|
+
// "symbol": "BTCUSDTPERP",
|
|
569
|
+
// "side": "buy",
|
|
570
|
+
// "stopPriceType": "TP",
|
|
571
|
+
// "orderId": "64514fe1850d2100074378f6",
|
|
572
|
+
// "type": "open",
|
|
573
|
+
// "createdAt": 1683050465847,
|
|
574
|
+
// "stopPrice": "29000",
|
|
575
|
+
// "size": 2,
|
|
576
|
+
// "stop": "up",
|
|
577
|
+
// "marginType": 0,
|
|
578
|
+
// "orderPrice": "28552.9",
|
|
579
|
+
// "ts": 1683050465847597300
|
|
580
|
+
// }
|
|
581
|
+
//
|
|
582
|
+
const id = this.safeString(order, 'orderId');
|
|
583
|
+
const clientOrderId = this.safeString(order, 'clientOid');
|
|
584
|
+
const marketId = this.safeString(order, 'symbol');
|
|
585
|
+
const timestamp = this.safeIntegerProduct2(order, 'orderTime', 'ts', 0.000001);
|
|
586
|
+
const status = this.safeString(order, 'status');
|
|
587
|
+
const messageType = this.safeString(order, 'type');
|
|
588
|
+
return this.safeOrder({
|
|
589
|
+
'info': order,
|
|
590
|
+
'symbol': this.safeSymbol(marketId, market),
|
|
591
|
+
'id': id,
|
|
592
|
+
'clientOrderId': clientOrderId,
|
|
593
|
+
'timestamp': timestamp,
|
|
594
|
+
'datetime': this.iso8601(timestamp),
|
|
595
|
+
'lastTradeTimestamp': undefined,
|
|
596
|
+
'type': this.safeString(order, 'orderType'),
|
|
597
|
+
'timeInForce': undefined,
|
|
598
|
+
'postOnly': undefined,
|
|
599
|
+
'side': this.safeString(order, 'side'),
|
|
600
|
+
'price': this.safeString2(order, 'price', 'orderPrice'),
|
|
601
|
+
'stopPrice': this.safeString(order, 'stopPrice'),
|
|
602
|
+
'triggerPrice': undefined,
|
|
603
|
+
'amount': this.safeString(order, 'size'),
|
|
604
|
+
'cost': undefined,
|
|
605
|
+
'average': undefined,
|
|
606
|
+
'filled': this.safeString(order, 'filledSize'),
|
|
607
|
+
'remaining': this.safeString(order, 'remainSize'),
|
|
608
|
+
'status': this.parseOrderStatus(status, messageType),
|
|
609
|
+
'fee': undefined,
|
|
610
|
+
'trades': undefined,
|
|
611
|
+
});
|
|
612
|
+
}
|
|
613
|
+
handleTicker(client, message) {
|
|
614
|
+
//
|
|
615
|
+
// {
|
|
616
|
+
// "subject": "ticker",
|
|
617
|
+
// "topic": "/contractMarket/ticker:BTCUSDTPERP",
|
|
618
|
+
// "data": {
|
|
619
|
+
// "symbol": "BTCUSDTPERP", // Market of the symbol
|
|
620
|
+
// "sequence": 45, // Sequence number which is used to judge the continuity of the pushed messages
|
|
621
|
+
// "side": "sell", // Transaction side of the last traded taker order
|
|
622
|
+
// "price": 3600.00, // Filled price
|
|
623
|
+
// "size": 16, // Filled quantity
|
|
624
|
+
// "tradeId": "5c9dcf4170744d6f5a3d32fb", // Order ID
|
|
625
|
+
// "bestBidSize": 795, // Best bid size
|
|
626
|
+
// "bestBidPrice": 3200.00, // Best bid
|
|
627
|
+
// "bestAskPrice": 3600.00, // Best ask size
|
|
628
|
+
// "bestAskSize": 284, // Best ask
|
|
629
|
+
// "ts": 1553846081210004941 // Filled time - nanosecond
|
|
630
|
+
// },
|
|
631
|
+
// "type": "message",
|
|
632
|
+
// }
|
|
633
|
+
//
|
|
634
|
+
// {
|
|
635
|
+
// "topic": "/contractMarket/snapshot:BTCUSDTPERP",
|
|
636
|
+
// "subject": "snapshot.24h",
|
|
637
|
+
// "data": {
|
|
638
|
+
// "volume": 30449670, //24h Volume
|
|
639
|
+
// "turnover": 845169919063, //24h Turnover
|
|
640
|
+
// "lastPrice": 3551, //Last price
|
|
641
|
+
// "priceChgPct": 0.0043, //24h Change
|
|
642
|
+
// "ts": 1547697294838004923 //Snapshot time (nanosecond)
|
|
643
|
+
// }
|
|
644
|
+
// }
|
|
645
|
+
//
|
|
646
|
+
const data = this.safeValue(message, 'data', {});
|
|
647
|
+
const messageHash = this.safeString(message, 'topic');
|
|
648
|
+
const symbol = this.getSymbolFromTopic(messageHash);
|
|
649
|
+
if (symbol !== undefined) {
|
|
650
|
+
const ticker = this.parseTicker(data);
|
|
651
|
+
this.tickers[symbol] = ticker;
|
|
652
|
+
client.resolve(ticker, messageHash);
|
|
653
|
+
}
|
|
654
|
+
return message;
|
|
655
|
+
}
|
|
656
|
+
handleL3OrderBook(client, message) {
|
|
657
|
+
//
|
|
658
|
+
// {
|
|
659
|
+
// "data": {
|
|
660
|
+
// "symbol": "BTCUSDTPERP",
|
|
661
|
+
// "sequence": 1679593048010,
|
|
662
|
+
// "orderId": "6426fec8586b9500089d64d8",
|
|
663
|
+
// "clientOid": "14e6ee8e-8757-462c-84db-ed12c2b62f55",
|
|
664
|
+
// "ts": 1680277192127513900
|
|
665
|
+
// },
|
|
666
|
+
// "subject": "received",
|
|
667
|
+
// "topic": "/contractMarket/level3v2:BTCUSDTPERP",
|
|
668
|
+
// "type": "message"
|
|
669
|
+
// }
|
|
670
|
+
//
|
|
671
|
+
// {
|
|
672
|
+
// "data": {
|
|
673
|
+
// "symbol": "BTCUSDTPERP",
|
|
674
|
+
// "sequence": 1679593047982,
|
|
675
|
+
// "side": "sell",
|
|
676
|
+
// "orderTime": "1680277191900131371",
|
|
677
|
+
// "size": "1",
|
|
678
|
+
// "orderId": "6426fec7d32b6e000790268b",
|
|
679
|
+
// "price": "28376.4",
|
|
680
|
+
// "ts": 1680277191939042300
|
|
681
|
+
// },
|
|
682
|
+
// "subject": "open",
|
|
683
|
+
// "topic": "/contractMarket/level3v2:BTCUSDTPERP",
|
|
684
|
+
// "type": "message"
|
|
685
|
+
// }
|
|
686
|
+
//
|
|
687
|
+
// {
|
|
688
|
+
// "data": {
|
|
689
|
+
// "symbol": "BTCUSDTPERP",
|
|
690
|
+
// "reason": "canceled", // or "filled"
|
|
691
|
+
// "sequence": 1679593047983,
|
|
692
|
+
// "orderId": "6426fec74026fa0008e7046f",
|
|
693
|
+
// "ts": 1680277191949842000
|
|
694
|
+
// },
|
|
695
|
+
// "subject": "done",
|
|
696
|
+
// "topic": "/contractMarket/level3v2:BTCUSDTPERP",
|
|
697
|
+
// "type": "message"
|
|
698
|
+
// }
|
|
699
|
+
//
|
|
700
|
+
const messageHash = this.safeString(message, 'topic');
|
|
701
|
+
const subject = this.safeString(message, 'subject');
|
|
702
|
+
if (subject === 'received') {
|
|
703
|
+
return message;
|
|
704
|
+
}
|
|
705
|
+
// At the time of writting this, there is no implementation to easily convert each order into the orderbook so raw messages are returned
|
|
706
|
+
client.resolve(message, messageHash);
|
|
707
|
+
}
|
|
708
|
+
handleLevel2(client, message) {
|
|
709
|
+
// {
|
|
710
|
+
// "subject": "level2",
|
|
711
|
+
// "topic": "/contractMarket/level2:BTCUSDTPERP",
|
|
712
|
+
// "type": "message",
|
|
713
|
+
// "data": {
|
|
714
|
+
// "sequence": 18, // Sequence number which is used to judge the continuity of pushed messages
|
|
715
|
+
// "change": "5000.0,sell,83" // Price, side, quantity
|
|
716
|
+
// "timestamp": 1551770400000
|
|
717
|
+
// }
|
|
718
|
+
// }
|
|
719
|
+
const topic = this.safeString(message, 'topic');
|
|
720
|
+
const isSnapshot = topic.indexOf('Depth') >= 0;
|
|
721
|
+
if (isSnapshot) {
|
|
722
|
+
return this.handeL2Snapshot(client, message);
|
|
723
|
+
}
|
|
724
|
+
return this.handleL2OrderBook(client, message);
|
|
725
|
+
}
|
|
726
|
+
handleL2OrderBook(client, message) {
|
|
727
|
+
//
|
|
728
|
+
// {
|
|
729
|
+
// "id": 1545910660740,
|
|
730
|
+
// "type": "subscribe",
|
|
731
|
+
// "topic": "/contractMarket/level2:BTCUSDTPERP",
|
|
732
|
+
// "response": true
|
|
733
|
+
// }
|
|
734
|
+
//
|
|
735
|
+
// {
|
|
736
|
+
// "subject": "level2",
|
|
737
|
+
// "topic": "/contractMarket/level2:BTCUSDTPERP",
|
|
738
|
+
// "type": "message",
|
|
739
|
+
// "data": {
|
|
740
|
+
// "sequence": 18, // Sequence number which is used to judge the continuity of pushed messages
|
|
741
|
+
// "change": "5000.0,sell,83" // Price, side, quantity
|
|
742
|
+
// "timestamp": 1551770400000
|
|
743
|
+
// }
|
|
744
|
+
// }
|
|
745
|
+
//
|
|
746
|
+
const data = this.safeValue(message, 'data', {});
|
|
747
|
+
const messageHash = this.safeString(message, 'topic', '');
|
|
748
|
+
const symbol = this.getSymbolFromTopic(messageHash);
|
|
749
|
+
let orderBook = this.safeValue(this.orderbooks, symbol);
|
|
750
|
+
if (orderBook === undefined) {
|
|
751
|
+
this.orderbooks[symbol] = this.orderBook({});
|
|
752
|
+
orderBook = this.orderbooks[symbol];
|
|
753
|
+
orderBook['symbol'] = symbol;
|
|
754
|
+
}
|
|
755
|
+
const nonce = this.safeInteger(orderBook, 'nonce');
|
|
756
|
+
if (nonce === undefined) {
|
|
757
|
+
const cacheLength = orderBook.cache.length;
|
|
758
|
+
const snapshotDelay = this.handleOption('watchOrderBook', 'snapshotDelay', 5);
|
|
759
|
+
if (cacheLength === snapshotDelay) {
|
|
760
|
+
const limit = 0;
|
|
761
|
+
this.spawn(this.loadOrderBook, client, messageHash, symbol, limit);
|
|
762
|
+
}
|
|
763
|
+
orderBook.cache.push(data);
|
|
764
|
+
return;
|
|
765
|
+
}
|
|
766
|
+
try {
|
|
767
|
+
this.handleDelta(orderBook, data);
|
|
768
|
+
client.resolve(orderBook, messageHash);
|
|
769
|
+
}
|
|
770
|
+
catch (e) {
|
|
771
|
+
delete this.orderbooks[symbol];
|
|
772
|
+
client.reject(e, messageHash);
|
|
773
|
+
}
|
|
774
|
+
}
|
|
775
|
+
handeL2Snapshot(client, message) {
|
|
776
|
+
//
|
|
777
|
+
// {
|
|
778
|
+
// "type": "message",
|
|
779
|
+
// "topic": "/contractMarket/level2Depth5:BTCUSDTPERP",
|
|
780
|
+
// "subject": "level2",
|
|
781
|
+
// "data": {
|
|
782
|
+
// "asks": [
|
|
783
|
+
// ["9993", "3"],
|
|
784
|
+
// ["9992", "3"],
|
|
785
|
+
// ["9991", "47"],
|
|
786
|
+
// ["9990", "32"],
|
|
787
|
+
// ["9989", "8"]
|
|
788
|
+
// ],
|
|
789
|
+
// "bids": [
|
|
790
|
+
// ["9988", "56"],
|
|
791
|
+
// ["9987", "15"],
|
|
792
|
+
// ["9986", "100"],
|
|
793
|
+
// ["9985", "10"],
|
|
794
|
+
// ["9984", "10"]
|
|
795
|
+
// ],
|
|
796
|
+
// "timestamp": 1682993050531,
|
|
797
|
+
// }
|
|
798
|
+
// }
|
|
799
|
+
//
|
|
800
|
+
const data = this.safeValue(message, 'data', {});
|
|
801
|
+
const messageHash = this.safeString(message, 'topic', '');
|
|
802
|
+
const symbol = this.getSymbolFromTopic(messageHash);
|
|
803
|
+
const timestamp = this.safeInteger(data, 'timestamp');
|
|
804
|
+
const snapshot = this.parseOrderBook(data, symbol, timestamp, 'bids', 'asks');
|
|
805
|
+
const orderbook = this.orderBook(snapshot);
|
|
806
|
+
this.orderbooks[symbol] = orderbook;
|
|
807
|
+
client.resolve(orderbook, messageHash);
|
|
808
|
+
}
|
|
809
|
+
getSymbolFromTopic(topic) {
|
|
810
|
+
const splitTopic = topic.split(':');
|
|
811
|
+
const marketId = this.safeString(splitTopic, 1);
|
|
812
|
+
return this.safeSymbol(marketId);
|
|
813
|
+
}
|
|
814
|
+
getCacheIndex(orderbook, cache) {
|
|
815
|
+
const firstDelta = this.safeValue(cache, 0);
|
|
816
|
+
const nonce = this.safeInteger(orderbook, 'nonce');
|
|
817
|
+
const firstDeltaSequence = this.safeInteger(firstDelta, 'sequence');
|
|
818
|
+
if (firstDeltaSequence > nonce + 1) {
|
|
819
|
+
return -1;
|
|
820
|
+
}
|
|
821
|
+
for (let i = 0; i < cache.length; i++) {
|
|
822
|
+
const delta = cache[i];
|
|
823
|
+
const sequence = this.safeInteger(delta, 'sequence');
|
|
824
|
+
if (nonce === sequence - 1) {
|
|
825
|
+
return i;
|
|
826
|
+
}
|
|
827
|
+
}
|
|
828
|
+
return cache.length;
|
|
829
|
+
}
|
|
830
|
+
handleDelta(orderbook, delta) {
|
|
831
|
+
//
|
|
832
|
+
// {
|
|
833
|
+
// "sequence": 18, // Sequence number which is used to judge the continuity of pushed messages
|
|
834
|
+
// "change": "5000.0,sell,83" // Price, side, quantity
|
|
835
|
+
// "timestamp": 1551770400000
|
|
836
|
+
// }
|
|
837
|
+
//
|
|
838
|
+
const sequence = this.safeInteger(delta, 'sequence');
|
|
839
|
+
const nonce = this.safeInteger(orderbook, 'nonce');
|
|
840
|
+
if (nonce !== sequence - 1) {
|
|
841
|
+
throw new errors.ExchangeError(this.id + ' watchOrderBook received an out-of-order nonce');
|
|
842
|
+
}
|
|
843
|
+
const change = this.safeString(delta, 'change');
|
|
844
|
+
const splitChange = change.split(',');
|
|
845
|
+
const price = this.safeNumber(splitChange, 0);
|
|
846
|
+
const side = this.safeString(splitChange, 1);
|
|
847
|
+
const size = this.safeNumber(splitChange, 2);
|
|
848
|
+
const timestamp = this.safeInteger(delta, 'timestamp');
|
|
849
|
+
orderbook['timestamp'] = timestamp;
|
|
850
|
+
orderbook['datetime'] = this.iso8601(timestamp);
|
|
851
|
+
orderbook['nonce'] = sequence;
|
|
852
|
+
const orderBookSide = (side === 'buy') ? orderbook['bids'] : orderbook['asks'];
|
|
853
|
+
orderBookSide.store(price, size);
|
|
854
|
+
}
|
|
855
|
+
handleBalance(client, message) {
|
|
856
|
+
//
|
|
857
|
+
// {
|
|
858
|
+
// "data": {
|
|
859
|
+
// "currency": "USDT",
|
|
860
|
+
// "availableBalance": "4.0000000000",
|
|
861
|
+
// "timestamp": "1680557568670"
|
|
862
|
+
// },
|
|
863
|
+
// "subject": "availableBalance.change",
|
|
864
|
+
// "topic": "/contractAccount/wallet",
|
|
865
|
+
// "channelType": "private",
|
|
866
|
+
// "id": "642b4600cae86800074b5ab7",
|
|
867
|
+
// "type": "message",
|
|
868
|
+
// "userId": "1139790"
|
|
869
|
+
// }
|
|
870
|
+
//
|
|
871
|
+
// {
|
|
872
|
+
// "data": {
|
|
873
|
+
// "currency": "USDT",
|
|
874
|
+
// "orderMargin": "0.0000000000",
|
|
875
|
+
// "timestamp": "1680558743307"
|
|
876
|
+
// },
|
|
877
|
+
// "subject": "orderMargin.change",
|
|
878
|
+
// "topic": "/contractAccount/wallet",
|
|
879
|
+
// "channelType": "private",
|
|
880
|
+
// "id": "642b4a97b58e360007c3a237",
|
|
881
|
+
// "type": "message",
|
|
882
|
+
// "userId": "1139790"
|
|
883
|
+
// }
|
|
884
|
+
//
|
|
885
|
+
const data = this.safeValue(message, 'data', []);
|
|
886
|
+
const messageHash = '/contractAccount/wallet';
|
|
887
|
+
const currencyId = this.safeString(data, 'currency');
|
|
888
|
+
const currency = this.currency(currencyId);
|
|
889
|
+
const code = currency['code'];
|
|
890
|
+
this.balance[code] = this.parseWsBalance(data);
|
|
891
|
+
client.resolve(this.balance[code], messageHash);
|
|
892
|
+
return message;
|
|
893
|
+
}
|
|
894
|
+
parseWsBalance(response) {
|
|
895
|
+
//
|
|
896
|
+
// {
|
|
897
|
+
// "currency": "USDT",
|
|
898
|
+
// "availableBalance": "4.0000000000",
|
|
899
|
+
// "timestamp": "1680557568670"
|
|
900
|
+
// }
|
|
901
|
+
//
|
|
902
|
+
// {
|
|
903
|
+
// "currency": "USDT",
|
|
904
|
+
// "orderMargin": "0.0000000000",
|
|
905
|
+
// "timestamp": "1680558743307"
|
|
906
|
+
// }
|
|
907
|
+
//
|
|
908
|
+
const timestamp = this.safeInteger(response, 'timestamp');
|
|
909
|
+
const result = {
|
|
910
|
+
'info': response,
|
|
911
|
+
'timestamp': timestamp,
|
|
912
|
+
'datetime': this.iso8601(timestamp),
|
|
913
|
+
};
|
|
914
|
+
const currencyId = this.safeString(response, 'currency');
|
|
915
|
+
const code = this.safeCurrencyCode(currencyId);
|
|
916
|
+
const newAccount = this.account();
|
|
917
|
+
newAccount['free'] = this.safeString(response, 'availableBalance');
|
|
918
|
+
result[code] = newAccount;
|
|
919
|
+
return this.safeBalance(result);
|
|
920
|
+
}
|
|
921
|
+
handleSystemStatus(client, message) {
|
|
922
|
+
//
|
|
923
|
+
// {
|
|
924
|
+
// "id": "1578090234088", // connectId
|
|
925
|
+
// "type": "welcome",
|
|
926
|
+
// }
|
|
927
|
+
//
|
|
928
|
+
return message;
|
|
929
|
+
}
|
|
930
|
+
handleSubject(client, message) {
|
|
931
|
+
const subject = this.safeString(message, 'subject');
|
|
932
|
+
const methods = {
|
|
933
|
+
'auth': this.handleAuthenticate,
|
|
934
|
+
'received': this.handleL3OrderBook,
|
|
935
|
+
'open': this.handleL3OrderBook,
|
|
936
|
+
'update': this.handleL3OrderBook,
|
|
937
|
+
'done': this.handleL3OrderBook,
|
|
938
|
+
'level2': this.handleLevel2,
|
|
939
|
+
'ticker': this.handleTicker,
|
|
940
|
+
'snapshot.24h': this.handleTicker,
|
|
941
|
+
'match': this.handleTrade,
|
|
942
|
+
'orderChange': this.handleOrder,
|
|
943
|
+
'stopOrder': this.handleOrder,
|
|
944
|
+
'availableBalance.change': this.handleBalance,
|
|
945
|
+
'orderMargin.change': this.handleBalance,
|
|
946
|
+
};
|
|
947
|
+
const method = this.safeValue(methods, subject);
|
|
948
|
+
if (method !== undefined) {
|
|
949
|
+
return method.call(this, client, message);
|
|
950
|
+
}
|
|
951
|
+
}
|
|
952
|
+
ping(client) {
|
|
953
|
+
const id = this.requestId().toString();
|
|
954
|
+
return {
|
|
955
|
+
'id': id,
|
|
956
|
+
'type': 'ping',
|
|
957
|
+
};
|
|
958
|
+
}
|
|
959
|
+
handlePong(client, message) {
|
|
960
|
+
client.lastPong = this.milliseconds();
|
|
961
|
+
return message;
|
|
962
|
+
}
|
|
963
|
+
handleErrorMessage(client, message) {
|
|
964
|
+
//
|
|
965
|
+
// {
|
|
966
|
+
// "code": 404,
|
|
967
|
+
// "data": "tunnel stream-0 is not exist",
|
|
968
|
+
// "id": "3",
|
|
969
|
+
// "type": "error"
|
|
970
|
+
// }
|
|
971
|
+
//
|
|
972
|
+
client.reject(message);
|
|
973
|
+
}
|
|
974
|
+
handleMessage(client, message) {
|
|
975
|
+
const type = this.safeString(message, 'type');
|
|
976
|
+
const methods = {
|
|
977
|
+
'welcome': this.handleSystemStatus,
|
|
978
|
+
'ack': this.handleSubscriptionStatus,
|
|
979
|
+
'message': this.handleSubject,
|
|
980
|
+
'pong': this.handlePong,
|
|
981
|
+
'error': this.handleErrorMessage,
|
|
982
|
+
};
|
|
983
|
+
const method = this.safeValue(methods, type);
|
|
984
|
+
if (method !== undefined) {
|
|
985
|
+
return method.call(this, client, message);
|
|
986
|
+
}
|
|
987
|
+
}
|
|
988
|
+
handleAuthenticate(client, message) {
|
|
989
|
+
//
|
|
990
|
+
// {
|
|
991
|
+
// "success": true,
|
|
992
|
+
// "ret_msg": '',
|
|
993
|
+
// "op": "auth",
|
|
994
|
+
// "conn_id": "ce3dpomvha7dha97tvp0-2xh"
|
|
995
|
+
// }
|
|
996
|
+
//
|
|
997
|
+
const data = this.safeValue(message, 'data');
|
|
998
|
+
const success = this.safeValue(data, 'success');
|
|
999
|
+
const messageHash = 'authenticated';
|
|
1000
|
+
if (success) {
|
|
1001
|
+
client.resolve(message, messageHash);
|
|
1002
|
+
}
|
|
1003
|
+
else {
|
|
1004
|
+
const error = new errors.AuthenticationError(this.id + ' ' + this.json(message));
|
|
1005
|
+
client.reject(error, messageHash);
|
|
1006
|
+
if (messageHash in client.subscriptions) {
|
|
1007
|
+
delete client.subscriptions[messageHash];
|
|
1008
|
+
}
|
|
1009
|
+
}
|
|
1010
|
+
return message;
|
|
1011
|
+
}
|
|
1012
|
+
}
|
|
1013
|
+
|
|
1014
|
+
module.exports = poloniexfutures;
|