ccxt-ir 4.10.0 → 4.11.0
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 +4 -4
- package/dist/ccxt.browser.min.js +2 -2
- package/dist/cjs/ccxt.js +4 -1
- package/dist/cjs/src/abstract/bidarz.js +11 -0
- package/dist/cjs/src/bidarz.js +337 -0
- package/dist/cjs/src/bit24.js +4 -3
- package/js/ccxt.d.ts +5 -2
- package/js/ccxt.js +4 -2
- package/js/src/abstract/bidarz.d.ts +9 -0
- package/js/src/abstract/bidarz.js +11 -0
- package/js/src/bidarz.d.ts +22 -0
- package/js/src/bidarz.js +336 -0
- package/js/src/bit24.js +4 -3
- package/js/src/src/abantether.d.ts +21 -0
- package/js/src/src/abantether.js +353 -0
- package/js/src/src/abstract/abantether.d.ts +8 -0
- package/js/src/src/abstract/abantether.js +11 -0
- package/js/src/src/abstract/afratether.d.ts +9 -0
- package/js/src/src/abstract/afratether.js +11 -0
- package/js/src/src/abstract/alpaca.d.ts +77 -0
- package/js/src/src/abstract/alpaca.js +11 -0
- package/js/src/src/abstract/apex.d.ts +34 -0
- package/js/src/src/abstract/apex.js +11 -0
- package/js/src/src/abstract/arzinja.d.ts +8 -0
- package/js/src/src/abstract/arzinja.js +11 -0
- package/js/src/src/abstract/arzplus.d.ts +11 -0
- package/js/src/src/abstract/arzplus.js +11 -0
- package/js/src/src/abstract/ascendex.d.ts +80 -0
- package/js/src/src/abstract/ascendex.js +11 -0
- package/js/src/src/abstract/asretether.d.ts +8 -0
- package/js/src/src/abstract/asretether.js +11 -0
- package/js/src/src/abstract/bidarz.d.ts +9 -0
- package/js/src/src/abstract/bidarz.js +11 -0
- package/js/src/src/abstract/bigone.d.ts +48 -0
- package/js/src/src/abstract/bigone.js +11 -0
- package/js/src/src/abstract/binance.d.ts +773 -0
- package/js/src/src/abstract/binance.js +11 -0
- package/js/src/src/abstract/bingx.d.ts +165 -0
- package/js/src/src/abstract/bingx.js +11 -0
- package/js/src/src/abstract/bit24.d.ts +9 -0
- package/js/src/src/abstract/bit24.js +11 -0
- package/js/src/src/abstract/bit2c.d.ts +30 -0
- package/js/src/src/abstract/bit2c.js +11 -0
- package/js/src/src/abstract/bitbank.d.ts +35 -0
- package/js/src/src/abstract/bitbank.js +11 -0
- package/js/src/src/abstract/bitbarg.d.ts +8 -0
- package/js/src/src/abstract/bitbarg.js +11 -0
- package/js/src/src/abstract/bitbns.d.ts +43 -0
- package/js/src/src/abstract/bitbns.js +11 -0
- package/js/src/src/abstract/bitfinex.d.ts +143 -0
- package/js/src/src/abstract/bitfinex.js +11 -0
- package/js/src/src/abstract/bitflyer.d.ts +42 -0
- package/js/src/src/abstract/bitflyer.js +11 -0
- package/js/src/src/abstract/bitget.d.ts +578 -0
- package/js/src/src/abstract/bitget.js +11 -0
- package/js/src/src/abstract/bithumb.d.ts +35 -0
- package/js/src/src/abstract/bithumb.js +11 -0
- package/js/src/src/abstract/bitimen.d.ts +10 -0
- package/js/src/src/abstract/bitimen.js +11 -0
- package/js/src/src/abstract/bitir.d.ts +10 -0
- package/js/src/src/abstract/bitir.js +11 -0
- package/js/src/src/abstract/bitmart.d.ts +120 -0
- package/js/src/src/abstract/bitmart.js +11 -0
- package/js/src/src/abstract/bitmex.d.ts +100 -0
- package/js/src/src/abstract/bitmex.js +11 -0
- package/js/src/src/abstract/bitopro.d.ts +33 -0
- package/js/src/src/abstract/bitopro.js +11 -0
- package/js/src/src/abstract/bitpin.d.ts +11 -0
- package/js/src/src/abstract/bitpin.js +11 -0
- package/js/src/src/abstract/bitrue.d.ts +75 -0
- package/js/src/src/abstract/bitrue.js +11 -0
- package/js/src/src/abstract/bitso.d.ts +46 -0
- package/js/src/src/abstract/bitso.js +11 -0
- package/js/src/src/abstract/bitstamp.d.ts +262 -0
- package/js/src/src/abstract/bitstamp.js +11 -0
- package/js/src/src/abstract/bitteam.d.ts +32 -0
- package/js/src/src/abstract/bitteam.js +11 -0
- package/js/src/src/abstract/bittrade.d.ts +117 -0
- package/js/src/src/abstract/bittrade.js +11 -0
- package/js/src/src/abstract/bitunix.d.ts +9 -0
- package/js/src/src/abstract/bitunix.js +11 -0
- package/js/src/src/abstract/bitvavo.d.ts +30 -0
- package/js/src/src/abstract/bitvavo.js +11 -0
- package/js/src/src/abstract/blockchaincom.d.ts +31 -0
- package/js/src/src/abstract/blockchaincom.js +11 -0
- package/js/src/src/abstract/blofin.d.ts +70 -0
- package/js/src/src/abstract/blofin.js +11 -0
- package/js/src/src/abstract/btcalpha.d.ts +21 -0
- package/js/src/src/abstract/btcalpha.js +11 -0
- package/js/src/src/abstract/btcbox.d.ts +18 -0
- package/js/src/src/abstract/btcbox.js +11 -0
- package/js/src/src/abstract/btcmarkets.d.ts +42 -0
- package/js/src/src/abstract/btcmarkets.js +11 -0
- package/js/src/src/abstract/btcturk.d.ts +23 -0
- package/js/src/src/abstract/btcturk.js +11 -0
- package/js/src/src/abstract/bybit.d.ts +316 -0
- package/js/src/src/abstract/bybit.js +11 -0
- package/js/src/src/abstract/bydfi.d.ts +11 -0
- package/js/src/src/abstract/bydfi.js +11 -0
- package/js/src/src/abstract/cafearz.d.ts +8 -0
- package/js/src/src/abstract/cafearz.js +11 -0
- package/js/src/src/abstract/cex.d.ts +35 -0
- package/js/src/src/abstract/cex.js +11 -0
- package/js/src/src/abstract/coinbase.d.ts +97 -0
- package/js/src/src/abstract/coinbase.js +11 -0
- package/js/src/src/abstract/coinbaseexchange.d.ts +71 -0
- package/js/src/src/abstract/coinbaseexchange.js +11 -0
- package/js/src/src/abstract/coinbaseinternational.d.ts +42 -0
- package/js/src/src/abstract/coinbaseinternational.js +11 -0
- package/js/src/src/abstract/coincatch.d.ts +97 -0
- package/js/src/src/abstract/coincatch.js +11 -0
- package/js/src/src/abstract/coincheck.d.ts +36 -0
- package/js/src/src/abstract/coincheck.js +11 -0
- package/js/src/src/abstract/coinex.d.ts +240 -0
- package/js/src/src/abstract/coinex.js +11 -0
- package/js/src/src/abstract/coinmate.d.ts +65 -0
- package/js/src/src/abstract/coinmate.js +11 -0
- package/js/src/src/abstract/coinmetro.d.ts +37 -0
- package/js/src/src/abstract/coinmetro.js +11 -0
- package/js/src/src/abstract/coinone.d.ts +70 -0
- package/js/src/src/abstract/coinone.js +11 -0
- package/js/src/src/abstract/coinsph.d.ts +57 -0
- package/js/src/src/abstract/coinsph.js +11 -0
- package/js/src/src/abstract/coinspot.d.ts +31 -0
- package/js/src/src/abstract/coinspot.js +11 -0
- package/js/src/src/abstract/cryptocom.d.ts +126 -0
- package/js/src/src/abstract/cryptocom.js +11 -0
- package/js/src/src/abstract/cryptomus.d.ts +23 -0
- package/js/src/src/abstract/cryptomus.js +11 -0
- package/js/src/src/abstract/defx.d.ts +72 -0
- package/js/src/src/abstract/defx.js +11 -0
- package/js/src/src/abstract/delta.d.ts +53 -0
- package/js/src/src/abstract/delta.js +11 -0
- package/js/src/src/abstract/deribit.d.ts +129 -0
- package/js/src/src/abstract/deribit.js +11 -0
- package/js/src/src/abstract/derive.d.ts +120 -0
- package/js/src/src/abstract/derive.js +11 -0
- package/js/src/src/abstract/digifinex.d.ts +95 -0
- package/js/src/src/abstract/digifinex.js +11 -0
- package/js/src/src/abstract/ellipx.d.ts +28 -0
- package/js/src/src/abstract/ellipx.js +11 -0
- package/js/src/src/abstract/eterex.d.ts +8 -0
- package/js/src/src/abstract/eterex.js +11 -0
- package/js/src/src/abstract/excoino.d.ts +10 -0
- package/js/src/src/abstract/excoino.js +11 -0
- package/js/src/src/abstract/exir.d.ts +11 -0
- package/js/src/src/abstract/exir.js +11 -0
- package/js/src/src/abstract/exmo.d.ts +58 -0
- package/js/src/src/abstract/exmo.js +11 -0
- package/js/src/src/abstract/exnovin.d.ts +9 -0
- package/js/src/src/abstract/exnovin.js +11 -0
- package/js/src/src/abstract/farhadexchange.d.ts +8 -0
- package/js/src/src/abstract/farhadexchange.js +11 -0
- package/js/src/src/abstract/foxbit.d.ts +29 -0
- package/js/src/src/abstract/foxbit.js +11 -0
- package/js/src/src/abstract/gate.d.ts +287 -0
- package/js/src/src/abstract/gate.js +11 -0
- package/js/src/src/abstract/gemini.d.ts +62 -0
- package/js/src/src/abstract/gemini.js +11 -0
- package/js/src/src/abstract/hamtapay.d.ts +9 -0
- package/js/src/src/abstract/hamtapay.js +11 -0
- package/js/src/src/abstract/hashkey.d.ts +70 -0
- package/js/src/src/abstract/hashkey.js +11 -0
- package/js/src/src/abstract/hibachi.d.ts +29 -0
- package/js/src/src/abstract/hibachi.js +11 -0
- package/js/src/src/abstract/hitbtc.d.ts +118 -0
- package/js/src/src/abstract/hitbtc.js +11 -0
- package/js/src/src/abstract/hitobit.d.ts +11 -0
- package/js/src/src/abstract/hitobit.js +11 -0
- package/js/src/src/abstract/hollaex.d.ts +36 -0
- package/js/src/src/abstract/hollaex.js +11 -0
- package/js/src/src/abstract/htx.d.ts +551 -0
- package/js/src/src/abstract/htx.js +11 -0
- package/js/src/src/abstract/hyperliquid.d.ts +9 -0
- package/js/src/src/abstract/hyperliquid.js +11 -0
- package/js/src/src/abstract/independentreserve.d.ts +46 -0
- package/js/src/src/abstract/independentreserve.js +11 -0
- package/js/src/src/abstract/indodax.d.ts +29 -0
- package/js/src/src/abstract/indodax.js +11 -0
- package/js/src/src/abstract/iranexchange.d.ts +9 -0
- package/js/src/src/abstract/iranexchange.js +11 -0
- package/js/src/src/abstract/jibitex.d.ts +10 -0
- package/js/src/src/abstract/jibitex.js +11 -0
- package/js/src/src/abstract/kcex.d.ts +10 -0
- package/js/src/src/abstract/kcex.js +11 -0
- package/js/src/src/abstract/kifpoolme.d.ts +9 -0
- package/js/src/src/abstract/kifpoolme.js +11 -0
- package/js/src/src/abstract/kraken.d.ts +61 -0
- package/js/src/src/abstract/kraken.js +11 -0
- package/js/src/src/abstract/krakenfutures.d.ts +45 -0
- package/js/src/src/abstract/krakenfutures.js +11 -0
- package/js/src/src/abstract/kucoin.d.ts +227 -0
- package/js/src/src/abstract/kucoin.js +11 -0
- package/js/src/src/abstract/kucoinfutures.d.ts +254 -0
- package/js/src/src/abstract/kucoinfutures.js +11 -0
- package/js/src/src/abstract/latoken.d.ts +59 -0
- package/js/src/src/abstract/latoken.js +11 -0
- package/js/src/src/abstract/lbank.d.ts +65 -0
- package/js/src/src/abstract/lbank.js +11 -0
- package/js/src/src/abstract/luno.d.ts +41 -0
- package/js/src/src/abstract/luno.js +11 -0
- package/js/src/src/abstract/mazdax.d.ts +11 -0
- package/js/src/src/abstract/mazdax.js +11 -0
- package/js/src/src/abstract/mercado.d.ts +28 -0
- package/js/src/src/abstract/mercado.js +11 -0
- package/js/src/src/abstract/mexc.d.ts +183 -0
- package/js/src/src/abstract/mexc.js +11 -0
- package/js/src/src/abstract/modetrade.d.ts +122 -0
- package/js/src/src/abstract/modetrade.js +11 -0
- package/js/src/src/abstract/ndax.d.ts +100 -0
- package/js/src/src/abstract/ndax.js +11 -0
- package/js/src/src/abstract/nobitex.d.ts +10 -0
- package/js/src/src/abstract/nobitex.js +11 -0
- package/js/src/src/abstract/novadax.d.ts +32 -0
- package/js/src/src/abstract/novadax.js +11 -0
- package/js/src/src/abstract/oceanex.d.ts +30 -0
- package/js/src/src/abstract/oceanex.js +11 -0
- package/js/src/src/abstract/okcoin.d.ts +77 -0
- package/js/src/src/abstract/okcoin.js +11 -0
- package/js/src/src/abstract/okexchange.d.ts +11 -0
- package/js/src/src/abstract/okexchange.js +11 -0
- package/js/src/src/abstract/okx.d.ts +352 -0
- package/js/src/src/abstract/okx.js +11 -0
- package/js/src/src/abstract/ompfinex.d.ts +10 -0
- package/js/src/src/abstract/ompfinex.js +11 -0
- package/js/src/src/abstract/onetrading.d.ts +26 -0
- package/js/src/src/abstract/onetrading.js +11 -0
- package/js/src/src/abstract/oxfun.d.ts +37 -0
- package/js/src/src/abstract/oxfun.js +11 -0
- package/js/src/src/abstract/p2b.d.ts +25 -0
- package/js/src/src/abstract/p2b.js +11 -0
- package/js/src/src/abstract/paradex.d.ts +66 -0
- package/js/src/src/abstract/paradex.js +11 -0
- package/js/src/src/abstract/paymium.d.ts +31 -0
- package/js/src/src/abstract/paymium.js +11 -0
- package/js/src/src/abstract/phemex.d.ts +120 -0
- package/js/src/src/abstract/phemex.js +11 -0
- package/js/src/src/abstract/pingi.d.ts +9 -0
- package/js/src/src/abstract/pingi.js +11 -0
- package/js/src/src/abstract/poloniex.d.ts +108 -0
- package/js/src/src/abstract/poloniex.js +11 -0
- package/js/src/src/abstract/pooleno.d.ts +8 -0
- package/js/src/src/abstract/pooleno.js +11 -0
- package/js/src/src/abstract/probit.d.ts +26 -0
- package/js/src/src/abstract/probit.js +11 -0
- package/js/src/src/abstract/raastin.d.ts +11 -0
- package/js/src/src/abstract/raastin.js +11 -0
- package/js/src/src/abstract/ramzinex.d.ts +10 -0
- package/js/src/src/abstract/ramzinex.js +11 -0
- package/js/src/src/abstract/sarmayex.d.ts +8 -0
- package/js/src/src/abstract/sarmayex.js +11 -0
- package/js/src/src/abstract/sarrafex.d.ts +10 -0
- package/js/src/src/abstract/sarrafex.js +11 -0
- package/js/src/src/abstract/tabdeal.d.ts +10 -0
- package/js/src/src/abstract/tabdeal.js +11 -0
- package/js/src/src/abstract/tehran_exchange.d.ts +9 -0
- package/js/src/src/abstract/tehran_exchange.js +11 -0
- package/js/src/src/abstract/tetherland.d.ts +8 -0
- package/js/src/src/abstract/tetherland.js +11 -0
- package/js/src/src/abstract/timex.d.ts +65 -0
- package/js/src/src/abstract/timex.js +11 -0
- package/js/src/src/abstract/tokocrypto.d.ts +40 -0
- package/js/src/src/abstract/tokocrypto.js +11 -0
- package/js/src/src/abstract/toobit.d.ts +10 -0
- package/js/src/src/abstract/toobit.js +11 -0
- package/js/src/src/abstract/tradeogre.d.ts +21 -0
- package/js/src/src/abstract/tradeogre.js +11 -0
- package/js/src/src/abstract/twox.d.ts +8 -0
- package/js/src/src/abstract/twox.js +11 -0
- package/js/src/src/abstract/ubitex.d.ts +10 -0
- package/js/src/src/abstract/ubitex.js +11 -0
- package/js/src/src/abstract/upbit.d.ts +58 -0
- package/js/src/src/abstract/upbit.js +11 -0
- package/js/src/src/abstract/vertex.d.ts +22 -0
- package/js/src/src/abstract/vertex.js +11 -0
- package/js/src/src/abstract/wallex.d.ts +11 -0
- package/js/src/src/abstract/wallex.js +11 -0
- package/js/src/src/abstract/wavesexchange.d.ts +157 -0
- package/js/src/src/abstract/wavesexchange.js +11 -0
- package/js/src/src/abstract/whitebit.d.ts +117 -0
- package/js/src/src/abstract/whitebit.js +11 -0
- package/js/src/src/abstract/woo.d.ts +144 -0
- package/js/src/src/abstract/woo.js +11 -0
- package/js/src/src/abstract/woofipro.d.ts +122 -0
- package/js/src/src/abstract/woofipro.js +11 -0
- package/js/src/src/abstract/xt.d.ts +160 -0
- package/js/src/src/abstract/xt.js +11 -0
- package/js/src/src/abstract/yobit.d.ts +19 -0
- package/js/src/src/abstract/yobit.js +11 -0
- package/js/src/src/abstract/zaif.d.ts +41 -0
- package/js/src/src/abstract/zaif.js +11 -0
- package/js/src/src/abstract/zonda.d.ts +56 -0
- package/js/src/src/abstract/zonda.js +11 -0
- package/js/src/src/afratether.d.ts +21 -0
- package/js/src/src/afratether.js +356 -0
- package/js/src/src/alpaca.d.ts +332 -0
- package/js/src/src/alpaca.js +1908 -0
- package/js/src/src/apex.d.ts +333 -0
- package/js/src/src/apex.js +1942 -0
- package/js/src/src/arzinja.d.ts +21 -0
- package/js/src/src/arzinja.js +298 -0
- package/js/src/src/arzplus.d.ts +26 -0
- package/js/src/src/arzplus.js +581 -0
- package/js/src/src/ascendex.d.ts +424 -0
- package/js/src/src/ascendex.js +3699 -0
- package/js/src/src/asretether.d.ts +21 -0
- package/js/src/src/asretether.js +324 -0
- package/js/src/src/base/Exchange.d.ts +926 -0
- package/js/src/src/base/Exchange.js +7399 -0
- package/js/src/src/base/Precise.d.ts +42 -0
- package/js/src/src/base/Precise.js +275 -0
- package/js/src/src/base/errors.d.ts +168 -0
- package/js/src/src/base/errors.js +255 -0
- package/js/src/src/base/functions/crypto.d.ts +16 -0
- package/js/src/src/base/functions/crypto.js +131 -0
- package/js/src/src/base/functions/encode.d.ts +4 -0
- package/js/src/src/base/functions/encode.js +32 -0
- package/js/src/src/base/functions/generic.d.ts +29 -0
- package/js/src/src/base/functions/generic.js +203 -0
- package/js/src/src/base/functions/misc.d.ts +9 -0
- package/js/src/src/base/functions/misc.js +101 -0
- package/js/src/src/base/functions/number.d.ts +27 -0
- package/js/src/src/base/functions/number.js +313 -0
- package/js/src/src/base/functions/platform.d.ts +7 -0
- package/js/src/src/base/functions/platform.js +27 -0
- package/js/src/src/base/functions/rsa.d.ts +5 -0
- package/js/src/src/base/functions/rsa.js +49 -0
- package/js/src/src/base/functions/string.d.ts +7 -0
- package/js/src/src/base/functions/string.js +44 -0
- package/js/src/src/base/functions/throttle.d.ts +6 -0
- package/js/src/src/base/functions/throttle.js +67 -0
- package/js/src/src/base/functions/time.d.ts +21 -0
- package/js/src/src/base/functions/time.js +171 -0
- package/js/src/src/base/functions/totp.d.ts +3 -0
- package/js/src/src/base/functions/totp.js +25 -0
- package/js/src/src/base/functions/type.d.ts +37 -0
- package/js/src/src/base/functions/type.js +179 -0
- package/js/src/src/base/functions.d.ts +10 -0
- package/js/src/src/base/functions.js +18 -0
- package/js/src/src/base/types.d.ts +586 -0
- package/js/src/src/base/types.js +7 -0
- package/js/src/src/base/ws/Cache.d.ts +27 -0
- package/js/src/src/base/ws/Cache.js +260 -0
- package/js/src/src/base/ws/Client.d.ts +53 -0
- package/js/src/src/base/ws/Client.js +307 -0
- package/js/src/src/base/ws/Future.d.ts +8 -0
- package/js/src/src/base/ws/Future.js +35 -0
- package/js/src/src/base/ws/OrderBook.d.ts +25 -0
- package/js/src/src/base/ws/OrderBook.js +130 -0
- package/js/src/src/base/ws/OrderBookSide.d.ts +40 -0
- package/js/src/src/base/ws/OrderBookSide.js +286 -0
- package/js/src/src/base/ws/WsClient.d.ts +11 -0
- package/js/src/src/base/ws/WsClient.js +69 -0
- package/js/src/src/bequant.d.ts +4 -0
- package/js/src/src/bequant.js +35 -0
- package/js/src/src/bidarz.d.ts +16 -0
- package/js/src/src/bidarz.js +327 -0
- package/js/src/src/bigone.d.ts +296 -0
- package/js/src/src/bigone.js +2340 -0
- package/js/src/src/binance.d.ts +1667 -0
- package/js/src/src/binance.js +14400 -0
- package/js/src/src/binancecoinm.d.ts +6 -0
- package/js/src/src/binancecoinm.js +51 -0
- package/js/src/src/binanceus.d.ts +4 -0
- package/js/src/src/binanceus.js +225 -0
- package/js/src/src/binanceusdm.d.ts +6 -0
- package/js/src/src/binanceusdm.js +63 -0
- package/js/src/src/bingx.d.ts +778 -0
- package/js/src/src/bingx.js +6705 -0
- package/js/src/src/bit24.d.ts +24 -0
- package/js/src/src/bit24.js +520 -0
- package/js/src/src/bit2c.d.ts +146 -0
- package/js/src/src/bit2c.js +1029 -0
- package/js/src/src/bitbank.d.ts +181 -0
- package/js/src/src/bitbank.js +1146 -0
- package/js/src/src/bitbarg.d.ts +21 -0
- package/js/src/src/bitbarg.js +312 -0
- package/js/src/src/bitbns.d.ts +184 -0
- package/js/src/src/bitbns.js +1288 -0
- package/js/src/src/bitfinex.d.ts +516 -0
- package/js/src/src/bitfinex.js +3951 -0
- package/js/src/src/bitflyer.d.ts +229 -0
- package/js/src/src/bitflyer.js +1209 -0
- package/js/src/src/bitget.d.ts +1109 -0
- package/js/src/src/bitget.js +11033 -0
- package/js/src/src/bithumb.d.ts +165 -0
- package/js/src/src/bithumb.js +1257 -0
- package/js/src/src/bitimen.d.ts +23 -0
- package/js/src/src/bitimen.js +424 -0
- package/js/src/src/bitir.d.ts +23 -0
- package/js/src/src/bitir.js +521 -0
- package/js/src/src/bitmart.d.ts +736 -0
- package/js/src/src/bitmart.js +5639 -0
- package/js/src/src/bitmex.d.ts +395 -0
- package/js/src/src/bitmex.js +3088 -0
- package/js/src/src/bitopro.d.ts +295 -0
- package/js/src/src/bitopro.js +1892 -0
- package/js/src/src/bitpin.d.ts +23 -0
- package/js/src/src/bitpin.js +487 -0
- package/js/src/src/bitrue.d.ts +384 -0
- package/js/src/src/bitrue.js +3382 -0
- package/js/src/src/bitso.d.ts +270 -0
- package/js/src/src/bitso.js +1881 -0
- package/js/src/src/bitstamp.d.ts +355 -0
- package/js/src/src/bitstamp.js +2445 -0
- package/js/src/src/bitteam.d.ts +229 -0
- package/js/src/src/bitteam.js +2420 -0
- package/js/src/src/bittrade.d.ts +298 -0
- package/js/src/src/bittrade.js +2050 -0
- package/js/src/src/bitunix.d.ts +21 -0
- package/js/src/src/bitunix.js +326 -0
- package/js/src/src/bitvavo.d.ts +311 -0
- package/js/src/src/bitvavo.js +2204 -0
- package/js/src/src/blockchaincom.d.ts +256 -0
- package/js/src/src/blockchaincom.js +1259 -0
- package/js/src/src/blofin.d.ts +439 -0
- package/js/src/src/blofin.js +2576 -0
- package/js/src/src/btcalpha.d.ts +209 -0
- package/js/src/src/btcalpha.js +1056 -0
- package/js/src/src/btcbox.d.ts +144 -0
- package/js/src/src/btcbox.js +834 -0
- package/js/src/src/btcmarkets.d.ts +253 -0
- package/js/src/src/btcmarkets.js +1418 -0
- package/js/src/src/btcturk.d.ts +161 -0
- package/js/src/src/btcturk.js +1058 -0
- package/js/src/src/bybit.d.ts +1097 -0
- package/js/src/src/bybit.js +9382 -0
- package/js/src/src/bydfi.d.ts +23 -0
- package/js/src/src/bydfi.js +434 -0
- package/js/src/src/cafearz.d.ts +21 -0
- package/js/src/src/cafearz.js +346 -0
- package/js/src/src/cex.d.ts +286 -0
- package/js/src/src/cex.js +1799 -0
- package/js/src/src/coinbase.d.ts +623 -0
- package/js/src/src/coinbase.js +5220 -0
- package/js/src/src/coinbaseadvanced.d.ts +4 -0
- package/js/src/src/coinbaseadvanced.js +18 -0
- package/js/src/src/coinbaseexchange.d.ts +334 -0
- package/js/src/src/coinbaseexchange.js +2127 -0
- package/js/src/src/coinbaseinternational.d.ts +443 -0
- package/js/src/src/coinbaseinternational.js +2336 -0
- package/js/src/src/coincatch.d.ts +786 -0
- package/js/src/src/coincatch.js +5492 -0
- package/js/src/src/coincheck.d.ts +147 -0
- package/js/src/src/coincheck.js +962 -0
- package/js/src/src/coinex.d.ts +719 -0
- package/js/src/src/coinex.js +6166 -0
- package/js/src/src/coinmate.d.ts +202 -0
- package/js/src/src/coinmate.js +1215 -0
- package/js/src/src/coinmetro.d.ts +244 -0
- package/js/src/src/coinmetro.js +2024 -0
- package/js/src/src/coinone.d.ts +158 -0
- package/js/src/src/coinone.js +1278 -0
- package/js/src/src/coinsph.d.ts +310 -0
- package/js/src/src/coinsph.js +2203 -0
- package/js/src/src/coinspot.d.ts +108 -0
- package/js/src/src/coinspot.js +653 -0
- package/js/src/src/cryptocom.d.ts +463 -0
- package/js/src/src/cryptocom.js +3549 -0
- package/js/src/src/cryptomus.d.ts +158 -0
- package/js/src/src/cryptomus.js +1169 -0
- package/js/src/src/defx.d.ts +348 -0
- package/js/src/src/defx.js +2139 -0
- package/js/src/src/delta.d.ts +407 -0
- package/js/src/src/delta.js +3654 -0
- package/js/src/src/deribit.d.ts +516 -0
- package/js/src/src/deribit.js +3790 -0
- package/js/src/src/derive.d.ts +324 -0
- package/js/src/src/derive.js +2655 -0
- package/js/src/src/digifinex.d.ts +544 -0
- package/js/src/src/digifinex.js +4453 -0
- package/js/src/src/ellipx.d.ts +237 -0
- package/js/src/src/ellipx.js +2071 -0
- package/js/src/src/eterex.d.ts +21 -0
- package/js/src/src/eterex.js +299 -0
- package/js/src/src/excoino.d.ts +23 -0
- package/js/src/src/excoino.js +426 -0
- package/js/src/src/exir.d.ts +23 -0
- package/js/src/src/exir.js +403 -0
- package/js/src/src/exmo.d.ts +426 -0
- package/js/src/src/exmo.js +2825 -0
- package/js/src/src/exnovin.d.ts +22 -0
- package/js/src/src/exnovin.js +378 -0
- package/js/src/src/farhadexchange.d.ts +21 -0
- package/js/src/src/farhadexchange.js +280 -0
- package/js/src/src/fmfwio.d.ts +4 -0
- package/js/src/src/fmfwio.js +35 -0
- package/js/src/src/foxbit.d.ts +352 -0
- package/js/src/src/foxbit.js +2016 -0
- package/js/src/src/gate.d.ts +1071 -0
- package/js/src/src/gate.js +8282 -0
- package/js/src/src/gateio.d.ts +4 -0
- package/js/src/src/gateio.js +17 -0
- package/js/src/src/gemini.d.ts +257 -0
- package/js/src/src/gemini.js +2006 -0
- package/js/src/src/hamtapay.d.ts +21 -0
- package/js/src/src/hamtapay.js +303 -0
- package/js/src/src/hashkey.d.ts +628 -0
- package/js/src/src/hashkey.js +4363 -0
- package/js/src/src/hibachi.d.ts +346 -0
- package/js/src/src/hibachi.js +2137 -0
- package/js/src/src/hitbtc.d.ts +558 -0
- package/js/src/src/hitbtc.js +3847 -0
- package/js/src/src/hitobit.d.ts +23 -0
- package/js/src/src/hitobit.js +412 -0
- package/js/src/src/hollaex.d.ts +305 -0
- package/js/src/src/hollaex.js +2046 -0
- package/js/src/src/htx.d.ts +961 -0
- package/js/src/src/htx.js +9668 -0
- package/js/src/src/huobi.d.ts +4 -0
- package/js/src/src/huobi.js +17 -0
- package/js/src/src/hyperliquid.d.ts +651 -0
- package/js/src/src/hyperliquid.js +3937 -0
- package/js/src/src/independentreserve.d.ts +169 -0
- package/js/src/src/independentreserve.js +1115 -0
- package/js/src/src/indodax.d.ts +217 -0
- package/js/src/src/indodax.js +1454 -0
- package/js/src/src/iranexchange.d.ts +21 -0
- package/js/src/src/iranexchange.js +399 -0
- package/js/src/src/jibitex.d.ts +23 -0
- package/js/src/src/jibitex.js +416 -0
- package/js/src/src/kcex.d.ts +21 -0
- package/js/src/src/kcex.js +335 -0
- package/js/src/src/kifpoolme.d.ts +23 -0
- package/js/src/src/kifpoolme.js +410 -0
- package/js/src/src/kraken.d.ts +484 -0
- package/js/src/src/kraken.js +3518 -0
- package/js/src/src/krakenfutures.d.ts +362 -0
- package/js/src/src/krakenfutures.js +2885 -0
- package/js/src/src/kucoin.d.ts +759 -0
- package/js/src/src/kucoin.js +5153 -0
- package/js/src/src/kucoinfutures.d.ts +521 -0
- package/js/src/src/kucoinfutures.js +3381 -0
- package/js/src/src/latoken.d.ts +274 -0
- package/js/src/src/latoken.js +1824 -0
- package/js/src/src/lbank.d.ts +350 -0
- package/js/src/src/lbank.js +3146 -0
- package/js/src/src/luno.d.ts +252 -0
- package/js/src/src/luno.js +1479 -0
- package/js/src/src/mazdax.d.ts +23 -0
- package/js/src/src/mazdax.js +534 -0
- package/js/src/src/mercado.d.ts +160 -0
- package/js/src/src/mercado.js +1011 -0
- package/js/src/src/mexc.d.ts +768 -0
- package/js/src/src/mexc.js +6102 -0
- package/js/src/src/modetrade.d.ts +496 -0
- package/js/src/src/modetrade.js +2936 -0
- package/js/src/src/myokx.d.ts +4 -0
- package/js/src/src/myokx.js +54 -0
- package/js/src/src/ndax.d.ts +285 -0
- package/js/src/src/ndax.js +2598 -0
- package/js/src/src/nobitex.d.ts +23 -0
- package/js/src/src/nobitex.js +454 -0
- package/js/src/src/novadax.d.ts +279 -0
- package/js/src/src/novadax.js +1676 -0
- package/js/src/src/oceanex.d.ts +231 -0
- package/js/src/src/oceanex.js +1123 -0
- package/js/src/src/okcoin.d.ts +346 -0
- package/js/src/src/okcoin.js +3211 -0
- package/js/src/src/okexchange.d.ts +23 -0
- package/js/src/src/okexchange.js +373 -0
- package/js/src/src/okx.d.ts +1125 -0
- package/js/src/src/okx.js +9009 -0
- package/js/src/src/okxus.d.ts +4 -0
- package/js/src/src/okxus.js +54 -0
- package/js/src/src/ompfinex.d.ts +23 -0
- package/js/src/src/ompfinex.js +510 -0
- package/js/src/src/onetrading.d.ts +228 -0
- package/js/src/src/onetrading.js +1769 -0
- package/js/src/src/oxfun.d.ts +442 -0
- package/js/src/src/oxfun.js +2920 -0
- package/js/src/src/p2b.d.ts +189 -0
- package/js/src/src/p2b.js +1344 -0
- package/js/src/src/paradex.d.ts +389 -0
- package/js/src/src/paradex.js +2607 -0
- package/js/src/src/paymium.d.ts +133 -0
- package/js/src/src/paymium.js +644 -0
- package/js/src/src/phemex.d.ts +497 -0
- package/js/src/src/phemex.js +5333 -0
- package/js/src/src/pingi.d.ts +22 -0
- package/js/src/src/pingi.js +446 -0
- package/js/src/src/poloniex.d.ts +441 -0
- package/js/src/src/poloniex.js +3681 -0
- package/js/src/src/pooleno.d.ts +21 -0
- package/js/src/src/pooleno.js +347 -0
- package/js/src/src/pro/alpaca.d.ts +95 -0
- package/js/src/src/pro/alpaca.js +724 -0
- package/js/src/src/pro/apex.d.ts +160 -0
- package/js/src/src/pro/apex.js +1044 -0
- package/js/src/src/pro/ascendex.d.ts +99 -0
- package/js/src/src/pro/ascendex.js +1012 -0
- package/js/src/src/pro/bequant.d.ts +4 -0
- package/js/src/src/pro/bequant.js +42 -0
- package/js/src/src/pro/binance.d.ts +796 -0
- package/js/src/src/pro/binance.js +4373 -0
- package/js/src/src/pro/binancecoinm.d.ts +4 -0
- package/js/src/src/pro/binancecoinm.js +32 -0
- package/js/src/src/pro/binanceus.d.ts +4 -0
- package/js/src/src/pro/binanceus.js +52 -0
- package/js/src/src/pro/binanceusdm.d.ts +4 -0
- package/js/src/src/pro/binanceusdm.js +37 -0
- package/js/src/src/pro/bingx.d.ts +151 -0
- package/js/src/src/pro/bingx.js +1568 -0
- package/js/src/src/pro/bitfinex.d.ts +99 -0
- package/js/src/src/pro/bitfinex.js +1165 -0
- package/js/src/src/pro/bitget.d.ts +257 -0
- package/js/src/src/pro/bitget.js +2327 -0
- package/js/src/src/pro/bithumb.d.ts +59 -0
- package/js/src/src/pro/bithumb.js +395 -0
- package/js/src/src/pro/bitmart.d.ts +168 -0
- package/js/src/src/pro/bitmart.js +1686 -0
- package/js/src/src/pro/bitmex.d.ts +170 -0
- package/js/src/src/pro/bitmex.js +1760 -0
- package/js/src/src/pro/bitopro.d.ts +69 -0
- package/js/src/src/pro/bitopro.js +477 -0
- package/js/src/src/pro/bitrue.d.ts +40 -0
- package/js/src/src/pro/bitrue.js +461 -0
- package/js/src/src/pro/bitstamp.d.ts +53 -0
- package/js/src/src/pro/bitstamp.js +587 -0
- package/js/src/src/pro/bittrade.d.ts +66 -0
- package/js/src/src/pro/bittrade.js +606 -0
- package/js/src/src/pro/bitvavo.d.ts +321 -0
- package/js/src/src/pro/bitvavo.js +1451 -0
- package/js/src/src/pro/blockchaincom.d.ts +89 -0
- package/js/src/src/pro/blockchaincom.js +777 -0
- package/js/src/src/pro/blofin.d.ts +174 -0
- package/js/src/src/pro/blofin.js +743 -0
- package/js/src/src/pro/bybit.d.ts +397 -0
- package/js/src/src/pro/bybit.js +2519 -0
- package/js/src/src/pro/cex.d.ts +220 -0
- package/js/src/src/pro/cex.js +1535 -0
- package/js/src/src/pro/coinbase.d.ts +119 -0
- package/js/src/src/pro/coinbase.js +736 -0
- package/js/src/src/pro/coinbaseadvanced.d.ts +4 -0
- package/js/src/src/pro/coinbaseadvanced.js +18 -0
- package/js/src/src/pro/coinbaseexchange.d.ts +133 -0
- package/js/src/src/pro/coinbaseexchange.js +969 -0
- package/js/src/src/pro/coinbaseinternational.d.ts +143 -0
- package/js/src/src/pro/coinbaseinternational.js +804 -0
- package/js/src/src/pro/coincatch.d.ts +207 -0
- package/js/src/src/pro/coincatch.js +1562 -0
- package/js/src/src/pro/coincheck.d.ts +33 -0
- package/js/src/src/pro/coincheck.js +210 -0
- package/js/src/src/pro/coinex.d.ts +147 -0
- package/js/src/src/pro/coinex.js +1426 -0
- package/js/src/src/pro/coinone.d.ts +51 -0
- package/js/src/src/pro/coinone.js +413 -0
- package/js/src/src/pro/cryptocom.d.ts +300 -0
- package/js/src/src/pro/cryptocom.js +1414 -0
- package/js/src/src/pro/defx.d.ts +236 -0
- package/js/src/src/pro/defx.js +865 -0
- package/js/src/src/pro/deribit.d.ts +163 -0
- package/js/src/src/pro/deribit.js +1066 -0
- package/js/src/src/pro/derive.d.ts +100 -0
- package/js/src/src/pro/derive.js +753 -0
- package/js/src/src/pro/exmo.d.ts +97 -0
- package/js/src/src/pro/exmo.js +903 -0
- package/js/src/src/pro/gate.d.ts +360 -0
- package/js/src/src/pro/gate.js +2119 -0
- package/js/src/src/pro/gateio.d.ts +4 -0
- package/js/src/src/pro/gateio.js +17 -0
- package/js/src/src/pro/gemini.d.ts +106 -0
- package/js/src/src/pro/gemini.js +932 -0
- package/js/src/src/pro/hashkey.d.ts +121 -0
- package/js/src/src/pro/hashkey.js +843 -0
- package/js/src/src/pro/hitbtc.d.ts +235 -0
- package/js/src/src/pro/hitbtc.js +1400 -0
- package/js/src/src/pro/hollaex.d.ts +77 -0
- package/js/src/src/pro/hollaex.js +604 -0
- package/js/src/src/pro/htx.d.ts +141 -0
- package/js/src/src/pro/htx.js +2415 -0
- package/js/src/src/pro/huobi.d.ts +4 -0
- package/js/src/src/pro/huobi.js +17 -0
- package/js/src/src/pro/hyperliquid.d.ts +218 -0
- package/js/src/src/pro/hyperliquid.js +1126 -0
- package/js/src/src/pro/independentreserve.d.ts +36 -0
- package/js/src/src/pro/independentreserve.js +287 -0
- package/js/src/src/pro/kraken.d.ts +233 -0
- package/js/src/src/pro/kraken.js +1785 -0
- package/js/src/src/pro/krakenfutures.d.ts +178 -0
- package/js/src/src/pro/krakenfutures.js +1592 -0
- package/js/src/src/pro/kucoin.d.ts +221 -0
- package/js/src/src/pro/kucoin.js +1430 -0
- package/js/src/src/pro/kucoinfutures.d.ts +205 -0
- package/js/src/src/pro/kucoinfutures.js +1295 -0
- package/js/src/src/pro/lbank.d.ts +134 -0
- package/js/src/src/pro/lbank.js +950 -0
- package/js/src/src/pro/luno.d.ts +44 -0
- package/js/src/src/pro/luno.js +322 -0
- package/js/src/src/pro/mexc.d.ts +210 -0
- package/js/src/src/pro/mexc.js +2009 -0
- package/js/src/src/pro/modetrade.d.ts +155 -0
- package/js/src/src/pro/modetrade.js +1335 -0
- package/js/src/src/pro/myokx.d.ts +4 -0
- package/js/src/src/pro/myokx.js +39 -0
- package/js/src/src/pro/ndax.d.ts +60 -0
- package/js/src/src/pro/ndax.js +545 -0
- package/js/src/src/pro/okcoin.d.ts +91 -0
- package/js/src/src/pro/okcoin.js +763 -0
- package/js/src/src/pro/okx.d.ts +408 -0
- package/js/src/src/pro/okx.js +2479 -0
- package/js/src/src/pro/okxus.d.ts +4 -0
- package/js/src/src/pro/okxus.js +39 -0
- package/js/src/src/pro/onetrading.d.ts +107 -0
- package/js/src/src/pro/onetrading.js +1343 -0
- package/js/src/src/pro/oxfun.d.ts +234 -0
- package/js/src/src/pro/oxfun.js +1112 -0
- package/js/src/src/pro/p2b.d.ts +104 -0
- package/js/src/src/pro/p2b.js +506 -0
- package/js/src/src/pro/paradex.d.ts +54 -0
- package/js/src/src/pro/paradex.js +370 -0
- package/js/src/src/pro/phemex.d.ts +129 -0
- package/js/src/src/pro/phemex.js +1569 -0
- package/js/src/src/pro/poloniex.d.ts +214 -0
- package/js/src/src/pro/poloniex.js +1318 -0
- package/js/src/src/pro/probit.d.ts +91 -0
- package/js/src/src/pro/probit.js +593 -0
- package/js/src/src/pro/tradeogre.d.ts +49 -0
- package/js/src/src/pro/tradeogre.js +284 -0
- package/js/src/src/pro/upbit.d.ts +124 -0
- package/js/src/src/pro/upbit.js +689 -0
- package/js/src/src/pro/vertex.d.ts +104 -0
- package/js/src/src/pro/vertex.js +999 -0
- package/js/src/src/pro/whitebit.d.ts +123 -0
- package/js/src/src/pro/whitebit.js +971 -0
- package/js/src/src/pro/woo.d.ts +161 -0
- package/js/src/src/pro/woo.js +1351 -0
- package/js/src/src/pro/woofipro.d.ts +155 -0
- package/js/src/src/pro/woofipro.js +1335 -0
- package/js/src/src/pro/xt.d.ts +165 -0
- package/js/src/src/pro/xt.js +1230 -0
- package/js/src/src/probit.d.ts +283 -0
- package/js/src/src/probit.js +1935 -0
- package/js/src/src/protobuf/mexc/compiled.cjs +7186 -0
- package/js/src/src/protobuf/mexc/compiled.d.cts +8 -0
- package/js/src/src/raastin.d.ts +24 -0
- package/js/src/src/raastin.js +494 -0
- package/js/src/src/ramzinex.d.ts +23 -0
- package/js/src/src/ramzinex.js +510 -0
- package/js/src/src/sarmayex.d.ts +21 -0
- package/js/src/src/sarmayex.js +376 -0
- package/js/src/src/sarrafex.d.ts +23 -0
- package/js/src/src/sarrafex.js +501 -0
- package/js/src/src/static_dependencies/ethers/abi-coder.d.ts +50 -0
- package/js/src/src/static_dependencies/ethers/abi-coder.js +148 -0
- package/js/src/src/static_dependencies/ethers/address/address.d.ts +55 -0
- package/js/src/src/static_dependencies/ethers/address/address.js +162 -0
- package/js/src/src/static_dependencies/ethers/address/checks.d.ts +80 -0
- package/js/src/src/static_dependencies/ethers/address/checks.js +119 -0
- package/js/src/src/static_dependencies/ethers/address/contract-address.d.ts +47 -0
- package/js/src/src/static_dependencies/ethers/address/contract-address.js +73 -0
- package/js/src/src/static_dependencies/ethers/address/index.d.ts +48 -0
- package/js/src/src/static_dependencies/ethers/address/index.js +24 -0
- package/js/src/src/static_dependencies/ethers/bytes32.d.ts +14 -0
- package/js/src/src/static_dependencies/ethers/bytes32.js +45 -0
- package/js/src/src/static_dependencies/ethers/coders/abstract-coder.d.ts +120 -0
- package/js/src/src/static_dependencies/ethers/coders/abstract-coder.js +424 -0
- package/js/src/src/static_dependencies/ethers/coders/address.d.ts +12 -0
- package/js/src/src/static_dependencies/ethers/coders/address.js +34 -0
- package/js/src/src/static_dependencies/ethers/coders/anonymous.d.ts +14 -0
- package/js/src/src/static_dependencies/ethers/coders/anonymous.js +27 -0
- package/js/src/src/static_dependencies/ethers/coders/array.d.ts +24 -0
- package/js/src/src/static_dependencies/ethers/coders/array.js +162 -0
- package/js/src/src/static_dependencies/ethers/coders/boolean.d.ts +12 -0
- package/js/src/src/static_dependencies/ethers/coders/boolean.js +26 -0
- package/js/src/src/static_dependencies/ethers/coders/bytes.d.ts +18 -0
- package/js/src/src/static_dependencies/ethers/coders/bytes.js +39 -0
- package/js/src/src/static_dependencies/ethers/coders/fixed-bytes.d.ts +14 -0
- package/js/src/src/static_dependencies/ethers/coders/fixed-bytes.js +32 -0
- package/js/src/src/static_dependencies/ethers/coders/null.d.ts +11 -0
- package/js/src/src/static_dependencies/ethers/coders/null.js +29 -0
- package/js/src/src/static_dependencies/ethers/coders/number.d.ts +15 -0
- package/js/src/src/static_dependencies/ethers/coders/number.js +48 -0
- package/js/src/src/static_dependencies/ethers/coders/string.d.ts +12 -0
- package/js/src/src/static_dependencies/ethers/coders/string.js +26 -0
- package/js/src/src/static_dependencies/ethers/coders/tuple.d.ts +15 -0
- package/js/src/src/static_dependencies/ethers/coders/tuple.js +67 -0
- package/js/src/src/static_dependencies/ethers/fragments.d.ts +458 -0
- package/js/src/src/static_dependencies/ethers/fragments.js +1252 -0
- package/js/src/src/static_dependencies/ethers/hash/index.d.ts +10 -0
- package/js/src/src/static_dependencies/ethers/hash/index.js +15 -0
- package/js/src/src/static_dependencies/ethers/hash/solidity.d.ts +30 -0
- package/js/src/src/static_dependencies/ethers/hash/solidity.js +107 -0
- package/js/src/src/static_dependencies/ethers/hash/typed-data.d.ts +144 -0
- package/js/src/src/static_dependencies/ethers/hash/typed-data.js +490 -0
- package/js/src/src/static_dependencies/ethers/index.d.ts +19 -0
- package/js/src/src/static_dependencies/ethers/index.js +22 -0
- package/js/src/src/static_dependencies/ethers/interface.d.ts +380 -0
- package/js/src/src/static_dependencies/ethers/interface.js +990 -0
- package/js/src/src/static_dependencies/ethers/typed.d.ts +569 -0
- package/js/src/src/static_dependencies/ethers/typed.js +608 -0
- package/js/src/src/static_dependencies/ethers/utils/base58.d.ts +22 -0
- package/js/src/src/static_dependencies/ethers/utils/base58.js +68 -0
- package/js/src/src/static_dependencies/ethers/utils/base64.d.ts +39 -0
- package/js/src/src/static_dependencies/ethers/utils/base64.js +58 -0
- package/js/src/src/static_dependencies/ethers/utils/data.d.ts +92 -0
- package/js/src/src/static_dependencies/ethers/utils/data.js +175 -0
- package/js/src/src/static_dependencies/ethers/utils/errors.d.ts +509 -0
- package/js/src/src/static_dependencies/ethers/utils/errors.js +227 -0
- package/js/src/src/static_dependencies/ethers/utils/events.d.ts +76 -0
- package/js/src/src/static_dependencies/ethers/utils/events.js +52 -0
- package/js/src/src/static_dependencies/ethers/utils/fixednumber.d.ts +251 -0
- package/js/src/src/static_dependencies/ethers/utils/fixednumber.js +529 -0
- package/js/src/src/static_dependencies/ethers/utils/index.d.ts +30 -0
- package/js/src/src/static_dependencies/ethers/utils/index.js +38 -0
- package/js/src/src/static_dependencies/ethers/utils/maths.d.ts +65 -0
- package/js/src/src/static_dependencies/ethers/utils/maths.js +220 -0
- package/js/src/src/static_dependencies/ethers/utils/properties.d.ts +22 -0
- package/js/src/src/static_dependencies/ethers/utils/properties.js +59 -0
- package/js/src/src/static_dependencies/ethers/utils/rlp-decode.d.ts +5 -0
- package/js/src/src/static_dependencies/ethers/utils/rlp-decode.js +84 -0
- package/js/src/src/static_dependencies/ethers/utils/rlp-encode.d.ts +5 -0
- package/js/src/src/static_dependencies/ethers/utils/rlp-encode.js +54 -0
- package/js/src/src/static_dependencies/ethers/utils/rlp.d.ts +16 -0
- package/js/src/src/static_dependencies/ethers/utils/rlp.js +14 -0
- package/js/src/src/static_dependencies/ethers/utils/units.d.ts +23 -0
- package/js/src/src/static_dependencies/ethers/utils/units.js +88 -0
- package/js/src/src/static_dependencies/ethers/utils/utf8.d.ts +95 -0
- package/js/src/src/static_dependencies/ethers/utils/utf8.js +225 -0
- package/js/src/src/static_dependencies/ethers/utils/uuid.d.ts +7 -0
- package/js/src/src/static_dependencies/ethers/utils/uuid.js +35 -0
- package/js/src/src/static_dependencies/fflake/browser.d.ts +222 -0
- package/js/src/src/static_dependencies/fflake/browser.js +2578 -0
- package/js/src/src/static_dependencies/jsencrypt/JSEncrypt.d.ts +116 -0
- package/js/src/src/static_dependencies/jsencrypt/JSEncrypt.js +194 -0
- package/js/src/src/static_dependencies/jsencrypt/JSEncryptRSAKey.d.ts +142 -0
- package/js/src/src/static_dependencies/jsencrypt/JSEncryptRSAKey.js +307 -0
- package/js/src/src/static_dependencies/jsencrypt/lib/asn1js/asn1.d.ts +51 -0
- package/js/src/src/static_dependencies/jsencrypt/lib/asn1js/asn1.js +565 -0
- package/js/src/src/static_dependencies/jsencrypt/lib/asn1js/base64.d.ts +5 -0
- package/js/src/src/static_dependencies/jsencrypt/lib/asn1js/base64.js +94 -0
- package/js/src/src/static_dependencies/jsencrypt/lib/asn1js/hex.d.ts +3 -0
- package/js/src/src/static_dependencies/jsencrypt/lib/asn1js/hex.js +70 -0
- package/js/src/src/static_dependencies/jsencrypt/lib/asn1js/int10.d.ts +9 -0
- package/js/src/src/static_dependencies/jsencrypt/lib/asn1js/int10.js +91 -0
- package/js/src/src/static_dependencies/jsencrypt/lib/jsbn/base64.d.ts +3 -0
- package/js/src/src/static_dependencies/jsencrypt/lib/jsbn/base64.js +25 -0
- package/js/src/src/static_dependencies/jsencrypt/lib/jsbn/jsbn.d.ts +101 -0
- package/js/src/src/static_dependencies/jsencrypt/lib/jsbn/jsbn.js +1757 -0
- package/js/src/src/static_dependencies/jsencrypt/lib/jsbn/prng4.d.ts +10 -0
- package/js/src/src/static_dependencies/jsencrypt/lib/jsbn/prng4.js +50 -0
- package/js/src/src/static_dependencies/jsencrypt/lib/jsbn/rng.d.ts +3 -0
- package/js/src/src/static_dependencies/jsencrypt/lib/jsbn/rng.js +80 -0
- package/js/src/src/static_dependencies/jsencrypt/lib/jsbn/rsa.d.ts +23 -0
- package/js/src/src/static_dependencies/jsencrypt/lib/jsbn/rsa.js +377 -0
- package/js/src/src/static_dependencies/jsencrypt/lib/jsbn/util.d.ts +7 -0
- package/js/src/src/static_dependencies/jsencrypt/lib/jsbn/util.js +64 -0
- package/js/src/src/static_dependencies/jsencrypt/lib/jsrsasign/asn1-1.0.d.ts +24 -0
- package/js/src/src/static_dependencies/jsencrypt/lib/jsrsasign/asn1-1.0.js +1627 -0
- package/js/src/src/static_dependencies/noble-curves/_shortw_utils.d.ts +60 -0
- package/js/src/src/static_dependencies/noble-curves/_shortw_utils.js +22 -0
- package/js/src/src/static_dependencies/noble-curves/abstract/curve.d.ts +67 -0
- package/js/src/src/static_dependencies/noble-curves/abstract/curve.js +157 -0
- package/js/src/src/static_dependencies/noble-curves/abstract/edwards.d.ts +79 -0
- package/js/src/src/static_dependencies/noble-curves/abstract/edwards.js +432 -0
- package/js/src/src/static_dependencies/noble-curves/abstract/hash-to-curve.d.ts +56 -0
- package/js/src/src/static_dependencies/noble-curves/abstract/hash-to-curve.js +171 -0
- package/js/src/src/static_dependencies/noble-curves/abstract/modular.d.ts +68 -0
- package/js/src/src/static_dependencies/noble-curves/abstract/modular.js +351 -0
- package/js/src/src/static_dependencies/noble-curves/abstract/montgomery.d.ts +25 -0
- package/js/src/src/static_dependencies/noble-curves/abstract/montgomery.js +162 -0
- package/js/src/src/static_dependencies/noble-curves/abstract/poseidon.d.ts +29 -0
- package/js/src/src/static_dependencies/noble-curves/abstract/poseidon.js +115 -0
- package/js/src/src/static_dependencies/noble-curves/abstract/utils.d.ts +53 -0
- package/js/src/src/static_dependencies/noble-curves/abstract/utils.js +227 -0
- package/js/src/src/static_dependencies/noble-curves/abstract/weierstrass.d.ts +204 -0
- package/js/src/src/static_dependencies/noble-curves/abstract/weierstrass.js +1016 -0
- package/js/src/src/static_dependencies/noble-curves/ed25519.d.ts +53 -0
- package/js/src/src/static_dependencies/noble-curves/ed25519.js +402 -0
- package/js/src/src/static_dependencies/noble-curves/p256.d.ts +103 -0
- package/js/src/src/static_dependencies/noble-curves/p256.js +47 -0
- package/js/src/src/static_dependencies/noble-curves/secp256k1.d.ts +91 -0
- package/js/src/src/static_dependencies/noble-curves/secp256k1.js +257 -0
- package/js/src/src/static_dependencies/noble-hashes/_assert.d.ts +21 -0
- package/js/src/src/static_dependencies/noble-hashes/_assert.js +48 -0
- package/js/src/src/static_dependencies/noble-hashes/_sha2.d.ts +23 -0
- package/js/src/src/static_dependencies/noble-hashes/_sha2.js +119 -0
- package/js/src/src/static_dependencies/noble-hashes/_u64.d.ts +35 -0
- package/js/src/src/static_dependencies/noble-hashes/_u64.js +66 -0
- package/js/src/src/static_dependencies/noble-hashes/crypto.d.ts +1 -0
- package/js/src/src/static_dependencies/noble-hashes/crypto.js +7 -0
- package/js/src/src/static_dependencies/noble-hashes/hmac.d.ts +26 -0
- package/js/src/src/static_dependencies/noble-hashes/hmac.js +82 -0
- package/js/src/src/static_dependencies/noble-hashes/md5.d.ts +18 -0
- package/js/src/src/static_dependencies/noble-hashes/md5.js +242 -0
- package/js/src/src/static_dependencies/noble-hashes/sha1.d.ts +21 -0
- package/js/src/src/static_dependencies/noble-hashes/sha1.js +90 -0
- package/js/src/src/static_dependencies/noble-hashes/sha256.d.ts +34 -0
- package/js/src/src/static_dependencies/noble-hashes/sha256.js +129 -0
- package/js/src/src/static_dependencies/noble-hashes/sha3.d.ts +97 -0
- package/js/src/src/static_dependencies/noble-hashes/sha3.js +211 -0
- package/js/src/src/static_dependencies/noble-hashes/sha512.d.ts +66 -0
- package/js/src/src/static_dependencies/noble-hashes/sha512.js +236 -0
- package/js/src/src/static_dependencies/noble-hashes/utils.d.ts +77 -0
- package/js/src/src/static_dependencies/noble-hashes/utils.js +147 -0
- package/js/src/src/static_dependencies/proxies/agent-base/helpers.d.ts +14 -0
- package/js/src/src/static_dependencies/proxies/agent-base/helpers.js +42 -0
- package/js/src/src/static_dependencies/proxies/agent-base/index.d.ts +33 -0
- package/js/src/src/static_dependencies/proxies/agent-base/index.js +82 -0
- package/js/src/src/static_dependencies/proxies/http-proxy-agent/index.d.ts +40 -0
- package/js/src/src/static_dependencies/proxies/http-proxy-agent/index.js +119 -0
- package/js/src/src/static_dependencies/proxies/https-proxy-agent/index.d.ts +45 -0
- package/js/src/src/static_dependencies/proxies/https-proxy-agent/index.js +150 -0
- package/js/src/src/static_dependencies/proxies/https-proxy-agent/parse-proxy-response.d.ts +15 -0
- package/js/src/src/static_dependencies/proxies/https-proxy-agent/parse-proxy-response.js +95 -0
- package/js/src/src/static_dependencies/qs/formats.cjs +22 -0
- package/js/src/src/static_dependencies/qs/formats.d.cts +14 -0
- package/js/src/src/static_dependencies/qs/index.cjs +15 -0
- package/js/src/src/static_dependencies/qs/index.d.cts +10 -0
- package/js/src/src/static_dependencies/qs/parse.cjs +208 -0
- package/js/src/src/static_dependencies/qs/parse.d.cts +8 -0
- package/js/src/src/static_dependencies/qs/stringify.cjs +192 -0
- package/js/src/src/static_dependencies/qs/stringify.d.cts +8 -0
- package/js/src/src/static_dependencies/qs/utils.cjs +202 -0
- package/js/src/src/static_dependencies/qs/utils.d.cts +15 -0
- package/js/src/src/static_dependencies/scure-base/index.d.ts +92 -0
- package/js/src/src/static_dependencies/scure-base/index.js +420 -0
- package/js/src/src/static_dependencies/scure-starknet/index.d.ts +79 -0
- package/js/src/src/static_dependencies/scure-starknet/index.js +323 -0
- package/js/src/src/static_dependencies/starknet/constants.d.ts +61 -0
- package/js/src/src/static_dependencies/starknet/constants.js +67 -0
- package/js/src/src/static_dependencies/starknet/index.d.ts +3 -0
- package/js/src/src/static_dependencies/starknet/index.js +9 -0
- package/js/src/src/static_dependencies/starknet/types/cairoEnum.d.ts +2 -0
- package/js/src/src/static_dependencies/starknet/types/cairoEnum.js +7 -0
- package/js/src/src/static_dependencies/starknet/types/calldata.d.ts +19 -0
- package/js/src/src/static_dependencies/starknet/types/calldata.js +28 -0
- package/js/src/src/static_dependencies/starknet/types/index.d.ts +13 -0
- package/js/src/src/static_dependencies/starknet/types/index.js +16 -0
- package/js/src/src/static_dependencies/starknet/types/lib/contract/abi.d.ts +71 -0
- package/js/src/src/static_dependencies/starknet/types/lib/contract/abi.js +13 -0
- package/js/src/src/static_dependencies/starknet/types/lib/contract/index.d.ts +24 -0
- package/js/src/src/static_dependencies/starknet/types/lib/contract/index.js +16 -0
- package/js/src/src/static_dependencies/starknet/types/lib/contract/legacy.d.ts +33 -0
- package/js/src/src/static_dependencies/starknet/types/lib/contract/legacy.js +7 -0
- package/js/src/src/static_dependencies/starknet/types/lib/contract/sierra.d.ts +52 -0
- package/js/src/src/static_dependencies/starknet/types/lib/contract/sierra.js +7 -0
- package/js/src/src/static_dependencies/starknet/types/lib/index.d.ts +248 -0
- package/js/src/src/static_dependencies/starknet/types/lib/index.js +52 -0
- package/js/src/src/static_dependencies/starknet/types/typedData.d.ts +44 -0
- package/js/src/src/static_dependencies/starknet/types/typedData.js +19 -0
- package/js/src/src/static_dependencies/starknet/utils/assert.d.ts +7 -0
- package/js/src/src/static_dependencies/starknet/utils/assert.js +17 -0
- package/js/src/src/static_dependencies/starknet/utils/cairoDataTypes/felt.d.ts +6 -0
- package/js/src/src/static_dependencies/starknet/utils/cairoDataTypes/felt.js +43 -0
- package/js/src/src/static_dependencies/starknet/utils/cairoDataTypes/uint256.d.ts +72 -0
- package/js/src/src/static_dependencies/starknet/utils/cairoDataTypes/uint256.js +117 -0
- package/js/src/src/static_dependencies/starknet/utils/cairoDataTypes/uint512.d.ts +76 -0
- package/js/src/src/static_dependencies/starknet/utils/cairoDataTypes/uint512.js +136 -0
- package/js/src/src/static_dependencies/starknet/utils/calldata/byteArray.d.ts +32 -0
- package/js/src/src/static_dependencies/starknet/utils/calldata/byteArray.js +59 -0
- package/js/src/src/static_dependencies/starknet/utils/calldata/cairo.d.ts +183 -0
- package/js/src/src/static_dependencies/starknet/utils/calldata/cairo.js +229 -0
- package/js/src/src/static_dependencies/starknet/utils/calldata/enum/CairoCustomEnum.d.ts +38 -0
- package/js/src/src/static_dependencies/starknet/utils/calldata/enum/CairoCustomEnum.js +57 -0
- package/js/src/src/static_dependencies/starknet/utils/calldata/enum/CairoOption.d.ts +35 -0
- package/js/src/src/static_dependencies/starknet/utils/calldata/enum/CairoOption.js +64 -0
- package/js/src/src/static_dependencies/starknet/utils/calldata/enum/CairoResult.d.ts +34 -0
- package/js/src/src/static_dependencies/starknet/utils/calldata/enum/CairoResult.js +63 -0
- package/js/src/src/static_dependencies/starknet/utils/calldata/enum/index.d.ts +3 -0
- package/js/src/src/static_dependencies/starknet/utils/calldata/enum/index.js +9 -0
- package/js/src/src/static_dependencies/starknet/utils/calldata/formatter.d.ts +9 -0
- package/js/src/src/static_dependencies/starknet/utils/calldata/formatter.js +67 -0
- package/js/src/src/static_dependencies/starknet/utils/calldata/index.d.ts +89 -0
- package/js/src/src/static_dependencies/starknet/utils/calldata/index.js +280 -0
- package/js/src/src/static_dependencies/starknet/utils/calldata/parser/index.d.ts +5 -0
- package/js/src/src/static_dependencies/starknet/utils/calldata/parser/index.js +30 -0
- package/js/src/src/static_dependencies/starknet/utils/calldata/parser/interface.d.ts +20 -0
- package/js/src/src/static_dependencies/starknet/utils/calldata/parser/interface.js +8 -0
- package/js/src/src/static_dependencies/starknet/utils/calldata/parser/parser-0-1.1.0.d.ts +24 -0
- package/js/src/src/static_dependencies/starknet/utils/calldata/parser/parser-0-1.1.0.js +36 -0
- package/js/src/src/static_dependencies/starknet/utils/calldata/parser/parser-2.0.0.d.ts +23 -0
- package/js/src/src/static_dependencies/starknet/utils/calldata/parser/parser-2.0.0.js +40 -0
- package/js/src/src/static_dependencies/starknet/utils/calldata/propertyOrder.d.ts +2 -0
- package/js/src/src/static_dependencies/starknet/utils/calldata/propertyOrder.js +155 -0
- package/js/src/src/static_dependencies/starknet/utils/calldata/requestParser.d.ts +11 -0
- package/js/src/src/static_dependencies/starknet/utils/calldata/requestParser.js +248 -0
- package/js/src/src/static_dependencies/starknet/utils/calldata/responseParser.d.ts +11 -0
- package/js/src/src/static_dependencies/starknet/utils/calldata/responseParser.js +214 -0
- package/js/src/src/static_dependencies/starknet/utils/calldata/tuple.d.ts +6 -0
- package/js/src/src/static_dependencies/starknet/utils/calldata/tuple.js +113 -0
- package/js/src/src/static_dependencies/starknet/utils/calldata/validate.d.ts +6 -0
- package/js/src/src/static_dependencies/starknet/utils/calldata/validate.js +208 -0
- package/js/src/src/static_dependencies/starknet/utils/encode.d.ts +207 -0
- package/js/src/src/static_dependencies/starknet/utils/encode.js +282 -0
- package/js/src/src/static_dependencies/starknet/utils/hash/classHash.d.ts +57 -0
- package/js/src/src/static_dependencies/starknet/utils/hash/classHash.js +223 -0
- package/js/src/src/static_dependencies/starknet/utils/hash/index.d.ts +6 -0
- package/js/src/src/static_dependencies/starknet/utils/hash/index.js +13 -0
- package/js/src/src/static_dependencies/starknet/utils/merkle.d.ts +35 -0
- package/js/src/src/static_dependencies/starknet/utils/merkle.js +84 -0
- package/js/src/src/static_dependencies/starknet/utils/num.d.ts +182 -0
- package/js/src/src/static_dependencies/starknet/utils/num.js +244 -0
- package/js/src/src/static_dependencies/starknet/utils/selector.d.ts +48 -0
- package/js/src/src/static_dependencies/starknet/utils/selector.js +85 -0
- package/js/src/src/static_dependencies/starknet/utils/shortString.d.ts +57 -0
- package/js/src/src/static_dependencies/starknet/utils/shortString.js +96 -0
- package/js/src/src/static_dependencies/starknet/utils/typedData.d.ts +54 -0
- package/js/src/src/static_dependencies/starknet/utils/typedData.js +321 -0
- package/js/src/src/static_dependencies/watchable/src/types.d.ts +28 -0
- package/js/src/src/static_dependencies/watchable/src/types.js +8 -0
- package/js/src/src/static_dependencies/watchable/src/unpromise.d.ts +120 -0
- package/js/src/src/static_dependencies/watchable/src/unpromise.js +297 -0
- package/js/src/src/static_dependencies/zklink/zklink-sdk-web.d.ts +1279 -0
- package/js/src/src/static_dependencies/zklink/zklink-sdk-web.js +4282 -0
- package/js/src/src/tabdeal.d.ts +23 -0
- package/js/src/src/tabdeal.js +387 -0
- package/js/src/src/tehran_exchange.d.ts +21 -0
- package/js/src/src/tehran_exchange.js +333 -0
- package/js/src/src/tetherland.d.ts +21 -0
- package/js/src/src/tetherland.js +367 -0
- package/js/src/src/timex.d.ts +247 -0
- package/js/src/src/timex.js +1792 -0
- package/js/src/src/tokocrypto.d.ts +261 -0
- package/js/src/src/tokocrypto.js +2641 -0
- package/js/src/src/toobit.d.ts +22 -0
- package/js/src/src/toobit.js +445 -0
- package/js/src/src/tradeogre.d.ts +149 -0
- package/js/src/src/tradeogre.js +878 -0
- package/js/src/src/twox.d.ts +21 -0
- package/js/src/src/twox.js +371 -0
- package/js/src/src/ubitex.d.ts +23 -0
- package/js/src/src/ubitex.js +433 -0
- package/js/src/src/upbit.d.ts +377 -0
- package/js/src/src/upbit.js +2340 -0
- package/js/src/src/vertex.d.ts +346 -0
- package/js/src/src/vertex.js +3146 -0
- package/js/src/src/wallex.d.ts +23 -0
- package/js/src/src/wallex.js +467 -0
- package/js/src/src/wavesexchange.d.ts +244 -0
- package/js/src/src/wavesexchange.js +2747 -0
- package/js/src/src/whitebit.d.ts +571 -0
- package/js/src/src/whitebit.js +3437 -0
- package/js/src/src/woo.d.ts +727 -0
- package/js/src/src/woo.js +4183 -0
- package/js/src/src/woofipro.d.ts +497 -0
- package/js/src/src/woofipro.js +2941 -0
- package/js/src/src/xt.d.ts +568 -0
- package/js/src/src/xt.js +5184 -0
- package/js/src/src/yobit.d.ts +197 -0
- package/js/src/src/yobit.js +1453 -0
- package/js/src/src/zaif.d.ts +136 -0
- package/js/src/src/zaif.js +821 -0
- package/js/src/src/zonda.d.ts +214 -0
- package/js/src/src/zonda.js +1984 -0
- package/js/test.js +3 -3
- package/package.json +1 -1
|
@@ -0,0 +1,2479 @@
|
|
|
1
|
+
// ----------------------------------------------------------------------------
|
|
2
|
+
|
|
3
|
+
// PLEASE DO NOT EDIT THIS FILE, IT IS GENERATED AND WILL BE OVERWRITTEN:
|
|
4
|
+
// https://github.com/ccxt/ccxt/blob/master/CONTRIBUTING.md#how-to-contribute-code
|
|
5
|
+
// EDIT THE CORRESPONDENT .ts FILE INSTEAD
|
|
6
|
+
|
|
7
|
+
// ---------------------------------------------------------------------------
|
|
8
|
+
import okxRest from '../okx.js';
|
|
9
|
+
import { ArgumentsRequired, BadRequest, ExchangeError, ChecksumError, AuthenticationError, InvalidNonce } from '../base/errors.js';
|
|
10
|
+
import { ArrayCache, ArrayCacheByTimestamp, ArrayCacheBySymbolById, ArrayCacheBySymbolBySide } from '../base/ws/Cache.js';
|
|
11
|
+
import { sha256 } from '../static_dependencies/noble-hashes/sha256.js';
|
|
12
|
+
// ---------------------------------------------------------------------------
|
|
13
|
+
export default class okx extends okxRest {
|
|
14
|
+
describe() {
|
|
15
|
+
return this.deepExtend(super.describe(), {
|
|
16
|
+
'has': {
|
|
17
|
+
'ws': true,
|
|
18
|
+
'watchTicker': true,
|
|
19
|
+
'watchMarkPrice': true,
|
|
20
|
+
'watchMarkPrices': true,
|
|
21
|
+
'watchTickers': true,
|
|
22
|
+
'watchBidsAsks': true,
|
|
23
|
+
'watchOrderBook': true,
|
|
24
|
+
'watchTrades': true,
|
|
25
|
+
'watchTradesForSymbols': true,
|
|
26
|
+
'watchOrderBookForSymbols': true,
|
|
27
|
+
'watchBalance': true,
|
|
28
|
+
'watchLiquidations': 'emulated',
|
|
29
|
+
'watchLiquidationsForSymbols': true,
|
|
30
|
+
'watchMyLiquidations': 'emulated',
|
|
31
|
+
'watchMyLiquidationsForSymbols': true,
|
|
32
|
+
'watchOHLCV': true,
|
|
33
|
+
'watchOHLCVForSymbols': true,
|
|
34
|
+
'watchOrders': true,
|
|
35
|
+
'watchMyTrades': true,
|
|
36
|
+
'watchPositions': true,
|
|
37
|
+
'watchFundingRate': true,
|
|
38
|
+
'watchFundingRates': true,
|
|
39
|
+
'createOrderWs': true,
|
|
40
|
+
'editOrderWs': true,
|
|
41
|
+
'cancelOrderWs': true,
|
|
42
|
+
'cancelOrdersWs': true,
|
|
43
|
+
'cancelAllOrdersWs': true,
|
|
44
|
+
},
|
|
45
|
+
'urls': {
|
|
46
|
+
'api': {
|
|
47
|
+
'ws': 'wss://ws.okx.com:8443/ws/v5',
|
|
48
|
+
},
|
|
49
|
+
'test': {
|
|
50
|
+
'ws': 'wss://wspap.okx.com:8443/ws/v5',
|
|
51
|
+
},
|
|
52
|
+
},
|
|
53
|
+
'options': {
|
|
54
|
+
'watchOrderBook': {
|
|
55
|
+
'checksum': true,
|
|
56
|
+
//
|
|
57
|
+
// bbo-tbt
|
|
58
|
+
// 1. Newly added channel that sends tick-by-tick Level 1 data
|
|
59
|
+
// 2. All API users can subscribe
|
|
60
|
+
// 3. Public depth channel, verification not required
|
|
61
|
+
//
|
|
62
|
+
// books-l2-tbt
|
|
63
|
+
// 1. Only users who're VIP5 and above can subscribe
|
|
64
|
+
// 2. Identity verification required before subscription
|
|
65
|
+
//
|
|
66
|
+
// books50-l2-tbt
|
|
67
|
+
// 1. Only users who're VIP4 and above can subscribe
|
|
68
|
+
// 2. Identity verification required before subscription
|
|
69
|
+
//
|
|
70
|
+
// books
|
|
71
|
+
// 1. All API users can subscribe
|
|
72
|
+
// 2. Public depth channel, verification not required
|
|
73
|
+
//
|
|
74
|
+
// books5
|
|
75
|
+
// 1. All API users can subscribe
|
|
76
|
+
// 2. Public depth channel, verification not required
|
|
77
|
+
// 3. Data feeds will be delivered every 100ms (vs. every 200ms now)
|
|
78
|
+
//
|
|
79
|
+
'depth': 'books',
|
|
80
|
+
},
|
|
81
|
+
'watchBalance': 'spot',
|
|
82
|
+
'watchTicker': {
|
|
83
|
+
'channel': 'tickers', // tickers, sprd-tickers, index-tickers, block-tickers
|
|
84
|
+
},
|
|
85
|
+
'watchTickers': {
|
|
86
|
+
'channel': 'tickers', // tickers, sprd-tickers, index-tickers, block-tickers
|
|
87
|
+
},
|
|
88
|
+
'watchOrders': {
|
|
89
|
+
'type': 'ANY', // SPOT, MARGIN, SWAP, FUTURES, OPTION, ANY
|
|
90
|
+
},
|
|
91
|
+
'watchMyTrades': {
|
|
92
|
+
'type': 'ANY', // SPOT, MARGIN, SWAP, FUTURES, OPTION, ANY
|
|
93
|
+
},
|
|
94
|
+
'createOrderWs': {
|
|
95
|
+
'op': 'batch-orders', // order, batch-orders
|
|
96
|
+
},
|
|
97
|
+
'editOrderWs': {
|
|
98
|
+
'op': 'amend-order', // amend-order, batch-amend-orders
|
|
99
|
+
},
|
|
100
|
+
'ws': {
|
|
101
|
+
// 'inflate': true,
|
|
102
|
+
},
|
|
103
|
+
},
|
|
104
|
+
'streaming': {
|
|
105
|
+
// okex does not support built-in ws protocol-level ping-pong
|
|
106
|
+
// instead it requires a custom text-based ping-pong
|
|
107
|
+
'ping': this.ping,
|
|
108
|
+
'keepAlive': 18000,
|
|
109
|
+
},
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
getUrl(channel, access = 'public') {
|
|
113
|
+
// for context: https://www.okx.com/help-center/changes-to-v5-api-websocket-subscription-parameter-and-url
|
|
114
|
+
const isSandbox = this.options['sandboxMode'];
|
|
115
|
+
const sandboxSuffix = isSandbox ? '?brokerId=9999' : '';
|
|
116
|
+
const isBusiness = (access === 'business');
|
|
117
|
+
const isPublic = (access === 'public');
|
|
118
|
+
const url = this.urls['api']['ws'];
|
|
119
|
+
if (isBusiness || (channel.indexOf('candle') > -1) || (channel === 'orders-algo')) {
|
|
120
|
+
return url + '/business' + sandboxSuffix;
|
|
121
|
+
}
|
|
122
|
+
else if (isPublic) {
|
|
123
|
+
return url + '/public' + sandboxSuffix;
|
|
124
|
+
}
|
|
125
|
+
return url + '/private' + sandboxSuffix;
|
|
126
|
+
}
|
|
127
|
+
async subscribeMultiple(access, channel, symbols = undefined, params = {}) {
|
|
128
|
+
await this.loadMarkets();
|
|
129
|
+
if (symbols === undefined) {
|
|
130
|
+
symbols = this.symbols;
|
|
131
|
+
}
|
|
132
|
+
symbols = this.marketSymbols(symbols);
|
|
133
|
+
const url = this.getUrl(channel, access);
|
|
134
|
+
const messageHashes = [];
|
|
135
|
+
const args = [];
|
|
136
|
+
for (let i = 0; i < symbols.length; i++) {
|
|
137
|
+
const marketId = this.marketId(symbols[i]);
|
|
138
|
+
const arg = {
|
|
139
|
+
'channel': channel,
|
|
140
|
+
'instId': marketId,
|
|
141
|
+
};
|
|
142
|
+
args.push(this.extend(arg, params));
|
|
143
|
+
messageHashes.push(channel + '::' + symbols[i]);
|
|
144
|
+
}
|
|
145
|
+
const request = {
|
|
146
|
+
'op': 'subscribe',
|
|
147
|
+
'args': args,
|
|
148
|
+
};
|
|
149
|
+
return await this.watchMultiple(url, messageHashes, request, messageHashes);
|
|
150
|
+
}
|
|
151
|
+
async subscribe(access, messageHash, channel, symbol, params = {}) {
|
|
152
|
+
await this.loadMarkets();
|
|
153
|
+
const url = this.getUrl(channel, access);
|
|
154
|
+
const firstArgument = {
|
|
155
|
+
'channel': channel,
|
|
156
|
+
};
|
|
157
|
+
if (symbol !== undefined) {
|
|
158
|
+
const market = this.market(symbol);
|
|
159
|
+
messageHash += ':' + market['id'];
|
|
160
|
+
firstArgument['instId'] = market['id'];
|
|
161
|
+
}
|
|
162
|
+
const request = {
|
|
163
|
+
'op': 'subscribe',
|
|
164
|
+
'args': [
|
|
165
|
+
this.deepExtend(firstArgument, params),
|
|
166
|
+
],
|
|
167
|
+
};
|
|
168
|
+
return await this.watch(url, messageHash, request, messageHash);
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* @method
|
|
172
|
+
* @name okx#watchTrades
|
|
173
|
+
* @description get the list of most recent trades for a particular symbol
|
|
174
|
+
* @param {string} symbol unified symbol of the market to fetch trades for
|
|
175
|
+
* @param {int} [since] timestamp in ms of the earliest trade to fetch
|
|
176
|
+
* @param {int} [limit] the maximum amount of trades to fetch
|
|
177
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
178
|
+
* @returns {object[]} a list of [trade structures]{@link https://docs.ccxt.com/#/?id=public-trades}
|
|
179
|
+
*/
|
|
180
|
+
async watchTrades(symbol, since = undefined, limit = undefined, params = {}) {
|
|
181
|
+
return await this.watchTradesForSymbols([symbol], since, limit, params);
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* @method
|
|
185
|
+
* @name okx#watchTradesForSymbols
|
|
186
|
+
* @description get the list of most recent trades for a particular symbol
|
|
187
|
+
* @param {string} symbols
|
|
188
|
+
* @param {int} [since] timestamp in ms of the earliest trade to fetch
|
|
189
|
+
* @param {int} [limit] the maximum amount of trades to fetch
|
|
190
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
191
|
+
* @returns {object[]} a list of [trade structures]{@link https://docs.ccxt.com/#/?id=public-trades}
|
|
192
|
+
*/
|
|
193
|
+
async watchTradesForSymbols(symbols, since = undefined, limit = undefined, params = {}) {
|
|
194
|
+
const symbolsLength = symbols.length;
|
|
195
|
+
if (symbolsLength === 0) {
|
|
196
|
+
throw new ArgumentsRequired(this.id + ' watchTradesForSymbols() requires a non-empty array of symbols');
|
|
197
|
+
}
|
|
198
|
+
await this.loadMarkets();
|
|
199
|
+
symbols = this.marketSymbols(symbols);
|
|
200
|
+
const channel = 'trades';
|
|
201
|
+
const topics = [];
|
|
202
|
+
const messageHashes = [];
|
|
203
|
+
for (let i = 0; i < symbols.length; i++) {
|
|
204
|
+
const symbol = symbols[i];
|
|
205
|
+
messageHashes.push(channel + ':' + symbol);
|
|
206
|
+
const marketId = this.marketId(symbol);
|
|
207
|
+
const topic = {
|
|
208
|
+
'channel': channel,
|
|
209
|
+
'instId': marketId,
|
|
210
|
+
};
|
|
211
|
+
topics.push(topic);
|
|
212
|
+
}
|
|
213
|
+
const request = {
|
|
214
|
+
'op': 'subscribe',
|
|
215
|
+
'args': topics,
|
|
216
|
+
};
|
|
217
|
+
const url = this.getUrl(channel, 'public');
|
|
218
|
+
const trades = await this.watchMultiple(url, messageHashes, request, messageHashes);
|
|
219
|
+
if (this.newUpdates) {
|
|
220
|
+
const first = this.safeValue(trades, 0);
|
|
221
|
+
const tradeSymbol = this.safeString(first, 'symbol');
|
|
222
|
+
limit = trades.getLimit(tradeSymbol, limit);
|
|
223
|
+
}
|
|
224
|
+
return this.filterBySinceLimit(trades, since, limit, 'timestamp', true);
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* @method
|
|
228
|
+
* @name okx#unWatchTradesForSymbols
|
|
229
|
+
* @description unWatches from the stream channel
|
|
230
|
+
* @param {string[]} symbols
|
|
231
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
232
|
+
* @returns {object[]} a list of [trade structures]{@link https://docs.ccxt.com/#/?id=public-trades}
|
|
233
|
+
*/
|
|
234
|
+
async unWatchTradesForSymbols(symbols, params = {}) {
|
|
235
|
+
await this.loadMarkets();
|
|
236
|
+
symbols = this.marketSymbols(symbols, undefined, false);
|
|
237
|
+
const channel = 'trades';
|
|
238
|
+
const topics = [];
|
|
239
|
+
const messageHashes = [];
|
|
240
|
+
for (let i = 0; i < symbols.length; i++) {
|
|
241
|
+
const symbol = symbols[i];
|
|
242
|
+
messageHashes.push('unsubscribe:trades:' + symbol);
|
|
243
|
+
const marketId = this.marketId(symbol);
|
|
244
|
+
const topic = {
|
|
245
|
+
'channel': channel,
|
|
246
|
+
'instId': marketId,
|
|
247
|
+
};
|
|
248
|
+
topics.push(topic);
|
|
249
|
+
}
|
|
250
|
+
const request = {
|
|
251
|
+
'op': 'unsubscribe',
|
|
252
|
+
'args': topics,
|
|
253
|
+
};
|
|
254
|
+
const url = this.getUrl(channel, 'public');
|
|
255
|
+
return await this.watchMultiple(url, messageHashes, request, messageHashes);
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* @method
|
|
259
|
+
* @name okx#unWatchTrades
|
|
260
|
+
* @description unWatches from the stream channel
|
|
261
|
+
* @param {string} symbol unified symbol of the market to fetch trades for
|
|
262
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
263
|
+
* @returns {object[]} a list of [trade structures]{@link https://docs.ccxt.com/#/?id=public-trades}
|
|
264
|
+
*/
|
|
265
|
+
async unWatchTrades(symbol, params = {}) {
|
|
266
|
+
return await this.unWatchTradesForSymbols([symbol], params);
|
|
267
|
+
}
|
|
268
|
+
handleTrades(client, message) {
|
|
269
|
+
//
|
|
270
|
+
// {
|
|
271
|
+
// "arg": { channel: "trades", instId: "BTC-USDT" },
|
|
272
|
+
// "data": [
|
|
273
|
+
// {
|
|
274
|
+
// "instId": "BTC-USDT",
|
|
275
|
+
// "tradeId": "216970876",
|
|
276
|
+
// "px": "31684.5",
|
|
277
|
+
// "sz": "0.00001186",
|
|
278
|
+
// "side": "buy",
|
|
279
|
+
// "ts": "1626531038288"
|
|
280
|
+
// }
|
|
281
|
+
// ]
|
|
282
|
+
// }
|
|
283
|
+
//
|
|
284
|
+
const arg = this.safeValue(message, 'arg', {});
|
|
285
|
+
const channel = this.safeString(arg, 'channel');
|
|
286
|
+
const marketId = this.safeString(arg, 'instId');
|
|
287
|
+
const symbol = this.safeSymbol(marketId);
|
|
288
|
+
const data = this.safeValue(message, 'data', []);
|
|
289
|
+
const tradesLimit = this.safeInteger(this.options, 'tradesLimit', 1000);
|
|
290
|
+
for (let i = 0; i < data.length; i++) {
|
|
291
|
+
const trade = this.parseTrade(data[i]);
|
|
292
|
+
const messageHash = channel + ':' + symbol;
|
|
293
|
+
let stored = this.safeValue(this.trades, symbol);
|
|
294
|
+
if (stored === undefined) {
|
|
295
|
+
stored = new ArrayCache(tradesLimit);
|
|
296
|
+
this.trades[symbol] = stored;
|
|
297
|
+
}
|
|
298
|
+
stored.append(trade);
|
|
299
|
+
client.resolve(stored, messageHash);
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
/**
|
|
303
|
+
* @method
|
|
304
|
+
* @name okx#watchFundingRate
|
|
305
|
+
* @description watch the current funding rate
|
|
306
|
+
* @see https://www.okx.com/docs-v5/en/#public-data-websocket-funding-rate-channel
|
|
307
|
+
* @param {string} symbol unified market symbol
|
|
308
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
309
|
+
* @returns {object} a [funding rate structure]{@link https://docs.ccxt.com/#/?id=funding-rate-structure}
|
|
310
|
+
*/
|
|
311
|
+
async watchFundingRate(symbol, params = {}) {
|
|
312
|
+
symbol = this.symbol(symbol);
|
|
313
|
+
const fr = await this.watchFundingRates([symbol], params);
|
|
314
|
+
return fr[symbol];
|
|
315
|
+
}
|
|
316
|
+
/**
|
|
317
|
+
* @method
|
|
318
|
+
* @name coinbaseinternational#watchFundingRates
|
|
319
|
+
* @description watch the funding rate for multiple markets
|
|
320
|
+
* @see https://www.okx.com/docs-v5/en/#public-data-websocket-funding-rate-channel
|
|
321
|
+
* @param {string[]} symbols list of unified market symbols
|
|
322
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
323
|
+
* @returns {object} a dictionary of [funding rates structures]{@link https://docs.ccxt.com/#/?id=funding-rates-structure}, indexe by market symbols
|
|
324
|
+
*/
|
|
325
|
+
async watchFundingRates(symbols, params = {}) {
|
|
326
|
+
await this.loadMarkets();
|
|
327
|
+
symbols = this.marketSymbols(symbols);
|
|
328
|
+
const channel = 'funding-rate';
|
|
329
|
+
const topics = [];
|
|
330
|
+
const messageHashes = [];
|
|
331
|
+
for (let i = 0; i < symbols.length; i++) {
|
|
332
|
+
const symbol = symbols[i];
|
|
333
|
+
messageHashes.push(channel + ':' + symbol);
|
|
334
|
+
const marketId = this.marketId(symbol);
|
|
335
|
+
const topic = {
|
|
336
|
+
'channel': channel,
|
|
337
|
+
'instId': marketId,
|
|
338
|
+
};
|
|
339
|
+
topics.push(topic);
|
|
340
|
+
}
|
|
341
|
+
const request = {
|
|
342
|
+
'op': 'subscribe',
|
|
343
|
+
'args': topics,
|
|
344
|
+
};
|
|
345
|
+
const url = this.getUrl(channel, 'public');
|
|
346
|
+
const fundingRate = await this.watchMultiple(url, messageHashes, request, messageHashes);
|
|
347
|
+
if (this.newUpdates) {
|
|
348
|
+
const symbol = this.safeString(fundingRate, 'symbol');
|
|
349
|
+
const result = {};
|
|
350
|
+
result[symbol] = fundingRate;
|
|
351
|
+
return result;
|
|
352
|
+
}
|
|
353
|
+
return this.filterByArray(this.fundingRates, 'symbol', symbols);
|
|
354
|
+
}
|
|
355
|
+
handleFundingRate(client, message) {
|
|
356
|
+
//
|
|
357
|
+
// "data":[
|
|
358
|
+
// {
|
|
359
|
+
// "fundingRate":"0.0001875391284828",
|
|
360
|
+
// "fundingTime":"1700726400000",
|
|
361
|
+
// "instId":"BTC-USD-SWAP",
|
|
362
|
+
// "instType":"SWAP",
|
|
363
|
+
// "method": "next_period",
|
|
364
|
+
// "maxFundingRate":"0.00375",
|
|
365
|
+
// "minFundingRate":"-0.00375",
|
|
366
|
+
// "nextFundingRate":"0.0002608059239328",
|
|
367
|
+
// "nextFundingTime":"1700755200000",
|
|
368
|
+
// "premium": "0.0001233824646391",
|
|
369
|
+
// "settFundingRate":"0.0001699799259033",
|
|
370
|
+
// "settState":"settled",
|
|
371
|
+
// "ts":"1700724675402"
|
|
372
|
+
// }
|
|
373
|
+
// ]
|
|
374
|
+
//
|
|
375
|
+
const data = this.safeList(message, 'data', []);
|
|
376
|
+
for (let i = 0; i < data.length; i++) {
|
|
377
|
+
const rawfr = data[i];
|
|
378
|
+
const fundingRate = this.parseFundingRate(rawfr);
|
|
379
|
+
const symbol = fundingRate['symbol'];
|
|
380
|
+
this.fundingRates[symbol] = fundingRate;
|
|
381
|
+
client.resolve(fundingRate, 'funding-rate' + ':' + fundingRate['symbol']);
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
/**
|
|
385
|
+
* @method
|
|
386
|
+
* @name okx#watchTicker
|
|
387
|
+
* @see https://www.okx.com/docs-v5/en/#order-book-trading-market-data-ws-tickers-channel
|
|
388
|
+
* @description watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
|
|
389
|
+
* @param {string} symbol unified symbol of the market to fetch the ticker for
|
|
390
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
391
|
+
* @param {string} [params.channel] the channel to subscribe to, tickers by default. Can be tickers, sprd-tickers, index-tickers, block-tickers
|
|
392
|
+
* @returns {object} a [ticker structure]{@link https://docs.ccxt.com/#/?id=ticker-structure}
|
|
393
|
+
*/
|
|
394
|
+
async watchTicker(symbol, params = {}) {
|
|
395
|
+
let channel = undefined;
|
|
396
|
+
[channel, params] = this.handleOptionAndParams(params, 'watchTicker', 'channel', 'tickers');
|
|
397
|
+
params['channel'] = channel;
|
|
398
|
+
const market = this.market(symbol);
|
|
399
|
+
symbol = market['symbol'];
|
|
400
|
+
const ticker = await this.watchTickers([symbol], params);
|
|
401
|
+
return this.safeValue(ticker, symbol);
|
|
402
|
+
}
|
|
403
|
+
/**
|
|
404
|
+
* @method
|
|
405
|
+
* @name okx#unWatchTicker
|
|
406
|
+
* @see https://www.okx.com/docs-v5/en/#order-book-trading-market-data-ws-tickers-channel
|
|
407
|
+
* @description unWatches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
|
|
408
|
+
* @param {string} symbol unified symbol of the market to fetch the ticker for
|
|
409
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
410
|
+
* @param {string} [params.channel] the channel to subscribe to, tickers by default. Can be tickers, sprd-tickers, index-tickers, block-tickers
|
|
411
|
+
* @returns {object} a [ticker structure]{@link https://docs.ccxt.com/#/?id=ticker-structure}
|
|
412
|
+
*/
|
|
413
|
+
async unWatchTicker(symbol, params = {}) {
|
|
414
|
+
return await this.unWatchTickers([symbol], params);
|
|
415
|
+
}
|
|
416
|
+
/**
|
|
417
|
+
* @method
|
|
418
|
+
* @name okx#watchTickers
|
|
419
|
+
* @see https://www.okx.com/docs-v5/en/#order-book-trading-market-data-ws-tickers-channel
|
|
420
|
+
* @description watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for all markets of a specific list
|
|
421
|
+
* @param {string[]} [symbols] unified symbol of the market to fetch the ticker for
|
|
422
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
423
|
+
* @param {string} [params.channel] the channel to subscribe to, tickers by default. Can be tickers, sprd-tickers, index-tickers, block-tickers
|
|
424
|
+
* @returns {object} a [ticker structure]{@link https://docs.ccxt.com/#/?id=ticker-structure}
|
|
425
|
+
*/
|
|
426
|
+
async watchTickers(symbols = undefined, params = {}) {
|
|
427
|
+
await this.loadMarkets();
|
|
428
|
+
symbols = this.marketSymbols(symbols, undefined, false);
|
|
429
|
+
let channel = undefined;
|
|
430
|
+
[channel, params] = this.handleOptionAndParams(params, 'watchTickers', 'channel', 'tickers');
|
|
431
|
+
const newTickers = await this.subscribeMultiple('public', channel, symbols, params);
|
|
432
|
+
if (this.newUpdates) {
|
|
433
|
+
return newTickers;
|
|
434
|
+
}
|
|
435
|
+
return this.filterByArray(this.tickers, 'symbol', symbols);
|
|
436
|
+
}
|
|
437
|
+
/**
|
|
438
|
+
* @method
|
|
439
|
+
* @name okx#watchMarkPrice
|
|
440
|
+
* @see https://www.okx.com/docs-v5/en/#public-data-websocket-mark-price-channel
|
|
441
|
+
* @description watches a mark price
|
|
442
|
+
* @param {string} symbol unified symbol of the market to fetch the ticker for
|
|
443
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
444
|
+
* @param {string} [params.channel] the channel to subscribe to, tickers by default. Can be tickers, sprd-tickers, index-tickers, block-tickers
|
|
445
|
+
* @returns {object} a [ticker structure]{@link https://docs.ccxt.com/#/?id=ticker-structure}
|
|
446
|
+
*/
|
|
447
|
+
async watchMarkPrice(symbol, params = {}) {
|
|
448
|
+
let channel = undefined;
|
|
449
|
+
[channel, params] = this.handleOptionAndParams(params, 'watchMarkPrice', 'channel', 'mark-price');
|
|
450
|
+
params['channel'] = channel;
|
|
451
|
+
const market = this.market(symbol);
|
|
452
|
+
symbol = market['symbol'];
|
|
453
|
+
const ticker = await this.watchMarkPrices([symbol], params);
|
|
454
|
+
return ticker[symbol];
|
|
455
|
+
}
|
|
456
|
+
/**
|
|
457
|
+
* @method
|
|
458
|
+
* @name okx#watchMarkPrices
|
|
459
|
+
* @see https://www.okx.com/docs-v5/en/#public-data-websocket-mark-price-channel
|
|
460
|
+
* @description watches mark prices
|
|
461
|
+
* @param {string[]} [symbols] unified symbol of the market to fetch the ticker for
|
|
462
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
463
|
+
* @param {string} [params.channel] the channel to subscribe to, tickers by default. Can be tickers, sprd-tickers, index-tickers, block-tickers
|
|
464
|
+
* @returns {object} a [ticker structure]{@link https://docs.ccxt.com/#/?id=ticker-structure}
|
|
465
|
+
*/
|
|
466
|
+
async watchMarkPrices(symbols = undefined, params = {}) {
|
|
467
|
+
await this.loadMarkets();
|
|
468
|
+
symbols = this.marketSymbols(symbols, undefined, false);
|
|
469
|
+
let channel = undefined;
|
|
470
|
+
[channel, params] = this.handleOptionAndParams(params, 'watchMarkPrices', 'channel', 'mark-price');
|
|
471
|
+
const newTickers = await this.subscribeMultiple('public', channel, symbols, params);
|
|
472
|
+
if (this.newUpdates) {
|
|
473
|
+
return newTickers;
|
|
474
|
+
}
|
|
475
|
+
return this.filterByArray(this.tickers, 'symbol', symbols);
|
|
476
|
+
}
|
|
477
|
+
/**
|
|
478
|
+
* @method
|
|
479
|
+
* @name okx#unWatchTickers
|
|
480
|
+
* @see https://www.okx.com/docs-v5/en/#order-book-trading-market-data-ws-tickers-channel
|
|
481
|
+
* @description unWatches a price ticker, a statistical calculation with the information calculated over the past 24 hours for all markets of a specific list
|
|
482
|
+
* @param {string[]} [symbols] unified symbol of the market to fetch the ticker for
|
|
483
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
484
|
+
* @param {string} [params.channel] the channel to subscribe to, tickers by default. Can be tickers, sprd-tickers, index-tickers, block-tickers
|
|
485
|
+
* @returns {object} a [ticker structure]{@link https://docs.ccxt.com/#/?id=ticker-structure}
|
|
486
|
+
*/
|
|
487
|
+
async unWatchTickers(symbols = undefined, params = {}) {
|
|
488
|
+
await this.loadMarkets();
|
|
489
|
+
symbols = this.marketSymbols(symbols, undefined, false);
|
|
490
|
+
let channel = undefined;
|
|
491
|
+
[channel, params] = this.handleOptionAndParams(params, 'watchTickers', 'channel', 'tickers');
|
|
492
|
+
const topics = [];
|
|
493
|
+
const messageHashes = [];
|
|
494
|
+
for (let i = 0; i < symbols.length; i++) {
|
|
495
|
+
const symbol = symbols[i];
|
|
496
|
+
messageHashes.push('unsubscribe:ticker:' + symbol);
|
|
497
|
+
const marketId = this.marketId(symbol);
|
|
498
|
+
const topic = {
|
|
499
|
+
'channel': channel,
|
|
500
|
+
'instId': marketId,
|
|
501
|
+
};
|
|
502
|
+
topics.push(topic);
|
|
503
|
+
}
|
|
504
|
+
const request = {
|
|
505
|
+
'op': 'unsubscribe',
|
|
506
|
+
'args': topics,
|
|
507
|
+
};
|
|
508
|
+
const url = this.getUrl(channel, 'public');
|
|
509
|
+
return await this.watchMultiple(url, messageHashes, request, messageHashes);
|
|
510
|
+
}
|
|
511
|
+
handleTicker(client, message) {
|
|
512
|
+
//
|
|
513
|
+
// {
|
|
514
|
+
// "arg": { channel: "tickers", instId: "BTC-USDT" },
|
|
515
|
+
// "data": [
|
|
516
|
+
// {
|
|
517
|
+
// "instType": "SPOT",
|
|
518
|
+
// "instId": "BTC-USDT",
|
|
519
|
+
// "last": "31500.1",
|
|
520
|
+
// "lastSz": "0.00001754",
|
|
521
|
+
// "askPx": "31500.1",
|
|
522
|
+
// "askSz": "0.00998144",
|
|
523
|
+
// "bidPx": "31500",
|
|
524
|
+
// "bidSz": "3.05652439",
|
|
525
|
+
// "open24h": "31697",
|
|
526
|
+
// "high24h": "32248",
|
|
527
|
+
// "low24h": "31165.6",
|
|
528
|
+
// "sodUtc0": "31385.5",
|
|
529
|
+
// "sodUtc8": "32134.9",
|
|
530
|
+
// "volCcy24h": "503403597.38138519",
|
|
531
|
+
// "vol24h": "15937.10781721",
|
|
532
|
+
// "ts": "1626526618762"
|
|
533
|
+
// }
|
|
534
|
+
// ]
|
|
535
|
+
// }
|
|
536
|
+
//
|
|
537
|
+
this.handleBidAsk(client, message);
|
|
538
|
+
const arg = this.safeValue(message, 'arg', {});
|
|
539
|
+
const marketId = this.safeString(arg, 'instId');
|
|
540
|
+
const market = this.safeMarket(marketId, undefined, '-');
|
|
541
|
+
const symbol = market['symbol'];
|
|
542
|
+
const channel = this.safeString(arg, 'channel');
|
|
543
|
+
const data = this.safeValue(message, 'data', []);
|
|
544
|
+
const newTickers = {};
|
|
545
|
+
for (let i = 0; i < data.length; i++) {
|
|
546
|
+
const ticker = this.parseTicker(data[i]);
|
|
547
|
+
this.tickers[symbol] = ticker;
|
|
548
|
+
newTickers[symbol] = ticker;
|
|
549
|
+
}
|
|
550
|
+
const messageHash = channel + '::' + symbol;
|
|
551
|
+
client.resolve(newTickers, messageHash);
|
|
552
|
+
}
|
|
553
|
+
/**
|
|
554
|
+
* @method
|
|
555
|
+
* @name okx#watchBidsAsks
|
|
556
|
+
* @see https://www.okx.com/docs-v5/en/#order-book-trading-market-data-ws-tickers-channel
|
|
557
|
+
* @description watches best bid & ask for symbols
|
|
558
|
+
* @param {string[]} symbols unified symbol of the market to fetch the ticker for
|
|
559
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
560
|
+
* @returns {object} a [ticker structure]{@link https://docs.ccxt.com/#/?id=ticker-structure}
|
|
561
|
+
*/
|
|
562
|
+
async watchBidsAsks(symbols = undefined, params = {}) {
|
|
563
|
+
await this.loadMarkets();
|
|
564
|
+
symbols = this.marketSymbols(symbols, undefined, false);
|
|
565
|
+
let channel = undefined;
|
|
566
|
+
[channel, params] = this.handleOptionAndParams(params, 'watchBidsAsks', 'channel', 'tickers');
|
|
567
|
+
const url = this.getUrl(channel, 'public');
|
|
568
|
+
const messageHashes = [];
|
|
569
|
+
const args = [];
|
|
570
|
+
for (let i = 0; i < symbols.length; i++) {
|
|
571
|
+
const marketId = this.marketId(symbols[i]);
|
|
572
|
+
const arg = {
|
|
573
|
+
'channel': channel,
|
|
574
|
+
'instId': marketId,
|
|
575
|
+
};
|
|
576
|
+
args.push(this.extend(arg, params));
|
|
577
|
+
messageHashes.push('bidask::' + symbols[i]);
|
|
578
|
+
}
|
|
579
|
+
const request = {
|
|
580
|
+
'op': 'subscribe',
|
|
581
|
+
'args': args,
|
|
582
|
+
};
|
|
583
|
+
const newTickers = await this.watchMultiple(url, messageHashes, request, messageHashes);
|
|
584
|
+
if (this.newUpdates) {
|
|
585
|
+
const tickers = {};
|
|
586
|
+
tickers[newTickers['symbol']] = newTickers;
|
|
587
|
+
return tickers;
|
|
588
|
+
}
|
|
589
|
+
return this.filterByArray(this.bidsasks, 'symbol', symbols);
|
|
590
|
+
}
|
|
591
|
+
handleBidAsk(client, message) {
|
|
592
|
+
//
|
|
593
|
+
// {
|
|
594
|
+
// "arg": { channel: "tickers", instId: "BTC-USDT" },
|
|
595
|
+
// "data": [
|
|
596
|
+
// {
|
|
597
|
+
// "instType": "SPOT",
|
|
598
|
+
// "instId": "BTC-USDT",
|
|
599
|
+
// "last": "31500.1",
|
|
600
|
+
// "lastSz": "0.00001754",
|
|
601
|
+
// "askPx": "31500.1",
|
|
602
|
+
// "askSz": "0.00998144",
|
|
603
|
+
// "bidPx": "31500",
|
|
604
|
+
// "bidSz": "3.05652439",
|
|
605
|
+
// "open24h": "31697",
|
|
606
|
+
// "high24h": "32248",
|
|
607
|
+
// "low24h": "31165.6",
|
|
608
|
+
// "sodUtc0": "31385.5",
|
|
609
|
+
// "sodUtc8": "32134.9",
|
|
610
|
+
// "volCcy24h": "503403597.38138519",
|
|
611
|
+
// "vol24h": "15937.10781721",
|
|
612
|
+
// "ts": "1626526618762"
|
|
613
|
+
// }
|
|
614
|
+
// ]
|
|
615
|
+
// }
|
|
616
|
+
//
|
|
617
|
+
const data = this.safeList(message, 'data', []);
|
|
618
|
+
const ticker = this.safeDict(data, 0, {});
|
|
619
|
+
const parsedTicker = this.parseWsBidAsk(ticker);
|
|
620
|
+
const symbol = parsedTicker['symbol'];
|
|
621
|
+
this.bidsasks[symbol] = parsedTicker;
|
|
622
|
+
const messageHash = 'bidask::' + symbol;
|
|
623
|
+
client.resolve(parsedTicker, messageHash);
|
|
624
|
+
}
|
|
625
|
+
parseWsBidAsk(ticker, market = undefined) {
|
|
626
|
+
const marketId = this.safeString(ticker, 'instId');
|
|
627
|
+
market = this.safeMarket(marketId, market);
|
|
628
|
+
const symbol = this.safeString(market, 'symbol');
|
|
629
|
+
const timestamp = this.safeInteger(ticker, 'ts');
|
|
630
|
+
return this.safeTicker({
|
|
631
|
+
'symbol': symbol,
|
|
632
|
+
'timestamp': timestamp,
|
|
633
|
+
'datetime': this.iso8601(timestamp),
|
|
634
|
+
'ask': this.safeString(ticker, 'askPx'),
|
|
635
|
+
'askVolume': this.safeString(ticker, 'askSz'),
|
|
636
|
+
'bid': this.safeString(ticker, 'bidPx'),
|
|
637
|
+
'bidVolume': this.safeString(ticker, 'bidSz'),
|
|
638
|
+
'info': ticker,
|
|
639
|
+
}, market);
|
|
640
|
+
}
|
|
641
|
+
/**
|
|
642
|
+
* @method
|
|
643
|
+
* @name okx#watchLiquidationsForSymbols
|
|
644
|
+
* @description watch the public liquidations of a trading pair
|
|
645
|
+
* @see https://www.okx.com/docs-v5/en/#public-data-websocket-liquidation-orders-channel
|
|
646
|
+
* @param {string} symbols
|
|
647
|
+
* @param {int} [since] the earliest time in ms to fetch liquidations for
|
|
648
|
+
* @param {int} [limit] the maximum number of liquidation structures to retrieve
|
|
649
|
+
* @param {object} [params] exchange specific parameters for the okx api endpoint
|
|
650
|
+
* @returns {object} an array of [liquidation structures]{@link https://github.com/ccxt/ccxt/wiki/Manual#liquidation-structure}
|
|
651
|
+
*/
|
|
652
|
+
async watchLiquidationsForSymbols(symbols, since = undefined, limit = undefined, params = {}) {
|
|
653
|
+
await this.loadMarkets();
|
|
654
|
+
symbols = this.marketSymbols(symbols, undefined, true, true);
|
|
655
|
+
const messageHash = 'liquidations';
|
|
656
|
+
const messageHashes = [];
|
|
657
|
+
if (symbols !== undefined) {
|
|
658
|
+
for (let i = 0; i < symbols.length; i++) {
|
|
659
|
+
const symbol = symbols[i];
|
|
660
|
+
messageHashes.push(messageHash + '::' + symbol);
|
|
661
|
+
}
|
|
662
|
+
}
|
|
663
|
+
else {
|
|
664
|
+
messageHashes.push(messageHash);
|
|
665
|
+
}
|
|
666
|
+
const market = this.getMarketFromSymbols(symbols);
|
|
667
|
+
let type = undefined;
|
|
668
|
+
[type, params] = this.handleMarketTypeAndParams('watchliquidationsForSymbols', market, params);
|
|
669
|
+
const channel = 'liquidation-orders';
|
|
670
|
+
if (type === 'spot') {
|
|
671
|
+
type = 'SWAP';
|
|
672
|
+
}
|
|
673
|
+
else if (type === 'future') {
|
|
674
|
+
type = 'futures';
|
|
675
|
+
}
|
|
676
|
+
const uppercaseType = type.toUpperCase();
|
|
677
|
+
const request = {
|
|
678
|
+
'op': 'subscribe',
|
|
679
|
+
'args': [
|
|
680
|
+
{
|
|
681
|
+
'channel': channel,
|
|
682
|
+
'instType': uppercaseType,
|
|
683
|
+
},
|
|
684
|
+
],
|
|
685
|
+
};
|
|
686
|
+
const url = this.getUrl(channel, 'public');
|
|
687
|
+
const newLiquidations = await this.watchMultiple(url, messageHashes, request, messageHashes);
|
|
688
|
+
if (this.newUpdates) {
|
|
689
|
+
return newLiquidations;
|
|
690
|
+
}
|
|
691
|
+
return this.filterBySymbolsSinceLimit(this.liquidations, symbols, since, limit, true);
|
|
692
|
+
}
|
|
693
|
+
handleLiquidation(client, message) {
|
|
694
|
+
//
|
|
695
|
+
// {
|
|
696
|
+
// "arg": {
|
|
697
|
+
// "channel": "liquidation-orders",
|
|
698
|
+
// "instType": "SWAP"
|
|
699
|
+
// },
|
|
700
|
+
// "data": [
|
|
701
|
+
// {
|
|
702
|
+
// "details": [
|
|
703
|
+
// {
|
|
704
|
+
// "bkLoss": "0",
|
|
705
|
+
// "bkPx": "0.007831",
|
|
706
|
+
// "ccy": "",
|
|
707
|
+
// "posSide": "short",
|
|
708
|
+
// "side": "buy",
|
|
709
|
+
// "sz": "13",
|
|
710
|
+
// "ts": "1692266434010"
|
|
711
|
+
// }
|
|
712
|
+
// ],
|
|
713
|
+
// "instFamily": "IOST-USDT",
|
|
714
|
+
// "instId": "IOST-USDT-SWAP",
|
|
715
|
+
// "instType": "SWAP",
|
|
716
|
+
// "uly": "IOST-USDT"
|
|
717
|
+
// }
|
|
718
|
+
// ]
|
|
719
|
+
// }
|
|
720
|
+
//
|
|
721
|
+
const rawLiquidations = this.safeList(message, 'data', []);
|
|
722
|
+
for (let i = 0; i < rawLiquidations.length; i++) {
|
|
723
|
+
const rawLiquidation = rawLiquidations[i];
|
|
724
|
+
const liquidation = this.parseWsLiquidation(rawLiquidation);
|
|
725
|
+
const symbol = this.safeString(liquidation, 'symbol');
|
|
726
|
+
let liquidations = this.safeValue(this.liquidations, symbol);
|
|
727
|
+
if (liquidations === undefined) {
|
|
728
|
+
const limit = this.safeInteger(this.options, 'liquidationsLimit', 1000);
|
|
729
|
+
liquidations = new ArrayCache(limit);
|
|
730
|
+
}
|
|
731
|
+
liquidations.append(liquidation);
|
|
732
|
+
this.liquidations[symbol] = liquidations;
|
|
733
|
+
client.resolve([liquidation], 'liquidations');
|
|
734
|
+
client.resolve([liquidation], 'liquidations::' + symbol);
|
|
735
|
+
}
|
|
736
|
+
}
|
|
737
|
+
/**
|
|
738
|
+
* @method
|
|
739
|
+
* @name okx#watchMyLiquidationsForSymbols
|
|
740
|
+
* @description watch the private liquidations of a trading pair
|
|
741
|
+
* @see https://www.okx.com/docs-v5/en/#trading-account-websocket-balance-and-position-channel
|
|
742
|
+
* @param {string[]} symbols
|
|
743
|
+
* @param {int} [since] the earliest time in ms to fetch liquidations for
|
|
744
|
+
* @param {int} [limit] the maximum number of liquidation structures to retrieve
|
|
745
|
+
* @param {object} [params] exchange specific parameters for the okx api endpoint
|
|
746
|
+
* @returns {object} an array of [liquidation structures]{@link https://github.com/ccxt/ccxt/wiki/Manual#liquidation-structure}
|
|
747
|
+
*/
|
|
748
|
+
async watchMyLiquidationsForSymbols(symbols, since = undefined, limit = undefined, params = {}) {
|
|
749
|
+
await this.loadMarkets();
|
|
750
|
+
const isTrigger = this.safeValue2(params, 'stop', 'trigger', false);
|
|
751
|
+
params = this.omit(params, ['stop', 'trigger']);
|
|
752
|
+
await this.authenticate({ 'access': isTrigger ? 'business' : 'private' });
|
|
753
|
+
symbols = this.marketSymbols(symbols, undefined, true, true);
|
|
754
|
+
const messageHash = 'myLiquidations';
|
|
755
|
+
const messageHashes = [];
|
|
756
|
+
if (symbols !== undefined) {
|
|
757
|
+
for (let i = 0; i < symbols.length; i++) {
|
|
758
|
+
const symbol = symbols[i];
|
|
759
|
+
messageHashes.push(messageHash + '::' + symbol);
|
|
760
|
+
}
|
|
761
|
+
}
|
|
762
|
+
else {
|
|
763
|
+
messageHashes.push(messageHash);
|
|
764
|
+
}
|
|
765
|
+
const channel = 'balance_and_position';
|
|
766
|
+
const request = {
|
|
767
|
+
'op': 'subscribe',
|
|
768
|
+
'args': [
|
|
769
|
+
{
|
|
770
|
+
'channel': channel,
|
|
771
|
+
},
|
|
772
|
+
],
|
|
773
|
+
};
|
|
774
|
+
const url = this.getUrl(channel, 'private');
|
|
775
|
+
const newLiquidations = await this.watchMultiple(url, messageHashes, this.deepExtend(request, params), messageHashes);
|
|
776
|
+
if (this.newUpdates) {
|
|
777
|
+
return newLiquidations;
|
|
778
|
+
}
|
|
779
|
+
return this.filterBySymbolsSinceLimit(this.liquidations, symbols, since, limit, true);
|
|
780
|
+
}
|
|
781
|
+
handleMyLiquidation(client, message) {
|
|
782
|
+
//
|
|
783
|
+
// {
|
|
784
|
+
// "arg": {
|
|
785
|
+
// "channel": "balance_and_position",
|
|
786
|
+
// "uid": "77982378738415879"
|
|
787
|
+
// },
|
|
788
|
+
// "data": [{
|
|
789
|
+
// "pTime": "1597026383085",
|
|
790
|
+
// "eventType": "snapshot",
|
|
791
|
+
// "balData": [{
|
|
792
|
+
// "ccy": "BTC",
|
|
793
|
+
// "cashBal": "1",
|
|
794
|
+
// "uTime": "1597026383085"
|
|
795
|
+
// }],
|
|
796
|
+
// "posData": [{
|
|
797
|
+
// "posId": "1111111111",
|
|
798
|
+
// "tradeId": "2",
|
|
799
|
+
// "instId": "BTC-USD-191018",
|
|
800
|
+
// "instType": "FUTURES",
|
|
801
|
+
// "mgnMode": "cross",
|
|
802
|
+
// "posSide": "long",
|
|
803
|
+
// "pos": "10",
|
|
804
|
+
// "ccy": "BTC",
|
|
805
|
+
// "posCcy": "",
|
|
806
|
+
// "avgPx": "3320",
|
|
807
|
+
// "uTIme": "1597026383085"
|
|
808
|
+
// }],
|
|
809
|
+
// "trades": [{
|
|
810
|
+
// "instId": "BTC-USD-191018",
|
|
811
|
+
// "tradeId": "2",
|
|
812
|
+
// }]
|
|
813
|
+
// }]
|
|
814
|
+
// }
|
|
815
|
+
//
|
|
816
|
+
const rawLiquidations = this.safeList(message, 'data', []);
|
|
817
|
+
for (let i = 0; i < rawLiquidations.length; i++) {
|
|
818
|
+
const rawLiquidation = rawLiquidations[i];
|
|
819
|
+
const eventType = this.safeString(rawLiquidation, 'eventType');
|
|
820
|
+
if (eventType !== 'liquidation') {
|
|
821
|
+
return;
|
|
822
|
+
}
|
|
823
|
+
const liquidation = this.parseWsMyLiquidation(rawLiquidation);
|
|
824
|
+
const symbol = this.safeString(liquidation, 'symbol');
|
|
825
|
+
let liquidations = this.safeValue(this.liquidations, symbol);
|
|
826
|
+
if (liquidations === undefined) {
|
|
827
|
+
const limit = this.safeInteger(this.options, 'myLiquidationsLimit', 1000);
|
|
828
|
+
liquidations = new ArrayCache(limit);
|
|
829
|
+
}
|
|
830
|
+
liquidations.append(liquidation);
|
|
831
|
+
this.liquidations[symbol] = liquidations;
|
|
832
|
+
client.resolve([liquidation], 'myLiquidations');
|
|
833
|
+
client.resolve([liquidation], 'myLiquidations::' + symbol);
|
|
834
|
+
}
|
|
835
|
+
}
|
|
836
|
+
parseWsMyLiquidation(liquidation, market = undefined) {
|
|
837
|
+
//
|
|
838
|
+
// {
|
|
839
|
+
// "pTime": "1597026383085",
|
|
840
|
+
// "eventType": "snapshot",
|
|
841
|
+
// "balData": [{
|
|
842
|
+
// "ccy": "BTC",
|
|
843
|
+
// "cashBal": "1",
|
|
844
|
+
// "uTime": "1597026383085"
|
|
845
|
+
// }],
|
|
846
|
+
// "posData": [{
|
|
847
|
+
// "posId": "1111111111",
|
|
848
|
+
// "tradeId": "2",
|
|
849
|
+
// "instId": "BTC-USD-191018",
|
|
850
|
+
// "instType": "FUTURES",
|
|
851
|
+
// "mgnMode": "cross",
|
|
852
|
+
// "posSide": "long",
|
|
853
|
+
// "pos": "10",
|
|
854
|
+
// "ccy": "BTC",
|
|
855
|
+
// "posCcy": "",
|
|
856
|
+
// "avgPx": "3320",
|
|
857
|
+
// "uTIme": "1597026383085"
|
|
858
|
+
// }],
|
|
859
|
+
// "trades": [{
|
|
860
|
+
// "instId": "BTC-USD-191018",
|
|
861
|
+
// "tradeId": "2",
|
|
862
|
+
// }]
|
|
863
|
+
// }
|
|
864
|
+
//
|
|
865
|
+
const posData = this.safeList(liquidation, 'posData', []);
|
|
866
|
+
const firstPosData = this.safeDict(posData, 0, {});
|
|
867
|
+
const marketId = this.safeString(firstPosData, 'instId');
|
|
868
|
+
market = this.safeMarket(marketId, market);
|
|
869
|
+
const timestamp = this.safeInteger(firstPosData, 'uTIme');
|
|
870
|
+
return this.safeLiquidation({
|
|
871
|
+
'info': liquidation,
|
|
872
|
+
'symbol': this.safeSymbol(marketId, market),
|
|
873
|
+
'contracts': this.safeNumber(firstPosData, 'pos'),
|
|
874
|
+
'contractSize': this.safeNumber(market, 'contractSize'),
|
|
875
|
+
'price': this.safeNumber(liquidation, 'avgPx'),
|
|
876
|
+
'baseValue': undefined,
|
|
877
|
+
'quoteValue': undefined,
|
|
878
|
+
'timestamp': timestamp,
|
|
879
|
+
'datetime': this.iso8601(timestamp),
|
|
880
|
+
});
|
|
881
|
+
}
|
|
882
|
+
parseWsLiquidation(liquidation, market = undefined) {
|
|
883
|
+
//
|
|
884
|
+
// public liquidation
|
|
885
|
+
// {
|
|
886
|
+
// "details": [
|
|
887
|
+
// {
|
|
888
|
+
// "bkLoss": "0",
|
|
889
|
+
// "bkPx": "0.007831",
|
|
890
|
+
// "ccy": "",
|
|
891
|
+
// "posSide": "short",
|
|
892
|
+
// "side": "buy",
|
|
893
|
+
// "sz": "13",
|
|
894
|
+
// "ts": "1692266434010"
|
|
895
|
+
// }
|
|
896
|
+
// ],
|
|
897
|
+
// "instFamily": "IOST-USDT",
|
|
898
|
+
// "instId": "IOST-USDT-SWAP",
|
|
899
|
+
// "instType": "SWAP",
|
|
900
|
+
// "uly": "IOST-USDT"
|
|
901
|
+
// }
|
|
902
|
+
//
|
|
903
|
+
const details = this.safeList(liquidation, 'details', []);
|
|
904
|
+
const liquidationDetails = this.safeDict(details, 0, {});
|
|
905
|
+
const marketId = this.safeString(liquidation, 'instId');
|
|
906
|
+
market = this.safeMarket(marketId, market);
|
|
907
|
+
const timestamp = this.safeInteger(liquidationDetails, 'ts');
|
|
908
|
+
return this.safeLiquidation({
|
|
909
|
+
'info': liquidation,
|
|
910
|
+
'symbol': this.safeSymbol(marketId, market),
|
|
911
|
+
'contracts': this.safeNumber(liquidationDetails, 'sz'),
|
|
912
|
+
'contractSize': this.safeNumber(market, 'contractSize'),
|
|
913
|
+
'price': this.safeNumber(liquidationDetails, 'bkPx'),
|
|
914
|
+
'side': this.safeString(liquidationDetails, 'side'),
|
|
915
|
+
'baseValue': undefined,
|
|
916
|
+
'quoteValue': undefined,
|
|
917
|
+
'timestamp': timestamp,
|
|
918
|
+
'datetime': this.iso8601(timestamp),
|
|
919
|
+
});
|
|
920
|
+
}
|
|
921
|
+
/**
|
|
922
|
+
* @method
|
|
923
|
+
* @name okx#watchOHLCV
|
|
924
|
+
* @description watches historical candlestick data containing the open, high, low, and close price, and the volume of a market
|
|
925
|
+
* @param {string} symbol unified symbol of the market to fetch OHLCV data for
|
|
926
|
+
* @param {string} timeframe the length of time each candle represents
|
|
927
|
+
* @param {int} [since] timestamp in ms of the earliest candle to fetch
|
|
928
|
+
* @param {int} [limit] the maximum amount of candles to fetch
|
|
929
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
930
|
+
* @returns {int[][]} A list of candles ordered as timestamp, open, high, low, close, volume
|
|
931
|
+
*/
|
|
932
|
+
async watchOHLCV(symbol, timeframe = '1m', since = undefined, limit = undefined, params = {}) {
|
|
933
|
+
await this.loadMarkets();
|
|
934
|
+
symbol = this.symbol(symbol);
|
|
935
|
+
const interval = this.safeString(this.timeframes, timeframe, timeframe);
|
|
936
|
+
const name = 'candle' + interval;
|
|
937
|
+
const ohlcv = await this.subscribe('public', name, name, symbol, params);
|
|
938
|
+
if (this.newUpdates) {
|
|
939
|
+
limit = ohlcv.getLimit(symbol, limit);
|
|
940
|
+
}
|
|
941
|
+
return this.filterBySinceLimit(ohlcv, since, limit, 0, true);
|
|
942
|
+
}
|
|
943
|
+
/**
|
|
944
|
+
* @method
|
|
945
|
+
* @name okx#unWatchOHLCV
|
|
946
|
+
* @description watches historical candlestick data containing the open, high, low, and close price, and the volume of a market
|
|
947
|
+
* @param {string} symbol unified symbol of the market to fetch OHLCV data for
|
|
948
|
+
* @param {string} timeframe the length of time each candle represents
|
|
949
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
950
|
+
* @returns {int[][]} A list of candles ordered as timestamp, open, high, low, close, volume
|
|
951
|
+
*/
|
|
952
|
+
async unWatchOHLCV(symbol, timeframe = '1m', params = {}) {
|
|
953
|
+
await this.loadMarkets();
|
|
954
|
+
return await this.unWatchOHLCVForSymbols([[symbol, timeframe]], params);
|
|
955
|
+
}
|
|
956
|
+
/**
|
|
957
|
+
* @method
|
|
958
|
+
* @name okx#watchOHLCVForSymbols
|
|
959
|
+
* @description watches historical candlestick data containing the open, high, low, and close price, and the volume of a market
|
|
960
|
+
* @param {string[][]} symbolsAndTimeframes array of arrays containing unified symbols and timeframes to fetch OHLCV data for, example [['BTC/USDT', '1m'], ['LTC/USDT', '5m']]
|
|
961
|
+
* @param {int} [since] timestamp in ms of the earliest candle to fetch
|
|
962
|
+
* @param {int} [limit] the maximum amount of candles to fetch
|
|
963
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
964
|
+
* @returns {int[][]} A list of candles ordered as timestamp, open, high, low, close, volume
|
|
965
|
+
*/
|
|
966
|
+
async watchOHLCVForSymbols(symbolsAndTimeframes, since = undefined, limit = undefined, params = {}) {
|
|
967
|
+
const symbolsLength = symbolsAndTimeframes.length;
|
|
968
|
+
if (symbolsLength === 0 || !Array.isArray(symbolsAndTimeframes[0])) {
|
|
969
|
+
throw new ArgumentsRequired(this.id + " watchOHLCVForSymbols() requires a an array of symbols and timeframes, like [['BTC/USDT', '1m'], ['LTC/USDT', '5m']]");
|
|
970
|
+
}
|
|
971
|
+
await this.loadMarkets();
|
|
972
|
+
const topics = [];
|
|
973
|
+
const messageHashes = [];
|
|
974
|
+
for (let i = 0; i < symbolsAndTimeframes.length; i++) {
|
|
975
|
+
const symbolAndTimeframe = symbolsAndTimeframes[i];
|
|
976
|
+
const sym = symbolAndTimeframe[0];
|
|
977
|
+
const tf = symbolAndTimeframe[1];
|
|
978
|
+
const marketId = this.marketId(sym);
|
|
979
|
+
const interval = this.safeString(this.timeframes, tf, tf);
|
|
980
|
+
const channel = 'candle' + interval;
|
|
981
|
+
const topic = {
|
|
982
|
+
'channel': channel,
|
|
983
|
+
'instId': marketId,
|
|
984
|
+
};
|
|
985
|
+
topics.push(topic);
|
|
986
|
+
messageHashes.push('multi:' + channel + ':' + sym);
|
|
987
|
+
}
|
|
988
|
+
const request = {
|
|
989
|
+
'op': 'subscribe',
|
|
990
|
+
'args': topics,
|
|
991
|
+
};
|
|
992
|
+
const url = this.getUrl('candle', 'public');
|
|
993
|
+
const [symbol, timeframe, candles] = await this.watchMultiple(url, messageHashes, request, messageHashes);
|
|
994
|
+
if (this.newUpdates) {
|
|
995
|
+
limit = candles.getLimit(symbol, limit);
|
|
996
|
+
}
|
|
997
|
+
const filtered = this.filterBySinceLimit(candles, since, limit, 0, true);
|
|
998
|
+
return this.createOHLCVObject(symbol, timeframe, filtered);
|
|
999
|
+
}
|
|
1000
|
+
/**
|
|
1001
|
+
* @method
|
|
1002
|
+
* @name okx#unWatchOHLCVForSymbols
|
|
1003
|
+
* @description unWatches historical candlestick data containing the open, high, low, and close price, and the volume of a market
|
|
1004
|
+
* @param {string[][]} symbolsAndTimeframes array of arrays containing unified symbols and timeframes to fetch OHLCV data for, example [['BTC/USDT', '1m'], ['LTC/USDT', '5m']]
|
|
1005
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
1006
|
+
* @returns {int[][]} A list of candles ordered as timestamp, open, high, low, close, volume
|
|
1007
|
+
*/
|
|
1008
|
+
async unWatchOHLCVForSymbols(symbolsAndTimeframes, params = {}) {
|
|
1009
|
+
const symbolsLength = symbolsAndTimeframes.length;
|
|
1010
|
+
if (symbolsLength === 0 || !Array.isArray(symbolsAndTimeframes[0])) {
|
|
1011
|
+
throw new ArgumentsRequired(this.id + " watchOHLCVForSymbols() requires a an array of symbols and timeframes, like [['BTC/USDT', '1m'], ['LTC/USDT', '5m']]");
|
|
1012
|
+
}
|
|
1013
|
+
await this.loadMarkets();
|
|
1014
|
+
const topics = [];
|
|
1015
|
+
const messageHashes = [];
|
|
1016
|
+
for (let i = 0; i < symbolsAndTimeframes.length; i++) {
|
|
1017
|
+
const symbolAndTimeframe = symbolsAndTimeframes[i];
|
|
1018
|
+
const sym = symbolAndTimeframe[0];
|
|
1019
|
+
const tf = symbolAndTimeframe[1];
|
|
1020
|
+
const marketId = this.marketId(sym);
|
|
1021
|
+
const interval = this.safeString(this.timeframes, tf, tf);
|
|
1022
|
+
const channel = 'candle' + interval;
|
|
1023
|
+
const topic = {
|
|
1024
|
+
'channel': channel,
|
|
1025
|
+
'instId': marketId,
|
|
1026
|
+
};
|
|
1027
|
+
topics.push(topic);
|
|
1028
|
+
messageHashes.push('unsubscribe:multi:' + channel + ':' + sym);
|
|
1029
|
+
}
|
|
1030
|
+
const request = {
|
|
1031
|
+
'op': 'unsubscribe',
|
|
1032
|
+
'args': topics,
|
|
1033
|
+
};
|
|
1034
|
+
const url = this.getUrl('candle', 'public');
|
|
1035
|
+
return await this.watchMultiple(url, messageHashes, request, messageHashes);
|
|
1036
|
+
}
|
|
1037
|
+
handleOHLCV(client, message) {
|
|
1038
|
+
//
|
|
1039
|
+
// {
|
|
1040
|
+
// "arg": { channel: "candle1m", instId: "BTC-USDT" },
|
|
1041
|
+
// "data": [
|
|
1042
|
+
// [
|
|
1043
|
+
// "1626690720000",
|
|
1044
|
+
// "31334",
|
|
1045
|
+
// "31334",
|
|
1046
|
+
// "31334",
|
|
1047
|
+
// "31334",
|
|
1048
|
+
// "0.0077",
|
|
1049
|
+
// "241.2718"
|
|
1050
|
+
// ]
|
|
1051
|
+
// ]
|
|
1052
|
+
// }
|
|
1053
|
+
//
|
|
1054
|
+
const arg = this.safeValue(message, 'arg', {});
|
|
1055
|
+
const channel = this.safeString(arg, 'channel');
|
|
1056
|
+
const data = this.safeValue(message, 'data', []);
|
|
1057
|
+
const marketId = this.safeString(arg, 'instId');
|
|
1058
|
+
const market = this.safeMarket(marketId);
|
|
1059
|
+
const symbol = market['symbol'];
|
|
1060
|
+
const interval = channel.replace('candle', '');
|
|
1061
|
+
// use a reverse lookup in a static map instead
|
|
1062
|
+
const timeframe = this.findTimeframe(interval);
|
|
1063
|
+
for (let i = 0; i < data.length; i++) {
|
|
1064
|
+
const parsed = this.parseOHLCV(data[i], market);
|
|
1065
|
+
this.ohlcvs[symbol] = this.safeValue(this.ohlcvs, symbol, {});
|
|
1066
|
+
let stored = this.safeValue(this.ohlcvs[symbol], timeframe);
|
|
1067
|
+
if (stored === undefined) {
|
|
1068
|
+
const limit = this.safeInteger(this.options, 'OHLCVLimit', 1000);
|
|
1069
|
+
stored = new ArrayCacheByTimestamp(limit);
|
|
1070
|
+
this.ohlcvs[symbol][timeframe] = stored;
|
|
1071
|
+
}
|
|
1072
|
+
stored.append(parsed);
|
|
1073
|
+
const messageHash = channel + ':' + market['id'];
|
|
1074
|
+
client.resolve(stored, messageHash);
|
|
1075
|
+
// for multiOHLCV we need special object, as opposed to other "multi"
|
|
1076
|
+
// methods, because OHLCV response item does not contain symbol
|
|
1077
|
+
// or timeframe, thus otherwise it would be unrecognizable
|
|
1078
|
+
const messageHashForMulti = 'multi:' + channel + ':' + symbol;
|
|
1079
|
+
client.resolve([symbol, timeframe, stored], messageHashForMulti);
|
|
1080
|
+
}
|
|
1081
|
+
}
|
|
1082
|
+
/**
|
|
1083
|
+
* @method
|
|
1084
|
+
* @name okx#watchOrderBook
|
|
1085
|
+
* @see https://www.okx.com/docs-v5/en/#order-book-trading-market-data-ws-order-book-channel
|
|
1086
|
+
* @description watches information on open orders with bid (buy) and ask (sell) prices, volumes and other data
|
|
1087
|
+
* @param {string} symbol unified symbol of the market to fetch the order book for
|
|
1088
|
+
* @param {int} [limit] the maximum amount of order book entries to return
|
|
1089
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
1090
|
+
* @param {string} [params.depth] okx order book depth, can be books, books5, books-l2-tbt, books50-l2-tbt, bbo-tbt
|
|
1091
|
+
* @returns {object} A dictionary of [order book structures]{@link https://docs.ccxt.com/#/?id=order-book-structure} indexed by market symbols
|
|
1092
|
+
*/
|
|
1093
|
+
async watchOrderBook(symbol, limit = undefined, params = {}) {
|
|
1094
|
+
//
|
|
1095
|
+
// bbo-tbt
|
|
1096
|
+
// 1. Newly added channel that sends tick-by-tick Level 1 data
|
|
1097
|
+
// 2. All API users can subscribe
|
|
1098
|
+
// 3. Public depth channel, verification not required
|
|
1099
|
+
//
|
|
1100
|
+
// books-l2-tbt
|
|
1101
|
+
// 1. Only users who're VIP5 and above can subscribe
|
|
1102
|
+
// 2. Identity verification required before subscription
|
|
1103
|
+
//
|
|
1104
|
+
// books50-l2-tbt
|
|
1105
|
+
// 1. Only users who're VIP4 and above can subscribe
|
|
1106
|
+
// 2. Identity verification required before subscription
|
|
1107
|
+
//
|
|
1108
|
+
// books
|
|
1109
|
+
// 1. All API users can subscribe
|
|
1110
|
+
// 2. Public depth channel, verification not required
|
|
1111
|
+
//
|
|
1112
|
+
// books5
|
|
1113
|
+
// 1. All API users can subscribe
|
|
1114
|
+
// 2. Public depth channel, verification not required
|
|
1115
|
+
// 3. Data feeds will be delivered every 100ms (vs. every 200ms now)
|
|
1116
|
+
//
|
|
1117
|
+
return await this.watchOrderBookForSymbols([symbol], limit, params);
|
|
1118
|
+
}
|
|
1119
|
+
/**
|
|
1120
|
+
* @method
|
|
1121
|
+
* @name okx#watchOrderBookForSymbols
|
|
1122
|
+
* @see https://www.okx.com/docs-v5/en/#order-book-trading-market-data-ws-order-book-channel
|
|
1123
|
+
* @description watches information on open orders with bid (buy) and ask (sell) prices, volumes and other data
|
|
1124
|
+
* @param {string[]} symbols unified array of symbols
|
|
1125
|
+
* @param {int} [limit] 1,5, 400, 50 (l2-tbt, vip4+) or 40000 (vip5+) the maximum amount of order book entries to return
|
|
1126
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
1127
|
+
* @param {string} [params.depth] okx order book depth, can be books, books5, books-l2-tbt, books50-l2-tbt, bbo-tbt
|
|
1128
|
+
* @returns {object} A dictionary of [order book structures]{@link https://docs.ccxt.com/#/?id=order-book-structure} indexed by market symbols
|
|
1129
|
+
*/
|
|
1130
|
+
async watchOrderBookForSymbols(symbols, limit = undefined, params = {}) {
|
|
1131
|
+
await this.loadMarkets();
|
|
1132
|
+
symbols = this.marketSymbols(symbols);
|
|
1133
|
+
let depth = undefined;
|
|
1134
|
+
[depth, params] = this.handleOptionAndParams(params, 'watchOrderBook', 'depth', 'books');
|
|
1135
|
+
if (limit !== undefined) {
|
|
1136
|
+
if (limit === 1) {
|
|
1137
|
+
depth = 'bbo-tbt';
|
|
1138
|
+
}
|
|
1139
|
+
else if (limit > 1 && limit <= 5) {
|
|
1140
|
+
depth = 'books5';
|
|
1141
|
+
}
|
|
1142
|
+
else if (limit === 50) {
|
|
1143
|
+
depth = 'books50-l2-tbt'; // Make sure you have VIP4 and above
|
|
1144
|
+
}
|
|
1145
|
+
else if (limit === 400) {
|
|
1146
|
+
depth = 'books';
|
|
1147
|
+
}
|
|
1148
|
+
}
|
|
1149
|
+
if ((depth === 'books-l2-tbt') || (depth === 'books50-l2-tbt')) {
|
|
1150
|
+
if (!this.checkRequiredCredentials(false)) {
|
|
1151
|
+
throw new AuthenticationError(this.id + ' watchOrderBook/watchOrderBookForSymbols requires authentication for this depth. Add credentials or change the depth option to books or books5');
|
|
1152
|
+
}
|
|
1153
|
+
await this.authenticate({ 'access': 'public' });
|
|
1154
|
+
}
|
|
1155
|
+
const topics = [];
|
|
1156
|
+
const messageHashes = [];
|
|
1157
|
+
for (let i = 0; i < symbols.length; i++) {
|
|
1158
|
+
const symbol = symbols[i];
|
|
1159
|
+
messageHashes.push(depth + ':' + symbol);
|
|
1160
|
+
const marketId = this.marketId(symbol);
|
|
1161
|
+
const topic = {
|
|
1162
|
+
'channel': depth,
|
|
1163
|
+
'instId': marketId,
|
|
1164
|
+
};
|
|
1165
|
+
topics.push(topic);
|
|
1166
|
+
}
|
|
1167
|
+
const request = {
|
|
1168
|
+
'op': 'subscribe',
|
|
1169
|
+
'args': topics,
|
|
1170
|
+
};
|
|
1171
|
+
const url = this.getUrl(depth, 'public');
|
|
1172
|
+
const orderbook = await this.watchMultiple(url, messageHashes, request, messageHashes);
|
|
1173
|
+
return orderbook.limit();
|
|
1174
|
+
}
|
|
1175
|
+
/**
|
|
1176
|
+
* @method
|
|
1177
|
+
* @name okx#unWatchOrderBookForSymbols
|
|
1178
|
+
* @see https://www.okx.com/docs-v5/en/#order-book-trading-market-data-ws-order-book-channel
|
|
1179
|
+
* @description unWatches information on open orders with bid (buy) and ask (sell) prices, volumes and other data
|
|
1180
|
+
* @param {string[]} symbols unified array of symbols
|
|
1181
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
1182
|
+
* @param {int} [params.limit] the maximum amount of order book entries to return
|
|
1183
|
+
* @param {string} [params.depth] okx order book depth, can be books, books5, books-l2-tbt, books50-l2-tbt, bbo-tbt
|
|
1184
|
+
* @returns {object} A dictionary of [order book structures]{@link https://docs.ccxt.com/#/?id=order-book-structure} indexed by market symbols
|
|
1185
|
+
*/
|
|
1186
|
+
async unWatchOrderBookForSymbols(symbols, params = {}) {
|
|
1187
|
+
await this.loadMarkets();
|
|
1188
|
+
symbols = this.marketSymbols(symbols, undefined, false);
|
|
1189
|
+
let depth = undefined;
|
|
1190
|
+
[depth, params] = this.handleOptionAndParams(params, 'watchOrderBook', 'depth', 'books');
|
|
1191
|
+
const limit = this.safeInteger(params, 'limit');
|
|
1192
|
+
if (limit !== undefined) {
|
|
1193
|
+
if (limit === 1) {
|
|
1194
|
+
depth = 'bbo-tbt';
|
|
1195
|
+
}
|
|
1196
|
+
else if (limit > 1 && limit <= 5) {
|
|
1197
|
+
depth = 'books5';
|
|
1198
|
+
}
|
|
1199
|
+
else if (limit === 50) {
|
|
1200
|
+
depth = 'books50-l2-tbt'; // Make sure you have VIP4 and above
|
|
1201
|
+
}
|
|
1202
|
+
else if (limit === 400) {
|
|
1203
|
+
depth = 'books';
|
|
1204
|
+
}
|
|
1205
|
+
}
|
|
1206
|
+
const topics = [];
|
|
1207
|
+
const subMessageHashes = [];
|
|
1208
|
+
const messageHashes = [];
|
|
1209
|
+
for (let i = 0; i < symbols.length; i++) {
|
|
1210
|
+
const symbol = symbols[i];
|
|
1211
|
+
subMessageHashes.push(depth + ':' + symbol);
|
|
1212
|
+
messageHashes.push('unsubscribe:orderbook:' + symbol);
|
|
1213
|
+
const marketId = this.marketId(symbol);
|
|
1214
|
+
const topic = {
|
|
1215
|
+
'channel': depth,
|
|
1216
|
+
'instId': marketId,
|
|
1217
|
+
};
|
|
1218
|
+
topics.push(topic);
|
|
1219
|
+
}
|
|
1220
|
+
const request = {
|
|
1221
|
+
'op': 'unsubscribe',
|
|
1222
|
+
'args': topics,
|
|
1223
|
+
};
|
|
1224
|
+
const url = this.getUrl(depth, 'public');
|
|
1225
|
+
return await this.watchMultiple(url, messageHashes, request, messageHashes);
|
|
1226
|
+
}
|
|
1227
|
+
/**
|
|
1228
|
+
* @method
|
|
1229
|
+
* @name okx#unWatchOrderBook
|
|
1230
|
+
* @see https://www.okx.com/docs-v5/en/#order-book-trading-market-data-ws-order-book-channel
|
|
1231
|
+
* @description unWatches information on open orders with bid (buy) and ask (sell) prices, volumes and other data
|
|
1232
|
+
* @param {string} symbol unified array of symbols
|
|
1233
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
1234
|
+
* @param {int} [params.limit] the maximum amount of order book entries to return
|
|
1235
|
+
* @param {string} [params.depth] okx order book depth, can be books, books5, books-l2-tbt, books50-l2-tbt, bbo-tbt
|
|
1236
|
+
* @returns {object} A dictionary of [order book structures]{@link https://docs.ccxt.com/#/?id=order-book-structure} indexed by market symbols
|
|
1237
|
+
*/
|
|
1238
|
+
async unWatchOrderBook(symbol, params = {}) {
|
|
1239
|
+
return await this.unWatchOrderBookForSymbols([symbol], params);
|
|
1240
|
+
}
|
|
1241
|
+
handleDelta(bookside, delta) {
|
|
1242
|
+
//
|
|
1243
|
+
// [
|
|
1244
|
+
// "31685", // price
|
|
1245
|
+
// "0.78069158", // amount
|
|
1246
|
+
// "0", // liquidated orders
|
|
1247
|
+
// "17" // orders
|
|
1248
|
+
// ]
|
|
1249
|
+
//
|
|
1250
|
+
const price = this.safeFloat(delta, 0);
|
|
1251
|
+
const amount = this.safeFloat(delta, 1);
|
|
1252
|
+
bookside.store(price, amount);
|
|
1253
|
+
}
|
|
1254
|
+
handleDeltas(bookside, deltas) {
|
|
1255
|
+
for (let i = 0; i < deltas.length; i++) {
|
|
1256
|
+
this.handleDelta(bookside, deltas[i]);
|
|
1257
|
+
}
|
|
1258
|
+
}
|
|
1259
|
+
handleOrderBookMessage(client, message, orderbook, messageHash, market = undefined) {
|
|
1260
|
+
//
|
|
1261
|
+
// {
|
|
1262
|
+
// "asks": [
|
|
1263
|
+
// [ '31738.3', '0.05973179', "0", "3" ],
|
|
1264
|
+
// [ '31738.5', '0.11035404', "0", "2" ],
|
|
1265
|
+
// [ '31739.6', '0.01', "0", "1" ],
|
|
1266
|
+
// ],
|
|
1267
|
+
// "bids": [
|
|
1268
|
+
// [ '31738.2', '0.67557666', "0", "9" ],
|
|
1269
|
+
// [ '31738', '0.02466947', "0", "2" ],
|
|
1270
|
+
// [ '31736.3', '0.01705046', "0", "2" ],
|
|
1271
|
+
// ],
|
|
1272
|
+
// "instId": "BTC-USDT",
|
|
1273
|
+
// "ts": "1626537446491"
|
|
1274
|
+
// "checksum": -855196043,
|
|
1275
|
+
// "prevSeqId": 123456,
|
|
1276
|
+
// "seqId": 123457
|
|
1277
|
+
// }
|
|
1278
|
+
//
|
|
1279
|
+
const asks = this.safeValue(message, 'asks', []);
|
|
1280
|
+
const bids = this.safeValue(message, 'bids', []);
|
|
1281
|
+
const storedAsks = orderbook['asks'];
|
|
1282
|
+
const storedBids = orderbook['bids'];
|
|
1283
|
+
this.handleDeltas(storedAsks, asks);
|
|
1284
|
+
this.handleDeltas(storedBids, bids);
|
|
1285
|
+
const marketId = this.safeString(message, 'instId');
|
|
1286
|
+
const symbol = this.safeSymbol(marketId, market);
|
|
1287
|
+
const checksum = this.handleOption('watchOrderBook', 'checksum', true);
|
|
1288
|
+
const seqId = this.safeInteger(message, 'seqId');
|
|
1289
|
+
if (checksum) {
|
|
1290
|
+
const prevSeqId = this.safeInteger(message, 'prevSeqId');
|
|
1291
|
+
const nonce = orderbook['nonce'];
|
|
1292
|
+
const asksLength = storedAsks.length;
|
|
1293
|
+
const bidsLength = storedBids.length;
|
|
1294
|
+
const payloadArray = [];
|
|
1295
|
+
for (let i = 0; i < 25; i++) {
|
|
1296
|
+
if (i < bidsLength) {
|
|
1297
|
+
payloadArray.push(this.numberToString(storedBids[i][0]));
|
|
1298
|
+
payloadArray.push(this.numberToString(storedBids[i][1]));
|
|
1299
|
+
}
|
|
1300
|
+
if (i < asksLength) {
|
|
1301
|
+
payloadArray.push(this.numberToString(storedAsks[i][0]));
|
|
1302
|
+
payloadArray.push(this.numberToString(storedAsks[i][1]));
|
|
1303
|
+
}
|
|
1304
|
+
}
|
|
1305
|
+
const payload = payloadArray.join(':');
|
|
1306
|
+
const responseChecksum = this.safeInteger(message, 'checksum');
|
|
1307
|
+
const localChecksum = this.crc32(payload, true);
|
|
1308
|
+
let error = undefined;
|
|
1309
|
+
if (prevSeqId !== -1 && nonce !== prevSeqId) {
|
|
1310
|
+
error = new InvalidNonce(this.id + ' watchOrderBook received invalid nonce');
|
|
1311
|
+
}
|
|
1312
|
+
if (responseChecksum !== localChecksum) {
|
|
1313
|
+
error = new ChecksumError(this.id + ' ' + this.orderbookChecksumMessage(symbol));
|
|
1314
|
+
}
|
|
1315
|
+
if (error !== undefined) {
|
|
1316
|
+
delete client.subscriptions[messageHash];
|
|
1317
|
+
delete this.orderbooks[symbol];
|
|
1318
|
+
client.reject(error, messageHash);
|
|
1319
|
+
}
|
|
1320
|
+
}
|
|
1321
|
+
const timestamp = this.safeInteger(message, 'ts');
|
|
1322
|
+
orderbook['nonce'] = seqId;
|
|
1323
|
+
orderbook['timestamp'] = timestamp;
|
|
1324
|
+
orderbook['datetime'] = this.iso8601(timestamp);
|
|
1325
|
+
return orderbook;
|
|
1326
|
+
}
|
|
1327
|
+
handleOrderBook(client, message) {
|
|
1328
|
+
//
|
|
1329
|
+
// snapshot
|
|
1330
|
+
//
|
|
1331
|
+
// {
|
|
1332
|
+
// "arg": { channel: 'books-l2-tbt', instId: "BTC-USDT" },
|
|
1333
|
+
// "action": "snapshot",
|
|
1334
|
+
// "data": [
|
|
1335
|
+
// {
|
|
1336
|
+
// "asks": [
|
|
1337
|
+
// [ '31685', '0.78069158', "0", "17" ],
|
|
1338
|
+
// [ '31685.1', '0.0001', "0", "1" ],
|
|
1339
|
+
// [ '31685.6', '0.04543165', "0", "1" ],
|
|
1340
|
+
// ],
|
|
1341
|
+
// "bids": [
|
|
1342
|
+
// [ '31684.9', '0.01', "0", "1" ],
|
|
1343
|
+
// [ '31682.9', '0.0001', "0", "1" ],
|
|
1344
|
+
// [ '31680.7', '0.01', "0", "1" ],
|
|
1345
|
+
// ],
|
|
1346
|
+
// "ts": "1626532416403",
|
|
1347
|
+
// "checksum": -1023440116
|
|
1348
|
+
// }
|
|
1349
|
+
// ]
|
|
1350
|
+
// }
|
|
1351
|
+
//
|
|
1352
|
+
// update
|
|
1353
|
+
//
|
|
1354
|
+
// {
|
|
1355
|
+
// "arg": { channel: 'books-l2-tbt', instId: "BTC-USDT" },
|
|
1356
|
+
// "action": "update",
|
|
1357
|
+
// "data": [
|
|
1358
|
+
// {
|
|
1359
|
+
// "asks": [
|
|
1360
|
+
// [ '31657.7', '0', "0", "0" ],
|
|
1361
|
+
// [ '31659.7', '0.01', "0", "1" ],
|
|
1362
|
+
// [ '31987.3', '0.01', "0", "1" ]
|
|
1363
|
+
// ],
|
|
1364
|
+
// "bids": [
|
|
1365
|
+
// [ '31642.9', '0.50296385', "0", "4" ],
|
|
1366
|
+
// [ '31639.9', '0', "0", "0" ],
|
|
1367
|
+
// [ '31638.7', '0.01', "0", "1" ],
|
|
1368
|
+
// ],
|
|
1369
|
+
// "ts": "1626535709008",
|
|
1370
|
+
// "checksum": 830931827
|
|
1371
|
+
// }
|
|
1372
|
+
// ]
|
|
1373
|
+
// }
|
|
1374
|
+
//
|
|
1375
|
+
// books5
|
|
1376
|
+
//
|
|
1377
|
+
// {
|
|
1378
|
+
// "arg": { channel: "books5", instId: "BTC-USDT" },
|
|
1379
|
+
// "data": [
|
|
1380
|
+
// {
|
|
1381
|
+
// "asks": [
|
|
1382
|
+
// [ '31738.3', '0.05973179', "0", "3" ],
|
|
1383
|
+
// [ '31738.5', '0.11035404', "0", "2" ],
|
|
1384
|
+
// [ '31739.6', '0.01', "0", "1" ],
|
|
1385
|
+
// ],
|
|
1386
|
+
// "bids": [
|
|
1387
|
+
// [ '31738.2', '0.67557666', "0", "9" ],
|
|
1388
|
+
// [ '31738', '0.02466947', "0", "2" ],
|
|
1389
|
+
// [ '31736.3', '0.01705046', "0", "2" ],
|
|
1390
|
+
// ],
|
|
1391
|
+
// "instId": "BTC-USDT",
|
|
1392
|
+
// "ts": "1626537446491"
|
|
1393
|
+
// }
|
|
1394
|
+
// ]
|
|
1395
|
+
// }
|
|
1396
|
+
//
|
|
1397
|
+
// bbo-tbt
|
|
1398
|
+
//
|
|
1399
|
+
// {
|
|
1400
|
+
// "arg":{
|
|
1401
|
+
// "channel":"bbo-tbt",
|
|
1402
|
+
// "instId":"BTC-USDT"
|
|
1403
|
+
// },
|
|
1404
|
+
// "data":[
|
|
1405
|
+
// {
|
|
1406
|
+
// "asks":[["36232.2","1.8826134","0","17"]],
|
|
1407
|
+
// "bids":[["36232.1","0.00572212","0","2"]],
|
|
1408
|
+
// "ts":"1651826598363"
|
|
1409
|
+
// }
|
|
1410
|
+
// ]
|
|
1411
|
+
// }
|
|
1412
|
+
//
|
|
1413
|
+
const arg = this.safeDict(message, 'arg', {});
|
|
1414
|
+
const channel = this.safeString(arg, 'channel');
|
|
1415
|
+
const action = this.safeString(message, 'action');
|
|
1416
|
+
const data = this.safeList(message, 'data', []);
|
|
1417
|
+
const marketId = this.safeString(arg, 'instId');
|
|
1418
|
+
const market = this.safeMarket(marketId);
|
|
1419
|
+
const symbol = market['symbol'];
|
|
1420
|
+
const depths = {
|
|
1421
|
+
'bbo-tbt': 1,
|
|
1422
|
+
'books': 400,
|
|
1423
|
+
'books5': 5,
|
|
1424
|
+
'books-l2-tbt': 400,
|
|
1425
|
+
'books50-l2-tbt': 50,
|
|
1426
|
+
};
|
|
1427
|
+
const limit = this.safeInteger(depths, channel);
|
|
1428
|
+
const messageHash = channel + ':' + symbol;
|
|
1429
|
+
if (action === 'snapshot') {
|
|
1430
|
+
for (let i = 0; i < data.length; i++) {
|
|
1431
|
+
const update = data[i];
|
|
1432
|
+
const orderbook = this.orderBook({}, limit);
|
|
1433
|
+
this.orderbooks[symbol] = orderbook;
|
|
1434
|
+
orderbook['symbol'] = symbol;
|
|
1435
|
+
this.handleOrderBookMessage(client, update, orderbook, messageHash);
|
|
1436
|
+
client.resolve(orderbook, messageHash);
|
|
1437
|
+
}
|
|
1438
|
+
}
|
|
1439
|
+
else if (action === 'update') {
|
|
1440
|
+
if (symbol in this.orderbooks) {
|
|
1441
|
+
const orderbook = this.orderbooks[symbol];
|
|
1442
|
+
for (let i = 0; i < data.length; i++) {
|
|
1443
|
+
const update = data[i];
|
|
1444
|
+
this.handleOrderBookMessage(client, update, orderbook, messageHash, market);
|
|
1445
|
+
client.resolve(orderbook, messageHash);
|
|
1446
|
+
}
|
|
1447
|
+
}
|
|
1448
|
+
}
|
|
1449
|
+
else if ((channel === 'books5') || (channel === 'bbo-tbt')) {
|
|
1450
|
+
if (!(symbol in this.orderbooks)) {
|
|
1451
|
+
this.orderbooks[symbol] = this.orderBook({}, limit);
|
|
1452
|
+
}
|
|
1453
|
+
const orderbook = this.orderbooks[symbol];
|
|
1454
|
+
for (let i = 0; i < data.length; i++) {
|
|
1455
|
+
const update = data[i];
|
|
1456
|
+
const timestamp = this.safeInteger(update, 'ts');
|
|
1457
|
+
const snapshot = this.parseOrderBook(update, symbol, timestamp, 'bids', 'asks', 0, 1);
|
|
1458
|
+
orderbook.reset(snapshot);
|
|
1459
|
+
client.resolve(orderbook, messageHash);
|
|
1460
|
+
}
|
|
1461
|
+
}
|
|
1462
|
+
return message;
|
|
1463
|
+
}
|
|
1464
|
+
async authenticate(params = {}) {
|
|
1465
|
+
this.checkRequiredCredentials();
|
|
1466
|
+
const access = this.safeString(params, 'access', 'private');
|
|
1467
|
+
params = this.omit(params, ['access']);
|
|
1468
|
+
const url = this.getUrl('users', access);
|
|
1469
|
+
const messageHash = 'authenticated';
|
|
1470
|
+
const client = this.client(url);
|
|
1471
|
+
const future = client.future(messageHash);
|
|
1472
|
+
const authenticated = this.safeValue(client.subscriptions, messageHash);
|
|
1473
|
+
if (authenticated === undefined) {
|
|
1474
|
+
const timestamp = this.seconds().toString();
|
|
1475
|
+
const method = 'GET';
|
|
1476
|
+
const path = '/users/self/verify';
|
|
1477
|
+
const auth = timestamp + method + path;
|
|
1478
|
+
const signature = this.hmac(this.encode(auth), this.encode(this.secret), sha256, 'base64');
|
|
1479
|
+
const operation = 'login';
|
|
1480
|
+
const request = {
|
|
1481
|
+
'op': operation,
|
|
1482
|
+
'args': [
|
|
1483
|
+
{
|
|
1484
|
+
'apiKey': this.apiKey,
|
|
1485
|
+
'passphrase': this.password,
|
|
1486
|
+
'timestamp': timestamp,
|
|
1487
|
+
'sign': signature,
|
|
1488
|
+
},
|
|
1489
|
+
],
|
|
1490
|
+
};
|
|
1491
|
+
// Only add params['access'] to prevent sending custom parameters, such as extraParams.
|
|
1492
|
+
if ('access' in params) {
|
|
1493
|
+
request['access'] = params['access'];
|
|
1494
|
+
}
|
|
1495
|
+
this.watch(url, messageHash, request, messageHash);
|
|
1496
|
+
}
|
|
1497
|
+
return await future;
|
|
1498
|
+
}
|
|
1499
|
+
/**
|
|
1500
|
+
* @method
|
|
1501
|
+
* @name okx#watchBalance
|
|
1502
|
+
* @description watch balance and get the amount of funds available for trading or funds locked in orders
|
|
1503
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
1504
|
+
* @returns {object} a [balance structure]{@link https://docs.ccxt.com/#/?id=balance-structure}
|
|
1505
|
+
*/
|
|
1506
|
+
async watchBalance(params = {}) {
|
|
1507
|
+
await this.loadMarkets();
|
|
1508
|
+
await this.authenticate();
|
|
1509
|
+
return await this.subscribe('private', 'account', 'account', undefined, params);
|
|
1510
|
+
}
|
|
1511
|
+
handleBalanceAndPosition(client, message) {
|
|
1512
|
+
this.handleMyLiquidation(client, message);
|
|
1513
|
+
}
|
|
1514
|
+
handleBalance(client, message) {
|
|
1515
|
+
//
|
|
1516
|
+
// {
|
|
1517
|
+
// "arg": { channel: "account" },
|
|
1518
|
+
// "data": [
|
|
1519
|
+
// {
|
|
1520
|
+
// "adjEq": '',
|
|
1521
|
+
// "details": [
|
|
1522
|
+
// {
|
|
1523
|
+
// "availBal": '',
|
|
1524
|
+
// "availEq": "8.21009913",
|
|
1525
|
+
// "cashBal": "8.21009913",
|
|
1526
|
+
// "ccy": "USDT",
|
|
1527
|
+
// "coinUsdPrice": "0.99994",
|
|
1528
|
+
// "crossLiab": '',
|
|
1529
|
+
// "disEq": "8.2096065240522",
|
|
1530
|
+
// "eq": "8.21009913",
|
|
1531
|
+
// "eqUsd": "8.2096065240522",
|
|
1532
|
+
// "frozenBal": "0",
|
|
1533
|
+
// "interest": '',
|
|
1534
|
+
// "isoEq": "0",
|
|
1535
|
+
// "isoLiab": '',
|
|
1536
|
+
// "liab": '',
|
|
1537
|
+
// "maxLoan": '',
|
|
1538
|
+
// "mgnRatio": '',
|
|
1539
|
+
// "notionalLever": "0",
|
|
1540
|
+
// "ordFrozen": "0",
|
|
1541
|
+
// "twap": "0",
|
|
1542
|
+
// "uTime": "1621927314996",
|
|
1543
|
+
// "upl": "0"
|
|
1544
|
+
// },
|
|
1545
|
+
// ],
|
|
1546
|
+
// "imr": '',
|
|
1547
|
+
// "isoEq": "0",
|
|
1548
|
+
// "mgnRatio": '',
|
|
1549
|
+
// "mmr": '',
|
|
1550
|
+
// "notionalUsd": '',
|
|
1551
|
+
// "ordFroz": '',
|
|
1552
|
+
// "totalEq": "22.1930992296832",
|
|
1553
|
+
// "uTime": "1626692120916"
|
|
1554
|
+
// }
|
|
1555
|
+
// ]
|
|
1556
|
+
// }
|
|
1557
|
+
//
|
|
1558
|
+
const arg = this.safeValue(message, 'arg', {});
|
|
1559
|
+
const channel = this.safeString(arg, 'channel');
|
|
1560
|
+
const type = 'spot';
|
|
1561
|
+
const balance = this.parseTradingBalance(message);
|
|
1562
|
+
const oldBalance = this.safeValue(this.balance, type, {});
|
|
1563
|
+
const newBalance = this.deepExtend(oldBalance, balance);
|
|
1564
|
+
this.balance[type] = this.safeBalance(newBalance);
|
|
1565
|
+
client.resolve(this.balance[type], channel);
|
|
1566
|
+
}
|
|
1567
|
+
orderToTrade(order, market = undefined) {
|
|
1568
|
+
const info = this.safeValue(order, 'info', {});
|
|
1569
|
+
const timestamp = this.safeInteger(info, 'fillTime');
|
|
1570
|
+
const feeMarketId = this.safeString(info, 'fillFeeCcy');
|
|
1571
|
+
const isTaker = this.safeString(info, 'execType', '') === 'T';
|
|
1572
|
+
return this.safeTrade({
|
|
1573
|
+
'info': info,
|
|
1574
|
+
'timestamp': timestamp,
|
|
1575
|
+
'datetime': this.iso8601(timestamp),
|
|
1576
|
+
'symbol': this.safeString(order, 'symbol'),
|
|
1577
|
+
'id': this.safeString(info, 'tradeId'),
|
|
1578
|
+
'order': this.safeString(order, 'id'),
|
|
1579
|
+
'type': this.safeString(order, 'type'),
|
|
1580
|
+
'takerOrMaker': (isTaker) ? 'taker' : 'maker',
|
|
1581
|
+
'side': this.safeString(order, 'side'),
|
|
1582
|
+
'price': this.safeNumber(info, 'fillPx'),
|
|
1583
|
+
'amount': this.safeNumber(info, 'fillSz'),
|
|
1584
|
+
'cost': this.safeNumber(order, 'cost'),
|
|
1585
|
+
'fee': {
|
|
1586
|
+
'cost': this.safeNumber(info, 'fillFee'),
|
|
1587
|
+
'currency': this.safeCurrencyCode(feeMarketId),
|
|
1588
|
+
},
|
|
1589
|
+
}, market);
|
|
1590
|
+
}
|
|
1591
|
+
/**
|
|
1592
|
+
* @method
|
|
1593
|
+
* @name okx#watchMyTrades
|
|
1594
|
+
* @description watches information on multiple trades made by the user
|
|
1595
|
+
* @see https://www.okx.com/docs-v5/en/#order-book-trading-trade-ws-order-channel
|
|
1596
|
+
* @param {string} [symbol] unified market symbol of the market trades were made in
|
|
1597
|
+
* @param {int} [since] the earliest time in ms to fetch trades for
|
|
1598
|
+
* @param {int} [limit] the maximum number of trade structures to retrieve
|
|
1599
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
1600
|
+
* @param {bool} [params.trigger] true if fetching trigger or conditional trades
|
|
1601
|
+
* @param {string} [params.type] 'spot', 'swap', 'future', 'option', 'ANY', 'SPOT', 'MARGIN', 'SWAP', 'FUTURES' or 'OPTION'
|
|
1602
|
+
* @param {string} [params.marginMode] 'cross' or 'isolated', for automatically setting the type to spot margin
|
|
1603
|
+
* @returns {object[]} a list of [trade structures]{@link https://docs.ccxt.com/#/?id=trade-structure}
|
|
1604
|
+
*/
|
|
1605
|
+
async watchMyTrades(symbol = undefined, since = undefined, limit = undefined, params = {}) {
|
|
1606
|
+
// By default, receive order updates from any instrument type
|
|
1607
|
+
let type = undefined;
|
|
1608
|
+
[type, params] = this.handleOptionAndParams(params, 'watchMyTrades', 'type', 'ANY');
|
|
1609
|
+
const isTrigger = this.safeBool2(params, 'trigger', 'stop', false);
|
|
1610
|
+
params = this.omit(params, ['trigger', 'stop']);
|
|
1611
|
+
await this.loadMarkets();
|
|
1612
|
+
await this.authenticate({ 'access': isTrigger ? 'business' : 'private' });
|
|
1613
|
+
const channel = isTrigger ? 'orders-algo' : 'orders';
|
|
1614
|
+
let messageHash = channel + '::myTrades';
|
|
1615
|
+
let market = undefined;
|
|
1616
|
+
if (symbol !== undefined) {
|
|
1617
|
+
market = this.market(symbol);
|
|
1618
|
+
symbol = market['symbol'];
|
|
1619
|
+
type = market['type'];
|
|
1620
|
+
messageHash = messageHash + '::' + symbol;
|
|
1621
|
+
}
|
|
1622
|
+
if (type === 'future') {
|
|
1623
|
+
type = 'futures';
|
|
1624
|
+
}
|
|
1625
|
+
let uppercaseType = type.toUpperCase();
|
|
1626
|
+
let marginMode = undefined;
|
|
1627
|
+
[marginMode, params] = this.handleMarginModeAndParams('watchMyTrades', params);
|
|
1628
|
+
if (uppercaseType === 'SPOT') {
|
|
1629
|
+
if (marginMode !== undefined) {
|
|
1630
|
+
uppercaseType = 'MARGIN';
|
|
1631
|
+
}
|
|
1632
|
+
}
|
|
1633
|
+
const request = {
|
|
1634
|
+
'instType': uppercaseType,
|
|
1635
|
+
};
|
|
1636
|
+
const orders = await this.subscribe('private', messageHash, channel, undefined, this.extend(request, params));
|
|
1637
|
+
if (this.newUpdates) {
|
|
1638
|
+
limit = orders.getLimit(symbol, limit);
|
|
1639
|
+
}
|
|
1640
|
+
return this.filterBySymbolSinceLimit(orders, symbol, since, limit, true);
|
|
1641
|
+
}
|
|
1642
|
+
/**
|
|
1643
|
+
* @method
|
|
1644
|
+
* @name okx#watchPositions
|
|
1645
|
+
* @see https://www.okx.com/docs-v5/en/#trading-account-websocket-positions-channel
|
|
1646
|
+
* @description watch all open positions
|
|
1647
|
+
* @param {string[]|undefined} symbols list of unified market symbols
|
|
1648
|
+
* @param since
|
|
1649
|
+
* @param limit
|
|
1650
|
+
* @param {object} params extra parameters specific to the exchange API endpoint
|
|
1651
|
+
* @returns {object[]} a list of [position structure]{@link https://docs.ccxt.com/en/latest/manual.html#position-structure}
|
|
1652
|
+
*/
|
|
1653
|
+
async watchPositions(symbols = undefined, since = undefined, limit = undefined, params = {}) {
|
|
1654
|
+
await this.loadMarkets();
|
|
1655
|
+
await this.authenticate(params);
|
|
1656
|
+
symbols = this.marketSymbols(symbols);
|
|
1657
|
+
const request = {
|
|
1658
|
+
'instType': 'ANY',
|
|
1659
|
+
};
|
|
1660
|
+
const channel = 'positions';
|
|
1661
|
+
let newPositions = undefined;
|
|
1662
|
+
if (symbols === undefined) {
|
|
1663
|
+
const arg = {
|
|
1664
|
+
'channel': 'positions',
|
|
1665
|
+
'instType': 'ANY',
|
|
1666
|
+
};
|
|
1667
|
+
const args = [this.extend(arg, params)];
|
|
1668
|
+
const nonSymbolRequest = {
|
|
1669
|
+
'op': 'subscribe',
|
|
1670
|
+
'args': args,
|
|
1671
|
+
};
|
|
1672
|
+
const url = this.getUrl(channel, 'private');
|
|
1673
|
+
newPositions = await this.watch(url, channel, nonSymbolRequest, channel);
|
|
1674
|
+
}
|
|
1675
|
+
else {
|
|
1676
|
+
newPositions = await this.subscribeMultiple('private', channel, symbols, this.extend(request, params));
|
|
1677
|
+
}
|
|
1678
|
+
if (this.newUpdates) {
|
|
1679
|
+
return newPositions;
|
|
1680
|
+
}
|
|
1681
|
+
return this.filterBySymbolsSinceLimit(this.positions, symbols, since, limit, true);
|
|
1682
|
+
}
|
|
1683
|
+
handlePositions(client, message) {
|
|
1684
|
+
//
|
|
1685
|
+
// {
|
|
1686
|
+
// arg: {
|
|
1687
|
+
// channel: 'positions',
|
|
1688
|
+
// instType: 'ANY',
|
|
1689
|
+
// instId: 'XRP-USDT-SWAP',
|
|
1690
|
+
// uid: '464737184507959869'
|
|
1691
|
+
// },
|
|
1692
|
+
// data: [{
|
|
1693
|
+
// adl: '1',
|
|
1694
|
+
// availPos: '',
|
|
1695
|
+
// avgPx: '0.52668',
|
|
1696
|
+
// baseBal: '',
|
|
1697
|
+
// baseBorrowed: '',
|
|
1698
|
+
// baseInterest: '',
|
|
1699
|
+
// bizRefId: '',
|
|
1700
|
+
// bizRefType: '',
|
|
1701
|
+
// cTime: '1693151444408',
|
|
1702
|
+
// ccy: 'USDT',
|
|
1703
|
+
// closeOrderAlgo: [],
|
|
1704
|
+
// deltaBS: '',
|
|
1705
|
+
// deltaPA: '',
|
|
1706
|
+
// gammaBS: '',
|
|
1707
|
+
// gammaPA: '',
|
|
1708
|
+
// idxPx: '0.52683',
|
|
1709
|
+
// imr: '17.564000000000004',
|
|
1710
|
+
// instId: 'XRP-USDT-SWAP',
|
|
1711
|
+
// instType: 'SWAP',
|
|
1712
|
+
// interest: '',
|
|
1713
|
+
// last: '0.52691',
|
|
1714
|
+
// lever: '3',
|
|
1715
|
+
// liab: '',
|
|
1716
|
+
// liabCcy: '',
|
|
1717
|
+
// liqPx: '0.3287514731020614',
|
|
1718
|
+
// margin: '',
|
|
1719
|
+
// markPx: '0.52692',
|
|
1720
|
+
// mgnMode: 'cross',
|
|
1721
|
+
// mgnRatio: '69.00363001456147',
|
|
1722
|
+
// mmr: '0.26346',
|
|
1723
|
+
// notionalUsd: '52.68620388000001',
|
|
1724
|
+
// optVal: '',
|
|
1725
|
+
// pTime: '1693151906023',
|
|
1726
|
+
// pendingCloseOrdLiabVal: '',
|
|
1727
|
+
// pos: '1',
|
|
1728
|
+
// posCcy: '',
|
|
1729
|
+
// posId: '616057041198907393',
|
|
1730
|
+
// posSide: 'net',
|
|
1731
|
+
// quoteBal: '',
|
|
1732
|
+
// quoteBorrowed: '',
|
|
1733
|
+
// quoteInterest: '',
|
|
1734
|
+
// spotInUseAmt: '',
|
|
1735
|
+
// spotInUseCcy: '',
|
|
1736
|
+
// thetaBS: '',
|
|
1737
|
+
// thetaPA: '',
|
|
1738
|
+
// tradeId: '138745402',
|
|
1739
|
+
// uTime: '1693151444408',
|
|
1740
|
+
// upl: '0.0240000000000018',
|
|
1741
|
+
// uplLastPx: '0.0229999999999952',
|
|
1742
|
+
// uplRatio: '0.0013670539986328',
|
|
1743
|
+
// uplRatioLastPx: '0.001310093415356',
|
|
1744
|
+
// usdPx: '',
|
|
1745
|
+
// vegaBS: '',
|
|
1746
|
+
// vegaPA: ''
|
|
1747
|
+
// }]
|
|
1748
|
+
// }
|
|
1749
|
+
//
|
|
1750
|
+
const arg = this.safeValue(message, 'arg', {});
|
|
1751
|
+
const marketId = this.safeString(arg, 'instId');
|
|
1752
|
+
const market = this.safeMarket(marketId, undefined, '-');
|
|
1753
|
+
const symbol = market['symbol'];
|
|
1754
|
+
const channel = this.safeString(arg, 'channel', '');
|
|
1755
|
+
const data = this.safeValue(message, 'data', []);
|
|
1756
|
+
if (this.positions === undefined) {
|
|
1757
|
+
this.positions = new ArrayCacheBySymbolBySide();
|
|
1758
|
+
}
|
|
1759
|
+
const cache = this.positions;
|
|
1760
|
+
const newPositions = [];
|
|
1761
|
+
for (let i = 0; i < data.length; i++) {
|
|
1762
|
+
const rawPosition = data[i];
|
|
1763
|
+
const position = this.parsePosition(rawPosition);
|
|
1764
|
+
if (position['contracts'] === 0) {
|
|
1765
|
+
position['side'] = 'long';
|
|
1766
|
+
const shortPosition = this.clone(position);
|
|
1767
|
+
shortPosition['side'] = 'short';
|
|
1768
|
+
cache.append(shortPosition);
|
|
1769
|
+
newPositions.push(shortPosition);
|
|
1770
|
+
}
|
|
1771
|
+
newPositions.push(position);
|
|
1772
|
+
cache.append(position);
|
|
1773
|
+
}
|
|
1774
|
+
let messageHash = channel;
|
|
1775
|
+
if (symbol !== undefined) {
|
|
1776
|
+
messageHash = channel + '::' + symbol;
|
|
1777
|
+
}
|
|
1778
|
+
client.resolve(newPositions, messageHash);
|
|
1779
|
+
}
|
|
1780
|
+
/**
|
|
1781
|
+
* @method
|
|
1782
|
+
* @name okx#watchOrders
|
|
1783
|
+
* @description watches information on multiple orders made by the user
|
|
1784
|
+
* @see https://www.okx.com/docs-v5/en/#order-book-trading-trade-ws-order-channel
|
|
1785
|
+
* @param {string} [symbol] unified market symbol of the market the orders were made in
|
|
1786
|
+
* @param {int} [since] the earliest time in ms to fetch orders for
|
|
1787
|
+
* @param {int} [limit] the maximum number of order structures to retrieve
|
|
1788
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
1789
|
+
* @param {bool} [params.trigger] true if fetching trigger or conditional orders
|
|
1790
|
+
* @param {string} [params.type] 'spot', 'swap', 'future', 'option', 'ANY', 'SPOT', 'MARGIN', 'SWAP', 'FUTURES' or 'OPTION'
|
|
1791
|
+
* @param {string} [params.marginMode] 'cross' or 'isolated', for automatically setting the type to spot margin
|
|
1792
|
+
* @returns {object[]} a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
|
|
1793
|
+
*/
|
|
1794
|
+
async watchOrders(symbol = undefined, since = undefined, limit = undefined, params = {}) {
|
|
1795
|
+
let type = undefined;
|
|
1796
|
+
// By default, receive order updates from any instrument type
|
|
1797
|
+
[type, params] = this.handleOptionAndParams(params, 'watchOrders', 'type', 'ANY');
|
|
1798
|
+
const isTrigger = this.safeValue2(params, 'stop', 'trigger', false);
|
|
1799
|
+
params = this.omit(params, ['stop', 'trigger']);
|
|
1800
|
+
await this.loadMarkets();
|
|
1801
|
+
await this.authenticate({ 'access': isTrigger ? 'business' : 'private' });
|
|
1802
|
+
let market = undefined;
|
|
1803
|
+
if (symbol !== undefined) {
|
|
1804
|
+
market = this.market(symbol);
|
|
1805
|
+
symbol = market['symbol'];
|
|
1806
|
+
type = market['type'];
|
|
1807
|
+
}
|
|
1808
|
+
if (type === 'future') {
|
|
1809
|
+
type = 'futures';
|
|
1810
|
+
}
|
|
1811
|
+
let uppercaseType = type.toUpperCase();
|
|
1812
|
+
let marginMode = undefined;
|
|
1813
|
+
[marginMode, params] = this.handleMarginModeAndParams('watchOrders', params);
|
|
1814
|
+
if (uppercaseType === 'SPOT') {
|
|
1815
|
+
if (marginMode !== undefined) {
|
|
1816
|
+
uppercaseType = 'MARGIN';
|
|
1817
|
+
}
|
|
1818
|
+
}
|
|
1819
|
+
const request = {
|
|
1820
|
+
'instType': uppercaseType,
|
|
1821
|
+
};
|
|
1822
|
+
const channel = isTrigger ? 'orders-algo' : 'orders';
|
|
1823
|
+
const orders = await this.subscribe('private', channel, channel, symbol, this.extend(request, params));
|
|
1824
|
+
if (this.newUpdates) {
|
|
1825
|
+
limit = orders.getLimit(symbol, limit);
|
|
1826
|
+
}
|
|
1827
|
+
return this.filterBySymbolSinceLimit(orders, symbol, since, limit, true);
|
|
1828
|
+
}
|
|
1829
|
+
handleOrders(client, message, subscription = undefined) {
|
|
1830
|
+
//
|
|
1831
|
+
// {
|
|
1832
|
+
// "arg":{
|
|
1833
|
+
// "channel":"orders",
|
|
1834
|
+
// "instType":"SPOT"
|
|
1835
|
+
// },
|
|
1836
|
+
// "data":[
|
|
1837
|
+
// {
|
|
1838
|
+
// "accFillSz":"0",
|
|
1839
|
+
// "amendResult":"",
|
|
1840
|
+
// "avgPx":"",
|
|
1841
|
+
// "cTime":"1634548275191",
|
|
1842
|
+
// "category":"normal",
|
|
1843
|
+
// "ccy":"",
|
|
1844
|
+
// "clOrdId":"e847386590ce4dBC330547db94a08ba0",
|
|
1845
|
+
// "code":"0",
|
|
1846
|
+
// "execType":"",
|
|
1847
|
+
// "fee":"0",
|
|
1848
|
+
// "feeCcy":"USDT",
|
|
1849
|
+
// "fillFee":"0",
|
|
1850
|
+
// "fillFeeCcy":"",
|
|
1851
|
+
// "fillNotionalUsd":"",
|
|
1852
|
+
// "fillPx":"",
|
|
1853
|
+
// "fillSz":"0",
|
|
1854
|
+
// "fillTime":"",
|
|
1855
|
+
// "instId":"ETH-USDT",
|
|
1856
|
+
// "instType":"SPOT",
|
|
1857
|
+
// "lever":"",
|
|
1858
|
+
// "msg":"",
|
|
1859
|
+
// "notionalUsd":"451.4516256",
|
|
1860
|
+
// "ordId":"370257534141235201",
|
|
1861
|
+
// "ordType":"limit",
|
|
1862
|
+
// "pnl":"0",
|
|
1863
|
+
// "posSide":"",
|
|
1864
|
+
// "px":"60000",
|
|
1865
|
+
// "rebate":"0",
|
|
1866
|
+
// "rebateCcy":"ETH",
|
|
1867
|
+
// "reqId":"",
|
|
1868
|
+
// "side":"sell",
|
|
1869
|
+
// "slOrdPx":"",
|
|
1870
|
+
// "slTriggerPx":"",
|
|
1871
|
+
// "state":"live",
|
|
1872
|
+
// "sz":"0.007526",
|
|
1873
|
+
// "tag":"",
|
|
1874
|
+
// "tdMode":"cash",
|
|
1875
|
+
// "tgtCcy":"",
|
|
1876
|
+
// "tpOrdPx":"",
|
|
1877
|
+
// "tpTriggerPx":"",
|
|
1878
|
+
// "tradeId":"",
|
|
1879
|
+
// "uTime":"1634548275191"
|
|
1880
|
+
// }
|
|
1881
|
+
// ]
|
|
1882
|
+
// }
|
|
1883
|
+
//
|
|
1884
|
+
this.handleMyTrades(client, message);
|
|
1885
|
+
const arg = this.safeValue(message, 'arg', {});
|
|
1886
|
+
const channel = this.safeString(arg, 'channel');
|
|
1887
|
+
const orders = this.safeValue(message, 'data', []);
|
|
1888
|
+
const ordersLength = orders.length;
|
|
1889
|
+
if (ordersLength > 0) {
|
|
1890
|
+
const limit = this.safeInteger(this.options, 'ordersLimit', 1000);
|
|
1891
|
+
if (this.orders === undefined) {
|
|
1892
|
+
this.orders = new ArrayCacheBySymbolById(limit);
|
|
1893
|
+
this.triggerOrders = new ArrayCacheBySymbolById(limit);
|
|
1894
|
+
}
|
|
1895
|
+
const stored = (channel === 'orders-algo') ? this.triggerOrders : this.orders;
|
|
1896
|
+
const marketIds = [];
|
|
1897
|
+
const parsed = this.parseOrders(orders);
|
|
1898
|
+
for (let i = 0; i < parsed.length; i++) {
|
|
1899
|
+
const order = parsed[i];
|
|
1900
|
+
stored.append(order);
|
|
1901
|
+
const symbol = order['symbol'];
|
|
1902
|
+
const market = this.market(symbol);
|
|
1903
|
+
marketIds.push(market['id']);
|
|
1904
|
+
}
|
|
1905
|
+
client.resolve(stored, channel);
|
|
1906
|
+
for (let i = 0; i < marketIds.length; i++) {
|
|
1907
|
+
const messageHash = channel + ':' + marketIds[i];
|
|
1908
|
+
client.resolve(stored, messageHash);
|
|
1909
|
+
}
|
|
1910
|
+
}
|
|
1911
|
+
}
|
|
1912
|
+
handleMyTrades(client, message) {
|
|
1913
|
+
//
|
|
1914
|
+
// {
|
|
1915
|
+
// "arg":{
|
|
1916
|
+
// "channel":"orders",
|
|
1917
|
+
// "instType":"SPOT"
|
|
1918
|
+
// },
|
|
1919
|
+
// "data":[
|
|
1920
|
+
// {
|
|
1921
|
+
// "accFillSz":"0",
|
|
1922
|
+
// "amendResult":"",
|
|
1923
|
+
// "avgPx":"",
|
|
1924
|
+
// "cTime":"1634548275191",
|
|
1925
|
+
// "category":"normal",
|
|
1926
|
+
// "ccy":"",
|
|
1927
|
+
// "clOrdId":"e847386590ce4dBC330547db94a08ba0",
|
|
1928
|
+
// "code":"0",
|
|
1929
|
+
// "execType":"",
|
|
1930
|
+
// "fee":"0",
|
|
1931
|
+
// "feeCcy":"USDT",
|
|
1932
|
+
// "fillFee":"0",
|
|
1933
|
+
// "fillFeeCcy":"",
|
|
1934
|
+
// "fillNotionalUsd":"",
|
|
1935
|
+
// "fillPx":"",
|
|
1936
|
+
// "fillSz":"0",
|
|
1937
|
+
// "fillTime":"",
|
|
1938
|
+
// "instId":"ETH-USDT",
|
|
1939
|
+
// "instType":"SPOT",
|
|
1940
|
+
// "lever":"",
|
|
1941
|
+
// "msg":"",
|
|
1942
|
+
// "notionalUsd":"451.4516256",
|
|
1943
|
+
// "ordId":"370257534141235201",
|
|
1944
|
+
// "ordType":"limit",
|
|
1945
|
+
// "pnl":"0",
|
|
1946
|
+
// "posSide":"",
|
|
1947
|
+
// "px":"60000",
|
|
1948
|
+
// "rebate":"0",
|
|
1949
|
+
// "rebateCcy":"ETH",
|
|
1950
|
+
// "reqId":"",
|
|
1951
|
+
// "side":"sell",
|
|
1952
|
+
// "slOrdPx":"",
|
|
1953
|
+
// "slTriggerPx":"",
|
|
1954
|
+
// "state":"live",
|
|
1955
|
+
// "sz":"0.007526",
|
|
1956
|
+
// "tag":"",
|
|
1957
|
+
// "tdMode":"cash",
|
|
1958
|
+
// "tgtCcy":"",
|
|
1959
|
+
// "tpOrdPx":"",
|
|
1960
|
+
// "tpTriggerPx":"",
|
|
1961
|
+
// "tradeId":"",
|
|
1962
|
+
// "uTime":"1634548275191"
|
|
1963
|
+
// }
|
|
1964
|
+
// ]
|
|
1965
|
+
// }
|
|
1966
|
+
//
|
|
1967
|
+
const arg = this.safeValue(message, 'arg', {});
|
|
1968
|
+
const channel = this.safeString(arg, 'channel');
|
|
1969
|
+
const rawOrders = this.safeValue(message, 'data', []);
|
|
1970
|
+
const filteredOrders = [];
|
|
1971
|
+
// filter orders with no last trade id
|
|
1972
|
+
for (let i = 0; i < rawOrders.length; i++) {
|
|
1973
|
+
const rawOrder = rawOrders[i];
|
|
1974
|
+
const tradeId = this.safeString(rawOrder, 'tradeId', '');
|
|
1975
|
+
if (tradeId.length > 0) {
|
|
1976
|
+
const order = this.parseOrder(rawOrder);
|
|
1977
|
+
filteredOrders.push(order);
|
|
1978
|
+
}
|
|
1979
|
+
}
|
|
1980
|
+
const tradesLength = filteredOrders.length;
|
|
1981
|
+
if (tradesLength === 0) {
|
|
1982
|
+
return;
|
|
1983
|
+
}
|
|
1984
|
+
if (this.myTrades === undefined) {
|
|
1985
|
+
const limit = this.safeInteger(this.options, 'tradesLimit', 1000);
|
|
1986
|
+
this.myTrades = new ArrayCacheBySymbolById(limit);
|
|
1987
|
+
}
|
|
1988
|
+
const myTrades = this.myTrades;
|
|
1989
|
+
const symbols = {};
|
|
1990
|
+
for (let i = 0; i < filteredOrders.length; i++) {
|
|
1991
|
+
const rawTrade = filteredOrders[i];
|
|
1992
|
+
const trade = this.orderToTrade(rawTrade);
|
|
1993
|
+
myTrades.append(trade);
|
|
1994
|
+
const symbol = trade['symbol'];
|
|
1995
|
+
symbols[symbol] = true;
|
|
1996
|
+
}
|
|
1997
|
+
const messageHash = channel + '::myTrades';
|
|
1998
|
+
client.resolve(this.myTrades, messageHash);
|
|
1999
|
+
const tradeSymbols = Object.keys(symbols);
|
|
2000
|
+
for (let i = 0; i < tradeSymbols.length; i++) {
|
|
2001
|
+
const symbolMessageHash = messageHash + '::' + tradeSymbols[i];
|
|
2002
|
+
client.resolve(this.myTrades, symbolMessageHash);
|
|
2003
|
+
}
|
|
2004
|
+
}
|
|
2005
|
+
requestId() {
|
|
2006
|
+
const ts = this.milliseconds().toString();
|
|
2007
|
+
const randomNumber = this.randNumber(4);
|
|
2008
|
+
const randomPart = randomNumber.toString();
|
|
2009
|
+
return ts + randomPart;
|
|
2010
|
+
}
|
|
2011
|
+
/**
|
|
2012
|
+
* @method
|
|
2013
|
+
* @name okx#createOrderWs
|
|
2014
|
+
* @see https://www.okx.com/docs-v5/en/#websocket-api-trade-place-order
|
|
2015
|
+
* @description create a trade order
|
|
2016
|
+
* @param {string} symbol unified symbol of the market to create an order in
|
|
2017
|
+
* @param {string} type 'market' or 'limit'
|
|
2018
|
+
* @param {string} side 'buy' or 'sell'
|
|
2019
|
+
* @param {float} amount how much of currency you want to trade in units of base currency
|
|
2020
|
+
* @param {float|undefined} [price] the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
|
|
2021
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
2022
|
+
* @param {boolean} params.test test order, default false
|
|
2023
|
+
* @returns {object} an [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
|
|
2024
|
+
*/
|
|
2025
|
+
async createOrderWs(symbol, type, side, amount, price = undefined, params = {}) {
|
|
2026
|
+
await this.loadMarkets();
|
|
2027
|
+
await this.authenticate();
|
|
2028
|
+
const url = this.getUrl('private', 'private');
|
|
2029
|
+
const messageHash = this.requestId();
|
|
2030
|
+
let op = undefined;
|
|
2031
|
+
[op, params] = this.handleOptionAndParams(params, 'createOrderWs', 'op', 'batch-orders');
|
|
2032
|
+
const args = this.createOrderRequest(symbol, type, side, amount, price, params);
|
|
2033
|
+
const ordType = this.safeString(args, 'ordType');
|
|
2034
|
+
if ((ordType === 'trigger') || (ordType === 'conditional') || (type === 'oco') || (type === 'move_order_stop') || (type === 'iceberg') || (type === 'twap')) {
|
|
2035
|
+
throw new BadRequest(this.id + ' createOrderWs() does not support algo trading. this.options["createOrderWs"]["op"] must be either order or batch-order');
|
|
2036
|
+
}
|
|
2037
|
+
if ((op !== 'order') && (op !== 'batch-orders')) {
|
|
2038
|
+
throw new BadRequest(this.id + ' createOrderWs() does not support algo trading. this.options["createOrderWs"]["op"] must be either order or privatePostTradeOrder or privatePostTradeOrderAlgo');
|
|
2039
|
+
}
|
|
2040
|
+
const request = {
|
|
2041
|
+
'id': messageHash,
|
|
2042
|
+
'op': op,
|
|
2043
|
+
'args': [args],
|
|
2044
|
+
};
|
|
2045
|
+
return await this.watch(url, messageHash, request, messageHash);
|
|
2046
|
+
}
|
|
2047
|
+
handlePlaceOrders(client, message) {
|
|
2048
|
+
//
|
|
2049
|
+
// batch-orders/order/cancel-order
|
|
2050
|
+
// {
|
|
2051
|
+
// "id": "1689281055",
|
|
2052
|
+
// "op": "batch-orders",
|
|
2053
|
+
// "code": "0",
|
|
2054
|
+
// "msg": '',
|
|
2055
|
+
// "data": [{
|
|
2056
|
+
// "tag": "e847386590ce4dBC",
|
|
2057
|
+
// "ordId": "599823446566084608",
|
|
2058
|
+
// "clOrdId": "e847386590ce4dBCb939511604f394b0",
|
|
2059
|
+
// "sCode": "0",
|
|
2060
|
+
// "sMsg": "Order successfully placed."
|
|
2061
|
+
// },
|
|
2062
|
+
// ...
|
|
2063
|
+
// ]
|
|
2064
|
+
// }
|
|
2065
|
+
//
|
|
2066
|
+
const messageHash = this.safeString(message, 'id');
|
|
2067
|
+
let args = this.safeValue(message, 'data', []);
|
|
2068
|
+
// filter out partial errors
|
|
2069
|
+
args = this.filterBy(args, 'sCode', '0');
|
|
2070
|
+
// if empty means request failed and handle error
|
|
2071
|
+
if (this.isEmpty(args)) {
|
|
2072
|
+
const method = this.safeString(message, 'op');
|
|
2073
|
+
const stringMsg = this.json(message);
|
|
2074
|
+
this.handleErrors(1, '', client.url, method, {}, stringMsg, message, {}, {});
|
|
2075
|
+
}
|
|
2076
|
+
const orders = this.parseOrders(args, undefined, undefined, undefined);
|
|
2077
|
+
const first = this.safeDict(orders, 0, {});
|
|
2078
|
+
client.resolve(first, messageHash);
|
|
2079
|
+
}
|
|
2080
|
+
/**
|
|
2081
|
+
* @method
|
|
2082
|
+
* @name okx#editOrderWs
|
|
2083
|
+
* @description edit a trade order
|
|
2084
|
+
* @see https://www.okx.com/docs-v5/en/#order-book-trading-trade-ws-amend-order
|
|
2085
|
+
* @see https://www.okx.com/docs-v5/en/#order-book-trading-trade-ws-amend-multiple-orders
|
|
2086
|
+
* @param {string} id order id
|
|
2087
|
+
* @param {string} symbol unified symbol of the market to create an order in
|
|
2088
|
+
* @param {string} type 'market' or 'limit'
|
|
2089
|
+
* @param {string} side 'buy' or 'sell'
|
|
2090
|
+
* @param {float} amount how much of the currency you want to trade in units of the base currency
|
|
2091
|
+
* @param {float|undefined} [price] the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
|
|
2092
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
2093
|
+
* @returns {object} an [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
|
|
2094
|
+
*/
|
|
2095
|
+
async editOrderWs(id, symbol, type, side, amount = undefined, price = undefined, params = {}) {
|
|
2096
|
+
await this.loadMarkets();
|
|
2097
|
+
await this.authenticate();
|
|
2098
|
+
const url = this.getUrl('private', 'private');
|
|
2099
|
+
const messageHash = this.requestId();
|
|
2100
|
+
let op = undefined;
|
|
2101
|
+
[op, params] = this.handleOptionAndParams(params, 'editOrderWs', 'op', 'amend-order');
|
|
2102
|
+
const args = this.editOrderRequest(id, symbol, type, side, amount, price, params);
|
|
2103
|
+
const request = {
|
|
2104
|
+
'id': messageHash,
|
|
2105
|
+
'op': op,
|
|
2106
|
+
'args': [args],
|
|
2107
|
+
};
|
|
2108
|
+
return await this.watch(url, messageHash, this.extend(request, params), messageHash);
|
|
2109
|
+
}
|
|
2110
|
+
/**
|
|
2111
|
+
* @method
|
|
2112
|
+
* @name okx#cancelOrderWs
|
|
2113
|
+
* @see https://okx-docs.github.io/apidocs/websocket_api/en/#cancel-order-trade
|
|
2114
|
+
* @description cancel multiple orders
|
|
2115
|
+
* @param {string} id order id
|
|
2116
|
+
* @param {string} symbol unified market symbol, default is undefined
|
|
2117
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
2118
|
+
* @param {string} [params.clOrdId] client order id
|
|
2119
|
+
* @returns {object} an list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
|
|
2120
|
+
*/
|
|
2121
|
+
async cancelOrderWs(id, symbol = undefined, params = {}) {
|
|
2122
|
+
if (symbol === undefined) {
|
|
2123
|
+
throw new BadRequest(this.id + ' cancelOrderWs() requires a symbol argument');
|
|
2124
|
+
}
|
|
2125
|
+
await this.loadMarkets();
|
|
2126
|
+
await this.authenticate();
|
|
2127
|
+
const url = this.getUrl('private', 'private');
|
|
2128
|
+
const messageHash = this.requestId();
|
|
2129
|
+
const clientOrderId = this.safeString2(params, 'clOrdId', 'clientOrderId');
|
|
2130
|
+
params = this.omit(params, ['clientOrderId', 'clOrdId']);
|
|
2131
|
+
const arg = {
|
|
2132
|
+
'instId': this.marketId(symbol),
|
|
2133
|
+
};
|
|
2134
|
+
if (clientOrderId !== undefined) {
|
|
2135
|
+
arg['clOrdId'] = clientOrderId;
|
|
2136
|
+
}
|
|
2137
|
+
else {
|
|
2138
|
+
arg['ordId'] = id;
|
|
2139
|
+
}
|
|
2140
|
+
const request = {
|
|
2141
|
+
'id': messageHash,
|
|
2142
|
+
'op': 'cancel-order',
|
|
2143
|
+
'args': [this.extend(arg, params)],
|
|
2144
|
+
};
|
|
2145
|
+
return await this.watch(url, messageHash, request, messageHash);
|
|
2146
|
+
}
|
|
2147
|
+
/**
|
|
2148
|
+
* @method
|
|
2149
|
+
* @name okx#cancelOrdersWs
|
|
2150
|
+
* @see https://www.okx.com/docs-v5/en/#order-book-trading-trade-ws-mass-cancel-order
|
|
2151
|
+
* @description cancel multiple orders
|
|
2152
|
+
* @param {string[]} ids order ids
|
|
2153
|
+
* @param {string} symbol unified market symbol, default is undefined
|
|
2154
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
2155
|
+
* @returns {object} an list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
|
|
2156
|
+
*/
|
|
2157
|
+
async cancelOrdersWs(ids, symbol = undefined, params = {}) {
|
|
2158
|
+
const idsLength = ids.length;
|
|
2159
|
+
if (idsLength > 20) {
|
|
2160
|
+
throw new BadRequest(this.id + ' cancelOrdersWs() accepts up to 20 ids at a time');
|
|
2161
|
+
}
|
|
2162
|
+
if (symbol === undefined) {
|
|
2163
|
+
throw new BadRequest(this.id + ' cancelOrdersWs() requires a symbol argument');
|
|
2164
|
+
}
|
|
2165
|
+
await this.loadMarkets();
|
|
2166
|
+
await this.authenticate();
|
|
2167
|
+
const url = this.getUrl('private', 'private');
|
|
2168
|
+
const messageHash = this.requestId();
|
|
2169
|
+
const args = [];
|
|
2170
|
+
for (let i = 0; i < idsLength; i++) {
|
|
2171
|
+
const arg = {
|
|
2172
|
+
'instId': this.marketId(symbol),
|
|
2173
|
+
'ordId': ids[i],
|
|
2174
|
+
};
|
|
2175
|
+
args.push(arg);
|
|
2176
|
+
}
|
|
2177
|
+
const request = {
|
|
2178
|
+
'id': messageHash,
|
|
2179
|
+
'op': 'batch-cancel-orders',
|
|
2180
|
+
'args': args,
|
|
2181
|
+
};
|
|
2182
|
+
return await this.watch(url, messageHash, this.deepExtend(request, params), messageHash);
|
|
2183
|
+
}
|
|
2184
|
+
/**
|
|
2185
|
+
* @method
|
|
2186
|
+
* @name okx#cancelAllOrdersWs
|
|
2187
|
+
* @see https://docs.okx.com/websockets/#message-cancelAll
|
|
2188
|
+
* @description cancel all open orders of a type. Only applicable to Option in Portfolio Margin mode, and MMP privilege is required.
|
|
2189
|
+
* @param {string} symbol unified market symbol, only orders in the market of this symbol are cancelled when symbol is not undefined
|
|
2190
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
2191
|
+
* @returns {object[]} a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
|
|
2192
|
+
*/
|
|
2193
|
+
async cancelAllOrdersWs(symbol = undefined, params = {}) {
|
|
2194
|
+
if (symbol === undefined) {
|
|
2195
|
+
throw new BadRequest(this.id + ' cancelAllOrdersWs() requires a symbol argument');
|
|
2196
|
+
}
|
|
2197
|
+
await this.loadMarkets();
|
|
2198
|
+
await this.authenticate();
|
|
2199
|
+
const market = this.market(symbol);
|
|
2200
|
+
if (market['type'] !== 'option') {
|
|
2201
|
+
throw new BadRequest(this.id + ' cancelAllOrdersWs is only applicable to Option in Portfolio Margin mode, and MMP privilege is required.');
|
|
2202
|
+
}
|
|
2203
|
+
const url = this.getUrl('private', 'private');
|
|
2204
|
+
const messageHash = this.requestId();
|
|
2205
|
+
const request = {
|
|
2206
|
+
'id': messageHash,
|
|
2207
|
+
'op': 'mass-cancel',
|
|
2208
|
+
'args': [this.extend({
|
|
2209
|
+
'instType': 'OPTION',
|
|
2210
|
+
'instFamily': market['id'],
|
|
2211
|
+
}, params)],
|
|
2212
|
+
};
|
|
2213
|
+
return await this.watch(url, messageHash, request, messageHash);
|
|
2214
|
+
}
|
|
2215
|
+
handleCancelAllOrders(client, message) {
|
|
2216
|
+
//
|
|
2217
|
+
// {
|
|
2218
|
+
// "id": "1512",
|
|
2219
|
+
// "op": "mass-cancel",
|
|
2220
|
+
// "data": [
|
|
2221
|
+
// {
|
|
2222
|
+
// "result": true
|
|
2223
|
+
// }
|
|
2224
|
+
// ],
|
|
2225
|
+
// "code": "0",
|
|
2226
|
+
// "msg": ""
|
|
2227
|
+
// }
|
|
2228
|
+
//
|
|
2229
|
+
const messageHash = this.safeString(message, 'id');
|
|
2230
|
+
const data = this.safeValue(message, 'data', []);
|
|
2231
|
+
client.resolve(data, messageHash);
|
|
2232
|
+
}
|
|
2233
|
+
handleSubscriptionStatus(client, message) {
|
|
2234
|
+
//
|
|
2235
|
+
// { event: 'subscribe', arg: { channel: "tickers", instId: "BTC-USDT" } }
|
|
2236
|
+
//
|
|
2237
|
+
// const channel = this.safeString (message, "channel");
|
|
2238
|
+
// client.subscriptions[channel] = message;
|
|
2239
|
+
return message;
|
|
2240
|
+
}
|
|
2241
|
+
handleAuthenticate(client, message) {
|
|
2242
|
+
//
|
|
2243
|
+
// { event: "login", success: true }
|
|
2244
|
+
//
|
|
2245
|
+
const future = this.safeValue(client.futures, 'authenticated');
|
|
2246
|
+
future.resolve(true);
|
|
2247
|
+
}
|
|
2248
|
+
ping(client) {
|
|
2249
|
+
// OKX does not support the built-in WebSocket protocol-level ping-pong.
|
|
2250
|
+
// Instead, it requires a custom text-based ping-pong mechanism.
|
|
2251
|
+
return 'ping';
|
|
2252
|
+
}
|
|
2253
|
+
handlePong(client, message) {
|
|
2254
|
+
client.lastPong = this.milliseconds();
|
|
2255
|
+
return message;
|
|
2256
|
+
}
|
|
2257
|
+
handleErrorMessage(client, message) {
|
|
2258
|
+
//
|
|
2259
|
+
// { event: 'error', msg: "Illegal request: {"op":"subscribe","args":["spot/ticker:BTC-USDT"]}", code: "60012" }
|
|
2260
|
+
// { event: 'error", msg: "channel:ticker,instId:BTC-USDT doesn"t exist", code: "60018" }
|
|
2261
|
+
// {"event":"error","msg":"Illegal request: {\\"id\\":\\"17321173472466905\\",\\"op\\":\\"amend-order\\",\\"args\\":[{\\"instId\\":\\"ETH-USDC\\",\\"ordId\\":\\"2000345622407479296\\",\\"newSz\\":\\"0.050857\\",\\"newPx\\":\\"2949.4\\",\\"postOnly\\":true}],\\"postOnly\\":true}","code":"60012","connId":"0808af6c"}
|
|
2262
|
+
//
|
|
2263
|
+
let errorCode = this.safeString(message, 'code');
|
|
2264
|
+
try {
|
|
2265
|
+
if (errorCode && errorCode !== '0') {
|
|
2266
|
+
const feedback = this.id + ' ' + this.json(message);
|
|
2267
|
+
if (errorCode !== '1') {
|
|
2268
|
+
this.throwExactlyMatchedException(this.exceptions['exact'], errorCode, feedback);
|
|
2269
|
+
}
|
|
2270
|
+
let messageString = this.safeValue(message, 'msg');
|
|
2271
|
+
if (messageString !== undefined) {
|
|
2272
|
+
this.throwBroadlyMatchedException(this.exceptions['broad'], messageString, feedback);
|
|
2273
|
+
}
|
|
2274
|
+
else {
|
|
2275
|
+
const data = this.safeList(message, 'data', []);
|
|
2276
|
+
for (let i = 0; i < data.length; i++) {
|
|
2277
|
+
const d = data[i];
|
|
2278
|
+
errorCode = this.safeString(d, 'sCode');
|
|
2279
|
+
if (errorCode !== undefined) {
|
|
2280
|
+
this.throwExactlyMatchedException(this.exceptions['exact'], errorCode, feedback);
|
|
2281
|
+
}
|
|
2282
|
+
messageString = this.safeValue(message, 'sMsg');
|
|
2283
|
+
if (messageString !== undefined) {
|
|
2284
|
+
this.throwBroadlyMatchedException(this.exceptions['broad'], messageString, feedback);
|
|
2285
|
+
}
|
|
2286
|
+
}
|
|
2287
|
+
}
|
|
2288
|
+
throw new ExchangeError(feedback);
|
|
2289
|
+
}
|
|
2290
|
+
}
|
|
2291
|
+
catch (e) {
|
|
2292
|
+
// if the message contains an id, it means it is a response to a request
|
|
2293
|
+
// so we only reject that promise, instead of deleting all futures, destroying the authentication future
|
|
2294
|
+
let id = this.safeString(message, 'id');
|
|
2295
|
+
if (id === undefined) {
|
|
2296
|
+
// try to parse it from the stringified json inside msg
|
|
2297
|
+
const msg = this.safeString(message, 'msg');
|
|
2298
|
+
if (msg !== undefined && msg.startsWith('Illegal request: {')) {
|
|
2299
|
+
const stringifiedJson = msg.replace('Illegal request: ', '');
|
|
2300
|
+
const parsedJson = this.parseJson(stringifiedJson);
|
|
2301
|
+
id = this.safeString(parsedJson, 'id');
|
|
2302
|
+
}
|
|
2303
|
+
}
|
|
2304
|
+
if (id !== undefined) {
|
|
2305
|
+
client.reject(e, id);
|
|
2306
|
+
return false;
|
|
2307
|
+
}
|
|
2308
|
+
client.reject(e);
|
|
2309
|
+
return false;
|
|
2310
|
+
}
|
|
2311
|
+
return true;
|
|
2312
|
+
}
|
|
2313
|
+
handleMessage(client, message) {
|
|
2314
|
+
if (!this.handleErrorMessage(client, message)) {
|
|
2315
|
+
return;
|
|
2316
|
+
}
|
|
2317
|
+
//
|
|
2318
|
+
// { event: 'subscribe', arg: { channel: "tickers", instId: "BTC-USDT" } }
|
|
2319
|
+
// { event: 'login", msg: '", code: "0" }
|
|
2320
|
+
//
|
|
2321
|
+
// {
|
|
2322
|
+
// "arg": { channel: "tickers", instId: "BTC-USDT" },
|
|
2323
|
+
// "data": [
|
|
2324
|
+
// {
|
|
2325
|
+
// "instType": "SPOT",
|
|
2326
|
+
// "instId": "BTC-USDT",
|
|
2327
|
+
// "last": "31500.1",
|
|
2328
|
+
// "lastSz": "0.00001754",
|
|
2329
|
+
// "askPx": "31500.1",
|
|
2330
|
+
// "askSz": "0.00998144",
|
|
2331
|
+
// "bidPx": "31500",
|
|
2332
|
+
// "bidSz": "3.05652439",
|
|
2333
|
+
// "open24h": "31697",
|
|
2334
|
+
// "high24h": "32248",
|
|
2335
|
+
// "low24h": "31165.6",
|
|
2336
|
+
// "sodUtc0": "31385.5",
|
|
2337
|
+
// "sodUtc8": "32134.9",
|
|
2338
|
+
// "volCcy24h": "503403597.38138519",
|
|
2339
|
+
// "vol24h": "15937.10781721",
|
|
2340
|
+
// "ts": "1626526618762"
|
|
2341
|
+
// }
|
|
2342
|
+
// ]
|
|
2343
|
+
// }
|
|
2344
|
+
//
|
|
2345
|
+
// { event: 'error', msg: "Illegal request: {"op":"subscribe","args":["spot/ticker:BTC-USDT"]}", code: "60012" }
|
|
2346
|
+
// { event: 'error", msg: "channel:ticker,instId:BTC-USDT doesn"t exist", code: "60018" }
|
|
2347
|
+
// { event: 'error', msg: "Invalid OK_ACCESS_KEY", code: "60005" }
|
|
2348
|
+
// {
|
|
2349
|
+
// "event": "error",
|
|
2350
|
+
// "msg": "Illegal request: {"op":"login","args":["de89b035-b233-44b2-9a13-0ccdd00bda0e","7KUcc8YzQhnxBE3K","1626691289","H57N99mBt5NvW8U19FITrPdOxycAERFMaapQWRqLaSE="]}",
|
|
2351
|
+
// "code": "60012"
|
|
2352
|
+
// }
|
|
2353
|
+
//
|
|
2354
|
+
//
|
|
2355
|
+
//
|
|
2356
|
+
if (message === 'pong') {
|
|
2357
|
+
this.handlePong(client, message);
|
|
2358
|
+
return;
|
|
2359
|
+
}
|
|
2360
|
+
// const table = this.safeString (message, 'table');
|
|
2361
|
+
// if (table === undefined) {
|
|
2362
|
+
const event = this.safeString2(message, 'event', 'op');
|
|
2363
|
+
if (event !== undefined) {
|
|
2364
|
+
const methods = {
|
|
2365
|
+
// 'info': this.handleSystemStatus,
|
|
2366
|
+
// 'book': 'handleOrderBook',
|
|
2367
|
+
'login': this.handleAuthenticate,
|
|
2368
|
+
'subscribe': this.handleSubscriptionStatus,
|
|
2369
|
+
'unsubscribe': this.handleUnsubscription,
|
|
2370
|
+
'order': this.handlePlaceOrders,
|
|
2371
|
+
'batch-orders': this.handlePlaceOrders,
|
|
2372
|
+
'amend-order': this.handlePlaceOrders,
|
|
2373
|
+
'batch-amend-orders': this.handlePlaceOrders,
|
|
2374
|
+
'cancel-order': this.handlePlaceOrders,
|
|
2375
|
+
'mass-cancel': this.handleCancelAllOrders,
|
|
2376
|
+
};
|
|
2377
|
+
const method = this.safeValue(methods, event);
|
|
2378
|
+
if (method !== undefined) {
|
|
2379
|
+
method.call(this, client, message);
|
|
2380
|
+
}
|
|
2381
|
+
}
|
|
2382
|
+
else {
|
|
2383
|
+
const arg = this.safeValue(message, 'arg', {});
|
|
2384
|
+
const channel = this.safeString(arg, 'channel');
|
|
2385
|
+
const methods = {
|
|
2386
|
+
'bbo-tbt': this.handleOrderBook,
|
|
2387
|
+
'books': this.handleOrderBook,
|
|
2388
|
+
'books5': this.handleOrderBook,
|
|
2389
|
+
'books50-l2-tbt': this.handleOrderBook,
|
|
2390
|
+
'books-l2-tbt': this.handleOrderBook,
|
|
2391
|
+
'tickers': this.handleTicker,
|
|
2392
|
+
'mark-price': this.handleTicker,
|
|
2393
|
+
'positions': this.handlePositions,
|
|
2394
|
+
'index-tickers': this.handleTicker,
|
|
2395
|
+
'sprd-tickers': this.handleTicker,
|
|
2396
|
+
'block-tickers': this.handleTicker,
|
|
2397
|
+
'trades': this.handleTrades,
|
|
2398
|
+
'account': this.handleBalance,
|
|
2399
|
+
'funding-rate': this.handleFundingRate,
|
|
2400
|
+
// 'margin_account': this.handleBalance,
|
|
2401
|
+
'orders': this.handleOrders,
|
|
2402
|
+
'orders-algo': this.handleOrders,
|
|
2403
|
+
'liquidation-orders': this.handleLiquidation,
|
|
2404
|
+
'balance_and_position': this.handleBalanceAndPosition,
|
|
2405
|
+
};
|
|
2406
|
+
const method = this.safeValue(methods, channel);
|
|
2407
|
+
if (method === undefined) {
|
|
2408
|
+
if (channel.indexOf('candle') === 0) {
|
|
2409
|
+
this.handleOHLCV(client, message);
|
|
2410
|
+
}
|
|
2411
|
+
}
|
|
2412
|
+
else {
|
|
2413
|
+
method.call(this, client, message);
|
|
2414
|
+
}
|
|
2415
|
+
}
|
|
2416
|
+
}
|
|
2417
|
+
handleUnSubscriptionTrades(client, symbol) {
|
|
2418
|
+
const subMessageHash = 'trades:' + symbol;
|
|
2419
|
+
const messageHash = 'unsubscribe:trades:' + symbol;
|
|
2420
|
+
this.cleanUnsubscription(client, subMessageHash, messageHash);
|
|
2421
|
+
if (symbol in this.trades) {
|
|
2422
|
+
delete this.trades[symbol];
|
|
2423
|
+
}
|
|
2424
|
+
}
|
|
2425
|
+
handleUnsubscriptionOrderBook(client, symbol, channel) {
|
|
2426
|
+
const subMessageHash = channel + ':' + symbol;
|
|
2427
|
+
const messageHash = 'unsubscribe:orderbook:' + symbol;
|
|
2428
|
+
this.cleanUnsubscription(client, subMessageHash, messageHash);
|
|
2429
|
+
if (symbol in this.orderbooks) {
|
|
2430
|
+
delete this.orderbooks[symbol];
|
|
2431
|
+
}
|
|
2432
|
+
}
|
|
2433
|
+
handleUnsubscriptionOHLCV(client, symbol, channel) {
|
|
2434
|
+
const tf = channel.replace('candle', '');
|
|
2435
|
+
const timeframe = this.findTimeframe(tf);
|
|
2436
|
+
const subMessageHash = 'multi:' + channel + ':' + symbol;
|
|
2437
|
+
const messageHash = 'unsubscribe:' + subMessageHash;
|
|
2438
|
+
this.cleanUnsubscription(client, subMessageHash, messageHash);
|
|
2439
|
+
if (timeframe in this.ohlcvs[symbol]) {
|
|
2440
|
+
delete this.ohlcvs[symbol][timeframe];
|
|
2441
|
+
}
|
|
2442
|
+
}
|
|
2443
|
+
handleUnsubscriptionTicker(client, symbol, channel) {
|
|
2444
|
+
const subMessageHash = channel + '::' + symbol;
|
|
2445
|
+
const messageHash = 'unsubscribe:ticker:' + symbol;
|
|
2446
|
+
this.cleanUnsubscription(client, subMessageHash, messageHash);
|
|
2447
|
+
if (symbol in this.tickers) {
|
|
2448
|
+
delete this.tickers[symbol];
|
|
2449
|
+
}
|
|
2450
|
+
}
|
|
2451
|
+
handleUnsubscription(client, message) {
|
|
2452
|
+
//
|
|
2453
|
+
// {
|
|
2454
|
+
// "event": "unsubscribe",
|
|
2455
|
+
// "arg": {
|
|
2456
|
+
// "channel": "tickers",
|
|
2457
|
+
// "instId": "LTC-USD-200327"
|
|
2458
|
+
// },
|
|
2459
|
+
// "connId": "a4d3ae55"
|
|
2460
|
+
// }
|
|
2461
|
+
// arg might be an array or list
|
|
2462
|
+
const arg = this.safeDict(message, 'arg', {});
|
|
2463
|
+
const channel = this.safeString(arg, 'channel', '');
|
|
2464
|
+
const marketId = this.safeString(arg, 'instId');
|
|
2465
|
+
const symbol = this.safeSymbol(marketId);
|
|
2466
|
+
if (channel === 'trades') {
|
|
2467
|
+
this.handleUnSubscriptionTrades(client, symbol);
|
|
2468
|
+
}
|
|
2469
|
+
else if (channel.startsWith('bbo') || channel.startsWith('book')) {
|
|
2470
|
+
this.handleUnsubscriptionOrderBook(client, symbol, channel);
|
|
2471
|
+
}
|
|
2472
|
+
else if (channel.indexOf('tickers') > -1) {
|
|
2473
|
+
this.handleUnsubscriptionTicker(client, symbol, channel);
|
|
2474
|
+
}
|
|
2475
|
+
else if (channel.startsWith('candle')) {
|
|
2476
|
+
this.handleUnsubscriptionOHLCV(client, symbol, channel);
|
|
2477
|
+
}
|
|
2478
|
+
}
|
|
2479
|
+
}
|