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/async_support/upbit.py
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
|
|
6
6
|
from ccxt.async_support.base.exchange import Exchange
|
|
7
7
|
from ccxt.abstract.upbit import ImplicitAPI
|
|
8
|
-
from ccxt.base.types import Balances, Currency, Int, Market, Num, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, TradingFeeInterface, Transaction
|
|
8
|
+
from ccxt.base.types import Any, Balances, Currency, DepositAddress, Int, Market, Num, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, OrderBooks, Trade, TradingFeeInterface, TradingFees, Transaction
|
|
9
9
|
from typing import List
|
|
10
10
|
from ccxt.base.errors import ExchangeError
|
|
11
11
|
from ccxt.base.errors import AuthenticationError
|
|
@@ -22,13 +22,13 @@ from ccxt.base.precise import Precise
|
|
|
22
22
|
|
|
23
23
|
class upbit(Exchange, ImplicitAPI):
|
|
24
24
|
|
|
25
|
-
def describe(self):
|
|
25
|
+
def describe(self) -> Any:
|
|
26
26
|
return self.deep_extend(super(upbit, self).describe(), {
|
|
27
27
|
'id': 'upbit',
|
|
28
28
|
'name': 'Upbit',
|
|
29
29
|
'countries': ['KR'],
|
|
30
30
|
'version': 'v1',
|
|
31
|
-
'rateLimit':
|
|
31
|
+
'rateLimit': 50,
|
|
32
32
|
'pro': True,
|
|
33
33
|
# new metainfo interface
|
|
34
34
|
'has': {
|
|
@@ -45,12 +45,14 @@ class upbit(Exchange, ImplicitAPI):
|
|
|
45
45
|
'createMarketOrderWithCost': False,
|
|
46
46
|
'createMarketSellOrderWithCost': False,
|
|
47
47
|
'createOrder': True,
|
|
48
|
+
'editOrder': True,
|
|
48
49
|
'fetchBalance': True,
|
|
49
50
|
'fetchCanceledOrders': True,
|
|
50
51
|
'fetchClosedOrders': True,
|
|
51
52
|
'fetchDeposit': True,
|
|
52
53
|
'fetchDepositAddress': True,
|
|
53
54
|
'fetchDepositAddresses': True,
|
|
55
|
+
'fetchDepositAddressesByNetwork': False,
|
|
54
56
|
'fetchDeposits': True,
|
|
55
57
|
'fetchFundingHistory': False,
|
|
56
58
|
'fetchFundingRate': False,
|
|
@@ -74,7 +76,7 @@ class upbit(Exchange, ImplicitAPI):
|
|
|
74
76
|
'fetchTickers': True,
|
|
75
77
|
'fetchTrades': True,
|
|
76
78
|
'fetchTradingFee': True,
|
|
77
|
-
'fetchTradingFees':
|
|
79
|
+
'fetchTradingFees': True,
|
|
78
80
|
'fetchTransactions': False,
|
|
79
81
|
'fetchWithdrawal': True,
|
|
80
82
|
'fetchWithdrawals': True,
|
|
@@ -82,6 +84,7 @@ class upbit(Exchange, ImplicitAPI):
|
|
|
82
84
|
'withdraw': True,
|
|
83
85
|
},
|
|
84
86
|
'timeframes': {
|
|
87
|
+
'1s': 'seconds',
|
|
85
88
|
'1m': 'minutes',
|
|
86
89
|
'3m': 'minutes',
|
|
87
90
|
'5m': 'minutes',
|
|
@@ -93,6 +96,7 @@ class upbit(Exchange, ImplicitAPI):
|
|
|
93
96
|
'1d': 'days',
|
|
94
97
|
'1w': 'weeks',
|
|
95
98
|
'1M': 'months',
|
|
99
|
+
'1y': 'years',
|
|
96
100
|
},
|
|
97
101
|
'hostname': 'api.upbit.com',
|
|
98
102
|
'urls': {
|
|
@@ -106,51 +110,70 @@ class upbit(Exchange, ImplicitAPI):
|
|
|
106
110
|
'fees': 'https://upbit.com/service_center/guide',
|
|
107
111
|
},
|
|
108
112
|
'api': {
|
|
113
|
+
# 'endpoint','API Cost'
|
|
114
|
+
# cost = 1000 / (rateLimit * RPS)
|
|
109
115
|
'public': {
|
|
110
|
-
'get':
|
|
111
|
-
'market/all',
|
|
112
|
-
'candles/{timeframe}',
|
|
113
|
-
'candles/{timeframe}/{unit}',
|
|
114
|
-
'candles/
|
|
115
|
-
'candles/minutes/
|
|
116
|
-
'candles/minutes/
|
|
117
|
-
'candles/minutes/
|
|
118
|
-
'candles/minutes/
|
|
119
|
-
'candles/minutes/
|
|
120
|
-
'candles/minutes/
|
|
121
|
-
'candles/minutes/
|
|
122
|
-
'candles/minutes/
|
|
123
|
-
'candles/
|
|
124
|
-
'candles/
|
|
125
|
-
'candles/
|
|
126
|
-
'
|
|
127
|
-
'
|
|
128
|
-
'
|
|
129
|
-
|
|
116
|
+
'get': {
|
|
117
|
+
'market/all': 2, # RPS: 10
|
|
118
|
+
'candles/{timeframe}': 2,
|
|
119
|
+
'candles/{timeframe}/{unit}': 2,
|
|
120
|
+
'candles/seconds': 2,
|
|
121
|
+
'candles/minutes/{unit}': 2,
|
|
122
|
+
'candles/minutes/1': 2,
|
|
123
|
+
'candles/minutes/3': 2,
|
|
124
|
+
'candles/minutes/5': 2,
|
|
125
|
+
'candles/minutes/10': 2,
|
|
126
|
+
'candles/minutes/15': 2,
|
|
127
|
+
'candles/minutes/30': 2,
|
|
128
|
+
'candles/minutes/60': 2,
|
|
129
|
+
'candles/minutes/240': 2,
|
|
130
|
+
'candles/days': 2,
|
|
131
|
+
'candles/weeks': 2,
|
|
132
|
+
'candles/months': 2,
|
|
133
|
+
'candles/years': 2,
|
|
134
|
+
'trades/ticks': 2,
|
|
135
|
+
'ticker': 2,
|
|
136
|
+
'ticker/all': 2,
|
|
137
|
+
'orderbook': 2,
|
|
138
|
+
'orderbook/supported_levels': 2, # Upbit KR only
|
|
139
|
+
},
|
|
130
140
|
},
|
|
131
141
|
'private': {
|
|
132
|
-
'get':
|
|
133
|
-
'accounts',
|
|
134
|
-
'orders/chance',
|
|
135
|
-
'order',
|
|
136
|
-
'orders',
|
|
137
|
-
'
|
|
138
|
-
'
|
|
139
|
-
'withdraws
|
|
140
|
-
'
|
|
141
|
-
'
|
|
142
|
-
'
|
|
143
|
-
'deposits
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
'
|
|
147
|
-
'
|
|
148
|
-
'
|
|
149
|
-
'
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
142
|
+
'get': {
|
|
143
|
+
'accounts': 0.67, # RPS: 30
|
|
144
|
+
'orders/chance': 0.67,
|
|
145
|
+
'order': 0.67,
|
|
146
|
+
'orders/closed': 0.67,
|
|
147
|
+
'orders/open': 0.67,
|
|
148
|
+
'orders/uuids': 0.67,
|
|
149
|
+
'withdraws': 0.67,
|
|
150
|
+
'withdraw': 0.67,
|
|
151
|
+
'withdraws/chance': 0.67,
|
|
152
|
+
'withdraws/coin_addresses': 0.67,
|
|
153
|
+
'deposits': 0.67,
|
|
154
|
+
'deposits/chance/coin': 0.67,
|
|
155
|
+
'deposit': 0.67,
|
|
156
|
+
'deposits/coin_addresses': 0.67,
|
|
157
|
+
'deposits/coin_address': 0.67,
|
|
158
|
+
'travel_rule/vasps': 0.67,
|
|
159
|
+
'status/wallet': 0.67, # Upbit KR only
|
|
160
|
+
'api_keys': 0.67, # Upbit KR only
|
|
161
|
+
},
|
|
162
|
+
'post': {
|
|
163
|
+
'orders': 2.5, # RPS: 8
|
|
164
|
+
'orders/cancel_and_new': 2.5, # RPS: 8
|
|
165
|
+
'withdraws/coin': 0.67,
|
|
166
|
+
'withdraws/krw': 0.67, # Upbit KR only.
|
|
167
|
+
'deposits/krw': 0.67, # Upbit KR only.
|
|
168
|
+
'deposits/generate_coin_address': 0.67,
|
|
169
|
+
'travel_rule/deposit/uuid': 0.67, # RPS: 30, but each deposit can only be queried once every 10 minutes
|
|
170
|
+
'travel_rule/deposit/txid': 0.67, # RPS: 30, but each deposit can only be queried once every 10 minutes
|
|
171
|
+
},
|
|
172
|
+
'delete': {
|
|
173
|
+
'order': 0.67,
|
|
174
|
+
'orders/open': 40, # RPS: 0.5
|
|
175
|
+
'orders/uuids': 0.67,
|
|
176
|
+
},
|
|
154
177
|
},
|
|
155
178
|
},
|
|
156
179
|
'fees': {
|
|
@@ -167,6 +190,70 @@ class upbit(Exchange, ImplicitAPI):
|
|
|
167
190
|
'deposit': {},
|
|
168
191
|
},
|
|
169
192
|
},
|
|
193
|
+
'features': {
|
|
194
|
+
'spot': {
|
|
195
|
+
'sandbox': False,
|
|
196
|
+
'createOrder': {
|
|
197
|
+
'marginMode': False,
|
|
198
|
+
'triggerPrice': False,
|
|
199
|
+
'triggerPriceType': None,
|
|
200
|
+
'triggerDirection': False,
|
|
201
|
+
'stopLossPrice': False,
|
|
202
|
+
'takeProfitPrice': False,
|
|
203
|
+
'attachedStopLossTakeProfit': None,
|
|
204
|
+
'timeInForce': {
|
|
205
|
+
'IOC': True,
|
|
206
|
+
'FOK': True,
|
|
207
|
+
'PO': False,
|
|
208
|
+
'GTD': False,
|
|
209
|
+
},
|
|
210
|
+
'hedged': False,
|
|
211
|
+
'leverage': False,
|
|
212
|
+
'marketBuyByCost': False,
|
|
213
|
+
'marketBuyRequiresPrice': False,
|
|
214
|
+
'selfTradePrevention': False,
|
|
215
|
+
'trailing': False,
|
|
216
|
+
'iceberg': False,
|
|
217
|
+
},
|
|
218
|
+
'createOrders': None,
|
|
219
|
+
'fetchMyTrades': None,
|
|
220
|
+
'fetchOrder': {
|
|
221
|
+
'marginMode': False,
|
|
222
|
+
'trigger': False,
|
|
223
|
+
'trailing': False,
|
|
224
|
+
'symbolRequired': False,
|
|
225
|
+
},
|
|
226
|
+
'fetchOpenOrders': {
|
|
227
|
+
'marginMode': True,
|
|
228
|
+
'limit': 100,
|
|
229
|
+
'trigger': False,
|
|
230
|
+
'trailing': False,
|
|
231
|
+
'symbolRequired': False,
|
|
232
|
+
},
|
|
233
|
+
'fetchOrders': None, # todo
|
|
234
|
+
'fetchClosedOrders': {
|
|
235
|
+
'marginMode': False,
|
|
236
|
+
'limit': 1000,
|
|
237
|
+
'daysBack': 100000,
|
|
238
|
+
'daysBackCanceled': 1,
|
|
239
|
+
'untilDays': 7,
|
|
240
|
+
'trigger': False,
|
|
241
|
+
'trailing': False,
|
|
242
|
+
'symbolRequired': False,
|
|
243
|
+
},
|
|
244
|
+
'fetchOHLCV': {
|
|
245
|
+
'limit': 200,
|
|
246
|
+
},
|
|
247
|
+
},
|
|
248
|
+
'swap': {
|
|
249
|
+
'linear': None,
|
|
250
|
+
'inverse': None,
|
|
251
|
+
},
|
|
252
|
+
'future': {
|
|
253
|
+
'linear': None,
|
|
254
|
+
'inverse': None,
|
|
255
|
+
},
|
|
256
|
+
},
|
|
170
257
|
'precisionMode': TICK_SIZE,
|
|
171
258
|
'exceptions': {
|
|
172
259
|
'exact': {
|
|
@@ -189,8 +276,6 @@ class upbit(Exchange, ImplicitAPI):
|
|
|
189
276
|
},
|
|
190
277
|
'options': {
|
|
191
278
|
'createMarketBuyOrderRequiresPrice': True,
|
|
192
|
-
'fetchTickersMaxLength': 4096, # 2048,
|
|
193
|
-
'fetchOrderBooksMaxLength': 4096, # 2048,
|
|
194
279
|
'tradingFeesByQuoteCurrency': {
|
|
195
280
|
'KRW': 0.0005,
|
|
196
281
|
},
|
|
@@ -405,7 +490,10 @@ class upbit(Exchange, ImplicitAPI):
|
|
|
405
490
|
|
|
406
491
|
async def fetch_markets(self, params={}) -> List[Market]:
|
|
407
492
|
"""
|
|
408
|
-
|
|
493
|
+
|
|
494
|
+
https://docs.upbit.com/kr/reference/마켓-코드-조회
|
|
495
|
+
https://global-docs.upbit.com/reference/listing-market-list
|
|
496
|
+
|
|
409
497
|
retrieves data on all markets for upbit
|
|
410
498
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
|
411
499
|
:returns dict[]: an array of objects representing market data
|
|
@@ -498,7 +586,10 @@ class upbit(Exchange, ImplicitAPI):
|
|
|
498
586
|
|
|
499
587
|
async def fetch_balance(self, params={}) -> Balances:
|
|
500
588
|
"""
|
|
501
|
-
|
|
589
|
+
|
|
590
|
+
https://docs.upbit.com/kr/reference/전체-계좌-조회
|
|
591
|
+
https://global-docs.upbit.com/reference/overall-account-inquiry
|
|
592
|
+
|
|
502
593
|
query for balance and get the amount of funds available for trading or funds locked in orders
|
|
503
594
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
|
504
595
|
:returns dict: a `balance structure <https://docs.ccxt.com/#/?id=balance-structure>`
|
|
@@ -519,9 +610,12 @@ class upbit(Exchange, ImplicitAPI):
|
|
|
519
610
|
#
|
|
520
611
|
return self.parse_balance(response)
|
|
521
612
|
|
|
522
|
-
async def fetch_order_books(self, symbols: Strings = None, limit: Int = None, params={}):
|
|
613
|
+
async def fetch_order_books(self, symbols: Strings = None, limit: Int = None, params={}) -> OrderBooks:
|
|
523
614
|
"""
|
|
524
|
-
|
|
615
|
+
|
|
616
|
+
https://docs.upbit.com/kr/reference/호가-정보-조회
|
|
617
|
+
https://global-docs.upbit.com/reference/order-book-list
|
|
618
|
+
|
|
525
619
|
fetches information on open orders with bid(buy) and ask(sell) prices, volumes and other data for multiple markets
|
|
526
620
|
:param str[]|None symbols: list of unified market symbols, all symbols fetched if None, default is None
|
|
527
621
|
:param int [limit]: not used by upbit fetchOrderBooks()
|
|
@@ -532,10 +626,6 @@ class upbit(Exchange, ImplicitAPI):
|
|
|
532
626
|
ids = None
|
|
533
627
|
if symbols is None:
|
|
534
628
|
ids = ','.join(self.ids)
|
|
535
|
-
# max URL length is 2083 symbols, including http schema, hostname, tld, etc...
|
|
536
|
-
if len(ids) > self.options['fetchOrderBooksMaxLength']:
|
|
537
|
-
numIds = len(self.ids)
|
|
538
|
-
raise ExchangeError(self.id + ' fetchOrderBooks() has ' + str(numIds) + ' symbols(' + str(len(ids)) + ' characters) exceeding max URL length(' + str(self.options['fetchOrderBooksMaxLength']) + ' characters), you are required to specify a list of symbols in the first argument to fetchOrderBooks')
|
|
539
629
|
else:
|
|
540
630
|
ids = self.market_ids(symbols)
|
|
541
631
|
ids = ','.join(ids)
|
|
@@ -589,7 +679,10 @@ class upbit(Exchange, ImplicitAPI):
|
|
|
589
679
|
|
|
590
680
|
async def fetch_order_book(self, symbol: str, limit: Int = None, params={}) -> OrderBook:
|
|
591
681
|
"""
|
|
592
|
-
|
|
682
|
+
|
|
683
|
+
https://docs.upbit.com/kr/reference/호가-정보-조회
|
|
684
|
+
https://global-docs.upbit.com/reference/order-book-list
|
|
685
|
+
|
|
593
686
|
fetches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
|
|
594
687
|
:param str symbol: unified symbol of the market to fetch the order book for
|
|
595
688
|
:param int [limit]: the maximum amount of order book entries to return
|
|
@@ -657,7 +750,10 @@ class upbit(Exchange, ImplicitAPI):
|
|
|
657
750
|
|
|
658
751
|
async def fetch_tickers(self, symbols: Strings = None, params={}) -> Tickers:
|
|
659
752
|
"""
|
|
660
|
-
|
|
753
|
+
|
|
754
|
+
https://docs.upbit.com/kr/reference/ticker현재가-정보
|
|
755
|
+
https://global-docs.upbit.com/reference/tickers
|
|
756
|
+
|
|
661
757
|
fetches price tickers for multiple markets, statistical information calculated over the past 24 hours for each market
|
|
662
758
|
:param str[]|None symbols: unified symbols of the markets to fetch the ticker for, all market tickers are returned if not assigned
|
|
663
759
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
|
@@ -668,10 +764,6 @@ class upbit(Exchange, ImplicitAPI):
|
|
|
668
764
|
ids = None
|
|
669
765
|
if symbols is None:
|
|
670
766
|
ids = ','.join(self.ids)
|
|
671
|
-
# max URL length is 2083 symbols, including http schema, hostname, tld, etc...
|
|
672
|
-
if len(ids) > self.options['fetchTickersMaxLength']:
|
|
673
|
-
numIds = len(self.ids)
|
|
674
|
-
raise ExchangeError(self.id + ' fetchTickers() has ' + str(numIds) + ' symbols exceeding max URL length, you are required to specify a list of symbols in the first argument to fetchTickers')
|
|
675
767
|
else:
|
|
676
768
|
ids = self.market_ids(symbols)
|
|
677
769
|
ids = ','.join(ids)
|
|
@@ -716,7 +808,10 @@ class upbit(Exchange, ImplicitAPI):
|
|
|
716
808
|
|
|
717
809
|
async def fetch_ticker(self, symbol: str, params={}) -> Ticker:
|
|
718
810
|
"""
|
|
719
|
-
|
|
811
|
+
|
|
812
|
+
https://docs.upbit.com/kr/reference/ticker현재가-정보
|
|
813
|
+
https://global-docs.upbit.com/reference/tickers
|
|
814
|
+
|
|
720
815
|
fetches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
|
|
721
816
|
:param str symbol: unified symbol of the market to fetch the ticker for
|
|
722
817
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
|
@@ -795,7 +890,10 @@ class upbit(Exchange, ImplicitAPI):
|
|
|
795
890
|
|
|
796
891
|
async def fetch_trades(self, symbol: str, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
|
|
797
892
|
"""
|
|
798
|
-
|
|
893
|
+
|
|
894
|
+
https://docs.upbit.com/kr/reference/최근-체결-내역
|
|
895
|
+
https://global-docs.upbit.com/reference/today-trades-history
|
|
896
|
+
|
|
799
897
|
get the list of most recent trades for a particular symbol
|
|
800
898
|
:param str symbol: unified symbol of the market to fetch trades for
|
|
801
899
|
:param int [since]: timestamp in ms of the earliest trade to fetch
|
|
@@ -838,7 +936,10 @@ class upbit(Exchange, ImplicitAPI):
|
|
|
838
936
|
|
|
839
937
|
async def fetch_trading_fee(self, symbol: str, params={}) -> TradingFeeInterface:
|
|
840
938
|
"""
|
|
841
|
-
|
|
939
|
+
|
|
940
|
+
https://docs.upbit.com/kr/reference/주문-가능-정보
|
|
941
|
+
https://global-docs.upbit.com/reference/available-order-information
|
|
942
|
+
|
|
842
943
|
fetch the trading fees for a market
|
|
843
944
|
:param str symbol: unified market symbol
|
|
844
945
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
|
@@ -868,7 +969,7 @@ class upbit(Exchange, ImplicitAPI):
|
|
|
868
969
|
# },
|
|
869
970
|
# "bid_account": {
|
|
870
971
|
# "currency": "KRW",
|
|
871
|
-
# "balance": "0.
|
|
972
|
+
# "balance": "0.34202415",
|
|
872
973
|
# "locked": "4999.99999922",
|
|
873
974
|
# "avg_buy_price": "0",
|
|
874
975
|
# "avg_buy_price_modified": True,
|
|
@@ -899,6 +1000,26 @@ class upbit(Exchange, ImplicitAPI):
|
|
|
899
1000
|
'tierBased': False,
|
|
900
1001
|
}
|
|
901
1002
|
|
|
1003
|
+
async def fetch_trading_fees(self, params={}) -> TradingFees:
|
|
1004
|
+
"""
|
|
1005
|
+
fetch the trading fees for markets
|
|
1006
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
|
1007
|
+
:returns dict: a `trading fee structure <https://docs.ccxt.com/#/?id=trading-fee-structure>`
|
|
1008
|
+
"""
|
|
1009
|
+
await self.load_markets()
|
|
1010
|
+
fetchMarketResponse = await self.fetch_markets(params)
|
|
1011
|
+
response: dict = {}
|
|
1012
|
+
for i in range(0, len(fetchMarketResponse)):
|
|
1013
|
+
element: dict = {}
|
|
1014
|
+
element['maker'] = self.safe_number(fetchMarketResponse[i], 'maker')
|
|
1015
|
+
element['taker'] = self.safe_number(fetchMarketResponse[i], 'taker')
|
|
1016
|
+
element['symbol'] = self.safe_string(fetchMarketResponse[i], 'symbol')
|
|
1017
|
+
element['percentage'] = True
|
|
1018
|
+
element['tierBased'] = False
|
|
1019
|
+
element['info'] = fetchMarketResponse[i]
|
|
1020
|
+
response[self.safe_string(fetchMarketResponse[i], 'symbol')] = element
|
|
1021
|
+
return response
|
|
1022
|
+
|
|
902
1023
|
def parse_ohlcv(self, ohlcv, market: Market = None) -> list:
|
|
903
1024
|
#
|
|
904
1025
|
# {
|
|
@@ -926,7 +1047,10 @@ class upbit(Exchange, ImplicitAPI):
|
|
|
926
1047
|
|
|
927
1048
|
async def fetch_ohlcv(self, symbol: str, timeframe='1m', since: Int = None, limit: Int = None, params={}) -> List[list]:
|
|
928
1049
|
"""
|
|
929
|
-
|
|
1050
|
+
|
|
1051
|
+
https://docs.upbit.com/kr/reference/분minute-캔들-1
|
|
1052
|
+
https://global-docs.upbit.com/reference/minutes
|
|
1053
|
+
|
|
930
1054
|
fetches historical candlestick data containing the open, high, low, and close price, and the volume of a market
|
|
931
1055
|
:param str symbol: unified symbol of the market to fetch OHLCV data for
|
|
932
1056
|
:param str timeframe: the length of time each candle represents
|
|
@@ -988,19 +1112,41 @@ class upbit(Exchange, ImplicitAPI):
|
|
|
988
1112
|
#
|
|
989
1113
|
return self.parse_ohlcvs(response, market, timeframe, since, limit)
|
|
990
1114
|
|
|
1115
|
+
def calc_order_price(self, symbol: str, amount: float, price: Num = None, params={}) -> str:
|
|
1116
|
+
quoteAmount = None
|
|
1117
|
+
createMarketBuyOrderRequiresPrice = self.safe_value(self.options, 'createMarketBuyOrderRequiresPrice')
|
|
1118
|
+
cost = self.safe_string(params, 'cost')
|
|
1119
|
+
if cost is not None:
|
|
1120
|
+
quoteAmount = self.cost_to_precision(symbol, cost)
|
|
1121
|
+
elif createMarketBuyOrderRequiresPrice:
|
|
1122
|
+
if price is None or amount is None:
|
|
1123
|
+
raise InvalidOrder(self.id + ' createOrder() requires the price and amount argument for market buy orders to calculate the total cost to spend(amount * price), alternatively set the createMarketBuyOrderRequiresPrice option or param to False and pass the cost to spend(quote quantity) in the amount argument')
|
|
1124
|
+
amountString = self.number_to_string(amount)
|
|
1125
|
+
priceString = self.number_to_string(price)
|
|
1126
|
+
costRequest = Precise.string_mul(amountString, priceString)
|
|
1127
|
+
quoteAmount = self.cost_to_precision(symbol, costRequest)
|
|
1128
|
+
else:
|
|
1129
|
+
if amount is None:
|
|
1130
|
+
raise ArgumentsRequired(self.id + ' When createMarketBuyOrderRequiresPrice is False, "amount" is required and should be the total quote amount to spend.')
|
|
1131
|
+
quoteAmount = self.cost_to_precision(symbol, amount)
|
|
1132
|
+
return quoteAmount
|
|
1133
|
+
|
|
991
1134
|
async def create_order(self, symbol: str, type: OrderType, side: OrderSide, amount: float, price: Num = None, params={}):
|
|
992
1135
|
"""
|
|
993
1136
|
create a trade order
|
|
994
|
-
|
|
995
|
-
|
|
1137
|
+
|
|
1138
|
+
https://docs.upbit.com/kr/reference/주문하기
|
|
1139
|
+
https://global-docs.upbit.com/reference/order
|
|
1140
|
+
|
|
996
1141
|
:param str symbol: unified symbol of the market to create an order in
|
|
997
|
-
:param str type: 'market'
|
|
1142
|
+
:param str type: supports 'market' and 'limit'. if params.ordType is set to best, a best-type order will be created regardless of the value of type.
|
|
998
1143
|
:param str side: 'buy' or 'sell'
|
|
999
1144
|
:param float amount: how much you want to trade in units of the base currency
|
|
1000
|
-
:param float [price]: the price at which the order is to be
|
|
1145
|
+
:param float [price]: the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
|
|
1001
1146
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
|
1002
|
-
:param float [params.cost]: for market buy orders, the quote quantity that can be used alternative for the amount
|
|
1003
|
-
:param str [params.
|
|
1147
|
+
:param float [params.cost]: for market buy and best buy orders, the quote quantity that can be used alternative for the amount
|
|
1148
|
+
:param str [params.ordType]: self field can be used to place a ‘best’ type order
|
|
1149
|
+
:param str [params.timeInForce]: 'IOC' or 'FOK'. only for limit or best type orders. self field is required when the order type is 'best'.
|
|
1004
1150
|
:returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
|
|
1005
1151
|
"""
|
|
1006
1152
|
await self.load_markets()
|
|
@@ -1011,46 +1157,52 @@ class upbit(Exchange, ImplicitAPI):
|
|
|
1011
1157
|
elif side == 'sell':
|
|
1012
1158
|
orderSide = 'ask'
|
|
1013
1159
|
else:
|
|
1014
|
-
raise InvalidOrder(self.id + ' createOrder()
|
|
1160
|
+
raise InvalidOrder(self.id + ' createOrder() supports only buy or sell in the side argument.')
|
|
1015
1161
|
request: dict = {
|
|
1016
1162
|
'market': market['id'],
|
|
1017
1163
|
'side': orderSide,
|
|
1018
1164
|
}
|
|
1019
1165
|
if type == 'limit':
|
|
1166
|
+
if price is None or amount is None:
|
|
1167
|
+
raise ArgumentsRequired(self.id + ' the limit type order in createOrder() is required price and amount.')
|
|
1168
|
+
request['ord_type'] = 'limit'
|
|
1020
1169
|
request['price'] = self.price_to_precision(symbol, price)
|
|
1021
|
-
|
|
1022
|
-
|
|
1023
|
-
|
|
1024
|
-
|
|
1025
|
-
|
|
1026
|
-
|
|
1027
|
-
params = self.omit(params, 'cost')
|
|
1028
|
-
if cost is not None:
|
|
1029
|
-
quoteAmount = self.cost_to_precision(symbol, cost)
|
|
1030
|
-
elif createMarketBuyOrderRequiresPrice:
|
|
1031
|
-
if price is None:
|
|
1032
|
-
raise InvalidOrder(self.id + ' createOrder() requires the price argument for market buy orders to calculate the total cost to spend(amount * price), alternatively set the createMarketBuyOrderRequiresPrice option or param to False and pass the cost to spend(quote quantity) in the amount argument')
|
|
1033
|
-
else:
|
|
1034
|
-
amountString = self.number_to_string(amount)
|
|
1035
|
-
priceString = self.number_to_string(price)
|
|
1036
|
-
costRequest = Precise.string_mul(amountString, priceString)
|
|
1037
|
-
quoteAmount = self.cost_to_precision(symbol, costRequest)
|
|
1170
|
+
request['volume'] = self.amount_to_precision(symbol, amount)
|
|
1171
|
+
elif type == 'market':
|
|
1172
|
+
if side == 'buy':
|
|
1173
|
+
request['ord_type'] = 'price'
|
|
1174
|
+
orderPrice = self.calc_order_price(symbol, amount, price, params)
|
|
1175
|
+
request['price'] = orderPrice
|
|
1038
1176
|
else:
|
|
1039
|
-
|
|
1040
|
-
|
|
1041
|
-
|
|
1177
|
+
if amount is None:
|
|
1178
|
+
raise ArgumentsRequired(self.id + ' the market sell type order in createOrder() is required amount.')
|
|
1179
|
+
request['ord_type'] = 'market'
|
|
1180
|
+
request['volume'] = self.amount_to_precision(symbol, amount)
|
|
1042
1181
|
else:
|
|
1043
|
-
|
|
1044
|
-
|
|
1045
|
-
|
|
1182
|
+
raise InvalidOrder(self.id + ' createOrder() supports only limit or market types in the type argument.')
|
|
1183
|
+
customType = self.safe_string_2(params, 'ordType', 'ord_type')
|
|
1184
|
+
if customType == 'best':
|
|
1185
|
+
params = self.omit(params, ['ordType', 'ord_type'])
|
|
1186
|
+
request['ord_type'] = 'best'
|
|
1187
|
+
if side == 'buy':
|
|
1188
|
+
orderPrice = self.calc_order_price(symbol, amount, price, params)
|
|
1189
|
+
request['price'] = orderPrice
|
|
1190
|
+
else:
|
|
1191
|
+
if amount is None:
|
|
1192
|
+
raise ArgumentsRequired(self.id + ' the best sell type order in createOrder() is required amount.')
|
|
1193
|
+
request['volume'] = self.amount_to_precision(symbol, amount)
|
|
1194
|
+
clientOrderId = self.safe_string(params, 'clientOrderId')
|
|
1046
1195
|
if clientOrderId is not None:
|
|
1047
1196
|
request['identifier'] = clientOrderId
|
|
1048
|
-
if
|
|
1197
|
+
if request['ord_type'] != 'market' and request['ord_type'] != 'price':
|
|
1049
1198
|
timeInForce = self.safe_string_lower_2(params, 'timeInForce', 'time_in_force')
|
|
1050
|
-
params = self.omit(params, 'timeInForce')
|
|
1199
|
+
params = self.omit(params, ['timeInForce'])
|
|
1051
1200
|
if timeInForce is not None:
|
|
1052
1201
|
request['time_in_force'] = timeInForce
|
|
1053
|
-
|
|
1202
|
+
else:
|
|
1203
|
+
if request['ord_type'] == 'best':
|
|
1204
|
+
raise ArgumentsRequired(self.id + ' the best type order in createOrder() is required timeInForce.')
|
|
1205
|
+
params = self.omit(params, ['clientOrderId', 'cost'])
|
|
1054
1206
|
response = await self.privatePostOrders(self.extend(request, params))
|
|
1055
1207
|
#
|
|
1056
1208
|
# {
|
|
@@ -1076,7 +1228,10 @@ class upbit(Exchange, ImplicitAPI):
|
|
|
1076
1228
|
|
|
1077
1229
|
async def cancel_order(self, id: str, symbol: Str = None, params={}):
|
|
1078
1230
|
"""
|
|
1079
|
-
|
|
1231
|
+
|
|
1232
|
+
https://docs.upbit.com/kr/reference/주문-취소
|
|
1233
|
+
https://global-docs.upbit.com/reference/order-cancel
|
|
1234
|
+
|
|
1080
1235
|
cancels an open order
|
|
1081
1236
|
:param str id: order id
|
|
1082
1237
|
:param str symbol: not used by upbit cancelOrder()
|
|
@@ -1109,9 +1264,113 @@ class upbit(Exchange, ImplicitAPI):
|
|
|
1109
1264
|
#
|
|
1110
1265
|
return self.parse_order(response)
|
|
1111
1266
|
|
|
1267
|
+
async def edit_order(self, id: str, symbol: str, type: OrderType, side: OrderSide, amount: Num = None, price: Num = None, params={}) -> Order:
|
|
1268
|
+
"""
|
|
1269
|
+
|
|
1270
|
+
https://docs.upbit.com/kr/reference/취소-후-재주문
|
|
1271
|
+
https://global-docs.upbit.com/reference/cancel-and-new
|
|
1272
|
+
|
|
1273
|
+
canceled existing order and create new order. It's only generated same side and symbol canceled order. it returns the data of the canceled order, except for `new_order_uuid` and `new_identifier`. to get the details of the new order, use `fetchOrder(new_order_uuid)`.
|
|
1274
|
+
:param str id: the uuid of the previous order you want to edit.
|
|
1275
|
+
:param str symbol: the symbol of the new order. it must be the same symbol of the previous order.
|
|
1276
|
+
:param str type: the type of the new order. only limit or market is accepted. if params.newOrdType is set to best, a best-type order will be created regardless of the value of type.
|
|
1277
|
+
:param str side: the side of the new order. it must be the same side of the previous order.
|
|
1278
|
+
:param number amount: the amount of the asset you want to buy or sell. It could be overridden by specifying the new_volume parameter in params.
|
|
1279
|
+
:param number price: the price of the asset you want to buy or sell. It could be overridden by specifying the new_price parameter in params.
|
|
1280
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint.
|
|
1281
|
+
:param str [params.clientOrderId]: to identify the previous order, either the id or self field is hasattr(self, required) method.
|
|
1282
|
+
:param float [params.cost]: for market buy and best buy orders, the quote quantity that can be used alternative for the amount.
|
|
1283
|
+
:param str [params.newTimeInForce]: 'IOC' or 'FOK'. only for limit or best type orders. self field is required when the order type is 'best'.
|
|
1284
|
+
:param str [params.newClientOrderId]: the order ID that the user can define.
|
|
1285
|
+
:param str [params.newOrdType]: self field only accepts limit, price, market, or best. You can refer to the Upbit developer documentation for details on how to use self field.
|
|
1286
|
+
:returns dict: An `order structure <https://docs.ccxt.com/#/?id=order-structure>`
|
|
1287
|
+
"""
|
|
1288
|
+
await self.load_markets()
|
|
1289
|
+
request: dict = {}
|
|
1290
|
+
prevClientOrderId = self.safe_string(params, 'clientOrderId')
|
|
1291
|
+
params = self.omit(params, 'clientOrderId')
|
|
1292
|
+
if id is not None:
|
|
1293
|
+
request['prev_order_uuid'] = id
|
|
1294
|
+
elif prevClientOrderId is not None:
|
|
1295
|
+
request['prev_order_identifier'] = prevClientOrderId
|
|
1296
|
+
else:
|
|
1297
|
+
raise ArgumentsRequired(self.id + ' editOrder() is required id or clientOrderId.')
|
|
1298
|
+
if type == 'limit':
|
|
1299
|
+
if price is None or amount is None:
|
|
1300
|
+
raise ArgumentsRequired(self.id + ' editOrder() is required price and amount to create limit type order.')
|
|
1301
|
+
request['new_ord_type'] = 'limit'
|
|
1302
|
+
request['new_price'] = self.price_to_precision(symbol, price)
|
|
1303
|
+
request['new_volume'] = self.amount_to_precision(symbol, amount)
|
|
1304
|
+
elif type == 'market':
|
|
1305
|
+
if side == 'buy':
|
|
1306
|
+
request['new_ord_type'] = 'price'
|
|
1307
|
+
orderPrice = self.calc_order_price(symbol, amount, price, params)
|
|
1308
|
+
request['new_price'] = orderPrice
|
|
1309
|
+
else:
|
|
1310
|
+
if amount is None:
|
|
1311
|
+
raise ArgumentsRequired(self.id + ' editOrder() is required amount to create market sell type order.')
|
|
1312
|
+
request['new_ord_type'] = 'market'
|
|
1313
|
+
request['new_volume'] = self.amount_to_precision(symbol, amount)
|
|
1314
|
+
else:
|
|
1315
|
+
raise InvalidOrder(self.id + ' editOrder() supports only limit or market types in the type argument.')
|
|
1316
|
+
customType = self.safe_string_2(params, 'newOrdType', 'new_ord_type')
|
|
1317
|
+
if customType == 'best':
|
|
1318
|
+
params = self.omit(params, ['newOrdType', 'new_ord_type'])
|
|
1319
|
+
request['new_ord_type'] = 'best'
|
|
1320
|
+
if side == 'buy':
|
|
1321
|
+
orderPrice = self.calc_order_price(symbol, amount, price, params)
|
|
1322
|
+
request['new_price'] = orderPrice
|
|
1323
|
+
else:
|
|
1324
|
+
if amount is None:
|
|
1325
|
+
raise ArgumentsRequired(self.id + ' editOrder() is required amount to create best sell order.')
|
|
1326
|
+
request['new_volume'] = self.amount_to_precision(symbol, amount)
|
|
1327
|
+
clientOrderId = self.safe_string(params, 'newClientOrderId')
|
|
1328
|
+
if clientOrderId is not None:
|
|
1329
|
+
request['new_identifier'] = clientOrderId
|
|
1330
|
+
if request['new_ord_type'] != 'market' and request['new_ord_type'] != 'price':
|
|
1331
|
+
timeInForce = self.safe_string_lower_2(params, 'newTimeInForce', 'new_time_in_force')
|
|
1332
|
+
params = self.omit(params, ['newTimeInForce', 'new_time_in_force'])
|
|
1333
|
+
if timeInForce is not None:
|
|
1334
|
+
request['new_time_in_force'] = timeInForce
|
|
1335
|
+
else:
|
|
1336
|
+
if request['new_ord_type'] == 'best':
|
|
1337
|
+
raise ArgumentsRequired(self.id + ' the best type order is required timeInForce.')
|
|
1338
|
+
params = self.omit(params, ['newClientOrderId', 'cost'])
|
|
1339
|
+
# print('check the each request params: ', request)
|
|
1340
|
+
response = await self.privatePostOrdersCancelAndNew(self.extend(request, params))
|
|
1341
|
+
# {
|
|
1342
|
+
# uuid: '63b38774-27db-4439-ac20-1be16a24d18e', #previous order data
|
|
1343
|
+
# side: 'bid', #previous order data
|
|
1344
|
+
# ord_type: 'limit', #previous order data
|
|
1345
|
+
# price: '100000000', #previous order data
|
|
1346
|
+
# state: 'wait', #previous order data
|
|
1347
|
+
# market: 'KRW-BTC', #previous order data
|
|
1348
|
+
# created_at: '2025-04-01T15:30:47+09:00', #previous order data
|
|
1349
|
+
# volume: '0.00008', #previous order data
|
|
1350
|
+
# remaining_volume: '0.00008', #previous order data
|
|
1351
|
+
# reserved_fee: '4', #previous order data
|
|
1352
|
+
# remaining_fee: '4', #previous order data
|
|
1353
|
+
# paid_fee: '0', #previous order data
|
|
1354
|
+
# locked: '8004', #previous order data
|
|
1355
|
+
# executed_volume: '0', #previous order data
|
|
1356
|
+
# trades_count: '0', #previous order data
|
|
1357
|
+
# identifier: '21', #previous order data
|
|
1358
|
+
# new_order_uuid: 'cb1cce56-6237-4a78-bc11-4cfffc1bb4c2', # new order data
|
|
1359
|
+
# new_order_identifier: '22' # new order data
|
|
1360
|
+
# }
|
|
1361
|
+
result: dict = {}
|
|
1362
|
+
result['uuid'] = self.safe_string(response, 'new_order_uuid')
|
|
1363
|
+
result['identifier'] = self.safe_string(response, 'new_order_identifier')
|
|
1364
|
+
result['side'] = self.safe_string(response, 'side')
|
|
1365
|
+
result['market'] = self.safe_string(response, 'market')
|
|
1366
|
+
return self.parse_order(result)
|
|
1367
|
+
|
|
1112
1368
|
async def fetch_deposits(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Transaction]:
|
|
1113
1369
|
"""
|
|
1114
|
-
|
|
1370
|
+
|
|
1371
|
+
https://docs.upbit.com/kr/reference/입금-리스트-조회
|
|
1372
|
+
https://global-docs.upbit.com/reference/deposit-list-inquiry
|
|
1373
|
+
|
|
1115
1374
|
fetch all deposits made to an account
|
|
1116
1375
|
:param str code: unified currency code
|
|
1117
1376
|
:param int [since]: the earliest time in ms to fetch deposits for
|
|
@@ -1152,7 +1411,10 @@ class upbit(Exchange, ImplicitAPI):
|
|
|
1152
1411
|
async def fetch_deposit(self, id: str, code: Str = None, params={}):
|
|
1153
1412
|
"""
|
|
1154
1413
|
fetch information on a deposit
|
|
1155
|
-
|
|
1414
|
+
|
|
1415
|
+
https://docs.upbit.com/kr/reference/개별-입금-조회
|
|
1416
|
+
https://global-docs.upbit.com/reference/individual-deposit-inquiry
|
|
1417
|
+
|
|
1156
1418
|
:param str id: the unique id for the deposit
|
|
1157
1419
|
:param str [code]: unified currency code of the currency deposited
|
|
1158
1420
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
|
@@ -1187,7 +1449,10 @@ class upbit(Exchange, ImplicitAPI):
|
|
|
1187
1449
|
|
|
1188
1450
|
async def fetch_withdrawals(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Transaction]:
|
|
1189
1451
|
"""
|
|
1190
|
-
|
|
1452
|
+
|
|
1453
|
+
https://docs.upbit.com/kr/reference/전체-출금-조회
|
|
1454
|
+
https://global-docs.upbit.com/reference/withdrawal-list-inquiry
|
|
1455
|
+
|
|
1191
1456
|
fetch all withdrawals made from an account
|
|
1192
1457
|
:param str code: unified currency code
|
|
1193
1458
|
:param int [since]: the earliest time in ms to fetch withdrawals for
|
|
@@ -1228,7 +1493,10 @@ class upbit(Exchange, ImplicitAPI):
|
|
|
1228
1493
|
async def fetch_withdrawal(self, id: str, code: Str = None, params={}):
|
|
1229
1494
|
"""
|
|
1230
1495
|
fetch data on a currency withdrawal via the withdrawal id
|
|
1231
|
-
|
|
1496
|
+
|
|
1497
|
+
https://docs.upbit.com/kr/reference/개별-출금-조회
|
|
1498
|
+
https://global-docs.upbit.com/reference/individual-withdrawal-inquiry
|
|
1499
|
+
|
|
1232
1500
|
:param str id: the unique id for the withdrawal
|
|
1233
1501
|
:param str [code]: unified currency code of the currency withdrawn
|
|
1234
1502
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
|
@@ -1392,12 +1660,55 @@ class upbit(Exchange, ImplicitAPI):
|
|
|
1392
1660
|
# ],
|
|
1393
1661
|
# }
|
|
1394
1662
|
#
|
|
1663
|
+
# fetchOpenOrders, fetchClosedOrders, fetchCanceledOrders
|
|
1664
|
+
#
|
|
1665
|
+
# {
|
|
1666
|
+
# "uuid": "637fd66-d019-4d77-bee6-8e0cff28edd9",
|
|
1667
|
+
# "side": "ask",
|
|
1668
|
+
# "ord_type": "limit",
|
|
1669
|
+
# "price": "1.5",
|
|
1670
|
+
# "state": "wait",
|
|
1671
|
+
# "market": "SGD-XRP",
|
|
1672
|
+
# "created_at": "2024-06-05T09:37:10Z",
|
|
1673
|
+
# "volume": "10",
|
|
1674
|
+
# "remaining_volume": "10",
|
|
1675
|
+
# "reserved_fee": "0",
|
|
1676
|
+
# "remaining_fee": "0",
|
|
1677
|
+
# "paid_fee": "0",
|
|
1678
|
+
# "locked": "10",
|
|
1679
|
+
# "executed_volume": "0",
|
|
1680
|
+
# "executed_funds": "0",
|
|
1681
|
+
# "trades_count": 0,
|
|
1682
|
+
# "time_in_force": "ioc"
|
|
1683
|
+
# }
|
|
1684
|
+
#
|
|
1685
|
+
# {
|
|
1686
|
+
# uuid: '63b38774-27db-4439-ac20-1be16a24d18e',
|
|
1687
|
+
# side: 'bid',
|
|
1688
|
+
# ord_type: 'limit',
|
|
1689
|
+
# price: '100000000',
|
|
1690
|
+
# state: 'wait',
|
|
1691
|
+
# market: 'KRW-BTC',
|
|
1692
|
+
# created_at: '2025-04-01T15:30:47+09:00',
|
|
1693
|
+
# volume: '0.00008',
|
|
1694
|
+
# remaining_volume: '0.00008',
|
|
1695
|
+
# reserved_fee: '4',
|
|
1696
|
+
# remaining_fee: '4',
|
|
1697
|
+
# paid_fee: '0',
|
|
1698
|
+
# locked: '8004',
|
|
1699
|
+
# executed_volume: '0',
|
|
1700
|
+
# trades_count: '0',
|
|
1701
|
+
# identifier: '21',
|
|
1702
|
+
# new_order_uuid: 'cb1cce56-6237-4a78-bc11-4cfffc1bb4c2',
|
|
1703
|
+
# new_order_identifier: '22'
|
|
1704
|
+
# }
|
|
1395
1705
|
id = self.safe_string(order, 'uuid')
|
|
1396
1706
|
side = self.safe_string(order, 'side')
|
|
1397
1707
|
if side == 'bid':
|
|
1398
1708
|
side = 'buy'
|
|
1399
1709
|
else:
|
|
1400
1710
|
side = 'sell'
|
|
1711
|
+
identifier = self.safe_string(order, 'identifier')
|
|
1401
1712
|
type = self.safe_string(order, 'ord_type')
|
|
1402
1713
|
timestamp = self.parse8601(self.safe_string(order, 'created_at'))
|
|
1403
1714
|
status = self.parse_order_status(self.safe_string(order, 'state'))
|
|
@@ -1447,17 +1758,16 @@ class upbit(Exchange, ImplicitAPI):
|
|
|
1447
1758
|
return self.safe_order({
|
|
1448
1759
|
'info': order,
|
|
1449
1760
|
'id': id,
|
|
1450
|
-
'clientOrderId':
|
|
1761
|
+
'clientOrderId': identifier,
|
|
1451
1762
|
'timestamp': timestamp,
|
|
1452
1763
|
'datetime': self.iso8601(timestamp),
|
|
1453
1764
|
'lastTradeTimestamp': lastTradeTimestamp,
|
|
1454
1765
|
'symbol': market['symbol'],
|
|
1455
1766
|
'type': type,
|
|
1456
|
-
'timeInForce':
|
|
1767
|
+
'timeInForce': self.safe_string_upper(order, 'time_in_force'),
|
|
1457
1768
|
'postOnly': None,
|
|
1458
1769
|
'side': side,
|
|
1459
1770
|
'price': price,
|
|
1460
|
-
'stopPrice': None,
|
|
1461
1771
|
'triggerPrice': None,
|
|
1462
1772
|
'cost': self.parse_number(cost),
|
|
1463
1773
|
'average': self.parse_number(average),
|
|
@@ -1469,82 +1779,167 @@ class upbit(Exchange, ImplicitAPI):
|
|
|
1469
1779
|
'trades': trades,
|
|
1470
1780
|
})
|
|
1471
1781
|
|
|
1472
|
-
async def
|
|
1782
|
+
async def fetch_open_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
|
|
1783
|
+
"""
|
|
1784
|
+
fetch all unfilled currently open orders
|
|
1785
|
+
|
|
1786
|
+
https://docs.upbit.com/kr/reference/대기-주문-조회
|
|
1787
|
+
https://global-docs.upbit.com/reference/open-order
|
|
1788
|
+
|
|
1789
|
+
:param str symbol: unified market symbol
|
|
1790
|
+
:param int [since]: the earliest time in ms to fetch open orders for
|
|
1791
|
+
:param int [limit]: the maximum number of open order structures to retrieve
|
|
1792
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
|
1793
|
+
:param str [params.state]: default is 'wait', set to 'watch' for stop limit orders
|
|
1794
|
+
:returns Order[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
|
|
1795
|
+
"""
|
|
1473
1796
|
await self.load_markets()
|
|
1474
|
-
request: dict = {
|
|
1475
|
-
# 'market': self.market_id(symbol),
|
|
1476
|
-
'state': state,
|
|
1477
|
-
# 'page': 1,
|
|
1478
|
-
# 'order_by': 'asc',
|
|
1479
|
-
}
|
|
1797
|
+
request: dict = {}
|
|
1480
1798
|
market = None
|
|
1481
1799
|
if symbol is not None:
|
|
1482
1800
|
market = self.market(symbol)
|
|
1483
1801
|
request['market'] = market['id']
|
|
1484
|
-
|
|
1802
|
+
if limit is not None:
|
|
1803
|
+
request['limit'] = limit
|
|
1804
|
+
response = await self.privateGetOrdersOpen(self.extend(request, params))
|
|
1485
1805
|
#
|
|
1486
1806
|
# [
|
|
1487
1807
|
# {
|
|
1488
|
-
# "uuid": "
|
|
1489
|
-
# "side": "
|
|
1808
|
+
# "uuid": "637fd66-d019-4d77-bee6-8e0cff28edd9",
|
|
1809
|
+
# "side": "ask",
|
|
1490
1810
|
# "ord_type": "limit",
|
|
1491
|
-
# "price": "
|
|
1492
|
-
# "state": "
|
|
1493
|
-
# "market": "
|
|
1494
|
-
# "created_at": "
|
|
1495
|
-
# "volume": "
|
|
1496
|
-
# "remaining_volume": "
|
|
1497
|
-
# "reserved_fee": "
|
|
1498
|
-
# "remaining_fee": "
|
|
1499
|
-
# "paid_fee": "
|
|
1500
|
-
# "locked": "
|
|
1501
|
-
# "executed_volume": "
|
|
1502
|
-
# "
|
|
1503
|
-
#
|
|
1811
|
+
# "price": "1.5",
|
|
1812
|
+
# "state": "wait",
|
|
1813
|
+
# "market": "SGD-XRP",
|
|
1814
|
+
# "created_at": "2024-06-05T09:37:10Z",
|
|
1815
|
+
# "volume": "10",
|
|
1816
|
+
# "remaining_volume": "10",
|
|
1817
|
+
# "reserved_fee": "0",
|
|
1818
|
+
# "remaining_fee": "0",
|
|
1819
|
+
# "paid_fee": "0",
|
|
1820
|
+
# "locked": "10",
|
|
1821
|
+
# "executed_volume": "0",
|
|
1822
|
+
# "executed_funds": "0",
|
|
1823
|
+
# "trades_count": 0
|
|
1824
|
+
# }
|
|
1504
1825
|
# ]
|
|
1505
1826
|
#
|
|
1506
1827
|
return self.parse_orders(response, market, since, limit)
|
|
1507
1828
|
|
|
1508
|
-
async def fetch_open_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
|
|
1509
|
-
"""
|
|
1510
|
-
:see: https://docs.upbit.com/reference/%EC%A3%BC%EB%AC%B8-%EB%A6%AC%EC%8A%A4%ED%8A%B8-%EC%A1%B0%ED%9A%8C
|
|
1511
|
-
fetch all unfilled currently open orders
|
|
1512
|
-
:param str symbol: unified market symbol
|
|
1513
|
-
:param int [since]: the earliest time in ms to fetch open orders for
|
|
1514
|
-
:param int [limit]: the maximum number of open orders structures to retrieve
|
|
1515
|
-
:param dict [params]: extra parameters specific to the exchange API endpoint
|
|
1516
|
-
:returns Order[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
|
|
1517
|
-
"""
|
|
1518
|
-
return await self.fetch_orders_by_state('wait', symbol, since, limit, params)
|
|
1519
|
-
|
|
1520
1829
|
async def fetch_closed_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
|
|
1521
1830
|
"""
|
|
1522
|
-
:see: https://docs.upbit.com/reference/%EC%A3%BC%EB%AC%B8-%EB%A6%AC%EC%8A%A4%ED%8A%B8-%EC%A1%B0%ED%9A%8C
|
|
1523
1831
|
fetches information on multiple closed orders made by the user
|
|
1832
|
+
|
|
1833
|
+
https://docs.upbit.com/kr/reference/종료-주문-조회
|
|
1834
|
+
https://global-docs.upbit.com/reference/closed-order
|
|
1835
|
+
|
|
1524
1836
|
:param str symbol: unified market symbol of the market orders were made in
|
|
1525
1837
|
:param int [since]: the earliest time in ms to fetch orders for
|
|
1526
1838
|
:param int [limit]: the maximum number of order structures to retrieve
|
|
1527
1839
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
|
1840
|
+
:param int [params.until]: timestamp in ms of the latest order
|
|
1528
1841
|
:returns Order[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
|
|
1529
1842
|
"""
|
|
1530
|
-
|
|
1843
|
+
await self.load_markets()
|
|
1844
|
+
request: dict = {
|
|
1845
|
+
'state': 'done',
|
|
1846
|
+
}
|
|
1847
|
+
market = None
|
|
1848
|
+
if symbol is not None:
|
|
1849
|
+
market = self.market(symbol)
|
|
1850
|
+
request['market'] = market['id']
|
|
1851
|
+
if since is not None:
|
|
1852
|
+
request['start_time'] = since
|
|
1853
|
+
if limit is not None:
|
|
1854
|
+
request['limit'] = limit
|
|
1855
|
+
request, params = self.handle_until_option('end_time', request, params)
|
|
1856
|
+
response = await self.privateGetOrdersClosed(self.extend(request, params))
|
|
1857
|
+
#
|
|
1858
|
+
# [
|
|
1859
|
+
# {
|
|
1860
|
+
# "uuid": "637fd66-d019-4d77-bee6-8e0cff28edd9",
|
|
1861
|
+
# "side": "ask",
|
|
1862
|
+
# "ord_type": "limit",
|
|
1863
|
+
# "price": "1.5",
|
|
1864
|
+
# "state": "done",
|
|
1865
|
+
# "market": "SGD-XRP",
|
|
1866
|
+
# "created_at": "2024-06-05T09:37:10Z",
|
|
1867
|
+
# "volume": "10",
|
|
1868
|
+
# "remaining_volume": "10",
|
|
1869
|
+
# "reserved_fee": "0",
|
|
1870
|
+
# "remaining_fee": "0",
|
|
1871
|
+
# "paid_fee": "0",
|
|
1872
|
+
# "locked": "10",
|
|
1873
|
+
# "executed_volume": "0",
|
|
1874
|
+
# "executed_funds": "0",
|
|
1875
|
+
# "trades_count": 0,
|
|
1876
|
+
# "time_in_force": "ioc"
|
|
1877
|
+
# }
|
|
1878
|
+
# ]
|
|
1879
|
+
#
|
|
1880
|
+
return self.parse_orders(response, market, since, limit)
|
|
1531
1881
|
|
|
1532
1882
|
async def fetch_canceled_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}):
|
|
1533
1883
|
"""
|
|
1534
|
-
:see: https://docs.upbit.com/reference/%EC%A3%BC%EB%AC%B8-%EB%A6%AC%EC%8A%A4%ED%8A%B8-%EC%A1%B0%ED%9A%8C
|
|
1535
1884
|
fetches information on multiple canceled orders made by the user
|
|
1885
|
+
|
|
1886
|
+
https://docs.upbit.com/kr/reference/종료-주문-조회
|
|
1887
|
+
https://global-docs.upbit.com/reference/closed-order
|
|
1888
|
+
|
|
1536
1889
|
:param str symbol: unified market symbol of the market orders were made in
|
|
1537
1890
|
:param int [since]: timestamp in ms of the earliest order, default is None
|
|
1538
1891
|
:param int [limit]: max number of orders to return, default is None
|
|
1539
1892
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
|
1893
|
+
:param int [params.until]: timestamp in ms of the latest order
|
|
1540
1894
|
:returns dict: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
|
|
1541
1895
|
"""
|
|
1542
|
-
|
|
1896
|
+
await self.load_markets()
|
|
1897
|
+
request: dict = {
|
|
1898
|
+
'state': 'cancel',
|
|
1899
|
+
}
|
|
1900
|
+
market = None
|
|
1901
|
+
if symbol is not None:
|
|
1902
|
+
market = self.market(symbol)
|
|
1903
|
+
request['market'] = market['id']
|
|
1904
|
+
if since is not None:
|
|
1905
|
+
request['start_time'] = since
|
|
1906
|
+
if limit is not None:
|
|
1907
|
+
request['limit'] = limit
|
|
1908
|
+
request, params = self.handle_until_option('end_time', request, params)
|
|
1909
|
+
response = await self.privateGetOrdersClosed(self.extend(request, params))
|
|
1910
|
+
#
|
|
1911
|
+
# [
|
|
1912
|
+
# {
|
|
1913
|
+
# "uuid": "637fd66-d019-4d77-bee6-8e0cff28edd9",
|
|
1914
|
+
# "side": "ask",
|
|
1915
|
+
# "ord_type": "limit",
|
|
1916
|
+
# "price": "1.5",
|
|
1917
|
+
# "state": "cancel",
|
|
1918
|
+
# "market": "SGD-XRP",
|
|
1919
|
+
# "created_at": "2024-06-05T09:37:10Z",
|
|
1920
|
+
# "volume": "10",
|
|
1921
|
+
# "remaining_volume": "10",
|
|
1922
|
+
# "reserved_fee": "0",
|
|
1923
|
+
# "remaining_fee": "0",
|
|
1924
|
+
# "paid_fee": "0",
|
|
1925
|
+
# "locked": "10",
|
|
1926
|
+
# "executed_volume": "0",
|
|
1927
|
+
# "executed_funds": "0",
|
|
1928
|
+
# "trades_count": 0,
|
|
1929
|
+
# "time_in_force": "ioc"
|
|
1930
|
+
# }
|
|
1931
|
+
# ]
|
|
1932
|
+
#
|
|
1933
|
+
return self.parse_orders(response, market, since, limit)
|
|
1543
1934
|
|
|
1544
1935
|
async def fetch_order(self, id: str, symbol: Str = None, params={}):
|
|
1545
1936
|
"""
|
|
1546
|
-
|
|
1937
|
+
|
|
1938
|
+
https://docs.upbit.com/kr/reference/개별-주문-조회
|
|
1939
|
+
https://global-docs.upbit.com/reference/individual-order-inquiry
|
|
1940
|
+
|
|
1547
1941
|
fetches information on an order made by the user
|
|
1942
|
+
:param str id: order id
|
|
1548
1943
|
:param str symbol: not used by upbit fetchOrder
|
|
1549
1944
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
|
1550
1945
|
:returns dict: An `order structure <https://docs.ccxt.com/#/?id=order-structure>`
|
|
@@ -1599,9 +1994,12 @@ class upbit(Exchange, ImplicitAPI):
|
|
|
1599
1994
|
#
|
|
1600
1995
|
return self.parse_order(response)
|
|
1601
1996
|
|
|
1602
|
-
async def fetch_deposit_addresses(self, codes: Strings = None, params={}):
|
|
1997
|
+
async def fetch_deposit_addresses(self, codes: Strings = None, params={}) -> List[DepositAddress]:
|
|
1603
1998
|
"""
|
|
1604
|
-
|
|
1999
|
+
|
|
2000
|
+
https://docs.upbit.com/kr/reference/전체-입금-주소-조회
|
|
2001
|
+
https://global-docs.upbit.com/reference/general-deposit-address-inquiry
|
|
2002
|
+
|
|
1605
2003
|
fetch deposit addresses for multiple currencies and chain types
|
|
1606
2004
|
:param str[]|None codes: list of unified currency codes, default is None
|
|
1607
2005
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
|
@@ -1630,7 +2028,7 @@ class upbit(Exchange, ImplicitAPI):
|
|
|
1630
2028
|
#
|
|
1631
2029
|
return self.parse_deposit_addresses(response, codes)
|
|
1632
2030
|
|
|
1633
|
-
def parse_deposit_address(self, depositAddress, currency: Currency = None):
|
|
2031
|
+
def parse_deposit_address(self, depositAddress, currency: Currency = None) -> DepositAddress:
|
|
1634
2032
|
#
|
|
1635
2033
|
# {
|
|
1636
2034
|
# currency: 'XRP',
|
|
@@ -1646,16 +2044,19 @@ class upbit(Exchange, ImplicitAPI):
|
|
|
1646
2044
|
networkId = self.safe_string(depositAddress, 'net_type')
|
|
1647
2045
|
self.check_address(address)
|
|
1648
2046
|
return {
|
|
2047
|
+
'info': depositAddress,
|
|
1649
2048
|
'currency': code,
|
|
2049
|
+
'network': self.network_id_to_code(networkId),
|
|
1650
2050
|
'address': address,
|
|
1651
2051
|
'tag': tag,
|
|
1652
|
-
'network': self.network_id_to_code(networkId),
|
|
1653
|
-
'info': depositAddress,
|
|
1654
2052
|
}
|
|
1655
2053
|
|
|
1656
|
-
async def fetch_deposit_address(self, code: str, params={}):
|
|
2054
|
+
async def fetch_deposit_address(self, code: str, params={}) -> DepositAddress:
|
|
1657
2055
|
"""
|
|
1658
|
-
|
|
2056
|
+
|
|
2057
|
+
https://docs.upbit.com/kr/reference/개별-입금-주소-조회
|
|
2058
|
+
https://global-docs.upbit.com/reference/individual-deposit-address-inquiry
|
|
2059
|
+
|
|
1659
2060
|
fetch the deposit address for a currency associated with self account
|
|
1660
2061
|
:param str code: unified currency code
|
|
1661
2062
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
|
@@ -1682,9 +2083,12 @@ class upbit(Exchange, ImplicitAPI):
|
|
|
1682
2083
|
#
|
|
1683
2084
|
return self.parse_deposit_address(response)
|
|
1684
2085
|
|
|
1685
|
-
async def create_deposit_address(self, code: str, params={}):
|
|
2086
|
+
async def create_deposit_address(self, code: str, params={}) -> DepositAddress:
|
|
1686
2087
|
"""
|
|
1687
|
-
|
|
2088
|
+
|
|
2089
|
+
https://docs.upbit.com/kr/reference/입금-주소-생성-요청
|
|
2090
|
+
https://global-docs.upbit.com/reference/deposit-address-generation
|
|
2091
|
+
|
|
1688
2092
|
create a currency deposit address
|
|
1689
2093
|
:param str code: unified currency code of the currency for the deposit address
|
|
1690
2094
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
|
@@ -1717,10 +2121,12 @@ class upbit(Exchange, ImplicitAPI):
|
|
|
1717
2121
|
raise AddressPending(self.id + ' is generating ' + code + ' deposit address, call fetchDepositAddress or createDepositAddress one more time later to retrieve the generated address')
|
|
1718
2122
|
return self.parse_deposit_address(response)
|
|
1719
2123
|
|
|
1720
|
-
async def withdraw(self, code: str, amount: float, address: str, tag=None, params={}):
|
|
2124
|
+
async def withdraw(self, code: str, amount: float, address: str, tag: Str = None, params={}) -> Transaction:
|
|
1721
2125
|
"""
|
|
1722
|
-
|
|
1723
|
-
|
|
2126
|
+
|
|
2127
|
+
https://docs.upbit.com/kr/reference/디지털자산-출금하기
|
|
2128
|
+
https://global-docs.upbit.com/reference/withdrawal-digital-assets
|
|
2129
|
+
|
|
1724
2130
|
make a withdrawal
|
|
1725
2131
|
:param str code: unified currency code
|
|
1726
2132
|
:param float amount: the amount to withdraw
|
|
@@ -1793,11 +2199,8 @@ class upbit(Exchange, ImplicitAPI):
|
|
|
1793
2199
|
if (method != 'GET') and (method != 'DELETE'):
|
|
1794
2200
|
body = self.json(params)
|
|
1795
2201
|
headers['Content-Type'] = 'application/json'
|
|
1796
|
-
|
|
1797
|
-
|
|
1798
|
-
else:
|
|
1799
|
-
if hasQuery:
|
|
1800
|
-
auth = self.urlencode(self.keysort(query))
|
|
2202
|
+
if hasQuery:
|
|
2203
|
+
auth = self.rawencode(query)
|
|
1801
2204
|
if auth is not None:
|
|
1802
2205
|
hash = self.hash(self.encode(auth), 'sha512')
|
|
1803
2206
|
request['query_hash'] = hash
|