ccxt-ir 4.3.46.0.3__py2.py3-none-any.whl → 4.5.1__py2.py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (529) hide show
  1. ccxt/__init__.py +39 -35
  2. ccxt/abantether.py +8 -8
  3. ccxt/abstract/alpaca.py +4 -0
  4. ccxt/abstract/apex.py +31 -0
  5. ccxt/abstract/bigone.py +1 -1
  6. ccxt/abstract/binance.py +106 -48
  7. ccxt/abstract/binancecoinm.py +106 -48
  8. ccxt/abstract/binanceus.py +141 -83
  9. ccxt/abstract/binanceusdm.py +106 -48
  10. ccxt/abstract/bingx.py +50 -1
  11. ccxt/abstract/bitbank.py +5 -0
  12. ccxt/abstract/bitfinex.py +136 -65
  13. ccxt/abstract/bitflyer.py +1 -0
  14. ccxt/abstract/bitget.py +67 -0
  15. ccxt/abstract/bitmart.py +19 -1
  16. ccxt/abstract/bitopro.py +1 -0
  17. ccxt/abstract/bitrue.py +68 -68
  18. ccxt/abstract/bitstamp.py +1 -0
  19. ccxt/abstract/blofin.py +30 -0
  20. ccxt/abstract/btcbox.py +2 -0
  21. ccxt/abstract/bybit.py +28 -13
  22. ccxt/abstract/cex.py +28 -29
  23. ccxt/abstract/coinbaseexchange.py +1 -0
  24. ccxt/abstract/coinbaseinternational.py +1 -1
  25. ccxt/abstract/cryptocom.py +16 -0
  26. ccxt/abstract/cryptomus.py +20 -0
  27. ccxt/abstract/defx.py +69 -0
  28. ccxt/abstract/deribit.py +1 -0
  29. ccxt/abstract/derive.py +117 -0
  30. ccxt/abstract/digifinex.py +1 -0
  31. ccxt/abstract/ellipx.py +25 -0
  32. ccxt/abstract/foxbit.py +26 -0
  33. ccxt/abstract/gate.py +19 -0
  34. ccxt/abstract/gateio.py +19 -0
  35. ccxt/abstract/gemini.py +1 -0
  36. ccxt/abstract/hibachi.py +26 -0
  37. ccxt/abstract/hyperliquid.py +1 -1
  38. ccxt/abstract/independentreserve.py +6 -0
  39. ccxt/abstract/kraken.py +1 -0
  40. ccxt/abstract/krakenfutures.py +4 -0
  41. ccxt/abstract/kucoin.py +10 -0
  42. ccxt/abstract/kucoinfutures.py +18 -0
  43. ccxt/abstract/lbank.py +2 -1
  44. ccxt/abstract/luno.py +1 -0
  45. ccxt/abstract/mexc.py +2 -0
  46. ccxt/abstract/modetrade.py +119 -0
  47. ccxt/abstract/myokx.py +349 -0
  48. ccxt/abstract/oceanex.py +5 -0
  49. ccxt/abstract/okx.py +25 -0
  50. ccxt/abstract/okxus.py +349 -0
  51. ccxt/abstract/onetrading.py +0 -12
  52. ccxt/abstract/paradex.py +23 -0
  53. ccxt/abstract/phemex.py +2 -0
  54. ccxt/abstract/poloniex.py +36 -0
  55. ccxt/abstract/tradeogre.py +3 -1
  56. ccxt/abstract/upbit.py +51 -34
  57. ccxt/abstract/whitebit.py +16 -0
  58. ccxt/abstract/woo.py +64 -6
  59. ccxt/abstract/xt.py +10 -5
  60. ccxt/afratether.py +8 -8
  61. ccxt/alpaca.py +828 -51
  62. ccxt/apex.py +1875 -0
  63. ccxt/arzinja.py +7 -7
  64. ccxt/arzplus.py +9 -9
  65. ccxt/ascendex.py +501 -306
  66. ccxt/async_support/__init__.py +39 -35
  67. ccxt/async_support/abantether.py +8 -8
  68. ccxt/async_support/afratether.py +10 -10
  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 +32 -38
  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 +32 -27
  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 +34 -30
  183. ccxt/async_support/sarmayex.py +9 -9
  184. ccxt/async_support/sarrafex.py +13 -13
  185. ccxt/async_support/tabdeal.py +15 -14
  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 +30 -36
  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 +29 -24
  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 +32 -28
  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 +13 -12
  413. ccxt/test/tests_async.py +261 -57
  414. ccxt/test/tests_helpers.py +1 -3
  415. ccxt/test/tests_init.py +4 -3
  416. ccxt/test/tests_sync.py +261 -57
  417. ccxt/tetherland.py +7 -7
  418. ccxt/timex.py +210 -51
  419. ccxt/tokocrypto.py +167 -47
  420. ccxt/tradeogre.py +266 -31
  421. ccxt/twox.py +7 -7
  422. ccxt/ubitex.py +9 -9
  423. ccxt/upbit.py +568 -165
  424. ccxt/vertex.py +160 -32
  425. ccxt/wallex.py +9 -9
  426. ccxt/wavesexchange.py +165 -30
  427. ccxt/whitebit.py +975 -127
  428. ccxt/woo.py +1917 -1016
  429. ccxt/woofipro.py +432 -141
  430. ccxt/xt.py +649 -193
  431. ccxt/yobit.py +194 -70
  432. ccxt/zaif.py +91 -15
  433. ccxt/zonda.py +151 -36
  434. {ccxt_ir-4.3.46.0.3.dist-info → ccxt_ir-4.5.1.dist-info}/METADATA +225 -73
  435. ccxt_ir-4.5.1.dist-info/RECORD +743 -0
  436. {ccxt_ir-4.3.46.0.3.dist-info → ccxt_ir-4.5.1.dist-info}/WHEEL +1 -1
  437. ccxt/__test__.py +0 -7
  438. ccxt/abstract/ace.py +0 -15
  439. ccxt/abstract/bitbay.py +0 -53
  440. ccxt/abstract/bitcoincom.py +0 -115
  441. ccxt/abstract/bitfinex2.py +0 -139
  442. ccxt/abstract/bitpanda.py +0 -35
  443. ccxt/abstract/bl3p.py +0 -19
  444. ccxt/abstract/coinlist.py +0 -54
  445. ccxt/abstract/currencycom.py +0 -68
  446. ccxt/abstract/hitbtc3.py +0 -115
  447. ccxt/abstract/idex.py +0 -26
  448. ccxt/abstract/kuna.py +0 -182
  449. ccxt/abstract/lykke.py +0 -29
  450. ccxt/abstract/poloniexfutures.py +0 -48
  451. ccxt/abstract/wazirx.py +0 -30
  452. ccxt/ace.py +0 -1012
  453. ccxt/async_support/ace.py +0 -1012
  454. ccxt/async_support/base/ws/aiohttp_client.py +0 -125
  455. ccxt/async_support/base/ws/fast_client.py +0 -96
  456. ccxt/async_support/bitbay.py +0 -17
  457. ccxt/async_support/bitcoincom.py +0 -17
  458. ccxt/async_support/bitfinex2.py +0 -3552
  459. ccxt/async_support/bitpanda.py +0 -16
  460. ccxt/async_support/bl3p.py +0 -485
  461. ccxt/async_support/coinlist.py +0 -2243
  462. ccxt/async_support/currencycom.py +0 -1950
  463. ccxt/async_support/hitbtc3.py +0 -16
  464. ccxt/async_support/idex.py +0 -1766
  465. ccxt/async_support/kuna.py +0 -1841
  466. ccxt/async_support/lykke.py +0 -1270
  467. ccxt/async_support/poloniexfutures.py +0 -1717
  468. ccxt/async_support/wazirx.py +0 -1224
  469. ccxt/bitbay.py +0 -17
  470. ccxt/bitcoincom.py +0 -17
  471. ccxt/bitfinex2.py +0 -3552
  472. ccxt/bitpanda.py +0 -16
  473. ccxt/bl3p.py +0 -485
  474. ccxt/coinlist.py +0 -2243
  475. ccxt/currencycom.py +0 -1950
  476. ccxt/hitbtc3.py +0 -16
  477. ccxt/idex.py +0 -1766
  478. ccxt/kuna.py +0 -1841
  479. ccxt/lykke.py +0 -1270
  480. ccxt/poloniexfutures.py +0 -1717
  481. ccxt/pro/bitcoincom.py +0 -34
  482. ccxt/pro/bitfinex2.py +0 -1083
  483. ccxt/pro/bitpanda.py +0 -15
  484. ccxt/pro/currencycom.py +0 -536
  485. ccxt/pro/idex.py +0 -672
  486. ccxt/pro/poloniexfutures.py +0 -990
  487. ccxt/pro/wazirx.py +0 -749
  488. ccxt/test/base/__init__.py +0 -29
  489. ccxt/test/base/test_account.py +0 -26
  490. ccxt/test/base/test_balance.py +0 -56
  491. ccxt/test/base/test_borrow_interest.py +0 -35
  492. ccxt/test/base/test_borrow_rate.py +0 -32
  493. ccxt/test/base/test_calculate_fee.py +0 -51
  494. ccxt/test/base/test_crypto.py +0 -127
  495. ccxt/test/base/test_currency.py +0 -76
  496. ccxt/test/base/test_datetime.py +0 -109
  497. ccxt/test/base/test_decimal_to_precision.py +0 -392
  498. ccxt/test/base/test_deep_extend.py +0 -68
  499. ccxt/test/base/test_deposit_withdrawal.py +0 -50
  500. ccxt/test/base/test_exchange_datetime_functions.py +0 -76
  501. ccxt/test/base/test_funding_rate_history.py +0 -29
  502. ccxt/test/base/test_last_price.py +0 -31
  503. ccxt/test/base/test_ledger_entry.py +0 -45
  504. ccxt/test/base/test_ledger_item.py +0 -48
  505. ccxt/test/base/test_leverage_tier.py +0 -33
  506. ccxt/test/base/test_liquidation.py +0 -50
  507. ccxt/test/base/test_margin_mode.py +0 -24
  508. ccxt/test/base/test_margin_modification.py +0 -35
  509. ccxt/test/base/test_market.py +0 -193
  510. ccxt/test/base/test_number.py +0 -411
  511. ccxt/test/base/test_ohlcv.py +0 -33
  512. ccxt/test/base/test_open_interest.py +0 -32
  513. ccxt/test/base/test_order.py +0 -64
  514. ccxt/test/base/test_order_book.py +0 -69
  515. ccxt/test/base/test_position.py +0 -60
  516. ccxt/test/base/test_shared_methods.py +0 -353
  517. ccxt/test/base/test_status.py +0 -24
  518. ccxt/test/base/test_throttle.py +0 -126
  519. ccxt/test/base/test_ticker.py +0 -92
  520. ccxt/test/base/test_trade.py +0 -47
  521. ccxt/test/base/test_trading_fee.py +0 -26
  522. ccxt/test/base/test_transaction.py +0 -39
  523. ccxt/test/test_async.py +0 -1649
  524. ccxt/test/test_sync.py +0 -1648
  525. ccxt/wazirx.py +0 -1224
  526. ccxt_ir-4.3.46.0.3.dist-info/RECORD +0 -773
  527. /ccxt/abstract/{huobijp.py → bittrade.py} +0 -0
  528. {ccxt_ir-4.3.46.0.3.dist-info → ccxt_ir-4.5.1.dist-info/licenses}/LICENSE.txt +0 -0
  529. {ccxt_ir-4.3.46.0.3.dist-info → ccxt_ir-4.5.1.dist-info}/top_level.txt +0 -0
ccxt/pro/wazirx.py DELETED
@@ -1,749 +0,0 @@
1
- # -*- coding: utf-8 -*-
2
-
3
- # PLEASE DO NOT EDIT THIS FILE, IT IS GENERATED AND WILL BE OVERWRITTEN:
4
- # https://github.com/ccxt/ccxt/blob/master/CONTRIBUTING.md#how-to-contribute-code
5
-
6
- import ccxt.async_support
7
- from ccxt.async_support.base.ws.cache import ArrayCache, ArrayCacheBySymbolById, ArrayCacheByTimestamp
8
- from ccxt.base.types import Balances, Int, Order, OrderBook, Str, Strings, Ticker, Tickers, Trade
9
- from ccxt.async_support.base.ws.client import Client
10
- from typing import List
11
- from ccxt.base.errors import ExchangeError
12
- from ccxt.base.errors import NotSupported
13
-
14
-
15
- class wazirx(ccxt.async_support.wazirx):
16
-
17
- def describe(self):
18
- return self.deep_extend(super(wazirx, self).describe(), {
19
- 'has': {
20
- 'ws': True,
21
- 'watchBalance': True,
22
- 'watchTicker': True,
23
- 'watchTickers': True,
24
- 'watchTrades': True,
25
- 'watchMyTrades': True,
26
- 'watchOrders': True,
27
- 'watchOrderBook': True,
28
- 'watchOHLCV': True,
29
- },
30
- 'urls': {
31
- 'api': {
32
- 'ws': 'wss://stream.wazirx.com/stream',
33
- },
34
- },
35
- 'options': {
36
- },
37
- 'streaming': {
38
- },
39
- 'exceptions': {
40
- },
41
- 'api': {
42
- 'private': {
43
- 'post': {
44
- 'create_auth_token': 1,
45
- },
46
- },
47
- },
48
- })
49
-
50
- async def watch_balance(self, params={}) -> Balances:
51
- """
52
- watch balance and get the amount of funds available for trading or funds locked in orders
53
- :see: https://docs.wazirx.com/#account-update
54
- :param dict [params]: extra parameters specific to the exchange API endpoint
55
- :returns dict: a `balance structure <https://docs.ccxt.com/#/?id=balance-structure>`
56
- """
57
- await self.load_markets()
58
- token = await self.authenticate(params)
59
- messageHash = 'balance'
60
- url = self.urls['api']['ws']
61
- subscribe: dict = {
62
- 'event': 'subscribe',
63
- 'streams': ['outboundAccountPosition'],
64
- 'auth_key': token,
65
- }
66
- request = self.deep_extend(subscribe, params)
67
- return await self.watch(url, messageHash, request, messageHash)
68
-
69
- def handle_balance(self, client: Client, message):
70
- #
71
- # {
72
- # "data":
73
- # {
74
- # "B": [
75
- # {
76
- # "a":"wrx",
77
- # "b":"2043856.426455209",
78
- # "l":"3001318.98"
79
- # }
80
- # ],
81
- # "E":1631683058909
82
- # },
83
- # "stream":"outboundAccountPosition"
84
- # }
85
- #
86
- data = self.safe_value(message, 'data', {})
87
- balances = self.safe_value(data, 'B', [])
88
- timestamp = self.safe_integer(data, 'E')
89
- self.balance['info'] = balances
90
- self.balance['timestamp'] = timestamp
91
- self.balance['datetime'] = self.iso8601(timestamp)
92
- for i in range(0, len(balances)):
93
- balance = balances[i]
94
- currencyId = self.safe_string(balance, 'a')
95
- code = self.safe_currency_code(currencyId)
96
- available = self.safe_string(balance, 'b')
97
- locked = self.safe_string(balance, 'l')
98
- account = self.account()
99
- account['free'] = available
100
- account['used'] = locked
101
- self.balance[code] = account
102
- self.balance = self.safe_balance(self.balance)
103
- messageHash = 'balance'
104
- client.resolve(self.balance, messageHash)
105
-
106
- def parse_ws_trade(self, trade, market=None):
107
- #
108
- # trade
109
- # {
110
- # "E": 1631681323000, Event time
111
- # "S": "buy", Side
112
- # "a": 26946138, Buyer order ID
113
- # "b": 26946169, Seller order ID
114
- # "m": True, Is buyer maker?
115
- # "p": "7.0", Price
116
- # "q": "15.0", Quantity
117
- # "s": "btcinr", Symbol
118
- # "t": 17376030 Trade ID
119
- # }
120
- # ownTrade
121
- # {
122
- # "E": 1631683058000,
123
- # "S": "ask",
124
- # "U": "inr",
125
- # "a": 114144050,
126
- # "b": 114144121,
127
- # "f": "0.2",
128
- # "m": True,
129
- # "o": 26946170,
130
- # "p": "5.0",
131
- # "q": "20.0",
132
- # "s": "btcinr",
133
- # "t": 17376032,
134
- # "w": "100.0"
135
- # }
136
- #
137
- timestamp = self.safe_integer(trade, 'E')
138
- marketId = self.safe_string(trade, 's')
139
- market = self.safe_market(marketId, market)
140
- feeCost = self.safe_string(trade, 'f')
141
- feeCurrencyId = self.safe_string(trade, 'U')
142
- isMaker = self.safe_value(trade, 'm') is True
143
- fee = None
144
- if feeCost is not None:
145
- fee = {
146
- 'cost': feeCost,
147
- 'currency': self.safe_currency_code(feeCurrencyId),
148
- 'rate': None,
149
- }
150
- return self.safe_trade({
151
- 'id': self.safe_string(trade, 't'),
152
- 'info': trade,
153
- 'timestamp': timestamp,
154
- 'datetime': self.iso8601(timestamp),
155
- 'symbol': market['symbol'],
156
- 'order': self.safe_string_n(trade, ['o']),
157
- 'type': None,
158
- 'side': self.safe_string(trade, 'S'),
159
- 'takerOrMaker': 'maker' if isMaker else 'taker',
160
- 'price': self.safe_string(trade, 'p'),
161
- 'amount': self.safe_string(trade, 'q'),
162
- 'cost': None,
163
- 'fee': fee,
164
- }, market)
165
-
166
- async def watch_ticker(self, symbol: str, params={}) -> Ticker:
167
- """
168
- watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
169
- :see: https://docs.wazirx.com/#all-market-tickers-stream
170
- :param str symbol: unified symbol of the market to fetch the ticker for
171
- :param dict [params]: extra parameters specific to the exchange API endpoint
172
- :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
173
- """
174
- await self.load_markets()
175
- market = self.market(symbol)
176
- url = self.urls['api']['ws']
177
- messageHash = 'ticker:' + market['symbol']
178
- subscribeHash = 'tickers'
179
- stream = '!' + 'ticker@arr'
180
- subscribe: dict = {
181
- 'event': 'subscribe',
182
- 'streams': [stream],
183
- }
184
- request = self.deep_extend(subscribe, params)
185
- return await self.watch(url, messageHash, request, subscribeHash)
186
-
187
- async def watch_tickers(self, symbols: Strings = None, params={}) -> Tickers:
188
- """
189
- watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for all markets of a specific list
190
- :see: https://docs.wazirx.com/#all-market-tickers-stream
191
- :param str[] symbols: unified symbol of the market to fetch the ticker for
192
- :param dict [params]: extra parameters specific to the exchange API endpoint
193
- :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
194
- """
195
- await self.load_markets()
196
- symbols = self.market_symbols(symbols)
197
- url = self.urls['api']['ws']
198
- messageHash = 'tickers'
199
- stream = '!' + 'ticker@arr'
200
- subscribe: dict = {
201
- 'event': 'subscribe',
202
- 'streams': [stream],
203
- }
204
- request = self.deep_extend(subscribe, params)
205
- tickers = await self.watch(url, messageHash, request, messageHash)
206
- return self.filter_by_array(tickers, 'symbol', symbols, False)
207
-
208
- def handle_ticker(self, client: Client, message):
209
- #
210
- # {
211
- # "data":
212
- # [
213
- # {
214
- # "E":1631625534000, # Event time
215
- # "T":"SPOT", # Type
216
- # "U":"wrx", # Quote unit
217
- # "a":"0.0", # Best sell price
218
- # "b":"0.0", # Best buy price
219
- # "c":"5.0", # Last price
220
- # "h":"5.0", # High price
221
- # "l":"5.0", # Low price
222
- # "o":"5.0", # Open price
223
- # "q":"0.0", # Quantity
224
- # "s":"btcwrx", # Symbol
225
- # "u":"btc" # Base unit
226
- # }
227
- # ],
228
- # "stream":"not ticker@arr"
229
- # }
230
- #
231
- data = self.safe_value(message, 'data', [])
232
- for i in range(0, len(data)):
233
- ticker = data[i]
234
- parsedTicker = self.parse_ws_ticker(ticker)
235
- symbol = parsedTicker['symbol']
236
- self.tickers[symbol] = parsedTicker
237
- messageHash = 'ticker:' + symbol
238
- client.resolve(parsedTicker, messageHash)
239
- client.resolve(self.tickers, 'tickers')
240
-
241
- def parse_ws_ticker(self, ticker, market=None):
242
- #
243
- # {
244
- # "E":1631625534000, # Event time
245
- # "T":"SPOT", # Type
246
- # "U":"wrx", # Quote unit
247
- # "a":"0.0", # Best sell price
248
- # "b":"0.0", # Best buy price
249
- # "c":"5.0", # Last price
250
- # "h":"5.0", # High price
251
- # "l":"5.0", # Low price
252
- # "o":"5.0", # Open price
253
- # "q":"0.0", # Quantity
254
- # "s":"btcwrx", # Symbol
255
- # "u":"btc" # Base unit
256
- # }
257
- #
258
- marketId = self.safe_string(ticker, 's')
259
- timestamp = self.safe_integer(ticker, 'E')
260
- return self.safe_ticker({
261
- 'symbol': self.safe_symbol(marketId, market),
262
- 'timestamp': timestamp,
263
- 'datetime': self.iso8601(timestamp),
264
- 'high': self.safe_string(ticker, 'h'),
265
- 'low': self.safe_string(ticker, 'l'),
266
- 'bid': self.safe_number(ticker, 'b'),
267
- 'bidVolume': None,
268
- 'ask': self.safe_number(ticker, 'a'),
269
- 'askVolume': None,
270
- 'vwap': None,
271
- 'open': self.safe_string(ticker, 'o'),
272
- 'close': None,
273
- 'last': self.safe_string(ticker, 'l'),
274
- 'previousClose': None,
275
- 'change': None,
276
- 'percentage': None,
277
- 'average': None,
278
- 'baseVolume': None,
279
- 'quoteVolume': self.safe_string(ticker, 'q'),
280
- 'info': ticker,
281
- }, market)
282
-
283
- async def watch_trades(self, symbol: str, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
284
- """
285
- get the list of most recent trades for a particular symbol
286
- :param str symbol: unified symbol of the market to fetch trades for
287
- :param int [since]: timestamp in ms of the earliest trade to fetch
288
- :param int [limit]: the maximum amount of trades to fetch
289
- :param dict [params]: extra parameters specific to the exchange API endpoint
290
- :returns dict[]: a list of `trade structures <https://docs.ccxt.com/#/?id=public-trades>`
291
- """
292
- await self.load_markets()
293
- market = self.market(symbol)
294
- symbol = market['symbol']
295
- messageHash = market['id'] + '@trades'
296
- url = self.urls['api']['ws']
297
- message: dict = {
298
- 'event': 'subscribe',
299
- 'streams': [messageHash],
300
- }
301
- request = self.extend(message, params)
302
- trades = await self.watch(url, messageHash, request, messageHash)
303
- if self.newUpdates:
304
- limit = trades.getLimit(symbol, limit)
305
- return self.filter_by_since_limit(trades, since, limit, 'timestamp', True)
306
-
307
- def handle_trades(self, client: Client, message):
308
- #
309
- # {
310
- # "data": {
311
- # "trades": [{
312
- # "E": 1631681323000, Event time
313
- # "S": "buy", Side
314
- # "a": 26946138, Buyer order ID
315
- # "b": 26946169, Seller order ID
316
- # "m": True, Is buyer maker?
317
- # "p": "7.0", Price
318
- # "q": "15.0", Quantity
319
- # "s": "btcinr", Symbol
320
- # "t": 17376030 Trade ID
321
- # }]
322
- # },
323
- # "stream": "btcinr@trades"
324
- # }
325
- #
326
- data = self.safe_value(message, 'data', {})
327
- rawTrades = self.safe_value(data, 'trades', [])
328
- messageHash = self.safe_string(message, 'stream')
329
- split = messageHash.split('@')
330
- marketId = self.safe_string(split, 0)
331
- market = self.safe_market(marketId)
332
- symbol = self.safe_symbol(marketId, market)
333
- trades = self.safe_value(self.trades, symbol)
334
- if trades is None:
335
- limit = self.safe_integer(self.options, 'tradesLimit', 1000)
336
- trades = ArrayCache(limit)
337
- self.trades[symbol] = trades
338
- for i in range(0, len(rawTrades)):
339
- parsedTrade = self.parse_ws_trade(rawTrades[i], market)
340
- trades.append(parsedTrade)
341
- client.resolve(trades, messageHash)
342
-
343
- async def watch_my_trades(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
344
- """
345
- watch trades by user
346
- :see: https://docs.wazirx.com/#trade-update
347
- :param str symbol: unified symbol of the market to fetch trades for
348
- :param int [since]: timestamp in ms of the earliest trade to fetch
349
- :param int [limit]: the maximum amount of trades to fetch
350
- :param dict [params]: extra parameters specific to the exchange API endpoint
351
- :returns dict[]: a list of `trade structures <https://docs.ccxt.com/#/?id=public-trades>`
352
- """
353
- await self.load_markets()
354
- token = await self.authenticate(params)
355
- if symbol is not None:
356
- market = self.market(symbol)
357
- symbol = market['symbol']
358
- url = self.urls['api']['ws']
359
- messageHash = 'myTrades'
360
- message: dict = {
361
- 'event': 'subscribe',
362
- 'streams': ['ownTrade'],
363
- 'auth_key': token,
364
- }
365
- request = self.deep_extend(message, params)
366
- trades = await self.watch(url, messageHash, request, messageHash)
367
- if self.newUpdates:
368
- limit = trades.getLimit(symbol, limit)
369
- return self.filter_by_symbol_since_limit(trades, symbol, since, limit, True)
370
-
371
- async def watch_ohlcv(self, symbol: str, timeframe='1m', since: Int = None, limit: Int = None, params={}) -> List[list]:
372
- """
373
- watches historical candlestick data containing the open, high, low, and close price, and the volume of a market
374
- :param str symbol: unified symbol of the market to fetch OHLCV data for
375
- :param str timeframe: the length of time each candle represents
376
- :param int [since]: timestamp in ms of the earliest candle to fetch
377
- :param int [limit]: the maximum amount of candles to fetch
378
- :param dict [params]: extra parameters specific to the exchange API endpoint
379
- :returns int[][]: A list of candles ordered, open, high, low, close, volume
380
- """
381
- await self.load_markets()
382
- market = self.market(symbol)
383
- symbol = market['symbol']
384
- url = self.urls['api']['ws']
385
- messageHash = 'ohlcv:' + symbol + ':' + timeframe
386
- stream = market['id'] + '@kline_' + timeframe
387
- message: dict = {
388
- 'event': 'subscribe',
389
- 'streams': [stream],
390
- }
391
- request = self.deep_extend(message, params)
392
- ohlcv = await self.watch(url, messageHash, request, messageHash)
393
- if self.newUpdates:
394
- limit = ohlcv.getLimit(symbol, limit)
395
- return self.filter_by_since_limit(ohlcv, since, limit, 0, True)
396
-
397
- def handle_ohlcv(self, client: Client, message):
398
- #
399
- # {
400
- # "data": {
401
- # "E":1631683058904, Event time
402
- # "s": "btcinr", Symbol
403
- # "t": 1638747660000, Kline start time
404
- # "T": 1638747719999, Kline close time
405
- # "i": "1m", Interval
406
- # "o": "0.0010", Open price
407
- # "c": "0.0020", Close price
408
- # "h": "0.0025", High price
409
- # "l": "0.0015", Low price
410
- # "v": "1000", Base asset volume
411
- # },
412
- # "stream": "btcinr@kline_1m"
413
- # }
414
- #
415
- data = self.safe_value(message, 'data', {})
416
- marketId = self.safe_string(data, 's')
417
- market = self.safe_market(marketId)
418
- symbol = self.safe_symbol(marketId, market)
419
- timeframe = self.safe_string(data, 'i')
420
- self.ohlcvs[symbol] = self.safe_value(self.ohlcvs, symbol, {})
421
- stored = self.safe_value(self.ohlcvs[symbol], timeframe)
422
- if stored is None:
423
- limit = self.safe_integer(self.options, 'OHLCVLimit', 1000)
424
- stored = ArrayCacheByTimestamp(limit)
425
- self.ohlcvs[symbol][timeframe] = stored
426
- parsed = self.parse_ws_ohlcv(data, market)
427
- stored.append(parsed)
428
- messageHash = 'ohlcv:' + symbol + ':' + timeframe
429
- client.resolve(stored, messageHash)
430
-
431
- def parse_ws_ohlcv(self, ohlcv, market=None) -> list:
432
- #
433
- # {
434
- # "E":1631683058904, Event time
435
- # "s": "btcinr", Symbol
436
- # "t": 1638747660000, Kline start time
437
- # "T": 1638747719999, Kline close time
438
- # "i": "1m", Interval
439
- # "o": "0.0010", Open price
440
- # "c": "0.0020", Close price
441
- # "h": "0.0025", High price
442
- # "l": "0.0015", Low price
443
- # "v": "1000", Base asset volume
444
- # }
445
- #
446
- return [
447
- self.safe_integer(ohlcv, 't'),
448
- self.safe_number(ohlcv, 'o'),
449
- self.safe_number(ohlcv, 'c'),
450
- self.safe_number(ohlcv, 'h'),
451
- self.safe_number(ohlcv, 'l'),
452
- self.safe_number(ohlcv, 'v'),
453
- ]
454
-
455
- async def watch_order_book(self, symbol: str, limit: Int = None, params={}) -> OrderBook:
456
- """
457
- watches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
458
- :see: https://docs.wazirx.com/#depth-stream
459
- :param str symbol: unified symbol of the market to fetch the order book for
460
- :param int [limit]: the maximum amount of order book entries to return
461
- :param dict [params]: extra parameters specific to the exchange API endpoint
462
- :returns dict: A dictionary of `order book structures <https://docs.ccxt.com/#/?id=order-book-structure>` indexed by market symbols
463
- """
464
- await self.load_markets()
465
- market = self.market(symbol)
466
- symbol = market['symbol']
467
- url = self.urls['api']['ws']
468
- messageHash = 'orderbook:' + symbol
469
- stream = market['id'] + '@depth'
470
- subscribe: dict = {
471
- 'event': 'subscribe',
472
- 'streams': [stream],
473
- }
474
- request = self.deep_extend(subscribe, params)
475
- orderbook = await self.watch(url, messageHash, request, messageHash)
476
- return orderbook.limit()
477
-
478
- def handle_delta(self, bookside, delta):
479
- bidAsk = self.parse_bid_ask(delta, 0, 1)
480
- bookside.storeArray(bidAsk)
481
-
482
- def handle_deltas(self, bookside, deltas):
483
- for i in range(0, len(deltas)):
484
- self.handle_delta(bookside, deltas[i])
485
-
486
- def handle_order_book(self, client: Client, message):
487
- #
488
- # {
489
- # "data": {
490
- # "E": 1659475095000,
491
- # "a": [
492
- # ["23051.0", "1.30141"],
493
- # ],
494
- # "b": [
495
- # ["22910.0", "1.30944"],
496
- # ],
497
- # "s": "btcusdt"
498
- # },
499
- # "stream": "btcusdt@depth"
500
- # }
501
- #
502
- data = self.safe_value(message, 'data', {})
503
- timestamp = self.safe_integer(data, 'E')
504
- marketId = self.safe_string(data, 's')
505
- market = self.safe_market(marketId)
506
- symbol = market['symbol']
507
- messageHash = 'orderbook:' + symbol
508
- # currentOrderBook = self.safe_value(self.orderbooks, symbol)
509
- if not (symbol in self.orderbooks):
510
- snapshot = self.parse_order_book(data, symbol, timestamp, 'b', 'a')
511
- self.orderbooks[symbol] = self.order_book(snapshot)
512
- else:
513
- orderbook = self.orderbooks[symbol]
514
- asks = self.safe_list(data, 'a', [])
515
- bids = self.safe_list(data, 'b', [])
516
- self.handle_deltas(orderbook['asks'], asks)
517
- self.handle_deltas(orderbook['bids'], bids)
518
- orderbook['nonce'] = timestamp
519
- orderbook['timestamp'] = timestamp
520
- orderbook['datetime'] = self.iso8601(timestamp)
521
- self.orderbooks[symbol] = orderbook
522
- client.resolve(self.orderbooks[symbol], messageHash)
523
-
524
- async def watch_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
525
- await self.load_markets()
526
- if symbol is not None:
527
- market = self.market(symbol)
528
- symbol = market['symbol']
529
- token = await self.authenticate(params)
530
- messageHash = 'orders'
531
- message: dict = {
532
- 'event': 'subscribe',
533
- 'streams': ['orderUpdate'],
534
- 'auth_key': token,
535
- }
536
- url = self.urls['api']['ws']
537
- request = self.deep_extend(message, params)
538
- orders = await self.watch(url, messageHash, request, messageHash, request)
539
- if self.newUpdates:
540
- limit = orders.getLimit(symbol, limit)
541
- return self.filter_by_symbol_since_limit(orders, symbol, since, limit, True)
542
-
543
- def handle_order(self, client: Client, message):
544
- #
545
- # {
546
- # "data": {
547
- # "E": 1631683058904,
548
- # "O": 1631683058000,
549
- # "S": "ask",
550
- # "V": "70.0",
551
- # "X": "wait",
552
- # "i": 26946170,
553
- # "m": True,
554
- # "o": "sell",
555
- # "p": "5.0",
556
- # "q": "70.0",
557
- # "s": "wrxinr",
558
- # "v": "0.0"
559
- # },
560
- # "stream": "orderUpdate"
561
- # }
562
- #
563
- order = self.safe_value(message, 'data', {})
564
- parsedOrder = self.parse_ws_order(order)
565
- if self.orders is None:
566
- limit = self.safe_integer(self.options, 'ordersLimit', 1000)
567
- self.orders = ArrayCacheBySymbolById(limit)
568
- orders = self.orders
569
- orders.append(parsedOrder)
570
- messageHash = 'orders'
571
- client.resolve(self.orders, messageHash)
572
- messageHash += ':' + parsedOrder['symbol']
573
- client.resolve(self.orders, messageHash)
574
-
575
- def parse_ws_order(self, order, market=None):
576
- #
577
- # {
578
- # "E": 1631683058904,
579
- # "O": 1631683058000,
580
- # "S": "ask",
581
- # "V": "70.0",
582
- # "X": "wait",
583
- # "i": 26946170,
584
- # "m": True,
585
- # "o": "sell",
586
- # "p": "5.0",
587
- # "q": "70.0",
588
- # "s": "wrxinr",
589
- # "v": "0.0"
590
- # }
591
- #
592
- timestamp = self.safe_integer(order, 'O')
593
- marketId = self.safe_string(order, 's')
594
- status = self.safe_string(order, 'X')
595
- market = self.safe_market(marketId)
596
- return self.safe_order({
597
- 'info': order,
598
- 'id': self.safe_string(order, 'i'),
599
- 'clientOrderId': self.safe_string(order, 'c'),
600
- 'datetime': self.iso8601(timestamp),
601
- 'timestamp': timestamp,
602
- 'lastTradeTimestamp': None,
603
- 'symbol': market['symbol'],
604
- 'type': 'limit' if self.safe_value(order, 'm') else 'market',
605
- 'timeInForce': None,
606
- 'postOnly': None,
607
- 'side': self.safe_string(order, 'o'),
608
- 'price': self.safe_string(order, 'p'),
609
- 'stopPrice': None,
610
- 'triggerPrice': None,
611
- 'amount': self.safe_string(order, 'V'),
612
- 'filled': None,
613
- 'remaining': self.safe_string(order, 'q'),
614
- 'cost': None,
615
- 'average': self.safe_string(order, 'v'),
616
- 'status': self.parse_order_status(status),
617
- 'fee': None,
618
- 'trades': None,
619
- }, market)
620
-
621
- def handle_my_trades(self, client: Client, message):
622
- #
623
- # {
624
- # "data": {
625
- # "E": 1631683058000,
626
- # "S": "ask",
627
- # "U": "usdt",
628
- # "a": 114144050,
629
- # "b": 114144121,
630
- # "f": "0.2",
631
- # "ga": "0.0",
632
- # "gc": "usdt",
633
- # "m": True,
634
- # "o": 26946170,
635
- # "p": "5.0",
636
- # "q": "20.0",
637
- # "s": "btcusdt",
638
- # "t": 17376032,
639
- # "w": "100.0"
640
- # },
641
- # "stream": "ownTrade"
642
- # }
643
- #
644
- trade = self.safe_value(message, 'data', {})
645
- messageHash = 'myTrades'
646
- myTrades = None
647
- if self.myTrades is None:
648
- limit = self.safe_integer(self.options, 'tradesLimit', 1000)
649
- myTrades = ArrayCacheBySymbolById(limit)
650
- self.myTrades = myTrades
651
- else:
652
- myTrades = self.myTrades
653
- parsedTrade = self.parse_ws_trade(trade)
654
- myTrades.append(parsedTrade)
655
- client.resolve(myTrades, messageHash)
656
-
657
- def handle_connected(self, client: Client, message):
658
- #
659
- # {
660
- # "data": {
661
- # "timeout_duration": 1800
662
- # },
663
- # "event": "connected"
664
- # }
665
- #
666
- return message
667
-
668
- def handle_subscribed(self, client: Client, message):
669
- #
670
- # {
671
- # "data": {
672
- # "streams": ["not ticker@arr"]
673
- # },
674
- # "event": "subscribed",
675
- # "id": 0
676
- # }
677
- #
678
- return message
679
-
680
- def handle_error(self, client: Client, message):
681
- #
682
- # {
683
- # "data": {
684
- # "code": 400,
685
- # "message": "Invalid request: streams must be an array"
686
- # },
687
- # "event": "error",
688
- # "id": 0
689
- # }
690
- #
691
- # {
692
- # "message": "HeartBeat message not received, closing the connection",
693
- # "status": "error"
694
- # }
695
- #
696
- raise ExchangeError(self.id + ' ' + self.json(message))
697
-
698
- def handle_message(self, client: Client, message):
699
- status = self.safe_string(message, 'status')
700
- if status == 'error':
701
- self.handle_error(client, message)
702
- return
703
- event = self.safe_string(message, 'event')
704
- eventHandlers: dict = {
705
- 'error': self.handle_error,
706
- 'connected': self.handle_connected,
707
- 'subscribed': self.handle_subscribed,
708
- }
709
- eventHandler = self.safe_value(eventHandlers, event)
710
- if eventHandler is not None:
711
- eventHandler(client, message)
712
- return
713
- stream = self.safe_string(message, 'stream', '')
714
- streamHandlers: dict = {
715
- 'ticker@arr': self.handle_ticker,
716
- '@depth': self.handle_order_book,
717
- '@kline': self.handle_ohlcv,
718
- '@trades': self.handle_trades,
719
- 'outboundAccountPosition': self.handle_balance,
720
- 'orderUpdate': self.handle_order,
721
- 'ownTrade': self.handle_my_trades,
722
- }
723
- streams = list(streamHandlers.keys())
724
- for i in range(0, len(streams)):
725
- streamContains = stream.find(streams[i]) > -1
726
- if streamContains:
727
- handler = streamHandlers[streams[i]]
728
- handler(client, message)
729
- return
730
- raise NotSupported(self.id + ' self message type is not supported yet. Message: ' + self.json(message))
731
-
732
- async def authenticate(self, params={}):
733
- url = self.urls['api']['ws']
734
- client = self.client(url)
735
- messageHash = 'authenticated'
736
- now = self.milliseconds()
737
- subscription = self.safe_value(client.subscriptions, messageHash)
738
- expires = self.safe_integer(subscription, 'expires')
739
- if subscription is None or now > expires:
740
- subscription = await self.privatePostCreateAuthToken()
741
- subscription['expires'] = now + self.safe_integer(subscription, 'timeout_duration') * 1000
742
- #
743
- # {
744
- # "auth_key": "Xx***dM",
745
- # "timeout_duration": 900
746
- # }
747
- #
748
- client.subscriptions[messageHash] = subscription
749
- return self.safe_string(subscription, 'auth_key')