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/ace.py DELETED
@@ -1,1012 +0,0 @@
1
- # -*- coding: utf-8 -*-
2
-
3
- # PLEASE DO NOT EDIT THIS FILE, IT IS GENERATED AND WILL BE OVERWRITTEN:
4
- # https://github.com/ccxt/ccxt/blob/master/CONTRIBUTING.md#how-to-contribute-code
5
-
6
- from ccxt.base.exchange import Exchange
7
- from ccxt.abstract.ace import ImplicitAPI
8
- from ccxt.base.types import Balances, Int, Market, Num, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade
9
- from typing import List
10
- from ccxt.base.errors import AuthenticationError
11
- from ccxt.base.errors import ArgumentsRequired
12
- from ccxt.base.errors import BadRequest
13
- from ccxt.base.errors import InsufficientFunds
14
- from ccxt.base.errors import InvalidOrder
15
- from ccxt.base.decimal_to_precision import TICK_SIZE
16
- from ccxt.base.precise import Precise
17
-
18
-
19
- class ace(Exchange, ImplicitAPI):
20
-
21
- def describe(self):
22
- return self.deep_extend(super(ace, self).describe(), {
23
- 'id': 'ace',
24
- 'name': 'ACE',
25
- 'countries': ['TW'], # Taiwan
26
- 'version': 'v2',
27
- 'rateLimit': 100,
28
- 'pro': False,
29
- 'has': {
30
- 'CORS': None,
31
- 'spot': True,
32
- 'margin': False,
33
- 'swap': False,
34
- 'future': False,
35
- 'option': False,
36
- 'cancelAllOrders': False,
37
- 'cancelOrder': True,
38
- 'cancelOrders': False,
39
- 'closeAllPositions': False,
40
- 'closePosition': False,
41
- 'createOrder': True,
42
- 'editOrder': False,
43
- 'fetchBalance': True,
44
- 'fetchBorrowRateHistories': False,
45
- 'fetchBorrowRateHistory': False,
46
- 'fetchClosedOrders': False,
47
- 'fetchCrossBorrowRate': False,
48
- 'fetchCrossBorrowRates': False,
49
- 'fetchCurrencies': False,
50
- 'fetchDepositAddress': False,
51
- 'fetchDeposits': False,
52
- 'fetchFundingHistory': False,
53
- 'fetchFundingRate': False,
54
- 'fetchFundingRateHistory': False,
55
- 'fetchFundingRates': False,
56
- 'fetchIndexOHLCV': False,
57
- 'fetchIsolatedBorrowRate': False,
58
- 'fetchIsolatedBorrowRates': False,
59
- 'fetchMarginMode': False,
60
- 'fetchMarkets': True,
61
- 'fetchMarkOHLCV': False,
62
- 'fetchMyTrades': True,
63
- 'fetchOHLCV': True,
64
- 'fetchOpenInterestHistory': False,
65
- 'fetchOpenOrders': True,
66
- 'fetchOrder': True,
67
- 'fetchOrderBook': True,
68
- 'fetchOrders': False,
69
- 'fetchOrderTrades': True,
70
- 'fetchPosition': False,
71
- 'fetchPositionHistory': False,
72
- 'fetchPositionMode': False,
73
- 'fetchPositions': False,
74
- 'fetchPositionsForSymbol': False,
75
- 'fetchPositionsHistory': False,
76
- 'fetchPositionsRisk': False,
77
- 'fetchPremiumIndexOHLCV': False,
78
- 'fetchTicker': True,
79
- 'fetchTickers': True,
80
- 'fetchTime': False,
81
- 'fetchTrades': False,
82
- 'fetchTradingFee': False,
83
- 'fetchTradingFees': False,
84
- 'fetchTransactionFees': False,
85
- 'fetchTransactions': False,
86
- 'fetchTransfer': False,
87
- 'fetchTransfers': False,
88
- 'fetchWithdrawal': False,
89
- 'fetchWithdrawals': False,
90
- 'setLeverage': False,
91
- 'setMarginMode': False,
92
- 'transfer': False,
93
- 'withdraw': False,
94
- 'ws': False,
95
- },
96
- 'timeframes': {
97
- '1m': 1,
98
- '5m': 5,
99
- '10m': 10,
100
- '30m': 10,
101
- '1h': 60,
102
- '2h': 120,
103
- '4h': 240,
104
- '8h': 480,
105
- '12h': 720,
106
- '1d': 24,
107
- '1w': 70,
108
- '1M': 31,
109
- },
110
- 'urls': {
111
- 'logo': 'https://user-images.githubusercontent.com/1294454/216908003-fb314cf6-e66e-471c-b91d-1d86e4baaa90.jpg',
112
- 'api': {
113
- 'public': 'https://ace.io/polarisex',
114
- 'private': 'https://ace.io/polarisex/open',
115
- },
116
- 'www': 'https://ace.io/',
117
- 'doc': [
118
- 'https://github.com/ace-exchange/ace-offical-api-docs',
119
- ],
120
- 'fees': 'https://helpcenter.ace.io/hc/zh-tw/articles/360018609132-%E8%B2%BB%E7%8E%87%E8%AA%AA%E6%98%8E',
121
- },
122
- 'requiredCredentials': {
123
- 'apiKey': True,
124
- 'secret': True,
125
- },
126
- 'api': {
127
- 'public': {
128
- 'get': [
129
- 'oapi/v2/list/tradePrice',
130
- 'oapi/v2/list/marketPair',
131
- 'open/v2/public/getOrderBook',
132
- ],
133
- },
134
- 'private': {
135
- 'post': [
136
- 'v2/coin/customerAccount',
137
- 'v2/kline/getKline',
138
- 'v2/order/order',
139
- 'v2/order/cancel',
140
- 'v2/order/getOrderList',
141
- 'v2/order/showOrderStatus',
142
- 'v2/order/showOrderHistory',
143
- 'v2/order/getTradeList',
144
- ],
145
- },
146
- },
147
- 'fees': {
148
- 'trading': {
149
- 'percentage': True,
150
- 'maker': self.parse_number('0.0005'),
151
- 'taker': self.parse_number('0.001'),
152
- },
153
- },
154
- 'options': {
155
- 'brokerId': 'ccxt',
156
- },
157
- 'precisionMode': TICK_SIZE,
158
- 'exceptions': {
159
- 'exact': {
160
- '2003': InvalidOrder,
161
- '2004': InvalidOrder,
162
- '2005': InvalidOrder,
163
- '2021': InsufficientFunds,
164
- '2036': InvalidOrder,
165
- '2039': InvalidOrder,
166
- '2053': InvalidOrder,
167
- '2061': BadRequest,
168
- '2063': InvalidOrder,
169
- '9996': BadRequest,
170
- '10012': AuthenticationError,
171
- '20182': AuthenticationError,
172
- '20183': InvalidOrder,
173
- },
174
- 'broad': {
175
- },
176
- },
177
- 'commonCurrencies': {
178
- },
179
- })
180
-
181
- def fetch_markets(self, params={}) -> List[Market]:
182
- """
183
- retrieves data on all markets for ace
184
- :see: https://github.com/ace-exchange/ace-official-api-docs/blob/master/api_v2.md#oapi-api---market-pair
185
- :param dict [params]: extra parameters specific to the exchange API endpoint
186
- :returns dict[]: an array of objects representing market data
187
- """
188
- response = self.publicGetOapiV2ListMarketPair()
189
- #
190
- # [
191
- # {
192
- # "symbol":"BTC/USDT",
193
- # "base":"btc",
194
- # "baseCurrencyId": "122"
195
- # "quote":"usdt",
196
- # "basePrecision":"8",
197
- # "quotePrecision":"5",
198
- # "minLimitBaseAmount":"0.1",
199
- # "maxLimitBaseAmount":"480286"
200
- # }
201
- # ]
202
- #
203
- return self.parse_markets(response)
204
-
205
- def parse_market(self, market: dict) -> Market:
206
- baseId = self.safe_string(market, 'base')
207
- base = self.safe_currency_code(baseId)
208
- quoteId = self.safe_string(market, 'quote')
209
- quote = self.safe_currency_code(quoteId)
210
- symbol = base + '/' + quote
211
- return {
212
- 'id': self.safe_string(market, 'symbol'),
213
- 'uppercaseId': None,
214
- 'symbol': symbol,
215
- 'base': base,
216
- 'baseId': baseId,
217
- 'quote': quote,
218
- 'quoteId': quoteId,
219
- 'settle': None,
220
- 'settleId': None,
221
- 'type': 'spot',
222
- 'spot': True,
223
- 'margin': False,
224
- 'swap': False,
225
- 'future': False,
226
- 'option': False,
227
- 'contract': False,
228
- 'linear': None,
229
- 'inverse': None,
230
- 'contractSize': None,
231
- 'expiry': None,
232
- 'expiryDatetime': None,
233
- 'strike': None,
234
- 'optionType': None,
235
- 'limits': {
236
- 'amount': {
237
- 'min': self.safe_number(market, 'minLimitBaseAmount'),
238
- 'max': self.safe_number(market, 'maxLimitBaseAmount'),
239
- },
240
- 'price': {
241
- 'min': None,
242
- 'max': None,
243
- },
244
- 'cost': {
245
- 'min': None,
246
- 'max': None,
247
- },
248
- 'leverage': {
249
- 'min': None,
250
- 'max': None,
251
- },
252
- },
253
- 'precision': {
254
- 'price': self.parse_number(self.parse_precision(self.safe_string(market, 'quotePrecision'))),
255
- 'amount': self.parse_number(self.parse_precision(self.safe_string(market, 'basePrecision'))),
256
- },
257
- 'active': None,
258
- 'created': None,
259
- 'info': market,
260
- }
261
-
262
- def parse_ticker(self, ticker: dict, market: Market = None) -> Ticker:
263
- #
264
- # {
265
- # "base_volume":229196.34035399999,
266
- # "last_price":11881.06,
267
- # "quote_volume":19.2909
268
- # }
269
- #
270
- marketId = self.safe_string(ticker, 'id')
271
- symbol = self.safe_symbol(marketId, market)
272
- return self.safe_ticker({
273
- 'symbol': symbol,
274
- 'timestamp': None,
275
- 'datetime': None,
276
- 'high': None,
277
- 'low': None,
278
- 'bid': None,
279
- 'bidVolume': None,
280
- 'ask': None,
281
- 'askVolume': None,
282
- 'vwap': None,
283
- 'open': None,
284
- 'close': self.safe_string(ticker, 'last_price'),
285
- 'last': self.safe_string(ticker, 'last_price'),
286
- 'previousClose': None,
287
- 'change': None,
288
- 'percentage': None,
289
- 'average': None,
290
- 'baseVolume': self.safe_string(ticker, 'base_volume'),
291
- 'quoteVolume': self.safe_string(ticker, 'quote_volume'),
292
- 'info': ticker,
293
- }, market)
294
-
295
- def fetch_ticker(self, symbol: str, params={}) -> Ticker:
296
- """
297
- fetches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
298
- :see: https://github.com/ace-exchange/ace-official-api-docs/blob/master/api_v2.md#oapi-api---trade-data
299
- :param str symbol: unified symbol of the market to fetch the ticker for
300
- :param dict [params]: extra parameters specific to the exchange API endpoint
301
- :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
302
- """
303
- self.load_markets()
304
- market = self.market(symbol)
305
- response = self.publicGetOapiV2ListTradePrice(params)
306
- marketId = market['id']
307
- ticker = self.safe_value(response, marketId, {})
308
- #
309
- # {
310
- # "BTC/USDT":{
311
- # "base_volume":229196.34035399999,
312
- # "last_price":11881.06,
313
- # "quote_volume":19.2909
314
- # }
315
- # }
316
- #
317
- return self.parse_ticker(ticker, market)
318
-
319
- def fetch_tickers(self, symbols: Strings = None, params={}) -> Tickers:
320
- """
321
- fetches price tickers for multiple markets, statistical information calculated over the past 24 hours for each market
322
- :see: https://github.com/ace-exchange/ace-official-api-docs/blob/master/api_v2.md#oapi-api---trade-data
323
- :param str[]|None symbols: unified symbols of the markets to fetch the ticker for, all market tickers are returned if not assigned
324
- :param dict [params]: extra parameters specific to the exchange API endpoint
325
- :returns dict: a dictionary of `ticker structures <https://docs.ccxt.com/#/?id=ticker-structure>`
326
- """
327
- self.load_markets()
328
- response = self.publicGetOapiV2ListTradePrice()
329
- #
330
- # {
331
- # "BTC/USDT":{
332
- # "base_volume":229196.34035399999,
333
- # "last_price":11881.06,
334
- # "quote_volume":19.2909
335
- # }
336
- # }
337
- #
338
- tickers = []
339
- pairs = list(response.keys())
340
- for i in range(0, len(pairs)):
341
- marketId = pairs[i]
342
- market = self.safe_market(marketId)
343
- rawTicker = self.safe_value(response, marketId)
344
- ticker = self.parse_ticker(rawTicker, market)
345
- tickers.append(ticker)
346
- return self.filter_by_array_tickers(tickers, 'symbol', symbols)
347
-
348
- def fetch_order_book(self, symbol: str, limit: Int = None, params={}) -> OrderBook:
349
- """
350
- fetches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
351
- :see: https://github.com/ace-exchange/ace-official-api-docs/blob/master/api_v2.md#open-api---order-books
352
- :param str symbol: unified symbol of the market to fetch the order book for
353
- :param int [limit]: the maximum amount of order book entries to return
354
- :param dict [params]: extra parameters specific to the exchange API endpoint
355
- :returns dict: A dictionary of `order book structures <https://docs.ccxt.com/#/?id=order-book-structure>` indexed by market symbols
356
- """
357
- self.load_markets()
358
- market = self.market(symbol)
359
- request: dict = {
360
- 'quoteCurrencyId': market['quoteId'],
361
- 'baseCurrencyId': market['baseId'],
362
- }
363
- if limit is not None:
364
- request['depth'] = limit
365
- response = self.publicGetOpenV2PublicGetOrderBook(self.extend(request, params))
366
- #
367
- # {
368
- # "attachment": {
369
- # "baseCurrencyId": "2",
370
- # "quoteCurrencyId": "14",
371
- # "baseCurrencyName": "BTC",
372
- # "quoteCurrencyName": "USDT",
373
- # "bids": [
374
- # [
375
- # "0.0009",
376
- # "19993.53"
377
- # ],
378
- # [
379
- # "0.001",
380
- # "19675.33"
381
- # ],
382
- # [
383
- # "0.001",
384
- # "19357.13"
385
- # ]
386
- # ],
387
- # "asks": [
388
- # [
389
- # "0.001",
390
- # "20629.92"
391
- # ],
392
- # [
393
- # "0.001",
394
- # "20948.12"
395
- # ]
396
- # ]
397
- # },
398
- # "message": null,
399
- # "parameters": null,
400
- # "status": 200
401
- # }
402
- #
403
- orderBook = self.safe_dict(response, 'attachment')
404
- return self.parse_order_book(orderBook, market['symbol'], None, 'bids', 'asks')
405
-
406
- def parse_ohlcv(self, ohlcv, market: Market = None) -> list:
407
- #
408
- # {
409
- # "changeRate": 0,
410
- # "volume": 0,
411
- # "closePrice": 101000.0,
412
- # "lowPrice": 101000.0,
413
- # "highPrice": 101000.0,
414
- # "highPrice": 1573195740000L,
415
- # "openPrice": 101000.0,
416
- # "current": 101000.0,
417
- # "currentTime": "2019-11-08 14:49:00",
418
- # "createTime": "2019-11-08 14:49:00"
419
- # }
420
- #
421
- dateTime = self.safe_string(ohlcv, 'createTime')
422
- timestamp = self.parse8601(dateTime)
423
- if timestamp is not None:
424
- timestamp = timestamp - 28800000 # 8 hours
425
- return [
426
- timestamp,
427
- self.safe_number(ohlcv, 'openPrice'),
428
- self.safe_number(ohlcv, 'highPrice'),
429
- self.safe_number(ohlcv, 'lowPrice'),
430
- self.safe_number(ohlcv, 'closePrice'),
431
- self.safe_number(ohlcv, 'volume'),
432
- ]
433
-
434
- def fetch_ohlcv(self, symbol: str, timeframe='1m', since: Int = None, limit: Int = None, params={}) -> List[list]:
435
- """
436
- fetches historical candlestick data containing the open, high, low, and close price, and the volume of a market
437
- :see: https://github.com/ace-exchange/ace-official-api-docs/blob/master/api_v2.md#open-api---klinecandlestick-data
438
- :param str symbol: unified symbol of the market to fetch OHLCV data for
439
- :param str timeframe: the length of time each candle represents
440
- :param int [since]: timestamp in ms of the earliest candle to fetch
441
- :param int [limit]: the maximum amount of candles to fetch
442
- :param dict [params]: extra parameters specific to the exchange API endpoint
443
- :returns int[][]: A list of candles ordered, open, high, low, close, volume
444
- """
445
- self.load_markets()
446
- market = self.market(symbol)
447
- request: dict = {
448
- 'duration': self.timeframes[timeframe],
449
- 'quoteCurrencyId': market['quoteId'],
450
- 'baseCurrencyId': market['baseId'],
451
- }
452
- if limit is not None:
453
- request['limit'] = limit
454
- if since is not None:
455
- request['startTime'] = since
456
- response = self.privatePostV2KlineGetKline(self.extend(request, params))
457
- data = self.safe_value(response, 'attachment', [])
458
- #
459
- # {
460
- # "attachment":[
461
- # {
462
- # "changeRate": 0,
463
- # "closePrice": 101000.0,
464
- # "volume": 0,
465
- # "lowPrice": 101000.0,
466
- # "highPrice": 101000.0,
467
- # "highPrice": 1573195740000L,
468
- # "openPrice": 101000.0,
469
- # "current": 101000.0,
470
- # "currentTime": "2019-11-08 14:49:00",
471
- # "createTime": "2019-11-08 14:49:00"
472
- # }
473
- # ]
474
- # }
475
- #
476
- return self.parse_ohlcvs(data, market, timeframe, since, limit)
477
-
478
- def parse_order_status(self, status: Str):
479
- statuses: dict = {
480
- '0': 'open',
481
- '1': 'open',
482
- '2': 'closed',
483
- '4': 'canceled',
484
- '5': 'canceled',
485
- }
486
- return self.safe_string(statuses, status, None)
487
-
488
- def parse_order(self, order: dict, market: Market = None) -> Order:
489
- #
490
- # createOrder
491
- # "15697850529570392100421100482693"
492
- #
493
- # fetchOpenOrders
494
- # {
495
- # "uid": 0,
496
- # "orderNo": "16113081376560890227301101413941",
497
- # "orderTime": "2021-01-22 17:35:37",
498
- # "orderTimeStamp": 1611308137656,
499
- # "baseCurrencyId": 1,
500
- # "baseCurrencyName": "TWD",
501
- # "quoteCurrencyId": 14,
502
- # "quoteCurrencyName": "USDT",
503
- # "buyOrSell": "1",
504
- # "num": "6.0000000000000000",
505
- # "price": "32.5880000000000000",
506
- # "remainNum": "2.0000000000000000",
507
- # "tradeNum": "4.0000000000000000",
508
- # "tradePrice": "31.19800000000000000000",
509
- # "tradeAmount": "124.7920000000000000",
510
- # "tradeRate": "0.66666666666666666667",
511
- # "status": 1,
512
- # "type": 1
513
- # }
514
- #
515
- id: Str
516
- timestamp: Int = None
517
- symbol: Str = None
518
- price: Str = None
519
- amount: Str = None
520
- side: Str = None
521
- type: Str = None
522
- status: Str = None
523
- filled: Str = None
524
- remaining: Str = None
525
- average: Str = None
526
- if isinstance(order, str):
527
- id = order
528
- else:
529
- id = self.safe_string(order, 'orderNo')
530
- timestamp = self.safe_integer(order, 'orderTimeStamp')
531
- if timestamp is None:
532
- dateTime = self.safe_string(order, 'orderTime')
533
- if dateTime is not None:
534
- timestamp = self.parse8601(dateTime)
535
- timestamp = timestamp - 28800000 # 8 hours
536
- orderSide = self.safe_number(order, 'buyOrSell')
537
- if orderSide is not None:
538
- side = 'buy' if (orderSide == 1) else 'sell'
539
- amount = self.safe_string(order, 'num')
540
- price = self.safe_string(order, 'price')
541
- quoteId = self.safe_string(order, 'quoteCurrencyName')
542
- baseId = self.safe_string(order, 'baseCurrencyName')
543
- if quoteId is not None and baseId is not None:
544
- symbol = baseId + '/' + quoteId
545
- orderType = self.safe_number(order, 'type')
546
- if orderType is not None:
547
- type = 'limit' if (orderType == 1) else 'market'
548
- filled = self.safe_string(order, 'tradeNum')
549
- remaining = self.safe_string(order, 'remainNum')
550
- status = self.parse_order_status(self.safe_string(order, 'status'))
551
- average = self.safe_string(order, 'averagePrice')
552
- return self.safe_order({
553
- 'id': id,
554
- 'clientOrderId': None,
555
- 'timestamp': timestamp,
556
- 'datetime': self.iso8601(timestamp),
557
- 'lastTradeTimestamp': None,
558
- 'symbol': symbol,
559
- 'type': type,
560
- 'timeInForce': None,
561
- 'postOnly': None,
562
- 'side': side,
563
- 'price': price,
564
- 'stopPrice': None,
565
- 'amount': amount,
566
- 'cost': None,
567
- 'average': average,
568
- 'filled': filled,
569
- 'remaining': remaining,
570
- 'status': status,
571
- 'fee': None,
572
- 'trades': None,
573
- 'info': order,
574
- }, market)
575
-
576
- def create_order(self, symbol: str, type: OrderType, side: OrderSide, amount: float, price: Num = None, params={}):
577
- """
578
- create a trade order
579
- :see: https://github.com/ace-exchange/ace-official-api-docs/blob/master/api_v2.md#open-api---new-order
580
- :param str symbol: unified symbol of the market to create an order in
581
- :param str type: 'market' or 'limit'
582
- :param str side: 'buy' or 'sell'
583
- :param float amount: how much of currency you want to trade in units of base currency
584
- :param float [price]: the price at which the order is to be fullfilled, in units of the quote currency, ignored in market orders
585
- :param dict [params]: extra parameters specific to the exchange API endpoint
586
- :returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
587
- """
588
- self.load_markets()
589
- market = self.market(symbol)
590
- orderType = type.upper()
591
- orderSide = side.upper()
592
- request: dict = {
593
- 'baseCurrencyId': market['baseId'],
594
- 'quoteCurrencyId': market['quoteId'],
595
- 'type': 1 if (orderType == 'LIMIT') else 2,
596
- 'buyOrSell': 1 if (orderSide == 'BUY') else 2,
597
- 'num': self.amount_to_precision(symbol, amount),
598
- }
599
- if type == 'limit':
600
- request['price'] = self.price_to_precision(symbol, price)
601
- response = self.privatePostV2OrderOrder(self.extend(request, params))
602
- #
603
- # {
604
- # "attachment": "15697850529570392100421100482693",
605
- # "message": null,
606
- # "parameters": null,
607
- # "status": 200
608
- # }
609
- #
610
- data = self.safe_dict(response, 'attachment')
611
- return self.parse_order(data, market)
612
-
613
- def cancel_order(self, id: str, symbol: Str = None, params={}):
614
- """
615
- cancels an open order
616
- :see: https://github.com/ace-exchange/ace-official-api-docs/blob/master/api_v2.md#open-api---cancel-order
617
- :param str id: order id
618
- :param str symbol: unified symbol of the market the order was made in
619
- :param dict [params]: extra parameters specific to the exchange API endpoint
620
- :returns dict: An `order structure <https://docs.ccxt.com/#/?id=order-structure>`
621
- """
622
- self.load_markets()
623
- request: dict = {
624
- 'orderNo': id,
625
- }
626
- response = self.privatePostV2OrderCancel(self.extend(request, params))
627
- #
628
- # {
629
- # "attachment": 200,
630
- # "message": null,
631
- # "parameters": null,
632
- # "status": 200
633
- # }
634
- #
635
- return response
636
-
637
- def fetch_order(self, id: str, symbol: Str = None, params={}):
638
- """
639
- fetches information on an order made by the user
640
- :see: https://github.com/ace-exchange/ace-official-api-docs/blob/master/api_v2.md#open-api---order-status
641
- :param str symbol: unified symbol of the market the order was made in
642
- :param dict [params]: extra parameters specific to the exchange API endpoint
643
- :returns dict: An `order structure <https://docs.ccxt.com/#/?id=order-structure>`
644
- """
645
- self.load_markets()
646
- request: dict = {
647
- 'orderNo': id,
648
- }
649
- response = self.privatePostV2OrderShowOrderStatus(self.extend(request, params))
650
- #
651
- # {
652
- # "attachment": {
653
- # "buyOrSell": 1,
654
- # "averagePrice": "490849.75000000",
655
- # "num": "0.00000000",
656
- # "orderTime": "2022-11-29 18:03:06.318",
657
- # "price": "490849.75000000",
658
- # "status": 4,
659
- # "tradeNum": "0.02697000",
660
- # "remainNum": "0.97303000",
661
- # "baseCurrencyId": 2,
662
- # "baseCurrencyName": "BTC",
663
- # "quoteCurrencyId": 1,
664
- # "quoteCurrencyName": "TWD",
665
- # "orderNo": "16697161898600391472461100244406"
666
- # },
667
- # "message": null,
668
- # "parameters": null,
669
- # "status": 200
670
- # }
671
- #
672
- data = self.safe_dict(response, 'attachment')
673
- return self.parse_order(data, None)
674
-
675
- def fetch_open_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
676
- """
677
- fetch all unfilled currently open orders
678
- :see: https://github.com/ace-exchange/ace-official-api-docs/blob/master/api_v2.md#open-api---order-list
679
- :param str symbol: unified market symbol of the market orders were made in
680
- :param int [since]: the earliest time in ms to fetch orders for
681
- :param int [limit]: the maximum number of order structures to retrieve
682
- :param dict [params]: extra parameters specific to the exchange API endpoint
683
- :returns Order[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
684
- """
685
- if symbol is None:
686
- raise ArgumentsRequired(self.id + ' fetchOpenOrders() requires a symbol argument')
687
- self.load_markets()
688
- market = self.market(symbol)
689
- request: dict = {
690
- 'quoteCurrencyId': market['quoteId'],
691
- 'baseCurrencyId': market['baseId'],
692
- # 'start': 0,
693
- }
694
- if limit is not None:
695
- request['size'] = limit
696
- response = self.privatePostV2OrderGetOrderList(self.extend(request, params))
697
- orders = self.safe_value(response, 'attachment')
698
- #
699
- # {
700
- # "attachment": [
701
- # {
702
- # "uid": 0,
703
- # "orderNo": "16113081376560890227301101413941",
704
- # "orderTime": "2021-01-22 17:35:37",
705
- # "orderTimeStamp": 1611308137656,
706
- # "baseCurrencyId": 1,
707
- # "baseCurrencyName": "TWD",
708
- # "quoteCurrencyId": 14,
709
- # "quoteCurrencyName": "USDT",
710
- # "buyOrSell": "1",
711
- # "num": "6.0000000000000000",
712
- # "price": "32.5880000000000000",
713
- # "remainNum": "2.0000000000000000",
714
- # "tradeNum": "4.0000000000000000",
715
- # "tradePrice": "31.19800000000000000000",
716
- # "tradeAmount": "124.7920000000000000",
717
- # "tradeRate": "0.66666666666666666667",
718
- # "status": 1,
719
- # "type": 1
720
- # }
721
- # ],
722
- # "message": null,
723
- # "parameters": null,
724
- # "status": 200
725
- # }
726
- #
727
- return self.parse_orders(orders, market, since, limit)
728
-
729
- def parse_trade(self, trade: dict, market: Market = None) -> Trade:
730
- #
731
- # fetchOrderTrades
732
- # {
733
- # "amount": 0.0030965,
734
- # "tradeNo": "15681920522485652100751000417788",
735
- # "price": "0.03096500",
736
- # "num": "0.10000000",
737
- # "bi": 1,
738
- # "time": "2019-09-11 16:54:12.248"
739
- # }
740
- #
741
- # fetchMyTrades
742
- # {
743
- # "buyOrSell": 1,
744
- # "orderNo": "16708156853695560053601100247906",
745
- # "num": "1",
746
- # "price": "16895",
747
- # "orderAmount": "16895",
748
- # "tradeNum": "0.1",
749
- # "tradePrice": "16895",
750
- # "tradeAmount": "1689.5",
751
- # "fee": "0",
752
- # "feeSave": "0",
753
- # "status": 1,
754
- # "isSelf": False,
755
- # "tradeNo": "16708186395087940051961000274150",
756
- # "tradeTime": "2022-12-12 12:17:19",
757
- # "tradeTimestamp": 1670818639508,
758
- # "quoteCurrencyId": 14,
759
- # "quoteCurrencyName": "USDT",
760
- # "baseCurrencyId": 2,
761
- # "baseCurrencyName": "BTC"
762
- # }
763
- id = self.safe_string(trade, 'tradeNo')
764
- price = self.safe_string(trade, 'price')
765
- amount = self.safe_string(trade, 'num')
766
- timestamp = self.safe_integer(trade, 'tradeTimestamp')
767
- if timestamp is None:
768
- datetime = self.safe_string_2(trade, 'time', 'tradeTime')
769
- timestamp = self.parse8601(datetime)
770
- timestamp = timestamp - 28800000 # 8 hours normalize timestamp
771
- symbol = market['symbol']
772
- quoteId = self.safe_string(trade, 'quoteCurrencyName')
773
- baseId = self.safe_string(trade, 'baseCurrencyName')
774
- if quoteId is not None and baseId is not None:
775
- symbol = baseId + '/' + quoteId
776
- side: Str = None
777
- tradeSide = self.safe_integer(trade, 'buyOrSell')
778
- if tradeSide is not None:
779
- side = 'buy' if (tradeSide == 1) else 'sell'
780
- feeString = self.safe_string(trade, 'fee')
781
- fee = None
782
- if feeString is not None:
783
- feeSaveString = self.safe_string(trade, 'feeSave')
784
- fee = {
785
- 'cost': Precise.string_sub(feeString, feeSaveString),
786
- 'currency': quoteId,
787
- }
788
- return self.safe_trade({
789
- 'info': trade,
790
- 'id': id,
791
- 'order': self.safe_string(trade, 'orderNo'),
792
- 'symbol': symbol,
793
- 'side': side,
794
- 'type': None,
795
- 'takerOrMaker': None,
796
- 'price': price,
797
- 'amount': amount,
798
- 'cost': None,
799
- 'fee': fee,
800
- 'timestamp': timestamp,
801
- 'datetime': self.iso8601(timestamp),
802
- }, market)
803
-
804
- def fetch_order_trades(self, id: str, symbol: Str = None, since: Int = None, limit: Int = None, params={}):
805
- """
806
- fetch all the trades made from a single order
807
- :see: https://github.com/ace-exchange/ace-official-api-docs/blob/master/api_v2.md#open-api---order-history
808
- :param str id: order id
809
- :param str symbol: unified market symbol
810
- :param int [since]: the earliest time in ms to fetch trades for
811
- :param int [limit]: the maximum number of trades to retrieve
812
- :param dict [params]: extra parameters specific to the exchange API endpoint
813
- :returns dict[]: a list of `trade structures <https://docs.ccxt.com/#/?id=trade-structure>`
814
- """
815
- self.load_markets()
816
- market = self.safe_market(symbol)
817
- request: dict = {
818
- 'orderNo': id,
819
- }
820
- response = self.privatePostV2OrderShowOrderHistory(self.extend(request, params))
821
- #
822
- # {
823
- # "attachment": {
824
- # "order": {
825
- # "buyOrSell": 1,
826
- # "averagePrice": "491343.74000000",
827
- # "num": "1.00000000",
828
- # "orderTime": "2022-11-29 18:32:22.232",
829
- # "price": "491343.74000000",
830
- # "status": 1,
831
- # "tradeNum": "0.01622200",
832
- # "remainNum": "0.98377800",
833
- # "baseCurrencyId": 2,
834
- # "baseCurrencyName": "BTC",
835
- # "quoteCurrencyId": 1,
836
- # "quoteCurrencyName": "TWD",
837
- # "orderNo": "16697179457740441472471100214402"
838
- # },
839
- # "trades": [
840
- # {
841
- # "price": "491343.74000000",
842
- # "num": "0.01622200",
843
- # "time": "2022-11-29 18:32:25.789",
844
- # "tradeNo": "16697179457897791471461000223437",
845
- # "amount": "7970.57815028"
846
- # }
847
- # ]
848
- # },
849
- # "message": null,
850
- # "parameters": null,
851
- # "status": 200
852
- # }
853
- #
854
- data = self.safe_value(response, 'attachment')
855
- trades = self.safe_list(data, 'trades', [])
856
- return self.parse_trades(trades, market, since, limit)
857
-
858
- def fetch_my_trades(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}):
859
- """
860
- fetch all trades made by the user
861
- :see: https://github.com/ace-exchange/ace-official-api-docs/blob/master/api_v2.md#open-api---trade-list
862
- :param str symbol: unified symbol of the market to fetch trades for
863
- :param int [since]: timestamp in ms of the earliest trade to fetch
864
- :param int [limit]: the maximum amount of trades to fetch
865
- :param dict [params]: extra parameters specific to the exchange API endpoint
866
- :returns Trade[]: a list of `trade structures <https://docs.ccxt.com/#/?id=public-trades>`
867
- """
868
- self.load_markets()
869
- market = self.safe_market(symbol)
870
- request: dict = {
871
- # 'buyOrSell': 1,
872
- # 'start': 0,
873
- }
874
- if market['id'] is not None:
875
- request['quoteCurrencyId'] = market['quoteId']
876
- request['baseCurrencyId'] = market['baseId']
877
- if limit is not None:
878
- request['size'] = limit # default 10, max 500
879
- response = self.privatePostV2OrderGetTradeList(self.extend(request, params))
880
- #
881
- # {
882
- # "attachment": [
883
- # {
884
- # "buyOrSell": 1,
885
- # "orderNo": "16708156853695560053601100247906",
886
- # "num": "1",
887
- # "price": "16895",
888
- # "orderAmount": "16895",
889
- # "tradeNum": "0.1",
890
- # "tradePrice": "16895",
891
- # "tradeAmount": "1689.5",
892
- # "fee": "0",
893
- # "feeSave": "0",
894
- # "status": 1,
895
- # "isSelf": False,
896
- # "tradeNo": "16708186395087940051961000274150",
897
- # "tradeTime": "2022-12-12 12:17:19",
898
- # "tradeTimestamp": 1670818639508,
899
- # "quoteCurrencyId": 14,
900
- # "quoteCurrencyName": "USDT",
901
- # "baseCurrencyId": 2,
902
- # "baseCurrencyName": "BTC"
903
- # }
904
- # ],
905
- # "message": null,
906
- # "parameters": null,
907
- # "status": 200
908
- # }
909
- #
910
- trades = self.safe_list(response, 'attachment', [])
911
- return self.parse_trades(trades, market, since, limit)
912
-
913
- def parse_balance(self, response) -> Balances:
914
- #
915
- # [
916
- # {
917
- # "currencyId": 4,
918
- # "amount": 6.896,
919
- # "cashAmount": 6.3855,
920
- # "uid": 123,
921
- # "currencyName": "BTC"
922
- # }
923
- # ]
924
- #
925
- result: dict = {
926
- 'info': response,
927
- }
928
- for i in range(0, len(response)):
929
- balance = response[i]
930
- currencyId = self.safe_string(balance, 'currencyName')
931
- code = self.safe_currency_code(currencyId)
932
- amount = self.safe_string(balance, 'amount')
933
- available = self.safe_string(balance, 'cashAmount')
934
- account: dict = {
935
- 'free': available,
936
- 'total': amount,
937
- }
938
- result[code] = account
939
- return self.safe_balance(result)
940
-
941
- def fetch_balance(self, params={}) -> Balances:
942
- """
943
- query for balance and get the amount of funds available for trading or funds locked in orders
944
- :see: https://github.com/ace-exchange/ace-official-api-docs/blob/master/api_v2.md#open-api---account-balance
945
- :param dict [params]: extra parameters specific to the exchange API endpoint
946
- :returns dict: a `balance structure <https://docs.ccxt.com/#/?id=balance-structure>`
947
- """
948
- self.load_markets()
949
- response = self.privatePostV2CoinCustomerAccount(params)
950
- balances = self.safe_value(response, 'attachment', [])
951
- #
952
- # {
953
- # "attachment":[
954
- # {
955
- # "currencyId": 4,
956
- # "amount": 6.896,
957
- # "cashAmount": 6.3855,
958
- # "uid": 123,
959
- # "currencyName": "BTC"
960
- # }
961
- # ],
962
- # "message": null,
963
- # "parameters": null,
964
- # "status": "200"
965
- # }
966
- #
967
- return self.parse_balance(balances)
968
-
969
- def sign(self, path, api='public', method='GET', params={}, headers=None, body=None):
970
- url = '/' + self.implode_params(path, params)
971
- query = self.omit(params, self.extract_params(path))
972
- if headers is None:
973
- headers = {}
974
- if api == 'private':
975
- self.check_required_credentials()
976
- nonce = self.milliseconds()
977
- auth = 'ACE_SIGN' + self.secret
978
- data = self.extend({
979
- 'apiKey': self.apiKey,
980
- 'timeStamp': nonce,
981
- }, params)
982
- dataKeys = list(data.keys())
983
- sortedDataKeys = self.sort_by(dataKeys, 0, False, '')
984
- for i in range(0, len(sortedDataKeys)):
985
- key = sortedDataKeys[i]
986
- auth += self.safe_string(data, key)
987
- signature = self.hash(self.encode(auth), 'sha256', 'hex')
988
- data['signKey'] = signature
989
- headers = {
990
- 'Content-Type': 'application/x-www-form-urlencoded',
991
- }
992
- if method == 'POST':
993
- brokerId = self.safe_string(self.options, 'brokerId')
994
- if brokerId is not None:
995
- headers['Referer'] = brokerId
996
- body = self.urlencode(data)
997
- elif api == 'public' and method == 'GET':
998
- if query:
999
- url += '?' + self.urlencode(query)
1000
- url = self.urls['api'][api] + url
1001
- return {'url': url, 'method': method, 'body': body, 'headers': headers}
1002
-
1003
- def handle_errors(self, code: int, reason: str, url: str, method: str, headers: dict, body: str, response, requestHeaders, requestBody):
1004
- if response is None:
1005
- return None # fallback to the default error handler
1006
- feedback = self.id + ' ' + body
1007
- status = self.safe_number(response, 'status', 200)
1008
- if status > 200:
1009
- statusStr = str(status)
1010
- self.throw_exactly_matched_exception(self.exceptions['exact'], statusStr, feedback)
1011
- self.throw_broadly_matched_exception(self.exceptions['broad'], statusStr, feedback)
1012
- return None