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.
Files changed (529) hide show
  1. ccxt/__init__.py +39 -35
  2. ccxt/abantether.py +8 -8
  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 +8 -8
  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.3.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.3.dist-info → ccxt_ir-4.5.0.dist-info}/WHEEL +1 -1
  437. ccxt/__test__.py +0 -7
  438. ccxt/abstract/ace.py +0 -15
  439. ccxt/abstract/bitbay.py +0 -53
  440. ccxt/abstract/bitcoincom.py +0 -115
  441. ccxt/abstract/bitfinex2.py +0 -139
  442. ccxt/abstract/bitpanda.py +0 -35
  443. ccxt/abstract/bl3p.py +0 -19
  444. ccxt/abstract/coinlist.py +0 -54
  445. ccxt/abstract/currencycom.py +0 -68
  446. ccxt/abstract/hitbtc3.py +0 -115
  447. ccxt/abstract/idex.py +0 -26
  448. ccxt/abstract/kuna.py +0 -182
  449. ccxt/abstract/lykke.py +0 -29
  450. ccxt/abstract/poloniexfutures.py +0 -48
  451. ccxt/abstract/wazirx.py +0 -30
  452. ccxt/ace.py +0 -1012
  453. ccxt/async_support/ace.py +0 -1012
  454. ccxt/async_support/base/ws/aiohttp_client.py +0 -125
  455. ccxt/async_support/base/ws/fast_client.py +0 -96
  456. ccxt/async_support/bitbay.py +0 -17
  457. ccxt/async_support/bitcoincom.py +0 -17
  458. ccxt/async_support/bitfinex2.py +0 -3552
  459. ccxt/async_support/bitpanda.py +0 -16
  460. ccxt/async_support/bl3p.py +0 -485
  461. ccxt/async_support/coinlist.py +0 -2243
  462. ccxt/async_support/currencycom.py +0 -1950
  463. ccxt/async_support/hitbtc3.py +0 -16
  464. ccxt/async_support/idex.py +0 -1766
  465. ccxt/async_support/kuna.py +0 -1841
  466. ccxt/async_support/lykke.py +0 -1270
  467. ccxt/async_support/poloniexfutures.py +0 -1717
  468. ccxt/async_support/wazirx.py +0 -1224
  469. ccxt/bitbay.py +0 -17
  470. ccxt/bitcoincom.py +0 -17
  471. ccxt/bitfinex2.py +0 -3552
  472. ccxt/bitpanda.py +0 -16
  473. ccxt/bl3p.py +0 -485
  474. ccxt/coinlist.py +0 -2243
  475. ccxt/currencycom.py +0 -1950
  476. ccxt/hitbtc3.py +0 -16
  477. ccxt/idex.py +0 -1766
  478. ccxt/kuna.py +0 -1841
  479. ccxt/lykke.py +0 -1270
  480. ccxt/poloniexfutures.py +0 -1717
  481. ccxt/pro/bitcoincom.py +0 -34
  482. ccxt/pro/bitfinex2.py +0 -1083
  483. ccxt/pro/bitpanda.py +0 -15
  484. ccxt/pro/currencycom.py +0 -536
  485. ccxt/pro/idex.py +0 -672
  486. ccxt/pro/poloniexfutures.py +0 -990
  487. ccxt/pro/wazirx.py +0 -749
  488. ccxt/test/base/__init__.py +0 -29
  489. ccxt/test/base/test_account.py +0 -26
  490. ccxt/test/base/test_balance.py +0 -56
  491. ccxt/test/base/test_borrow_interest.py +0 -35
  492. ccxt/test/base/test_borrow_rate.py +0 -32
  493. ccxt/test/base/test_calculate_fee.py +0 -51
  494. ccxt/test/base/test_crypto.py +0 -127
  495. ccxt/test/base/test_currency.py +0 -76
  496. ccxt/test/base/test_datetime.py +0 -109
  497. ccxt/test/base/test_decimal_to_precision.py +0 -392
  498. ccxt/test/base/test_deep_extend.py +0 -68
  499. ccxt/test/base/test_deposit_withdrawal.py +0 -50
  500. ccxt/test/base/test_exchange_datetime_functions.py +0 -76
  501. ccxt/test/base/test_funding_rate_history.py +0 -29
  502. ccxt/test/base/test_last_price.py +0 -31
  503. ccxt/test/base/test_ledger_entry.py +0 -45
  504. ccxt/test/base/test_ledger_item.py +0 -48
  505. ccxt/test/base/test_leverage_tier.py +0 -33
  506. ccxt/test/base/test_liquidation.py +0 -50
  507. ccxt/test/base/test_margin_mode.py +0 -24
  508. ccxt/test/base/test_margin_modification.py +0 -35
  509. ccxt/test/base/test_market.py +0 -193
  510. ccxt/test/base/test_number.py +0 -411
  511. ccxt/test/base/test_ohlcv.py +0 -33
  512. ccxt/test/base/test_open_interest.py +0 -32
  513. ccxt/test/base/test_order.py +0 -64
  514. ccxt/test/base/test_order_book.py +0 -69
  515. ccxt/test/base/test_position.py +0 -60
  516. ccxt/test/base/test_shared_methods.py +0 -353
  517. ccxt/test/base/test_status.py +0 -24
  518. ccxt/test/base/test_throttle.py +0 -126
  519. ccxt/test/base/test_ticker.py +0 -92
  520. ccxt/test/base/test_trade.py +0 -47
  521. ccxt/test/base/test_trading_fee.py +0 -26
  522. ccxt/test/base/test_transaction.py +0 -39
  523. ccxt/test/test_async.py +0 -1649
  524. ccxt/test/test_sync.py +0 -1648
  525. ccxt/wazirx.py +0 -1224
  526. ccxt_ir-4.3.46.0.3.dist-info/RECORD +0 -773
  527. /ccxt/abstract/{huobijp.py → bittrade.py} +0 -0
  528. {ccxt_ir-4.3.46.0.3.dist-info → ccxt_ir-4.5.0.dist-info/licenses}/LICENSE.txt +0 -0
  529. {ccxt_ir-4.3.46.0.3.dist-info → ccxt_ir-4.5.0.dist-info}/top_level.txt +0 -0
@@ -5,8 +5,9 @@
5
5
 
6
6
  from ccxt.async_support.base.exchange import Exchange
7
7
  from ccxt.abstract.exmo import ImplicitAPI
8
+ import asyncio
8
9
  import hashlib
9
- from ccxt.base.types import Balances, Currencies, Currency, Int, MarginModification, Market, Num, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, TradingFees, Transaction
10
+ from ccxt.base.types import Any, Balances, Currencies, Currency, DepositAddress, Int, MarginModification, Market, Num, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, OrderBooks, Trade, TradingFees, Transaction
10
11
  from typing import List
11
12
  from ccxt.base.errors import ExchangeError
12
13
  from ccxt.base.errors import AuthenticationError
@@ -25,12 +26,12 @@ from ccxt.base.precise import Precise
25
26
 
26
27
  class exmo(Exchange, ImplicitAPI):
27
28
 
28
- def describe(self):
29
+ def describe(self) -> Any:
29
30
  return self.deep_extend(super(exmo, self).describe(), {
30
31
  'id': 'exmo',
31
32
  'name': 'EXMO',
32
33
  'countries': ['LT'], # Lithuania
33
- 'rateLimit': 350, # once every 350 ms ≈ 180 requests per minute ≈ 3 requests per second
34
+ 'rateLimit': 100, # 10 requests per 1 second
34
35
  'version': 'v1.1',
35
36
  'has': {
36
37
  'CORS': None,
@@ -43,6 +44,9 @@ class exmo(Exchange, ImplicitAPI):
43
44
  'cancelOrder': True,
44
45
  'cancelOrders': False,
45
46
  'createDepositAddress': False,
47
+ 'createMarketBuyOrder': True,
48
+ 'createMarketBuyOrderWithCost': True,
49
+ 'createMarketOrderWithCost': True,
46
50
  'createOrder': True,
47
51
  'createStopLimitOrder': True,
48
52
  'createStopMarketOrder': True,
@@ -54,6 +58,8 @@ class exmo(Exchange, ImplicitAPI):
54
58
  'fetchCurrencies': True,
55
59
  'fetchDeposit': True,
56
60
  'fetchDepositAddress': True,
61
+ 'fetchDepositAddresses': False,
62
+ 'fetchDepositAddressesByNetwork': False,
57
63
  'fetchDeposits': True,
58
64
  'fetchDepositsWithdrawals': True,
59
65
  'fetchDepositWithdrawFee': 'emulated',
@@ -215,12 +221,74 @@ class exmo(Exchange, ImplicitAPI):
215
221
  'fillResponseFromRequest': True,
216
222
  },
217
223
  },
224
+ 'features': {
225
+ 'spot': {
226
+ 'sandbox': False,
227
+ 'createOrder': {
228
+ 'marginMode': True, # todo revise
229
+ 'triggerPrice': True, # todo: endpoint lacks other features
230
+ 'triggerPriceType': None,
231
+ 'triggerDirection': False,
232
+ 'stopLossPrice': False,
233
+ 'takeProfitPrice': False,
234
+ 'attachedStopLossTakeProfit': None,
235
+ 'timeInForce': {
236
+ 'IOC': True,
237
+ 'FOK': True,
238
+ 'PO': True,
239
+ 'GTD': True,
240
+ },
241
+ 'hedged': False,
242
+ 'selfTradePrevention': False,
243
+ 'trailing': False,
244
+ 'leverage': True,
245
+ 'marketBuyByCost': True,
246
+ 'marketBuyRequiresPrice': False,
247
+ 'iceberg': False,
248
+ },
249
+ 'createOrders': None,
250
+ 'fetchMyTrades': {
251
+ 'marginMode': True,
252
+ 'limit': 100,
253
+ 'daysBack': None,
254
+ 'untilDays': None,
255
+ 'symbolRequired': True,
256
+ },
257
+ 'fetchOrder': {
258
+ 'marginMode': False,
259
+ 'trigger': False,
260
+ 'trailing': False,
261
+ 'symbolRequired': False,
262
+ },
263
+ 'fetchOpenOrders': {
264
+ 'marginMode': False,
265
+ 'limit': None,
266
+ 'trigger': False,
267
+ 'trailing': False,
268
+ 'symbolRequired': False,
269
+ },
270
+ 'fetchOrders': None,
271
+ 'fetchClosedOrders': None,
272
+ 'fetchOHLCV': {
273
+ 'limit': 1000, # todo, not in request
274
+ },
275
+ },
276
+ 'swap': {
277
+ 'linear': None,
278
+ 'inverse': None,
279
+ },
280
+ 'future': {
281
+ 'linear': None,
282
+ 'inverse': None,
283
+ },
284
+ },
218
285
  'commonCurrencies': {
219
286
  'GMT': 'GMT Token',
220
287
  },
221
288
  'precisionMode': TICK_SIZE,
222
289
  'exceptions': {
223
290
  'exact': {
291
+ '140333': InvalidOrder, # {"error":{"code":140333,"msg":"The number of characters after the point in the price exceeds the maximum number '8\u003e6'"}}
224
292
  '140434': BadRequest,
225
293
  '40005': AuthenticationError, # Authorization error, incorrect signature
226
294
  '40009': InvalidNonce, #
@@ -290,7 +358,9 @@ class exmo(Exchange, ImplicitAPI):
290
358
  async def reduce_margin(self, symbol: str, amount: float, params={}) -> MarginModification:
291
359
  """
292
360
  remove margin from a position
293
- :see: https://documenter.getpostman.com/view/10287440/SzYXWKPi#eebf9f25-0289-4946-9482-89872c738449
361
+
362
+ https://documenter.getpostman.com/view/10287440/SzYXWKPi#eebf9f25-0289-4946-9482-89872c738449
363
+
294
364
  :param str symbol: unified market symbol
295
365
  :param float amount: the amount of margin to remove
296
366
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -301,7 +371,9 @@ class exmo(Exchange, ImplicitAPI):
301
371
  async def add_margin(self, symbol: str, amount: float, params={}) -> MarginModification:
302
372
  """
303
373
  add margin
304
- :see: https://documenter.getpostman.com/view/10287440/SzYXWKPi#143ef808-79ca-4e49-9e79-a60ea4d8c0e3
374
+
375
+ https://documenter.getpostman.com/view/10287440/SzYXWKPi#143ef808-79ca-4e49-9e79-a60ea4d8c0e3
376
+
305
377
  :param str symbol: unified market symbol
306
378
  :param float amount: amount of margin to add
307
379
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -312,8 +384,10 @@ class exmo(Exchange, ImplicitAPI):
312
384
  async def fetch_trading_fees(self, params={}) -> TradingFees:
313
385
  """
314
386
  fetch the trading fees for multiple markets
315
- :see: https://documenter.getpostman.com/view/10287440/SzYXWKPi#90927062-256c-4b03-900f-2b99131f9a54
316
- :see: https://documenter.getpostman.com/view/10287440/SzYXWKPi#7de7e75c-5833-45a8-b937-c2276d235aaa
387
+
388
+ https://documenter.getpostman.com/view/10287440/SzYXWKPi#90927062-256c-4b03-900f-2b99131f9a54
389
+ https://documenter.getpostman.com/view/10287440/SzYXWKPi#7de7e75c-5833-45a8-b937-c2276d235aaa
390
+
317
391
  :param dict [params]: extra parameters specific to the exchange API endpoint
318
392
  :returns dict: a dictionary of `fee structures <https://docs.ccxt.com/#/?id=fee-structure>` indexed by market symbols
319
393
  """
@@ -430,9 +504,11 @@ class exmo(Exchange, ImplicitAPI):
430
504
 
431
505
  async def fetch_transaction_fees(self, codes: Strings = None, params={}):
432
506
  """
433
- * @deprecated
507
+ @deprecated
434
508
  please use fetchDepositWithdrawFees instead
435
- :see: https://documenter.getpostman.com/view/10287440/SzYXWKPi#4190035d-24b1-453d-833b-37e0a52f88e2
509
+
510
+ https://documenter.getpostman.com/view/10287440/SzYXWKPi#4190035d-24b1-453d-833b-37e0a52f88e2
511
+
436
512
  :param str[]|None codes: list of unified currency codes
437
513
  :param dict [params]: extra parameters specific to the exchange API endpoint
438
514
  :returns dict: a list of `transaction fees structures <https://docs.ccxt.com/#/?id=fees-structure>`
@@ -500,7 +576,9 @@ class exmo(Exchange, ImplicitAPI):
500
576
  async def fetch_deposit_withdraw_fees(self, codes: Strings = None, params={}):
501
577
  """
502
578
  fetch deposit and withdraw fees
503
- :see: https://documenter.getpostman.com/view/10287440/SzYXWKPi#4190035d-24b1-453d-833b-37e0a52f88e2
579
+
580
+ https://documenter.getpostman.com/view/10287440/SzYXWKPi#4190035d-24b1-453d-833b-37e0a52f88e2
581
+
504
582
  :param str[]|None codes: list of unified currency codes
505
583
  :param dict [params]: extra parameters specific to the exchange API endpoint
506
584
  :returns dict: a list of `transaction fees structures <https://docs.ccxt.com/#/?id=fees-structure>`
@@ -582,13 +660,16 @@ class exmo(Exchange, ImplicitAPI):
582
660
  async def fetch_currencies(self, params={}) -> Currencies:
583
661
  """
584
662
  fetches all available currencies on an exchange
585
- :see: https://documenter.getpostman.com/view/10287440/SzYXWKPi#7cdf0ca8-9ff6-4cf3-aa33-bcec83155c49
586
- :see: https://documenter.getpostman.com/view/10287440/SzYXWKPi#4190035d-24b1-453d-833b-37e0a52f88e2
663
+
664
+ https://documenter.getpostman.com/view/10287440/SzYXWKPi#7cdf0ca8-9ff6-4cf3-aa33-bcec83155c49
665
+ https://documenter.getpostman.com/view/10287440/SzYXWKPi#4190035d-24b1-453d-833b-37e0a52f88e2
666
+
587
667
  :param dict [params]: extra parameters specific to the exchange API endpoint
588
668
  :returns dict: an associative dictionary of currencies
589
669
  """
670
+ promises = []
590
671
  #
591
- currencyList = await self.publicGetCurrencyListExtended(params)
672
+ promises.append(self.publicGetCurrencyListExtended(params))
592
673
  #
593
674
  # [
594
675
  # {"name":"VLX","description":"Velas"},
@@ -597,7 +678,7 @@ class exmo(Exchange, ImplicitAPI):
597
678
  # {"name":"USD","description":"US Dollar"}
598
679
  # ]
599
680
  #
600
- cryptoList = await self.publicGetPaymentsProvidersCryptoList(params)
681
+ promises.append(self.publicGetPaymentsProvidersCryptoList(params))
601
682
  #
602
683
  # {
603
684
  # "BTC":[
@@ -622,83 +703,105 @@ class exmo(Exchange, ImplicitAPI):
622
703
  # ],
623
704
  # }
624
705
  #
706
+ responses = await asyncio.gather(*promises)
707
+ currencyList = responses[0]
708
+ cryptoList = responses[1]
625
709
  result: dict = {}
626
710
  for i in range(0, len(currencyList)):
627
711
  currency = currencyList[i]
628
712
  currencyId = self.safe_string(currency, 'name')
629
- name = self.safe_string(currency, 'description')
630
- providers = self.safe_value(cryptoList, currencyId)
631
- active = False
713
+ code = self.safe_currency_code(currencyId)
632
714
  type = 'crypto'
633
- limits: dict = {
634
- 'deposit': {
635
- 'min': None,
636
- 'max': None,
637
- },
638
- 'withdraw': {
639
- 'min': None,
640
- 'max': None,
641
- },
642
- }
643
- fee = None
644
- depositEnabled = None
645
- withdrawEnabled = None
715
+ networks = {}
716
+ providers = self.safe_list(cryptoList, currencyId)
646
717
  if providers is None:
647
- active = True
648
718
  type = 'fiat'
649
719
  else:
650
720
  for j in range(0, len(providers)):
651
721
  provider = providers[j]
722
+ name = self.safe_string(provider, 'name')
723
+ # get network-id by removing extra things
724
+ networkId = name.replace(currencyId + ' ', '')
725
+ networkId = networkId.replace('(', '')
726
+ replaceChar = ')' # transpiler trick
727
+ networkId = networkId.replace(replaceChar, '')
728
+ networkCode = self.network_id_to_code(networkId)
729
+ if not (networkCode in networks):
730
+ networks[networkCode] = {
731
+ 'id': networkId,
732
+ 'network': networkCode,
733
+ 'active': None,
734
+ 'deposit': None,
735
+ 'withdraw': None,
736
+ 'fee': None,
737
+ 'limits': {
738
+ 'withdraw': {
739
+ 'min': None,
740
+ 'max': None,
741
+ },
742
+ 'deposit': {
743
+ 'min': None,
744
+ 'max': None,
745
+ },
746
+ },
747
+ 'info': [], # set, because of multiple network sub-entries
748
+ }
652
749
  typeInner = self.safe_string(provider, 'type')
653
750
  minValue = self.safe_string(provider, 'min')
654
751
  maxValue = self.safe_string(provider, 'max')
655
- if Precise.string_eq(maxValue, '0.0'):
656
- maxValue = None
657
- activeProvider = self.safe_value(provider, 'enabled')
752
+ activeProvider = self.safe_bool(provider, 'enabled')
753
+ networkEntry = networks[networkCode]
658
754
  if typeInner == 'deposit':
659
- if activeProvider and not depositEnabled:
660
- depositEnabled = True
661
- elif not activeProvider:
662
- depositEnabled = False
755
+ networkEntry['deposit'] = activeProvider
756
+ networkEntry['limits']['deposit']['min'] = minValue
757
+ networkEntry['limits']['deposit']['max'] = maxValue
663
758
  elif typeInner == 'withdraw':
664
- if activeProvider and not withdrawEnabled:
665
- withdrawEnabled = True
666
- elif not activeProvider:
667
- withdrawEnabled = False
668
- if activeProvider:
669
- active = True
670
- limitMin = self.number_to_string(limits[typeInner]['min'])
671
- if (limits[typeInner]['min'] is None) or (Precise.string_lt(minValue, limitMin)):
672
- limits[typeInner]['min'] = minValue
673
- limits[typeInner]['max'] = maxValue
674
- if typeInner == 'withdraw':
675
- commissionDesc = self.safe_string(provider, 'commission_desc')
676
- fee = self.parse_fixed_float_value(commissionDesc)
677
- code = self.safe_currency_code(currencyId)
678
- result[code] = {
759
+ networkEntry['withdraw'] = activeProvider
760
+ networkEntry['limits']['withdraw']['min'] = minValue
761
+ networkEntry['limits']['withdraw']['max'] = maxValue
762
+ info = self.safe_list(networkEntry, 'info')
763
+ info.append(provider)
764
+ networkEntry['info'] = info
765
+ networks[networkCode] = networkEntry
766
+ result[code] = self.safe_currency_structure({
679
767
  'id': currencyId,
680
768
  'code': code,
681
- 'name': name,
769
+ 'name': self.safe_string(currency, 'description'),
682
770
  'type': type,
683
- 'active': active,
684
- 'deposit': depositEnabled,
685
- 'withdraw': withdrawEnabled,
686
- 'fee': fee,
771
+ 'active': None,
772
+ 'deposit': None,
773
+ 'withdraw': None,
774
+ 'fee': None,
687
775
  'precision': self.parse_number('1e-8'),
688
- 'limits': limits,
689
- 'info': providers,
690
- 'networks': {},
691
- }
776
+ 'limits': {
777
+ 'withdraw': {
778
+ 'min': None,
779
+ 'max': None,
780
+ },
781
+ 'deposit': {
782
+ 'min': None,
783
+ 'max': None,
784
+ },
785
+ },
786
+ 'info': {
787
+ 'currency': currency,
788
+ 'providers': providers,
789
+ },
790
+ 'networks': networks,
791
+ })
692
792
  return result
693
793
 
694
794
  async def fetch_markets(self, params={}) -> List[Market]:
695
795
  """
696
796
  retrieves data on all markets for exmo
697
- :see: https://documenter.getpostman.com/view/10287440/SzYXWKPi#7de7e75c-5833-45a8-b937-c2276d235aaa
797
+
798
+ https://documenter.getpostman.com/view/10287440/SzYXWKPi#7de7e75c-5833-45a8-b937-c2276d235aaa
799
+
698
800
  :param dict [params]: extra parameters specific to the exchange API endpoint
699
801
  :returns dict[]: an array of objects representing market data
700
802
  """
701
- response = await self.publicGetPairSettings(params)
803
+ promises = []
804
+ promises.append(self.publicGetPairSettings(params))
702
805
  #
703
806
  # {
704
807
  # "BTC_USD":{
@@ -715,8 +818,9 @@ class exmo(Exchange, ImplicitAPI):
715
818
  # }
716
819
  #
717
820
  marginPairsDict: dict = {}
718
- if self.check_required_credentials(False):
719
- marginPairs = await self.privatePostMarginPairList(params)
821
+ fetchMargin = self.check_required_credentials(False)
822
+ if fetchMargin:
823
+ promises.append(self.privatePostMarginPairList(params))
720
824
  #
721
825
  # {
722
826
  # "pairs": [
@@ -746,14 +850,18 @@ class exmo(Exchange, ImplicitAPI):
746
850
  # ]
747
851
  # }
748
852
  #
749
- pairs = self.safe_value(marginPairs, 'pairs')
853
+ responses = await asyncio.gather(*promises)
854
+ spotResponse = responses[0]
855
+ if fetchMargin:
856
+ marginPairs = responses[1]
857
+ pairs = self.safe_list(marginPairs, 'pairs')
750
858
  marginPairsDict = self.index_by(pairs, 'name')
751
- keys = list(response.keys())
859
+ keys = list(spotResponse.keys())
752
860
  result = []
753
861
  for i in range(0, len(keys)):
754
862
  id = keys[i]
755
- market = response[id]
756
- marginMarket = self.safe_value(marginPairsDict, id)
863
+ market = spotResponse[id]
864
+ marginMarket = self.safe_dict(marginPairsDict, id)
757
865
  symbol = id.replace('_', '/')
758
866
  baseId, quoteId = symbol.split('/')
759
867
  base = self.safe_currency_code(baseId)
@@ -818,38 +926,48 @@ class exmo(Exchange, ImplicitAPI):
818
926
  async def fetch_ohlcv(self, symbol: str, timeframe='1m', since: Int = None, limit: Int = None, params={}) -> List[list]:
819
927
  """
820
928
  fetches historical candlestick data containing the open, high, low, and close price, and the volume of a market
821
- :see: https://documenter.getpostman.com/view/10287440/SzYXWKPi#65eeb949-74e5-4631-9184-c38387fe53e8
929
+
930
+ https://documenter.getpostman.com/view/10287440/SzYXWKPi#65eeb949-74e5-4631-9184-c38387fe53e8
931
+
822
932
  :param str symbol: unified symbol of the market to fetch OHLCV data for
823
933
  :param str timeframe: the length of time each candle represents
824
934
  :param int [since]: timestamp in ms of the earliest candle to fetch
825
935
  :param int [limit]: the maximum amount of candles to fetch
826
936
  :param dict [params]: extra parameters specific to the exchange API endpoint
937
+ :param int [params.until]: timestamp in ms of the latest candle to fetch
827
938
  :returns int[][]: A list of candles ordered, open, high, low, close, volume
828
939
  """
829
940
  await self.load_markets()
830
941
  market = self.market(symbol)
942
+ until = self.safe_integer_product(params, 'until', 0.001)
943
+ untilIsDefined = (until is not None)
831
944
  request: dict = {
832
945
  'symbol': market['id'],
833
946
  'resolution': self.safe_string(self.timeframes, timeframe, timeframe),
834
947
  }
835
948
  maxLimit = 3000
836
949
  duration = self.parse_timeframe(timeframe)
837
- now = self.milliseconds()
950
+ now = self.parse_to_int(self.milliseconds() / 1000)
838
951
  if since is None:
952
+ to = min(until, now) if untilIsDefined else now
839
953
  if limit is None:
840
954
  limit = 1000 # cap default at generous amount
841
955
  else:
842
956
  limit = min(limit, maxLimit)
843
- request['from'] = self.parse_to_int(now / 1000) - limit * duration - 1
844
- request['to'] = self.parse_to_int(now / 1000)
957
+ request['from'] = to - (limit * duration) - 1
958
+ request['to'] = to
845
959
  else:
846
- request['from'] = self.parse_to_int(since / 1000) - 1
847
- if limit is None:
848
- limit = maxLimit
960
+ request['from'] = self.parse_to_int(since / 1000)
961
+ if untilIsDefined:
962
+ request['to'] = min(until, now)
849
963
  else:
850
- limit = min(limit, maxLimit)
851
- to = self.sum(since, limit * duration * 1000)
852
- request['to'] = self.parse_to_int(to / 1000)
964
+ if limit is None:
965
+ limit = maxLimit
966
+ else:
967
+ limit = min(limit, maxLimit)
968
+ to = self.sum(since, limit * duration)
969
+ request['to'] = min(to, now)
970
+ params = self.omit(params, 'until')
853
971
  response = await self.publicGetCandlesHistory(self.extend(request, params))
854
972
  #
855
973
  # {
@@ -915,8 +1033,10 @@ class exmo(Exchange, ImplicitAPI):
915
1033
  async def fetch_balance(self, params={}) -> Balances:
916
1034
  """
917
1035
  query for balance and get the amount of funds available for trading or funds locked in orders
918
- :see: https://documenter.getpostman.com/view/10287440/SzYXWKPi#59c5160f-27a1-4d9a-8cfb-7979c7ffaac6
919
- :see: https://documenter.getpostman.com/view/10287440/SzYXWKPi#c8388df7-1f9f-4d41-81c4-5a387d171dc6
1036
+
1037
+ https://documenter.getpostman.com/view/10287440/SzYXWKPi#59c5160f-27a1-4d9a-8cfb-7979c7ffaac6
1038
+ https://documenter.getpostman.com/view/10287440/SzYXWKPi#c8388df7-1f9f-4d41-81c4-5a387d171dc6
1039
+
920
1040
  :param dict [params]: extra parameters specific to the exchange API endpoint
921
1041
  :param str [params.marginMode]: *isolated* fetches the isolated margin balance
922
1042
  :returns dict: a `balance structure <https://docs.ccxt.com/#/?id=balance-structure>`
@@ -959,7 +1079,9 @@ class exmo(Exchange, ImplicitAPI):
959
1079
  async def fetch_order_book(self, symbol: str, limit: Int = None, params={}) -> OrderBook:
960
1080
  """
961
1081
  fetches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
962
- :see: https://documenter.getpostman.com/view/10287440/SzYXWKPi#c60c51a8-e683-4f45-a000-820723d37871
1082
+
1083
+ https://documenter.getpostman.com/view/10287440/SzYXWKPi#c60c51a8-e683-4f45-a000-820723d37871
1084
+
963
1085
  :param str symbol: unified symbol of the market to fetch the order book for
964
1086
  :param int [limit]: the maximum amount of order book entries to return
965
1087
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -976,10 +1098,12 @@ class exmo(Exchange, ImplicitAPI):
976
1098
  result = self.safe_dict(response, market['id'])
977
1099
  return self.parse_order_book(result, market['symbol'], None, 'bid', 'ask')
978
1100
 
979
- async def fetch_order_books(self, symbols: Strings = None, limit: Int = None, params={}):
1101
+ async def fetch_order_books(self, symbols: Strings = None, limit: Int = None, params={}) -> OrderBooks:
980
1102
  """
981
1103
  fetches information on open orders with bid(buy) and ask(sell) prices, volumes and other data for multiple markets
982
- :see: https://documenter.getpostman.com/view/10287440/SzYXWKPi#c60c51a8-e683-4f45-a000-820723d37871
1104
+
1105
+ https://documenter.getpostman.com/view/10287440/SzYXWKPi#c60c51a8-e683-4f45-a000-820723d37871
1106
+
983
1107
  :param str[]|None symbols: list of unified market symbols, all symbols fetched if None, default is None
984
1108
  :param int [limit]: max number of entries per orderbook to return, default is None
985
1109
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -1053,7 +1177,9 @@ class exmo(Exchange, ImplicitAPI):
1053
1177
  async def fetch_tickers(self, symbols: Strings = None, params={}) -> Tickers:
1054
1178
  """
1055
1179
  fetches price tickers for multiple markets, statistical information calculated over the past 24 hours for each market
1056
- :see: https://documenter.getpostman.com/view/10287440/SzYXWKPi#4c8e6459-3503-4361-b012-c34bb9f7e385
1180
+
1181
+ https://documenter.getpostman.com/view/10287440/SzYXWKPi#4c8e6459-3503-4361-b012-c34bb9f7e385
1182
+
1057
1183
  :param str[]|None symbols: unified symbols of the markets to fetch the ticker for, all market tickers are returned if not assigned
1058
1184
  :param dict [params]: extra parameters specific to the exchange API endpoint
1059
1185
  :returns dict: a dictionary of `ticker structures <https://docs.ccxt.com/#/?id=ticker-structure>`
@@ -1089,7 +1215,9 @@ class exmo(Exchange, ImplicitAPI):
1089
1215
  async def fetch_ticker(self, symbol: str, params={}) -> Ticker:
1090
1216
  """
1091
1217
  fetches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
1092
- :see: https://documenter.getpostman.com/view/10287440/SzYXWKPi#4c8e6459-3503-4361-b012-c34bb9f7e385
1218
+
1219
+ https://documenter.getpostman.com/view/10287440/SzYXWKPi#4c8e6459-3503-4361-b012-c34bb9f7e385
1220
+
1093
1221
  :param str symbol: unified symbol of the market to fetch the ticker for
1094
1222
  :param dict [params]: extra parameters specific to the exchange API endpoint
1095
1223
  :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
@@ -1189,7 +1317,9 @@ class exmo(Exchange, ImplicitAPI):
1189
1317
  async def fetch_trades(self, symbol: str, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
1190
1318
  """
1191
1319
  get the list of most recent trades for a particular symbol
1192
- :see: https://documenter.getpostman.com/view/10287440/SzYXWKPi#5a5a9c0d-cf17-47f6-9d62-6d4404ebd5ac
1320
+
1321
+ https://documenter.getpostman.com/view/10287440/SzYXWKPi#5a5a9c0d-cf17-47f6-9d62-6d4404ebd5ac
1322
+
1193
1323
  :param str symbol: unified symbol of the market to fetch trades for
1194
1324
  :param int [since]: timestamp in ms of the earliest trade to fetch
1195
1325
  :param int [limit]: the maximum amount of trades to fetch
@@ -1230,14 +1360,16 @@ class exmo(Exchange, ImplicitAPI):
1230
1360
  async def fetch_my_trades(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}):
1231
1361
  """
1232
1362
  fetch all trades made by the user
1233
- :see: https://documenter.getpostman.com/view/10287440/SzYXWKPi#b8d8d9af-4f46-46a1-939b-ad261d79f452 # spot
1234
- :see: https://documenter.getpostman.com/view/10287440/SzYXWKPi#f4b1aaf8-399f-403b-ab5e-4926d967a106 # margin
1363
+
1364
+ https://documenter.getpostman.com/view/10287440/SzYXWKPi#b8d8d9af-4f46-46a1-939b-ad261d79f452 # spot
1365
+ https://documenter.getpostman.com/view/10287440/SzYXWKPi#f4b1aaf8-399f-403b-ab5e-4926d967a106 # margin
1366
+
1235
1367
  :param str symbol: a symbol is required but it can be a single string, or a non-empty array
1236
1368
  :param int [since]: the earliest time in ms to fetch trades for
1237
1369
  :param int [limit]: *required for margin orders* the maximum number of trades structures to retrieve
1238
1370
  :param dict [params]: extra parameters specific to the exchange API endpoint
1239
- *
1240
- * EXCHANGE SPECIFIC PARAMETERS
1371
+
1372
+ EXCHANGE SPECIFIC PARAMETERS
1241
1373
  :param int [params.offset]: last deal offset, default = 0
1242
1374
  :returns Trade[]: a list of `trade structures <https://docs.ccxt.com/#/?id=trade-structure>`
1243
1375
  """
@@ -1246,7 +1378,7 @@ class exmo(Exchange, ImplicitAPI):
1246
1378
  marginMode = None
1247
1379
  marginMode, params = self.handle_margin_mode_and_params('fetchMyTrades', params)
1248
1380
  if marginMode == 'cross':
1249
- raise BadRequest(self.id + 'only isolated margin is supported')
1381
+ raise BadRequest(self.id + ' only isolated margin is supported')
1250
1382
  await self.load_markets()
1251
1383
  market = self.market(symbol)
1252
1384
  pair = market['id']
@@ -1319,21 +1451,70 @@ class exmo(Exchange, ImplicitAPI):
1319
1451
  result = self.array_concat(result, trades)
1320
1452
  return self.filter_by_since_limit(result, since, limit)
1321
1453
 
1454
+ async def create_market_order_with_cost(self, symbol: str, side: OrderSide, cost: float, params={}):
1455
+ """
1456
+ create a market order by providing the symbol, side and cost
1457
+
1458
+ https://documenter.getpostman.com/view/10287440/SzYXWKPi#80daa469-ec59-4d0a-b229-6a311d8dd1cd
1459
+
1460
+ :param str symbol: unified symbol of the market to create an order in
1461
+ :param str side: 'buy' or 'sell'
1462
+ :param float cost: how much you want to trade in units of the quote currency
1463
+ :param dict [params]: extra parameters specific to the exchange API endpoint
1464
+ :returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
1465
+ """
1466
+ await self.load_markets()
1467
+ params = self.extend(params, {'cost': cost})
1468
+ return await self.create_order(symbol, 'market', side, cost, None, params)
1469
+
1470
+ async def create_market_buy_order_with_cost(self, symbol: str, cost: float, params={}):
1471
+ """
1472
+ create a market buy order by providing the symbol and cost
1473
+
1474
+ https://documenter.getpostman.com/view/10287440/SzYXWKPi#80daa469-ec59-4d0a-b229-6a311d8dd1cd
1475
+
1476
+ :param str symbol: unified symbol of the market to create an order in
1477
+ :param float cost: how much you want to trade in units of the quote currency
1478
+ :param dict [params]: extra parameters specific to the exchange API endpoint
1479
+ :returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
1480
+ """
1481
+ await self.load_markets()
1482
+ params = self.extend(params, {'cost': cost})
1483
+ return await self.create_order(symbol, 'market', 'buy', cost, None, params)
1484
+
1485
+ async def create_market_sell_order_with_cost(self, symbol: str, cost: float, params={}):
1486
+ """
1487
+ create a market sell order by providing the symbol and cost
1488
+
1489
+ https://documenter.getpostman.com/view/10287440/SzYXWKPi#80daa469-ec59-4d0a-b229-6a311d8dd1cd
1490
+
1491
+ :param str symbol: unified symbol of the market to create an order in
1492
+ :param float cost: how much you want to trade in units of the quote currency
1493
+ :param dict [params]: extra parameters specific to the exchange API endpoint
1494
+ :returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
1495
+ """
1496
+ await self.load_markets()
1497
+ params = self.extend(params, {'cost': cost})
1498
+ return await self.create_order(symbol, 'market', 'sell', cost, None, params)
1499
+
1322
1500
  async def create_order(self, symbol: str, type: OrderType, side: OrderSide, amount: float, price: Num = None, params={}):
1323
1501
  """
1324
1502
  create a trade order
1325
- :see: https://documenter.getpostman.com/view/10287440/SzYXWKPi#80daa469-ec59-4d0a-b229-6a311d8dd1cd
1326
- :see: https://documenter.getpostman.com/view/10287440/SzYXWKPi#de6f4321-eeac-468c-87f7-c4ad7062e265 # stop market
1327
- :see: https://documenter.getpostman.com/view/10287440/SzYXWKPi#3561b86c-9ff1-436e-8e68-ac926b7eb523 # margin
1503
+
1504
+ https://documenter.getpostman.com/view/10287440/SzYXWKPi#80daa469-ec59-4d0a-b229-6a311d8dd1cd
1505
+ https://documenter.getpostman.com/view/10287440/SzYXWKPi#de6f4321-eeac-468c-87f7-c4ad7062e265 # stop market
1506
+ https://documenter.getpostman.com/view/10287440/SzYXWKPi#3561b86c-9ff1-436e-8e68-ac926b7eb523 # margin
1507
+
1328
1508
  :param str symbol: unified symbol of the market to create an order in
1329
1509
  :param str type: 'market' or 'limit'
1330
1510
  :param str side: 'buy' or 'sell'
1331
1511
  :param float amount: how much of currency you want to trade in units of base currency
1332
- :param float [price]: the price at which the order is to be fullfilled, in units of the quote currency, ignored in market orders
1512
+ :param float [price]: the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
1333
1513
  :param dict [params]: extra parameters specific to the exchange API endpoint
1334
- :param float [params.stopPrice]: the price at which a trigger order is triggered at
1514
+ :param float [params.triggerPrice]: the price at which a trigger order is triggered at
1335
1515
  :param str [params.timeInForce]: *spot only* 'fok', 'ioc' or 'post_only'
1336
1516
  :param boolean [params.postOnly]: *spot only* True for post only orders
1517
+ :param float [params.cost]: *spot only* *market orders only* the cost of the order in the quote currency for market orders
1337
1518
  :returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
1338
1519
  """
1339
1520
  await self.load_markets()
@@ -1344,11 +1525,12 @@ class exmo(Exchange, ImplicitAPI):
1344
1525
  if marginMode == 'cross':
1345
1526
  raise BadRequest(self.id + ' only supports isolated margin')
1346
1527
  isSpot = (marginMode != 'isolated')
1347
- triggerPrice = self.safe_number_n(params, ['triggerPrice', 'stopPrice', 'stop_price'])
1528
+ triggerPrice = self.safe_string_n(params, ['triggerPrice', 'stopPrice', 'stop_price'])
1529
+ cost = self.safe_string(params, 'cost')
1348
1530
  request: dict = {
1349
1531
  'pair': market['id'],
1350
1532
  # 'leverage': 2,
1351
- 'quantity': self.amount_to_precision(market['symbol'], amount),
1533
+ # 'quantity': self.amount_to_precision(market['symbol'], amount),
1352
1534
  # spot - buy, sell, market_buy, market_sell, market_buy_total, market_sell_total
1353
1535
  # margin - limit_buy, limit_sell, market_buy, market_sell, stop_buy, stop_sell, stop_limit_buy, stop_limit_sell, trailing_stop_buy, trailing_stop_sell
1354
1536
  # 'stop_price': self.price_to_precision(symbol, stopPrice),
@@ -1357,6 +1539,10 @@ class exmo(Exchange, ImplicitAPI):
1357
1539
  # 'client_id': 123, # optional, must be a positive integer
1358
1540
  # 'comment': '', # up to 50 latin symbols, whitespaces, underscores
1359
1541
  }
1542
+ if cost is None:
1543
+ request['quantity'] = self.amount_to_precision(market['symbol'], amount)
1544
+ else:
1545
+ request['quantity'] = self.cost_to_precision(market['symbol'], cost)
1360
1546
  clientOrderId = self.safe_value_2(params, 'client_id', 'clientOrderId')
1361
1547
  if clientOrderId is not None:
1362
1548
  clientOrderId = self.safe_integer_2(params, 'client_id', 'clientOrderId')
@@ -1367,7 +1553,7 @@ class exmo(Exchange, ImplicitAPI):
1367
1553
  leverage = self.safe_number(params, 'leverage')
1368
1554
  if not isSpot and (leverage is None):
1369
1555
  raise ArgumentsRequired(self.id + ' createOrder requires an extra param params["leverage"] for margin orders')
1370
- params = self.omit(params, ['stopPrice', 'stop_price', 'triggerPrice', 'timeInForce', 'client_id', 'clientOrderId'])
1556
+ params = self.omit(params, ['stopPrice', 'stop_price', 'triggerPrice', 'timeInForce', 'client_id', 'clientOrderId', 'cost'])
1371
1557
  if price is not None:
1372
1558
  request['price'] = self.price_to_precision(market['symbol'], price)
1373
1559
  response = None
@@ -1388,7 +1574,8 @@ class exmo(Exchange, ImplicitAPI):
1388
1574
  if type == 'limit':
1389
1575
  request['type'] = side
1390
1576
  elif type == 'market':
1391
- request['type'] = 'market_' + side
1577
+ marketSuffix = '_total' if (cost is not None) else ''
1578
+ request['type'] = 'market_' + side + marketSuffix
1392
1579
  if isPostOnly:
1393
1580
  request['exec_type'] = 'post_only'
1394
1581
  elif timeInForce is not None:
@@ -1414,9 +1601,11 @@ class exmo(Exchange, ImplicitAPI):
1414
1601
  async def cancel_order(self, id: str, symbol: Str = None, params={}):
1415
1602
  """
1416
1603
  cancels an open order
1417
- :see: https://documenter.getpostman.com/view/10287440/SzYXWKPi#1f710d4b-75bc-4b65-ad68-006f863a3f26
1418
- :see: https://documenter.getpostman.com/view/10287440/SzYXWKPi#a4d0aae8-28f7-41ac-94fd-c4030130453d # stop market
1419
- :see: https://documenter.getpostman.com/view/10287440/SzYXWKPi#705dfec5-2b35-4667-862b-faf54eca6209 # margin
1604
+
1605
+ https://documenter.getpostman.com/view/10287440/SzYXWKPi#1f710d4b-75bc-4b65-ad68-006f863a3f26
1606
+ https://documenter.getpostman.com/view/10287440/SzYXWKPi#a4d0aae8-28f7-41ac-94fd-c4030130453d # stop market
1607
+ https://documenter.getpostman.com/view/10287440/SzYXWKPi#705dfec5-2b35-4667-862b-faf54eca6209 # margin
1608
+
1420
1609
  :param str id: order id
1421
1610
  :param str symbol: not used by exmo cancelOrder()
1422
1611
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -1426,7 +1615,7 @@ class exmo(Exchange, ImplicitAPI):
1426
1615
  """
1427
1616
  await self.load_markets()
1428
1617
  request: dict = {}
1429
- stop = self.safe_value_2(params, 'trigger', 'stop')
1618
+ trigger = self.safe_value_2(params, 'trigger', 'stop')
1430
1619
  params = self.omit(params, ['trigger', 'stop'])
1431
1620
  marginMode = None
1432
1621
  marginMode, params = self.handle_margin_mode_and_params('cancelOrder', params)
@@ -1440,7 +1629,7 @@ class exmo(Exchange, ImplicitAPI):
1440
1629
  # {}
1441
1630
  #
1442
1631
  else:
1443
- if stop:
1632
+ if trigger:
1444
1633
  request['parent_order_id'] = id
1445
1634
  response = await self.privatePostStopMarketOrderCancel(self.extend(request, params))
1446
1635
  #
@@ -1460,7 +1649,10 @@ class exmo(Exchange, ImplicitAPI):
1460
1649
  async def fetch_order(self, id: str, symbol: Str = None, params={}):
1461
1650
  """
1462
1651
  *spot only* fetches information on an order made by the user
1463
- :see: https://documenter.getpostman.com/view/10287440/SzYXWKPi#cf27781e-28e5-4b39-a52d-3110f5d22459 # spot
1652
+
1653
+ https://documenter.getpostman.com/view/10287440/SzYXWKPi#cf27781e-28e5-4b39-a52d-3110f5d22459 # spot
1654
+
1655
+ :param str id: order id
1464
1656
  :param str symbol: not used by exmo fetchOrder
1465
1657
  :param dict [params]: extra parameters specific to the exchange API endpoint
1466
1658
  :returns dict: An `order structure <https://docs.ccxt.com/#/?id=order-structure>`
@@ -1498,8 +1690,10 @@ class exmo(Exchange, ImplicitAPI):
1498
1690
  async def fetch_order_trades(self, id: str, symbol: Str = None, since: Int = None, limit: Int = None, params={}):
1499
1691
  """
1500
1692
  fetch all the trades made from a single order
1501
- :see: https://documenter.getpostman.com/view/10287440/SzYXWKPi#cf27781e-28e5-4b39-a52d-3110f5d22459 # spot
1502
- :see: https://documenter.getpostman.com/view/10287440/SzYXWKPi#00810661-9119-46c5-aec5-55abe9cb42c7 # margin
1693
+
1694
+ https://documenter.getpostman.com/view/10287440/SzYXWKPi#cf27781e-28e5-4b39-a52d-3110f5d22459 # spot
1695
+ https://documenter.getpostman.com/view/10287440/SzYXWKPi#00810661-9119-46c5-aec5-55abe9cb42c7 # margin
1696
+
1503
1697
  :param str id: order id
1504
1698
  :param str symbol: unified market symbol
1505
1699
  :param int [since]: the earliest time in ms to fetch trades for
@@ -1570,8 +1764,10 @@ class exmo(Exchange, ImplicitAPI):
1570
1764
  async def fetch_open_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
1571
1765
  """
1572
1766
  fetch all unfilled currently open orders
1573
- :see: https://documenter.getpostman.com/view/10287440/SzYXWKPi#0e135370-daa4-4689-8acd-b6876dee9ba1 # spot open orders
1574
- :see: https://documenter.getpostman.com/view/10287440/SzYXWKPi#a7cfd4f0-476e-4675-b33f-22a46902f245 # margin
1767
+
1768
+ https://documenter.getpostman.com/view/10287440/SzYXWKPi#0e135370-daa4-4689-8acd-b6876dee9ba1 # spot open orders
1769
+ https://documenter.getpostman.com/view/10287440/SzYXWKPi#a7cfd4f0-476e-4675-b33f-22a46902f245 # margin
1770
+
1575
1771
  :param str symbol: unified market symbol
1576
1772
  :param int [since]: the earliest time in ms to fetch open orders for
1577
1773
  :param int [limit]: the maximum number of open orders structures to retrieve
@@ -1804,7 +2000,6 @@ class exmo(Exchange, ImplicitAPI):
1804
2000
  'postOnly': None,
1805
2001
  'side': side,
1806
2002
  'price': price,
1807
- 'stopPrice': triggerPrice,
1808
2003
  'triggerPrice': triggerPrice,
1809
2004
  'cost': cost,
1810
2005
  'amount': amount,
@@ -1819,8 +2014,10 @@ class exmo(Exchange, ImplicitAPI):
1819
2014
  async def fetch_canceled_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}):
1820
2015
  """
1821
2016
  fetches information on multiple canceled orders made by the user
1822
- :see: https://documenter.getpostman.com/view/10287440/SzYXWKPi#1d2524dd-ae6d-403a-a067-77b50d13fbe5 # margin
1823
- :see: https://documenter.getpostman.com/view/10287440/SzYXWKPi#a51be1d0-af5f-44e4-99d7-f7b04c6067d0 # spot canceled orders
2017
+
2018
+ https://documenter.getpostman.com/view/10287440/SzYXWKPi#1d2524dd-ae6d-403a-a067-77b50d13fbe5 # margin
2019
+ https://documenter.getpostman.com/view/10287440/SzYXWKPi#a51be1d0-af5f-44e4-99d7-f7b04c6067d0 # spot canceled orders
2020
+
1824
2021
  :param str symbol: unified market symbol of the market orders were made in
1825
2022
  :param int [since]: timestamp in ms of the earliest order, default is None
1826
2023
  :param int [limit]: max number of orders to return, default is None
@@ -1906,18 +2103,20 @@ class exmo(Exchange, ImplicitAPI):
1906
2103
  async def edit_order(self, id: str, symbol: str, type: OrderType, side: OrderSide, amount: Num = None, price: Num = None, params={}):
1907
2104
  """
1908
2105
  *margin only* edit a trade order
1909
- :see: https://documenter.getpostman.com/view/10287440/SzYXWKPi#f27ee040-c75f-4b59-b608-d05bd45b7899 # margin
2106
+
2107
+ https://documenter.getpostman.com/view/10287440/SzYXWKPi#f27ee040-c75f-4b59-b608-d05bd45b7899 # margin
2108
+
1910
2109
  :param str id: order id
1911
2110
  :param str symbol: unified CCXT market symbol
1912
2111
  :param str type: not used by exmo editOrder
1913
2112
  :param str side: not used by exmo editOrder
1914
2113
  :param float [amount]: how much of the currency you want to trade in units of the base currency
1915
- :param float [price]: the price at which the order is to be fullfilled, in units of the quote currency, ignored in market orders
2114
+ :param float [price]: the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
1916
2115
  :param dict [params]: extra parameters specific to the exchange API endpoint
1917
2116
  :param float [params.triggerPrice]: stop price for stop-market and stop-limit orders
1918
2117
  :param str params['marginMode']: must be set to isolated
1919
- *
1920
- * EXCHANGE SPECIFIC PARAMETERS
2118
+
2119
+ EXCHANGE SPECIFIC PARAMETERS
1921
2120
  :param int [params.distance]: distance for trailing stop orders
1922
2121
  :param int [params.expire]: expiration timestamp in UTC timezone for the order. order will not be expired if expire is 0
1923
2122
  :param str [params.comment]: optional comment for order. up to 50 latin symbols, whitespaces, underscores
@@ -1943,10 +2142,12 @@ class exmo(Exchange, ImplicitAPI):
1943
2142
  response = await self.privatePostMarginUserOrderUpdate(self.extend(request, params))
1944
2143
  return self.parse_order(response)
1945
2144
 
1946
- async def fetch_deposit_address(self, code: str, params={}):
2145
+ async def fetch_deposit_address(self, code: str, params={}) -> DepositAddress:
1947
2146
  """
1948
2147
  fetch the deposit address for a currency associated with self account
1949
- :see: https://documenter.getpostman.com/view/10287440/SzYXWKPi#c8f9ced9-7ab6-4383-a6a4-bc54469ba60e
2148
+
2149
+ https://documenter.getpostman.com/view/10287440/SzYXWKPi#c8f9ced9-7ab6-4383-a6a4-bc54469ba60e
2150
+
1950
2151
  :param str code: unified currency code
1951
2152
  :param dict [params]: extra parameters specific to the exchange API endpoint
1952
2153
  :returns dict: an `address structure <https://docs.ccxt.com/#/?id=address-structure>`
@@ -1970,11 +2171,11 @@ class exmo(Exchange, ImplicitAPI):
1970
2171
  tag = addressAndTag[1]
1971
2172
  self.check_address(address)
1972
2173
  return {
2174
+ 'info': response,
1973
2175
  'currency': code,
2176
+ 'network': None,
1974
2177
  'address': address,
1975
2178
  'tag': tag,
1976
- 'network': None,
1977
- 'info': response,
1978
2179
  }
1979
2180
 
1980
2181
  def get_market_from_trades(self, trades):
@@ -1985,10 +2186,12 @@ class exmo(Exchange, ImplicitAPI):
1985
2186
  return self.markets[symbols[0]]
1986
2187
  return None
1987
2188
 
1988
- async def withdraw(self, code: str, amount: float, address: str, tag=None, params={}):
2189
+ async def withdraw(self, code: str, amount: float, address: str, tag: Str = None, params={}) -> Transaction:
1989
2190
  """
1990
2191
  make a withdrawal
1991
- :see: https://documenter.getpostman.com/view/10287440/SzYXWKPi#3ab9c34d-ad58-4f87-9c57-2e2ea88a8325
2192
+
2193
+ https://documenter.getpostman.com/view/10287440/SzYXWKPi#3ab9c34d-ad58-4f87-9c57-2e2ea88a8325
2194
+
1992
2195
  :param str code: unified currency code
1993
2196
  :param float amount: the amount to withdraw
1994
2197
  :param str address: the address to withdraw to
@@ -2152,7 +2355,9 @@ class exmo(Exchange, ImplicitAPI):
2152
2355
  async def fetch_deposits_withdrawals(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Transaction]:
2153
2356
  """
2154
2357
  fetch history of deposits and withdrawals
2155
- :see: https://documenter.getpostman.com/view/10287440/SzYXWKPi#31e69a33-4849-4e6a-b4b4-6d574238f6a7
2358
+
2359
+ https://documenter.getpostman.com/view/10287440/SzYXWKPi#31e69a33-4849-4e6a-b4b4-6d574238f6a7
2360
+
2156
2361
  :param str [code]: unified currency code for the currency of the deposit/withdrawals, default is None
2157
2362
  :param int [since]: timestamp in ms of the earliest deposit/withdrawal, default is None
2158
2363
  :param int [limit]: max number of deposit/withdrawals to return, default is None
@@ -2202,7 +2407,9 @@ class exmo(Exchange, ImplicitAPI):
2202
2407
  async def fetch_withdrawals(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Transaction]:
2203
2408
  """
2204
2409
  fetch all withdrawals made from an account
2205
- :see: https://documenter.getpostman.com/view/10287440/SzYXWKPi#97f1becd-7aad-4e0e-babe-7bbe09e33706
2410
+
2411
+ https://documenter.getpostman.com/view/10287440/SzYXWKPi#97f1becd-7aad-4e0e-babe-7bbe09e33706
2412
+
2206
2413
  :param str code: unified currency code
2207
2414
  :param int [since]: the earliest time in ms to fetch withdrawals for
2208
2415
  :param int [limit]: the maximum number of withdrawals structures to retrieve
@@ -2252,7 +2459,9 @@ class exmo(Exchange, ImplicitAPI):
2252
2459
  async def fetch_withdrawal(self, id: str, code: Str = None, params={}):
2253
2460
  """
2254
2461
  fetch data on a currency withdrawal via the withdrawal id
2255
- :see: https://documenter.getpostman.com/view/10287440/SzYXWKPi#97f1becd-7aad-4e0e-babe-7bbe09e33706
2462
+
2463
+ https://documenter.getpostman.com/view/10287440/SzYXWKPi#97f1becd-7aad-4e0e-babe-7bbe09e33706
2464
+
2256
2465
  :param str id: withdrawal id
2257
2466
  :param str code: unified currency code of the currency withdrawn, default is None
2258
2467
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -2298,10 +2507,12 @@ class exmo(Exchange, ImplicitAPI):
2298
2507
  first = self.safe_dict(items, 0, {})
2299
2508
  return self.parse_transaction(first, currency)
2300
2509
 
2301
- async def fetch_deposit(self, id=None, code: Str = None, params={}):
2510
+ async def fetch_deposit(self, id: str, code: Str = None, params={}):
2302
2511
  """
2303
2512
  fetch information on a deposit
2304
- :see: https://documenter.getpostman.com/view/10287440/SzYXWKPi#97f1becd-7aad-4e0e-babe-7bbe09e33706
2513
+
2514
+ https://documenter.getpostman.com/view/10287440/SzYXWKPi#97f1becd-7aad-4e0e-babe-7bbe09e33706
2515
+
2305
2516
  :param str id: deposit id
2306
2517
  :param str code: unified currency code, default is None
2307
2518
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -2350,7 +2561,9 @@ class exmo(Exchange, ImplicitAPI):
2350
2561
  async def fetch_deposits(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Transaction]:
2351
2562
  """
2352
2563
  fetch all deposits made to an account
2353
- :see: https://documenter.getpostman.com/view/10287440/SzYXWKPi#97f1becd-7aad-4e0e-babe-7bbe09e33706
2564
+
2565
+ https://documenter.getpostman.com/view/10287440/SzYXWKPi#97f1becd-7aad-4e0e-babe-7bbe09e33706
2566
+
2354
2567
  :param str code: unified currency code
2355
2568
  :param int [since]: the earliest time in ms to fetch deposits for
2356
2569
  :param int [limit]: the maximum number of deposits structures to retrieve