ccxt 4.2.17 → 4.2.19
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 +9 -9
- package/dist/ccxt.browser.js +48992 -47725
- package/dist/ccxt.browser.min.js +3 -3
- package/dist/cjs/ccxt.js +12 -1
- package/dist/cjs/src/alpaca.js +18 -18
- package/dist/cjs/src/ascendex.js +13 -6
- package/dist/cjs/src/base/Exchange.js +266 -27
- package/dist/cjs/src/bigone.js +434 -168
- package/dist/cjs/src/binance.js +163 -34
- package/dist/cjs/src/binanceus.js +8 -0
- package/dist/cjs/src/bingx.js +183 -41
- package/dist/cjs/src/bitfinex.js +2 -3
- package/dist/cjs/src/bitget.js +59 -16
- package/dist/cjs/src/bitmart.js +5 -5
- package/dist/cjs/src/bitmex.js +4 -6
- package/dist/cjs/src/bitpanda.js +5 -1991
- package/dist/cjs/src/bitstamp.js +8 -0
- package/dist/cjs/src/bybit.js +27 -47
- package/dist/cjs/src/coinbase.js +176 -26
- package/dist/cjs/src/coincheck.js +1 -0
- package/dist/cjs/src/coinex.js +3 -0
- package/dist/cjs/src/coinlist.js +13 -6
- package/dist/cjs/src/coinone.js +2 -2
- package/dist/cjs/src/coinsph.js +4 -5
- package/dist/cjs/src/delta.js +7 -1
- package/dist/cjs/src/deribit.js +17 -4
- package/dist/cjs/src/gate.js +151 -169
- package/dist/cjs/src/gemini.js +1 -1
- package/dist/cjs/src/hitbtc.js +2 -3
- package/dist/cjs/src/htx.js +157 -7
- package/dist/cjs/src/huobijp.js +2 -3
- package/dist/cjs/src/independentreserve.js +7 -5
- package/dist/cjs/src/kraken.js +86 -54
- package/dist/cjs/src/kucoin.js +5 -0
- package/dist/cjs/src/kucoinfutures.js +131 -77
- package/dist/cjs/src/lbank.js +60 -33
- package/dist/cjs/src/luno.js +84 -2
- package/dist/cjs/src/mexc.js +3 -3
- package/dist/cjs/src/oceanex.js +1 -1
- package/dist/cjs/src/okx.js +23 -11
- package/dist/cjs/{js/src/bitpanda.js → src/onetrading.js} +39 -39
- package/dist/cjs/src/phemex.js +37 -27
- package/dist/cjs/src/poloniexfutures.js +1 -0
- package/dist/cjs/src/pro/binance.js +66 -25
- package/dist/cjs/src/pro/bitget.js +1 -1
- package/dist/cjs/src/pro/bitpanda.js +5 -1330
- package/dist/cjs/src/pro/coinbase.js +4 -1
- package/dist/cjs/src/pro/coincheck.js +208 -0
- package/dist/cjs/src/pro/hitbtc.js +5 -4
- package/dist/cjs/src/pro/htx.js +6 -1
- package/dist/cjs/src/pro/kraken.js +1 -1
- package/dist/cjs/src/pro/krakenfutures.js +7 -1
- package/dist/cjs/src/pro/kucoin.js +46 -36
- package/dist/cjs/src/pro/kucoinfutures.js +45 -37
- package/dist/cjs/src/pro/lbank.js +881 -0
- package/dist/cjs/src/pro/okx.js +52 -2
- package/dist/cjs/{js/src/pro/bitpanda.js → src/pro/onetrading.js} +4 -7
- package/dist/cjs/src/pro/poloniex.js +2 -2
- package/dist/cjs/src/pro/poloniexfutures.js +43 -35
- package/dist/cjs/src/pro/woo.js +126 -0
- package/dist/cjs/src/probit.js +4 -2
- package/dist/cjs/src/upbit.js +12 -12
- package/dist/cjs/src/wavesexchange.js +1 -1
- package/dist/cjs/src/whitebit.js +1 -0
- package/dist/cjs/src/woo.js +56 -0
- package/js/ccxt.d.ts +14 -2
- package/js/ccxt.js +10 -2
- package/js/src/abstract/bitpanda.d.ts +4 -4
- package/js/src/abstract/bitstamp.d.ts +8 -0
- package/js/src/abstract/gate.d.ts +1 -0
- package/js/src/abstract/gateio.d.ts +1 -0
- package/js/src/abstract/htx.d.ts +3 -0
- package/js/src/abstract/huobi.d.ts +3 -0
- package/js/src/abstract/luno.d.ts +1 -0
- package/js/src/abstract/onetrading.d.ts +38 -0
- package/js/src/ascendex.js +2 -0
- package/js/src/base/Exchange.d.ts +2 -3
- package/js/src/base/Exchange.js +5 -2
- package/js/src/binance.js +7 -1
- package/js/src/bingx.d.ts +1 -0
- package/js/src/bingx.js +26 -0
- package/js/src/bitget.js +22 -3
- package/js/src/bitpanda.d.ts +2 -72
- package/js/src/bitpanda.js +5 -1991
- package/js/src/bitstamp.js +8 -0
- package/js/src/bybit.js +21 -47
- package/js/src/coincheck.js +1 -0
- package/js/src/deribit.js +16 -4
- package/js/src/gate.d.ts +1 -0
- package/js/src/gate.js +50 -110
- package/js/src/htx.js +3 -0
- package/js/src/kraken.d.ts +1 -0
- package/js/src/kraken.js +40 -39
- package/js/src/lbank.js +1 -0
- package/js/src/luno.d.ts +3 -1
- package/js/src/luno.js +84 -2
- package/js/src/mexc.js +1 -2
- package/js/src/onetrading.d.ts +74 -0
- package/js/src/onetrading.js +2003 -0
- package/js/src/poloniexfutures.js +1 -0
- package/js/src/pro/binance.js +7 -2
- package/js/src/pro/bitget.js +1 -1
- package/js/src/pro/bitpanda.d.ts +2 -34
- package/js/src/pro/bitpanda.js +5 -1330
- package/js/src/pro/coincheck.d.ts +12 -0
- package/js/src/pro/coincheck.js +209 -0
- package/js/src/pro/kucoin.js +43 -35
- package/js/src/pro/kucoinfutures.js +45 -37
- package/js/src/pro/lbank.d.ts +29 -0
- package/js/src/pro/lbank.js +882 -0
- package/js/src/pro/onetrading.d.ts +36 -0
- package/js/src/pro/onetrading.js +1339 -0
- package/js/src/pro/poloniexfutures.js +43 -35
- package/js/src/whitebit.js +1 -0
- package/package.json +2 -2
- package/rollup.config.js +2 -0
- package/skip-tests.json +14 -2
- package/test-commonjs.cjs +25 -1
- package/dist/cjs/js/ccxt.js +0 -476
- package/dist/cjs/js/src/abstract/alpaca.js +0 -9
- package/dist/cjs/js/src/abstract/ascendex.js +0 -9
- package/dist/cjs/js/src/abstract/bigone.js +0 -9
- package/dist/cjs/js/src/abstract/binance.js +0 -9
- package/dist/cjs/js/src/abstract/bingx.js +0 -9
- package/dist/cjs/js/src/abstract/bit2c.js +0 -9
- package/dist/cjs/js/src/abstract/bitbank.js +0 -9
- package/dist/cjs/js/src/abstract/bitbns.js +0 -9
- package/dist/cjs/js/src/abstract/bitfinex.js +0 -9
- package/dist/cjs/js/src/abstract/bitfinex2.js +0 -9
- package/dist/cjs/js/src/abstract/bitflyer.js +0 -9
- package/dist/cjs/js/src/abstract/bitforex.js +0 -9
- package/dist/cjs/js/src/abstract/bitget.js +0 -9
- package/dist/cjs/js/src/abstract/bithumb.js +0 -9
- package/dist/cjs/js/src/abstract/bitmart.js +0 -9
- package/dist/cjs/js/src/abstract/bitmex.js +0 -9
- package/dist/cjs/js/src/abstract/bitopro.js +0 -9
- package/dist/cjs/js/src/abstract/bitpanda.js +0 -9
- package/dist/cjs/js/src/abstract/bitrue.js +0 -9
- package/dist/cjs/js/src/abstract/bitso.js +0 -9
- package/dist/cjs/js/src/abstract/bitstamp.js +0 -9
- package/dist/cjs/js/src/abstract/bitteam.js +0 -9
- package/dist/cjs/js/src/abstract/bitvavo.js +0 -9
- package/dist/cjs/js/src/abstract/bl3p.js +0 -9
- package/dist/cjs/js/src/abstract/blockchaincom.js +0 -9
- package/dist/cjs/js/src/abstract/btcalpha.js +0 -9
- package/dist/cjs/js/src/abstract/btcbox.js +0 -9
- package/dist/cjs/js/src/abstract/btcmarkets.js +0 -9
- package/dist/cjs/js/src/abstract/btcturk.js +0 -9
- package/dist/cjs/js/src/abstract/bybit.js +0 -9
- package/dist/cjs/js/src/abstract/cex.js +0 -9
- package/dist/cjs/js/src/abstract/coinbase.js +0 -9
- package/dist/cjs/js/src/abstract/coinbasepro.js +0 -9
- package/dist/cjs/js/src/abstract/coincheck.js +0 -9
- package/dist/cjs/js/src/abstract/coinex.js +0 -9
- package/dist/cjs/js/src/abstract/coinlist.js +0 -9
- package/dist/cjs/js/src/abstract/coinmate.js +0 -9
- package/dist/cjs/js/src/abstract/coinone.js +0 -9
- package/dist/cjs/js/src/abstract/coinsph.js +0 -9
- package/dist/cjs/js/src/abstract/coinspot.js +0 -9
- package/dist/cjs/js/src/abstract/cryptocom.js +0 -9
- package/dist/cjs/js/src/abstract/currencycom.js +0 -9
- package/dist/cjs/js/src/abstract/delta.js +0 -9
- package/dist/cjs/js/src/abstract/deribit.js +0 -9
- package/dist/cjs/js/src/abstract/digifinex.js +0 -9
- package/dist/cjs/js/src/abstract/exmo.js +0 -9
- package/dist/cjs/js/src/abstract/gate.js +0 -9
- package/dist/cjs/js/src/abstract/gemini.js +0 -9
- package/dist/cjs/js/src/abstract/hitbtc.js +0 -9
- package/dist/cjs/js/src/abstract/hollaex.js +0 -9
- package/dist/cjs/js/src/abstract/htx.js +0 -9
- package/dist/cjs/js/src/abstract/huobijp.js +0 -9
- package/dist/cjs/js/src/abstract/idex.js +0 -9
- package/dist/cjs/js/src/abstract/independentreserve.js +0 -9
- package/dist/cjs/js/src/abstract/indodax.js +0 -9
- package/dist/cjs/js/src/abstract/kraken.js +0 -9
- package/dist/cjs/js/src/abstract/krakenfutures.js +0 -9
- package/dist/cjs/js/src/abstract/kucoin.js +0 -9
- package/dist/cjs/js/src/abstract/kucoinfutures.js +0 -9
- package/dist/cjs/js/src/abstract/kuna.js +0 -9
- package/dist/cjs/js/src/abstract/latoken.js +0 -9
- package/dist/cjs/js/src/abstract/lbank.js +0 -9
- package/dist/cjs/js/src/abstract/luno.js +0 -9
- package/dist/cjs/js/src/abstract/lykke.js +0 -9
- package/dist/cjs/js/src/abstract/mercado.js +0 -9
- package/dist/cjs/js/src/abstract/mexc.js +0 -9
- package/dist/cjs/js/src/abstract/ndax.js +0 -9
- package/dist/cjs/js/src/abstract/novadax.js +0 -9
- package/dist/cjs/js/src/abstract/oceanex.js +0 -9
- package/dist/cjs/js/src/abstract/okcoin.js +0 -9
- package/dist/cjs/js/src/abstract/okx.js +0 -9
- package/dist/cjs/js/src/abstract/p2b.js +0 -9
- package/dist/cjs/js/src/abstract/paymium.js +0 -9
- package/dist/cjs/js/src/abstract/phemex.js +0 -9
- package/dist/cjs/js/src/abstract/poloniex.js +0 -9
- package/dist/cjs/js/src/abstract/poloniexfutures.js +0 -9
- package/dist/cjs/js/src/abstract/probit.js +0 -9
- package/dist/cjs/js/src/abstract/timex.js +0 -9
- package/dist/cjs/js/src/abstract/tokocrypto.js +0 -9
- package/dist/cjs/js/src/abstract/upbit.js +0 -9
- package/dist/cjs/js/src/abstract/wavesexchange.js +0 -9
- package/dist/cjs/js/src/abstract/wazirx.js +0 -9
- package/dist/cjs/js/src/abstract/whitebit.js +0 -9
- package/dist/cjs/js/src/abstract/woo.js +0 -9
- package/dist/cjs/js/src/abstract/yobit.js +0 -9
- package/dist/cjs/js/src/abstract/zaif.js +0 -9
- package/dist/cjs/js/src/abstract/zonda.js +0 -9
- package/dist/cjs/js/src/ace.js +0 -1058
- package/dist/cjs/js/src/alpaca.js +0 -1125
- package/dist/cjs/js/src/ascendex.js +0 -3365
- package/dist/cjs/js/src/base/Exchange.js +0 -5257
- package/dist/cjs/js/src/base/Precise.js +0 -263
- package/dist/cjs/js/src/base/errors.js +0 -299
- package/dist/cjs/js/src/base/functions/crypto.js +0 -78
- package/dist/cjs/js/src/base/functions/encode.js +0 -44
- package/dist/cjs/js/src/base/functions/generic.js +0 -193
- package/dist/cjs/js/src/base/functions/misc.js +0 -96
- package/dist/cjs/js/src/base/functions/number.js +0 -297
- package/dist/cjs/js/src/base/functions/platform.js +0 -28
- package/dist/cjs/js/src/base/functions/rsa.js +0 -34
- package/dist/cjs/js/src/base/functions/string.js +0 -48
- package/dist/cjs/js/src/base/functions/throttle.js +0 -66
- package/dist/cjs/js/src/base/functions/time.js +0 -187
- package/dist/cjs/js/src/base/functions/totp.js +0 -24
- package/dist/cjs/js/src/base/functions/type.js +0 -162
- package/dist/cjs/js/src/base/functions.js +0 -157
- package/dist/cjs/js/src/base/ws/Cache.js +0 -254
- package/dist/cjs/js/src/base/ws/Client.js +0 -299
- package/dist/cjs/js/src/base/ws/Future.js +0 -34
- package/dist/cjs/js/src/base/ws/OrderBook.js +0 -107
- package/dist/cjs/js/src/base/ws/OrderBookSide.js +0 -281
- package/dist/cjs/js/src/base/ws/WsClient.js +0 -69
- package/dist/cjs/js/src/bequant.js +0 -33
- package/dist/cjs/js/src/bigone.js +0 -2213
- package/dist/cjs/js/src/binance.js +0 -9845
- package/dist/cjs/js/src/binancecoinm.js +0 -45
- package/dist/cjs/js/src/binanceus.js +0 -92
- package/dist/cjs/js/src/binanceusdm.js +0 -58
- package/dist/cjs/js/src/bingx.js +0 -3846
- package/dist/cjs/js/src/bit2c.js +0 -916
- package/dist/cjs/js/src/bitbank.js +0 -1000
- package/dist/cjs/js/src/bitbay.js +0 -17
- package/dist/cjs/js/src/bitbns.js +0 -1220
- package/dist/cjs/js/src/bitcoincom.js +0 -17
- package/dist/cjs/js/src/bitfinex.js +0 -1670
- package/dist/cjs/js/src/bitfinex2.js +0 -2990
- package/dist/cjs/js/src/bitflyer.js +0 -1045
- package/dist/cjs/js/src/bitforex.js +0 -852
- package/dist/cjs/js/src/bitget.js +0 -8295
- package/dist/cjs/js/src/bithumb.js +0 -1090
- package/dist/cjs/js/src/bitmart.js +0 -4454
- package/dist/cjs/js/src/bitmex.js +0 -2881
- package/dist/cjs/js/src/bitopro.js +0 -1724
- package/dist/cjs/js/src/bitrue.js +0 -3253
- package/dist/cjs/js/src/bitso.js +0 -1753
- package/dist/cjs/js/src/bitstamp.js +0 -2188
- package/dist/cjs/js/src/bitteam.js +0 -2309
- package/dist/cjs/js/src/bitvavo.js +0 -1968
- package/dist/cjs/js/src/bl3p.js +0 -447
- package/dist/cjs/js/src/blockchaincom.js +0 -1160
- package/dist/cjs/js/src/btcalpha.js +0 -929
- package/dist/cjs/js/src/btcbox.js +0 -565
- package/dist/cjs/js/src/btcmarkets.js +0 -1237
- package/dist/cjs/js/src/btcturk.js +0 -929
- package/dist/cjs/js/src/bybit.js +0 -7650
- package/dist/cjs/js/src/cex.js +0 -1693
- package/dist/cjs/js/src/coinbase.js +0 -3424
- package/dist/cjs/js/src/coinbasepro.js +0 -1866
- package/dist/cjs/js/src/coincheck.js +0 -843
- package/dist/cjs/js/src/coinex.js +0 -5417
- package/dist/cjs/js/src/coinlist.js +0 -2337
- package/dist/cjs/js/src/coinmate.js +0 -989
- package/dist/cjs/js/src/coinone.js +0 -1185
- package/dist/cjs/js/src/coinsph.js +0 -1933
- package/dist/cjs/js/src/coinspot.js +0 -548
- package/dist/cjs/js/src/cryptocom.js +0 -3007
- package/dist/cjs/js/src/currencycom.js +0 -2015
- package/dist/cjs/js/src/delta.js +0 -3262
- package/dist/cjs/js/src/deribit.js +0 -3306
- package/dist/cjs/js/src/digifinex.js +0 -4307
- package/dist/cjs/js/src/exmo.js +0 -2645
- package/dist/cjs/js/src/fmfwio.js +0 -34
- package/dist/cjs/js/src/gate.js +0 -7077
- package/dist/cjs/js/src/gateio.js +0 -16
- package/dist/cjs/js/src/gemini.js +0 -1801
- package/dist/cjs/js/src/hitbtc.js +0 -3660
- package/dist/cjs/js/src/hitbtc3.js +0 -19
- package/dist/cjs/js/src/hollaex.js +0 -1882
- package/dist/cjs/js/src/htx.js +0 -9174
- package/dist/cjs/js/src/huobi.js +0 -16
- package/dist/cjs/js/src/huobijp.js +0 -1918
- package/dist/cjs/js/src/idex.js +0 -1770
- package/dist/cjs/js/src/independentreserve.js +0 -761
- package/dist/cjs/js/src/indodax.js +0 -1069
- package/dist/cjs/js/src/kraken.js +0 -2891
- package/dist/cjs/js/src/krakenfutures.js +0 -2407
- package/dist/cjs/js/src/kucoin.js +0 -4494
- package/dist/cjs/js/src/kucoinfutures.js +0 -2529
- package/dist/cjs/js/src/kuna.js +0 -1949
- package/dist/cjs/js/src/latoken.js +0 -1729
- package/dist/cjs/js/src/lbank.js +0 -2851
- package/dist/cjs/js/src/luno.js +0 -1044
- package/dist/cjs/js/src/lykke.js +0 -1303
- package/dist/cjs/js/src/mercado.js +0 -897
- package/dist/cjs/js/src/mexc.js +0 -5407
- package/dist/cjs/js/src/ndax.js +0 -2450
- package/dist/cjs/js/src/novadax.js +0 -1556
- package/dist/cjs/js/src/oceanex.js +0 -964
- package/dist/cjs/js/src/okcoin.js +0 -3115
- package/dist/cjs/js/src/okx.js +0 -7331
- package/dist/cjs/js/src/p2b.js +0 -1243
- package/dist/cjs/js/src/paymium.js +0 -597
- package/dist/cjs/js/src/phemex.js +0 -4725
- package/dist/cjs/js/src/poloniex.js +0 -2356
- package/dist/cjs/js/src/poloniexfutures.js +0 -1794
- package/dist/cjs/js/src/pro/alpaca.js +0 -714
- package/dist/cjs/js/src/pro/ascendex.js +0 -957
- package/dist/cjs/js/src/pro/bequant.js +0 -33
- package/dist/cjs/js/src/pro/binance.js +0 -2796
- package/dist/cjs/js/src/pro/binancecoinm.js +0 -23
- package/dist/cjs/js/src/pro/binanceus.js +0 -51
- package/dist/cjs/js/src/pro/binanceusdm.js +0 -32
- package/dist/cjs/js/src/pro/bingx.js +0 -944
- package/dist/cjs/js/src/pro/bitcoincom.js +0 -29
- package/dist/cjs/js/src/pro/bitfinex.js +0 -672
- package/dist/cjs/js/src/pro/bitfinex2.js +0 -1159
- package/dist/cjs/js/src/pro/bitget.js +0 -1733
- package/dist/cjs/js/src/pro/bitmart.js +0 -1486
- package/dist/cjs/js/src/pro/bitmex.js +0 -1576
- package/dist/cjs/js/src/pro/bitopro.js +0 -327
- package/dist/cjs/js/src/pro/bitrue.js +0 -462
- package/dist/cjs/js/src/pro/bitstamp.js +0 -547
- package/dist/cjs/js/src/pro/bitvavo.js +0 -704
- package/dist/cjs/js/src/pro/blockchaincom.js +0 -794
- package/dist/cjs/js/src/pro/bybit.js +0 -1843
- package/dist/cjs/js/src/pro/cex.js +0 -1510
- package/dist/cjs/js/src/pro/coinbase.js +0 -561
- package/dist/cjs/js/src/pro/coinbasepro.js +0 -968
- package/dist/cjs/js/src/pro/coinex.js +0 -1095
- package/dist/cjs/js/src/pro/cryptocom.js +0 -1020
- package/dist/cjs/js/src/pro/currencycom.js +0 -563
- package/dist/cjs/js/src/pro/deribit.js +0 -825
- package/dist/cjs/js/src/pro/exmo.js +0 -658
- package/dist/cjs/js/src/pro/gate.js +0 -1316
- package/dist/cjs/js/src/pro/gateio.js +0 -16
- package/dist/cjs/js/src/pro/gemini.js +0 -649
- package/dist/cjs/js/src/pro/hitbtc.js +0 -1294
- package/dist/cjs/js/src/pro/hollaex.js +0 -597
- package/dist/cjs/js/src/pro/htx.js +0 -2388
- package/dist/cjs/js/src/pro/huobi.js +0 -16
- package/dist/cjs/js/src/pro/huobijp.js +0 -606
- package/dist/cjs/js/src/pro/idex.js +0 -714
- package/dist/cjs/js/src/pro/independentreserve.js +0 -280
- package/dist/cjs/js/src/pro/kraken.js +0 -1364
- package/dist/cjs/js/src/pro/krakenfutures.js +0 -1506
- package/dist/cjs/js/src/pro/kucoin.js +0 -1054
- package/dist/cjs/js/src/pro/kucoinfutures.js +0 -981
- package/dist/cjs/js/src/pro/luno.js +0 -322
- package/dist/cjs/js/src/pro/mexc.js +0 -1170
- package/dist/cjs/js/src/pro/ndax.js +0 -545
- package/dist/cjs/js/src/pro/okcoin.js +0 -760
- package/dist/cjs/js/src/pro/okx.js +0 -1608
- package/dist/cjs/js/src/pro/phemex.js +0 -1511
- package/dist/cjs/js/src/pro/poloniex.js +0 -1253
- package/dist/cjs/js/src/pro/poloniexfutures.js +0 -1014
- package/dist/cjs/js/src/pro/probit.js +0 -586
- package/dist/cjs/js/src/pro/upbit.js +0 -234
- package/dist/cjs/js/src/pro/wazirx.js +0 -776
- package/dist/cjs/js/src/pro/whitebit.js +0 -927
- package/dist/cjs/js/src/pro/woo.js +0 -895
- package/dist/cjs/js/src/probit.js +0 -1867
- package/dist/cjs/js/src/static_dependencies/fflake/browser.js +0 -401
- package/dist/cjs/js/src/static_dependencies/jsencrypt/JSEncrypt.js +0 -195
- package/dist/cjs/js/src/static_dependencies/jsencrypt/JSEncryptRSAKey.js +0 -308
- package/dist/cjs/js/src/static_dependencies/jsencrypt/lib/asn1js/asn1.js +0 -554
- package/dist/cjs/js/src/static_dependencies/jsencrypt/lib/asn1js/base64.js +0 -94
- package/dist/cjs/js/src/static_dependencies/jsencrypt/lib/asn1js/hex.js +0 -70
- package/dist/cjs/js/src/static_dependencies/jsencrypt/lib/asn1js/int10.js +0 -91
- package/dist/cjs/js/src/static_dependencies/jsencrypt/lib/jsbn/base64.js +0 -16
- package/dist/cjs/js/src/static_dependencies/jsencrypt/lib/jsbn/jsbn.js +0 -1760
- package/dist/cjs/js/src/static_dependencies/jsencrypt/lib/jsbn/prng4.js +0 -52
- package/dist/cjs/js/src/static_dependencies/jsencrypt/lib/jsbn/rng.js +0 -81
- package/dist/cjs/js/src/static_dependencies/jsencrypt/lib/jsbn/rsa.js +0 -376
- package/dist/cjs/js/src/static_dependencies/jsencrypt/lib/jsbn/util.js +0 -70
- package/dist/cjs/js/src/static_dependencies/jsencrypt/lib/jsrsasign/asn1-1.0.js +0 -1580
- package/dist/cjs/js/src/static_dependencies/jsencrypt/lib/jsrsasign/yahoo.js +0 -74
- package/dist/cjs/js/src/static_dependencies/noble-curves/_shortw_utils.js +0 -24
- package/dist/cjs/js/src/static_dependencies/noble-curves/abstract/curve.js +0 -158
- package/dist/cjs/js/src/static_dependencies/noble-curves/abstract/edwards.js +0 -429
- package/dist/cjs/js/src/static_dependencies/noble-curves/abstract/hash-to-curve.js +0 -176
- package/dist/cjs/js/src/static_dependencies/noble-curves/abstract/modular.js +0 -324
- package/dist/cjs/js/src/static_dependencies/noble-curves/abstract/montgomery.js +0 -163
- package/dist/cjs/js/src/static_dependencies/noble-curves/abstract/utils.js +0 -245
- package/dist/cjs/js/src/static_dependencies/noble-curves/abstract/weierstrass.js +0 -1018
- package/dist/cjs/js/src/static_dependencies/noble-curves/ed25519.js +0 -383
- package/dist/cjs/js/src/static_dependencies/noble-curves/secp256k1.js +0 -258
- package/dist/cjs/js/src/static_dependencies/noble-hashes/_assert.js +0 -53
- package/dist/cjs/js/src/static_dependencies/noble-hashes/_sha2.js +0 -120
- package/dist/cjs/js/src/static_dependencies/noble-hashes/_u64.js +0 -69
- package/dist/cjs/js/src/static_dependencies/noble-hashes/crypto.js +0 -7
- package/dist/cjs/js/src/static_dependencies/noble-hashes/hmac.js +0 -83
- package/dist/cjs/js/src/static_dependencies/noble-hashes/md5.js +0 -240
- package/dist/cjs/js/src/static_dependencies/noble-hashes/sha1.js +0 -91
- package/dist/cjs/js/src/static_dependencies/noble-hashes/sha256.js +0 -130
- package/dist/cjs/js/src/static_dependencies/noble-hashes/sha3.js +0 -214
- package/dist/cjs/js/src/static_dependencies/noble-hashes/sha512.js +0 -239
- package/dist/cjs/js/src/static_dependencies/noble-hashes/utils.js +0 -93
- package/dist/cjs/js/src/static_dependencies/node-fetch/body.js +0 -354
- package/dist/cjs/js/src/static_dependencies/node-fetch/errors/abort-error.js +0 -16
- package/dist/cjs/js/src/static_dependencies/node-fetch/errors/base.js +0 -20
- package/dist/cjs/js/src/static_dependencies/node-fetch/errors/fetch-error.js +0 -30
- package/dist/cjs/js/src/static_dependencies/node-fetch/headers.js +0 -239
- package/dist/cjs/js/src/static_dependencies/node-fetch/index.js +0 -372
- package/dist/cjs/js/src/static_dependencies/node-fetch/request.js +0 -273
- package/dist/cjs/js/src/static_dependencies/node-fetch/response.js +0 -139
- package/dist/cjs/js/src/static_dependencies/node-fetch/utils/get-search.js +0 -14
- package/dist/cjs/js/src/static_dependencies/node-fetch/utils/is-redirect.js +0 -16
- package/dist/cjs/js/src/static_dependencies/node-fetch/utils/is.js +0 -81
- package/dist/cjs/js/src/static_dependencies/node-fetch/utils/referrer.js +0 -292
- package/dist/cjs/js/src/static_dependencies/proxies/agent-base/index.js +0 -103
- package/dist/cjs/js/src/static_dependencies/proxies/http-proxy-agent/index.js +0 -140
- package/dist/cjs/js/src/static_dependencies/proxies/https-proxy-agent/index.js +0 -175
- package/dist/cjs/js/src/static_dependencies/proxies/https-proxy-agent/parse-proxy-response.js +0 -95
- package/dist/cjs/js/src/static_dependencies/qs/index.cjs.js +0 -7
- package/dist/cjs/js/src/static_dependencies/scure-base/index.js +0 -383
- package/dist/cjs/js/src/timex.js +0 -1562
- package/dist/cjs/js/src/tokocrypto.js +0 -2542
- package/dist/cjs/js/src/upbit.js +0 -1844
- package/dist/cjs/js/src/wavesexchange.js +0 -2607
- package/dist/cjs/js/src/wazirx.js +0 -953
- package/dist/cjs/js/src/whitebit.js +0 -2309
- package/dist/cjs/js/src/woo.js +0 -2769
- package/dist/cjs/js/src/yobit.js +0 -1314
- package/dist/cjs/js/src/zaif.js +0 -736
- package/dist/cjs/js/src/zonda.js +0 -1883
- package/dist/cjs/src/abstract/bitpanda.js +0 -9
- package/test.ts +0 -0
- /package/dist/cjs/{js/src/abstract/ace.js → src/abstract/onetrading.js} +0 -0
- /package/dist/cjs/{js/src → src}/pro/coinone.js +0 -0
- /package/js/src/abstract/{bitpanda.js → onetrading.js} +0 -0
|
@@ -1,1294 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var hitbtc$1 = require('../hitbtc.js');
|
|
4
|
-
var Cache = require('../base/ws/Cache.js');
|
|
5
|
-
var sha256 = require('../static_dependencies/noble-hashes/sha256.js');
|
|
6
|
-
var errors = require('../base/errors.js');
|
|
7
|
-
|
|
8
|
-
// ---------------------------------------------------------------------------
|
|
9
|
-
// ---------------------------------------------------------------------------
|
|
10
|
-
class hitbtc extends hitbtc$1 {
|
|
11
|
-
describe() {
|
|
12
|
-
return this.deepExtend(super.describe(), {
|
|
13
|
-
'has': {
|
|
14
|
-
'ws': true,
|
|
15
|
-
'watchTicker': true,
|
|
16
|
-
'watchTickers': true,
|
|
17
|
-
'watchTrades': true,
|
|
18
|
-
'watchOrderBook': true,
|
|
19
|
-
'watchBalance': true,
|
|
20
|
-
'watchOrders': true,
|
|
21
|
-
'watchOHLCV': true,
|
|
22
|
-
'watchMyTrades': false,
|
|
23
|
-
'createOrderWs': true,
|
|
24
|
-
'cancelOrderWs': true,
|
|
25
|
-
'fetchOpenOrdersWs': true,
|
|
26
|
-
'cancelAllOrdersWs': true,
|
|
27
|
-
},
|
|
28
|
-
'urls': {
|
|
29
|
-
'api': {
|
|
30
|
-
'ws': {
|
|
31
|
-
'public': 'wss://api.hitbtc.com/api/3/ws/public',
|
|
32
|
-
'private': 'wss://api.hitbtc.com/api/3/ws/trading',
|
|
33
|
-
},
|
|
34
|
-
},
|
|
35
|
-
},
|
|
36
|
-
'options': {
|
|
37
|
-
'tradesLimit': 1000,
|
|
38
|
-
'watchTicker': {
|
|
39
|
-
'method': 'ticker/{speed}', // 'ticker/{speed}' or 'ticker/price/{speed}'
|
|
40
|
-
},
|
|
41
|
-
'watchTickers': {
|
|
42
|
-
'method': 'ticker/{speed}', // 'ticker/{speed}','ticker/price/{speed}', 'ticker/{speed}/batch', or 'ticker/{speed}/price/batch''
|
|
43
|
-
},
|
|
44
|
-
'watchOrderBook': {
|
|
45
|
-
'method': 'orderbook/full', // 'orderbook/full', 'orderbook/{depth}/{speed}', 'orderbook/{depth}/{speed}/batch', 'orderbook/top/{speed}', or 'orderbook/top/{speed}/batch'
|
|
46
|
-
},
|
|
47
|
-
},
|
|
48
|
-
'timeframes': {
|
|
49
|
-
'1m': 'M1',
|
|
50
|
-
'3m': 'M3',
|
|
51
|
-
'5m': 'M5',
|
|
52
|
-
'15m': 'M15',
|
|
53
|
-
'30m': 'M30',
|
|
54
|
-
'1h': 'H1',
|
|
55
|
-
'4h': 'H4',
|
|
56
|
-
'1d': 'D1',
|
|
57
|
-
'1w': 'D7',
|
|
58
|
-
'1M': '1M',
|
|
59
|
-
},
|
|
60
|
-
'streaming': {
|
|
61
|
-
'keepAlive': 4000,
|
|
62
|
-
},
|
|
63
|
-
});
|
|
64
|
-
}
|
|
65
|
-
async authenticate() {
|
|
66
|
-
/**
|
|
67
|
-
* @ignore
|
|
68
|
-
* @method
|
|
69
|
-
* @description authenticates the user to access private web socket channels
|
|
70
|
-
* @see https://api.hitbtc.com/#socket-authentication
|
|
71
|
-
* @returns {object} response from exchange
|
|
72
|
-
*/
|
|
73
|
-
this.checkRequiredCredentials();
|
|
74
|
-
const url = this.urls['api']['ws']['private'];
|
|
75
|
-
const messageHash = 'authenticated';
|
|
76
|
-
const client = this.client(url);
|
|
77
|
-
const future = client.future(messageHash);
|
|
78
|
-
const authenticated = this.safeValue(client.subscriptions, messageHash);
|
|
79
|
-
if (authenticated === undefined) {
|
|
80
|
-
const timestamp = this.milliseconds();
|
|
81
|
-
const signature = this.hmac(this.encode(this.numberToString(timestamp)), this.encode(this.secret), sha256.sha256, 'hex');
|
|
82
|
-
const request = {
|
|
83
|
-
'method': 'login',
|
|
84
|
-
'params': {
|
|
85
|
-
'type': 'HS256',
|
|
86
|
-
'api_key': this.apiKey,
|
|
87
|
-
'timestamp': timestamp,
|
|
88
|
-
'signature': signature,
|
|
89
|
-
},
|
|
90
|
-
};
|
|
91
|
-
this.watch(url, messageHash, request, messageHash);
|
|
92
|
-
//
|
|
93
|
-
// {
|
|
94
|
-
// "jsonrpc": "2.0",
|
|
95
|
-
// "result": true
|
|
96
|
-
// }
|
|
97
|
-
//
|
|
98
|
-
// # Failure to return results
|
|
99
|
-
//
|
|
100
|
-
// {
|
|
101
|
-
// "jsonrpc": "2.0",
|
|
102
|
-
// "error": {
|
|
103
|
-
// "code": 1002,
|
|
104
|
-
// "message": "Authorization is required or has been failed",
|
|
105
|
-
// "description": "invalid signature format"
|
|
106
|
-
// }
|
|
107
|
-
// }
|
|
108
|
-
//
|
|
109
|
-
}
|
|
110
|
-
return future;
|
|
111
|
-
}
|
|
112
|
-
async subscribePublic(name, symbols = undefined, params = {}) {
|
|
113
|
-
/**
|
|
114
|
-
* @ignore
|
|
115
|
-
* @method
|
|
116
|
-
* @param {string} name websocket endpoint name
|
|
117
|
-
* @param {string[]} [symbols] unified CCXT symbol(s)
|
|
118
|
-
* @param {object} [params] extra parameters specific to the hitbtc api
|
|
119
|
-
*/
|
|
120
|
-
await this.loadMarkets();
|
|
121
|
-
const url = this.urls['api']['ws']['public'];
|
|
122
|
-
let messageHash = name;
|
|
123
|
-
if (symbols !== undefined) {
|
|
124
|
-
messageHash = messageHash + '::' + symbols.join(',');
|
|
125
|
-
}
|
|
126
|
-
const subscribe = {
|
|
127
|
-
'method': 'subscribe',
|
|
128
|
-
'id': this.nonce(),
|
|
129
|
-
'ch': name,
|
|
130
|
-
};
|
|
131
|
-
const request = this.extend(subscribe, params);
|
|
132
|
-
return await this.watch(url, messageHash, request, messageHash);
|
|
133
|
-
}
|
|
134
|
-
async subscribePrivate(name, symbol = undefined, params = {}) {
|
|
135
|
-
/**
|
|
136
|
-
* @ignore
|
|
137
|
-
* @method
|
|
138
|
-
* @param {string} name websocket endpoint name
|
|
139
|
-
* @param {string} [symbol] unified CCXT symbol
|
|
140
|
-
* @param {object} [params] extra parameters specific to the hitbtc api
|
|
141
|
-
*/
|
|
142
|
-
await this.loadMarkets();
|
|
143
|
-
await this.authenticate();
|
|
144
|
-
const url = this.urls['api']['ws']['private'];
|
|
145
|
-
const splitName = name.split('_subscribe');
|
|
146
|
-
let messageHash = this.safeString(splitName, 0);
|
|
147
|
-
if (symbol !== undefined) {
|
|
148
|
-
messageHash = messageHash + '::' + symbol;
|
|
149
|
-
}
|
|
150
|
-
const subscribe = {
|
|
151
|
-
'method': name,
|
|
152
|
-
'params': params,
|
|
153
|
-
'id': this.nonce(),
|
|
154
|
-
};
|
|
155
|
-
return await this.watch(url, messageHash, subscribe, messageHash);
|
|
156
|
-
}
|
|
157
|
-
async tradeRequest(name, params = {}) {
|
|
158
|
-
/**
|
|
159
|
-
* @ignore
|
|
160
|
-
* @method
|
|
161
|
-
* @param {string} name websocket endpoint name
|
|
162
|
-
* @param {string} [symbol] unified CCXT symbol
|
|
163
|
-
* @param {object} [params] extra parameters specific to the hitbtc api
|
|
164
|
-
*/
|
|
165
|
-
await this.loadMarkets();
|
|
166
|
-
await this.authenticate();
|
|
167
|
-
const url = this.urls['api']['ws']['private'];
|
|
168
|
-
const messageHash = this.nonce();
|
|
169
|
-
const subscribe = {
|
|
170
|
-
'method': name,
|
|
171
|
-
'params': params,
|
|
172
|
-
'id': messageHash,
|
|
173
|
-
};
|
|
174
|
-
return await this.watch(url, messageHash, subscribe, messageHash);
|
|
175
|
-
}
|
|
176
|
-
async watchOrderBook(symbol, limit = undefined, params = {}) {
|
|
177
|
-
/**
|
|
178
|
-
* @method
|
|
179
|
-
* @name hitbtc#watchOrderBook
|
|
180
|
-
* @description watches information on open orders with bid (buy) and ask (sell) prices, volumes and other data
|
|
181
|
-
* @see https://api.hitbtc.com/#subscribe-to-full-order-book
|
|
182
|
-
* @see https://api.hitbtc.com/#subscribe-to-partial-order-book
|
|
183
|
-
* @see https://api.hitbtc.com/#subscribe-to-partial-order-book-in-batches
|
|
184
|
-
* @see https://api.hitbtc.com/#subscribe-to-top-of-book
|
|
185
|
-
* @see https://api.hitbtc.com/#subscribe-to-top-of-book-in-batches
|
|
186
|
-
* @param {string} symbol unified symbol of the market to fetch the order book for
|
|
187
|
-
* @param {int} [limit] the maximum amount of order book entries to return
|
|
188
|
-
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
189
|
-
* @param {string} [params.method] 'orderbook/full', 'orderbook/{depth}/{speed}', 'orderbook/{depth}/{speed}/batch', 'orderbook/top/{speed}', or 'orderbook/top/{speed}/batch'
|
|
190
|
-
* @param {int} [params.depth] 5 , 10, or 20 (default)
|
|
191
|
-
* @param {int} [params.speed] 100 (default), 500, or 1000
|
|
192
|
-
* @returns {object} A dictionary of [order book structures]{@link https://docs.ccxt.com/#/?id=order-book-structure} indexed by market symbols
|
|
193
|
-
*/
|
|
194
|
-
const options = this.safeValue(this.options, 'watchOrderBook');
|
|
195
|
-
const defaultMethod = this.safeString(options, 'method', 'orderbook/full');
|
|
196
|
-
let name = this.safeString2(params, 'method', 'defaultMethod', defaultMethod);
|
|
197
|
-
const depth = this.safeString(params, 'depth', '20');
|
|
198
|
-
const speed = this.safeString(params, 'depth', '100');
|
|
199
|
-
if (name === 'orderbook/{depth}/{speed}') {
|
|
200
|
-
name = 'orderbook/D' + depth + '/' + speed + 'ms';
|
|
201
|
-
}
|
|
202
|
-
else if (name === 'orderbook/{depth}/{speed}/batch') {
|
|
203
|
-
name = 'orderbook/D' + depth + '/' + speed + 'ms/batch';
|
|
204
|
-
}
|
|
205
|
-
else if (name === 'orderbook/top/{speed}') {
|
|
206
|
-
name = 'orderbook/top/' + speed + 'ms';
|
|
207
|
-
}
|
|
208
|
-
else if (name === 'orderbook/top/{speed}/batch') {
|
|
209
|
-
name = 'orderbook/top/' + speed + 'ms/batch';
|
|
210
|
-
}
|
|
211
|
-
const market = this.market(symbol);
|
|
212
|
-
const request = {
|
|
213
|
-
'params': {
|
|
214
|
-
'symbols': [market['id']],
|
|
215
|
-
},
|
|
216
|
-
};
|
|
217
|
-
const orderbook = await this.subscribePublic(name, [symbol], this.deepExtend(request, params));
|
|
218
|
-
return orderbook.limit();
|
|
219
|
-
}
|
|
220
|
-
handleOrderBook(client, message) {
|
|
221
|
-
//
|
|
222
|
-
// {
|
|
223
|
-
// "ch": "orderbook/full", // Channel
|
|
224
|
-
// "snapshot": {
|
|
225
|
-
// "ETHBTC": {
|
|
226
|
-
// "t": 1626866578796, // Timestamp in milliseconds
|
|
227
|
-
// "s": 27617207, // Sequence number
|
|
228
|
-
// "a": [ // Asks
|
|
229
|
-
// ["0.060506", "0"],
|
|
230
|
-
// ["0.060549", "12.6431"],
|
|
231
|
-
// ["0.060570", "0"],
|
|
232
|
-
// ["0.060612", "0"]
|
|
233
|
-
// ],
|
|
234
|
-
// "b": [ // Bids
|
|
235
|
-
// ["0.060439", "4.4095"],
|
|
236
|
-
// ["0.060414", "0"],
|
|
237
|
-
// ["0.060407", "7.3349"],
|
|
238
|
-
// ["0.060390", "0"]
|
|
239
|
-
// ]
|
|
240
|
-
// }
|
|
241
|
-
// }
|
|
242
|
-
// }
|
|
243
|
-
//
|
|
244
|
-
const data = this.safeValue2(message, 'snapshot', 'update', {});
|
|
245
|
-
const marketIds = Object.keys(data);
|
|
246
|
-
const channel = this.safeString(message, 'ch');
|
|
247
|
-
for (let i = 0; i < marketIds.length; i++) {
|
|
248
|
-
const marketId = marketIds[i];
|
|
249
|
-
const market = this.safeMarket(marketId);
|
|
250
|
-
const symbol = market['symbol'];
|
|
251
|
-
const item = data[marketId];
|
|
252
|
-
const messageHash = channel + '::' + symbol;
|
|
253
|
-
if (!(symbol in this.orderbooks)) {
|
|
254
|
-
const subscription = this.safeValue(client.subscriptions, messageHash, {});
|
|
255
|
-
const limit = this.safeInteger(subscription, 'limit');
|
|
256
|
-
this.orderbooks[symbol] = this.orderBook({}, limit);
|
|
257
|
-
}
|
|
258
|
-
const timestamp = this.safeInteger(item, 't');
|
|
259
|
-
const nonce = this.safeInteger(item, 's');
|
|
260
|
-
const orderbook = this.orderbooks[symbol];
|
|
261
|
-
const asks = this.safeValue(item, 'a', []);
|
|
262
|
-
const bids = this.safeValue(item, 'b', []);
|
|
263
|
-
this.handleDeltas(orderbook['asks'], asks);
|
|
264
|
-
this.handleDeltas(orderbook['bids'], bids);
|
|
265
|
-
orderbook['timestamp'] = timestamp;
|
|
266
|
-
orderbook['datetime'] = this.iso8601(timestamp);
|
|
267
|
-
orderbook['nonce'] = nonce;
|
|
268
|
-
orderbook['symbol'] = symbol;
|
|
269
|
-
this.orderbooks[symbol] = orderbook;
|
|
270
|
-
client.resolve(orderbook, messageHash);
|
|
271
|
-
}
|
|
272
|
-
}
|
|
273
|
-
handleDelta(bookside, delta) {
|
|
274
|
-
const price = this.safeNumber(delta, 0);
|
|
275
|
-
const amount = this.safeNumber(delta, 1);
|
|
276
|
-
bookside.store(price, amount);
|
|
277
|
-
}
|
|
278
|
-
handleDeltas(bookside, deltas) {
|
|
279
|
-
for (let i = 0; i < deltas.length; i++) {
|
|
280
|
-
this.handleDelta(bookside, deltas[i]);
|
|
281
|
-
}
|
|
282
|
-
}
|
|
283
|
-
async watchTicker(symbol, params = {}) {
|
|
284
|
-
/**
|
|
285
|
-
* @method
|
|
286
|
-
* @name hitbtc#watchTicker
|
|
287
|
-
* @description watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
|
|
288
|
-
* @see https://api.hitbtc.com/#subscribe-to-ticker
|
|
289
|
-
* @see https://api.hitbtc.com/#subscribe-to-ticker-in-batches
|
|
290
|
-
* @see https://api.hitbtc.com/#subscribe-to-mini-ticker
|
|
291
|
-
* @see https://api.hitbtc.com/#subscribe-to-mini-ticker-in-batches
|
|
292
|
-
* @param {string} symbol unified symbol of the market to fetch the ticker for
|
|
293
|
-
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
294
|
-
* @param {string} [params.method] 'ticker/{speed}' (default), or 'ticker/price/{speed}'
|
|
295
|
-
* @param {string} [params.speed] '1s' (default), or '3s'
|
|
296
|
-
* @returns {object} a [ticker structure]{@link https://docs.ccxt.com/#/?id=ticker-structure}
|
|
297
|
-
*/
|
|
298
|
-
const options = this.safeValue(this.options, 'watchTicker');
|
|
299
|
-
const defaultMethod = this.safeString(options, 'method', 'ticker/{speed}');
|
|
300
|
-
const method = this.safeString2(params, 'method', 'defaultMethod', defaultMethod);
|
|
301
|
-
const speed = this.safeString(params, 'speed', '1s');
|
|
302
|
-
const name = this.implodeParams(method, { 'speed': speed });
|
|
303
|
-
params = this.omit(params, ['method', 'speed']);
|
|
304
|
-
const market = this.market(symbol);
|
|
305
|
-
const request = {
|
|
306
|
-
'params': {
|
|
307
|
-
'symbols': [market['id']],
|
|
308
|
-
},
|
|
309
|
-
};
|
|
310
|
-
const result = await this.subscribePublic(name, [symbol], this.deepExtend(request, params));
|
|
311
|
-
return this.safeValue(result, symbol);
|
|
312
|
-
}
|
|
313
|
-
async watchTickers(symbols = undefined, params = {}) {
|
|
314
|
-
/**
|
|
315
|
-
* @method
|
|
316
|
-
* @name hitbtc#watchTicker
|
|
317
|
-
* @description watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
|
|
318
|
-
* @param {string} symbol unified symbol of the market to fetch the ticker for
|
|
319
|
-
* @param {object} params extra parameters specific to the exchange API endpoint
|
|
320
|
-
* @param {string} params.method 'ticker/{speed}' (default),'ticker/price/{speed}', 'ticker/{speed}/batch', or 'ticker/{speed}/price/batch''
|
|
321
|
-
* @param {string} params.speed '1s' (default), or '3s'
|
|
322
|
-
* @returns {object} a [ticker structure]{@link https://docs.ccxt.com/en/latest/manual.html#ticker-structure}
|
|
323
|
-
*/
|
|
324
|
-
await this.loadMarkets();
|
|
325
|
-
const options = this.safeValue(this.options, 'watchTicker');
|
|
326
|
-
const defaultMethod = this.safeString(options, 'method', 'ticker/{speed}');
|
|
327
|
-
const method = this.safeString2(params, 'method', 'defaultMethod', defaultMethod);
|
|
328
|
-
const speed = this.safeString(params, 'speed', '1s');
|
|
329
|
-
const name = this.implodeParams(method, { 'speed': speed });
|
|
330
|
-
params = this.omit(params, ['method', 'speed']);
|
|
331
|
-
const marketIds = [];
|
|
332
|
-
if (symbols === undefined) {
|
|
333
|
-
marketIds.push('*');
|
|
334
|
-
}
|
|
335
|
-
else {
|
|
336
|
-
for (let i = 0; i < symbols.length; i++) {
|
|
337
|
-
const marketId = this.marketId(symbols[i]);
|
|
338
|
-
marketIds.push(marketId);
|
|
339
|
-
}
|
|
340
|
-
}
|
|
341
|
-
const request = {
|
|
342
|
-
'params': {
|
|
343
|
-
'symbols': marketIds,
|
|
344
|
-
},
|
|
345
|
-
};
|
|
346
|
-
const tickers = await this.subscribePublic(name, symbols, this.deepExtend(request, params));
|
|
347
|
-
if (this.newUpdates) {
|
|
348
|
-
return tickers;
|
|
349
|
-
}
|
|
350
|
-
return this.filterByArray(this.tickers, 'symbol', symbols);
|
|
351
|
-
}
|
|
352
|
-
handleTicker(client, message) {
|
|
353
|
-
//
|
|
354
|
-
// {
|
|
355
|
-
// "ch": "ticker/1s",
|
|
356
|
-
// "data": {
|
|
357
|
-
// "ETHBTC": {
|
|
358
|
-
// "t": 1614815872000, // Timestamp in milliseconds
|
|
359
|
-
// "a": "0.031175", // Best ask
|
|
360
|
-
// "A": "0.03329", // Best ask quantity
|
|
361
|
-
// "b": "0.031148", // Best bid
|
|
362
|
-
// "B": "0.10565", // Best bid quantity
|
|
363
|
-
// "c": "0.031210", // Last price
|
|
364
|
-
// "o": "0.030781", // Open price
|
|
365
|
-
// "h": "0.031788", // High price
|
|
366
|
-
// "l": "0.030733", // Low price
|
|
367
|
-
// "v": "62.587", // Base asset volume
|
|
368
|
-
// "q": "1.951420577", // Quote asset volume
|
|
369
|
-
// "p": "0.000429", // Price change
|
|
370
|
-
// "P": "1.39", // Price change percent
|
|
371
|
-
// "L": 1182694927 // Last trade identifier
|
|
372
|
-
// }
|
|
373
|
-
// }
|
|
374
|
-
// }
|
|
375
|
-
//
|
|
376
|
-
// {
|
|
377
|
-
// "ch": "ticker/price/1s",
|
|
378
|
-
// "data": {
|
|
379
|
-
// "BTCUSDT": {
|
|
380
|
-
// "t": 1614815872030,
|
|
381
|
-
// "o": "32636.79",
|
|
382
|
-
// "c": "32085.51",
|
|
383
|
-
// "h": "33379.92",
|
|
384
|
-
// "l": "30683.28",
|
|
385
|
-
// "v": "11.90667",
|
|
386
|
-
// "q": "384081.1955629"
|
|
387
|
-
// }
|
|
388
|
-
// }
|
|
389
|
-
// }
|
|
390
|
-
//
|
|
391
|
-
const data = this.safeValue(message, 'data', {});
|
|
392
|
-
const marketIds = Object.keys(data);
|
|
393
|
-
const channel = this.safeString(message, 'ch');
|
|
394
|
-
const newTickers = {};
|
|
395
|
-
for (let i = 0; i < marketIds.length; i++) {
|
|
396
|
-
const marketId = marketIds[i];
|
|
397
|
-
const market = this.safeMarket(marketId);
|
|
398
|
-
const symbol = market['symbol'];
|
|
399
|
-
const ticker = this.parseWsTicker(data[marketId], market);
|
|
400
|
-
this.tickers[symbol] = ticker;
|
|
401
|
-
newTickers[symbol] = ticker;
|
|
402
|
-
const messageHash = channel + '::' + symbol;
|
|
403
|
-
client.resolve(newTickers, messageHash);
|
|
404
|
-
}
|
|
405
|
-
const messageHashes = this.findMessageHashes(client, channel + '::');
|
|
406
|
-
for (let i = 0; i < messageHashes.length; i++) {
|
|
407
|
-
const messageHash = messageHashes[i];
|
|
408
|
-
const parts = messageHash.split('::');
|
|
409
|
-
const symbolsString = parts[1];
|
|
410
|
-
const symbols = symbolsString.split(',');
|
|
411
|
-
const tickers = this.filterByArray(newTickers, 'symbol', symbols);
|
|
412
|
-
const tickersSymbols = Object.keys(tickers);
|
|
413
|
-
const numTickers = tickersSymbols.length;
|
|
414
|
-
if (numTickers > 0) {
|
|
415
|
-
client.resolve(tickers, messageHash);
|
|
416
|
-
}
|
|
417
|
-
}
|
|
418
|
-
client.resolve(this.tickers, channel);
|
|
419
|
-
return message;
|
|
420
|
-
}
|
|
421
|
-
parseWsTicker(ticker, market = undefined) {
|
|
422
|
-
//
|
|
423
|
-
// {
|
|
424
|
-
// "t": 1614815872000, // Timestamp in milliseconds
|
|
425
|
-
// "a": "0.031175", // Best ask
|
|
426
|
-
// "A": "0.03329", // Best ask quantity
|
|
427
|
-
// "b": "0.031148", // Best bid
|
|
428
|
-
// "B": "0.10565", // Best bid quantity
|
|
429
|
-
// "c": "0.031210", // Last price
|
|
430
|
-
// "o": "0.030781", // Open price
|
|
431
|
-
// "h": "0.031788", // High price
|
|
432
|
-
// "l": "0.030733", // Low price
|
|
433
|
-
// "v": "62.587", // Base asset volume
|
|
434
|
-
// "q": "1.951420577", // Quote asset volume
|
|
435
|
-
// "p": "0.000429", // Price change
|
|
436
|
-
// "P": "1.39", // Price change percent
|
|
437
|
-
// "L": 1182694927 // Last trade identifier
|
|
438
|
-
// }
|
|
439
|
-
//
|
|
440
|
-
// {
|
|
441
|
-
// "t": 1614815872030,
|
|
442
|
-
// "o": "32636.79",
|
|
443
|
-
// "c": "32085.51",
|
|
444
|
-
// "h": "33379.92",
|
|
445
|
-
// "l": "30683.28",
|
|
446
|
-
// "v": "11.90667",
|
|
447
|
-
// "q": "384081.1955629"
|
|
448
|
-
// }
|
|
449
|
-
//
|
|
450
|
-
const timestamp = this.safeInteger(ticker, 't');
|
|
451
|
-
const symbol = this.safeSymbol(undefined, market);
|
|
452
|
-
const last = this.safeString(ticker, 'c');
|
|
453
|
-
return this.safeTicker({
|
|
454
|
-
'symbol': symbol,
|
|
455
|
-
'timestamp': timestamp,
|
|
456
|
-
'datetime': this.iso8601(timestamp),
|
|
457
|
-
'high': this.safeString(ticker, 'h'),
|
|
458
|
-
'low': this.safeString(ticker, 'l'),
|
|
459
|
-
'bid': this.safeString(ticker, 'b'),
|
|
460
|
-
'bidVolume': this.safeString(ticker, 'B'),
|
|
461
|
-
'ask': this.safeString(ticker, 'a'),
|
|
462
|
-
'askVolume': this.safeString(ticker, 'A'),
|
|
463
|
-
'vwap': undefined,
|
|
464
|
-
'open': this.safeString(ticker, 'o'),
|
|
465
|
-
'close': last,
|
|
466
|
-
'last': last,
|
|
467
|
-
'previousClose': undefined,
|
|
468
|
-
'change': undefined,
|
|
469
|
-
'percentage': undefined,
|
|
470
|
-
'average': undefined,
|
|
471
|
-
'baseVolume': this.safeString(ticker, 'v'),
|
|
472
|
-
'quoteVolume': this.safeString(ticker, 'q'),
|
|
473
|
-
'info': ticker,
|
|
474
|
-
}, market);
|
|
475
|
-
}
|
|
476
|
-
async watchTrades(symbol, since = undefined, limit = undefined, params = {}) {
|
|
477
|
-
/**
|
|
478
|
-
* @method
|
|
479
|
-
* @name hitbtc#watchTrades
|
|
480
|
-
* @description get the list of most recent trades for a particular symbol
|
|
481
|
-
* @see https://api.hitbtc.com/#subscribe-to-trades
|
|
482
|
-
* @param {string} symbol unified symbol of the market to fetch trades for
|
|
483
|
-
* @param {int} [since] timestamp in ms of the earliest trade to fetch
|
|
484
|
-
* @param {int} [limit] the maximum amount of trades to fetch
|
|
485
|
-
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
486
|
-
* @returns {object[]} a list of [trade structures]{@link https://docs.ccxt.com/#/?id=public-trades}
|
|
487
|
-
*/
|
|
488
|
-
await this.loadMarkets();
|
|
489
|
-
const market = this.market(symbol);
|
|
490
|
-
const request = {
|
|
491
|
-
'params': {
|
|
492
|
-
'symbols': [market['id']],
|
|
493
|
-
},
|
|
494
|
-
};
|
|
495
|
-
if (limit !== undefined) {
|
|
496
|
-
request['limit'] = limit;
|
|
497
|
-
}
|
|
498
|
-
const trades = await this.subscribePublic('trades', [symbol], this.deepExtend(request, params));
|
|
499
|
-
if (this.newUpdates) {
|
|
500
|
-
limit = trades.getLimit(symbol, limit);
|
|
501
|
-
}
|
|
502
|
-
return this.filterBySinceLimit(trades, since, limit, 'timestamp');
|
|
503
|
-
}
|
|
504
|
-
handleTrades(client, message) {
|
|
505
|
-
//
|
|
506
|
-
// {
|
|
507
|
-
// "result": {
|
|
508
|
-
// "ch": "trades", // Channel
|
|
509
|
-
// "subscriptions": ["ETHBTC", "BTCUSDT"]
|
|
510
|
-
// },
|
|
511
|
-
// "id": 123
|
|
512
|
-
// }
|
|
513
|
-
//
|
|
514
|
-
// Notification snapshot
|
|
515
|
-
//
|
|
516
|
-
// {
|
|
517
|
-
// "ch": "trades", // Channel
|
|
518
|
-
// "snapshot": {
|
|
519
|
-
// "BTCUSDT": [{
|
|
520
|
-
// "t": 1626861109494, // Timestamp in milliseconds
|
|
521
|
-
// "i": 1555634969, // Trade identifier
|
|
522
|
-
// "p": "30881.96", // Price
|
|
523
|
-
// "q": "12.66828", // Quantity
|
|
524
|
-
// "s": "buy" // Side
|
|
525
|
-
// }]
|
|
526
|
-
// }
|
|
527
|
-
// }
|
|
528
|
-
//
|
|
529
|
-
// Notification update
|
|
530
|
-
//
|
|
531
|
-
// {
|
|
532
|
-
// "ch": "trades",
|
|
533
|
-
// "update": {
|
|
534
|
-
// "BTCUSDT": [{
|
|
535
|
-
// "t": 1626861123552,
|
|
536
|
-
// "i": 1555634969,
|
|
537
|
-
// "p": "30877.68",
|
|
538
|
-
// "q": "0.00006",
|
|
539
|
-
// "s": "sell"
|
|
540
|
-
// }]
|
|
541
|
-
// }
|
|
542
|
-
// }
|
|
543
|
-
//
|
|
544
|
-
const data = this.safeValue2(message, 'snapshot', 'update', {});
|
|
545
|
-
const marketIds = Object.keys(data);
|
|
546
|
-
for (let i = 0; i < marketIds.length; i++) {
|
|
547
|
-
const marketId = marketIds[i];
|
|
548
|
-
const market = this.safeMarket(marketId);
|
|
549
|
-
const tradesLimit = this.safeInteger(this.options, 'tradesLimit', 1000);
|
|
550
|
-
const symbol = market['symbol'];
|
|
551
|
-
let stored = this.safeValue(this.trades, symbol);
|
|
552
|
-
if (stored === undefined) {
|
|
553
|
-
stored = new Cache.ArrayCache(tradesLimit);
|
|
554
|
-
this.trades[symbol] = stored;
|
|
555
|
-
}
|
|
556
|
-
const trades = this.parseWsTrades(data[marketId], market);
|
|
557
|
-
for (let j = 0; j < trades.length; j++) {
|
|
558
|
-
stored.append(trades[j]);
|
|
559
|
-
}
|
|
560
|
-
const messageHash = 'trades::' + symbol;
|
|
561
|
-
client.resolve(stored, messageHash);
|
|
562
|
-
}
|
|
563
|
-
return message;
|
|
564
|
-
}
|
|
565
|
-
parseWsTrades(trades, market = undefined, since = undefined, limit = undefined, params = {}) {
|
|
566
|
-
trades = this.toArray(trades);
|
|
567
|
-
let result = [];
|
|
568
|
-
for (let i = 0; i < trades.length; i++) {
|
|
569
|
-
const trade = this.extend(this.parseWsTrade(trades[i], market), params);
|
|
570
|
-
result.push(trade);
|
|
571
|
-
}
|
|
572
|
-
result = this.sortBy2(result, 'timestamp', 'id');
|
|
573
|
-
const symbol = this.safeString(market, 'symbol');
|
|
574
|
-
return this.filterBySymbolSinceLimit(result, symbol, since, limit);
|
|
575
|
-
}
|
|
576
|
-
parseWsTrade(trade, market = undefined) {
|
|
577
|
-
//
|
|
578
|
-
// {
|
|
579
|
-
// "t": 1626861123552, // Timestamp in milliseconds
|
|
580
|
-
// "i": 1555634969, // Trade identifier
|
|
581
|
-
// "p": "30877.68", // Price
|
|
582
|
-
// "q": "0.00006", // Quantity
|
|
583
|
-
// "s": "sell" // Side
|
|
584
|
-
// }
|
|
585
|
-
//
|
|
586
|
-
const timestamp = this.safeInteger(trade, 't');
|
|
587
|
-
return this.safeTrade({
|
|
588
|
-
'info': trade,
|
|
589
|
-
'id': this.safeString(trade, 'i'),
|
|
590
|
-
'order': undefined,
|
|
591
|
-
'timestamp': timestamp,
|
|
592
|
-
'datetime': this.iso8601(timestamp),
|
|
593
|
-
'symbol': this.safeString(market, 'symbol'),
|
|
594
|
-
'type': undefined,
|
|
595
|
-
'side': this.safeString(trade, 's'),
|
|
596
|
-
'takerOrMaker': undefined,
|
|
597
|
-
'price': this.safeString(trade, 'p'),
|
|
598
|
-
'amount': this.safeString(trade, 'q'),
|
|
599
|
-
'cost': undefined,
|
|
600
|
-
'fee': undefined,
|
|
601
|
-
}, market);
|
|
602
|
-
}
|
|
603
|
-
async watchOHLCV(symbol, timeframe = '1m', since = undefined, limit = undefined, params = {}) {
|
|
604
|
-
/**
|
|
605
|
-
* @method
|
|
606
|
-
* @name hitbtc#watchOHLCV
|
|
607
|
-
* @description watches historical candlestick data containing the open, high, low, and close price, and the volume of a market
|
|
608
|
-
* @see https://api.hitbtc.com/#subscribe-to-candles
|
|
609
|
-
* @param {string} symbol unified symbol of the market to fetch OHLCV data for
|
|
610
|
-
* @param {string} [timeframe] the length of time each candle represents
|
|
611
|
-
* @param {int} [since] not used by hitbtc watchOHLCV
|
|
612
|
-
* @param {int} [limit] 0 – 1000, default value = 0 (no history returned)
|
|
613
|
-
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
614
|
-
* @returns {int[][]} A list of candles ordered as timestamp, open, high, low, close, volume
|
|
615
|
-
*/
|
|
616
|
-
const period = this.safeString(this.timeframes, timeframe, timeframe);
|
|
617
|
-
const name = 'candles/' + period;
|
|
618
|
-
const market = this.market(symbol);
|
|
619
|
-
const request = {
|
|
620
|
-
'params': {
|
|
621
|
-
'symbols': [market['id']],
|
|
622
|
-
},
|
|
623
|
-
};
|
|
624
|
-
if (limit !== undefined) {
|
|
625
|
-
request['params']['limit'] = limit;
|
|
626
|
-
}
|
|
627
|
-
const ohlcv = await this.subscribePublic(name, [symbol], this.deepExtend(request, params));
|
|
628
|
-
if (this.newUpdates) {
|
|
629
|
-
limit = ohlcv.getLimit(symbol, limit);
|
|
630
|
-
}
|
|
631
|
-
return this.filterBySinceLimit(ohlcv, since, limit, 0);
|
|
632
|
-
}
|
|
633
|
-
handleOHLCV(client, message) {
|
|
634
|
-
//
|
|
635
|
-
// {
|
|
636
|
-
// "ch": "candles/M1", // Channel
|
|
637
|
-
// "snapshot": {
|
|
638
|
-
// "BTCUSDT": [{
|
|
639
|
-
// "t": 1626860340000, // Message timestamp
|
|
640
|
-
// "o": "30881.95", // Open price
|
|
641
|
-
// "c": "30890.96", // Last price
|
|
642
|
-
// "h": "30900.8", // High price
|
|
643
|
-
// "l": "30861.27", // Low price
|
|
644
|
-
// "v": "1.27852", // Base asset volume
|
|
645
|
-
// "q": "39493.9021811" // Quote asset volume
|
|
646
|
-
// }
|
|
647
|
-
// ...
|
|
648
|
-
// ]
|
|
649
|
-
// }
|
|
650
|
-
// }
|
|
651
|
-
//
|
|
652
|
-
// {
|
|
653
|
-
// "ch": "candles/M1",
|
|
654
|
-
// "update": {
|
|
655
|
-
// "ETHBTC": [{
|
|
656
|
-
// "t": 1626860880000,
|
|
657
|
-
// "o": "0.060711",
|
|
658
|
-
// "c": "0.060749",
|
|
659
|
-
// "h": "0.060749",
|
|
660
|
-
// "l": "0.060711",
|
|
661
|
-
// "v": "12.2800",
|
|
662
|
-
// "q": "0.7455339675"
|
|
663
|
-
// }]
|
|
664
|
-
// }
|
|
665
|
-
// }
|
|
666
|
-
//
|
|
667
|
-
const data = this.safeValue2(message, 'snapshot', 'update', {});
|
|
668
|
-
const marketIds = Object.keys(data);
|
|
669
|
-
const channel = this.safeString(message, 'ch');
|
|
670
|
-
const splitChannel = channel.split('/');
|
|
671
|
-
const period = this.safeString(splitChannel, 1);
|
|
672
|
-
const timeframe = this.findTimeframe(period);
|
|
673
|
-
for (let i = 0; i < marketIds.length; i++) {
|
|
674
|
-
const marketId = marketIds[i];
|
|
675
|
-
const market = this.safeMarket(marketId);
|
|
676
|
-
const symbol = market['symbol'];
|
|
677
|
-
this.ohlcvs[symbol] = this.safeValue(this.ohlcvs, symbol, {});
|
|
678
|
-
let stored = this.safeValue(this.ohlcvs[symbol], timeframe);
|
|
679
|
-
if (stored === undefined) {
|
|
680
|
-
const limit = this.safeInteger(this.options, 'OHLCVLimit', 1000);
|
|
681
|
-
stored = new Cache.ArrayCacheByTimestamp(limit);
|
|
682
|
-
this.ohlcvs[symbol][timeframe] = stored;
|
|
683
|
-
}
|
|
684
|
-
const ohlcvs = this.parseWsOHLCVs(data[marketId], market);
|
|
685
|
-
for (let j = 0; j < ohlcvs.length; j++) {
|
|
686
|
-
stored.append(ohlcvs[j]);
|
|
687
|
-
}
|
|
688
|
-
const messageHash = channel + '::' + symbol;
|
|
689
|
-
client.resolve(stored, messageHash);
|
|
690
|
-
}
|
|
691
|
-
return message;
|
|
692
|
-
}
|
|
693
|
-
parseWsOHLCV(ohlcv, market = undefined) {
|
|
694
|
-
//
|
|
695
|
-
// {
|
|
696
|
-
// "t": 1626860340000, // Message timestamp
|
|
697
|
-
// "o": "30881.95", // Open price
|
|
698
|
-
// "c": "30890.96", // Last price
|
|
699
|
-
// "h": "30900.8", // High price
|
|
700
|
-
// "l": "30861.27", // Low price
|
|
701
|
-
// "v": "1.27852", // Base asset volume
|
|
702
|
-
// "q": "39493.9021811" // Quote asset volume
|
|
703
|
-
// }
|
|
704
|
-
//
|
|
705
|
-
return [
|
|
706
|
-
this.safeInteger(ohlcv, 't'),
|
|
707
|
-
this.safeNumber(ohlcv, 'o'),
|
|
708
|
-
this.safeNumber(ohlcv, 'h'),
|
|
709
|
-
this.safeNumber(ohlcv, 'l'),
|
|
710
|
-
this.safeNumber(ohlcv, 'c'),
|
|
711
|
-
this.safeNumber(ohlcv, 'v'),
|
|
712
|
-
];
|
|
713
|
-
}
|
|
714
|
-
async watchOrders(symbol = undefined, since = undefined, limit = undefined, params = {}) {
|
|
715
|
-
/**
|
|
716
|
-
* @method
|
|
717
|
-
* @name hitbtc#watchOrders
|
|
718
|
-
* @description watches information on multiple orders made by the user
|
|
719
|
-
* @see https://api.hitbtc.com/#subscribe-to-reports
|
|
720
|
-
* @see https://api.hitbtc.com/#subscribe-to-reports-2
|
|
721
|
-
* @see https://api.hitbtc.com/#subscribe-to-reports-3
|
|
722
|
-
* @param {string} [symbol] unified CCXT market symbol
|
|
723
|
-
* @param {int} [since] timestamp in ms of the earliest order to fetch
|
|
724
|
-
* @param {int} [limit] the maximum amount of orders to fetch
|
|
725
|
-
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
726
|
-
* @returns {object[]} a list of [order structures]{@link https://docs.ccxt.com/en/latest/manual.html#order-structure}
|
|
727
|
-
*/
|
|
728
|
-
await this.loadMarkets();
|
|
729
|
-
let marketType = undefined;
|
|
730
|
-
let market = undefined;
|
|
731
|
-
if (symbol !== undefined) {
|
|
732
|
-
market = this.market(symbol);
|
|
733
|
-
}
|
|
734
|
-
[marketType, params] = this.handleMarketTypeAndParams('watchOrders', market, params);
|
|
735
|
-
const name = this.getSupportedMapping(marketType, {
|
|
736
|
-
'spot': 'spot_subscribe',
|
|
737
|
-
'margin': 'margin_subscribe',
|
|
738
|
-
'swap': 'futures_subscribe',
|
|
739
|
-
'future': 'futures_subscribe',
|
|
740
|
-
});
|
|
741
|
-
const orders = await this.subscribePrivate(name, symbol, params);
|
|
742
|
-
if (this.newUpdates) {
|
|
743
|
-
limit = orders.getLimit(symbol, limit);
|
|
744
|
-
}
|
|
745
|
-
return this.filterBySinceLimit(orders, since, limit, 'timestamp');
|
|
746
|
-
}
|
|
747
|
-
handleOrder(client, message) {
|
|
748
|
-
//
|
|
749
|
-
// {
|
|
750
|
-
// "jsonrpc": "2.0",
|
|
751
|
-
// "method": "spot_order", // "margin_order", "future_order"
|
|
752
|
-
// "params": {
|
|
753
|
-
// "id": 584244931496,
|
|
754
|
-
// "client_order_id": "b5acd79c0a854b01b558665bcf379456",
|
|
755
|
-
// "symbol": "BTCUSDT",
|
|
756
|
-
// "side": "buy",
|
|
757
|
-
// "status": "new",
|
|
758
|
-
// "type": "limit",
|
|
759
|
-
// "time_in_force": "GTC",
|
|
760
|
-
// "quantity": "0.01000",
|
|
761
|
-
// "quantity_cumulative": "0",
|
|
762
|
-
// "price": "0.01", // only updates and snapshots
|
|
763
|
-
// "post_only": false,
|
|
764
|
-
// "reduce_only": false, // only margin and contract
|
|
765
|
-
// "display_quantity": "0", // only updates and snapshot
|
|
766
|
-
// "created_at": "2021-07-02T22:52:32.864Z",
|
|
767
|
-
// "updated_at": "2021-07-02T22:52:32.864Z",
|
|
768
|
-
// "trade_id": 1361977606, // only trades
|
|
769
|
-
// "trade_quantity": "0.00001", // only trades
|
|
770
|
-
// "trade_price": "49595.04", // only trades
|
|
771
|
-
// "trade_fee": "0.001239876000", // only trades
|
|
772
|
-
// "trade_taker": true, // only trades, only spot
|
|
773
|
-
// "trade_position_id": 485308, // only trades, only margin
|
|
774
|
-
// "report_type": "new" // "trade", "status" (snapshot)
|
|
775
|
-
// }
|
|
776
|
-
// }
|
|
777
|
-
//
|
|
778
|
-
// {
|
|
779
|
-
// "jsonrpc": "2.0",
|
|
780
|
-
// "method": "spot_orders", // "margin_orders", "future_orders"
|
|
781
|
-
// "params": [
|
|
782
|
-
// {
|
|
783
|
-
// "id": 584244931496,
|
|
784
|
-
// "client_order_id": "b5acd79c0a854b01b558665bcf379456",
|
|
785
|
-
// "symbol": "BTCUSDT",
|
|
786
|
-
// "side": "buy",
|
|
787
|
-
// "status": "new",
|
|
788
|
-
// "type": "limit",
|
|
789
|
-
// "time_in_force": "GTC",
|
|
790
|
-
// "quantity": "0.01000",
|
|
791
|
-
// "quantity_cumulative": "0",
|
|
792
|
-
// "price": "0.01", // only updates and snapshots
|
|
793
|
-
// "post_only": false,
|
|
794
|
-
// "reduce_only": false, // only margin and contract
|
|
795
|
-
// "display_quantity": "0", // only updates and snapshot
|
|
796
|
-
// "created_at": "2021-07-02T22:52:32.864Z",
|
|
797
|
-
// "updated_at": "2021-07-02T22:52:32.864Z",
|
|
798
|
-
// "trade_id": 1361977606, // only trades
|
|
799
|
-
// "trade_quantity": "0.00001", // only trades
|
|
800
|
-
// "trade_price": "49595.04", // only trades
|
|
801
|
-
// "trade_fee": "0.001239876000", // only trades
|
|
802
|
-
// "trade_taker": true, // only trades, only spot
|
|
803
|
-
// "trade_position_id": 485308, // only trades, only margin
|
|
804
|
-
// "report_type": "new" // "trade", "status" (snapshot)
|
|
805
|
-
// }
|
|
806
|
-
// ]
|
|
807
|
-
// }
|
|
808
|
-
//
|
|
809
|
-
if (this.orders === undefined) {
|
|
810
|
-
const limit = this.safeInteger(this.options, 'ordersLimit');
|
|
811
|
-
this.orders = new Cache.ArrayCacheBySymbolById(limit);
|
|
812
|
-
}
|
|
813
|
-
const data = this.safeValue(message, 'params', []);
|
|
814
|
-
if (Array.isArray(data)) {
|
|
815
|
-
for (let i = 0; i < data.length; i++) {
|
|
816
|
-
const order = data[i];
|
|
817
|
-
this.handleOrderHelper(client, message, order);
|
|
818
|
-
}
|
|
819
|
-
}
|
|
820
|
-
else {
|
|
821
|
-
this.handleOrderHelper(client, message, data);
|
|
822
|
-
}
|
|
823
|
-
return message;
|
|
824
|
-
}
|
|
825
|
-
handleOrderHelper(client, message, order) {
|
|
826
|
-
const orders = this.orders;
|
|
827
|
-
const marketId = this.safeStringLower2(order, 'instrument', 'symbol');
|
|
828
|
-
const method = this.safeString(message, 'method');
|
|
829
|
-
const splitMethod = method.split('_order');
|
|
830
|
-
const messageHash = this.safeString(splitMethod, 0);
|
|
831
|
-
const symbol = this.safeSymbol(marketId);
|
|
832
|
-
const parsed = this.parseOrder(order);
|
|
833
|
-
orders.append(parsed);
|
|
834
|
-
client.resolve(orders, messageHash);
|
|
835
|
-
client.resolve(orders, messageHash + '::' + symbol);
|
|
836
|
-
}
|
|
837
|
-
parseWsOrderTrade(trade, market = undefined) {
|
|
838
|
-
//
|
|
839
|
-
// {
|
|
840
|
-
// "id": 584244931496,
|
|
841
|
-
// "client_order_id": "b5acd79c0a854b01b558665bcf379456",
|
|
842
|
-
// "symbol": "BTCUSDT",
|
|
843
|
-
// "side": "buy",
|
|
844
|
-
// "status": "new",
|
|
845
|
-
// "type": "limit",
|
|
846
|
-
// "time_in_force": "GTC",
|
|
847
|
-
// "quantity": "0.01000",
|
|
848
|
-
// "quantity_cumulative": "0",
|
|
849
|
-
// "price": "0.01", // only updates and snapshots
|
|
850
|
-
// "post_only": false,
|
|
851
|
-
// "reduce_only": false, // only margin and contract
|
|
852
|
-
// "display_quantity": "0", // only updates and snapshot
|
|
853
|
-
// "created_at": "2021-07-02T22:52:32.864Z",
|
|
854
|
-
// "updated_at": "2021-07-02T22:52:32.864Z",
|
|
855
|
-
// "trade_id": 1361977606, // only trades
|
|
856
|
-
// "trade_quantity": "0.00001", // only trades
|
|
857
|
-
// "trade_price": "49595.04", // only trades
|
|
858
|
-
// "trade_fee": "0.001239876000", // only trades
|
|
859
|
-
// "trade_taker": true, // only trades, only spot
|
|
860
|
-
// "trade_position_id": 485308, // only trades, only margin
|
|
861
|
-
// "report_type": "new" // "trade", "status" (snapshot)
|
|
862
|
-
// }
|
|
863
|
-
//
|
|
864
|
-
const timestamp = this.safeInteger(trade, 'created_at');
|
|
865
|
-
const marketId = this.safeString(trade, 'symbol');
|
|
866
|
-
return this.safeTrade({
|
|
867
|
-
'info': trade,
|
|
868
|
-
'id': this.safeString(trade, 'trade_id'),
|
|
869
|
-
'order': this.safeString(trade, 'id'),
|
|
870
|
-
'timestamp': timestamp,
|
|
871
|
-
'datetime': this.iso8601(timestamp),
|
|
872
|
-
'symbol': this.safeMarket(marketId, market),
|
|
873
|
-
'type': undefined,
|
|
874
|
-
'side': this.safeString(trade, 'side'),
|
|
875
|
-
'takerOrMaker': this.safeString(trade, 'trade_taker'),
|
|
876
|
-
'price': this.safeString(trade, 'trade_price'),
|
|
877
|
-
'amount': this.safeString(trade, 'trade_quantity'),
|
|
878
|
-
'cost': undefined,
|
|
879
|
-
'fee': {
|
|
880
|
-
'cost': this.safeString(trade, 'trade_fee'),
|
|
881
|
-
'currency': undefined,
|
|
882
|
-
'rate': undefined,
|
|
883
|
-
},
|
|
884
|
-
}, market);
|
|
885
|
-
}
|
|
886
|
-
parseWsOrder(order, market = undefined) {
|
|
887
|
-
//
|
|
888
|
-
// {
|
|
889
|
-
// "id": 584244931496,
|
|
890
|
-
// "client_order_id": "b5acd79c0a854b01b558665bcf379456",
|
|
891
|
-
// "symbol": "BTCUSDT",
|
|
892
|
-
// "side": "buy",
|
|
893
|
-
// "status": "new",
|
|
894
|
-
// "type": "limit",
|
|
895
|
-
// "time_in_force": "GTC",
|
|
896
|
-
// "quantity": "0.01000",
|
|
897
|
-
// "quantity_cumulative": "0",
|
|
898
|
-
// "price": "0.01", // only updates and snapshots
|
|
899
|
-
// "post_only": false,
|
|
900
|
-
// "reduce_only": false, // only margin and contract
|
|
901
|
-
// "display_quantity": "0", // only updates and snapshot
|
|
902
|
-
// "created_at": "2021-07-02T22:52:32.864Z",
|
|
903
|
-
// "updated_at": "2021-07-02T22:52:32.864Z",
|
|
904
|
-
// "trade_id": 1361977606, // only trades
|
|
905
|
-
// "trade_quantity": "0.00001", // only trades
|
|
906
|
-
// "trade_price": "49595.04", // only trades
|
|
907
|
-
// "trade_fee": "0.001239876000", // only trades
|
|
908
|
-
// "trade_taker": true, // only trades, only spot
|
|
909
|
-
// "trade_position_id": 485308, // only trades, only margin
|
|
910
|
-
// "report_type": "new" // "trade", "status" (snapshot)
|
|
911
|
-
// }
|
|
912
|
-
//
|
|
913
|
-
const timestamp = this.safeString(order, 'created_at');
|
|
914
|
-
const marketId = this.safeString(order, 'symbol');
|
|
915
|
-
market = this.safeMarket(marketId, market);
|
|
916
|
-
const tradeId = this.safeString(order, 'trade_id');
|
|
917
|
-
let trades = undefined;
|
|
918
|
-
if (tradeId !== undefined) {
|
|
919
|
-
const trade = this.parseWsOrderTrade(order, market);
|
|
920
|
-
trades = [trade];
|
|
921
|
-
}
|
|
922
|
-
const rawStatus = this.safeString(order, 'status');
|
|
923
|
-
const report_type = this.safeString(order, 'report_type');
|
|
924
|
-
let parsedStatus = undefined;
|
|
925
|
-
if (report_type === 'canceled') {
|
|
926
|
-
parsedStatus = this.parseOrderStatus(report_type);
|
|
927
|
-
}
|
|
928
|
-
else {
|
|
929
|
-
parsedStatus = this.parseOrderStatus(rawStatus);
|
|
930
|
-
}
|
|
931
|
-
return this.safeOrder({
|
|
932
|
-
'info': order,
|
|
933
|
-
'id': this.safeString(order, 'id'),
|
|
934
|
-
'clientOrderId': this.safeString(order, 'client_order_id'),
|
|
935
|
-
'timestamp': timestamp,
|
|
936
|
-
'datetime': this.iso8601(timestamp),
|
|
937
|
-
'lastTradeTimestamp': undefined,
|
|
938
|
-
'symbol': market['symbol'],
|
|
939
|
-
'price': this.safeString(order, 'price'),
|
|
940
|
-
'amount': this.safeString(order, 'quantity'),
|
|
941
|
-
'type': this.safeString(order, 'type'),
|
|
942
|
-
'side': this.safeStringUpper(order, 'side'),
|
|
943
|
-
'timeInForce': this.safeString(order, 'time_in_force'),
|
|
944
|
-
'postOnly': this.safeString(order, 'post_only'),
|
|
945
|
-
'reduceOnly': this.safeValue(order, 'reduce_only'),
|
|
946
|
-
'filled': undefined,
|
|
947
|
-
'remaining': undefined,
|
|
948
|
-
'cost': undefined,
|
|
949
|
-
'status': parsedStatus,
|
|
950
|
-
'average': undefined,
|
|
951
|
-
'trades': trades,
|
|
952
|
-
'fee': undefined,
|
|
953
|
-
}, market);
|
|
954
|
-
}
|
|
955
|
-
async watchBalance(params = {}) {
|
|
956
|
-
/**
|
|
957
|
-
* @method
|
|
958
|
-
* @name hitbtc#watchBalance
|
|
959
|
-
* @description watches balance updates, cannot subscribe to margin account balances
|
|
960
|
-
* @see https://api.hitbtc.com/#subscribe-to-spot-balances
|
|
961
|
-
* @see https://api.hitbtc.com/#subscribe-to-futures-balances
|
|
962
|
-
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
963
|
-
* @param {string} [params.type] 'spot', 'swap', or 'future'
|
|
964
|
-
*
|
|
965
|
-
* EXCHANGE SPECIFIC PARAMETERS
|
|
966
|
-
* @param {string} [params.mode] 'updates' or 'batches' (default), 'updates' = messages arrive after balance updates, 'batches' = messages arrive at equal intervals if there were any updates
|
|
967
|
-
* @returns {object[]} a list of [balance structures]{@link https://docs.ccxt.com/#/?id=balance-structure}
|
|
968
|
-
*/
|
|
969
|
-
await this.loadMarkets();
|
|
970
|
-
let type = undefined;
|
|
971
|
-
[type, params] = this.handleMarketTypeAndParams('watchBalance', undefined, params);
|
|
972
|
-
const name = this.getSupportedMapping(type, {
|
|
973
|
-
'spot': 'spot_balance_subscribe',
|
|
974
|
-
'swap': 'futures_balance_subscribe',
|
|
975
|
-
'future': 'futures_balance_subscribe',
|
|
976
|
-
});
|
|
977
|
-
const mode = this.safeString(params, 'mode', 'batches');
|
|
978
|
-
params = this.omit(params, 'mode');
|
|
979
|
-
const request = {
|
|
980
|
-
'mode': mode,
|
|
981
|
-
};
|
|
982
|
-
return await this.subscribePrivate(name, undefined, this.extend(request, params));
|
|
983
|
-
}
|
|
984
|
-
async createOrderWs(symbol, type, side, amount, price = undefined, params = {}) {
|
|
985
|
-
/**
|
|
986
|
-
* @method
|
|
987
|
-
* @name hitbtc#createOrder
|
|
988
|
-
* @description create a trade order
|
|
989
|
-
* @see https://api.hitbtc.com/#create-new-spot-order
|
|
990
|
-
* @see https://api.hitbtc.com/#create-margin-order
|
|
991
|
-
* @see https://api.hitbtc.com/#create-futures-order
|
|
992
|
-
* @param {string} symbol unified symbol of the market to create an order in
|
|
993
|
-
* @param {string} type 'market' or 'limit'
|
|
994
|
-
* @param {string} side 'buy' or 'sell'
|
|
995
|
-
* @param {float} amount how much of currency you want to trade in units of base currency
|
|
996
|
-
* @param {float} [price] the price at which the order is to be fullfilled, in units of the quote currency, ignored in market orders
|
|
997
|
-
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
998
|
-
* @param {string} [params.marginMode] 'cross' or 'isolated' only 'isolated' is supported for spot-margin, swap supports both, default is 'cross'
|
|
999
|
-
* @param {bool} [params.margin] true for creating a margin order
|
|
1000
|
-
* @param {float} [params.triggerPrice] The price at which a trigger order is triggered at
|
|
1001
|
-
* @param {bool} [params.postOnly] if true, the order will only be posted to the order book and not executed immediately
|
|
1002
|
-
* @param {string} [params.timeInForce] "GTC", "IOC", "FOK", "Day", "GTD"
|
|
1003
|
-
* @returns {object} an [order structure]{@link https://github.com/ccxt/ccxt/wiki/Manual#order-structure}
|
|
1004
|
-
*/
|
|
1005
|
-
await this.loadMarkets();
|
|
1006
|
-
const market = this.market(symbol);
|
|
1007
|
-
let request = undefined;
|
|
1008
|
-
let marketType = undefined;
|
|
1009
|
-
[marketType, params] = this.handleMarketTypeAndParams('createOrder', market, params);
|
|
1010
|
-
let marginMode = undefined;
|
|
1011
|
-
[marginMode, params] = this.handleMarginModeAndParams('createOrder', params);
|
|
1012
|
-
[request, params] = this.createOrderRequest(market, marketType, type, side, amount, price, marginMode, params);
|
|
1013
|
-
request = this.extend(request, params);
|
|
1014
|
-
if (marketType === 'swap') {
|
|
1015
|
-
return await this.tradeRequest('futures_new_order', request);
|
|
1016
|
-
}
|
|
1017
|
-
else if ((marketType === 'margin') || (marginMode !== undefined)) {
|
|
1018
|
-
return await this.tradeRequest('margin_new_order', request);
|
|
1019
|
-
}
|
|
1020
|
-
else {
|
|
1021
|
-
return await this.tradeRequest('spot_new_order', request);
|
|
1022
|
-
}
|
|
1023
|
-
}
|
|
1024
|
-
async cancelOrderWs(id, symbol = undefined, params = {}) {
|
|
1025
|
-
/**
|
|
1026
|
-
* @method
|
|
1027
|
-
* @name hitbtc#cancelOrderWs
|
|
1028
|
-
* @see https://api.hitbtc.com/#cancel-spot-order-2
|
|
1029
|
-
* @see https://api.hitbtc.com/#cancel-futures-order-2
|
|
1030
|
-
* @see https://api.hitbtc.com/#cancel-margin-order-2
|
|
1031
|
-
* @description cancels an open order
|
|
1032
|
-
* @param {string} id order id
|
|
1033
|
-
* @param {string} symbol unified symbol of the market the order was made in
|
|
1034
|
-
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
1035
|
-
* @param {string} [params.marginMode] 'cross' or 'isolated' only 'isolated' is supported
|
|
1036
|
-
* @param {bool} [params.margin] true for canceling a margin order
|
|
1037
|
-
* @returns {object} An [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
|
|
1038
|
-
*/
|
|
1039
|
-
await this.loadMarkets();
|
|
1040
|
-
let market = undefined;
|
|
1041
|
-
let request = {
|
|
1042
|
-
'client_order_id': id,
|
|
1043
|
-
};
|
|
1044
|
-
if (symbol !== undefined) {
|
|
1045
|
-
market = this.market(symbol);
|
|
1046
|
-
}
|
|
1047
|
-
let marketType = undefined;
|
|
1048
|
-
[marketType, params] = this.handleMarketTypeAndParams('cancelOrderWs', market, params);
|
|
1049
|
-
const [marginMode, query] = this.handleMarginModeAndParams('cancelOrderWs', params);
|
|
1050
|
-
request = this.extend(request, query);
|
|
1051
|
-
if (marketType === 'swap') {
|
|
1052
|
-
return await this.tradeRequest('futures_cancel_order', request);
|
|
1053
|
-
}
|
|
1054
|
-
else if ((marketType === 'margin') || (marginMode !== undefined)) {
|
|
1055
|
-
return await this.tradeRequest('margin_cancel_order', request);
|
|
1056
|
-
}
|
|
1057
|
-
else {
|
|
1058
|
-
return await this.tradeRequest('spot_cancel_order', request);
|
|
1059
|
-
}
|
|
1060
|
-
}
|
|
1061
|
-
async cancelAllOrdersWs(symbol = undefined, params = {}) {
|
|
1062
|
-
/**
|
|
1063
|
-
* @method
|
|
1064
|
-
* @name hitbtc#cancelAllOrdersWs
|
|
1065
|
-
* @see https://api.hitbtc.com/#cancel-spot-orders
|
|
1066
|
-
* @see https://api.hitbtc.com/#cancel-futures-order-3
|
|
1067
|
-
* @description cancel all open orders
|
|
1068
|
-
* @param {string} symbol unified market symbol, only orders in the market of this symbol are cancelled when symbol is not undefined
|
|
1069
|
-
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
1070
|
-
* @param {string} [params.marginMode] 'cross' or 'isolated' only 'isolated' is supported
|
|
1071
|
-
* @param {bool} [params.margin] true for canceling margin orders
|
|
1072
|
-
* @returns {object[]} a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
|
|
1073
|
-
*/
|
|
1074
|
-
await this.loadMarkets();
|
|
1075
|
-
let market = undefined;
|
|
1076
|
-
if (symbol !== undefined) {
|
|
1077
|
-
market = this.market(symbol);
|
|
1078
|
-
}
|
|
1079
|
-
let marketType = undefined;
|
|
1080
|
-
[marketType, params] = this.handleMarketTypeAndParams('cancelAllOrdersWs', market, params);
|
|
1081
|
-
let marginMode = undefined;
|
|
1082
|
-
[marginMode, params] = this.handleMarginModeAndParams('cancelAllOrdersWs', params);
|
|
1083
|
-
if (marketType === 'swap') {
|
|
1084
|
-
return await this.tradeRequest('futures_cancel_orders', params);
|
|
1085
|
-
}
|
|
1086
|
-
else if ((marketType === 'margin') || (marginMode !== undefined)) {
|
|
1087
|
-
throw new errors.NotSupported(this.id + ' cancelAllOrdersWs is not supported for margin orders');
|
|
1088
|
-
}
|
|
1089
|
-
else {
|
|
1090
|
-
return await this.tradeRequest('spot_cancel_orders', params);
|
|
1091
|
-
}
|
|
1092
|
-
}
|
|
1093
|
-
async fetchOpenOrdersWs(symbol = undefined, since = undefined, limit = undefined, params = {}) {
|
|
1094
|
-
/**
|
|
1095
|
-
* @method
|
|
1096
|
-
* @name hitbtc#fetchOpenOrdersWs
|
|
1097
|
-
* @see https://api.hitbtc.com/#get-active-futures-orders-2
|
|
1098
|
-
* @see https://api.hitbtc.com/#get-margin-orders
|
|
1099
|
-
* @see https://api.hitbtc.com/#get-active-spot-orders
|
|
1100
|
-
* @description fetch all unfilled currently open orders
|
|
1101
|
-
* @param {string} symbol unified market symbol
|
|
1102
|
-
* @param {int} [since] the earliest time in ms to fetch open orders for
|
|
1103
|
-
* @param {int} [limit] the maximum number of open orders structures to retrieve
|
|
1104
|
-
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
1105
|
-
* @param {string} [params.marginMode] 'cross' or 'isolated' only 'isolated' is supported
|
|
1106
|
-
* @param {bool} [params.margin] true for fetching open margin orders
|
|
1107
|
-
* @returns {Order[]} a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
|
|
1108
|
-
*/
|
|
1109
|
-
await this.loadMarkets();
|
|
1110
|
-
let market = undefined;
|
|
1111
|
-
const request = {};
|
|
1112
|
-
if (symbol !== undefined) {
|
|
1113
|
-
market = this.market(symbol);
|
|
1114
|
-
request['symbol'] = market['id'];
|
|
1115
|
-
}
|
|
1116
|
-
let marketType = undefined;
|
|
1117
|
-
[marketType, params] = this.handleMarketTypeAndParams('fetchOpenOrdersWs', market, params);
|
|
1118
|
-
let marginMode = undefined;
|
|
1119
|
-
[marginMode, params] = this.handleMarginModeAndParams('fetchOpenOrdersWs', params);
|
|
1120
|
-
if (marketType === 'swap') {
|
|
1121
|
-
return await this.tradeRequest('futures_get_orders', request);
|
|
1122
|
-
}
|
|
1123
|
-
else if ((marketType === 'margin') || (marginMode !== undefined)) {
|
|
1124
|
-
return await this.tradeRequest('margin_get_orders', request);
|
|
1125
|
-
}
|
|
1126
|
-
else {
|
|
1127
|
-
return await this.tradeRequest('spot_get_orders', request);
|
|
1128
|
-
}
|
|
1129
|
-
}
|
|
1130
|
-
handleBalance(client, message) {
|
|
1131
|
-
//
|
|
1132
|
-
// {
|
|
1133
|
-
// "jsonrpc": "2.0",
|
|
1134
|
-
// "method": "futures_balance",
|
|
1135
|
-
// "params": [
|
|
1136
|
-
// {
|
|
1137
|
-
// "currency": "BCN",
|
|
1138
|
-
// "available": "100.000000000000",
|
|
1139
|
-
// "reserved": "0",
|
|
1140
|
-
// "reserved_margin": "0"
|
|
1141
|
-
// },
|
|
1142
|
-
// ...
|
|
1143
|
-
// ]
|
|
1144
|
-
// }
|
|
1145
|
-
//
|
|
1146
|
-
const messageHash = this.safeString(message, 'method');
|
|
1147
|
-
const params = this.safeValue(message, 'params');
|
|
1148
|
-
const balance = this.parseBalance(params);
|
|
1149
|
-
this.balance = this.deepExtend(this.balance, balance);
|
|
1150
|
-
client.resolve(this.balance, messageHash);
|
|
1151
|
-
}
|
|
1152
|
-
handleNotification(client, message) {
|
|
1153
|
-
//
|
|
1154
|
-
// { jsonrpc: "2.0", result: true, id: null }
|
|
1155
|
-
//
|
|
1156
|
-
return message;
|
|
1157
|
-
}
|
|
1158
|
-
handleOrderRequest(client, message) {
|
|
1159
|
-
//
|
|
1160
|
-
// createOrderWs, cancelOrderWs
|
|
1161
|
-
//
|
|
1162
|
-
// {
|
|
1163
|
-
// "jsonrpc": "2.0",
|
|
1164
|
-
// "result": {
|
|
1165
|
-
// "id": 1130310696965,
|
|
1166
|
-
// "client_order_id": "OPC2oyHSkEBqIpPtniLqeW-597hUL3Yo",
|
|
1167
|
-
// "symbol": "ADAUSDT",
|
|
1168
|
-
// "side": "buy",
|
|
1169
|
-
// "status": "new",
|
|
1170
|
-
// "type": "limit",
|
|
1171
|
-
// "time_in_force": "GTC",
|
|
1172
|
-
// "quantity": "4",
|
|
1173
|
-
// "quantity_cumulative": "0",
|
|
1174
|
-
// "price": "0.3300000",
|
|
1175
|
-
// "post_only": false,
|
|
1176
|
-
// "created_at": "2023-11-17T14:58:15.903Z",
|
|
1177
|
-
// "updated_at": "2023-11-17T14:58:15.903Z",
|
|
1178
|
-
// "original_client_order_id": "d6b645556af740b1bd1683400fd9cbce", // spot_replace_order only
|
|
1179
|
-
// "report_type": "new"
|
|
1180
|
-
// "margin_mode": "isolated", // margin and future only
|
|
1181
|
-
// "reduce_only": false, // margin and future only
|
|
1182
|
-
// },
|
|
1183
|
-
// "id": 1700233093414
|
|
1184
|
-
// }
|
|
1185
|
-
//
|
|
1186
|
-
const messageHash = this.safeInteger(message, 'id');
|
|
1187
|
-
const result = this.safeValue(message, 'result', {});
|
|
1188
|
-
if (Array.isArray(result)) {
|
|
1189
|
-
const parsedOrders = [];
|
|
1190
|
-
for (let i = 0; i < result.length; i++) {
|
|
1191
|
-
const parsedOrder = this.parseWsOrder(result[i]);
|
|
1192
|
-
parsedOrders.push(parsedOrder);
|
|
1193
|
-
}
|
|
1194
|
-
client.resolve(parsedOrders, messageHash);
|
|
1195
|
-
}
|
|
1196
|
-
else {
|
|
1197
|
-
const parsedOrder = this.parseWsOrder(result);
|
|
1198
|
-
client.resolve(parsedOrder, messageHash);
|
|
1199
|
-
}
|
|
1200
|
-
return message;
|
|
1201
|
-
}
|
|
1202
|
-
handleMessage(client, message) {
|
|
1203
|
-
this.handleError(client, message);
|
|
1204
|
-
let channel = this.safeString2(message, 'ch', 'method');
|
|
1205
|
-
if (channel !== undefined) {
|
|
1206
|
-
const splitChannel = channel.split('/');
|
|
1207
|
-
channel = this.safeString(splitChannel, 0);
|
|
1208
|
-
const methods = {
|
|
1209
|
-
'candles': this.handleOHLCV,
|
|
1210
|
-
'ticker': this.handleTicker,
|
|
1211
|
-
'trades': this.handleTrades,
|
|
1212
|
-
'orderbook': this.handleOrderBook,
|
|
1213
|
-
'spot_order': this.handleOrder,
|
|
1214
|
-
'spot_orders': this.handleOrder,
|
|
1215
|
-
'margin_order': this.handleOrder,
|
|
1216
|
-
'margin_orders': this.handleOrder,
|
|
1217
|
-
'futures_order': this.handleOrder,
|
|
1218
|
-
'futures_orders': this.handleOrder,
|
|
1219
|
-
'spot_balance': this.handleBalance,
|
|
1220
|
-
'futures_balance': this.handleBalance,
|
|
1221
|
-
};
|
|
1222
|
-
const method = this.safeValue(methods, channel);
|
|
1223
|
-
if (method !== undefined) {
|
|
1224
|
-
method.call(this, client, message);
|
|
1225
|
-
}
|
|
1226
|
-
}
|
|
1227
|
-
else {
|
|
1228
|
-
const result = this.safeValue(message, 'result');
|
|
1229
|
-
const clientOrderId = this.safeString(result, 'client_order_id');
|
|
1230
|
-
if (clientOrderId !== undefined) {
|
|
1231
|
-
this.handleOrderRequest(client, message);
|
|
1232
|
-
}
|
|
1233
|
-
if ((result === true) && !('id' in message)) {
|
|
1234
|
-
this.handleAuthenticate(client, message);
|
|
1235
|
-
}
|
|
1236
|
-
if (Array.isArray(result)) {
|
|
1237
|
-
// to do improve this, not very reliable right now
|
|
1238
|
-
const first = this.safeValue(result, 0, {});
|
|
1239
|
-
const arrayLength = result.length;
|
|
1240
|
-
if ((arrayLength === 0) || ('client_order_id' in first)) {
|
|
1241
|
-
this.handleOrderRequest(client, message);
|
|
1242
|
-
}
|
|
1243
|
-
}
|
|
1244
|
-
}
|
|
1245
|
-
}
|
|
1246
|
-
handleAuthenticate(client, message) {
|
|
1247
|
-
//
|
|
1248
|
-
// {
|
|
1249
|
-
// "jsonrpc": "2.0",
|
|
1250
|
-
// "result": true
|
|
1251
|
-
// }
|
|
1252
|
-
//
|
|
1253
|
-
const success = this.safeValue(message, 'result');
|
|
1254
|
-
const messageHash = 'authenticated';
|
|
1255
|
-
if (success) {
|
|
1256
|
-
const future = this.safeValue(client.futures, messageHash);
|
|
1257
|
-
future.resolve(true);
|
|
1258
|
-
}
|
|
1259
|
-
else {
|
|
1260
|
-
const error = new errors.AuthenticationError(this.id + ' ' + this.json(message));
|
|
1261
|
-
client.reject(error, messageHash);
|
|
1262
|
-
if (messageHash in client.subscriptions) {
|
|
1263
|
-
delete client.subscriptions[messageHash];
|
|
1264
|
-
}
|
|
1265
|
-
}
|
|
1266
|
-
return message;
|
|
1267
|
-
}
|
|
1268
|
-
handleError(client, message) {
|
|
1269
|
-
//
|
|
1270
|
-
// {
|
|
1271
|
-
// jsonrpc: '2.0',
|
|
1272
|
-
// error: {
|
|
1273
|
-
// code: 20001,
|
|
1274
|
-
// message: 'Insufficient funds',
|
|
1275
|
-
// description: 'Check that the funds are sufficient, given commissions'
|
|
1276
|
-
// },
|
|
1277
|
-
// id: 1700228604325
|
|
1278
|
-
// }
|
|
1279
|
-
//
|
|
1280
|
-
const error = this.safeValue(message, 'error');
|
|
1281
|
-
if (error !== undefined) {
|
|
1282
|
-
const code = this.safeValue(error, 'code');
|
|
1283
|
-
const errorMessage = this.safeString(error, 'message');
|
|
1284
|
-
const description = this.safeString(error, 'description');
|
|
1285
|
-
const feedback = this.id + ' ' + description;
|
|
1286
|
-
this.throwExactlyMatchedException(this.exceptions['exact'], code, feedback);
|
|
1287
|
-
this.throwBroadlyMatchedException(this.exceptions['broad'], errorMessage, feedback);
|
|
1288
|
-
throw new errors.ExchangeError(feedback); // unknown message
|
|
1289
|
-
}
|
|
1290
|
-
return undefined;
|
|
1291
|
-
}
|
|
1292
|
-
}
|
|
1293
|
-
|
|
1294
|
-
module.exports = hitbtc;
|