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/pro/kucoin.py CHANGED
@@ -5,7 +5,7 @@
5
5
 
6
6
  import ccxt.async_support
7
7
  from ccxt.async_support.base.ws.cache import ArrayCache, ArrayCacheBySymbolById, ArrayCacheByTimestamp
8
- from ccxt.base.types import Balances, Int, Order, OrderBook, Str, Strings, Ticker, Tickers, Trade
8
+ from ccxt.base.types import Any, Balances, Bool, Int, Order, OrderBook, Str, Strings, Ticker, Tickers, Trade
9
9
  from ccxt.async_support.base.ws.client import Client
10
10
  from typing import List
11
11
  from ccxt.base.errors import ExchangeError
@@ -14,7 +14,7 @@ from ccxt.base.errors import ArgumentsRequired
14
14
 
15
15
  class kucoin(ccxt.async_support.kucoin):
16
16
 
17
- def describe(self):
17
+ def describe(self) -> Any:
18
18
  return self.deep_extend(super(kucoin, self).describe(), {
19
19
  'has': {
20
20
  'ws': True,
@@ -47,6 +47,9 @@ class kucoin(ccxt.async_support.kucoin):
47
47
  'snapshotMaxRetries': 3,
48
48
  'method': '/market/level2', # '/spotMarket/level2Depth5' or '/spotMarket/level2Depth50'
49
49
  },
50
+ 'watchMyTrades': {
51
+ 'method': '/spotMarket/tradeOrders', # or '/spot/tradeFills'
52
+ },
50
53
  },
51
54
  'streaming': {
52
55
  # kucoin does not support built-in ws protocol-level ping-pong
@@ -150,9 +153,30 @@ class kucoin(ccxt.async_support.kucoin):
150
153
  client.subscriptions[requestId] = subscriptionHash
151
154
  return await self.watch_multiple(url, messageHashes, message, subscriptionHashes, subscription)
152
155
 
156
+ async def un_subscribe_multiple(self, url, messageHashes, topic, subscriptionHashes, params={}, subscription: dict = None):
157
+ requestId = str(self.request_id())
158
+ request: dict = {
159
+ 'id': requestId,
160
+ 'type': 'unsubscribe',
161
+ 'topic': topic,
162
+ 'response': True,
163
+ }
164
+ message = self.extend(request, params)
165
+ if subscription is not None:
166
+ subscription[requestId] = requestId
167
+ client = self.client(url)
168
+ for i in range(0, len(subscriptionHashes)):
169
+ subscriptionHash = subscriptionHashes[i]
170
+ if not (subscriptionHash in client.subscriptions):
171
+ client.subscriptions[requestId] = subscriptionHash
172
+ return await self.watch_multiple(url, messageHashes, message, subscriptionHashes, subscription)
173
+
153
174
  async def watch_ticker(self, symbol: str, params={}) -> Ticker:
154
175
  """
155
176
  watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
177
+
178
+ https://www.kucoin.com/docs/websocket/spot-trading/public-channels/market-snapshot
179
+
156
180
  :param str symbol: unified symbol of the market to fetch the ticker for
157
181
  :param dict [params]: extra parameters specific to the exchange API endpoint
158
182
  :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
@@ -168,7 +192,9 @@ class kucoin(ccxt.async_support.kucoin):
168
192
 
169
193
  async def watch_tickers(self, symbols: Strings = None, params={}) -> Tickers:
170
194
  """
171
- :see: https://www.kucoin.com/docs/websocket/spot-trading/public-channels/ticker
195
+
196
+ https://www.kucoin.com/docs/websocket/spot-trading/public-channels/ticker
197
+
172
198
  watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for all markets of a specific list
173
199
  :param str[] symbols: unified symbol of the market to fetch the ticker for
174
200
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -285,7 +311,9 @@ class kucoin(ccxt.async_support.kucoin):
285
311
 
286
312
  async def watch_bids_asks(self, symbols: Strings = None, params={}) -> Tickers:
287
313
  """
288
- :see: https://www.kucoin.com/docs/websocket/spot-trading/public-channels/level1-bbo-market-data
314
+
315
+ https://www.kucoin.com/docs/websocket/spot-trading/public-channels/level1-bbo-market-data
316
+
289
317
  watches best bid & ask for symbols
290
318
  :param str[] symbols: unified symbol of the market to fetch the ticker for
291
319
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -367,6 +395,9 @@ class kucoin(ccxt.async_support.kucoin):
367
395
  async def watch_ohlcv(self, symbol: str, timeframe='1m', since: Int = None, limit: Int = None, params={}) -> List[list]:
368
396
  """
369
397
  watches historical candlestick data containing the open, high, low, and close price, and the volume of a market
398
+
399
+ https://www.kucoin.com/docs/websocket/spot-trading/public-channels/klines
400
+
370
401
  :param str symbol: unified symbol of the market to fetch OHLCV data for
371
402
  :param str timeframe: the length of time each candle represents
372
403
  :param int [since]: timestamp in ms of the earliest candle to fetch
@@ -431,6 +462,9 @@ class kucoin(ccxt.async_support.kucoin):
431
462
  async def watch_trades(self, symbol: str, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
432
463
  """
433
464
  get the list of most recent trades for a particular symbol
465
+
466
+ https://www.kucoin.com/docs/websocket/spot-trading/public-channels/match-execution-data
467
+
434
468
  :param str symbol: unified symbol of the market to fetch trades for
435
469
  :param int [since]: timestamp in ms of the earliest trade to fetch
436
470
  :param int [limit]: the maximum amount of trades to fetch
@@ -442,7 +476,10 @@ class kucoin(ccxt.async_support.kucoin):
442
476
  async def watch_trades_for_symbols(self, symbols: List[str], since: Int = None, limit: Int = None, params={}) -> List[Trade]:
443
477
  """
444
478
  get the list of most recent trades for a particular symbol
445
- :param str symbol: unified symbol of the market to fetch trades for
479
+
480
+ https://www.kucoin.com/docs/websocket/spot-trading/public-channels/match-execution-data
481
+
482
+ :param str[] symbols:
446
483
  :param int [since]: timestamp in ms of the earliest trade to fetch
447
484
  :param int [limit]: the maximum amount of trades to fetch
448
485
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -470,6 +507,48 @@ class kucoin(ccxt.async_support.kucoin):
470
507
  limit = trades.getLimit(tradeSymbol, limit)
471
508
  return self.filter_by_since_limit(trades, since, limit, 'timestamp', True)
472
509
 
510
+ async def un_watch_trades_for_symbols(self, symbols: List[str], params={}) -> Any:
511
+ """
512
+ unWatches trades stream
513
+
514
+ https://www.kucoin.com/docs/websocket/spot-trading/public-channels/match-execution-data
515
+
516
+ :param str symbols:
517
+ :param dict [params]: extra parameters specific to the exchange API endpoint
518
+ :returns dict[]: a list of `trade structures <https://docs.ccxt.com/#/?id=public-trades>`
519
+ """
520
+ await self.load_markets()
521
+ symbols = self.market_symbols(symbols, None, False)
522
+ marketIds = self.market_ids(symbols)
523
+ url = await self.negotiate(False)
524
+ messageHashes = []
525
+ subscriptionHashes = []
526
+ topic = '/market/match:' + ','.join(marketIds)
527
+ for i in range(0, len(symbols)):
528
+ symbol = symbols[i]
529
+ messageHashes.append('unsubscribe:trades:' + symbol)
530
+ subscriptionHashes.append('trades:' + symbol)
531
+ subscription = {
532
+ 'messageHashes': messageHashes,
533
+ 'subMessageHashes': subscriptionHashes,
534
+ 'topic': 'trades',
535
+ 'unsubscribe': True,
536
+ 'symbols': symbols,
537
+ }
538
+ return await self.un_subscribe_multiple(url, messageHashes, topic, messageHashes, params, subscription)
539
+
540
+ async def un_watch_trades(self, symbol: str, params={}) -> Any:
541
+ """
542
+ unWatches trades stream
543
+
544
+ https://www.kucoin.com/docs/websocket/spot-trading/public-channels/match-execution-data
545
+
546
+ :param str symbol: unified symbol of the market to fetch trades for
547
+ :param dict [params]: extra parameters specific to the exchange API endpoint
548
+ :returns dict[]: a list of `trade structures <https://docs.ccxt.com/#/?id=public-trades>`
549
+ """
550
+ return await self.un_watch_trades_for_symbols([symbol], params)
551
+
473
552
  def handle_trade(self, client: Client, message):
474
553
  #
475
554
  # {
@@ -504,10 +583,12 @@ class kucoin(ccxt.async_support.kucoin):
504
583
 
505
584
  async def watch_order_book(self, symbol: str, limit: Int = None, params={}) -> OrderBook:
506
585
  """
507
- :see: https://www.kucoin.com/docs/websocket/spot-trading/public-channels/level1-bbo-market-data
508
- :see: https://www.kucoin.com/docs/websocket/spot-trading/public-channels/level2-market-data
509
- :see: https://www.kucoin.com/docs/websocket/spot-trading/public-channels/level2-5-best-ask-bid-orders
510
- :see: https://www.kucoin.com/docs/websocket/spot-trading/public-channels/level2-50-best-ask-bid-orders
586
+
587
+ https://www.kucoin.com/docs/websocket/spot-trading/public-channels/level1-bbo-market-data
588
+ https://www.kucoin.com/docs/websocket/spot-trading/public-channels/level2-market-data
589
+ https://www.kucoin.com/docs/websocket/spot-trading/public-channels/level2-5-best-ask-bid-orders
590
+ https://www.kucoin.com/docs/websocket/spot-trading/public-channels/level2-50-best-ask-bid-orders
591
+
511
592
  watches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
512
593
  :param str symbol: unified symbol of the market to fetch the order book for
513
594
  :param int [limit]: the maximum amount of order book entries to return
@@ -532,12 +613,30 @@ class kucoin(ccxt.async_support.kucoin):
532
613
  #
533
614
  return await self.watch_order_book_for_symbols([symbol], limit, params)
534
615
 
616
+ async def un_watch_order_book(self, symbol: str, params={}) -> Any:
617
+ """
618
+
619
+ https://www.kucoin.com/docs/websocket/spot-trading/public-channels/level1-bbo-market-data
620
+ https://www.kucoin.com/docs/websocket/spot-trading/public-channels/level2-market-data
621
+ https://www.kucoin.com/docs/websocket/spot-trading/public-channels/level2-5-best-ask-bid-orders
622
+ https://www.kucoin.com/docs/websocket/spot-trading/public-channels/level2-50-best-ask-bid-orders
623
+
624
+ unWatches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
625
+ :param str symbol: unified symbol of the market to fetch the order book for
626
+ :param dict [params]: extra parameters specific to the exchange API endpoint
627
+ :param str [params.method]: either '/market/level2' or '/spotMarket/level2Depth5' or '/spotMarket/level2Depth50' default is '/market/level2'
628
+ :returns dict: A dictionary of `order book structures <https://docs.ccxt.com/#/?id=order-book-structure>` indexed by market symbols
629
+ """
630
+ return await self.un_watch_order_book_for_symbols([symbol], params)
631
+
535
632
  async def watch_order_book_for_symbols(self, symbols: List[str], limit: Int = None, params={}) -> OrderBook:
536
633
  """
537
- :see: https://www.kucoin.com/docs/websocket/spot-trading/public-channels/level1-bbo-market-data
538
- :see: https://www.kucoin.com/docs/websocket/spot-trading/public-channels/level2-market-data
539
- :see: https://www.kucoin.com/docs/websocket/spot-trading/public-channels/level2-5-best-ask-bid-orders
540
- :see: https://www.kucoin.com/docs/websocket/spot-trading/public-channels/level2-50-best-ask-bid-orders
634
+
635
+ https://www.kucoin.com/docs/websocket/spot-trading/public-channels/level1-bbo-market-data
636
+ https://www.kucoin.com/docs/websocket/spot-trading/public-channels/level2-market-data
637
+ https://www.kucoin.com/docs/websocket/spot-trading/public-channels/level2-5-best-ask-bid-orders
638
+ https://www.kucoin.com/docs/websocket/spot-trading/public-channels/level2-50-best-ask-bid-orders
639
+
541
640
  watches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
542
641
  :param str[] symbols: unified array of symbols
543
642
  :param int [limit]: the maximum amount of order book entries to return
@@ -577,6 +676,46 @@ class kucoin(ccxt.async_support.kucoin):
577
676
  orderbook = await self.subscribe_multiple(url, messageHashes, topic, subscriptionHashes, params, subscription)
578
677
  return orderbook.limit()
579
678
 
679
+ async def un_watch_order_book_for_symbols(self, symbols: List[str], params={}) -> Any:
680
+ """
681
+
682
+ https://www.kucoin.com/docs/websocket/spot-trading/public-channels/level1-bbo-market-data
683
+ https://www.kucoin.com/docs/websocket/spot-trading/public-channels/level2-market-data
684
+ https://www.kucoin.com/docs/websocket/spot-trading/public-channels/level2-5-best-ask-bid-orders
685
+ https://www.kucoin.com/docs/websocket/spot-trading/public-channels/level2-50-best-ask-bid-orders
686
+
687
+ unWatches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
688
+ :param str[] symbols: unified array of symbols
689
+ :param dict [params]: extra parameters specific to the exchange API endpoint
690
+ :param str [params.method]: either '/market/level2' or '/spotMarket/level2Depth5' or '/spotMarket/level2Depth50' default is '/market/level2'
691
+ :returns dict: A dictionary of `order book structures <https://docs.ccxt.com/#/?id=order-book-structure>` indexed by market symbols
692
+ """
693
+ limit = self.safe_integer(params, 'limit')
694
+ params = self.omit(params, 'limit')
695
+ await self.load_markets()
696
+ symbols = self.market_symbols(symbols, None, False)
697
+ marketIds = self.market_ids(symbols)
698
+ url = await self.negotiate(False)
699
+ method: Str = None
700
+ method, params = self.handle_option_and_params(params, 'watchOrderBook', 'method', '/market/level2')
701
+ if (limit == 5) or (limit == 50):
702
+ method = '/spotMarket/level2Depth' + str(limit)
703
+ topic = method + ':' + ','.join(marketIds)
704
+ messageHashes = []
705
+ subscriptionHashes = []
706
+ for i in range(0, len(symbols)):
707
+ symbol = symbols[i]
708
+ messageHashes.append('unsubscribe:orderbook:' + symbol)
709
+ subscriptionHashes.append('orderbook:' + symbol)
710
+ subscription = {
711
+ 'messageHashes': messageHashes,
712
+ 'symbols': symbols,
713
+ 'unsubscribe': True,
714
+ 'topic': 'orderbook',
715
+ 'subMessageHashes': subscriptionHashes,
716
+ }
717
+ return await self.un_subscribe_multiple(url, messageHashes, topic, messageHashes, params, subscription)
718
+
580
719
  def handle_order_book(self, client: Client, message):
581
720
  #
582
721
  # initial snapshot is fetched with ccxt's fetchOrderBook
@@ -724,6 +863,15 @@ class kucoin(ccxt.async_support.kucoin):
724
863
  method = self.safe_value(subscription, 'method')
725
864
  if method is not None:
726
865
  method(client, message, subscription)
866
+ isUnSub = self.safe_bool(subscription, 'unsubscribe', False)
867
+ if isUnSub:
868
+ messageHashes = self.safe_list(subscription, 'messageHashes', [])
869
+ subMessageHashes = self.safe_list(subscription, 'subMessageHashes', [])
870
+ for i in range(0, len(messageHashes)):
871
+ messageHash = messageHashes[i]
872
+ subHash = subMessageHashes[i]
873
+ self.clean_unsubscription(client, subHash, messageHash)
874
+ self.clean_cache(subscription)
727
875
 
728
876
  def handle_system_status(self, client: Client, message):
729
877
  #
@@ -741,18 +889,22 @@ class kucoin(ccxt.async_support.kucoin):
741
889
  async def watch_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
742
890
  """
743
891
  watches information on multiple orders made by the user
892
+
893
+ https://www.kucoin.com/docs/websocket/spot-trading/private-channels/private-order-change
894
+ https://www.kucoin.com/docs/websocket/spot-trading/private-channels/stop-order-event
895
+
744
896
  :param str symbol: unified market symbol of the market orders were made in
745
897
  :param int [since]: the earliest time in ms to fetch orders for
746
898
  :param int [limit]: the maximum number of order structures to retrieve
747
899
  :param dict [params]: extra parameters specific to the exchange API endpoint
748
- :param boolean [params.stop]: trigger orders are watched if True
900
+ :param boolean [params.trigger]: trigger orders are watched if True
749
901
  :returns dict[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
750
902
  """
751
903
  await self.load_markets()
752
- stop = self.safe_value_2(params, 'stop', 'trigger')
904
+ trigger = self.safe_value_2(params, 'stop', 'trigger')
753
905
  params = self.omit(params, ['stop', 'trigger'])
754
906
  url = await self.negotiate(True)
755
- topic = '/spotMarket/advancedOrders' if stop else '/spotMarket/tradeOrders'
907
+ topic = '/spotMarket/advancedOrders' if trigger else '/spotMarket/tradeOrders'
756
908
  request: dict = {
757
909
  'privateChannel': True,
758
910
  }
@@ -874,6 +1026,9 @@ class kucoin(ccxt.async_support.kucoin):
874
1026
  #
875
1027
  messageHash = 'orders'
876
1028
  data = self.safe_value(message, 'data')
1029
+ tradeId = self.safe_string(data, 'tradeId')
1030
+ if tradeId is not None:
1031
+ self.handle_my_trade(client, message)
877
1032
  parsed = self.parse_ws_order(data)
878
1033
  symbol = self.safe_string(parsed, 'symbol')
879
1034
  orderId = self.safe_string(parsed, 'id')
@@ -898,15 +1053,20 @@ class kucoin(ccxt.async_support.kucoin):
898
1053
  async def watch_my_trades(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
899
1054
  """
900
1055
  watches information on multiple trades made by the user
1056
+
1057
+ https://www.kucoin.com/docs/websocket/spot-trading/private-channels/private-order-change
1058
+
901
1059
  :param str symbol: unified market symbol of the market trades were made in
902
1060
  :param int [since]: the earliest time in ms to fetch trades for
903
1061
  :param int [limit]: the maximum number of trade structures to retrieve
904
1062
  :param dict [params]: extra parameters specific to the exchange API endpoint
905
- :returns dict[]: a list of [trade structures]{@link https://docs.ccxt.com/#/?id=trade-structure
1063
+ :param str [params.method]: '/spotMarket/tradeOrders' or '/spot/tradeFills' default is '/spotMarket/tradeOrders'
1064
+ :returns dict[]: a list of `trade structures <https://docs.ccxt.com/#/?id=trade-structure>`
906
1065
  """
907
1066
  await self.load_markets()
908
1067
  url = await self.negotiate(True)
909
- topic = '/spot/tradeFills'
1068
+ topic: Str = None
1069
+ topic, params = self.handle_option_and_params(params, 'watchMyTrades', 'method', '/spotMarket/tradeOrders')
910
1070
  request: dict = {
911
1071
  'privateChannel': True,
912
1072
  }
@@ -921,12 +1081,41 @@ class kucoin(ccxt.async_support.kucoin):
921
1081
  return self.filter_by_symbol_since_limit(trades, symbol, since, limit, True)
922
1082
 
923
1083
  def handle_my_trade(self, client: Client, message):
1084
+ #
1085
+ # {
1086
+ # "type": "message",
1087
+ # "topic": "/spotMarket/tradeOrders",
1088
+ # "subject": "orderChange",
1089
+ # "channelType": "private",
1090
+ # "data": {
1091
+ # "symbol": "KCS-USDT",
1092
+ # "orderType": "limit",
1093
+ # "side": "sell",
1094
+ # "orderId": "5efab07953bdea00089965fa",
1095
+ # "liquidity": "taker",
1096
+ # "type": "match",
1097
+ # "feeType": "takerFee",
1098
+ # "orderTime": 1670329987026,
1099
+ # "size": "0.1",
1100
+ # "filledSize": "0.1",
1101
+ # "price": "0.938",
1102
+ # "matchPrice": "0.96738",
1103
+ # "matchSize": "0.1",
1104
+ # "tradeId": "5efab07a4ee4c7000a82d6d9",
1105
+ # "clientOid": "1593487481000313",
1106
+ # "remainSize": "0",
1107
+ # "status": "match",
1108
+ # "ts": 1670329987311000000
1109
+ # }
1110
+ # }
1111
+ #
924
1112
  if self.myTrades is None:
925
1113
  limit = self.safe_integer(self.options, 'tradesLimit', 1000)
926
1114
  self.myTrades = ArrayCacheBySymbolById(limit)
927
1115
  data = self.safe_dict(message, 'data')
928
1116
  parsed = self.parse_ws_trade(data)
929
- self.myTrades.append(parsed)
1117
+ myTrades = self.myTrades
1118
+ myTrades.append(parsed)
930
1119
  messageHash = 'myTrades'
931
1120
  client.resolve(self.myTrades, messageHash)
932
1121
  symbolSpecificMessageHash = messageHash + ':' + parsed['symbol']
@@ -934,19 +1123,44 @@ class kucoin(ccxt.async_support.kucoin):
934
1123
 
935
1124
  def parse_ws_trade(self, trade, market=None):
936
1125
  #
937
- # {
938
- # "fee": 0.00262148,
939
- # "feeCurrency": "USDT",
940
- # "feeRate": 0.001,
941
- # "orderId": "62417436b29df8000183df2f",
942
- # "orderType": "market",
943
- # "price": 131.074,
944
- # "side": "sell",
945
- # "size": 0.02,
946
- # "symbol": "LTC-USDT",
947
- # "time": "1648456758734571745",
948
- # "tradeId": "624174362e113d2f467b3043"
949
- # }
1126
+ # /spotMarket/tradeOrders
1127
+ #
1128
+ # {
1129
+ # "symbol": "KCS-USDT",
1130
+ # "orderType": "limit",
1131
+ # "side": "sell",
1132
+ # "orderId": "5efab07953bdea00089965fa",
1133
+ # "liquidity": "taker",
1134
+ # "type": "match",
1135
+ # "feeType": "takerFee",
1136
+ # "orderTime": 1670329987026,
1137
+ # "size": "0.1",
1138
+ # "filledSize": "0.1",
1139
+ # "price": "0.938",
1140
+ # "matchPrice": "0.96738",
1141
+ # "matchSize": "0.1",
1142
+ # "tradeId": "5efab07a4ee4c7000a82d6d9",
1143
+ # "clientOid": "1593487481000313",
1144
+ # "remainSize": "0",
1145
+ # "status": "match",
1146
+ # "ts": 1670329987311000000
1147
+ # }
1148
+ #
1149
+ # /spot/tradeFills
1150
+ #
1151
+ # {
1152
+ # "fee": 0.00262148,
1153
+ # "feeCurrency": "USDT",
1154
+ # "feeRate": 0.001,
1155
+ # "orderId": "62417436b29df8000183df2f",
1156
+ # "orderType": "market",
1157
+ # "price": 131.074,
1158
+ # "side": "sell",
1159
+ # "size": 0.02,
1160
+ # "symbol": "LTC-USDT",
1161
+ # "time": "1648456758734571745",
1162
+ # "tradeId": "624174362e113d2f467b3043"
1163
+ # }
950
1164
  #
951
1165
  marketId = self.safe_string(trade, 'symbol')
952
1166
  market = self.safe_market(marketId, market, '-')
@@ -954,18 +1168,17 @@ class kucoin(ccxt.async_support.kucoin):
954
1168
  type = self.safe_string(trade, 'orderType')
955
1169
  side = self.safe_string(trade, 'side')
956
1170
  tradeId = self.safe_string(trade, 'tradeId')
957
- price = self.safe_string(trade, 'price')
958
- amount = self.safe_string(trade, 'size')
1171
+ price = self.safe_string(trade, 'matchPrice')
1172
+ amount = self.safe_string(trade, 'matchSize')
1173
+ if price is None:
1174
+ # /spot/tradeFills
1175
+ price = self.safe_string(trade, 'price')
1176
+ amount = self.safe_string(trade, 'size')
959
1177
  order = self.safe_string(trade, 'orderId')
960
- timestamp = self.safe_integer_product(trade, 'time', 0.000001)
1178
+ timestamp = self.safe_integer_product_2(trade, 'ts', 'time', 0.000001)
961
1179
  feeCurrency = market['quote']
962
1180
  feeRate = self.safe_string(trade, 'feeRate')
963
1181
  feeCost = self.safe_string(trade, 'fee')
964
- fee = {
965
- 'cost': feeCost,
966
- 'rate': feeRate,
967
- 'currency': feeCurrency,
968
- }
969
1182
  return self.safe_trade({
970
1183
  'info': trade,
971
1184
  'timestamp': timestamp,
@@ -974,17 +1187,24 @@ class kucoin(ccxt.async_support.kucoin):
974
1187
  'id': tradeId,
975
1188
  'order': order,
976
1189
  'type': type,
977
- 'takerOrMaker': None,
1190
+ 'takerOrMaker': self.safe_string(trade, 'liquidity'),
978
1191
  'side': side,
979
1192
  'price': price,
980
1193
  'amount': amount,
981
1194
  'cost': None,
982
- 'fee': fee,
1195
+ 'fee': {
1196
+ 'cost': feeCost,
1197
+ 'rate': feeRate,
1198
+ 'currency': feeCurrency,
1199
+ },
983
1200
  }, market)
984
1201
 
985
1202
  async def watch_balance(self, params={}) -> Balances:
986
1203
  """
987
1204
  watch balance and get the amount of funds available for trading or funds locked in orders
1205
+
1206
+ https://www.kucoin.com/docs/websocket/spot-trading/private-channels/account-balance-change
1207
+
988
1208
  :param dict [params]: extra parameters specific to the exchange API endpoint
989
1209
  :returns dict: a `balance structure <https://docs.ccxt.com/#/?id=balance-structure>`
990
1210
  """
@@ -1079,15 +1299,15 @@ class kucoin(ccxt.async_support.kucoin):
1079
1299
  'trade.l3match': self.handle_trade,
1080
1300
  'trade.candles.update': self.handle_ohlcv,
1081
1301
  'account.balance': self.handle_balance,
1082
- '/spot/tradeFills': self.handle_my_trade,
1083
1302
  'orderChange': self.handle_order,
1084
1303
  'stopOrder': self.handle_order,
1304
+ '/spot/tradeFills': self.handle_my_trade,
1085
1305
  }
1086
1306
  method = self.safe_value(methods, subject)
1087
1307
  if method is not None:
1088
1308
  method(client, message)
1089
1309
 
1090
- def ping(self, client):
1310
+ def ping(self, client: Client):
1091
1311
  # kucoin does not support built-in ws protocol-level ping-pong
1092
1312
  # instead it requires a custom json-based text ping-pong
1093
1313
  # https://docs.kucoin.com/#ping
@@ -1101,7 +1321,7 @@ class kucoin(ccxt.async_support.kucoin):
1101
1321
  client.lastPong = self.milliseconds()
1102
1322
  # https://docs.kucoin.com/#ping
1103
1323
 
1104
- def handle_error_message(self, client: Client, message):
1324
+ def handle_error_message(self, client: Client, message) -> Bool:
1105
1325
  #
1106
1326
  # {
1107
1327
  # "id": "1",
@@ -1116,7 +1336,8 @@ class kucoin(ccxt.async_support.kucoin):
1116
1336
  if client.url.find('connectId=private') >= 0:
1117
1337
  type = 'private'
1118
1338
  self.options['urls'][type] = None
1119
- self.handle_errors(None, None, client.url, None, None, data, message, None, None)
1339
+ self.handle_errors(1, '', client.url, '', {}, data, message, {}, {})
1340
+ return False
1120
1341
 
1121
1342
  def handle_message(self, client: Client, message):
1122
1343
  type = self.safe_string(message, 'type')