ccxt-ir 4.3.46.0.2__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 +9 -9
- 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 +10 -10
- 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.2.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.2.dist-info → ccxt_ir-4.5.0.dist-info}/WHEEL +1 -1
- 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.2.dist-info/RECORD +0 -772
- /ccxt/abstract/{huobijp.py → bittrade.py} +0 -0
- {ccxt_ir-4.3.46.0.2.dist-info → ccxt_ir-4.5.0.dist-info/licenses}/LICENSE.txt +0 -0
- {ccxt_ir-4.3.46.0.2.dist-info → ccxt_ir-4.5.0.dist-info}/top_level.txt +0 -0
ccxt/pro/cex.py
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
import ccxt.async_support
|
|
7
7
|
from ccxt.async_support.base.ws.cache import ArrayCache, ArrayCacheBySymbolById, ArrayCacheByTimestamp
|
|
8
8
|
import hashlib
|
|
9
|
-
from ccxt.base.types import Balances, Int, Num, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade
|
|
9
|
+
from ccxt.base.types import Any, Balances, Bool, Int, Num, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade
|
|
10
10
|
from ccxt.async_support.base.ws.client import Client
|
|
11
11
|
from typing import List
|
|
12
12
|
from ccxt.base.errors import ExchangeError
|
|
@@ -17,7 +17,7 @@ from ccxt.base.precise import Precise
|
|
|
17
17
|
|
|
18
18
|
class cex(ccxt.async_support.cex):
|
|
19
19
|
|
|
20
|
-
def describe(self):
|
|
20
|
+
def describe(self) -> Any:
|
|
21
21
|
return self.deep_extend(super(cex, self).describe(), {
|
|
22
22
|
'has': {
|
|
23
23
|
'ws': True,
|
|
@@ -25,6 +25,7 @@ class cex(ccxt.async_support.cex):
|
|
|
25
25
|
'watchTicker': True,
|
|
26
26
|
'watchTickers': True,
|
|
27
27
|
'watchTrades': True,
|
|
28
|
+
'watchTradesForSymbols': False,
|
|
28
29
|
'watchMyTrades': True,
|
|
29
30
|
'watchOrders': True,
|
|
30
31
|
'watchOrderBook': True,
|
|
@@ -61,7 +62,9 @@ class cex(ccxt.async_support.cex):
|
|
|
61
62
|
async def watch_balance(self, params={}) -> Balances:
|
|
62
63
|
"""
|
|
63
64
|
watch balance and get the amount of funds available for trading or funds locked in orders
|
|
64
|
-
|
|
65
|
+
|
|
66
|
+
https://cex.io/websocket-api#get-balance
|
|
67
|
+
|
|
65
68
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
|
66
69
|
:returns dict: a `balance structure <https://docs.ccxt.com/#/?id=balance-structure>`
|
|
67
70
|
"""
|
|
@@ -118,7 +121,9 @@ class cex(ccxt.async_support.cex):
|
|
|
118
121
|
async def watch_trades(self, symbol: str, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
|
|
119
122
|
"""
|
|
120
123
|
get the list of most recent trades for a particular symbol. Note: can only watch one symbol at a time.
|
|
121
|
-
|
|
124
|
+
|
|
125
|
+
https://cex.io/websocket-api#old-pair-room
|
|
126
|
+
|
|
122
127
|
:param str symbol: unified symbol of the market to fetch trades for
|
|
123
128
|
:param int [since]: timestamp in ms of the earliest trade to fetch
|
|
124
129
|
:param int [limit]: the maximum amount of trades to fetch
|
|
@@ -235,7 +240,9 @@ class cex(ccxt.async_support.cex):
|
|
|
235
240
|
|
|
236
241
|
async def watch_ticker(self, symbol: str, params={}) -> Ticker:
|
|
237
242
|
"""
|
|
238
|
-
|
|
243
|
+
|
|
244
|
+
https://cex.io/websocket-api#ticker-subscription
|
|
245
|
+
|
|
239
246
|
watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
|
|
240
247
|
:param str symbol: unified symbol of the market to fetch the ticker for
|
|
241
248
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
|
@@ -270,7 +277,9 @@ class cex(ccxt.async_support.cex):
|
|
|
270
277
|
|
|
271
278
|
async def watch_tickers(self, symbols: Strings = None, params={}) -> Tickers:
|
|
272
279
|
"""
|
|
273
|
-
|
|
280
|
+
|
|
281
|
+
https://cex.io/websocket-api#ticker-subscription
|
|
282
|
+
|
|
274
283
|
watches price tickers for multiple markets, statistical information calculated over the past 24 hours for each market
|
|
275
284
|
:param str[]|None symbols: unified symbols of the markets to fetch the ticker for, all market tickers are returned if not assigned
|
|
276
285
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
|
@@ -299,7 +308,9 @@ class cex(ccxt.async_support.cex):
|
|
|
299
308
|
|
|
300
309
|
async def fetch_ticker_ws(self, symbol: str, params={}) -> Ticker:
|
|
301
310
|
"""
|
|
302
|
-
|
|
311
|
+
|
|
312
|
+
https://docs.cex.io/#ws-api-ticker-deprecated
|
|
313
|
+
|
|
303
314
|
fetches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
|
|
304
315
|
:param str symbol: unified symbol of the market to fetch the ticker for
|
|
305
316
|
:param dict [params]: extra parameters specific to the cex api endpoint
|
|
@@ -404,7 +415,9 @@ class cex(ccxt.async_support.cex):
|
|
|
404
415
|
|
|
405
416
|
async def fetch_balance_ws(self, params={}) -> Balances:
|
|
406
417
|
"""
|
|
407
|
-
|
|
418
|
+
|
|
419
|
+
https://docs.cex.io/#ws-api-get-balance
|
|
420
|
+
|
|
408
421
|
query for balance and get the amount of funds available for trading or funds locked in orders
|
|
409
422
|
:param dict [params]: extra parameters specific to the cex api endpoint
|
|
410
423
|
:returns dict: a `balance structure <https://docs.ccxt.com/#/?id=balance-structure>`
|
|
@@ -422,7 +435,9 @@ class cex(ccxt.async_support.cex):
|
|
|
422
435
|
async def watch_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
|
|
423
436
|
"""
|
|
424
437
|
get the list of orders associated with the user. Note: In CEX.IO system, orders can be present in trade engine or in archive database. There can be time periods(~2 seconds or more), when order is done/canceled, but still not moved to archive database. That means, you cannot see it using calls: archived-orders/open-orders.
|
|
425
|
-
|
|
438
|
+
|
|
439
|
+
https://docs.cex.io/#ws-api-open-orders
|
|
440
|
+
|
|
426
441
|
:param str symbol: unified symbol of the market to fetch trades for
|
|
427
442
|
:param int [since]: timestamp in ms of the earliest trade to fetch
|
|
428
443
|
:param int [limit]: the maximum amount of trades to fetch
|
|
@@ -456,7 +471,9 @@ class cex(ccxt.async_support.cex):
|
|
|
456
471
|
async def watch_my_trades(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
|
|
457
472
|
"""
|
|
458
473
|
get the list of trades associated with the user. Note: In CEX.IO system, orders can be present in trade engine or in archive database. There can be time periods(~2 seconds or more), when order is done/canceled, but still not moved to archive database. That means, you cannot see it using calls: archived-orders/open-orders.
|
|
459
|
-
|
|
474
|
+
|
|
475
|
+
https://docs.cex.io/#ws-api-open-orders
|
|
476
|
+
|
|
460
477
|
:param str symbol: unified symbol of the market to fetch trades for
|
|
461
478
|
:param int [since]: timestamp in ms of the earliest trade to fetch
|
|
462
479
|
:param int [limit]: the maximum amount of trades to fetch
|
|
@@ -640,7 +657,7 @@ class cex(ccxt.async_support.cex):
|
|
|
640
657
|
# }
|
|
641
658
|
# }
|
|
642
659
|
# }
|
|
643
|
-
#
|
|
660
|
+
# fulfilledOrder
|
|
644
661
|
# {
|
|
645
662
|
# "e": "order",
|
|
646
663
|
# "data": {
|
|
@@ -868,7 +885,9 @@ class cex(ccxt.async_support.cex):
|
|
|
868
885
|
async def watch_order_book(self, symbol: str, limit: Int = None, params={}) -> OrderBook:
|
|
869
886
|
"""
|
|
870
887
|
watches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
|
|
871
|
-
|
|
888
|
+
|
|
889
|
+
https://cex.io/websocket-api#orderbook-subscribe
|
|
890
|
+
|
|
872
891
|
:param str symbol: unified symbol of the market to fetch the order book for
|
|
873
892
|
:param int [limit]: the maximum amount of order book entries to return
|
|
874
893
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
|
@@ -961,7 +980,7 @@ class cex(ccxt.async_support.cex):
|
|
|
961
980
|
# }
|
|
962
981
|
#
|
|
963
982
|
data = self.safe_value(message, 'data', {})
|
|
964
|
-
incrementalId = self.
|
|
983
|
+
incrementalId = self.safe_integer(data, 'id')
|
|
965
984
|
pair = self.safe_string(data, 'pair', '')
|
|
966
985
|
symbol = self.pair_to_symbol(pair)
|
|
967
986
|
storedOrderBook = self.safe_value(self.orderbooks, symbol)
|
|
@@ -989,7 +1008,9 @@ class cex(ccxt.async_support.cex):
|
|
|
989
1008
|
|
|
990
1009
|
async def watch_ohlcv(self, symbol: str, timeframe='1m', since: Int = None, limit: Int = None, params={}) -> List[list]:
|
|
991
1010
|
"""
|
|
992
|
-
|
|
1011
|
+
|
|
1012
|
+
https://cex.io/websocket-api#minute-data
|
|
1013
|
+
|
|
993
1014
|
watches historical candlestick data containing the open, high, low, and close price, and the volume of a market. It will return the last 120 minutes with the selected timeframe and then 1m candle updates after that.
|
|
994
1015
|
:param str symbol: unified symbol of the market to fetch OHLCV data for
|
|
995
1016
|
:param str timeframe: the length of time each candle represents.
|
|
@@ -1128,7 +1149,10 @@ class cex(ccxt.async_support.cex):
|
|
|
1128
1149
|
async def fetch_order_ws(self, id: str, symbol: Str = None, params={}):
|
|
1129
1150
|
"""
|
|
1130
1151
|
fetches information on an order made by the user
|
|
1131
|
-
|
|
1152
|
+
|
|
1153
|
+
https://docs.cex.io/#ws-api-get-order
|
|
1154
|
+
|
|
1155
|
+
:param str id: the order id
|
|
1132
1156
|
:param str symbol: not used by cex fetchOrder
|
|
1133
1157
|
:param dict [params]: extra parameters specific to the cex api endpoint
|
|
1134
1158
|
:returns dict: An `order structure <https://docs.ccxt.com/#/?id=order-structure>`
|
|
@@ -1153,7 +1177,9 @@ class cex(ccxt.async_support.cex):
|
|
|
1153
1177
|
|
|
1154
1178
|
async def fetch_open_orders_ws(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}):
|
|
1155
1179
|
"""
|
|
1156
|
-
|
|
1180
|
+
|
|
1181
|
+
https://docs.cex.io/#ws-api-open-orders
|
|
1182
|
+
|
|
1157
1183
|
fetch all unfilled currently open orders
|
|
1158
1184
|
:param str symbol: unified market symbol
|
|
1159
1185
|
:param int [since]: the earliest time in ms to fetch open orders for
|
|
@@ -1162,7 +1188,7 @@ class cex(ccxt.async_support.cex):
|
|
|
1162
1188
|
:returns Order[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
|
|
1163
1189
|
"""
|
|
1164
1190
|
if symbol is None:
|
|
1165
|
-
raise ArgumentsRequired(self.id + 'fetchOpenOrdersWs requires a symbol.')
|
|
1191
|
+
raise ArgumentsRequired(self.id + ' fetchOpenOrdersWs requires a symbol.')
|
|
1166
1192
|
await self.load_markets()
|
|
1167
1193
|
await self.authenticate()
|
|
1168
1194
|
market = self.market(symbol)
|
|
@@ -1181,13 +1207,15 @@ class cex(ccxt.async_support.cex):
|
|
|
1181
1207
|
|
|
1182
1208
|
async def create_order_ws(self, symbol: str, type: OrderType, side: OrderSide, amount: float, price: Num = None, params={}) -> Order:
|
|
1183
1209
|
"""
|
|
1184
|
-
|
|
1210
|
+
|
|
1211
|
+
https://docs.cex.io/#ws-api-order-placement
|
|
1212
|
+
|
|
1185
1213
|
create a trade order
|
|
1186
1214
|
:param str symbol: unified symbol of the market to create an order in
|
|
1187
1215
|
:param str type: 'market' or 'limit'
|
|
1188
1216
|
:param str side: 'buy' or 'sell'
|
|
1189
1217
|
:param float amount: how much of currency you want to trade in units of base currency
|
|
1190
|
-
:param float price: the price at which the order is to be
|
|
1218
|
+
:param float price: the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
|
|
1191
1219
|
:param dict [params]: extra parameters specific to the kraken api endpoint
|
|
1192
1220
|
:param boolean [params.maker_only]: Optional, maker only places an order only if offers best sell(<= max) or buy(>= max) price for self pair, if not order placement will be rejected with an error - "Order is not maker"
|
|
1193
1221
|
:returns dict: an `order structure <https://docs.ccxt.com/en/latest/manual.html#order-structure>`
|
|
@@ -1216,13 +1244,15 @@ class cex(ccxt.async_support.cex):
|
|
|
1216
1244
|
async def edit_order_ws(self, id: str, symbol: str, type: OrderType, side: OrderSide, amount: Num = None, price: Num = None, params={}) -> Order:
|
|
1217
1245
|
"""
|
|
1218
1246
|
edit a trade order
|
|
1219
|
-
|
|
1247
|
+
|
|
1248
|
+
https://docs.cex.io/#ws-api-cancel-replace
|
|
1249
|
+
|
|
1220
1250
|
:param str id: order id
|
|
1221
1251
|
:param str symbol: unified symbol of the market to create an order in
|
|
1222
1252
|
:param str type: 'market' or 'limit'
|
|
1223
1253
|
:param str side: 'buy' or 'sell'
|
|
1224
1254
|
:param float amount: how much of the currency you want to trade in units of the base currency
|
|
1225
|
-
:param float|None [price]: the price at which the order is to be
|
|
1255
|
+
:param float|None [price]: the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
|
|
1226
1256
|
:param dict [params]: extra parameters specific to the cex api endpoint
|
|
1227
1257
|
:returns dict: an `order structure <https://docs.ccxt.com/en/latest/manual.html#order-structure>`
|
|
1228
1258
|
"""
|
|
@@ -1252,7 +1282,9 @@ class cex(ccxt.async_support.cex):
|
|
|
1252
1282
|
|
|
1253
1283
|
async def cancel_order_ws(self, id: str, symbol: Str = None, params={}):
|
|
1254
1284
|
"""
|
|
1255
|
-
|
|
1285
|
+
|
|
1286
|
+
https://docs.cex.io/#ws-api-order-cancel
|
|
1287
|
+
|
|
1256
1288
|
cancels an open order
|
|
1257
1289
|
:param str id: order id
|
|
1258
1290
|
:param str symbol: not used by cex cancelOrder()
|
|
@@ -1280,7 +1312,9 @@ class cex(ccxt.async_support.cex):
|
|
|
1280
1312
|
async def cancel_orders_ws(self, ids: List[str], symbol: Str = None, params={}):
|
|
1281
1313
|
"""
|
|
1282
1314
|
cancel multiple orders
|
|
1283
|
-
|
|
1315
|
+
|
|
1316
|
+
https://docs.cex.io/#ws-api-mass-cancel-place
|
|
1317
|
+
|
|
1284
1318
|
:param str[] ids: order ids
|
|
1285
1319
|
:param str symbol: not used by cex cancelOrders()
|
|
1286
1320
|
:param dict [params]: extra parameters specific to the cex api endpoint
|
|
@@ -1344,7 +1378,7 @@ class cex(ccxt.async_support.cex):
|
|
|
1344
1378
|
#
|
|
1345
1379
|
return message
|
|
1346
1380
|
|
|
1347
|
-
def handle_error_message(self, client: Client, message):
|
|
1381
|
+
def handle_error_message(self, client: Client, message) -> Bool:
|
|
1348
1382
|
#
|
|
1349
1383
|
# {
|
|
1350
1384
|
# "e": "get-balance",
|
|
@@ -1366,6 +1400,7 @@ class cex(ccxt.async_support.cex):
|
|
|
1366
1400
|
future = self.safe_value(client['futures'], messageHash)
|
|
1367
1401
|
if future is not None:
|
|
1368
1402
|
client.reject(error, messageHash)
|
|
1403
|
+
return True
|
|
1369
1404
|
else:
|
|
1370
1405
|
raise error
|
|
1371
1406
|
|
ccxt/pro/coinbase.py
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
import ccxt.async_support
|
|
7
7
|
from ccxt.async_support.base.ws.cache import ArrayCacheBySymbolById
|
|
8
8
|
import hashlib
|
|
9
|
-
from ccxt.base.types import Int, Order, OrderBook, Str, Strings, Ticker, Tickers, Trade
|
|
9
|
+
from ccxt.base.types import Any, Int, Order, OrderBook, Str, Strings, Ticker, Tickers, Trade
|
|
10
10
|
from typing import List
|
|
11
11
|
from ccxt.base.errors import ExchangeError
|
|
12
12
|
from ccxt.base.errors import ArgumentsRequired
|
|
@@ -14,7 +14,7 @@ from ccxt.base.errors import ArgumentsRequired
|
|
|
14
14
|
|
|
15
15
|
class coinbase(ccxt.async_support.coinbase):
|
|
16
16
|
|
|
17
|
-
def describe(self):
|
|
17
|
+
def describe(self) -> Any:
|
|
18
18
|
return self.deep_extend(super(coinbase, self).describe(), {
|
|
19
19
|
'has': {
|
|
20
20
|
'ws': True,
|
|
@@ -56,11 +56,14 @@ class coinbase(ccxt.async_support.coinbase):
|
|
|
56
56
|
|
|
57
57
|
async def subscribe(self, name: str, isPrivate: bool, symbol=None, params={}):
|
|
58
58
|
"""
|
|
59
|
-
|
|
59
|
+
@ignore
|
|
60
60
|
subscribes to a websocket channel
|
|
61
|
-
|
|
61
|
+
|
|
62
|
+
https://docs.cloud.coinbase.com/advanced-trade-api/docs/ws-overview#subscribe
|
|
63
|
+
|
|
62
64
|
:param str name: the name of the channel
|
|
63
|
-
:param
|
|
65
|
+
:param boolean isPrivate: whether the channel is private or not
|
|
66
|
+
:param str [symbol]: unified market symbol
|
|
64
67
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
|
65
68
|
:returns dict: subscription to a websocket channel
|
|
66
69
|
"""
|
|
@@ -75,7 +78,7 @@ class coinbase(ccxt.async_support.coinbase):
|
|
|
75
78
|
messageHash = messageHash + '::' + ','.join(symbol)
|
|
76
79
|
elif symbol is not None:
|
|
77
80
|
market = self.market(symbol)
|
|
78
|
-
messageHash = name + '::' +
|
|
81
|
+
messageHash = name + '::' + symbol
|
|
79
82
|
productIds = [market['id']]
|
|
80
83
|
url = self.urls['api']['ws']
|
|
81
84
|
subscribe = {
|
|
@@ -92,10 +95,13 @@ class coinbase(ccxt.async_support.coinbase):
|
|
|
92
95
|
|
|
93
96
|
async def subscribe_multiple(self, name: str, isPrivate: bool, symbols: Strings = None, params={}):
|
|
94
97
|
"""
|
|
95
|
-
|
|
98
|
+
@ignore
|
|
96
99
|
subscribes to a websocket channel
|
|
97
|
-
|
|
100
|
+
|
|
101
|
+
https://docs.cloud.coinbase.com/advanced-trade-api/docs/ws-overview#subscribe
|
|
102
|
+
|
|
98
103
|
:param str name: the name of the channel
|
|
104
|
+
:param boolean isPrivate: whether the channel is private or not
|
|
99
105
|
:param str[] [symbols]: unified market symbol
|
|
100
106
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
|
101
107
|
:returns dict: subscription to a websocket channel
|
|
@@ -109,7 +115,7 @@ class coinbase(ccxt.async_support.coinbase):
|
|
|
109
115
|
market = self.market(symbol)
|
|
110
116
|
marketId = market['id']
|
|
111
117
|
productIds.append(marketId)
|
|
112
|
-
messageHashes.append(name + '::' +
|
|
118
|
+
messageHashes.append(name + '::' + symbol)
|
|
113
119
|
url = self.urls['api']['ws']
|
|
114
120
|
subscribe = {
|
|
115
121
|
'type': 'subscribe',
|
|
@@ -147,27 +153,36 @@ class coinbase(ccxt.async_support.coinbase):
|
|
|
147
153
|
async def watch_ticker(self, symbol: str, params={}) -> Ticker:
|
|
148
154
|
"""
|
|
149
155
|
watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
|
|
150
|
-
|
|
156
|
+
|
|
157
|
+
https://docs.cloud.coinbase.com/advanced-trade-api/docs/ws-channels#ticker-channel
|
|
158
|
+
|
|
151
159
|
:param str [symbol]: unified symbol of the market to fetch the ticker for
|
|
152
160
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
|
153
161
|
:returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
|
|
154
162
|
"""
|
|
163
|
+
await self.load_markets()
|
|
155
164
|
name = 'ticker'
|
|
156
165
|
return await self.subscribe(name, False, symbol, params)
|
|
157
166
|
|
|
158
167
|
async def watch_tickers(self, symbols: Strings = None, params={}) -> Tickers:
|
|
159
168
|
"""
|
|
160
169
|
watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
|
|
161
|
-
|
|
170
|
+
|
|
171
|
+
https://docs.cloud.coinbase.com/advanced-trade-api/docs/ws-channels#ticker-batch-channel
|
|
172
|
+
|
|
162
173
|
:param str[] [symbols]: unified symbol of the market to fetch the ticker for
|
|
163
174
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
|
164
175
|
:returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
|
|
165
176
|
"""
|
|
177
|
+
await self.load_markets()
|
|
166
178
|
if symbols is None:
|
|
167
179
|
symbols = self.symbols
|
|
168
180
|
name = 'ticker_batch'
|
|
169
|
-
|
|
181
|
+
ticker = await self.subscribe_multiple(name, False, symbols, params)
|
|
170
182
|
if self.newUpdates:
|
|
183
|
+
tickers = {}
|
|
184
|
+
symbol = ticker['symbol']
|
|
185
|
+
tickers[symbol] = ticker
|
|
171
186
|
return tickers
|
|
172
187
|
return self.tickers
|
|
173
188
|
|
|
@@ -262,7 +277,7 @@ class coinbase(ccxt.async_support.coinbase):
|
|
|
262
277
|
#
|
|
263
278
|
#
|
|
264
279
|
channel = self.safe_string(message, 'channel')
|
|
265
|
-
events = self.
|
|
280
|
+
events = self.safe_list(message, 'events', [])
|
|
266
281
|
datetime = self.safe_string(message, 'timestamp')
|
|
267
282
|
timestamp = self.parse8601(datetime)
|
|
268
283
|
newTickers = []
|
|
@@ -271,31 +286,18 @@ class coinbase(ccxt.async_support.coinbase):
|
|
|
271
286
|
tickers = self.safe_list(tickersObj, 'tickers', [])
|
|
272
287
|
for j in range(0, len(tickers)):
|
|
273
288
|
ticker = tickers[j]
|
|
289
|
+
wsMarketId = self.safe_string(ticker, 'product_id')
|
|
290
|
+
if wsMarketId is None:
|
|
291
|
+
continue
|
|
274
292
|
result = self.parse_ws_ticker(ticker)
|
|
275
293
|
result['timestamp'] = timestamp
|
|
276
294
|
result['datetime'] = datetime
|
|
277
295
|
symbol = result['symbol']
|
|
278
296
|
self.tickers[symbol] = result
|
|
279
|
-
wsMarketId = self.safe_string(ticker, 'product_id')
|
|
280
|
-
if wsMarketId is None:
|
|
281
|
-
continue
|
|
282
|
-
messageHash = channel + '::' + wsMarketId
|
|
283
297
|
newTickers.append(result)
|
|
298
|
+
messageHash = channel + '::' + symbol
|
|
284
299
|
client.resolve(result, messageHash)
|
|
285
|
-
|
|
286
|
-
client.resolve(result, messageHash + 'C') # sometimes we subscribe to BTC/USDC and coinbase returns BTC/USD
|
|
287
|
-
messageHashes = self.find_message_hashes(client, 'ticker_batch::')
|
|
288
|
-
for i in range(0, len(messageHashes)):
|
|
289
|
-
messageHash = messageHashes[i]
|
|
290
|
-
parts = messageHash.split('::')
|
|
291
|
-
symbolsString = parts[1]
|
|
292
|
-
symbols = symbolsString.split(',')
|
|
293
|
-
tickers = self.filter_by_array(newTickers, 'symbol', symbols)
|
|
294
|
-
if not self.is_empty(tickers):
|
|
295
|
-
client.resolve(tickers, messageHash)
|
|
296
|
-
if messageHash.endswith('USD'):
|
|
297
|
-
client.resolve(tickers, messageHash + 'C') # sometimes we subscribe to BTC/USDC and coinbase returns BTC/USD
|
|
298
|
-
return message
|
|
300
|
+
self.try_resolve_usdc(client, messageHash, result)
|
|
299
301
|
|
|
300
302
|
def parse_ws_ticker(self, ticker, market=None):
|
|
301
303
|
#
|
|
@@ -345,7 +347,9 @@ class coinbase(ccxt.async_support.coinbase):
|
|
|
345
347
|
async def watch_trades(self, symbol: str, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
|
|
346
348
|
"""
|
|
347
349
|
get the list of most recent trades for a particular symbol
|
|
348
|
-
|
|
350
|
+
|
|
351
|
+
https://docs.cloud.coinbase.com/advanced-trade-api/docs/ws-channels#market-trades-channel
|
|
352
|
+
|
|
349
353
|
:param str symbol: unified symbol of the market to fetch trades for
|
|
350
354
|
:param int [since]: timestamp in ms of the earliest trade to fetch
|
|
351
355
|
:param int [limit]: the maximum amount of trades to fetch
|
|
@@ -363,7 +367,9 @@ class coinbase(ccxt.async_support.coinbase):
|
|
|
363
367
|
async def watch_trades_for_symbols(self, symbols: List[str], since: Int = None, limit: Int = None, params={}) -> List[Trade]:
|
|
364
368
|
"""
|
|
365
369
|
get the list of most recent trades for a particular symbol
|
|
366
|
-
|
|
370
|
+
|
|
371
|
+
https://docs.cloud.coinbase.com/advanced-trade-api/docs/ws-channels#market-trades-channel
|
|
372
|
+
|
|
367
373
|
:param str[] symbols: unified symbol of the market to fetch trades for
|
|
368
374
|
:param int [since]: timestamp in ms of the earliest trade to fetch
|
|
369
375
|
:param int [limit]: the maximum amount of trades to fetch
|
|
@@ -382,7 +388,9 @@ class coinbase(ccxt.async_support.coinbase):
|
|
|
382
388
|
async def watch_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
|
|
383
389
|
"""
|
|
384
390
|
watches information on multiple orders made by the user
|
|
385
|
-
|
|
391
|
+
|
|
392
|
+
https://docs.cloud.coinbase.com/advanced-trade-api/docs/ws-channels#user-channel
|
|
393
|
+
|
|
386
394
|
:param str [symbol]: unified market symbol of the market orders were made in
|
|
387
395
|
:param int [since]: the earliest time in ms to fetch orders for
|
|
388
396
|
:param int [limit]: the maximum number of order structures to retrieve
|
|
@@ -399,7 +407,9 @@ class coinbase(ccxt.async_support.coinbase):
|
|
|
399
407
|
async def watch_order_book(self, symbol: str, limit: Int = None, params={}) -> OrderBook:
|
|
400
408
|
"""
|
|
401
409
|
watches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
|
|
402
|
-
|
|
410
|
+
|
|
411
|
+
https://docs.cloud.coinbase.com/advanced-trade-api/docs/ws-channels#level2-channel
|
|
412
|
+
|
|
403
413
|
:param str symbol: unified symbol of the market to fetch the order book for
|
|
404
414
|
:param int [limit]: the maximum amount of order book entries to return
|
|
405
415
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
|
@@ -415,7 +425,9 @@ class coinbase(ccxt.async_support.coinbase):
|
|
|
415
425
|
async def watch_order_book_for_symbols(self, symbols: List[str], limit: Int = None, params={}) -> OrderBook:
|
|
416
426
|
"""
|
|
417
427
|
watches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
|
|
418
|
-
|
|
428
|
+
|
|
429
|
+
https://docs.cloud.coinbase.com/advanced-trade-api/docs/ws-channels#level2-channel
|
|
430
|
+
|
|
419
431
|
:param str[] symbols: unified array of symbols
|
|
420
432
|
:param int [limit]: the maximum amount of order book entries to return
|
|
421
433
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
|
@@ -450,13 +462,13 @@ class coinbase(ccxt.async_support.coinbase):
|
|
|
450
462
|
# ]
|
|
451
463
|
# }
|
|
452
464
|
#
|
|
453
|
-
events = self.
|
|
465
|
+
events = self.safe_list(message, 'events')
|
|
454
466
|
event = self.safe_value(events, 0)
|
|
455
|
-
trades = self.
|
|
456
|
-
trade = self.
|
|
467
|
+
trades = self.safe_list(event, 'trades')
|
|
468
|
+
trade = self.safe_dict(trades, 0)
|
|
457
469
|
marketId = self.safe_string(trade, 'product_id')
|
|
458
|
-
messageHash = 'market_trades::' + marketId
|
|
459
470
|
symbol = self.safe_symbol(marketId)
|
|
471
|
+
messageHash = 'market_trades::' + symbol
|
|
460
472
|
tradesArray = self.safe_value(self.trades, symbol)
|
|
461
473
|
if tradesArray is None:
|
|
462
474
|
tradesLimit = self.safe_integer(self.options, 'tradesLimit', 1000)
|
|
@@ -464,14 +476,12 @@ class coinbase(ccxt.async_support.coinbase):
|
|
|
464
476
|
self.trades[symbol] = tradesArray
|
|
465
477
|
for i in range(0, len(events)):
|
|
466
478
|
currentEvent = events[i]
|
|
467
|
-
currentTrades = self.
|
|
479
|
+
currentTrades = self.safe_list(currentEvent, 'trades')
|
|
468
480
|
for j in range(0, len(currentTrades)):
|
|
469
481
|
item = currentTrades[i]
|
|
470
482
|
tradesArray.append(self.parse_trade(item))
|
|
471
483
|
client.resolve(tradesArray, messageHash)
|
|
472
|
-
|
|
473
|
-
client.resolve(tradesArray, messageHash + 'C') # sometimes we subscribe to BTC/USDC and coinbase returns BTC/USD
|
|
474
|
-
return message
|
|
484
|
+
self.try_resolve_usdc(client, messageHash, tradesArray)
|
|
475
485
|
|
|
476
486
|
def handle_order(self, client, message):
|
|
477
487
|
#
|
|
@@ -502,14 +512,14 @@ class coinbase(ccxt.async_support.coinbase):
|
|
|
502
512
|
# ]
|
|
503
513
|
# }
|
|
504
514
|
#
|
|
505
|
-
events = self.
|
|
515
|
+
events = self.safe_list(message, 'events')
|
|
506
516
|
marketIds = []
|
|
507
517
|
if self.orders is None:
|
|
508
518
|
limit = self.safe_integer(self.options, 'ordersLimit', 1000)
|
|
509
519
|
self.orders = ArrayCacheBySymbolById(limit)
|
|
510
520
|
for i in range(0, len(events)):
|
|
511
521
|
event = events[i]
|
|
512
|
-
responseOrders = self.
|
|
522
|
+
responseOrders = self.safe_list(event, 'orders')
|
|
513
523
|
for j in range(0, len(responseOrders)):
|
|
514
524
|
responseOrder = responseOrders[j]
|
|
515
525
|
parsed = self.parse_ws_order(responseOrder)
|
|
@@ -520,12 +530,11 @@ class coinbase(ccxt.async_support.coinbase):
|
|
|
520
530
|
cachedOrders.append(parsed)
|
|
521
531
|
for i in range(0, len(marketIds)):
|
|
522
532
|
marketId = marketIds[i]
|
|
523
|
-
|
|
533
|
+
symbol = self.safe_symbol(marketId)
|
|
534
|
+
messageHash = 'user::' + symbol
|
|
524
535
|
client.resolve(self.orders, messageHash)
|
|
525
|
-
|
|
526
|
-
client.resolve(self.orders, messageHash + 'C') # sometimes we subscribe to BTC/USDC and coinbase returns BTC/USD
|
|
536
|
+
self.try_resolve_usdc(client, messageHash, self.orders)
|
|
527
537
|
client.resolve(self.orders, 'user')
|
|
528
|
-
return message
|
|
529
538
|
|
|
530
539
|
def parse_ws_order(self, order, market=None):
|
|
531
540
|
#
|
|
@@ -601,7 +610,7 @@ class coinbase(ccxt.async_support.coinbase):
|
|
|
601
610
|
# {
|
|
602
611
|
# "side": "bid",
|
|
603
612
|
# "event_time": "1970-01-01T00:00:00Z",
|
|
604
|
-
# "price_level": "21921.
|
|
613
|
+
# "price_level": "21921.74",
|
|
605
614
|
# "new_quantity": "0.06317902"
|
|
606
615
|
# },
|
|
607
616
|
# {
|
|
@@ -615,36 +624,35 @@ class coinbase(ccxt.async_support.coinbase):
|
|
|
615
624
|
# ]
|
|
616
625
|
# }
|
|
617
626
|
#
|
|
618
|
-
events = self.
|
|
627
|
+
events = self.safe_list(message, 'events')
|
|
619
628
|
datetime = self.safe_string(message, 'timestamp')
|
|
620
629
|
for i in range(0, len(events)):
|
|
621
630
|
event = events[i]
|
|
622
|
-
updates = self.
|
|
631
|
+
updates = self.safe_list(event, 'updates', [])
|
|
623
632
|
marketId = self.safe_string(event, 'product_id')
|
|
624
|
-
|
|
633
|
+
# sometimes we subscribe to BTC/USDC and coinbase returns BTC/USD, are aliases
|
|
634
|
+
market = self.safe_market(marketId)
|
|
635
|
+
symbol = market['symbol']
|
|
636
|
+
messageHash = 'level2::' + symbol
|
|
625
637
|
subscription = self.safe_value(client.subscriptions, messageHash, {})
|
|
626
638
|
limit = self.safe_integer(subscription, 'limit')
|
|
627
|
-
symbol = self.safe_symbol(marketId)
|
|
628
639
|
type = self.safe_string(event, 'type')
|
|
629
640
|
if type == 'snapshot':
|
|
630
641
|
self.orderbooks[symbol] = self.order_book({}, limit)
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
client.resolve(orderbook, messageHash)
|
|
646
|
-
if messageHash.endswith('USD'):
|
|
647
|
-
client.resolve(orderbook, messageHash + 'C') # sometimes we subscribe to BTC/USDC and coinbase returns BTC/USD
|
|
642
|
+
# unknown bug, can't reproduce, but sometimes orderbook is None
|
|
643
|
+
if not (symbol in self.orderbooks) and self.orderbooks[symbol] is None:
|
|
644
|
+
continue
|
|
645
|
+
orderbook = self.orderbooks[symbol]
|
|
646
|
+
self.handle_order_book_helper(orderbook, updates)
|
|
647
|
+
orderbook['timestamp'] = self.parse8601(datetime)
|
|
648
|
+
orderbook['datetime'] = datetime
|
|
649
|
+
orderbook['symbol'] = symbol
|
|
650
|
+
client.resolve(orderbook, messageHash)
|
|
651
|
+
self.try_resolve_usdc(client, messageHash, orderbook)
|
|
652
|
+
|
|
653
|
+
def try_resolve_usdc(self, client, messageHash, result):
|
|
654
|
+
if messageHash.endswith('/USD') or messageHash.endswith('-USD'):
|
|
655
|
+
client.resolve(result, messageHash + 'C') # when subscribing to BTC/USDC and coinbase returns BTC/USD, so resolve USDC too
|
|
648
656
|
|
|
649
657
|
def handle_subscription_status(self, client, message):
|
|
650
658
|
#
|
|
@@ -660,6 +668,25 @@ class coinbase(ccxt.async_support.coinbase):
|
|
|
660
668
|
#
|
|
661
669
|
return message
|
|
662
670
|
|
|
671
|
+
def handle_heartbeats(self, client, message):
|
|
672
|
+
# although the subscription takes a product_ids parameter(i.e. symbol),
|
|
673
|
+
# there is no(clear) way of mapping the message back to the symbol.
|
|
674
|
+
#
|
|
675
|
+
# {
|
|
676
|
+
# "channel": "heartbeats",
|
|
677
|
+
# "client_id": "",
|
|
678
|
+
# "timestamp": "2023-06-23T20:31:26.122969572Z",
|
|
679
|
+
# "sequence_num": 0,
|
|
680
|
+
# "events": [
|
|
681
|
+
# {
|
|
682
|
+
# "current_time": "2023-06-23 20:31:56.121961769 +0000 UTC m=+91717.525857105",
|
|
683
|
+
# "heartbeat_counter": "3049"
|
|
684
|
+
# }
|
|
685
|
+
# ]
|
|
686
|
+
# }
|
|
687
|
+
#
|
|
688
|
+
return message
|
|
689
|
+
|
|
663
690
|
def handle_message(self, client, message):
|
|
664
691
|
channel = self.safe_string(message, 'channel')
|
|
665
692
|
methods: dict = {
|
|
@@ -669,10 +696,12 @@ class coinbase(ccxt.async_support.coinbase):
|
|
|
669
696
|
'market_trades': self.handle_trade,
|
|
670
697
|
'user': self.handle_order,
|
|
671
698
|
'l2_data': self.handle_order_book,
|
|
699
|
+
'heartbeats': self.handle_heartbeats,
|
|
672
700
|
}
|
|
673
701
|
type = self.safe_string(message, 'type')
|
|
674
702
|
if type == 'error':
|
|
675
703
|
errorMessage = self.safe_string(message, 'message')
|
|
676
704
|
raise ExchangeError(errorMessage)
|
|
677
705
|
method = self.safe_value(methods, channel)
|
|
678
|
-
method
|
|
706
|
+
if method:
|
|
707
|
+
method(client, message)
|
ccxt/pro/coinbaseadvanced.py
CHANGED
|
@@ -4,11 +4,12 @@
|
|
|
4
4
|
# https://github.com/ccxt/ccxt/blob/master/CONTRIBUTING.md#how-to-contribute-code
|
|
5
5
|
|
|
6
6
|
from ccxt.pro.coinbase import coinbase
|
|
7
|
+
from ccxt.base.types import Any
|
|
7
8
|
|
|
8
9
|
|
|
9
10
|
class coinbaseadvanced(coinbase):
|
|
10
11
|
|
|
11
|
-
def describe(self):
|
|
12
|
+
def describe(self) -> Any:
|
|
12
13
|
return self.deep_extend(super(coinbaseadvanced, self).describe(), {
|
|
13
14
|
'id': 'coinbaseadvanced',
|
|
14
15
|
'name': 'Coinbase Advanced',
|