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/cryptocom.py CHANGED
@@ -6,23 +6,25 @@
6
6
  import ccxt.async_support
7
7
  from ccxt.async_support.base.ws.cache import ArrayCache, ArrayCacheBySymbolById, ArrayCacheBySymbolBySide, ArrayCacheByTimestamp
8
8
  import hashlib
9
- from ccxt.base.types import Balances, Int, Num, Order, OrderBook, OrderSide, OrderType, Position, Str, Strings, Ticker, Trade
9
+ from ccxt.base.types import Any, Balances, Bool, Int, Market, Num, Order, OrderBook, OrderSide, OrderType, Position, Str, Strings, Ticker, Tickers, Trade
10
10
  from ccxt.async_support.base.ws.client import Client
11
11
  from typing import List
12
+ from ccxt.base.errors import ExchangeError
12
13
  from ccxt.base.errors import AuthenticationError
13
14
  from ccxt.base.errors import NetworkError
14
- from ccxt.base.errors import InvalidNonce
15
+ from ccxt.base.errors import ChecksumError
15
16
 
16
17
 
17
18
  class cryptocom(ccxt.async_support.cryptocom):
18
19
 
19
- def describe(self):
20
+ def describe(self) -> Any:
20
21
  return self.deep_extend(super(cryptocom, self).describe(), {
21
22
  'has': {
22
23
  'ws': True,
23
24
  'watchBalance': True,
24
25
  'watchTicker': True,
25
- 'watchTickers': False,
26
+ 'watchTickers': True,
27
+ 'watchBidsAsks': True,
26
28
  'watchMyTrades': True,
27
29
  'watchTrades': True,
28
30
  'watchTradesForSymbols': True,
@@ -34,6 +36,7 @@ class cryptocom(ccxt.async_support.cryptocom):
34
36
  'createOrderWs': True,
35
37
  'cancelOrderWs': True,
36
38
  'cancelAllOrders': True,
39
+ 'editOrderWs': True,
37
40
  },
38
41
  'urls': {
39
42
  'api': {
@@ -52,6 +55,9 @@ class cryptocom(ccxt.async_support.cryptocom):
52
55
  'fetchPositionsSnapshot': True, # or False
53
56
  'awaitPositionsSnapshot': True, # whether to wait for the positions snapshot before providing updates
54
57
  },
58
+ 'watchOrderBook': {
59
+ 'checksum': True,
60
+ },
55
61
  },
56
62
  'streaming': {
57
63
  },
@@ -72,7 +78,9 @@ class cryptocom(ccxt.async_support.cryptocom):
72
78
  async def watch_order_book(self, symbol: str, limit: Int = None, params={}) -> OrderBook:
73
79
  """
74
80
  watches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
75
- :see: https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#book-instrument_name
81
+
82
+ https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#book-instrument_name
83
+
76
84
  :param str symbol: unified symbol of the market to fetch the order book for
77
85
  :param int [limit]: the maximum amount of order book entries to return
78
86
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -82,10 +90,26 @@ class cryptocom(ccxt.async_support.cryptocom):
82
90
  """
83
91
  return await self.watch_order_book_for_symbols([symbol], limit, params)
84
92
 
93
+ async def un_watch_order_book(self, symbol: str, params={}) -> Any:
94
+ """
95
+ unWatches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
96
+
97
+ https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#book-instrument_name
98
+
99
+ :param str symbol: unified symbol of the market to fetch the order book for
100
+ :param dict [params]: extra parameters specific to the exchange API endpoint
101
+ :param str [params.bookSubscriptionType]: The subscription type. Allowed values: SNAPSHOT full snapshot. This is the default if not specified. SNAPSHOT_AND_UPDATE delta updates
102
+ :param int [params.bookUpdateFrequency]: Book update interval in ms. Allowed values: 100 for snapshot subscription 10 for delta subscription
103
+ :returns dict: A dictionary of `order book structures <https://docs.ccxt.com/#/?id=order-book-structure>` indexed by market symbols
104
+ """
105
+ return await self.un_watch_order_book_for_symbols([symbol], params)
106
+
85
107
  async def watch_order_book_for_symbols(self, symbols: List[str], limit: Int = None, params={}) -> OrderBook:
86
108
  """
87
109
  watches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
88
- :see: https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#book-instrument_name
110
+
111
+ https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#book-instrument_name
112
+
89
113
  :param str[] symbols: unified array of symbols
90
114
  :param int [limit]: the maximum amount of order book entries to return
91
115
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -123,6 +147,49 @@ class cryptocom(ccxt.async_support.cryptocom):
123
147
  orderbook = await self.watch_public_multiple(messageHashes, topics, params)
124
148
  return orderbook.limit()
125
149
 
150
+ async def un_watch_order_book_for_symbols(self, symbols: List[str], params={}) -> OrderBook:
151
+ """
152
+ unWatches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
153
+
154
+ https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#book-instrument_name
155
+
156
+ :param str[] symbols: unified array of symbols
157
+ :param dict [params]: extra parameters specific to the exchange API endpoint
158
+ :param int [params.limit]: orderbook limit, default is 50
159
+ :param str [params.bookSubscriptionType]: The subscription type. Allowed values: SNAPSHOT full snapshot. This is the default if not specified. SNAPSHOT_AND_UPDATE delta updates
160
+ :param int [params.bookUpdateFrequency]: Book update interval in ms. Allowed values: 100 for snapshot subscription 10 for delta subscription
161
+ :returns dict: A dictionary of `order book structures <https://docs.ccxt.com/#/?id=order-book-structure>` indexed by market symbols
162
+ """
163
+ await self.load_markets()
164
+ symbols = self.market_symbols(symbols)
165
+ topics = []
166
+ subMessageHashes = []
167
+ messageHashes = []
168
+ limit = self.safe_integer(params, 'limit', 50)
169
+ topicParams = self.safe_value(params, 'params')
170
+ if topicParams is None:
171
+ params['params'] = {}
172
+ bookSubscriptionType = None
173
+ bookSubscriptionType2 = None
174
+ bookSubscriptionType, params = self.handle_option_and_params(params, 'watchOrderBook', 'bookSubscriptionType', 'SNAPSHOT_AND_UPDATE')
175
+ bookSubscriptionType2, params = self.handle_option_and_params(params, 'watchOrderBookForSymbols', 'bookSubscriptionType', bookSubscriptionType)
176
+ params['params']['bookSubscriptionType'] = bookSubscriptionType2
177
+ bookUpdateFrequency = None
178
+ bookUpdateFrequency2 = None
179
+ bookUpdateFrequency, params = self.handle_option_and_params(params, 'watchOrderBook', 'bookUpdateFrequency')
180
+ bookUpdateFrequency2, params = self.handle_option_and_params(params, 'watchOrderBookForSymbols', 'bookUpdateFrequency', bookUpdateFrequency)
181
+ if bookUpdateFrequency2 is not None:
182
+ params['params']['bookSubscriptionType'] = bookUpdateFrequency2
183
+ for i in range(0, len(symbols)):
184
+ symbol = symbols[i]
185
+ market = self.market(symbol)
186
+ currentTopic = 'book' + '.' + market['id'] + '.' + str(limit)
187
+ messageHash = 'orderbook:' + market['symbol']
188
+ subMessageHashes.append(messageHash)
189
+ messageHashes.append('unsubscribe:' + messageHash)
190
+ topics.append(currentTopic)
191
+ return await self.un_watch_public_multiple('orderbook', symbols, messageHashes, subMessageHashes, topics, params)
192
+
126
193
  def handle_delta(self, bookside, delta):
127
194
  price = self.safe_float(delta, 0)
128
195
  amount = self.safe_float(delta, 1)
@@ -213,7 +280,9 @@ class cryptocom(ccxt.async_support.cryptocom):
213
280
  previousNonce = self.safe_integer(data, 'pu')
214
281
  currentNonce = orderbook['nonce']
215
282
  if currentNonce != previousNonce:
216
- raise InvalidNonce(self.id + ' watchOrderBook() ' + symbol + ' ' + previousNonce + ' != ' + nonce)
283
+ checksum = self.handle_option('watchOrderBook', 'checksum', True)
284
+ if checksum:
285
+ raise ChecksumError(self.id + ' ' + self.orderbook_checksum_message(symbol))
217
286
  self.handle_deltas(orderbook['asks'], self.safe_value(books, 'asks', []))
218
287
  self.handle_deltas(orderbook['bids'], self.safe_value(books, 'bids', []))
219
288
  orderbook['nonce'] = nonce
@@ -224,7 +293,9 @@ class cryptocom(ccxt.async_support.cryptocom):
224
293
  async def watch_trades(self, symbol: str, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
225
294
  """
226
295
  get the list of most recent trades for a particular symbol
227
- :see: https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#trade-instrument_name
296
+
297
+ https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#trade-instrument_name
298
+
228
299
  :param str symbol: unified symbol of the market to fetch trades for
229
300
  :param int [since]: timestamp in ms of the earliest trade to fetch
230
301
  :param int [limit]: the maximum amount of trades to fetch
@@ -233,11 +304,25 @@ class cryptocom(ccxt.async_support.cryptocom):
233
304
  """
234
305
  return await self.watch_trades_for_symbols([symbol], since, limit, params)
235
306
 
236
- async def watch_trades_for_symbols(self, symbols: List[str], since: Int = None, limit: Int = None, params={}) -> List[Trade]:
307
+ async def un_watch_trades(self, symbol: str, params={}) -> List[Trade]:
237
308
  """
238
309
  get the list of most recent trades for a particular symbol
239
- :see: https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#trade-instrument_name
310
+
311
+ https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#trade-instrument_name
312
+
240
313
  :param str symbol: unified symbol of the market to fetch trades for
314
+ :param dict [params]: extra parameters specific to the exchange API endpoint
315
+ :returns dict[]: a list of `trade structures <https://docs.ccxt.com/#/?id=public-trades>`
316
+ """
317
+ return await self.un_watch_trades_for_symbols([symbol], params)
318
+
319
+ async def watch_trades_for_symbols(self, symbols: List[str], since: Int = None, limit: Int = None, params={}) -> List[Trade]:
320
+ """
321
+ get the list of most recent trades for a particular symbol
322
+
323
+ https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#trade-instrument_name
324
+
325
+ :param str[] symbols: unified symbol of the market to fetch trades for
241
326
  :param int [since]: timestamp in ms of the earliest trade to fetch
242
327
  :param int [limit]: the maximum amount of trades to fetch
243
328
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -258,6 +343,28 @@ class cryptocom(ccxt.async_support.cryptocom):
258
343
  limit = trades.getLimit(tradeSymbol, limit)
259
344
  return self.filter_by_since_limit(trades, since, limit, 'timestamp', True)
260
345
 
346
+ async def un_watch_trades_for_symbols(self, symbols: List[str], params={}) -> Any:
347
+ """
348
+ get the list of most recent trades for a particular symbol
349
+
350
+ https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#trade-instrument_name
351
+
352
+ :param str[] [symbols]: list of unified market symbols to unwatch trades for
353
+ :param dict [params]: extra parameters specific to the exchange API endpoint
354
+ :returns dict[]: a list of `trade structures <https://docs.ccxt.com/#/?id=public-trades>`
355
+ """
356
+ await self.load_markets()
357
+ symbols = self.market_symbols(symbols)
358
+ topics = []
359
+ messageHashes = []
360
+ for i in range(0, len(symbols)):
361
+ symbol = symbols[i]
362
+ market = self.market(symbol)
363
+ currentTopic = 'trade' + '.' + market['id']
364
+ messageHashes.append('unsubscribe:trades:' + market['symbol'])
365
+ topics.append(currentTopic)
366
+ return await self.un_watch_public_multiple('trades', symbols, messageHashes, topics, topics, params)
367
+
261
368
  def handle_trades(self, client: Client, message):
262
369
  #
263
370
  # {
@@ -305,12 +412,14 @@ class cryptocom(ccxt.async_support.cryptocom):
305
412
  async def watch_my_trades(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
306
413
  """
307
414
  watches information on multiple trades made by the user
308
- :see: https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#user-trade-instrument_name
415
+
416
+ https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#user-trade-instrument_name
417
+
309
418
  :param str symbol: unified market symbol of the market trades were made in
310
419
  :param int [since]: the earliest time in ms to fetch trades for
311
420
  :param int [limit]: the maximum number of trade structures to retrieve
312
421
  :param dict [params]: extra parameters specific to the exchange API endpoint
313
- :returns dict[]: a list of [trade structures]{@link https://docs.ccxt.com/#/?id=trade-structure
422
+ :returns dict[]: a list of `trade structures <https://docs.ccxt.com/#/?id=trade-structure>`
314
423
  """
315
424
  await self.load_markets()
316
425
  market = None
@@ -327,7 +436,9 @@ class cryptocom(ccxt.async_support.cryptocom):
327
436
  async def watch_ticker(self, symbol: str, params={}) -> Ticker:
328
437
  """
329
438
  watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
330
- :see: https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#ticker-instrument_name
439
+
440
+ https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#ticker-instrument_name
441
+
331
442
  :param str symbol: unified symbol of the market to fetch the ticker for
332
443
  :param dict [params]: extra parameters specific to the exchange API endpoint
333
444
  :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
@@ -337,44 +448,226 @@ class cryptocom(ccxt.async_support.cryptocom):
337
448
  messageHash = 'ticker' + '.' + market['id']
338
449
  return await self.watch_public(messageHash, params)
339
450
 
451
+ async def un_watch_ticker(self, symbol: str, params={}) -> Any:
452
+ """
453
+ unWatches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
454
+
455
+ https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#ticker-instrument_name
456
+
457
+ :param str symbol: unified symbol of the market to fetch the ticker for
458
+ :param dict [params]: extra parameters specific to the exchange API endpoint
459
+ :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
460
+ """
461
+ await self.load_markets()
462
+ market = self.market(symbol)
463
+ subMessageHash = 'ticker' + '.' + market['id']
464
+ messageHash = 'unsubscribe:ticker:' + market['symbol']
465
+ return await self.un_watch_public_multiple('ticker', [market['symbol']], [messageHash], [subMessageHash], [subMessageHash], params)
466
+
467
+ async def watch_tickers(self, symbols: Strings = None, params={}) -> Tickers:
468
+ """
469
+ watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for all markets of a specific list
470
+
471
+ https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#ticker-instrument_name
472
+
473
+ :param str[] symbols: unified symbol of the market to fetch the ticker for
474
+ :param dict [params]: extra parameters specific to the exchange API endpoint
475
+ :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
476
+ """
477
+ await self.load_markets()
478
+ symbols = self.market_symbols(symbols, None, False)
479
+ messageHashes = []
480
+ marketIds = self.market_ids(symbols)
481
+ for i in range(0, len(marketIds)):
482
+ marketId = marketIds[i]
483
+ messageHashes.append('ticker.' + marketId)
484
+ url = self.urls['api']['ws']['public']
485
+ id = self.nonce()
486
+ request: dict = {
487
+ 'method': 'subscribe',
488
+ 'params': {
489
+ 'channels': messageHashes,
490
+ },
491
+ 'nonce': id,
492
+ }
493
+ ticker = await self.watch_multiple(url, messageHashes, self.extend(request, params), messageHashes)
494
+ if self.newUpdates:
495
+ result: dict = {}
496
+ result[ticker['symbol']] = ticker
497
+ return result
498
+ return self.filter_by_array(self.tickers, 'symbol', symbols)
499
+
500
+ async def un_watch_tickers(self, symbols: Strings = None, params={}) -> Any:
501
+ """
502
+ unWatches a price ticker
503
+
504
+ https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#ticker-instrument_name
505
+
506
+ :param str[] symbols: unified symbol of the market to fetch the ticker for
507
+ :param dict [params]: extra parameters specific to the exchange API endpoint
508
+ :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
509
+ """
510
+ await self.load_markets()
511
+ symbols = self.market_symbols(symbols, None, False)
512
+ messageHashes = []
513
+ subMessageHashes = []
514
+ marketIds = self.market_ids(symbols)
515
+ for i in range(0, len(marketIds)):
516
+ marketId = marketIds[i]
517
+ symbol = symbols[i]
518
+ subMessageHashes.append('ticker.' + marketId)
519
+ messageHashes.append('unsubscribe:ticker:' + symbol)
520
+ return await self.un_watch_public_multiple('ticker', symbols, messageHashes, subMessageHashes, subMessageHashes, params)
521
+
340
522
  def handle_ticker(self, client: Client, message):
341
523
  #
342
- # {
343
- # "info":{
344
- # "instrument_name":"BTC_USDT",
345
- # "subscription":"ticker.BTC_USDT",
346
- # "channel":"ticker",
347
- # "data":[
348
- # {
349
- # "i":"BTC_USDT",
350
- # "b":43063.19,
351
- # "k":43063.2,
352
- # "a":43063.19,
353
- # "t":1648121165658,
354
- # "v":43573.912409,
355
- # "h":43498.51,
356
- # "l":41876.58,
357
- # "c":1087.43
358
- # }
359
- # ]
524
+ # {
525
+ # "instrument_name": "ETHUSD-PERP",
526
+ # "subscription": "ticker.ETHUSD-PERP",
527
+ # "channel": "ticker",
528
+ # "data": [
529
+ # {
530
+ # "h": "2400.20",
531
+ # "l": "2277.10",
532
+ # "a": "2335.25",
533
+ # "c": "-0.0022",
534
+ # "b": "2335.10",
535
+ # "bs": "5.4000",
536
+ # "k": "2335.16",
537
+ # "ks": "1.9970",
538
+ # "i": "ETHUSD-PERP",
539
+ # "v": "1305697.6462",
540
+ # "vv": "3058704939.17",
541
+ # "oi": "161646.3614",
542
+ # "t": 1726069647560
543
+ # }
544
+ # ]
360
545
  # }
361
- # }
362
546
  #
547
+ self.handle_bid_ask(client, message)
363
548
  messageHash = self.safe_string(message, 'subscription')
364
549
  marketId = self.safe_string(message, 'instrument_name')
365
550
  market = self.safe_market(marketId)
366
551
  data = self.safe_value(message, 'data', [])
367
552
  for i in range(0, len(data)):
368
553
  ticker = data[i]
369
- parsed = self.parse_ticker(ticker, market)
554
+ parsed = self.parse_ws_ticker(ticker, market)
370
555
  symbol = parsed['symbol']
371
556
  self.tickers[symbol] = parsed
372
557
  client.resolve(parsed, messageHash)
373
558
 
559
+ def parse_ws_ticker(self, ticker: dict, market: Market = None) -> Ticker:
560
+ #
561
+ # {
562
+ # "h": "2400.20",
563
+ # "l": "2277.10",
564
+ # "a": "2335.25",
565
+ # "c": "-0.0022",
566
+ # "b": "2335.10",
567
+ # "bs": "5.4000",
568
+ # "k": "2335.16",
569
+ # "ks": "1.9970",
570
+ # "i": "ETHUSD-PERP",
571
+ # "v": "1305697.6462",
572
+ # "vv": "3058704939.17",
573
+ # "oi": "161646.3614",
574
+ # "t": 1726069647560
575
+ # }
576
+ #
577
+ timestamp = self.safe_integer(ticker, 't')
578
+ marketId = self.safe_string(ticker, 'i')
579
+ market = self.safe_market(marketId, market, '_')
580
+ quote = self.safe_string(market, 'quote')
581
+ last = self.safe_string(ticker, 'a')
582
+ return self.safe_ticker({
583
+ 'symbol': market['symbol'],
584
+ 'timestamp': timestamp,
585
+ 'datetime': self.iso8601(timestamp),
586
+ 'high': self.safe_number(ticker, 'h'),
587
+ 'low': self.safe_number(ticker, 'l'),
588
+ 'bid': self.safe_number(ticker, 'b'),
589
+ 'bidVolume': self.safe_number(ticker, 'bs'),
590
+ 'ask': self.safe_number(ticker, 'k'),
591
+ 'askVolume': self.safe_number(ticker, 'ks'),
592
+ 'vwap': None,
593
+ 'open': None,
594
+ 'close': last,
595
+ 'last': last,
596
+ 'previousClose': None,
597
+ 'change': None,
598
+ 'percentage': self.safe_string(ticker, 'c'),
599
+ 'average': None,
600
+ 'baseVolume': self.safe_string(ticker, 'v'),
601
+ 'quoteVolume': self.safe_string(ticker, 'vv') if (quote == 'USD') else None,
602
+ 'info': ticker,
603
+ }, market)
604
+
605
+ async def watch_bids_asks(self, symbols: Strings = None, params={}) -> Tickers:
606
+ """
607
+
608
+ https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#ticker-instrument_name
609
+
610
+ watches best bid & ask for symbols
611
+ :param str[] symbols: unified symbol of the market to fetch the ticker for
612
+ :param dict [params]: extra parameters specific to the exchange API endpoint
613
+ :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
614
+ """
615
+ await self.load_markets()
616
+ symbols = self.market_symbols(symbols, None, False)
617
+ messageHashes = []
618
+ topics = []
619
+ marketIds = self.market_ids(symbols)
620
+ for i in range(0, len(marketIds)):
621
+ marketId = marketIds[i]
622
+ messageHashes.append('bidask.' + symbols[i])
623
+ topics.append('ticker.' + marketId)
624
+ url = self.urls['api']['ws']['public']
625
+ id = self.nonce()
626
+ request: dict = {
627
+ 'method': 'subscribe',
628
+ 'params': {
629
+ 'channels': topics,
630
+ },
631
+ 'nonce': id,
632
+ }
633
+ newTickers = await self.watch_multiple(url, messageHashes, self.extend(request, params), messageHashes)
634
+ if self.newUpdates:
635
+ tickers: dict = {}
636
+ tickers[newTickers['symbol']] = newTickers
637
+ return tickers
638
+ return self.filter_by_array(self.bidsasks, 'symbol', symbols)
639
+
640
+ def handle_bid_ask(self, client: Client, message):
641
+ data = self.safe_list(message, 'data', [])
642
+ ticker = self.safe_dict(data, 0, {})
643
+ parsedTicker = self.parse_ws_bid_ask(ticker)
644
+ symbol = parsedTicker['symbol']
645
+ self.bidsasks[symbol] = parsedTicker
646
+ messageHash = 'bidask.' + symbol
647
+ client.resolve(parsedTicker, messageHash)
648
+
649
+ def parse_ws_bid_ask(self, ticker, market=None):
650
+ marketId = self.safe_string(ticker, 'i')
651
+ market = self.safe_market(marketId, market)
652
+ symbol = self.safe_string(market, 'symbol')
653
+ timestamp = self.safe_integer(ticker, 't')
654
+ return self.safe_ticker({
655
+ 'symbol': symbol,
656
+ 'timestamp': timestamp,
657
+ 'datetime': self.iso8601(timestamp),
658
+ 'ask': self.safe_string(ticker, 'k'),
659
+ 'askVolume': self.safe_string(ticker, 'ks'),
660
+ 'bid': self.safe_string(ticker, 'b'),
661
+ 'bidVolume': self.safe_string(ticker, 'bs'),
662
+ 'info': ticker,
663
+ }, market)
664
+
374
665
  async def watch_ohlcv(self, symbol: str, timeframe='1m', since: Int = None, limit: Int = None, params={}) -> List[list]:
375
666
  """
376
667
  watches historical candlestick data containing the open, high, low, and close price, and the volume of a market
377
- :see: https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#candlestick-time_frame-instrument_name
668
+
669
+ https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#candlestick-time_frame-instrument_name
670
+
378
671
  :param str symbol: unified symbol of the market to fetch OHLCV data for
379
672
  :param str timeframe: the length of time each candle represents
380
673
  :param int [since]: timestamp in ms of the earliest candle to fetch
@@ -392,6 +685,28 @@ class cryptocom(ccxt.async_support.cryptocom):
392
685
  limit = ohlcv.getLimit(symbol, limit)
393
686
  return self.filter_by_since_limit(ohlcv, since, limit, 0, True)
394
687
 
688
+ async def un_watch_ohlcv(self, symbol: str, timeframe='1m', params={}) -> Any:
689
+ """
690
+ unWatches historical candlestick data containing the open, high, low, and close price, and the volume of a market
691
+
692
+ https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#candlestick-time_frame-instrument_name
693
+
694
+ :param str symbol: unified symbol of the market to fetch OHLCV data for
695
+ :param str timeframe: the length of time each candle represents
696
+ :param dict [params]: extra parameters specific to the exchange API endpoint
697
+ :returns int[][]: A list of candles ordered, open, high, low, close, volume
698
+ """
699
+ await self.load_markets()
700
+ market = self.market(symbol)
701
+ symbol = market['symbol']
702
+ interval = self.safe_string(self.timeframes, timeframe, timeframe)
703
+ subMessageHash = 'candlestick' + '.' + interval + '.' + market['id']
704
+ messageHash = 'unsubscribe:ohlcv:' + market['symbol'] + ':' + timeframe
705
+ subExtend = {
706
+ 'symbolsAndTimeframes': [[market['symbol'], timeframe]],
707
+ }
708
+ return await self.un_watch_public_multiple('ohlcv', [market['symbol']], [messageHash], [subMessageHash], [subMessageHash], params, subExtend)
709
+
395
710
  def handle_ohlcv(self, client: Client, message):
396
711
  #
397
712
  # {
@@ -425,7 +740,9 @@ class cryptocom(ccxt.async_support.cryptocom):
425
740
  async def watch_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
426
741
  """
427
742
  watches information on multiple orders made by the user
428
- :see: https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#user-order-instrument_name
743
+
744
+ https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#user-order-instrument_name
745
+
429
746
  :param str symbol: unified market symbol of the market orders were made in
430
747
  :param int [since]: the earliest time in ms to fetch orders for
431
748
  :param int [limit]: the maximum number of order structures to retrieve
@@ -495,8 +812,12 @@ class cryptocom(ccxt.async_support.cryptocom):
495
812
  async def watch_positions(self, symbols: Strings = None, since: Int = None, limit: Int = None, params={}) -> List[Position]:
496
813
  """
497
814
  watch all open positions
498
- :see: https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#user-position_balance
499
- :param str[]|None symbols: list of unified market symbols
815
+
816
+ https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#user-position_balance
817
+
818
+ :param str[] [symbols]: list of unified market symbols to watch positions for
819
+ :param int [since]: the earliest time in ms to fetch positions for
820
+ :param int [limit]: the maximum number of positions to retrieve
500
821
  :param dict params: extra parameters specific to the exchange API endpoint
501
822
  :returns dict[]: a list of `position structure <https://docs.ccxt.com/en/latest/manual.html#position-structure>`
502
823
  """
@@ -518,7 +839,7 @@ class cryptocom(ccxt.async_support.cryptocom):
518
839
  client = self.client(url)
519
840
  self.set_positions_cache(client, symbols)
520
841
  fetchPositionsSnapshot = self.handle_option('watchPositions', 'fetchPositionsSnapshot', True)
521
- awaitPositionsSnapshot = self.safe_bool('watchPositions', 'awaitPositionsSnapshot', True)
842
+ awaitPositionsSnapshot = self.handle_option('watchPositions', 'awaitPositionsSnapshot', True)
522
843
  if fetchPositionsSnapshot and awaitPositionsSnapshot and self.positions is None:
523
844
  snapshot = await client.future('fetchPositionsSnapshot')
524
845
  return self.filter_by_symbols_since_limit(snapshot, symbols, since, limit, True)
@@ -604,7 +925,9 @@ class cryptocom(ccxt.async_support.cryptocom):
604
925
  async def watch_balance(self, params={}) -> Balances:
605
926
  """
606
927
  watch balance and get the amount of funds available for trading or funds locked in orders
607
- :see: https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#user-balance
928
+
929
+ https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#user-balance
930
+
608
931
  :param dict [params]: extra parameters specific to the exchange API endpoint
609
932
  :returns dict: a `balance structure <https://docs.ccxt.com/#/?id=balance-structure>`
610
933
  """
@@ -676,13 +999,15 @@ class cryptocom(ccxt.async_support.cryptocom):
676
999
 
677
1000
  async def create_order_ws(self, symbol: str, type: OrderType, side: OrderSide, amount: float, price: Num = None, params={}) -> Order:
678
1001
  """
679
- :see: https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#private-create-order
1002
+
1003
+ https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#private-create-order
1004
+
680
1005
  create a trade order
681
1006
  :param str symbol: unified symbol of the market to create an order in
682
1007
  :param str type: 'market' or 'limit'
683
1008
  :param str side: 'buy' or 'sell'
684
1009
  :param float amount: how much of currency you want to trade in units of base currency
685
- :param float [price]: the price at which the order is to be fullfilled, in units of the quote currency, ignored in market orders
1010
+ :param float [price]: the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
686
1011
  :param dict [params]: extra parameters specific to the exchange API endpoint
687
1012
  :returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
688
1013
  """
@@ -695,6 +1020,31 @@ class cryptocom(ccxt.async_support.cryptocom):
695
1020
  messageHash = self.nonce()
696
1021
  return await self.watch_private_request(messageHash, request)
697
1022
 
1023
+ async def edit_order_ws(self, id: str, symbol: str, type: OrderType, side: OrderSide, amount: Num = None, price: Num = None, params={}) -> Order:
1024
+ """
1025
+ edit a trade order
1026
+
1027
+ https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#private-amend-order
1028
+
1029
+ :param str id: order id
1030
+ :param str symbol: unified market symbol of the order to edit
1031
+ :param str [type]: not used by cryptocom editOrder
1032
+ :param str [side]: not used by cryptocom editOrder
1033
+ :param float amount:(mandatory) how much of the currency you want to trade in units of the base currency
1034
+ :param float price:(mandatory) the price for the order, in units of the quote currency, ignored in market orders
1035
+ :param dict [params]: extra parameters specific to the exchange API endpoint
1036
+ :param str [params.clientOrderId]: the original client order id of the order to edit, required if id is not provided
1037
+ :returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
1038
+ """
1039
+ await self.load_markets()
1040
+ params = self.edit_order_request(id, symbol, amount, price, params)
1041
+ request: dict = {
1042
+ 'method': 'private/amend-order',
1043
+ 'params': params,
1044
+ }
1045
+ messageHash = self.nonce()
1046
+ return await self.watch_private_request(messageHash, request)
1047
+
698
1048
  def handle_order(self, client: Client, message):
699
1049
  #
700
1050
  # {
@@ -715,7 +1065,9 @@ class cryptocom(ccxt.async_support.cryptocom):
715
1065
  async def cancel_order_ws(self, id: str, symbol: Str = None, params={}) -> Order:
716
1066
  """
717
1067
  cancels an open order
718
- :see: https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#private-cancel-order
1068
+
1069
+ https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#private-cancel-order
1070
+
719
1071
  :param str id: the order id of the order to cancel
720
1072
  :param str [symbol]: unified symbol of the market the order was made in
721
1073
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -735,7 +1087,9 @@ class cryptocom(ccxt.async_support.cryptocom):
735
1087
  async def cancel_all_orders_ws(self, symbol: Str = None, params={}):
736
1088
  """
737
1089
  cancel all open orders
738
- :see: https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#private-cancel-all-orders
1090
+
1091
+ https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#private-cancel-all-orders
1092
+
739
1093
  :param str symbol: unified market symbol of the orders to cancel
740
1094
  :param dict [params]: extra parameters specific to the exchange API endpoint
741
1095
  :returns dict} Returns exchange raw message {@link https://docs.ccxt.com/#/?id=order-structure:
@@ -789,6 +1143,27 @@ class cryptocom(ccxt.async_support.cryptocom):
789
1143
  message = self.deep_extend(request, params)
790
1144
  return await self.watch_multiple(url, messageHashes, message, messageHashes)
791
1145
 
1146
+ async def un_watch_public_multiple(self, topic: str, symbols: List[str], messageHashes: List[str], subMessageHashes: List[str], topics: List[str], params={}, subExtend={}):
1147
+ url = self.urls['api']['ws']['public']
1148
+ id = self.nonce()
1149
+ request: dict = {
1150
+ 'method': 'unsubscribe',
1151
+ 'params': {
1152
+ 'channels': topics,
1153
+ },
1154
+ 'nonce': id,
1155
+ 'id': str(id),
1156
+ }
1157
+ subscription = {
1158
+ 'id': str(id),
1159
+ 'topic': topic,
1160
+ 'symbols': symbols,
1161
+ 'subMessageHashes': subMessageHashes,
1162
+ 'messageHashes': messageHashes,
1163
+ }
1164
+ message = self.deep_extend(request, params)
1165
+ return await self.watch_multiple(url, messageHashes, message, messageHashes, self.extend(subscription, subExtend))
1166
+
792
1167
  async def watch_private_request(self, nonce, params={}):
793
1168
  await self.authenticate()
794
1169
  url = self.urls['api']['ws']['private']
@@ -813,7 +1188,7 @@ class cryptocom(ccxt.async_support.cryptocom):
813
1188
  message = self.extend(request, params)
814
1189
  return await self.watch(url, messageHash, message, messageHash)
815
1190
 
816
- def handle_error_message(self, client: Client, message):
1191
+ def handle_error_message(self, client: Client, message) -> Bool:
817
1192
  #
818
1193
  # {
819
1194
  # "id": 0,
@@ -822,6 +1197,7 @@ class cryptocom(ccxt.async_support.cryptocom):
822
1197
  # "message": "invalid channel {"channels":["trade.BTCUSD-PERP"]}"
823
1198
  # }
824
1199
  #
1200
+ id = self.safe_string(message, 'id')
825
1201
  errorCode = self.safe_string(message, 'code')
826
1202
  try:
827
1203
  if errorCode and errorCode != '0':
@@ -830,6 +1206,7 @@ class cryptocom(ccxt.async_support.cryptocom):
830
1206
  messageString = self.safe_value(message, 'message')
831
1207
  if messageString is not None:
832
1208
  self.throw_broadly_matched_exception(self.exceptions['broad'], messageString, feedback)
1209
+ raise ExchangeError(feedback)
833
1210
  return False
834
1211
  except Exception as e:
835
1212
  if isinstance(e, AuthenticationError):
@@ -838,7 +1215,7 @@ class cryptocom(ccxt.async_support.cryptocom):
838
1215
  if messageHash in client.subscriptions:
839
1216
  del client.subscriptions[messageHash]
840
1217
  else:
841
- client.reject(e)
1218
+ client.reject(e, id)
842
1219
  return True
843
1220
 
844
1221
  def handle_subscribe(self, client: Client, message):
@@ -896,6 +1273,9 @@ class cryptocom(ccxt.async_support.cryptocom):
896
1273
  # "channel":"ticker",
897
1274
  # "data":[{}]
898
1275
  #
1276
+ # handle unsubscribe
1277
+ # {"id":1725448572836,"method":"unsubscribe","code":0}
1278
+ #
899
1279
  if self.handle_error_message(client, message):
900
1280
  return
901
1281
  method = self.safe_string(message, 'method')
@@ -904,10 +1284,12 @@ class cryptocom(ccxt.async_support.cryptocom):
904
1284
  'public/heartbeat': self.handle_ping,
905
1285
  'public/auth': self.handle_authenticate,
906
1286
  'private/create-order': self.handle_order,
1287
+ 'private/amend-order': self.handle_order,
907
1288
  'private/cancel-order': self.handle_order,
908
1289
  'private/cancel-all-orders': self.handle_cancel_all_orders,
909
1290
  'private/close-position': self.handle_order,
910
1291
  'subscribe': self.handle_subscribe,
1292
+ 'unsubscribe': self.handle_unsubscribe,
911
1293
  }
912
1294
  callMethod = self.safe_value(methods, method)
913
1295
  if callMethod is not None:
@@ -945,3 +1327,24 @@ class cryptocom(ccxt.async_support.cryptocom):
945
1327
  #
946
1328
  future = self.safe_value(client.futures, 'authenticated')
947
1329
  future.resolve(True)
1330
+
1331
+ def handle_unsubscribe(self, client: Client, message):
1332
+ id = self.safe_string(message, 'id')
1333
+ keys = list(client.subscriptions.keys())
1334
+ for i in range(0, len(keys)):
1335
+ messageHash = keys[i]
1336
+ if not (messageHash in client.subscriptions):
1337
+ continue
1338
+ # the previous iteration can have deleted the messageHash from the subscriptions
1339
+ if messageHash.startswith('unsubscribe'):
1340
+ subscription = client.subscriptions[messageHash]
1341
+ subId = self.safe_string(subscription, 'id')
1342
+ if id != subId:
1343
+ continue
1344
+ messageHashes = self.safe_list(subscription, 'messageHashes', [])
1345
+ subMessageHashes = self.safe_list(subscription, 'subMessageHashes', [])
1346
+ for j in range(0, len(messageHashes)):
1347
+ unsubHash = messageHashes[j]
1348
+ subHash = subMessageHashes[j]
1349
+ self.clean_unsubscription(client, subHash, unsubHash)
1350
+ self.clean_cache(subscription)