ccxt-ir 4.3.46.0.2__py2.py3-none-any.whl → 4.5.0__py2.py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (528) hide show
  1. ccxt/__init__.py +39 -35
  2. ccxt/abantether.py +9 -9
  3. ccxt/abstract/alpaca.py +4 -0
  4. ccxt/abstract/apex.py +31 -0
  5. ccxt/abstract/bigone.py +1 -1
  6. ccxt/abstract/binance.py +106 -48
  7. ccxt/abstract/binancecoinm.py +106 -48
  8. ccxt/abstract/binanceus.py +141 -83
  9. ccxt/abstract/binanceusdm.py +106 -48
  10. ccxt/abstract/bingx.py +50 -1
  11. ccxt/abstract/bitbank.py +5 -0
  12. ccxt/abstract/bitfinex.py +136 -65
  13. ccxt/abstract/bitflyer.py +1 -0
  14. ccxt/abstract/bitget.py +67 -0
  15. ccxt/abstract/bitmart.py +19 -1
  16. ccxt/abstract/bitopro.py +1 -0
  17. ccxt/abstract/bitrue.py +68 -68
  18. ccxt/abstract/bitstamp.py +1 -0
  19. ccxt/abstract/blofin.py +30 -0
  20. ccxt/abstract/btcbox.py +2 -0
  21. ccxt/abstract/bybit.py +28 -13
  22. ccxt/abstract/cex.py +28 -29
  23. ccxt/abstract/coinbaseexchange.py +1 -0
  24. ccxt/abstract/coinbaseinternational.py +1 -1
  25. ccxt/abstract/cryptocom.py +16 -0
  26. ccxt/abstract/cryptomus.py +20 -0
  27. ccxt/abstract/defx.py +69 -0
  28. ccxt/abstract/deribit.py +1 -0
  29. ccxt/abstract/derive.py +117 -0
  30. ccxt/abstract/digifinex.py +1 -0
  31. ccxt/abstract/ellipx.py +25 -0
  32. ccxt/abstract/foxbit.py +26 -0
  33. ccxt/abstract/gate.py +19 -0
  34. ccxt/abstract/gateio.py +19 -0
  35. ccxt/abstract/gemini.py +1 -0
  36. ccxt/abstract/hibachi.py +26 -0
  37. ccxt/abstract/hyperliquid.py +1 -1
  38. ccxt/abstract/independentreserve.py +6 -0
  39. ccxt/abstract/kraken.py +1 -0
  40. ccxt/abstract/krakenfutures.py +4 -0
  41. ccxt/abstract/kucoin.py +10 -0
  42. ccxt/abstract/kucoinfutures.py +18 -0
  43. ccxt/abstract/lbank.py +2 -1
  44. ccxt/abstract/luno.py +1 -0
  45. ccxt/abstract/mexc.py +2 -0
  46. ccxt/abstract/modetrade.py +119 -0
  47. ccxt/abstract/myokx.py +349 -0
  48. ccxt/abstract/oceanex.py +5 -0
  49. ccxt/abstract/okx.py +25 -0
  50. ccxt/abstract/okxus.py +349 -0
  51. ccxt/abstract/onetrading.py +0 -12
  52. ccxt/abstract/paradex.py +23 -0
  53. ccxt/abstract/phemex.py +2 -0
  54. ccxt/abstract/poloniex.py +36 -0
  55. ccxt/abstract/tradeogre.py +3 -1
  56. ccxt/abstract/upbit.py +51 -34
  57. ccxt/abstract/whitebit.py +16 -0
  58. ccxt/abstract/woo.py +64 -6
  59. ccxt/abstract/xt.py +10 -5
  60. ccxt/afratether.py +7 -7
  61. ccxt/alpaca.py +828 -51
  62. ccxt/apex.py +1875 -0
  63. ccxt/arzinja.py +7 -7
  64. ccxt/arzplus.py +9 -9
  65. ccxt/ascendex.py +501 -306
  66. ccxt/async_support/__init__.py +39 -35
  67. ccxt/async_support/abantether.py +10 -10
  68. ccxt/async_support/afratether.py +9 -9
  69. ccxt/async_support/alpaca.py +828 -51
  70. ccxt/async_support/apex.py +1875 -0
  71. ccxt/async_support/arzinja.py +10 -10
  72. ccxt/async_support/arzplus.py +12 -12
  73. ccxt/async_support/ascendex.py +502 -306
  74. ccxt/async_support/base/exchange.py +303 -89
  75. ccxt/async_support/base/ws/cache.py +9 -3
  76. ccxt/async_support/base/ws/client.py +173 -38
  77. ccxt/async_support/base/ws/future.py +25 -37
  78. ccxt/async_support/bequant.py +5 -3
  79. ccxt/async_support/bigone.py +279 -144
  80. ccxt/async_support/binance.py +2347 -1158
  81. ccxt/async_support/binancecoinm.py +9 -3
  82. ccxt/async_support/binanceus.py +17 -3
  83. ccxt/async_support/binanceusdm.py +9 -4
  84. ccxt/async_support/bingx.py +2962 -920
  85. ccxt/async_support/bit2c.py +147 -27
  86. ccxt/async_support/bitbank.py +151 -23
  87. ccxt/async_support/bitbns.py +104 -30
  88. ccxt/async_support/bitfinex.py +3291 -1113
  89. ccxt/async_support/bitflyer.py +202 -27
  90. ccxt/async_support/bitget.py +3683 -1538
  91. ccxt/async_support/bithumb.py +195 -38
  92. ccxt/async_support/bitimen.py +12 -12
  93. ccxt/async_support/bitir.py +38 -38
  94. ccxt/async_support/bitmart.py +1288 -350
  95. ccxt/async_support/bitmex.py +260 -75
  96. ccxt/async_support/bitopro.py +262 -62
  97. ccxt/async_support/bitpin.py +17 -16
  98. ccxt/async_support/bitrue.py +459 -290
  99. ccxt/async_support/bitso.py +199 -54
  100. ccxt/async_support/bitstamp.py +230 -96
  101. ccxt/async_support/bitteam.py +167 -25
  102. ccxt/async_support/{huobijp.py → bittrade.py} +158 -30
  103. ccxt/async_support/bitvavo.py +213 -49
  104. ccxt/async_support/blockchaincom.py +160 -46
  105. ccxt/async_support/blofin.py +502 -120
  106. ccxt/async_support/btcalpha.py +169 -31
  107. ccxt/async_support/btcbox.py +292 -23
  108. ccxt/async_support/btcmarkets.py +211 -58
  109. ccxt/async_support/btcturk.py +161 -38
  110. ccxt/async_support/bybit.py +1775 -1030
  111. ccxt/async_support/cex.py +1440 -1303
  112. ccxt/async_support/coinbase.py +724 -212
  113. ccxt/async_support/coinbaseadvanced.py +2 -1
  114. ccxt/async_support/coinbaseexchange.py +388 -89
  115. ccxt/async_support/coinbaseinternational.py +412 -57
  116. ccxt/async_support/coincatch.py +177 -78
  117. ccxt/async_support/coincheck.py +135 -19
  118. ccxt/async_support/coinex.py +606 -232
  119. ccxt/async_support/coinmate.py +189 -63
  120. ccxt/async_support/coinmetro.py +195 -54
  121. ccxt/async_support/coinone.py +158 -51
  122. ccxt/async_support/coinsph.py +336 -61
  123. ccxt/async_support/coinspot.py +151 -52
  124. ccxt/async_support/cryptocom.py +661 -111
  125. ccxt/async_support/cryptomus.py +1137 -0
  126. ccxt/async_support/defx.py +2071 -0
  127. ccxt/async_support/delta.py +299 -99
  128. ccxt/async_support/deribit.py +348 -126
  129. ccxt/async_support/derive.py +2572 -0
  130. ccxt/async_support/digifinex.py +430 -214
  131. ccxt/async_support/ellipx.py +2029 -0
  132. ccxt/async_support/eterex.py +10 -10
  133. ccxt/async_support/excoino.py +31 -31
  134. ccxt/async_support/exir.py +14 -14
  135. ccxt/async_support/exmo.py +344 -131
  136. ccxt/async_support/exnovin.py +10 -10
  137. ccxt/async_support/farhadexchange.py +12 -12
  138. ccxt/async_support/fmfwio.py +2 -1
  139. ccxt/async_support/foxbit.py +1935 -0
  140. ccxt/async_support/gate.py +1351 -529
  141. ccxt/async_support/gateio.py +2 -1
  142. ccxt/async_support/gemini.py +144 -39
  143. ccxt/async_support/hashkey.py +152 -109
  144. ccxt/async_support/hibachi.py +2080 -0
  145. ccxt/async_support/hitbtc.py +395 -167
  146. ccxt/async_support/hitobit.py +12 -12
  147. ccxt/async_support/hollaex.py +307 -119
  148. ccxt/async_support/htx.py +851 -383
  149. ccxt/async_support/huobi.py +2 -1
  150. ccxt/async_support/hyperliquid.py +1848 -536
  151. ccxt/async_support/independentreserve.py +288 -15
  152. ccxt/async_support/indodax.py +190 -33
  153. ccxt/async_support/jibitex.py +12 -12
  154. ccxt/async_support/kraken.py +795 -351
  155. ccxt/async_support/krakenfutures.py +214 -62
  156. ccxt/async_support/kucoin.py +715 -396
  157. ccxt/async_support/kucoinfutures.py +652 -89
  158. ccxt/async_support/latoken.py +217 -113
  159. ccxt/async_support/lbank.py +425 -97
  160. ccxt/async_support/luno.py +382 -35
  161. ccxt/async_support/mercado.py +113 -6
  162. ccxt/async_support/mexc.py +874 -437
  163. ccxt/async_support/modetrade.py +2818 -0
  164. ccxt/async_support/myokx.py +54 -0
  165. ccxt/async_support/ndax.py +221 -64
  166. ccxt/async_support/nobitex.py +31 -37
  167. ccxt/async_support/novadax.py +190 -34
  168. ccxt/async_support/oceanex.py +217 -28
  169. ccxt/async_support/okcoin.py +253 -145
  170. ccxt/async_support/okexchange.py +11 -11
  171. ccxt/async_support/okx.py +1088 -351
  172. ccxt/async_support/okxus.py +54 -0
  173. ccxt/async_support/ompfinex.py +25 -24
  174. ccxt/async_support/onetrading.py +213 -392
  175. ccxt/async_support/oxfun.py +245 -166
  176. ccxt/async_support/p2b.py +151 -29
  177. ccxt/async_support/paradex.py +562 -49
  178. ccxt/async_support/paymium.py +82 -19
  179. ccxt/async_support/phemex.py +713 -172
  180. ccxt/async_support/poloniex.py +1602 -283
  181. ccxt/async_support/probit.py +224 -95
  182. ccxt/async_support/ramzinex.py +30 -27
  183. ccxt/async_support/sarmayex.py +9 -9
  184. ccxt/async_support/sarrafex.py +13 -13
  185. ccxt/async_support/tabdeal.py +14 -13
  186. ccxt/async_support/tetherland.py +9 -9
  187. ccxt/async_support/timex.py +210 -51
  188. ccxt/async_support/tokocrypto.py +167 -47
  189. ccxt/async_support/tradeogre.py +266 -31
  190. ccxt/async_support/twox.py +9 -9
  191. ccxt/async_support/ubitex.py +12 -12
  192. ccxt/async_support/upbit.py +568 -165
  193. ccxt/async_support/vertex.py +160 -32
  194. ccxt/async_support/wallex.py +12 -12
  195. ccxt/async_support/wavesexchange.py +165 -30
  196. ccxt/async_support/whitebit.py +975 -127
  197. ccxt/async_support/woo.py +1918 -1016
  198. ccxt/async_support/woofipro.py +433 -141
  199. ccxt/async_support/xt.py +649 -193
  200. ccxt/async_support/yobit.py +195 -70
  201. ccxt/async_support/zaif.py +91 -15
  202. ccxt/async_support/zonda.py +151 -36
  203. ccxt/base/decimal_to_precision.py +14 -10
  204. ccxt/base/errors.py +49 -18
  205. ccxt/base/exchange.py +1556 -450
  206. ccxt/base/precise.py +10 -0
  207. ccxt/base/types.py +114 -6
  208. ccxt/bequant.py +5 -3
  209. ccxt/bigone.py +279 -144
  210. ccxt/binance.py +2347 -1158
  211. ccxt/binancecoinm.py +9 -3
  212. ccxt/binanceus.py +17 -3
  213. ccxt/binanceusdm.py +9 -4
  214. ccxt/bingx.py +2962 -920
  215. ccxt/bit2c.py +147 -27
  216. ccxt/bitbank.py +151 -23
  217. ccxt/bitbns.py +104 -30
  218. ccxt/bitfinex.py +3290 -1113
  219. ccxt/bitflyer.py +202 -27
  220. ccxt/bitget.py +3683 -1538
  221. ccxt/bithumb.py +194 -38
  222. ccxt/bitimen.py +9 -9
  223. ccxt/bitir.py +35 -35
  224. ccxt/bitmart.py +1288 -350
  225. ccxt/bitmex.py +260 -75
  226. ccxt/bitopro.py +262 -62
  227. ccxt/bitpin.py +15 -14
  228. ccxt/bitrue.py +459 -290
  229. ccxt/bitso.py +199 -54
  230. ccxt/bitstamp.py +230 -96
  231. ccxt/bitteam.py +167 -25
  232. ccxt/{huobijp.py → bittrade.py} +158 -30
  233. ccxt/bitvavo.py +213 -49
  234. ccxt/blockchaincom.py +160 -46
  235. ccxt/blofin.py +502 -120
  236. ccxt/btcalpha.py +169 -31
  237. ccxt/btcbox.py +291 -23
  238. ccxt/btcmarkets.py +211 -58
  239. ccxt/btcturk.py +161 -38
  240. ccxt/bybit.py +1775 -1030
  241. ccxt/cex.py +1439 -1303
  242. ccxt/coinbase.py +724 -212
  243. ccxt/coinbaseadvanced.py +2 -1
  244. ccxt/coinbaseexchange.py +388 -89
  245. ccxt/coinbaseinternational.py +412 -57
  246. ccxt/coincatch.py +177 -78
  247. ccxt/coincheck.py +135 -19
  248. ccxt/coinex.py +606 -232
  249. ccxt/coinmate.py +189 -63
  250. ccxt/coinmetro.py +194 -54
  251. ccxt/coinone.py +158 -51
  252. ccxt/coinsph.py +336 -61
  253. ccxt/coinspot.py +151 -52
  254. ccxt/cryptocom.py +661 -111
  255. ccxt/cryptomus.py +1137 -0
  256. ccxt/defx.py +2070 -0
  257. ccxt/delta.py +299 -99
  258. ccxt/deribit.py +348 -126
  259. ccxt/derive.py +2571 -0
  260. ccxt/digifinex.py +430 -214
  261. ccxt/ellipx.py +2029 -0
  262. ccxt/eterex.py +7 -7
  263. ccxt/excoino.py +29 -29
  264. ccxt/exir.py +11 -11
  265. ccxt/exmo.py +343 -131
  266. ccxt/exnovin.py +8 -8
  267. ccxt/farhadexchange.py +10 -10
  268. ccxt/fmfwio.py +2 -1
  269. ccxt/foxbit.py +1935 -0
  270. ccxt/gate.py +1351 -529
  271. ccxt/gateio.py +2 -1
  272. ccxt/gemini.py +144 -39
  273. ccxt/hashkey.py +152 -109
  274. ccxt/hibachi.py +2079 -0
  275. ccxt/hitbtc.py +395 -167
  276. ccxt/hitobit.py +9 -9
  277. ccxt/hollaex.py +307 -119
  278. ccxt/htx.py +851 -383
  279. ccxt/huobi.py +2 -1
  280. ccxt/hyperliquid.py +1848 -536
  281. ccxt/independentreserve.py +287 -15
  282. ccxt/indodax.py +190 -33
  283. ccxt/jibitex.py +9 -9
  284. ccxt/kraken.py +794 -351
  285. ccxt/krakenfutures.py +214 -62
  286. ccxt/kucoin.py +715 -396
  287. ccxt/kucoinfutures.py +652 -89
  288. ccxt/latoken.py +217 -113
  289. ccxt/lbank.py +425 -97
  290. ccxt/luno.py +382 -35
  291. ccxt/mercado.py +113 -6
  292. ccxt/mexc.py +873 -437
  293. ccxt/modetrade.py +2818 -0
  294. ccxt/myokx.py +54 -0
  295. ccxt/ndax.py +221 -64
  296. ccxt/nobitex.py +29 -35
  297. ccxt/novadax.py +190 -34
  298. ccxt/oceanex.py +217 -28
  299. ccxt/okcoin.py +253 -145
  300. ccxt/okexchange.py +9 -9
  301. ccxt/okx.py +1088 -351
  302. ccxt/okxus.py +54 -0
  303. ccxt/ompfinex.py +22 -21
  304. ccxt/onetrading.py +213 -392
  305. ccxt/oxfun.py +245 -166
  306. ccxt/p2b.py +151 -29
  307. ccxt/paradex.py +562 -49
  308. ccxt/paymium.py +82 -19
  309. ccxt/phemex.py +712 -172
  310. ccxt/poloniex.py +1601 -283
  311. ccxt/pro/__init__.py +76 -17
  312. ccxt/pro/alpaca.py +21 -6
  313. ccxt/pro/apex.py +984 -0
  314. ccxt/pro/ascendex.py +58 -10
  315. ccxt/pro/bequant.py +6 -1
  316. ccxt/pro/binance.py +728 -156
  317. ccxt/pro/binancecoinm.py +6 -2
  318. ccxt/pro/binanceus.py +8 -4
  319. ccxt/pro/binanceusdm.py +7 -2
  320. ccxt/pro/bingx.py +333 -142
  321. ccxt/pro/bitfinex.py +727 -262
  322. ccxt/pro/bitget.py +570 -79
  323. ccxt/pro/bithumb.py +20 -6
  324. ccxt/pro/bitmart.py +216 -87
  325. ccxt/pro/bitmex.py +47 -9
  326. ccxt/pro/bitopro.py +26 -14
  327. ccxt/pro/bitrue.py +22 -22
  328. ccxt/pro/bitstamp.py +54 -21
  329. ccxt/pro/{huobijp.py → bittrade.py} +7 -6
  330. ccxt/pro/bitvavo.py +191 -67
  331. ccxt/pro/blockchaincom.py +21 -8
  332. ccxt/pro/blofin.py +9 -1
  333. ccxt/pro/bybit.py +632 -245
  334. ccxt/pro/cex.py +59 -24
  335. ccxt/pro/coinbase.py +102 -73
  336. ccxt/pro/coinbaseadvanced.py +2 -1
  337. ccxt/pro/coinbaseexchange.py +8 -8
  338. ccxt/pro/coinbaseinternational.py +181 -25
  339. ccxt/pro/coincatch.py +6 -7
  340. ccxt/pro/coincheck.py +11 -6
  341. ccxt/pro/coinex.py +967 -665
  342. ccxt/pro/coinone.py +16 -9
  343. ccxt/pro/cryptocom.py +448 -45
  344. ccxt/pro/defx.py +831 -0
  345. ccxt/pro/deribit.py +150 -14
  346. ccxt/pro/derive.py +704 -0
  347. ccxt/pro/exmo.py +239 -6
  348. ccxt/pro/gate.py +623 -65
  349. ccxt/pro/gateio.py +2 -1
  350. ccxt/pro/gemini.py +27 -11
  351. ccxt/pro/hashkey.py +2 -2
  352. ccxt/pro/hitbtc.py +196 -91
  353. ccxt/pro/hollaex.py +23 -7
  354. ccxt/pro/htx.py +51 -14
  355. ccxt/pro/huobi.py +2 -1
  356. ccxt/pro/hyperliquid.py +591 -27
  357. ccxt/pro/independentreserve.py +9 -6
  358. ccxt/pro/kraken.py +640 -320
  359. ccxt/pro/krakenfutures.py +62 -35
  360. ccxt/pro/kucoin.py +267 -46
  361. ccxt/pro/kucoinfutures.py +165 -21
  362. ccxt/pro/lbank.py +102 -21
  363. ccxt/pro/luno.py +12 -8
  364. ccxt/pro/mexc.py +877 -111
  365. ccxt/pro/modetrade.py +1271 -0
  366. ccxt/pro/myokx.py +38 -0
  367. ccxt/pro/ndax.py +15 -2
  368. ccxt/pro/okcoin.py +23 -4
  369. ccxt/pro/okx.py +573 -98
  370. ccxt/pro/okxus.py +38 -0
  371. ccxt/pro/onetrading.py +30 -13
  372. ccxt/pro/oxfun.py +131 -27
  373. ccxt/pro/p2b.py +88 -22
  374. ccxt/pro/paradex.py +3 -3
  375. ccxt/pro/phemex.py +75 -21
  376. ccxt/pro/poloniex.py +124 -41
  377. ccxt/pro/probit.py +87 -80
  378. ccxt/pro/tradeogre.py +272 -0
  379. ccxt/pro/upbit.py +152 -12
  380. ccxt/pro/vertex.py +8 -3
  381. ccxt/pro/whitebit.py +58 -5
  382. ccxt/pro/woo.py +228 -37
  383. ccxt/pro/woofipro.py +106 -18
  384. ccxt/pro/xt.py +111 -5
  385. ccxt/probit.py +224 -95
  386. ccxt/protobuf/__init__.py +0 -0
  387. ccxt/protobuf/mexc/PrivateAccountV3Api_pb2.py +37 -0
  388. ccxt/protobuf/mexc/PrivateDealsV3Api_pb2.py +37 -0
  389. ccxt/protobuf/mexc/PrivateOrdersV3Api_pb2.py +37 -0
  390. ccxt/protobuf/mexc/PublicAggreBookTickerV3Api_pb2.py +37 -0
  391. ccxt/protobuf/mexc/PublicAggreDealsV3Api_pb2.py +39 -0
  392. ccxt/protobuf/mexc/PublicAggreDepthsV3Api_pb2.py +39 -0
  393. ccxt/protobuf/mexc/PublicBookTickerBatchV3Api_pb2.py +38 -0
  394. ccxt/protobuf/mexc/PublicBookTickerV3Api_pb2.py +37 -0
  395. ccxt/protobuf/mexc/PublicDealsV3Api_pb2.py +39 -0
  396. ccxt/protobuf/mexc/PublicIncreaseDepthsBatchV3Api_pb2.py +38 -0
  397. ccxt/protobuf/mexc/PublicIncreaseDepthsV3Api_pb2.py +39 -0
  398. ccxt/protobuf/mexc/PublicLimitDepthsV3Api_pb2.py +39 -0
  399. ccxt/protobuf/mexc/PublicMiniTickerV3Api_pb2.py +37 -0
  400. ccxt/protobuf/mexc/PublicMiniTickersV3Api_pb2.py +38 -0
  401. ccxt/protobuf/mexc/PublicSpotKlineV3Api_pb2.py +37 -0
  402. ccxt/protobuf/mexc/PushDataV3ApiWrapper_pb2.py +52 -0
  403. ccxt/protobuf/mexc/__init__.py +0 -0
  404. ccxt/ramzinex.py +28 -25
  405. ccxt/sarmayex.py +7 -7
  406. ccxt/sarrafex.py +10 -10
  407. ccxt/static_dependencies/__init__.py +1 -1
  408. ccxt/static_dependencies/lark/py.typed +0 -0
  409. ccxt/static_dependencies/marshmallow/py.typed +0 -0
  410. ccxt/static_dependencies/marshmallow_dataclass/py.typed +0 -0
  411. ccxt/static_dependencies/marshmallow_oneofschema/py.typed +0 -0
  412. ccxt/tabdeal.py +12 -11
  413. ccxt/test/tests_async.py +261 -57
  414. ccxt/test/tests_helpers.py +1 -3
  415. ccxt/test/tests_init.py +4 -3
  416. ccxt/test/tests_sync.py +261 -57
  417. ccxt/tetherland.py +7 -7
  418. ccxt/timex.py +210 -51
  419. ccxt/tokocrypto.py +167 -47
  420. ccxt/tradeogre.py +266 -31
  421. ccxt/twox.py +7 -7
  422. ccxt/ubitex.py +9 -9
  423. ccxt/upbit.py +568 -165
  424. ccxt/vertex.py +160 -32
  425. ccxt/wallex.py +9 -9
  426. ccxt/wavesexchange.py +165 -30
  427. ccxt/whitebit.py +975 -127
  428. ccxt/woo.py +1917 -1016
  429. ccxt/woofipro.py +432 -141
  430. ccxt/xt.py +649 -193
  431. ccxt/yobit.py +194 -70
  432. ccxt/zaif.py +91 -15
  433. ccxt/zonda.py +151 -36
  434. {ccxt_ir-4.3.46.0.2.dist-info → ccxt_ir-4.5.0.dist-info}/METADATA +225 -73
  435. ccxt_ir-4.5.0.dist-info/RECORD +743 -0
  436. {ccxt_ir-4.3.46.0.2.dist-info → ccxt_ir-4.5.0.dist-info}/WHEEL +1 -1
  437. ccxt/abstract/ace.py +0 -15
  438. ccxt/abstract/bitbay.py +0 -53
  439. ccxt/abstract/bitcoincom.py +0 -115
  440. ccxt/abstract/bitfinex2.py +0 -139
  441. ccxt/abstract/bitpanda.py +0 -35
  442. ccxt/abstract/bl3p.py +0 -19
  443. ccxt/abstract/coinlist.py +0 -54
  444. ccxt/abstract/currencycom.py +0 -68
  445. ccxt/abstract/hitbtc3.py +0 -115
  446. ccxt/abstract/idex.py +0 -26
  447. ccxt/abstract/kuna.py +0 -182
  448. ccxt/abstract/lykke.py +0 -29
  449. ccxt/abstract/poloniexfutures.py +0 -48
  450. ccxt/abstract/wazirx.py +0 -30
  451. ccxt/ace.py +0 -1012
  452. ccxt/async_support/ace.py +0 -1012
  453. ccxt/async_support/base/ws/aiohttp_client.py +0 -125
  454. ccxt/async_support/base/ws/fast_client.py +0 -96
  455. ccxt/async_support/bitbay.py +0 -17
  456. ccxt/async_support/bitcoincom.py +0 -17
  457. ccxt/async_support/bitfinex2.py +0 -3552
  458. ccxt/async_support/bitpanda.py +0 -16
  459. ccxt/async_support/bl3p.py +0 -485
  460. ccxt/async_support/coinlist.py +0 -2243
  461. ccxt/async_support/currencycom.py +0 -1950
  462. ccxt/async_support/hitbtc3.py +0 -16
  463. ccxt/async_support/idex.py +0 -1766
  464. ccxt/async_support/kuna.py +0 -1841
  465. ccxt/async_support/lykke.py +0 -1270
  466. ccxt/async_support/poloniexfutures.py +0 -1717
  467. ccxt/async_support/wazirx.py +0 -1224
  468. ccxt/bitbay.py +0 -17
  469. ccxt/bitcoincom.py +0 -17
  470. ccxt/bitfinex2.py +0 -3552
  471. ccxt/bitpanda.py +0 -16
  472. ccxt/bl3p.py +0 -485
  473. ccxt/coinlist.py +0 -2243
  474. ccxt/currencycom.py +0 -1950
  475. ccxt/hitbtc3.py +0 -16
  476. ccxt/idex.py +0 -1766
  477. ccxt/kuna.py +0 -1841
  478. ccxt/lykke.py +0 -1270
  479. ccxt/poloniexfutures.py +0 -1717
  480. ccxt/pro/bitcoincom.py +0 -34
  481. ccxt/pro/bitfinex2.py +0 -1083
  482. ccxt/pro/bitpanda.py +0 -15
  483. ccxt/pro/currencycom.py +0 -536
  484. ccxt/pro/idex.py +0 -672
  485. ccxt/pro/poloniexfutures.py +0 -990
  486. ccxt/pro/wazirx.py +0 -749
  487. ccxt/test/base/__init__.py +0 -29
  488. ccxt/test/base/test_account.py +0 -26
  489. ccxt/test/base/test_balance.py +0 -56
  490. ccxt/test/base/test_borrow_interest.py +0 -35
  491. ccxt/test/base/test_borrow_rate.py +0 -32
  492. ccxt/test/base/test_calculate_fee.py +0 -51
  493. ccxt/test/base/test_crypto.py +0 -127
  494. ccxt/test/base/test_currency.py +0 -76
  495. ccxt/test/base/test_datetime.py +0 -109
  496. ccxt/test/base/test_decimal_to_precision.py +0 -392
  497. ccxt/test/base/test_deep_extend.py +0 -68
  498. ccxt/test/base/test_deposit_withdrawal.py +0 -50
  499. ccxt/test/base/test_exchange_datetime_functions.py +0 -76
  500. ccxt/test/base/test_funding_rate_history.py +0 -29
  501. ccxt/test/base/test_last_price.py +0 -31
  502. ccxt/test/base/test_ledger_entry.py +0 -45
  503. ccxt/test/base/test_ledger_item.py +0 -48
  504. ccxt/test/base/test_leverage_tier.py +0 -33
  505. ccxt/test/base/test_liquidation.py +0 -50
  506. ccxt/test/base/test_margin_mode.py +0 -24
  507. ccxt/test/base/test_margin_modification.py +0 -35
  508. ccxt/test/base/test_market.py +0 -193
  509. ccxt/test/base/test_number.py +0 -411
  510. ccxt/test/base/test_ohlcv.py +0 -33
  511. ccxt/test/base/test_open_interest.py +0 -32
  512. ccxt/test/base/test_order.py +0 -64
  513. ccxt/test/base/test_order_book.py +0 -69
  514. ccxt/test/base/test_position.py +0 -60
  515. ccxt/test/base/test_shared_methods.py +0 -353
  516. ccxt/test/base/test_status.py +0 -24
  517. ccxt/test/base/test_throttle.py +0 -126
  518. ccxt/test/base/test_ticker.py +0 -92
  519. ccxt/test/base/test_trade.py +0 -47
  520. ccxt/test/base/test_trading_fee.py +0 -26
  521. ccxt/test/base/test_transaction.py +0 -39
  522. ccxt/test/test_async.py +0 -1649
  523. ccxt/test/test_sync.py +0 -1648
  524. ccxt/wazirx.py +0 -1224
  525. ccxt_ir-4.3.46.0.2.dist-info/RECORD +0 -772
  526. /ccxt/abstract/{huobijp.py → bittrade.py} +0 -0
  527. {ccxt_ir-4.3.46.0.2.dist-info → ccxt_ir-4.5.0.dist-info/licenses}/LICENSE.txt +0 -0
  528. {ccxt_ir-4.3.46.0.2.dist-info → ccxt_ir-4.5.0.dist-info}/top_level.txt +0 -0
ccxt/pro/kucoinfutures.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, Position, Str, Strings, Ticker, Tickers, Trade
8
+ from ccxt.base.types import Any, Balances, Bool, Int, Order, OrderBook, Position, 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 kucoinfutures(ccxt.async_support.kucoinfutures):
16
16
 
17
- def describe(self):
17
+ def describe(self) -> Any:
18
18
  return self.deep_extend(super(kucoinfutures, self).describe(), {
19
19
  'has': {
20
20
  'ws': True,
@@ -175,10 +175,30 @@ class kucoinfutures(ccxt.async_support.kucoinfutures):
175
175
  }
176
176
  return await self.watch_multiple(url, messageHashes, self.extend(request, params), subscriptionHashes, subscriptionArgs)
177
177
 
178
+ async def un_subscribe_multiple(self, url, messageHashes, topic, subscriptionHashes, params={}, subscription: dict = None):
179
+ requestId = str(self.request_id())
180
+ request: dict = {
181
+ 'id': requestId,
182
+ 'type': 'unsubscribe',
183
+ 'topic': topic,
184
+ 'response': True,
185
+ }
186
+ message = self.extend(request, params)
187
+ if subscription is not None:
188
+ subscription[requestId] = requestId
189
+ client = self.client(url)
190
+ for i in range(0, len(subscriptionHashes)):
191
+ subscriptionHash = subscriptionHashes[i]
192
+ if not (subscriptionHash in client.subscriptions):
193
+ client.subscriptions[requestId] = subscriptionHash
194
+ return await self.watch_multiple(url, messageHashes, message, subscriptionHashes, subscription)
195
+
178
196
  async def watch_ticker(self, symbol: str, params={}) -> Ticker:
179
197
  """
180
198
  watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
181
- :see: https://www.kucoin.com/docs/websocket/futures-trading/public-channels/get-ticker
199
+
200
+ https://www.kucoin.com/docs/websocket/futures-trading/public-channels/get-ticker
201
+
182
202
  :param str symbol: unified symbol of the market to fetch the ticker for
183
203
  :param dict [params]: extra parameters specific to the exchange API endpoint
184
204
  :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
@@ -236,7 +256,9 @@ class kucoinfutures(ccxt.async_support.kucoinfutures):
236
256
 
237
257
  async def watch_bids_asks(self, symbols: Strings = None, params={}) -> Tickers:
238
258
  """
239
- :see: https://www.kucoin.com/docs/websocket/futures-trading/public-channels/get-ticker-v2
259
+
260
+ https://www.kucoin.com/docs/websocket/futures-trading/public-channels/get-ticker-v2
261
+
240
262
  watches best bid & ask for symbols
241
263
  :param str[] symbols: unified symbol of the market to fetch the ticker for
242
264
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -320,7 +342,9 @@ class kucoinfutures(ccxt.async_support.kucoinfutures):
320
342
  async def watch_position(self, symbol: Str = None, params={}) -> Position:
321
343
  """
322
344
  watch open positions for a specific symbol
323
- :see: https://docs.kucoin.com/futures/#position-change-events
345
+
346
+ https://docs.kucoin.com/futures/#position-change-events
347
+
324
348
  :param str|None symbol: unified market symbol
325
349
  :param dict params: extra parameters specific to the exchange API endpoint
326
350
  :returns dict: a `position structure <https://docs.ccxt.com/en/latest/manual.html#position-structure>`
@@ -338,7 +362,7 @@ class kucoinfutures(ccxt.async_support.kucoinfutures):
338
362
  client = self.client(url)
339
363
  self.set_position_cache(client, symbol)
340
364
  fetchPositionSnapshot = self.handle_option('watchPosition', 'fetchPositionSnapshot', True)
341
- awaitPositionSnapshot = self.safe_bool('watchPosition', 'awaitPositionSnapshot', True)
365
+ awaitPositionSnapshot = self.handle_option('watchPosition', 'awaitPositionSnapshot', True)
342
366
  currentPosition = self.get_current_position(symbol)
343
367
  if fetchPositionSnapshot and awaitPositionSnapshot and currentPosition is None:
344
368
  snapshot = await client.future('fetchPositionSnapshot:' + symbol)
@@ -485,7 +509,9 @@ class kucoinfutures(ccxt.async_support.kucoinfutures):
485
509
  async def watch_trades(self, symbol: str, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
486
510
  """
487
511
  get the list of most recent trades for a particular symbol
488
- :see: https://docs.kucoin.com/futures/#execution-data
512
+
513
+ https://docs.kucoin.com/futures/#execution-data
514
+
489
515
  :param str symbol: unified symbol of the market to fetch trades for
490
516
  :param int [since]: timestamp in ms of the earliest trade to fetch
491
517
  :param int [limit]: the maximum amount of trades to fetch
@@ -497,7 +523,7 @@ class kucoinfutures(ccxt.async_support.kucoinfutures):
497
523
  async def watch_trades_for_symbols(self, symbols: List[str], since: Int = None, limit: Int = None, params={}) -> List[Trade]:
498
524
  """
499
525
  get the list of most recent trades for a particular symbol
500
- :param str symbol: unified symbol of the market to fetch trades for
526
+ :param str[] symbols:
501
527
  :param int [since]: timestamp in ms of the earliest trade to fetch
502
528
  :param int [limit]: the maximum amount of trades to fetch
503
529
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -526,6 +552,46 @@ class kucoinfutures(ccxt.async_support.kucoinfutures):
526
552
  limit = trades.getLimit(tradeSymbol, limit)
527
553
  return self.filter_by_since_limit(trades, since, limit, 'timestamp', True)
528
554
 
555
+ async def un_watch_trades(self, symbol: str, params={}) -> Any:
556
+ """
557
+ unWatches trades stream
558
+
559
+ https://docs.kucoin.com/futures/#execution-data
560
+
561
+ :param str symbol: unified symbol of the market to fetch trades for
562
+ :param dict [params]: extra parameters specific to the exchange API endpoint
563
+ :returns dict[]: a list of `trade structures <https://docs.ccxt.com/#/?id=public-trades>`
564
+ """
565
+ return await self.un_watch_trades_for_symbols([symbol], params)
566
+
567
+ async def un_watch_trades_for_symbols(self, symbols: List[str], params={}) -> Any:
568
+ """
569
+ get the list of most recent trades for a particular symbol
570
+ :param str[] symbols:
571
+ :param dict [params]: extra parameters specific to the exchange API endpoint
572
+ :returns dict[]: a list of `trade structures <https://docs.ccxt.com/#/?id=public-trades>`
573
+ """
574
+ await self.load_markets()
575
+ symbols = self.market_symbols(symbols, None, False)
576
+ url = await self.negotiate(False)
577
+ symbols = self.market_symbols(symbols)
578
+ marketIds = self.market_ids(symbols)
579
+ topic = '/contractMarket/execution:' + ','.join(marketIds)
580
+ subscriptionHashes = []
581
+ messageHashes = []
582
+ for i in range(0, len(symbols)):
583
+ symbol = symbols[i]
584
+ messageHashes.append('unsubscribe:trades:' + symbol)
585
+ subscriptionHashes.append('trades:' + symbol)
586
+ subscription = {
587
+ 'messageHashes': messageHashes,
588
+ 'subMessageHashes': subscriptionHashes,
589
+ 'topic': 'trades',
590
+ 'unsubscribe': True,
591
+ 'symbols': symbols,
592
+ }
593
+ return await self.un_subscribe_multiple(url, messageHashes, topic, messageHashes, params, subscription)
594
+
529
595
  def handle_trade(self, client: Client, message):
530
596
  #
531
597
  # {
@@ -562,7 +628,9 @@ class kucoinfutures(ccxt.async_support.kucoinfutures):
562
628
 
563
629
  async def watch_ohlcv(self, symbol: str, timeframe='1m', since: Int = None, limit: Int = None, params={}) -> List[list]:
564
630
  """
565
- :see: https://www.kucoin.com/docs/websocket/futures-trading/public-channels/klines
631
+
632
+ https://www.kucoin.com/docs/websocket/futures-trading/public-channels/klines
633
+
566
634
  watches historical candlestick data containing the open, high, low, and close price, and the volume of a market
567
635
  :param str symbol: unified symbol of the market to fetch OHLCV data for
568
636
  :param str timeframe: the length of time each candle represents
@@ -634,13 +702,15 @@ class kucoinfutures(ccxt.async_support.kucoinfutures):
634
702
  async def watch_order_book(self, symbol: str, limit: Int = None, params={}) -> OrderBook:
635
703
  """
636
704
  watches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
637
- * 1. After receiving the websocket Level 2 data flow, cache the data.
638
- * 2. Initiate a REST request to get the snapshot data of Level 2 order book.
639
- * 3. Playback the cached Level 2 data flow.
640
- * 4. Apply the new Level 2 data flow to the local snapshot to ensure that the sequence of the new Level 2 update lines up with the sequence of the previous Level 2 data. Discard all the message prior to that sequence, and then playback the change to snapshot.
641
- * 5. Update the level2 full data based on sequence according to the size. If the price is 0, ignore the messages and update the sequence. If the size=0, update the sequence and remove the price of which the size is 0 out of level 2. For other cases, please update the price.
642
- * 6. If the sequence of the newly pushed message does not line up to the sequence of the last message, you could pull through REST Level 2 message request to get the updated messages. Please note that the difference between the start and end parameters cannot exceed 500.
643
- :see: https://docs.kucoin.com/futures/#level-2-market-data
705
+ 1. After receiving the websocket Level 2 data flow, cache the data.
706
+ 2. Initiate a REST request to get the snapshot data of Level 2 order book.
707
+ 3. Playback the cached Level 2 data flow.
708
+ 4. Apply the new Level 2 data flow to the local snapshot to ensure that the sequence of the new Level 2 update lines up with the sequence of the previous Level 2 data. Discard all the message prior to that sequence, and then playback the change to snapshot.
709
+ 5. Update the level2 full data based on sequence according to the size. If the price is 0, ignore the messages and update the sequence. If the size=0, update the sequence and remove the price of which the size is 0 out of level 2. For other cases, please update the price.
710
+ 6. If the sequence of the newly pushed message does not line up to the sequence of the last message, you could pull through REST Level 2 message request to get the updated messages. Please note that the difference between the start and end parameters cannot exceed 500.
711
+
712
+ https://docs.kucoin.com/futures/#level-2-market-data
713
+
644
714
  :param str symbol: unified symbol of the market to fetch the order book for
645
715
  :param int [limit]: the maximum amount of order book entries to return
646
716
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -651,6 +721,9 @@ class kucoinfutures(ccxt.async_support.kucoinfutures):
651
721
  async def watch_order_book_for_symbols(self, symbols: List[str], limit: Int = None, params={}) -> OrderBook:
652
722
  """
653
723
  watches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
724
+
725
+ https://docs.kucoin.com/futures/#level-2-market-data
726
+
654
727
  :param str[] symbols: unified array of symbols
655
728
  :param int [limit]: the maximum amount of order book entries to return
656
729
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -680,6 +753,45 @@ class kucoinfutures(ccxt.async_support.kucoinfutures):
680
753
  orderbook = await self.subscribe_multiple(url, messageHashes, topic, subscriptionHashes, subscriptionArgs, params)
681
754
  return orderbook.limit()
682
755
 
756
+ async def un_watch_order_book(self, symbol: str, params={}) -> Any:
757
+ """
758
+ unWatches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
759
+
760
+ https://docs.kucoin.com/futures/#level-2-market-data
761
+
762
+ :param str symbol: unified symbol of the market to fetch the order book for
763
+ :param dict [params]: extra parameters specific to the exchange API endpoint
764
+ :returns dict: A dictionary of `order book structures <https://docs.ccxt.com/#/?id=order-book-structure>` indexed by market symbols
765
+ """
766
+ return await self.un_watch_order_book_for_symbols([symbol], params)
767
+
768
+ async def un_watch_order_book_for_symbols(self, symbols: List[str], params={}) -> Any:
769
+ """
770
+ unWatches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
771
+ :param str[] symbols: unified array of symbols
772
+ :param dict [params]: extra parameters specific to the exchange API endpoint
773
+ :returns dict: A dictionary of `order book structures <https://docs.ccxt.com/#/?id=order-book-structure>` indexed by market symbols
774
+ """
775
+ await self.load_markets()
776
+ symbols = self.market_symbols(symbols)
777
+ marketIds = self.market_ids(symbols)
778
+ url = await self.negotiate(False)
779
+ topic = '/contractMarket/level2:' + ','.join(marketIds)
780
+ subscriptionHashes = []
781
+ messageHashes = []
782
+ for i in range(0, len(symbols)):
783
+ symbol = symbols[i]
784
+ messageHashes.append('unsubscribe:orderbook:' + symbol)
785
+ subscriptionHashes.append('orderbook:' + symbol)
786
+ subscription = {
787
+ 'messageHashes': messageHashes,
788
+ 'symbols': symbols,
789
+ 'unsubscribe': True,
790
+ 'topic': 'orderbook',
791
+ 'subMessageHashes': subscriptionHashes,
792
+ }
793
+ return await self.un_subscribe_multiple(url, messageHashes, topic, messageHashes, params, subscription)
794
+
683
795
  def handle_delta(self, orderbook, delta):
684
796
  orderbook['nonce'] = self.safe_integer(delta, 'sequence')
685
797
  timestamp = self.safe_integer(delta, 'timestamp')
@@ -784,7 +896,9 @@ class kucoinfutures(ccxt.async_support.kucoinfutures):
784
896
  async def watch_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
785
897
  """
786
898
  watches information on multiple orders made by the user
787
- :see: https://docs.kucoin.com/futures/#trade-orders-according-to-the-market
899
+
900
+ https://docs.kucoin.com/futures/#trade-orders-according-to-the-market
901
+
788
902
  :param str symbol: unified market symbol of the market orders were made in
789
903
  :param int [since]: the earliest time in ms to fetch orders for
790
904
  :param int [limit]: the maximum number of order structures to retrieve
@@ -900,7 +1014,9 @@ class kucoinfutures(ccxt.async_support.kucoinfutures):
900
1014
  async def watch_balance(self, params={}) -> Balances:
901
1015
  """
902
1016
  watch balance and get the amount of funds available for trading or funds locked in orders
903
- :see: https://docs.kucoin.com/futures/#account-balance-events
1017
+
1018
+ https://docs.kucoin.com/futures/#account-balance-events
1019
+
904
1020
  :param dict [params]: extra parameters specific to the exchange API endpoint
905
1021
  :returns dict: a `balance structure <https://docs.ccxt.com/#/?id=balance-structure>`
906
1022
  """
@@ -1035,7 +1151,7 @@ class kucoinfutures(ccxt.async_support.kucoinfutures):
1035
1151
  else:
1036
1152
  return elementName + 's@all'
1037
1153
 
1038
- def ping(self, client):
1154
+ def ping(self, client: Client):
1039
1155
  # kucoin does not support built-in ws protocol-level ping-pong
1040
1156
  # instead it requires a custom json-based text ping-pong
1041
1157
  # https://docs.kucoin.com/#ping
@@ -1050,7 +1166,7 @@ class kucoinfutures(ccxt.async_support.kucoinfutures):
1050
1166
  client.lastPong = self.milliseconds()
1051
1167
  return message
1052
1168
 
1053
- def handle_error_message(self, client: Client, message):
1169
+ def handle_error_message(self, client: Client, message) -> Bool:
1054
1170
  #
1055
1171
  # {
1056
1172
  # "id": "64d8732c856851144bded10d",
@@ -1065,7 +1181,34 @@ class kucoinfutures(ccxt.async_support.kucoinfutures):
1065
1181
  if client.url.find('connectId=private') >= 0:
1066
1182
  type = 'private'
1067
1183
  self.options['urls'][type] = None
1068
- self.handle_errors(None, None, client.url, None, None, data, message, None, None)
1184
+ self.handle_errors(1, '', client.url, '', {}, data, message, {}, {})
1185
+ return True
1186
+
1187
+ def handle_subscription_status(self, client: Client, message):
1188
+ #
1189
+ # {
1190
+ # "id": "1578090438322",
1191
+ # "type": "ack"
1192
+ # }
1193
+ #
1194
+ id = self.safe_string(message, 'id')
1195
+ if not (id in client.subscriptions):
1196
+ return
1197
+ subscriptionHash = self.safe_string(client.subscriptions, id)
1198
+ subscription = self.safe_value(client.subscriptions, subscriptionHash)
1199
+ del client.subscriptions[id]
1200
+ method = self.safe_value(subscription, 'method')
1201
+ if method is not None:
1202
+ method(client, message, subscription)
1203
+ isUnSub = self.safe_bool(subscription, 'unsubscribe', False)
1204
+ if isUnSub:
1205
+ messageHashes = self.safe_list(subscription, 'messageHashes', [])
1206
+ subMessageHashes = self.safe_list(subscription, 'subMessageHashes', [])
1207
+ for i in range(0, len(messageHashes)):
1208
+ messageHash = messageHashes[i]
1209
+ subHash = subMessageHashes[i]
1210
+ self.clean_unsubscription(client, subHash, messageHash)
1211
+ self.clean_cache(subscription)
1069
1212
 
1070
1213
  def handle_message(self, client: Client, message):
1071
1214
  type = self.safe_string(message, 'type')
@@ -1075,6 +1218,7 @@ class kucoinfutures(ccxt.async_support.kucoinfutures):
1075
1218
  'message': self.handle_subject,
1076
1219
  'pong': self.handle_pong,
1077
1220
  'error': self.handle_error_message,
1221
+ 'ack': self.handle_subscription_status,
1078
1222
  }
1079
1223
  method = self.safe_value(methods, type)
1080
1224
  if method is not None:
ccxt/pro/lbank.py CHANGED
@@ -6,7 +6,7 @@
6
6
  import ccxt.async_support
7
7
  from ccxt.async_support.base.ws.cache import ArrayCache, ArrayCacheBySymbolById, ArrayCacheByTimestamp
8
8
  import math
9
- from ccxt.base.types import Int, Order, OrderBook, Str, Ticker, Trade
9
+ from ccxt.base.types import Any, Balances, Int, Order, OrderBook, Str, Ticker, Trade
10
10
  from ccxt.async_support.base.ws.client import Client
11
11
  from typing import List
12
12
  from ccxt.base.errors import ExchangeError
@@ -14,7 +14,7 @@ from ccxt.base.errors import ExchangeError
14
14
 
15
15
  class lbank(ccxt.async_support.lbank):
16
16
 
17
- def describe(self):
17
+ def describe(self) -> Any:
18
18
  return self.deep_extend(super(lbank, self).describe(), {
19
19
  'has': {
20
20
  'ws': True,
@@ -22,10 +22,11 @@ class lbank(ccxt.async_support.lbank):
22
22
  'fetchOrderBookWs': True,
23
23
  'fetchTickerWs': True,
24
24
  'fetchTradesWs': True,
25
- 'watchBalance': False,
25
+ 'watchBalance': True,
26
26
  'watchTicker': True,
27
27
  'watchTickers': False,
28
28
  'watchTrades': True,
29
+ 'watchTradesForSymbols': False,
29
30
  'watchMyTrades': False,
30
31
  'watchOrders': True,
31
32
  'watchOrderBook': True,
@@ -66,7 +67,9 @@ class lbank(ccxt.async_support.lbank):
66
67
 
67
68
  async def fetch_ohlcv_ws(self, symbol: str, timeframe='1m', since: Int = None, limit: Int = None, params={}) -> List[list]:
68
69
  """
69
- :see: https://www.lbank.com/en-US/docs/index.html#request-amp-subscription-instruction
70
+
71
+ https://www.lbank.com/en-US/docs/index.html#request-amp-subscription-instruction
72
+
70
73
  watches historical candlestick data containing the open, high, low, and close price, and the volume of a market
71
74
  :param str symbol: unified symbol of the market to fetch OHLCV data for
72
75
  :param str timeframe: the length of time each candle represents
@@ -98,7 +101,9 @@ class lbank(ccxt.async_support.lbank):
98
101
 
99
102
  async def watch_ohlcv(self, symbol: str, timeframe='1m', since: Int = None, limit: Int = None, params={}) -> List[list]:
100
103
  """
101
- :see: https://www.lbank.com/en-US/docs/index.html#subscription-of-k-line-data
104
+
105
+ https://www.lbank.com/en-US/docs/index.html#subscription-of-k-line-data
106
+
102
107
  watches historical candlestick data containing the open, high, low, and close price, and the volume of a market
103
108
  :param str symbol: unified symbol of the market to fetch OHLCV data for
104
109
  :param str timeframe: the length of time each candle represents
@@ -229,7 +234,9 @@ class lbank(ccxt.async_support.lbank):
229
234
 
230
235
  async def fetch_ticker_ws(self, symbol: str, params={}) -> Ticker:
231
236
  """
232
- :see: https://www.lbank.com/en-US/docs/index.html#request-amp-subscription-instruction
237
+
238
+ https://www.lbank.com/en-US/docs/index.html#request-amp-subscription-instruction
239
+
233
240
  fetches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
234
241
  :param str symbol: unified symbol of the market to fetch the ticker for
235
242
  :param dict [params]: extra parameters specific to the cex api endpoint
@@ -250,7 +257,9 @@ class lbank(ccxt.async_support.lbank):
250
257
 
251
258
  async def watch_ticker(self, symbol: str, params={}) -> Ticker:
252
259
  """
253
- :see: https://www.lbank.com/en-US/docs/index.html#market
260
+
261
+ https://www.lbank.com/en-US/docs/index.html#market
262
+
254
263
  watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
255
264
  :param str symbol: unified symbol of the market to fetch the ticker for
256
265
  :param dict params: extra parameters specific to the lbank api endpoint
@@ -352,7 +361,9 @@ class lbank(ccxt.async_support.lbank):
352
361
  async def fetch_trades_ws(self, symbol: str, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
353
362
  """
354
363
  get the list of most recent trades for a particular symbol
355
- :see: https://www.lbank.com/en-US/docs/index.html#request-amp-subscription-instruction
364
+
365
+ https://www.lbank.com/en-US/docs/index.html#request-amp-subscription-instruction
366
+
356
367
  :param str symbol: unified symbol of the market to fetch trades for
357
368
  :param int [since]: timestamp in ms of the earliest trade to fetch
358
369
  :param int [limit]: the maximum amount of trades to fetch
@@ -377,7 +388,9 @@ class lbank(ccxt.async_support.lbank):
377
388
 
378
389
  async def watch_trades(self, symbol: str, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
379
390
  """
380
- :see: https://www.lbank.com/en-US/docs/index.html#trade-record
391
+
392
+ https://www.lbank.com/en-US/docs/index.html#trade-record
393
+
381
394
  get the list of most recent trades for a particular symbol
382
395
  :param str symbol: unified symbol of the market to fetch trades for
383
396
  :param int [since]: timestamp in ms of the earliest trade to fetch
@@ -416,7 +429,7 @@ class lbank(ccxt.async_support.lbank):
416
429
  # "volume":6.3607,
417
430
  # "amount":77148.9303,
418
431
  # "price":12129,
419
- # "direction":"sell", # or "sell_market"
432
+ # "direction":"sell", # buy, sell, buy_market, sell_market, buy_maker, sell_maker, buy_ioc, sell_ioc, buy_fok, sell_fok
420
433
  # "TS":"2019-06-28T19:55:49.460"
421
434
  # },
422
435
  # "type":"trade",
@@ -454,7 +467,7 @@ class lbank(ccxt.async_support.lbank):
454
467
  # "volume":6.3607,
455
468
  # "amount":77148.9303,
456
469
  # "price":12129,
457
- # "direction":"sell", # or "sell_market"
470
+ # "direction":"sell", # buy, sell, buy_market, sell_market, buy_maker, sell_maker, buy_ioc, sell_ioc, buy_fok, sell_fok
458
471
  # "TS":"2019-06-28T19:55:49.460"
459
472
  # }
460
473
  #
@@ -462,8 +475,14 @@ class lbank(ccxt.async_support.lbank):
462
475
  datetime = (self.iso8601(timestamp)) if (timestamp is not None) else (self.safe_string(trade, 'TS'))
463
476
  if timestamp is None:
464
477
  timestamp = self.parse8601(datetime)
465
- side = self.safe_string_2(trade, 'direction', 3)
466
- side = side.replace('_market', '')
478
+ rawSide = self.safe_string_2(trade, 'direction', 3)
479
+ parts = rawSide.split('_')
480
+ firstPart = self.safe_string(parts, 0)
481
+ secondPart = self.safe_string(parts, 1)
482
+ side = firstPart
483
+ # reverse if it was 'maker'
484
+ if secondPart is not None and secondPart == 'maker':
485
+ side = 'sell' if (side == 'buy') else 'buy'
467
486
  return self.safe_trade({
468
487
  'timestamp': timestamp,
469
488
  'datetime': datetime,
@@ -482,7 +501,9 @@ class lbank(ccxt.async_support.lbank):
482
501
 
483
502
  async def watch_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
484
503
  """
485
- :see: https://github.com/LBank-exchange/lbank-official-api-docs/blob/master/API-For-Spot-EN/WebSocket%20API(Asset%20%26%20Order).md#websocketsubscribeunsubscribe
504
+
505
+ https://www.lbank.com/en-US/docs/index.html#update-subscribed-orders
506
+
486
507
  get the list of trades associated with the user
487
508
  :param str [symbol]: unified symbol of the market to fetch trades for
488
509
  :param int [since]: timestamp in ms of the earliest trade to fetch
@@ -637,9 +658,64 @@ class lbank(ccxt.async_support.lbank):
637
658
  }
638
659
  return self.safe_string(statuses, status, status)
639
660
 
661
+ async def watch_balance(self, params={}) -> Balances:
662
+ """
663
+ watch balance and get the amount of funds available for trading or funds locked in orders
664
+
665
+ https://www.lbank.com/docs/index.html#update-subscribed-asset
666
+
667
+ :param dict [params]: extra parameters specific to the exchange API endpoint
668
+ :returns dict: a `balance structure <https://docs.ccxt.com/#/?id=balance-structure>`
669
+ """
670
+ await self.load_markets()
671
+ key = await self.authenticate(params)
672
+ url = self.urls['api']['ws']
673
+ messageHash = 'balance'
674
+ message: dict = {
675
+ 'action': 'subscribe',
676
+ 'subscribe': 'assetUpdate',
677
+ 'subscribeKey': key,
678
+ }
679
+ request = self.deep_extend(message, params)
680
+ return await self.watch(url, messageHash, request, messageHash, request)
681
+
682
+ def handle_balance(self, client: Client, message):
683
+ #
684
+ # {
685
+ # "data": {
686
+ # "asset": "114548.31881315",
687
+ # "assetCode": "usdt",
688
+ # "free": "97430.6739041",
689
+ # "freeze": "17117.64490905",
690
+ # "time": 1627300043270,
691
+ # "type": "ORDER_CREATE"
692
+ # },
693
+ # "SERVER": "V2",
694
+ # "type": "assetUpdate",
695
+ # "TS": "2021-07-26T19:48:03.548"
696
+ # }
697
+ #
698
+ data = self.safe_dict(message, 'data', {})
699
+ timestamp = self.parse8601(self.safe_string(message, 'TS'))
700
+ datetime = self.iso8601(timestamp)
701
+ self.balance['info'] = data
702
+ self.balance['timestamp'] = timestamp
703
+ self.balance['datetime'] = datetime
704
+ currencyId = self.safe_string(data, 'assetCode')
705
+ code = self.safe_currency_code(currencyId)
706
+ account = self.account()
707
+ account['free'] = self.safe_string(data, 'free')
708
+ account['used'] = self.safe_string(data, 'freeze')
709
+ account['total'] = self.safe_string(data, 'asset')
710
+ self.balance[code] = account
711
+ self.balance = self.safe_balance(self.balance)
712
+ client.resolve(self.balance, 'balance')
713
+
640
714
  async def fetch_order_book_ws(self, symbol: str, limit: Int = None, params={}) -> OrderBook:
641
715
  """
642
- :see: https://www.lbank.com/en-US/docs/index.html#request-amp-subscription-instruction
716
+
717
+ https://www.lbank.com/en-US/docs/index.html#request-amp-subscription-instruction
718
+
643
719
  watches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
644
720
  :param str symbol: unified symbol of the market to fetch the order book for
645
721
  :param int|None limit: the maximum amount of order book entries to return
@@ -664,8 +740,9 @@ class lbank(ccxt.async_support.lbank):
664
740
 
665
741
  async def watch_order_book(self, symbol: str, limit: Int = None, params={}) -> OrderBook:
666
742
  """
667
- :see: https://www.lbank.com/en-US/docs/index.html#market-depth
668
- :see: https://www.lbank.com/en-US/docs/index.html#market-increment-depth
743
+
744
+ https://www.lbank.com/en-US/docs/index.html#market-depth
745
+
669
746
  watches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
670
747
  :param str symbol: unified symbol of the market to fetch the order book for
671
748
  :param int|None limit: the maximum amount of order book entries to return
@@ -780,10 +857,13 @@ class lbank(ccxt.async_support.lbank):
780
857
  # {ping: 'a13a939c-5f25-4e06-9981-93cb3b890707', action: 'ping'}
781
858
  #
782
859
  pingId = self.safe_string(message, 'ping')
783
- await client.send({
784
- 'action': 'pong',
785
- 'pong': pingId,
786
- })
860
+ try:
861
+ await client.send({
862
+ 'action': 'pong',
863
+ 'pong': pingId,
864
+ })
865
+ except Exception as e:
866
+ self.on_error(client, e)
787
867
 
788
868
  def handle_message(self, client, message):
789
869
  status = self.safe_string(message, 'status')
@@ -800,6 +880,7 @@ class lbank(ccxt.async_support.lbank):
800
880
  'trade': self.handle_trades,
801
881
  'tick': self.handle_ticker,
802
882
  'orderUpdate': self.handle_orders,
883
+ 'assetUpdate': self.handle_balance,
803
884
  }
804
885
  handler = self.safe_value(handlers, type)
805
886
  if handler is not None:
ccxt/pro/luno.py CHANGED
@@ -5,20 +5,21 @@
5
5
 
6
6
  import ccxt.async_support
7
7
  from ccxt.async_support.base.ws.cache import ArrayCache
8
- from ccxt.base.types import IndexType, Int, OrderBook, Trade
8
+ from ccxt.base.types import Any, IndexType, Int, OrderBook, Trade
9
9
  from ccxt.async_support.base.ws.client import Client
10
10
  from typing import List
11
11
 
12
12
 
13
13
  class luno(ccxt.async_support.luno):
14
14
 
15
- def describe(self):
15
+ def describe(self) -> Any:
16
16
  return self.deep_extend(super(luno, self).describe(), {
17
17
  'has': {
18
18
  'ws': True,
19
19
  'watchTicker': False,
20
20
  'watchTickers': False,
21
21
  'watchTrades': True,
22
+ 'watchTradesForSymbols': False,
22
23
  'watchMyTrades': False,
23
24
  'watchOrders': None, # is in beta
24
25
  'watchOrderBook': True,
@@ -41,7 +42,9 @@ class luno(ccxt.async_support.luno):
41
42
  async def watch_trades(self, symbol: str, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
42
43
  """
43
44
  get the list of most recent trades for a particular symbol
44
- :see: https://www.luno.com/en/developers/api#tag/Streaming-API
45
+
46
+ https://www.luno.com/en/developers/api#tag/Streaming-API
47
+
45
48
  :param str symbol: unified symbol of the market to fetch trades for
46
49
  :param int [since]: timestamp in ms of the earliest trade to fetch
47
50
  :param int [limit]: the maximum amount of trades to fetch
@@ -193,15 +196,16 @@ class luno(ccxt.async_support.luno):
193
196
  timestamp = self.safe_integer(message, 'timestamp')
194
197
  if not (symbol in self.orderbooks):
195
198
  self.orderbooks[symbol] = self.indexed_order_book({})
196
- orderbook = self.orderbooks[symbol]
197
199
  asks = self.safe_value(message, 'asks')
198
200
  if asks is not None:
199
201
  snapshot = self.custom_parse_order_book(message, symbol, timestamp, 'bids', 'asks', 'price', 'volume', 'id')
200
- orderbook.reset(snapshot)
202
+ self.orderbooks[symbol] = self.indexed_order_book(snapshot)
201
203
  else:
202
- self.handle_delta(orderbook, message)
203
- orderbook['timestamp'] = timestamp
204
- orderbook['datetime'] = self.iso8601(timestamp)
204
+ ob = self.orderbooks[symbol]
205
+ self.handle_delta(ob, message)
206
+ ob['timestamp'] = timestamp
207
+ ob['datetime'] = self.iso8601(timestamp)
208
+ orderbook = self.orderbooks[symbol]
205
209
  nonce = self.safe_integer(message, 'sequence')
206
210
  orderbook['nonce'] = nonce
207
211
  client.resolve(orderbook, messageHash)