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