ccxt-ir 4.3.46.0.3__py2.py3-none-any.whl → 4.5.0__py2.py3-none-any.whl
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.
- ccxt/__init__.py +39 -35
- ccxt/abantether.py +8 -8
- ccxt/abstract/alpaca.py +4 -0
- ccxt/abstract/apex.py +31 -0
- ccxt/abstract/bigone.py +1 -1
- ccxt/abstract/binance.py +106 -48
- ccxt/abstract/binancecoinm.py +106 -48
- ccxt/abstract/binanceus.py +141 -83
- ccxt/abstract/binanceusdm.py +106 -48
- ccxt/abstract/bingx.py +50 -1
- ccxt/abstract/bitbank.py +5 -0
- ccxt/abstract/bitfinex.py +136 -65
- ccxt/abstract/bitflyer.py +1 -0
- ccxt/abstract/bitget.py +67 -0
- ccxt/abstract/bitmart.py +19 -1
- ccxt/abstract/bitopro.py +1 -0
- ccxt/abstract/bitrue.py +68 -68
- ccxt/abstract/bitstamp.py +1 -0
- ccxt/abstract/blofin.py +30 -0
- ccxt/abstract/btcbox.py +2 -0
- ccxt/abstract/bybit.py +28 -13
- ccxt/abstract/cex.py +28 -29
- ccxt/abstract/coinbaseexchange.py +1 -0
- ccxt/abstract/coinbaseinternational.py +1 -1
- ccxt/abstract/cryptocom.py +16 -0
- ccxt/abstract/cryptomus.py +20 -0
- ccxt/abstract/defx.py +69 -0
- ccxt/abstract/deribit.py +1 -0
- ccxt/abstract/derive.py +117 -0
- ccxt/abstract/digifinex.py +1 -0
- ccxt/abstract/ellipx.py +25 -0
- ccxt/abstract/foxbit.py +26 -0
- ccxt/abstract/gate.py +19 -0
- ccxt/abstract/gateio.py +19 -0
- ccxt/abstract/gemini.py +1 -0
- ccxt/abstract/hibachi.py +26 -0
- ccxt/abstract/hyperliquid.py +1 -1
- ccxt/abstract/independentreserve.py +6 -0
- ccxt/abstract/kraken.py +1 -0
- ccxt/abstract/krakenfutures.py +4 -0
- ccxt/abstract/kucoin.py +10 -0
- ccxt/abstract/kucoinfutures.py +18 -0
- ccxt/abstract/lbank.py +2 -1
- ccxt/abstract/luno.py +1 -0
- ccxt/abstract/mexc.py +2 -0
- ccxt/abstract/modetrade.py +119 -0
- ccxt/abstract/myokx.py +349 -0
- ccxt/abstract/oceanex.py +5 -0
- ccxt/abstract/okx.py +25 -0
- ccxt/abstract/okxus.py +349 -0
- ccxt/abstract/onetrading.py +0 -12
- ccxt/abstract/paradex.py +23 -0
- ccxt/abstract/phemex.py +2 -0
- ccxt/abstract/poloniex.py +36 -0
- ccxt/abstract/tradeogre.py +3 -1
- ccxt/abstract/upbit.py +51 -34
- ccxt/abstract/whitebit.py +16 -0
- ccxt/abstract/woo.py +64 -6
- ccxt/abstract/xt.py +10 -5
- ccxt/afratether.py +7 -7
- ccxt/alpaca.py +828 -51
- ccxt/apex.py +1875 -0
- ccxt/arzinja.py +7 -7
- ccxt/arzplus.py +9 -9
- ccxt/ascendex.py +501 -306
- ccxt/async_support/__init__.py +39 -35
- ccxt/async_support/abantether.py +8 -8
- ccxt/async_support/afratether.py +9 -9
- ccxt/async_support/alpaca.py +828 -51
- ccxt/async_support/apex.py +1875 -0
- ccxt/async_support/arzinja.py +10 -10
- ccxt/async_support/arzplus.py +12 -12
- ccxt/async_support/ascendex.py +502 -306
- ccxt/async_support/base/exchange.py +303 -89
- ccxt/async_support/base/ws/cache.py +9 -3
- ccxt/async_support/base/ws/client.py +173 -38
- ccxt/async_support/base/ws/future.py +25 -37
- ccxt/async_support/bequant.py +5 -3
- ccxt/async_support/bigone.py +279 -144
- ccxt/async_support/binance.py +2347 -1158
- ccxt/async_support/binancecoinm.py +9 -3
- ccxt/async_support/binanceus.py +17 -3
- ccxt/async_support/binanceusdm.py +9 -4
- ccxt/async_support/bingx.py +2962 -920
- ccxt/async_support/bit2c.py +147 -27
- ccxt/async_support/bitbank.py +151 -23
- ccxt/async_support/bitbns.py +104 -30
- ccxt/async_support/bitfinex.py +3291 -1113
- ccxt/async_support/bitflyer.py +202 -27
- ccxt/async_support/bitget.py +3683 -1538
- ccxt/async_support/bithumb.py +195 -38
- ccxt/async_support/bitimen.py +12 -12
- ccxt/async_support/bitir.py +38 -38
- ccxt/async_support/bitmart.py +1288 -350
- ccxt/async_support/bitmex.py +260 -75
- ccxt/async_support/bitopro.py +262 -62
- ccxt/async_support/bitpin.py +17 -16
- ccxt/async_support/bitrue.py +459 -290
- ccxt/async_support/bitso.py +199 -54
- ccxt/async_support/bitstamp.py +230 -96
- ccxt/async_support/bitteam.py +167 -25
- ccxt/async_support/{huobijp.py → bittrade.py} +158 -30
- ccxt/async_support/bitvavo.py +213 -49
- ccxt/async_support/blockchaincom.py +160 -46
- ccxt/async_support/blofin.py +502 -120
- ccxt/async_support/btcalpha.py +169 -31
- ccxt/async_support/btcbox.py +292 -23
- ccxt/async_support/btcmarkets.py +211 -58
- ccxt/async_support/btcturk.py +161 -38
- ccxt/async_support/bybit.py +1775 -1030
- ccxt/async_support/cex.py +1440 -1303
- ccxt/async_support/coinbase.py +724 -212
- ccxt/async_support/coinbaseadvanced.py +2 -1
- ccxt/async_support/coinbaseexchange.py +388 -89
- ccxt/async_support/coinbaseinternational.py +412 -57
- ccxt/async_support/coincatch.py +177 -78
- ccxt/async_support/coincheck.py +135 -19
- ccxt/async_support/coinex.py +606 -232
- ccxt/async_support/coinmate.py +189 -63
- ccxt/async_support/coinmetro.py +195 -54
- ccxt/async_support/coinone.py +158 -51
- ccxt/async_support/coinsph.py +336 -61
- ccxt/async_support/coinspot.py +151 -52
- ccxt/async_support/cryptocom.py +661 -111
- ccxt/async_support/cryptomus.py +1137 -0
- ccxt/async_support/defx.py +2071 -0
- ccxt/async_support/delta.py +299 -99
- ccxt/async_support/deribit.py +348 -126
- ccxt/async_support/derive.py +2572 -0
- ccxt/async_support/digifinex.py +430 -214
- ccxt/async_support/ellipx.py +2029 -0
- ccxt/async_support/eterex.py +10 -10
- ccxt/async_support/excoino.py +31 -31
- ccxt/async_support/exir.py +14 -14
- ccxt/async_support/exmo.py +344 -131
- ccxt/async_support/exnovin.py +10 -10
- ccxt/async_support/farhadexchange.py +12 -12
- ccxt/async_support/fmfwio.py +2 -1
- ccxt/async_support/foxbit.py +1935 -0
- ccxt/async_support/gate.py +1351 -529
- ccxt/async_support/gateio.py +2 -1
- ccxt/async_support/gemini.py +144 -39
- ccxt/async_support/hashkey.py +152 -109
- ccxt/async_support/hibachi.py +2080 -0
- ccxt/async_support/hitbtc.py +395 -167
- ccxt/async_support/hitobit.py +12 -12
- ccxt/async_support/hollaex.py +307 -119
- ccxt/async_support/htx.py +851 -383
- ccxt/async_support/huobi.py +2 -1
- ccxt/async_support/hyperliquid.py +1848 -536
- ccxt/async_support/independentreserve.py +288 -15
- ccxt/async_support/indodax.py +190 -33
- ccxt/async_support/jibitex.py +12 -12
- ccxt/async_support/kraken.py +795 -351
- ccxt/async_support/krakenfutures.py +214 -62
- ccxt/async_support/kucoin.py +715 -396
- ccxt/async_support/kucoinfutures.py +652 -89
- ccxt/async_support/latoken.py +217 -113
- ccxt/async_support/lbank.py +425 -97
- ccxt/async_support/luno.py +382 -35
- ccxt/async_support/mercado.py +113 -6
- ccxt/async_support/mexc.py +874 -437
- ccxt/async_support/modetrade.py +2818 -0
- ccxt/async_support/myokx.py +54 -0
- ccxt/async_support/ndax.py +221 -64
- ccxt/async_support/nobitex.py +31 -37
- ccxt/async_support/novadax.py +190 -34
- ccxt/async_support/oceanex.py +217 -28
- ccxt/async_support/okcoin.py +253 -145
- ccxt/async_support/okexchange.py +11 -11
- ccxt/async_support/okx.py +1088 -351
- ccxt/async_support/okxus.py +54 -0
- ccxt/async_support/ompfinex.py +25 -24
- ccxt/async_support/onetrading.py +213 -392
- ccxt/async_support/oxfun.py +245 -166
- ccxt/async_support/p2b.py +151 -29
- ccxt/async_support/paradex.py +562 -49
- ccxt/async_support/paymium.py +82 -19
- ccxt/async_support/phemex.py +713 -172
- ccxt/async_support/poloniex.py +1602 -283
- ccxt/async_support/probit.py +224 -95
- ccxt/async_support/ramzinex.py +30 -27
- ccxt/async_support/sarmayex.py +9 -9
- ccxt/async_support/sarrafex.py +13 -13
- ccxt/async_support/tabdeal.py +14 -13
- ccxt/async_support/tetherland.py +9 -9
- ccxt/async_support/timex.py +210 -51
- ccxt/async_support/tokocrypto.py +167 -47
- ccxt/async_support/tradeogre.py +266 -31
- ccxt/async_support/twox.py +9 -9
- ccxt/async_support/ubitex.py +12 -12
- ccxt/async_support/upbit.py +568 -165
- ccxt/async_support/vertex.py +160 -32
- ccxt/async_support/wallex.py +12 -12
- ccxt/async_support/wavesexchange.py +165 -30
- ccxt/async_support/whitebit.py +975 -127
- ccxt/async_support/woo.py +1918 -1016
- ccxt/async_support/woofipro.py +433 -141
- ccxt/async_support/xt.py +649 -193
- ccxt/async_support/yobit.py +195 -70
- ccxt/async_support/zaif.py +91 -15
- ccxt/async_support/zonda.py +151 -36
- ccxt/base/decimal_to_precision.py +14 -10
- ccxt/base/errors.py +49 -18
- ccxt/base/exchange.py +1556 -450
- ccxt/base/precise.py +10 -0
- ccxt/base/types.py +114 -6
- ccxt/bequant.py +5 -3
- ccxt/bigone.py +279 -144
- ccxt/binance.py +2347 -1158
- ccxt/binancecoinm.py +9 -3
- ccxt/binanceus.py +17 -3
- ccxt/binanceusdm.py +9 -4
- ccxt/bingx.py +2962 -920
- ccxt/bit2c.py +147 -27
- ccxt/bitbank.py +151 -23
- ccxt/bitbns.py +104 -30
- ccxt/bitfinex.py +3290 -1113
- ccxt/bitflyer.py +202 -27
- ccxt/bitget.py +3683 -1538
- ccxt/bithumb.py +194 -38
- ccxt/bitimen.py +9 -9
- ccxt/bitir.py +35 -35
- ccxt/bitmart.py +1288 -350
- ccxt/bitmex.py +260 -75
- ccxt/bitopro.py +262 -62
- ccxt/bitpin.py +15 -14
- ccxt/bitrue.py +459 -290
- ccxt/bitso.py +199 -54
- ccxt/bitstamp.py +230 -96
- ccxt/bitteam.py +167 -25
- ccxt/{huobijp.py → bittrade.py} +158 -30
- ccxt/bitvavo.py +213 -49
- ccxt/blockchaincom.py +160 -46
- ccxt/blofin.py +502 -120
- ccxt/btcalpha.py +169 -31
- ccxt/btcbox.py +291 -23
- ccxt/btcmarkets.py +211 -58
- ccxt/btcturk.py +161 -38
- ccxt/bybit.py +1775 -1030
- ccxt/cex.py +1439 -1303
- ccxt/coinbase.py +724 -212
- ccxt/coinbaseadvanced.py +2 -1
- ccxt/coinbaseexchange.py +388 -89
- ccxt/coinbaseinternational.py +412 -57
- ccxt/coincatch.py +177 -78
- ccxt/coincheck.py +135 -19
- ccxt/coinex.py +606 -232
- ccxt/coinmate.py +189 -63
- ccxt/coinmetro.py +194 -54
- ccxt/coinone.py +158 -51
- ccxt/coinsph.py +336 -61
- ccxt/coinspot.py +151 -52
- ccxt/cryptocom.py +661 -111
- ccxt/cryptomus.py +1137 -0
- ccxt/defx.py +2070 -0
- ccxt/delta.py +299 -99
- ccxt/deribit.py +348 -126
- ccxt/derive.py +2571 -0
- ccxt/digifinex.py +430 -214
- ccxt/ellipx.py +2029 -0
- ccxt/eterex.py +7 -7
- ccxt/excoino.py +29 -29
- ccxt/exir.py +11 -11
- ccxt/exmo.py +343 -131
- ccxt/exnovin.py +8 -8
- ccxt/farhadexchange.py +10 -10
- ccxt/fmfwio.py +2 -1
- ccxt/foxbit.py +1935 -0
- ccxt/gate.py +1351 -529
- ccxt/gateio.py +2 -1
- ccxt/gemini.py +144 -39
- ccxt/hashkey.py +152 -109
- ccxt/hibachi.py +2079 -0
- ccxt/hitbtc.py +395 -167
- ccxt/hitobit.py +9 -9
- ccxt/hollaex.py +307 -119
- ccxt/htx.py +851 -383
- ccxt/huobi.py +2 -1
- ccxt/hyperliquid.py +1848 -536
- ccxt/independentreserve.py +287 -15
- ccxt/indodax.py +190 -33
- ccxt/jibitex.py +9 -9
- ccxt/kraken.py +794 -351
- ccxt/krakenfutures.py +214 -62
- ccxt/kucoin.py +715 -396
- ccxt/kucoinfutures.py +652 -89
- ccxt/latoken.py +217 -113
- ccxt/lbank.py +425 -97
- ccxt/luno.py +382 -35
- ccxt/mercado.py +113 -6
- ccxt/mexc.py +873 -437
- ccxt/modetrade.py +2818 -0
- ccxt/myokx.py +54 -0
- ccxt/ndax.py +221 -64
- ccxt/nobitex.py +29 -35
- ccxt/novadax.py +190 -34
- ccxt/oceanex.py +217 -28
- ccxt/okcoin.py +253 -145
- ccxt/okexchange.py +9 -9
- ccxt/okx.py +1088 -351
- ccxt/okxus.py +54 -0
- ccxt/ompfinex.py +22 -21
- ccxt/onetrading.py +213 -392
- ccxt/oxfun.py +245 -166
- ccxt/p2b.py +151 -29
- ccxt/paradex.py +562 -49
- ccxt/paymium.py +82 -19
- ccxt/phemex.py +712 -172
- ccxt/poloniex.py +1601 -283
- ccxt/pro/__init__.py +76 -17
- ccxt/pro/alpaca.py +21 -6
- ccxt/pro/apex.py +984 -0
- ccxt/pro/ascendex.py +58 -10
- ccxt/pro/bequant.py +6 -1
- ccxt/pro/binance.py +728 -156
- ccxt/pro/binancecoinm.py +6 -2
- ccxt/pro/binanceus.py +8 -4
- ccxt/pro/binanceusdm.py +7 -2
- ccxt/pro/bingx.py +333 -142
- ccxt/pro/bitfinex.py +727 -262
- ccxt/pro/bitget.py +570 -79
- ccxt/pro/bithumb.py +20 -6
- ccxt/pro/bitmart.py +216 -87
- ccxt/pro/bitmex.py +47 -9
- ccxt/pro/bitopro.py +26 -14
- ccxt/pro/bitrue.py +22 -22
- ccxt/pro/bitstamp.py +54 -21
- ccxt/pro/{huobijp.py → bittrade.py} +7 -6
- ccxt/pro/bitvavo.py +191 -67
- ccxt/pro/blockchaincom.py +21 -8
- ccxt/pro/blofin.py +9 -1
- ccxt/pro/bybit.py +632 -245
- ccxt/pro/cex.py +59 -24
- ccxt/pro/coinbase.py +102 -73
- ccxt/pro/coinbaseadvanced.py +2 -1
- ccxt/pro/coinbaseexchange.py +8 -8
- ccxt/pro/coinbaseinternational.py +181 -25
- ccxt/pro/coincatch.py +6 -7
- ccxt/pro/coincheck.py +11 -6
- ccxt/pro/coinex.py +967 -665
- ccxt/pro/coinone.py +16 -9
- ccxt/pro/cryptocom.py +448 -45
- ccxt/pro/defx.py +831 -0
- ccxt/pro/deribit.py +150 -14
- ccxt/pro/derive.py +704 -0
- ccxt/pro/exmo.py +239 -6
- ccxt/pro/gate.py +623 -65
- ccxt/pro/gateio.py +2 -1
- ccxt/pro/gemini.py +27 -11
- ccxt/pro/hashkey.py +2 -2
- ccxt/pro/hitbtc.py +196 -91
- ccxt/pro/hollaex.py +23 -7
- ccxt/pro/htx.py +51 -14
- ccxt/pro/huobi.py +2 -1
- ccxt/pro/hyperliquid.py +591 -27
- ccxt/pro/independentreserve.py +9 -6
- ccxt/pro/kraken.py +640 -320
- ccxt/pro/krakenfutures.py +62 -35
- ccxt/pro/kucoin.py +267 -46
- ccxt/pro/kucoinfutures.py +165 -21
- ccxt/pro/lbank.py +102 -21
- ccxt/pro/luno.py +12 -8
- ccxt/pro/mexc.py +877 -111
- ccxt/pro/modetrade.py +1271 -0
- ccxt/pro/myokx.py +38 -0
- ccxt/pro/ndax.py +15 -2
- ccxt/pro/okcoin.py +23 -4
- ccxt/pro/okx.py +573 -98
- ccxt/pro/okxus.py +38 -0
- ccxt/pro/onetrading.py +30 -13
- ccxt/pro/oxfun.py +131 -27
- ccxt/pro/p2b.py +88 -22
- ccxt/pro/paradex.py +3 -3
- ccxt/pro/phemex.py +75 -21
- ccxt/pro/poloniex.py +124 -41
- ccxt/pro/probit.py +87 -80
- ccxt/pro/tradeogre.py +272 -0
- ccxt/pro/upbit.py +152 -12
- ccxt/pro/vertex.py +8 -3
- ccxt/pro/whitebit.py +58 -5
- ccxt/pro/woo.py +228 -37
- ccxt/pro/woofipro.py +106 -18
- ccxt/pro/xt.py +111 -5
- ccxt/probit.py +224 -95
- ccxt/protobuf/__init__.py +0 -0
- ccxt/protobuf/mexc/PrivateAccountV3Api_pb2.py +37 -0
- ccxt/protobuf/mexc/PrivateDealsV3Api_pb2.py +37 -0
- ccxt/protobuf/mexc/PrivateOrdersV3Api_pb2.py +37 -0
- ccxt/protobuf/mexc/PublicAggreBookTickerV3Api_pb2.py +37 -0
- ccxt/protobuf/mexc/PublicAggreDealsV3Api_pb2.py +39 -0
- ccxt/protobuf/mexc/PublicAggreDepthsV3Api_pb2.py +39 -0
- ccxt/protobuf/mexc/PublicBookTickerBatchV3Api_pb2.py +38 -0
- ccxt/protobuf/mexc/PublicBookTickerV3Api_pb2.py +37 -0
- ccxt/protobuf/mexc/PublicDealsV3Api_pb2.py +39 -0
- ccxt/protobuf/mexc/PublicIncreaseDepthsBatchV3Api_pb2.py +38 -0
- ccxt/protobuf/mexc/PublicIncreaseDepthsV3Api_pb2.py +39 -0
- ccxt/protobuf/mexc/PublicLimitDepthsV3Api_pb2.py +39 -0
- ccxt/protobuf/mexc/PublicMiniTickerV3Api_pb2.py +37 -0
- ccxt/protobuf/mexc/PublicMiniTickersV3Api_pb2.py +38 -0
- ccxt/protobuf/mexc/PublicSpotKlineV3Api_pb2.py +37 -0
- ccxt/protobuf/mexc/PushDataV3ApiWrapper_pb2.py +52 -0
- ccxt/protobuf/mexc/__init__.py +0 -0
- ccxt/ramzinex.py +28 -25
- ccxt/sarmayex.py +7 -7
- ccxt/sarrafex.py +10 -10
- ccxt/static_dependencies/__init__.py +1 -1
- ccxt/static_dependencies/lark/py.typed +0 -0
- ccxt/static_dependencies/marshmallow/py.typed +0 -0
- ccxt/static_dependencies/marshmallow_dataclass/py.typed +0 -0
- ccxt/static_dependencies/marshmallow_oneofschema/py.typed +0 -0
- ccxt/tabdeal.py +12 -11
- ccxt/test/tests_async.py +261 -57
- ccxt/test/tests_helpers.py +1 -3
- ccxt/test/tests_init.py +4 -3
- ccxt/test/tests_sync.py +261 -57
- ccxt/tetherland.py +7 -7
- ccxt/timex.py +210 -51
- ccxt/tokocrypto.py +167 -47
- ccxt/tradeogre.py +266 -31
- ccxt/twox.py +7 -7
- ccxt/ubitex.py +9 -9
- ccxt/upbit.py +568 -165
- ccxt/vertex.py +160 -32
- ccxt/wallex.py +9 -9
- ccxt/wavesexchange.py +165 -30
- ccxt/whitebit.py +975 -127
- ccxt/woo.py +1917 -1016
- ccxt/woofipro.py +432 -141
- ccxt/xt.py +649 -193
- ccxt/yobit.py +194 -70
- ccxt/zaif.py +91 -15
- ccxt/zonda.py +151 -36
- {ccxt_ir-4.3.46.0.3.dist-info → ccxt_ir-4.5.0.dist-info}/METADATA +225 -73
- ccxt_ir-4.5.0.dist-info/RECORD +743 -0
- {ccxt_ir-4.3.46.0.3.dist-info → ccxt_ir-4.5.0.dist-info}/WHEEL +1 -1
- ccxt/__test__.py +0 -7
- ccxt/abstract/ace.py +0 -15
- ccxt/abstract/bitbay.py +0 -53
- ccxt/abstract/bitcoincom.py +0 -115
- ccxt/abstract/bitfinex2.py +0 -139
- ccxt/abstract/bitpanda.py +0 -35
- ccxt/abstract/bl3p.py +0 -19
- ccxt/abstract/coinlist.py +0 -54
- ccxt/abstract/currencycom.py +0 -68
- ccxt/abstract/hitbtc3.py +0 -115
- ccxt/abstract/idex.py +0 -26
- ccxt/abstract/kuna.py +0 -182
- ccxt/abstract/lykke.py +0 -29
- ccxt/abstract/poloniexfutures.py +0 -48
- ccxt/abstract/wazirx.py +0 -30
- ccxt/ace.py +0 -1012
- ccxt/async_support/ace.py +0 -1012
- ccxt/async_support/base/ws/aiohttp_client.py +0 -125
- ccxt/async_support/base/ws/fast_client.py +0 -96
- ccxt/async_support/bitbay.py +0 -17
- ccxt/async_support/bitcoincom.py +0 -17
- ccxt/async_support/bitfinex2.py +0 -3552
- ccxt/async_support/bitpanda.py +0 -16
- ccxt/async_support/bl3p.py +0 -485
- ccxt/async_support/coinlist.py +0 -2243
- ccxt/async_support/currencycom.py +0 -1950
- ccxt/async_support/hitbtc3.py +0 -16
- ccxt/async_support/idex.py +0 -1766
- ccxt/async_support/kuna.py +0 -1841
- ccxt/async_support/lykke.py +0 -1270
- ccxt/async_support/poloniexfutures.py +0 -1717
- ccxt/async_support/wazirx.py +0 -1224
- ccxt/bitbay.py +0 -17
- ccxt/bitcoincom.py +0 -17
- ccxt/bitfinex2.py +0 -3552
- ccxt/bitpanda.py +0 -16
- ccxt/bl3p.py +0 -485
- ccxt/coinlist.py +0 -2243
- ccxt/currencycom.py +0 -1950
- ccxt/hitbtc3.py +0 -16
- ccxt/idex.py +0 -1766
- ccxt/kuna.py +0 -1841
- ccxt/lykke.py +0 -1270
- ccxt/poloniexfutures.py +0 -1717
- ccxt/pro/bitcoincom.py +0 -34
- ccxt/pro/bitfinex2.py +0 -1083
- ccxt/pro/bitpanda.py +0 -15
- ccxt/pro/currencycom.py +0 -536
- ccxt/pro/idex.py +0 -672
- ccxt/pro/poloniexfutures.py +0 -990
- ccxt/pro/wazirx.py +0 -749
- ccxt/test/base/__init__.py +0 -29
- ccxt/test/base/test_account.py +0 -26
- ccxt/test/base/test_balance.py +0 -56
- ccxt/test/base/test_borrow_interest.py +0 -35
- ccxt/test/base/test_borrow_rate.py +0 -32
- ccxt/test/base/test_calculate_fee.py +0 -51
- ccxt/test/base/test_crypto.py +0 -127
- ccxt/test/base/test_currency.py +0 -76
- ccxt/test/base/test_datetime.py +0 -109
- ccxt/test/base/test_decimal_to_precision.py +0 -392
- ccxt/test/base/test_deep_extend.py +0 -68
- ccxt/test/base/test_deposit_withdrawal.py +0 -50
- ccxt/test/base/test_exchange_datetime_functions.py +0 -76
- ccxt/test/base/test_funding_rate_history.py +0 -29
- ccxt/test/base/test_last_price.py +0 -31
- ccxt/test/base/test_ledger_entry.py +0 -45
- ccxt/test/base/test_ledger_item.py +0 -48
- ccxt/test/base/test_leverage_tier.py +0 -33
- ccxt/test/base/test_liquidation.py +0 -50
- ccxt/test/base/test_margin_mode.py +0 -24
- ccxt/test/base/test_margin_modification.py +0 -35
- ccxt/test/base/test_market.py +0 -193
- ccxt/test/base/test_number.py +0 -411
- ccxt/test/base/test_ohlcv.py +0 -33
- ccxt/test/base/test_open_interest.py +0 -32
- ccxt/test/base/test_order.py +0 -64
- ccxt/test/base/test_order_book.py +0 -69
- ccxt/test/base/test_position.py +0 -60
- ccxt/test/base/test_shared_methods.py +0 -353
- ccxt/test/base/test_status.py +0 -24
- ccxt/test/base/test_throttle.py +0 -126
- ccxt/test/base/test_ticker.py +0 -92
- ccxt/test/base/test_trade.py +0 -47
- ccxt/test/base/test_trading_fee.py +0 -26
- ccxt/test/base/test_transaction.py +0 -39
- ccxt/test/test_async.py +0 -1649
- ccxt/test/test_sync.py +0 -1648
- ccxt/wazirx.py +0 -1224
- ccxt_ir-4.3.46.0.3.dist-info/RECORD +0 -773
- /ccxt/abstract/{huobijp.py → bittrade.py} +0 -0
- {ccxt_ir-4.3.46.0.3.dist-info → ccxt_ir-4.5.0.dist-info/licenses}/LICENSE.txt +0 -0
- {ccxt_ir-4.3.46.0.3.dist-info → ccxt_ir-4.5.0.dist-info}/top_level.txt +0 -0
ccxt/pro/cryptocom.py
CHANGED
|
@@ -6,23 +6,25 @@
|
|
|
6
6
|
import ccxt.async_support
|
|
7
7
|
from ccxt.async_support.base.ws.cache import ArrayCache, ArrayCacheBySymbolById, ArrayCacheBySymbolBySide, ArrayCacheByTimestamp
|
|
8
8
|
import hashlib
|
|
9
|
-
from ccxt.base.types import Balances, Int, Num, Order, OrderBook, OrderSide, OrderType, Position, Str, Strings, Ticker, Trade
|
|
9
|
+
from ccxt.base.types import Any, Balances, Bool, Int, Market, Num, Order, OrderBook, OrderSide, OrderType, Position, Str, Strings, Ticker, Tickers, Trade
|
|
10
10
|
from ccxt.async_support.base.ws.client import Client
|
|
11
11
|
from typing import List
|
|
12
|
+
from ccxt.base.errors import ExchangeError
|
|
12
13
|
from ccxt.base.errors import AuthenticationError
|
|
13
14
|
from ccxt.base.errors import NetworkError
|
|
14
|
-
from ccxt.base.errors import
|
|
15
|
+
from ccxt.base.errors import ChecksumError
|
|
15
16
|
|
|
16
17
|
|
|
17
18
|
class cryptocom(ccxt.async_support.cryptocom):
|
|
18
19
|
|
|
19
|
-
def describe(self):
|
|
20
|
+
def describe(self) -> Any:
|
|
20
21
|
return self.deep_extend(super(cryptocom, self).describe(), {
|
|
21
22
|
'has': {
|
|
22
23
|
'ws': True,
|
|
23
24
|
'watchBalance': True,
|
|
24
25
|
'watchTicker': True,
|
|
25
|
-
'watchTickers':
|
|
26
|
+
'watchTickers': True,
|
|
27
|
+
'watchBidsAsks': True,
|
|
26
28
|
'watchMyTrades': True,
|
|
27
29
|
'watchTrades': True,
|
|
28
30
|
'watchTradesForSymbols': True,
|
|
@@ -34,6 +36,7 @@ class cryptocom(ccxt.async_support.cryptocom):
|
|
|
34
36
|
'createOrderWs': True,
|
|
35
37
|
'cancelOrderWs': True,
|
|
36
38
|
'cancelAllOrders': True,
|
|
39
|
+
'editOrderWs': True,
|
|
37
40
|
},
|
|
38
41
|
'urls': {
|
|
39
42
|
'api': {
|
|
@@ -52,6 +55,9 @@ class cryptocom(ccxt.async_support.cryptocom):
|
|
|
52
55
|
'fetchPositionsSnapshot': True, # or False
|
|
53
56
|
'awaitPositionsSnapshot': True, # whether to wait for the positions snapshot before providing updates
|
|
54
57
|
},
|
|
58
|
+
'watchOrderBook': {
|
|
59
|
+
'checksum': True,
|
|
60
|
+
},
|
|
55
61
|
},
|
|
56
62
|
'streaming': {
|
|
57
63
|
},
|
|
@@ -72,7 +78,9 @@ class cryptocom(ccxt.async_support.cryptocom):
|
|
|
72
78
|
async def watch_order_book(self, symbol: str, limit: Int = None, params={}) -> OrderBook:
|
|
73
79
|
"""
|
|
74
80
|
watches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
|
|
75
|
-
|
|
81
|
+
|
|
82
|
+
https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#book-instrument_name
|
|
83
|
+
|
|
76
84
|
:param str symbol: unified symbol of the market to fetch the order book for
|
|
77
85
|
:param int [limit]: the maximum amount of order book entries to return
|
|
78
86
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
|
@@ -82,10 +90,26 @@ class cryptocom(ccxt.async_support.cryptocom):
|
|
|
82
90
|
"""
|
|
83
91
|
return await self.watch_order_book_for_symbols([symbol], limit, params)
|
|
84
92
|
|
|
93
|
+
async def un_watch_order_book(self, symbol: str, params={}) -> Any:
|
|
94
|
+
"""
|
|
95
|
+
unWatches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
|
|
96
|
+
|
|
97
|
+
https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#book-instrument_name
|
|
98
|
+
|
|
99
|
+
:param str symbol: unified symbol of the market to fetch the order book for
|
|
100
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
|
101
|
+
:param str [params.bookSubscriptionType]: The subscription type. Allowed values: SNAPSHOT full snapshot. This is the default if not specified. SNAPSHOT_AND_UPDATE delta updates
|
|
102
|
+
:param int [params.bookUpdateFrequency]: Book update interval in ms. Allowed values: 100 for snapshot subscription 10 for delta subscription
|
|
103
|
+
:returns dict: A dictionary of `order book structures <https://docs.ccxt.com/#/?id=order-book-structure>` indexed by market symbols
|
|
104
|
+
"""
|
|
105
|
+
return await self.un_watch_order_book_for_symbols([symbol], params)
|
|
106
|
+
|
|
85
107
|
async def watch_order_book_for_symbols(self, symbols: List[str], limit: Int = None, params={}) -> OrderBook:
|
|
86
108
|
"""
|
|
87
109
|
watches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
|
|
88
|
-
|
|
110
|
+
|
|
111
|
+
https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#book-instrument_name
|
|
112
|
+
|
|
89
113
|
:param str[] symbols: unified array of symbols
|
|
90
114
|
:param int [limit]: the maximum amount of order book entries to return
|
|
91
115
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
|
@@ -123,6 +147,49 @@ class cryptocom(ccxt.async_support.cryptocom):
|
|
|
123
147
|
orderbook = await self.watch_public_multiple(messageHashes, topics, params)
|
|
124
148
|
return orderbook.limit()
|
|
125
149
|
|
|
150
|
+
async def un_watch_order_book_for_symbols(self, symbols: List[str], params={}) -> OrderBook:
|
|
151
|
+
"""
|
|
152
|
+
unWatches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
|
|
153
|
+
|
|
154
|
+
https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#book-instrument_name
|
|
155
|
+
|
|
156
|
+
:param str[] symbols: unified array of symbols
|
|
157
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
|
158
|
+
:param int [params.limit]: orderbook limit, default is 50
|
|
159
|
+
:param str [params.bookSubscriptionType]: The subscription type. Allowed values: SNAPSHOT full snapshot. This is the default if not specified. SNAPSHOT_AND_UPDATE delta updates
|
|
160
|
+
:param int [params.bookUpdateFrequency]: Book update interval in ms. Allowed values: 100 for snapshot subscription 10 for delta subscription
|
|
161
|
+
:returns dict: A dictionary of `order book structures <https://docs.ccxt.com/#/?id=order-book-structure>` indexed by market symbols
|
|
162
|
+
"""
|
|
163
|
+
await self.load_markets()
|
|
164
|
+
symbols = self.market_symbols(symbols)
|
|
165
|
+
topics = []
|
|
166
|
+
subMessageHashes = []
|
|
167
|
+
messageHashes = []
|
|
168
|
+
limit = self.safe_integer(params, 'limit', 50)
|
|
169
|
+
topicParams = self.safe_value(params, 'params')
|
|
170
|
+
if topicParams is None:
|
|
171
|
+
params['params'] = {}
|
|
172
|
+
bookSubscriptionType = None
|
|
173
|
+
bookSubscriptionType2 = None
|
|
174
|
+
bookSubscriptionType, params = self.handle_option_and_params(params, 'watchOrderBook', 'bookSubscriptionType', 'SNAPSHOT_AND_UPDATE')
|
|
175
|
+
bookSubscriptionType2, params = self.handle_option_and_params(params, 'watchOrderBookForSymbols', 'bookSubscriptionType', bookSubscriptionType)
|
|
176
|
+
params['params']['bookSubscriptionType'] = bookSubscriptionType2
|
|
177
|
+
bookUpdateFrequency = None
|
|
178
|
+
bookUpdateFrequency2 = None
|
|
179
|
+
bookUpdateFrequency, params = self.handle_option_and_params(params, 'watchOrderBook', 'bookUpdateFrequency')
|
|
180
|
+
bookUpdateFrequency2, params = self.handle_option_and_params(params, 'watchOrderBookForSymbols', 'bookUpdateFrequency', bookUpdateFrequency)
|
|
181
|
+
if bookUpdateFrequency2 is not None:
|
|
182
|
+
params['params']['bookSubscriptionType'] = bookUpdateFrequency2
|
|
183
|
+
for i in range(0, len(symbols)):
|
|
184
|
+
symbol = symbols[i]
|
|
185
|
+
market = self.market(symbol)
|
|
186
|
+
currentTopic = 'book' + '.' + market['id'] + '.' + str(limit)
|
|
187
|
+
messageHash = 'orderbook:' + market['symbol']
|
|
188
|
+
subMessageHashes.append(messageHash)
|
|
189
|
+
messageHashes.append('unsubscribe:' + messageHash)
|
|
190
|
+
topics.append(currentTopic)
|
|
191
|
+
return await self.un_watch_public_multiple('orderbook', symbols, messageHashes, subMessageHashes, topics, params)
|
|
192
|
+
|
|
126
193
|
def handle_delta(self, bookside, delta):
|
|
127
194
|
price = self.safe_float(delta, 0)
|
|
128
195
|
amount = self.safe_float(delta, 1)
|
|
@@ -213,7 +280,9 @@ class cryptocom(ccxt.async_support.cryptocom):
|
|
|
213
280
|
previousNonce = self.safe_integer(data, 'pu')
|
|
214
281
|
currentNonce = orderbook['nonce']
|
|
215
282
|
if currentNonce != previousNonce:
|
|
216
|
-
|
|
283
|
+
checksum = self.handle_option('watchOrderBook', 'checksum', True)
|
|
284
|
+
if checksum:
|
|
285
|
+
raise ChecksumError(self.id + ' ' + self.orderbook_checksum_message(symbol))
|
|
217
286
|
self.handle_deltas(orderbook['asks'], self.safe_value(books, 'asks', []))
|
|
218
287
|
self.handle_deltas(orderbook['bids'], self.safe_value(books, 'bids', []))
|
|
219
288
|
orderbook['nonce'] = nonce
|
|
@@ -224,7 +293,9 @@ class cryptocom(ccxt.async_support.cryptocom):
|
|
|
224
293
|
async def watch_trades(self, symbol: str, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
|
|
225
294
|
"""
|
|
226
295
|
get the list of most recent trades for a particular symbol
|
|
227
|
-
|
|
296
|
+
|
|
297
|
+
https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#trade-instrument_name
|
|
298
|
+
|
|
228
299
|
:param str symbol: unified symbol of the market to fetch trades for
|
|
229
300
|
:param int [since]: timestamp in ms of the earliest trade to fetch
|
|
230
301
|
:param int [limit]: the maximum amount of trades to fetch
|
|
@@ -233,11 +304,25 @@ class cryptocom(ccxt.async_support.cryptocom):
|
|
|
233
304
|
"""
|
|
234
305
|
return await self.watch_trades_for_symbols([symbol], since, limit, params)
|
|
235
306
|
|
|
236
|
-
async def
|
|
307
|
+
async def un_watch_trades(self, symbol: str, params={}) -> List[Trade]:
|
|
237
308
|
"""
|
|
238
309
|
get the list of most recent trades for a particular symbol
|
|
239
|
-
|
|
310
|
+
|
|
311
|
+
https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#trade-instrument_name
|
|
312
|
+
|
|
240
313
|
:param str symbol: unified symbol of the market to fetch trades for
|
|
314
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
|
315
|
+
:returns dict[]: a list of `trade structures <https://docs.ccxt.com/#/?id=public-trades>`
|
|
316
|
+
"""
|
|
317
|
+
return await self.un_watch_trades_for_symbols([symbol], params)
|
|
318
|
+
|
|
319
|
+
async def watch_trades_for_symbols(self, symbols: List[str], since: Int = None, limit: Int = None, params={}) -> List[Trade]:
|
|
320
|
+
"""
|
|
321
|
+
get the list of most recent trades for a particular symbol
|
|
322
|
+
|
|
323
|
+
https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#trade-instrument_name
|
|
324
|
+
|
|
325
|
+
:param str[] symbols: unified symbol of the market to fetch trades for
|
|
241
326
|
:param int [since]: timestamp in ms of the earliest trade to fetch
|
|
242
327
|
:param int [limit]: the maximum amount of trades to fetch
|
|
243
328
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
|
@@ -258,6 +343,28 @@ class cryptocom(ccxt.async_support.cryptocom):
|
|
|
258
343
|
limit = trades.getLimit(tradeSymbol, limit)
|
|
259
344
|
return self.filter_by_since_limit(trades, since, limit, 'timestamp', True)
|
|
260
345
|
|
|
346
|
+
async def un_watch_trades_for_symbols(self, symbols: List[str], params={}) -> Any:
|
|
347
|
+
"""
|
|
348
|
+
get the list of most recent trades for a particular symbol
|
|
349
|
+
|
|
350
|
+
https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#trade-instrument_name
|
|
351
|
+
|
|
352
|
+
:param str[] [symbols]: list of unified market symbols to unwatch trades for
|
|
353
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
|
354
|
+
:returns dict[]: a list of `trade structures <https://docs.ccxt.com/#/?id=public-trades>`
|
|
355
|
+
"""
|
|
356
|
+
await self.load_markets()
|
|
357
|
+
symbols = self.market_symbols(symbols)
|
|
358
|
+
topics = []
|
|
359
|
+
messageHashes = []
|
|
360
|
+
for i in range(0, len(symbols)):
|
|
361
|
+
symbol = symbols[i]
|
|
362
|
+
market = self.market(symbol)
|
|
363
|
+
currentTopic = 'trade' + '.' + market['id']
|
|
364
|
+
messageHashes.append('unsubscribe:trades:' + market['symbol'])
|
|
365
|
+
topics.append(currentTopic)
|
|
366
|
+
return await self.un_watch_public_multiple('trades', symbols, messageHashes, topics, topics, params)
|
|
367
|
+
|
|
261
368
|
def handle_trades(self, client: Client, message):
|
|
262
369
|
#
|
|
263
370
|
# {
|
|
@@ -305,12 +412,14 @@ class cryptocom(ccxt.async_support.cryptocom):
|
|
|
305
412
|
async def watch_my_trades(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
|
|
306
413
|
"""
|
|
307
414
|
watches information on multiple trades made by the user
|
|
308
|
-
|
|
415
|
+
|
|
416
|
+
https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#user-trade-instrument_name
|
|
417
|
+
|
|
309
418
|
:param str symbol: unified market symbol of the market trades were made in
|
|
310
419
|
:param int [since]: the earliest time in ms to fetch trades for
|
|
311
420
|
:param int [limit]: the maximum number of trade structures to retrieve
|
|
312
421
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
|
313
|
-
:returns dict[]: a list of
|
|
422
|
+
:returns dict[]: a list of `trade structures <https://docs.ccxt.com/#/?id=trade-structure>`
|
|
314
423
|
"""
|
|
315
424
|
await self.load_markets()
|
|
316
425
|
market = None
|
|
@@ -327,7 +436,9 @@ class cryptocom(ccxt.async_support.cryptocom):
|
|
|
327
436
|
async def watch_ticker(self, symbol: str, params={}) -> Ticker:
|
|
328
437
|
"""
|
|
329
438
|
watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
|
|
330
|
-
|
|
439
|
+
|
|
440
|
+
https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#ticker-instrument_name
|
|
441
|
+
|
|
331
442
|
:param str symbol: unified symbol of the market to fetch the ticker for
|
|
332
443
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
|
333
444
|
:returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
|
|
@@ -337,44 +448,226 @@ class cryptocom(ccxt.async_support.cryptocom):
|
|
|
337
448
|
messageHash = 'ticker' + '.' + market['id']
|
|
338
449
|
return await self.watch_public(messageHash, params)
|
|
339
450
|
|
|
451
|
+
async def un_watch_ticker(self, symbol: str, params={}) -> Any:
|
|
452
|
+
"""
|
|
453
|
+
unWatches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
|
|
454
|
+
|
|
455
|
+
https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#ticker-instrument_name
|
|
456
|
+
|
|
457
|
+
:param str symbol: unified symbol of the market to fetch the ticker for
|
|
458
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
|
459
|
+
:returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
|
|
460
|
+
"""
|
|
461
|
+
await self.load_markets()
|
|
462
|
+
market = self.market(symbol)
|
|
463
|
+
subMessageHash = 'ticker' + '.' + market['id']
|
|
464
|
+
messageHash = 'unsubscribe:ticker:' + market['symbol']
|
|
465
|
+
return await self.un_watch_public_multiple('ticker', [market['symbol']], [messageHash], [subMessageHash], [subMessageHash], params)
|
|
466
|
+
|
|
467
|
+
async def watch_tickers(self, symbols: Strings = None, params={}) -> Tickers:
|
|
468
|
+
"""
|
|
469
|
+
watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for all markets of a specific list
|
|
470
|
+
|
|
471
|
+
https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#ticker-instrument_name
|
|
472
|
+
|
|
473
|
+
:param str[] symbols: unified symbol of the market to fetch the ticker for
|
|
474
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
|
475
|
+
:returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
|
|
476
|
+
"""
|
|
477
|
+
await self.load_markets()
|
|
478
|
+
symbols = self.market_symbols(symbols, None, False)
|
|
479
|
+
messageHashes = []
|
|
480
|
+
marketIds = self.market_ids(symbols)
|
|
481
|
+
for i in range(0, len(marketIds)):
|
|
482
|
+
marketId = marketIds[i]
|
|
483
|
+
messageHashes.append('ticker.' + marketId)
|
|
484
|
+
url = self.urls['api']['ws']['public']
|
|
485
|
+
id = self.nonce()
|
|
486
|
+
request: dict = {
|
|
487
|
+
'method': 'subscribe',
|
|
488
|
+
'params': {
|
|
489
|
+
'channels': messageHashes,
|
|
490
|
+
},
|
|
491
|
+
'nonce': id,
|
|
492
|
+
}
|
|
493
|
+
ticker = await self.watch_multiple(url, messageHashes, self.extend(request, params), messageHashes)
|
|
494
|
+
if self.newUpdates:
|
|
495
|
+
result: dict = {}
|
|
496
|
+
result[ticker['symbol']] = ticker
|
|
497
|
+
return result
|
|
498
|
+
return self.filter_by_array(self.tickers, 'symbol', symbols)
|
|
499
|
+
|
|
500
|
+
async def un_watch_tickers(self, symbols: Strings = None, params={}) -> Any:
|
|
501
|
+
"""
|
|
502
|
+
unWatches a price ticker
|
|
503
|
+
|
|
504
|
+
https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#ticker-instrument_name
|
|
505
|
+
|
|
506
|
+
:param str[] symbols: unified symbol of the market to fetch the ticker for
|
|
507
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
|
508
|
+
:returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
|
|
509
|
+
"""
|
|
510
|
+
await self.load_markets()
|
|
511
|
+
symbols = self.market_symbols(symbols, None, False)
|
|
512
|
+
messageHashes = []
|
|
513
|
+
subMessageHashes = []
|
|
514
|
+
marketIds = self.market_ids(symbols)
|
|
515
|
+
for i in range(0, len(marketIds)):
|
|
516
|
+
marketId = marketIds[i]
|
|
517
|
+
symbol = symbols[i]
|
|
518
|
+
subMessageHashes.append('ticker.' + marketId)
|
|
519
|
+
messageHashes.append('unsubscribe:ticker:' + symbol)
|
|
520
|
+
return await self.un_watch_public_multiple('ticker', symbols, messageHashes, subMessageHashes, subMessageHashes, params)
|
|
521
|
+
|
|
340
522
|
def handle_ticker(self, client: Client, message):
|
|
341
523
|
#
|
|
342
|
-
#
|
|
343
|
-
#
|
|
344
|
-
#
|
|
345
|
-
#
|
|
346
|
-
#
|
|
347
|
-
#
|
|
348
|
-
#
|
|
349
|
-
#
|
|
350
|
-
#
|
|
351
|
-
#
|
|
352
|
-
#
|
|
353
|
-
#
|
|
354
|
-
#
|
|
355
|
-
#
|
|
356
|
-
#
|
|
357
|
-
#
|
|
358
|
-
#
|
|
359
|
-
#
|
|
524
|
+
# {
|
|
525
|
+
# "instrument_name": "ETHUSD-PERP",
|
|
526
|
+
# "subscription": "ticker.ETHUSD-PERP",
|
|
527
|
+
# "channel": "ticker",
|
|
528
|
+
# "data": [
|
|
529
|
+
# {
|
|
530
|
+
# "h": "2400.20",
|
|
531
|
+
# "l": "2277.10",
|
|
532
|
+
# "a": "2335.25",
|
|
533
|
+
# "c": "-0.0022",
|
|
534
|
+
# "b": "2335.10",
|
|
535
|
+
# "bs": "5.4000",
|
|
536
|
+
# "k": "2335.16",
|
|
537
|
+
# "ks": "1.9970",
|
|
538
|
+
# "i": "ETHUSD-PERP",
|
|
539
|
+
# "v": "1305697.6462",
|
|
540
|
+
# "vv": "3058704939.17",
|
|
541
|
+
# "oi": "161646.3614",
|
|
542
|
+
# "t": 1726069647560
|
|
543
|
+
# }
|
|
544
|
+
# ]
|
|
360
545
|
# }
|
|
361
|
-
# }
|
|
362
546
|
#
|
|
547
|
+
self.handle_bid_ask(client, message)
|
|
363
548
|
messageHash = self.safe_string(message, 'subscription')
|
|
364
549
|
marketId = self.safe_string(message, 'instrument_name')
|
|
365
550
|
market = self.safe_market(marketId)
|
|
366
551
|
data = self.safe_value(message, 'data', [])
|
|
367
552
|
for i in range(0, len(data)):
|
|
368
553
|
ticker = data[i]
|
|
369
|
-
parsed = self.
|
|
554
|
+
parsed = self.parse_ws_ticker(ticker, market)
|
|
370
555
|
symbol = parsed['symbol']
|
|
371
556
|
self.tickers[symbol] = parsed
|
|
372
557
|
client.resolve(parsed, messageHash)
|
|
373
558
|
|
|
559
|
+
def parse_ws_ticker(self, ticker: dict, market: Market = None) -> Ticker:
|
|
560
|
+
#
|
|
561
|
+
# {
|
|
562
|
+
# "h": "2400.20",
|
|
563
|
+
# "l": "2277.10",
|
|
564
|
+
# "a": "2335.25",
|
|
565
|
+
# "c": "-0.0022",
|
|
566
|
+
# "b": "2335.10",
|
|
567
|
+
# "bs": "5.4000",
|
|
568
|
+
# "k": "2335.16",
|
|
569
|
+
# "ks": "1.9970",
|
|
570
|
+
# "i": "ETHUSD-PERP",
|
|
571
|
+
# "v": "1305697.6462",
|
|
572
|
+
# "vv": "3058704939.17",
|
|
573
|
+
# "oi": "161646.3614",
|
|
574
|
+
# "t": 1726069647560
|
|
575
|
+
# }
|
|
576
|
+
#
|
|
577
|
+
timestamp = self.safe_integer(ticker, 't')
|
|
578
|
+
marketId = self.safe_string(ticker, 'i')
|
|
579
|
+
market = self.safe_market(marketId, market, '_')
|
|
580
|
+
quote = self.safe_string(market, 'quote')
|
|
581
|
+
last = self.safe_string(ticker, 'a')
|
|
582
|
+
return self.safe_ticker({
|
|
583
|
+
'symbol': market['symbol'],
|
|
584
|
+
'timestamp': timestamp,
|
|
585
|
+
'datetime': self.iso8601(timestamp),
|
|
586
|
+
'high': self.safe_number(ticker, 'h'),
|
|
587
|
+
'low': self.safe_number(ticker, 'l'),
|
|
588
|
+
'bid': self.safe_number(ticker, 'b'),
|
|
589
|
+
'bidVolume': self.safe_number(ticker, 'bs'),
|
|
590
|
+
'ask': self.safe_number(ticker, 'k'),
|
|
591
|
+
'askVolume': self.safe_number(ticker, 'ks'),
|
|
592
|
+
'vwap': None,
|
|
593
|
+
'open': None,
|
|
594
|
+
'close': last,
|
|
595
|
+
'last': last,
|
|
596
|
+
'previousClose': None,
|
|
597
|
+
'change': None,
|
|
598
|
+
'percentage': self.safe_string(ticker, 'c'),
|
|
599
|
+
'average': None,
|
|
600
|
+
'baseVolume': self.safe_string(ticker, 'v'),
|
|
601
|
+
'quoteVolume': self.safe_string(ticker, 'vv') if (quote == 'USD') else None,
|
|
602
|
+
'info': ticker,
|
|
603
|
+
}, market)
|
|
604
|
+
|
|
605
|
+
async def watch_bids_asks(self, symbols: Strings = None, params={}) -> Tickers:
|
|
606
|
+
"""
|
|
607
|
+
|
|
608
|
+
https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#ticker-instrument_name
|
|
609
|
+
|
|
610
|
+
watches best bid & ask for symbols
|
|
611
|
+
:param str[] symbols: unified symbol of the market to fetch the ticker for
|
|
612
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
|
613
|
+
:returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
|
|
614
|
+
"""
|
|
615
|
+
await self.load_markets()
|
|
616
|
+
symbols = self.market_symbols(symbols, None, False)
|
|
617
|
+
messageHashes = []
|
|
618
|
+
topics = []
|
|
619
|
+
marketIds = self.market_ids(symbols)
|
|
620
|
+
for i in range(0, len(marketIds)):
|
|
621
|
+
marketId = marketIds[i]
|
|
622
|
+
messageHashes.append('bidask.' + symbols[i])
|
|
623
|
+
topics.append('ticker.' + marketId)
|
|
624
|
+
url = self.urls['api']['ws']['public']
|
|
625
|
+
id = self.nonce()
|
|
626
|
+
request: dict = {
|
|
627
|
+
'method': 'subscribe',
|
|
628
|
+
'params': {
|
|
629
|
+
'channels': topics,
|
|
630
|
+
},
|
|
631
|
+
'nonce': id,
|
|
632
|
+
}
|
|
633
|
+
newTickers = await self.watch_multiple(url, messageHashes, self.extend(request, params), messageHashes)
|
|
634
|
+
if self.newUpdates:
|
|
635
|
+
tickers: dict = {}
|
|
636
|
+
tickers[newTickers['symbol']] = newTickers
|
|
637
|
+
return tickers
|
|
638
|
+
return self.filter_by_array(self.bidsasks, 'symbol', symbols)
|
|
639
|
+
|
|
640
|
+
def handle_bid_ask(self, client: Client, message):
|
|
641
|
+
data = self.safe_list(message, 'data', [])
|
|
642
|
+
ticker = self.safe_dict(data, 0, {})
|
|
643
|
+
parsedTicker = self.parse_ws_bid_ask(ticker)
|
|
644
|
+
symbol = parsedTicker['symbol']
|
|
645
|
+
self.bidsasks[symbol] = parsedTicker
|
|
646
|
+
messageHash = 'bidask.' + symbol
|
|
647
|
+
client.resolve(parsedTicker, messageHash)
|
|
648
|
+
|
|
649
|
+
def parse_ws_bid_ask(self, ticker, market=None):
|
|
650
|
+
marketId = self.safe_string(ticker, 'i')
|
|
651
|
+
market = self.safe_market(marketId, market)
|
|
652
|
+
symbol = self.safe_string(market, 'symbol')
|
|
653
|
+
timestamp = self.safe_integer(ticker, 't')
|
|
654
|
+
return self.safe_ticker({
|
|
655
|
+
'symbol': symbol,
|
|
656
|
+
'timestamp': timestamp,
|
|
657
|
+
'datetime': self.iso8601(timestamp),
|
|
658
|
+
'ask': self.safe_string(ticker, 'k'),
|
|
659
|
+
'askVolume': self.safe_string(ticker, 'ks'),
|
|
660
|
+
'bid': self.safe_string(ticker, 'b'),
|
|
661
|
+
'bidVolume': self.safe_string(ticker, 'bs'),
|
|
662
|
+
'info': ticker,
|
|
663
|
+
}, market)
|
|
664
|
+
|
|
374
665
|
async def watch_ohlcv(self, symbol: str, timeframe='1m', since: Int = None, limit: Int = None, params={}) -> List[list]:
|
|
375
666
|
"""
|
|
376
667
|
watches historical candlestick data containing the open, high, low, and close price, and the volume of a market
|
|
377
|
-
|
|
668
|
+
|
|
669
|
+
https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#candlestick-time_frame-instrument_name
|
|
670
|
+
|
|
378
671
|
:param str symbol: unified symbol of the market to fetch OHLCV data for
|
|
379
672
|
:param str timeframe: the length of time each candle represents
|
|
380
673
|
:param int [since]: timestamp in ms of the earliest candle to fetch
|
|
@@ -392,6 +685,28 @@ class cryptocom(ccxt.async_support.cryptocom):
|
|
|
392
685
|
limit = ohlcv.getLimit(symbol, limit)
|
|
393
686
|
return self.filter_by_since_limit(ohlcv, since, limit, 0, True)
|
|
394
687
|
|
|
688
|
+
async def un_watch_ohlcv(self, symbol: str, timeframe='1m', params={}) -> Any:
|
|
689
|
+
"""
|
|
690
|
+
unWatches historical candlestick data containing the open, high, low, and close price, and the volume of a market
|
|
691
|
+
|
|
692
|
+
https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#candlestick-time_frame-instrument_name
|
|
693
|
+
|
|
694
|
+
:param str symbol: unified symbol of the market to fetch OHLCV data for
|
|
695
|
+
:param str timeframe: the length of time each candle represents
|
|
696
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
|
697
|
+
:returns int[][]: A list of candles ordered, open, high, low, close, volume
|
|
698
|
+
"""
|
|
699
|
+
await self.load_markets()
|
|
700
|
+
market = self.market(symbol)
|
|
701
|
+
symbol = market['symbol']
|
|
702
|
+
interval = self.safe_string(self.timeframes, timeframe, timeframe)
|
|
703
|
+
subMessageHash = 'candlestick' + '.' + interval + '.' + market['id']
|
|
704
|
+
messageHash = 'unsubscribe:ohlcv:' + market['symbol'] + ':' + timeframe
|
|
705
|
+
subExtend = {
|
|
706
|
+
'symbolsAndTimeframes': [[market['symbol'], timeframe]],
|
|
707
|
+
}
|
|
708
|
+
return await self.un_watch_public_multiple('ohlcv', [market['symbol']], [messageHash], [subMessageHash], [subMessageHash], params, subExtend)
|
|
709
|
+
|
|
395
710
|
def handle_ohlcv(self, client: Client, message):
|
|
396
711
|
#
|
|
397
712
|
# {
|
|
@@ -425,7 +740,9 @@ class cryptocom(ccxt.async_support.cryptocom):
|
|
|
425
740
|
async def watch_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
|
|
426
741
|
"""
|
|
427
742
|
watches information on multiple orders made by the user
|
|
428
|
-
|
|
743
|
+
|
|
744
|
+
https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#user-order-instrument_name
|
|
745
|
+
|
|
429
746
|
:param str symbol: unified market symbol of the market orders were made in
|
|
430
747
|
:param int [since]: the earliest time in ms to fetch orders for
|
|
431
748
|
:param int [limit]: the maximum number of order structures to retrieve
|
|
@@ -495,8 +812,12 @@ class cryptocom(ccxt.async_support.cryptocom):
|
|
|
495
812
|
async def watch_positions(self, symbols: Strings = None, since: Int = None, limit: Int = None, params={}) -> List[Position]:
|
|
496
813
|
"""
|
|
497
814
|
watch all open positions
|
|
498
|
-
|
|
499
|
-
|
|
815
|
+
|
|
816
|
+
https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#user-position_balance
|
|
817
|
+
|
|
818
|
+
:param str[] [symbols]: list of unified market symbols to watch positions for
|
|
819
|
+
:param int [since]: the earliest time in ms to fetch positions for
|
|
820
|
+
:param int [limit]: the maximum number of positions to retrieve
|
|
500
821
|
:param dict params: extra parameters specific to the exchange API endpoint
|
|
501
822
|
:returns dict[]: a list of `position structure <https://docs.ccxt.com/en/latest/manual.html#position-structure>`
|
|
502
823
|
"""
|
|
@@ -518,7 +839,7 @@ class cryptocom(ccxt.async_support.cryptocom):
|
|
|
518
839
|
client = self.client(url)
|
|
519
840
|
self.set_positions_cache(client, symbols)
|
|
520
841
|
fetchPositionsSnapshot = self.handle_option('watchPositions', 'fetchPositionsSnapshot', True)
|
|
521
|
-
awaitPositionsSnapshot = self.
|
|
842
|
+
awaitPositionsSnapshot = self.handle_option('watchPositions', 'awaitPositionsSnapshot', True)
|
|
522
843
|
if fetchPositionsSnapshot and awaitPositionsSnapshot and self.positions is None:
|
|
523
844
|
snapshot = await client.future('fetchPositionsSnapshot')
|
|
524
845
|
return self.filter_by_symbols_since_limit(snapshot, symbols, since, limit, True)
|
|
@@ -604,7 +925,9 @@ class cryptocom(ccxt.async_support.cryptocom):
|
|
|
604
925
|
async def watch_balance(self, params={}) -> Balances:
|
|
605
926
|
"""
|
|
606
927
|
watch balance and get the amount of funds available for trading or funds locked in orders
|
|
607
|
-
|
|
928
|
+
|
|
929
|
+
https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#user-balance
|
|
930
|
+
|
|
608
931
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
|
609
932
|
:returns dict: a `balance structure <https://docs.ccxt.com/#/?id=balance-structure>`
|
|
610
933
|
"""
|
|
@@ -676,13 +999,15 @@ class cryptocom(ccxt.async_support.cryptocom):
|
|
|
676
999
|
|
|
677
1000
|
async def create_order_ws(self, symbol: str, type: OrderType, side: OrderSide, amount: float, price: Num = None, params={}) -> Order:
|
|
678
1001
|
"""
|
|
679
|
-
|
|
1002
|
+
|
|
1003
|
+
https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#private-create-order
|
|
1004
|
+
|
|
680
1005
|
create a trade order
|
|
681
1006
|
:param str symbol: unified symbol of the market to create an order in
|
|
682
1007
|
:param str type: 'market' or 'limit'
|
|
683
1008
|
:param str side: 'buy' or 'sell'
|
|
684
1009
|
:param float amount: how much of currency you want to trade in units of base currency
|
|
685
|
-
:param float [price]: the price at which the order is to be
|
|
1010
|
+
:param float [price]: the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
|
|
686
1011
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
|
687
1012
|
:returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
|
|
688
1013
|
"""
|
|
@@ -695,6 +1020,31 @@ class cryptocom(ccxt.async_support.cryptocom):
|
|
|
695
1020
|
messageHash = self.nonce()
|
|
696
1021
|
return await self.watch_private_request(messageHash, request)
|
|
697
1022
|
|
|
1023
|
+
async def edit_order_ws(self, id: str, symbol: str, type: OrderType, side: OrderSide, amount: Num = None, price: Num = None, params={}) -> Order:
|
|
1024
|
+
"""
|
|
1025
|
+
edit a trade order
|
|
1026
|
+
|
|
1027
|
+
https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#private-amend-order
|
|
1028
|
+
|
|
1029
|
+
:param str id: order id
|
|
1030
|
+
:param str symbol: unified market symbol of the order to edit
|
|
1031
|
+
:param str [type]: not used by cryptocom editOrder
|
|
1032
|
+
:param str [side]: not used by cryptocom editOrder
|
|
1033
|
+
:param float amount:(mandatory) how much of the currency you want to trade in units of the base currency
|
|
1034
|
+
:param float price:(mandatory) the price for the order, in units of the quote currency, ignored in market orders
|
|
1035
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
|
1036
|
+
:param str [params.clientOrderId]: the original client order id of the order to edit, required if id is not provided
|
|
1037
|
+
:returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
|
|
1038
|
+
"""
|
|
1039
|
+
await self.load_markets()
|
|
1040
|
+
params = self.edit_order_request(id, symbol, amount, price, params)
|
|
1041
|
+
request: dict = {
|
|
1042
|
+
'method': 'private/amend-order',
|
|
1043
|
+
'params': params,
|
|
1044
|
+
}
|
|
1045
|
+
messageHash = self.nonce()
|
|
1046
|
+
return await self.watch_private_request(messageHash, request)
|
|
1047
|
+
|
|
698
1048
|
def handle_order(self, client: Client, message):
|
|
699
1049
|
#
|
|
700
1050
|
# {
|
|
@@ -715,7 +1065,9 @@ class cryptocom(ccxt.async_support.cryptocom):
|
|
|
715
1065
|
async def cancel_order_ws(self, id: str, symbol: Str = None, params={}) -> Order:
|
|
716
1066
|
"""
|
|
717
1067
|
cancels an open order
|
|
718
|
-
|
|
1068
|
+
|
|
1069
|
+
https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#private-cancel-order
|
|
1070
|
+
|
|
719
1071
|
:param str id: the order id of the order to cancel
|
|
720
1072
|
:param str [symbol]: unified symbol of the market the order was made in
|
|
721
1073
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
|
@@ -735,7 +1087,9 @@ class cryptocom(ccxt.async_support.cryptocom):
|
|
|
735
1087
|
async def cancel_all_orders_ws(self, symbol: Str = None, params={}):
|
|
736
1088
|
"""
|
|
737
1089
|
cancel all open orders
|
|
738
|
-
|
|
1090
|
+
|
|
1091
|
+
https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#private-cancel-all-orders
|
|
1092
|
+
|
|
739
1093
|
:param str symbol: unified market symbol of the orders to cancel
|
|
740
1094
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
|
741
1095
|
:returns dict} Returns exchange raw message {@link https://docs.ccxt.com/#/?id=order-structure:
|
|
@@ -789,6 +1143,27 @@ class cryptocom(ccxt.async_support.cryptocom):
|
|
|
789
1143
|
message = self.deep_extend(request, params)
|
|
790
1144
|
return await self.watch_multiple(url, messageHashes, message, messageHashes)
|
|
791
1145
|
|
|
1146
|
+
async def un_watch_public_multiple(self, topic: str, symbols: List[str], messageHashes: List[str], subMessageHashes: List[str], topics: List[str], params={}, subExtend={}):
|
|
1147
|
+
url = self.urls['api']['ws']['public']
|
|
1148
|
+
id = self.nonce()
|
|
1149
|
+
request: dict = {
|
|
1150
|
+
'method': 'unsubscribe',
|
|
1151
|
+
'params': {
|
|
1152
|
+
'channels': topics,
|
|
1153
|
+
},
|
|
1154
|
+
'nonce': id,
|
|
1155
|
+
'id': str(id),
|
|
1156
|
+
}
|
|
1157
|
+
subscription = {
|
|
1158
|
+
'id': str(id),
|
|
1159
|
+
'topic': topic,
|
|
1160
|
+
'symbols': symbols,
|
|
1161
|
+
'subMessageHashes': subMessageHashes,
|
|
1162
|
+
'messageHashes': messageHashes,
|
|
1163
|
+
}
|
|
1164
|
+
message = self.deep_extend(request, params)
|
|
1165
|
+
return await self.watch_multiple(url, messageHashes, message, messageHashes, self.extend(subscription, subExtend))
|
|
1166
|
+
|
|
792
1167
|
async def watch_private_request(self, nonce, params={}):
|
|
793
1168
|
await self.authenticate()
|
|
794
1169
|
url = self.urls['api']['ws']['private']
|
|
@@ -813,7 +1188,7 @@ class cryptocom(ccxt.async_support.cryptocom):
|
|
|
813
1188
|
message = self.extend(request, params)
|
|
814
1189
|
return await self.watch(url, messageHash, message, messageHash)
|
|
815
1190
|
|
|
816
|
-
def handle_error_message(self, client: Client, message):
|
|
1191
|
+
def handle_error_message(self, client: Client, message) -> Bool:
|
|
817
1192
|
#
|
|
818
1193
|
# {
|
|
819
1194
|
# "id": 0,
|
|
@@ -822,6 +1197,7 @@ class cryptocom(ccxt.async_support.cryptocom):
|
|
|
822
1197
|
# "message": "invalid channel {"channels":["trade.BTCUSD-PERP"]}"
|
|
823
1198
|
# }
|
|
824
1199
|
#
|
|
1200
|
+
id = self.safe_string(message, 'id')
|
|
825
1201
|
errorCode = self.safe_string(message, 'code')
|
|
826
1202
|
try:
|
|
827
1203
|
if errorCode and errorCode != '0':
|
|
@@ -830,6 +1206,7 @@ class cryptocom(ccxt.async_support.cryptocom):
|
|
|
830
1206
|
messageString = self.safe_value(message, 'message')
|
|
831
1207
|
if messageString is not None:
|
|
832
1208
|
self.throw_broadly_matched_exception(self.exceptions['broad'], messageString, feedback)
|
|
1209
|
+
raise ExchangeError(feedback)
|
|
833
1210
|
return False
|
|
834
1211
|
except Exception as e:
|
|
835
1212
|
if isinstance(e, AuthenticationError):
|
|
@@ -838,7 +1215,7 @@ class cryptocom(ccxt.async_support.cryptocom):
|
|
|
838
1215
|
if messageHash in client.subscriptions:
|
|
839
1216
|
del client.subscriptions[messageHash]
|
|
840
1217
|
else:
|
|
841
|
-
client.reject(e)
|
|
1218
|
+
client.reject(e, id)
|
|
842
1219
|
return True
|
|
843
1220
|
|
|
844
1221
|
def handle_subscribe(self, client: Client, message):
|
|
@@ -896,6 +1273,9 @@ class cryptocom(ccxt.async_support.cryptocom):
|
|
|
896
1273
|
# "channel":"ticker",
|
|
897
1274
|
# "data":[{}]
|
|
898
1275
|
#
|
|
1276
|
+
# handle unsubscribe
|
|
1277
|
+
# {"id":1725448572836,"method":"unsubscribe","code":0}
|
|
1278
|
+
#
|
|
899
1279
|
if self.handle_error_message(client, message):
|
|
900
1280
|
return
|
|
901
1281
|
method = self.safe_string(message, 'method')
|
|
@@ -904,10 +1284,12 @@ class cryptocom(ccxt.async_support.cryptocom):
|
|
|
904
1284
|
'public/heartbeat': self.handle_ping,
|
|
905
1285
|
'public/auth': self.handle_authenticate,
|
|
906
1286
|
'private/create-order': self.handle_order,
|
|
1287
|
+
'private/amend-order': self.handle_order,
|
|
907
1288
|
'private/cancel-order': self.handle_order,
|
|
908
1289
|
'private/cancel-all-orders': self.handle_cancel_all_orders,
|
|
909
1290
|
'private/close-position': self.handle_order,
|
|
910
1291
|
'subscribe': self.handle_subscribe,
|
|
1292
|
+
'unsubscribe': self.handle_unsubscribe,
|
|
911
1293
|
}
|
|
912
1294
|
callMethod = self.safe_value(methods, method)
|
|
913
1295
|
if callMethod is not None:
|
|
@@ -945,3 +1327,24 @@ class cryptocom(ccxt.async_support.cryptocom):
|
|
|
945
1327
|
#
|
|
946
1328
|
future = self.safe_value(client.futures, 'authenticated')
|
|
947
1329
|
future.resolve(True)
|
|
1330
|
+
|
|
1331
|
+
def handle_unsubscribe(self, client: Client, message):
|
|
1332
|
+
id = self.safe_string(message, 'id')
|
|
1333
|
+
keys = list(client.subscriptions.keys())
|
|
1334
|
+
for i in range(0, len(keys)):
|
|
1335
|
+
messageHash = keys[i]
|
|
1336
|
+
if not (messageHash in client.subscriptions):
|
|
1337
|
+
continue
|
|
1338
|
+
# the previous iteration can have deleted the messageHash from the subscriptions
|
|
1339
|
+
if messageHash.startswith('unsubscribe'):
|
|
1340
|
+
subscription = client.subscriptions[messageHash]
|
|
1341
|
+
subId = self.safe_string(subscription, 'id')
|
|
1342
|
+
if id != subId:
|
|
1343
|
+
continue
|
|
1344
|
+
messageHashes = self.safe_list(subscription, 'messageHashes', [])
|
|
1345
|
+
subMessageHashes = self.safe_list(subscription, 'subMessageHashes', [])
|
|
1346
|
+
for j in range(0, len(messageHashes)):
|
|
1347
|
+
unsubHash = messageHashes[j]
|
|
1348
|
+
subHash = subMessageHashes[j]
|
|
1349
|
+
self.clean_unsubscription(client, subHash, unsubHash)
|
|
1350
|
+
self.clean_cache(subscription)
|