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.
Files changed (528) hide show
  1. ccxt/__init__.py +39 -35
  2. ccxt/abantether.py +9 -9
  3. ccxt/abstract/alpaca.py +4 -0
  4. ccxt/abstract/apex.py +31 -0
  5. ccxt/abstract/bigone.py +1 -1
  6. ccxt/abstract/binance.py +106 -48
  7. ccxt/abstract/binancecoinm.py +106 -48
  8. ccxt/abstract/binanceus.py +141 -83
  9. ccxt/abstract/binanceusdm.py +106 -48
  10. ccxt/abstract/bingx.py +50 -1
  11. ccxt/abstract/bitbank.py +5 -0
  12. ccxt/abstract/bitfinex.py +136 -65
  13. ccxt/abstract/bitflyer.py +1 -0
  14. ccxt/abstract/bitget.py +67 -0
  15. ccxt/abstract/bitmart.py +19 -1
  16. ccxt/abstract/bitopro.py +1 -0
  17. ccxt/abstract/bitrue.py +68 -68
  18. ccxt/abstract/bitstamp.py +1 -0
  19. ccxt/abstract/blofin.py +30 -0
  20. ccxt/abstract/btcbox.py +2 -0
  21. ccxt/abstract/bybit.py +28 -13
  22. ccxt/abstract/cex.py +28 -29
  23. ccxt/abstract/coinbaseexchange.py +1 -0
  24. ccxt/abstract/coinbaseinternational.py +1 -1
  25. ccxt/abstract/cryptocom.py +16 -0
  26. ccxt/abstract/cryptomus.py +20 -0
  27. ccxt/abstract/defx.py +69 -0
  28. ccxt/abstract/deribit.py +1 -0
  29. ccxt/abstract/derive.py +117 -0
  30. ccxt/abstract/digifinex.py +1 -0
  31. ccxt/abstract/ellipx.py +25 -0
  32. ccxt/abstract/foxbit.py +26 -0
  33. ccxt/abstract/gate.py +19 -0
  34. ccxt/abstract/gateio.py +19 -0
  35. ccxt/abstract/gemini.py +1 -0
  36. ccxt/abstract/hibachi.py +26 -0
  37. ccxt/abstract/hyperliquid.py +1 -1
  38. ccxt/abstract/independentreserve.py +6 -0
  39. ccxt/abstract/kraken.py +1 -0
  40. ccxt/abstract/krakenfutures.py +4 -0
  41. ccxt/abstract/kucoin.py +10 -0
  42. ccxt/abstract/kucoinfutures.py +18 -0
  43. ccxt/abstract/lbank.py +2 -1
  44. ccxt/abstract/luno.py +1 -0
  45. ccxt/abstract/mexc.py +2 -0
  46. ccxt/abstract/modetrade.py +119 -0
  47. ccxt/abstract/myokx.py +349 -0
  48. ccxt/abstract/oceanex.py +5 -0
  49. ccxt/abstract/okx.py +25 -0
  50. ccxt/abstract/okxus.py +349 -0
  51. ccxt/abstract/onetrading.py +0 -12
  52. ccxt/abstract/paradex.py +23 -0
  53. ccxt/abstract/phemex.py +2 -0
  54. ccxt/abstract/poloniex.py +36 -0
  55. ccxt/abstract/tradeogre.py +3 -1
  56. ccxt/abstract/upbit.py +51 -34
  57. ccxt/abstract/whitebit.py +16 -0
  58. ccxt/abstract/woo.py +64 -6
  59. ccxt/abstract/xt.py +10 -5
  60. ccxt/afratether.py +7 -7
  61. ccxt/alpaca.py +828 -51
  62. ccxt/apex.py +1875 -0
  63. ccxt/arzinja.py +7 -7
  64. ccxt/arzplus.py +9 -9
  65. ccxt/ascendex.py +501 -306
  66. ccxt/async_support/__init__.py +39 -35
  67. ccxt/async_support/abantether.py +10 -10
  68. ccxt/async_support/afratether.py +9 -9
  69. ccxt/async_support/alpaca.py +828 -51
  70. ccxt/async_support/apex.py +1875 -0
  71. ccxt/async_support/arzinja.py +10 -10
  72. ccxt/async_support/arzplus.py +12 -12
  73. ccxt/async_support/ascendex.py +502 -306
  74. ccxt/async_support/base/exchange.py +303 -89
  75. ccxt/async_support/base/ws/cache.py +9 -3
  76. ccxt/async_support/base/ws/client.py +173 -38
  77. ccxt/async_support/base/ws/future.py +25 -37
  78. ccxt/async_support/bequant.py +5 -3
  79. ccxt/async_support/bigone.py +279 -144
  80. ccxt/async_support/binance.py +2347 -1158
  81. ccxt/async_support/binancecoinm.py +9 -3
  82. ccxt/async_support/binanceus.py +17 -3
  83. ccxt/async_support/binanceusdm.py +9 -4
  84. ccxt/async_support/bingx.py +2962 -920
  85. ccxt/async_support/bit2c.py +147 -27
  86. ccxt/async_support/bitbank.py +151 -23
  87. ccxt/async_support/bitbns.py +104 -30
  88. ccxt/async_support/bitfinex.py +3291 -1113
  89. ccxt/async_support/bitflyer.py +202 -27
  90. ccxt/async_support/bitget.py +3683 -1538
  91. ccxt/async_support/bithumb.py +195 -38
  92. ccxt/async_support/bitimen.py +12 -12
  93. ccxt/async_support/bitir.py +38 -38
  94. ccxt/async_support/bitmart.py +1288 -350
  95. ccxt/async_support/bitmex.py +260 -75
  96. ccxt/async_support/bitopro.py +262 -62
  97. ccxt/async_support/bitpin.py +17 -16
  98. ccxt/async_support/bitrue.py +459 -290
  99. ccxt/async_support/bitso.py +199 -54
  100. ccxt/async_support/bitstamp.py +230 -96
  101. ccxt/async_support/bitteam.py +167 -25
  102. ccxt/async_support/{huobijp.py → bittrade.py} +158 -30
  103. ccxt/async_support/bitvavo.py +213 -49
  104. ccxt/async_support/blockchaincom.py +160 -46
  105. ccxt/async_support/blofin.py +502 -120
  106. ccxt/async_support/btcalpha.py +169 -31
  107. ccxt/async_support/btcbox.py +292 -23
  108. ccxt/async_support/btcmarkets.py +211 -58
  109. ccxt/async_support/btcturk.py +161 -38
  110. ccxt/async_support/bybit.py +1775 -1030
  111. ccxt/async_support/cex.py +1440 -1303
  112. ccxt/async_support/coinbase.py +724 -212
  113. ccxt/async_support/coinbaseadvanced.py +2 -1
  114. ccxt/async_support/coinbaseexchange.py +388 -89
  115. ccxt/async_support/coinbaseinternational.py +412 -57
  116. ccxt/async_support/coincatch.py +177 -78
  117. ccxt/async_support/coincheck.py +135 -19
  118. ccxt/async_support/coinex.py +606 -232
  119. ccxt/async_support/coinmate.py +189 -63
  120. ccxt/async_support/coinmetro.py +195 -54
  121. ccxt/async_support/coinone.py +158 -51
  122. ccxt/async_support/coinsph.py +336 -61
  123. ccxt/async_support/coinspot.py +151 -52
  124. ccxt/async_support/cryptocom.py +661 -111
  125. ccxt/async_support/cryptomus.py +1137 -0
  126. ccxt/async_support/defx.py +2071 -0
  127. ccxt/async_support/delta.py +299 -99
  128. ccxt/async_support/deribit.py +348 -126
  129. ccxt/async_support/derive.py +2572 -0
  130. ccxt/async_support/digifinex.py +430 -214
  131. ccxt/async_support/ellipx.py +2029 -0
  132. ccxt/async_support/eterex.py +10 -10
  133. ccxt/async_support/excoino.py +31 -31
  134. ccxt/async_support/exir.py +14 -14
  135. ccxt/async_support/exmo.py +344 -131
  136. ccxt/async_support/exnovin.py +10 -10
  137. ccxt/async_support/farhadexchange.py +12 -12
  138. ccxt/async_support/fmfwio.py +2 -1
  139. ccxt/async_support/foxbit.py +1935 -0
  140. ccxt/async_support/gate.py +1351 -529
  141. ccxt/async_support/gateio.py +2 -1
  142. ccxt/async_support/gemini.py +144 -39
  143. ccxt/async_support/hashkey.py +152 -109
  144. ccxt/async_support/hibachi.py +2080 -0
  145. ccxt/async_support/hitbtc.py +395 -167
  146. ccxt/async_support/hitobit.py +12 -12
  147. ccxt/async_support/hollaex.py +307 -119
  148. ccxt/async_support/htx.py +851 -383
  149. ccxt/async_support/huobi.py +2 -1
  150. ccxt/async_support/hyperliquid.py +1848 -536
  151. ccxt/async_support/independentreserve.py +288 -15
  152. ccxt/async_support/indodax.py +190 -33
  153. ccxt/async_support/jibitex.py +12 -12
  154. ccxt/async_support/kraken.py +795 -351
  155. ccxt/async_support/krakenfutures.py +214 -62
  156. ccxt/async_support/kucoin.py +715 -396
  157. ccxt/async_support/kucoinfutures.py +652 -89
  158. ccxt/async_support/latoken.py +217 -113
  159. ccxt/async_support/lbank.py +425 -97
  160. ccxt/async_support/luno.py +382 -35
  161. ccxt/async_support/mercado.py +113 -6
  162. ccxt/async_support/mexc.py +874 -437
  163. ccxt/async_support/modetrade.py +2818 -0
  164. ccxt/async_support/myokx.py +54 -0
  165. ccxt/async_support/ndax.py +221 -64
  166. ccxt/async_support/nobitex.py +31 -37
  167. ccxt/async_support/novadax.py +190 -34
  168. ccxt/async_support/oceanex.py +217 -28
  169. ccxt/async_support/okcoin.py +253 -145
  170. ccxt/async_support/okexchange.py +11 -11
  171. ccxt/async_support/okx.py +1088 -351
  172. ccxt/async_support/okxus.py +54 -0
  173. ccxt/async_support/ompfinex.py +25 -24
  174. ccxt/async_support/onetrading.py +213 -392
  175. ccxt/async_support/oxfun.py +245 -166
  176. ccxt/async_support/p2b.py +151 -29
  177. ccxt/async_support/paradex.py +562 -49
  178. ccxt/async_support/paymium.py +82 -19
  179. ccxt/async_support/phemex.py +713 -172
  180. ccxt/async_support/poloniex.py +1602 -283
  181. ccxt/async_support/probit.py +224 -95
  182. ccxt/async_support/ramzinex.py +30 -27
  183. ccxt/async_support/sarmayex.py +9 -9
  184. ccxt/async_support/sarrafex.py +13 -13
  185. ccxt/async_support/tabdeal.py +14 -13
  186. ccxt/async_support/tetherland.py +9 -9
  187. ccxt/async_support/timex.py +210 -51
  188. ccxt/async_support/tokocrypto.py +167 -47
  189. ccxt/async_support/tradeogre.py +266 -31
  190. ccxt/async_support/twox.py +9 -9
  191. ccxt/async_support/ubitex.py +12 -12
  192. ccxt/async_support/upbit.py +568 -165
  193. ccxt/async_support/vertex.py +160 -32
  194. ccxt/async_support/wallex.py +12 -12
  195. ccxt/async_support/wavesexchange.py +165 -30
  196. ccxt/async_support/whitebit.py +975 -127
  197. ccxt/async_support/woo.py +1918 -1016
  198. ccxt/async_support/woofipro.py +433 -141
  199. ccxt/async_support/xt.py +649 -193
  200. ccxt/async_support/yobit.py +195 -70
  201. ccxt/async_support/zaif.py +91 -15
  202. ccxt/async_support/zonda.py +151 -36
  203. ccxt/base/decimal_to_precision.py +14 -10
  204. ccxt/base/errors.py +49 -18
  205. ccxt/base/exchange.py +1556 -450
  206. ccxt/base/precise.py +10 -0
  207. ccxt/base/types.py +114 -6
  208. ccxt/bequant.py +5 -3
  209. ccxt/bigone.py +279 -144
  210. ccxt/binance.py +2347 -1158
  211. ccxt/binancecoinm.py +9 -3
  212. ccxt/binanceus.py +17 -3
  213. ccxt/binanceusdm.py +9 -4
  214. ccxt/bingx.py +2962 -920
  215. ccxt/bit2c.py +147 -27
  216. ccxt/bitbank.py +151 -23
  217. ccxt/bitbns.py +104 -30
  218. ccxt/bitfinex.py +3290 -1113
  219. ccxt/bitflyer.py +202 -27
  220. ccxt/bitget.py +3683 -1538
  221. ccxt/bithumb.py +194 -38
  222. ccxt/bitimen.py +9 -9
  223. ccxt/bitir.py +35 -35
  224. ccxt/bitmart.py +1288 -350
  225. ccxt/bitmex.py +260 -75
  226. ccxt/bitopro.py +262 -62
  227. ccxt/bitpin.py +15 -14
  228. ccxt/bitrue.py +459 -290
  229. ccxt/bitso.py +199 -54
  230. ccxt/bitstamp.py +230 -96
  231. ccxt/bitteam.py +167 -25
  232. ccxt/{huobijp.py → bittrade.py} +158 -30
  233. ccxt/bitvavo.py +213 -49
  234. ccxt/blockchaincom.py +160 -46
  235. ccxt/blofin.py +502 -120
  236. ccxt/btcalpha.py +169 -31
  237. ccxt/btcbox.py +291 -23
  238. ccxt/btcmarkets.py +211 -58
  239. ccxt/btcturk.py +161 -38
  240. ccxt/bybit.py +1775 -1030
  241. ccxt/cex.py +1439 -1303
  242. ccxt/coinbase.py +724 -212
  243. ccxt/coinbaseadvanced.py +2 -1
  244. ccxt/coinbaseexchange.py +388 -89
  245. ccxt/coinbaseinternational.py +412 -57
  246. ccxt/coincatch.py +177 -78
  247. ccxt/coincheck.py +135 -19
  248. ccxt/coinex.py +606 -232
  249. ccxt/coinmate.py +189 -63
  250. ccxt/coinmetro.py +194 -54
  251. ccxt/coinone.py +158 -51
  252. ccxt/coinsph.py +336 -61
  253. ccxt/coinspot.py +151 -52
  254. ccxt/cryptocom.py +661 -111
  255. ccxt/cryptomus.py +1137 -0
  256. ccxt/defx.py +2070 -0
  257. ccxt/delta.py +299 -99
  258. ccxt/deribit.py +348 -126
  259. ccxt/derive.py +2571 -0
  260. ccxt/digifinex.py +430 -214
  261. ccxt/ellipx.py +2029 -0
  262. ccxt/eterex.py +7 -7
  263. ccxt/excoino.py +29 -29
  264. ccxt/exir.py +11 -11
  265. ccxt/exmo.py +343 -131
  266. ccxt/exnovin.py +8 -8
  267. ccxt/farhadexchange.py +10 -10
  268. ccxt/fmfwio.py +2 -1
  269. ccxt/foxbit.py +1935 -0
  270. ccxt/gate.py +1351 -529
  271. ccxt/gateio.py +2 -1
  272. ccxt/gemini.py +144 -39
  273. ccxt/hashkey.py +152 -109
  274. ccxt/hibachi.py +2079 -0
  275. ccxt/hitbtc.py +395 -167
  276. ccxt/hitobit.py +9 -9
  277. ccxt/hollaex.py +307 -119
  278. ccxt/htx.py +851 -383
  279. ccxt/huobi.py +2 -1
  280. ccxt/hyperliquid.py +1848 -536
  281. ccxt/independentreserve.py +287 -15
  282. ccxt/indodax.py +190 -33
  283. ccxt/jibitex.py +9 -9
  284. ccxt/kraken.py +794 -351
  285. ccxt/krakenfutures.py +214 -62
  286. ccxt/kucoin.py +715 -396
  287. ccxt/kucoinfutures.py +652 -89
  288. ccxt/latoken.py +217 -113
  289. ccxt/lbank.py +425 -97
  290. ccxt/luno.py +382 -35
  291. ccxt/mercado.py +113 -6
  292. ccxt/mexc.py +873 -437
  293. ccxt/modetrade.py +2818 -0
  294. ccxt/myokx.py +54 -0
  295. ccxt/ndax.py +221 -64
  296. ccxt/nobitex.py +29 -35
  297. ccxt/novadax.py +190 -34
  298. ccxt/oceanex.py +217 -28
  299. ccxt/okcoin.py +253 -145
  300. ccxt/okexchange.py +9 -9
  301. ccxt/okx.py +1088 -351
  302. ccxt/okxus.py +54 -0
  303. ccxt/ompfinex.py +22 -21
  304. ccxt/onetrading.py +213 -392
  305. ccxt/oxfun.py +245 -166
  306. ccxt/p2b.py +151 -29
  307. ccxt/paradex.py +562 -49
  308. ccxt/paymium.py +82 -19
  309. ccxt/phemex.py +712 -172
  310. ccxt/poloniex.py +1601 -283
  311. ccxt/pro/__init__.py +76 -17
  312. ccxt/pro/alpaca.py +21 -6
  313. ccxt/pro/apex.py +984 -0
  314. ccxt/pro/ascendex.py +58 -10
  315. ccxt/pro/bequant.py +6 -1
  316. ccxt/pro/binance.py +728 -156
  317. ccxt/pro/binancecoinm.py +6 -2
  318. ccxt/pro/binanceus.py +8 -4
  319. ccxt/pro/binanceusdm.py +7 -2
  320. ccxt/pro/bingx.py +333 -142
  321. ccxt/pro/bitfinex.py +727 -262
  322. ccxt/pro/bitget.py +570 -79
  323. ccxt/pro/bithumb.py +20 -6
  324. ccxt/pro/bitmart.py +216 -87
  325. ccxt/pro/bitmex.py +47 -9
  326. ccxt/pro/bitopro.py +26 -14
  327. ccxt/pro/bitrue.py +22 -22
  328. ccxt/pro/bitstamp.py +54 -21
  329. ccxt/pro/{huobijp.py → bittrade.py} +7 -6
  330. ccxt/pro/bitvavo.py +191 -67
  331. ccxt/pro/blockchaincom.py +21 -8
  332. ccxt/pro/blofin.py +9 -1
  333. ccxt/pro/bybit.py +632 -245
  334. ccxt/pro/cex.py +59 -24
  335. ccxt/pro/coinbase.py +102 -73
  336. ccxt/pro/coinbaseadvanced.py +2 -1
  337. ccxt/pro/coinbaseexchange.py +8 -8
  338. ccxt/pro/coinbaseinternational.py +181 -25
  339. ccxt/pro/coincatch.py +6 -7
  340. ccxt/pro/coincheck.py +11 -6
  341. ccxt/pro/coinex.py +967 -665
  342. ccxt/pro/coinone.py +16 -9
  343. ccxt/pro/cryptocom.py +448 -45
  344. ccxt/pro/defx.py +831 -0
  345. ccxt/pro/deribit.py +150 -14
  346. ccxt/pro/derive.py +704 -0
  347. ccxt/pro/exmo.py +239 -6
  348. ccxt/pro/gate.py +623 -65
  349. ccxt/pro/gateio.py +2 -1
  350. ccxt/pro/gemini.py +27 -11
  351. ccxt/pro/hashkey.py +2 -2
  352. ccxt/pro/hitbtc.py +196 -91
  353. ccxt/pro/hollaex.py +23 -7
  354. ccxt/pro/htx.py +51 -14
  355. ccxt/pro/huobi.py +2 -1
  356. ccxt/pro/hyperliquid.py +591 -27
  357. ccxt/pro/independentreserve.py +9 -6
  358. ccxt/pro/kraken.py +640 -320
  359. ccxt/pro/krakenfutures.py +62 -35
  360. ccxt/pro/kucoin.py +267 -46
  361. ccxt/pro/kucoinfutures.py +165 -21
  362. ccxt/pro/lbank.py +102 -21
  363. ccxt/pro/luno.py +12 -8
  364. ccxt/pro/mexc.py +877 -111
  365. ccxt/pro/modetrade.py +1271 -0
  366. ccxt/pro/myokx.py +38 -0
  367. ccxt/pro/ndax.py +15 -2
  368. ccxt/pro/okcoin.py +23 -4
  369. ccxt/pro/okx.py +573 -98
  370. ccxt/pro/okxus.py +38 -0
  371. ccxt/pro/onetrading.py +30 -13
  372. ccxt/pro/oxfun.py +131 -27
  373. ccxt/pro/p2b.py +88 -22
  374. ccxt/pro/paradex.py +3 -3
  375. ccxt/pro/phemex.py +75 -21
  376. ccxt/pro/poloniex.py +124 -41
  377. ccxt/pro/probit.py +87 -80
  378. ccxt/pro/tradeogre.py +272 -0
  379. ccxt/pro/upbit.py +152 -12
  380. ccxt/pro/vertex.py +8 -3
  381. ccxt/pro/whitebit.py +58 -5
  382. ccxt/pro/woo.py +228 -37
  383. ccxt/pro/woofipro.py +106 -18
  384. ccxt/pro/xt.py +111 -5
  385. ccxt/probit.py +224 -95
  386. ccxt/protobuf/__init__.py +0 -0
  387. ccxt/protobuf/mexc/PrivateAccountV3Api_pb2.py +37 -0
  388. ccxt/protobuf/mexc/PrivateDealsV3Api_pb2.py +37 -0
  389. ccxt/protobuf/mexc/PrivateOrdersV3Api_pb2.py +37 -0
  390. ccxt/protobuf/mexc/PublicAggreBookTickerV3Api_pb2.py +37 -0
  391. ccxt/protobuf/mexc/PublicAggreDealsV3Api_pb2.py +39 -0
  392. ccxt/protobuf/mexc/PublicAggreDepthsV3Api_pb2.py +39 -0
  393. ccxt/protobuf/mexc/PublicBookTickerBatchV3Api_pb2.py +38 -0
  394. ccxt/protobuf/mexc/PublicBookTickerV3Api_pb2.py +37 -0
  395. ccxt/protobuf/mexc/PublicDealsV3Api_pb2.py +39 -0
  396. ccxt/protobuf/mexc/PublicIncreaseDepthsBatchV3Api_pb2.py +38 -0
  397. ccxt/protobuf/mexc/PublicIncreaseDepthsV3Api_pb2.py +39 -0
  398. ccxt/protobuf/mexc/PublicLimitDepthsV3Api_pb2.py +39 -0
  399. ccxt/protobuf/mexc/PublicMiniTickerV3Api_pb2.py +37 -0
  400. ccxt/protobuf/mexc/PublicMiniTickersV3Api_pb2.py +38 -0
  401. ccxt/protobuf/mexc/PublicSpotKlineV3Api_pb2.py +37 -0
  402. ccxt/protobuf/mexc/PushDataV3ApiWrapper_pb2.py +52 -0
  403. ccxt/protobuf/mexc/__init__.py +0 -0
  404. ccxt/ramzinex.py +28 -25
  405. ccxt/sarmayex.py +7 -7
  406. ccxt/sarrafex.py +10 -10
  407. ccxt/static_dependencies/__init__.py +1 -1
  408. ccxt/static_dependencies/lark/py.typed +0 -0
  409. ccxt/static_dependencies/marshmallow/py.typed +0 -0
  410. ccxt/static_dependencies/marshmallow_dataclass/py.typed +0 -0
  411. ccxt/static_dependencies/marshmallow_oneofschema/py.typed +0 -0
  412. ccxt/tabdeal.py +12 -11
  413. ccxt/test/tests_async.py +261 -57
  414. ccxt/test/tests_helpers.py +1 -3
  415. ccxt/test/tests_init.py +4 -3
  416. ccxt/test/tests_sync.py +261 -57
  417. ccxt/tetherland.py +7 -7
  418. ccxt/timex.py +210 -51
  419. ccxt/tokocrypto.py +167 -47
  420. ccxt/tradeogre.py +266 -31
  421. ccxt/twox.py +7 -7
  422. ccxt/ubitex.py +9 -9
  423. ccxt/upbit.py +568 -165
  424. ccxt/vertex.py +160 -32
  425. ccxt/wallex.py +9 -9
  426. ccxt/wavesexchange.py +165 -30
  427. ccxt/whitebit.py +975 -127
  428. ccxt/woo.py +1917 -1016
  429. ccxt/woofipro.py +432 -141
  430. ccxt/xt.py +649 -193
  431. ccxt/yobit.py +194 -70
  432. ccxt/zaif.py +91 -15
  433. ccxt/zonda.py +151 -36
  434. {ccxt_ir-4.3.46.0.2.dist-info → ccxt_ir-4.5.0.dist-info}/METADATA +225 -73
  435. ccxt_ir-4.5.0.dist-info/RECORD +743 -0
  436. {ccxt_ir-4.3.46.0.2.dist-info → ccxt_ir-4.5.0.dist-info}/WHEEL +1 -1
  437. ccxt/abstract/ace.py +0 -15
  438. ccxt/abstract/bitbay.py +0 -53
  439. ccxt/abstract/bitcoincom.py +0 -115
  440. ccxt/abstract/bitfinex2.py +0 -139
  441. ccxt/abstract/bitpanda.py +0 -35
  442. ccxt/abstract/bl3p.py +0 -19
  443. ccxt/abstract/coinlist.py +0 -54
  444. ccxt/abstract/currencycom.py +0 -68
  445. ccxt/abstract/hitbtc3.py +0 -115
  446. ccxt/abstract/idex.py +0 -26
  447. ccxt/abstract/kuna.py +0 -182
  448. ccxt/abstract/lykke.py +0 -29
  449. ccxt/abstract/poloniexfutures.py +0 -48
  450. ccxt/abstract/wazirx.py +0 -30
  451. ccxt/ace.py +0 -1012
  452. ccxt/async_support/ace.py +0 -1012
  453. ccxt/async_support/base/ws/aiohttp_client.py +0 -125
  454. ccxt/async_support/base/ws/fast_client.py +0 -96
  455. ccxt/async_support/bitbay.py +0 -17
  456. ccxt/async_support/bitcoincom.py +0 -17
  457. ccxt/async_support/bitfinex2.py +0 -3552
  458. ccxt/async_support/bitpanda.py +0 -16
  459. ccxt/async_support/bl3p.py +0 -485
  460. ccxt/async_support/coinlist.py +0 -2243
  461. ccxt/async_support/currencycom.py +0 -1950
  462. ccxt/async_support/hitbtc3.py +0 -16
  463. ccxt/async_support/idex.py +0 -1766
  464. ccxt/async_support/kuna.py +0 -1841
  465. ccxt/async_support/lykke.py +0 -1270
  466. ccxt/async_support/poloniexfutures.py +0 -1717
  467. ccxt/async_support/wazirx.py +0 -1224
  468. ccxt/bitbay.py +0 -17
  469. ccxt/bitcoincom.py +0 -17
  470. ccxt/bitfinex2.py +0 -3552
  471. ccxt/bitpanda.py +0 -16
  472. ccxt/bl3p.py +0 -485
  473. ccxt/coinlist.py +0 -2243
  474. ccxt/currencycom.py +0 -1950
  475. ccxt/hitbtc3.py +0 -16
  476. ccxt/idex.py +0 -1766
  477. ccxt/kuna.py +0 -1841
  478. ccxt/lykke.py +0 -1270
  479. ccxt/poloniexfutures.py +0 -1717
  480. ccxt/pro/bitcoincom.py +0 -34
  481. ccxt/pro/bitfinex2.py +0 -1083
  482. ccxt/pro/bitpanda.py +0 -15
  483. ccxt/pro/currencycom.py +0 -536
  484. ccxt/pro/idex.py +0 -672
  485. ccxt/pro/poloniexfutures.py +0 -990
  486. ccxt/pro/wazirx.py +0 -749
  487. ccxt/test/base/__init__.py +0 -29
  488. ccxt/test/base/test_account.py +0 -26
  489. ccxt/test/base/test_balance.py +0 -56
  490. ccxt/test/base/test_borrow_interest.py +0 -35
  491. ccxt/test/base/test_borrow_rate.py +0 -32
  492. ccxt/test/base/test_calculate_fee.py +0 -51
  493. ccxt/test/base/test_crypto.py +0 -127
  494. ccxt/test/base/test_currency.py +0 -76
  495. ccxt/test/base/test_datetime.py +0 -109
  496. ccxt/test/base/test_decimal_to_precision.py +0 -392
  497. ccxt/test/base/test_deep_extend.py +0 -68
  498. ccxt/test/base/test_deposit_withdrawal.py +0 -50
  499. ccxt/test/base/test_exchange_datetime_functions.py +0 -76
  500. ccxt/test/base/test_funding_rate_history.py +0 -29
  501. ccxt/test/base/test_last_price.py +0 -31
  502. ccxt/test/base/test_ledger_entry.py +0 -45
  503. ccxt/test/base/test_ledger_item.py +0 -48
  504. ccxt/test/base/test_leverage_tier.py +0 -33
  505. ccxt/test/base/test_liquidation.py +0 -50
  506. ccxt/test/base/test_margin_mode.py +0 -24
  507. ccxt/test/base/test_margin_modification.py +0 -35
  508. ccxt/test/base/test_market.py +0 -193
  509. ccxt/test/base/test_number.py +0 -411
  510. ccxt/test/base/test_ohlcv.py +0 -33
  511. ccxt/test/base/test_open_interest.py +0 -32
  512. ccxt/test/base/test_order.py +0 -64
  513. ccxt/test/base/test_order_book.py +0 -69
  514. ccxt/test/base/test_position.py +0 -60
  515. ccxt/test/base/test_shared_methods.py +0 -353
  516. ccxt/test/base/test_status.py +0 -24
  517. ccxt/test/base/test_throttle.py +0 -126
  518. ccxt/test/base/test_ticker.py +0 -92
  519. ccxt/test/base/test_trade.py +0 -47
  520. ccxt/test/base/test_trading_fee.py +0 -26
  521. ccxt/test/base/test_transaction.py +0 -39
  522. ccxt/test/test_async.py +0 -1649
  523. ccxt/test/test_sync.py +0 -1648
  524. ccxt/wazirx.py +0 -1224
  525. ccxt_ir-4.3.46.0.2.dist-info/RECORD +0 -772
  526. /ccxt/abstract/{huobijp.py → bittrade.py} +0 -0
  527. {ccxt_ir-4.3.46.0.2.dist-info → ccxt_ir-4.5.0.dist-info/licenses}/LICENSE.txt +0 -0
  528. {ccxt_ir-4.3.46.0.2.dist-info → ccxt_ir-4.5.0.dist-info}/top_level.txt +0 -0
@@ -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': 1000,
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': False,
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/minutes/{unit}',
115
- 'candles/minutes/1',
116
- 'candles/minutes/3',
117
- 'candles/minutes/5',
118
- 'candles/minutes/10',
119
- 'candles/minutes/15',
120
- 'candles/minutes/30',
121
- 'candles/minutes/60',
122
- 'candles/minutes/240',
123
- 'candles/days',
124
- 'candles/weeks',
125
- 'candles/months',
126
- 'trades/ticks',
127
- 'ticker',
128
- 'orderbook',
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
- 'withdraws',
138
- 'withdraw',
139
- 'withdraws/chance',
140
- 'deposits',
141
- 'deposit',
142
- 'deposits/coin_addresses',
143
- 'deposits/coin_address',
144
- ],
145
- 'post': [
146
- 'orders',
147
- 'withdraws/coin',
148
- 'withdraws/krw',
149
- 'deposits/generate_coin_address',
150
- ],
151
- 'delete': [
152
- 'order',
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
- :see: https://docs.upbit.com/reference/%EB%A7%88%EC%BC%93-%EC%BD%94%EB%93%9C-%EC%A1%B0%ED%9A%8C
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
- :see: https://docs.upbit.com/reference/%EC%A0%84%EC%B2%B4-%EA%B3%84%EC%A2%8C-%EC%A1%B0%ED%9A%8C
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
- :see: https://docs.upbit.com/reference/%ED%98%B8%EA%B0%80-%EC%A0%95%EB%B3%B4-%EC%A1%B0%ED%9A%8C
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
- :see: https://docs.upbit.com/reference/%ED%98%B8%EA%B0%80-%EC%A0%95%EB%B3%B4-%EC%A1%B0%ED%9A%8C
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
- :see: https://docs.upbit.com/reference/ticker%ED%98%84%EC%9E%AC%EA%B0%80-%EC%A0%95%EB%B3%B4
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
- :see: https://docs.upbit.com/reference/ticker%ED%98%84%EC%9E%AC%EA%B0%80-%EC%A0%95%EB%B3%B4
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
- :see: https://docs.upbit.com/reference/%EC%B5%9C%EA%B7%BC-%EC%B2%B4%EA%B2%B0-%EB%82%B4%EC%97%AD
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
- :see: https://docs.upbit.com/reference/%EC%A3%BC%EB%AC%B8-%EA%B0%80%EB%8A%A5-%EC%A0%95%EB%B3%B4
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.34202414",
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
- :see: https://docs.upbit.com/reference/%EB%B6%84minute-%EC%BA%94%EB%93%A4-1
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
- :see: https://docs.upbit.com/reference/%EC%A3%BC%EB%AC%B8%ED%95%98%EA%B8%B0
995
- :see: https://global-docs.upbit.com/reference/order
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' or 'limit'
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 fullfilled, in units of the quote currency, ignored in market orders
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.timeInForce]: 'IOC' or 'FOK'
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() allows buy or sell side only!')
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
- if (type == 'market') and (side == 'buy'):
1022
- # for market buy it requires the amount of quote currency to spend
1023
- quoteAmount = None
1024
- createMarketBuyOrderRequiresPrice = True
1025
- createMarketBuyOrderRequiresPrice, params = self.handle_option_and_params(params, 'createOrder', 'createMarketBuyOrderRequiresPrice', True)
1026
- cost = self.safe_number(params, 'cost')
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
- quoteAmount = self.cost_to_precision(symbol, amount)
1040
- request['ord_type'] = 'price'
1041
- request['price'] = quoteAmount
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
- request['ord_type'] = type
1044
- request['volume'] = self.amount_to_precision(symbol, amount)
1045
- clientOrderId = self.safe_string_2(params, 'clientOrderId', 'identifier')
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 type != 'market':
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
- params = self.omit(params, ['clientOrderId', 'identifier'])
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
- :see: https://docs.upbit.com/reference/%EC%A3%BC%EB%AC%B8-%EC%B7%A8%EC%86%8C
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
- :see: https://docs.upbit.com/reference/%EC%9E%85%EA%B8%88-%EB%A6%AC%EC%8A%A4%ED%8A%B8-%EC%A1%B0%ED%9A%8C
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
- :see: https://global-docs.upbit.com/reference/individual-deposit-inquiry
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
- :see: https://docs.upbit.com/reference/%EC%A0%84%EC%B2%B4-%EC%B6%9C%EA%B8%88-%EC%A1%B0%ED%9A%8C
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
- :see: https://global-docs.upbit.com/reference/individual-withdrawal-inquiry
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': None,
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': None,
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 fetch_orders_by_state(self, state, symbol: Str = None, since: Int = None, limit: Int = None, params={}):
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
- response = await self.privateGetOrders(self.extend(request, params))
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": "a08f09b1-1718-42e2-9358-f0e5e083d3ee",
1489
- # "side": "bid",
1808
+ # "uuid": "637fd66-d019-4d77-bee6-8e0cff28edd9",
1809
+ # "side": "ask",
1490
1810
  # "ord_type": "limit",
1491
- # "price": "17417000.0",
1492
- # "state": "done",
1493
- # "market": "KRW-BTC",
1494
- # "created_at": "2018-04-05T14:09:14+09:00",
1495
- # "volume": "1.0",
1496
- # "remaining_volume": "0.0",
1497
- # "reserved_fee": "26125.5",
1498
- # "remaining_fee": "25974.0",
1499
- # "paid_fee": "151.5",
1500
- # "locked": "17341974.0",
1501
- # "executed_volume": "1.0",
1502
- # "trades_count":2
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
- return await self.fetch_orders_by_state('done', symbol, since, limit, params)
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
- return await self.fetch_orders_by_state('cancel', symbol, since, limit, params)
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
- :see: https://docs.upbit.com/reference/%EA%B0%9C%EB%B3%84-%EC%A3%BC%EB%AC%B8-%EC%A1%B0%ED%9A%8C
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
- :see: https://docs.upbit.com/reference/%EC%A0%84%EC%B2%B4-%EC%9E%85%EA%B8%88-%EC%A3%BC%EC%86%8C-%EC%A1%B0%ED%9A%8C
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
- :see: https://docs.upbit.com/reference/%EC%A0%84%EC%B2%B4-%EC%9E%85%EA%B8%88-%EC%A3%BC%EC%86%8C-%EC%A1%B0%ED%9A%8C
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
- :see: https://docs.upbit.com/reference/%EC%9E%85%EA%B8%88-%EC%A3%BC%EC%86%8C-%EC%83%9D%EC%84%B1-%EC%9A%94%EC%B2%AD
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
- :see: https://docs.upbit.com/reference/디지털자산-출금하기
1723
- :see: https://docs.upbit.com/reference/%EC%9B%90%ED%99%94-%EC%B6%9C%EA%B8%88%ED%95%98%EA%B8%B0
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
- if hasQuery:
1797
- auth = self.urlencode(query)
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