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/bithumb.py CHANGED
@@ -5,7 +5,7 @@
5
5
 
6
6
  import ccxt.async_support
7
7
  from ccxt.async_support.base.ws.cache import ArrayCache
8
- from ccxt.base.types import Int, OrderBook, Strings, Ticker, Tickers, Trade
8
+ from ccxt.base.types import Any, Bool, Int, OrderBook, Strings, Ticker, Tickers, Trade
9
9
  from ccxt.async_support.base.ws.client import Client
10
10
  from typing import List
11
11
  from ccxt.base.errors import ExchangeError
@@ -13,7 +13,7 @@ from ccxt.base.errors import ExchangeError
13
13
 
14
14
  class bithumb(ccxt.async_support.bithumb):
15
15
 
16
- def describe(self):
16
+ def describe(self) -> Any:
17
17
  return self.deep_extend(super(bithumb, self).describe(), {
18
18
  'has': {
19
19
  'ws': True,
@@ -37,6 +37,9 @@ class bithumb(ccxt.async_support.bithumb):
37
37
  async def watch_ticker(self, symbol: str, params={}) -> Ticker:
38
38
  """
39
39
  watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
40
+
41
+ https://apidocs.bithumb.com/v1.2.0/reference/%EB%B9%97%EC%8D%B8-%EA%B1%B0%EB%9E%98%EC%86%8C-%EC%A0%95%EB%B3%B4-%EC%88%98%EC%8B%A0
42
+
40
43
  :param str symbol: unified symbol of the market to fetch the ticker for
41
44
  :param dict [params]: extra parameters specific to the exchange API endpoint
42
45
  :param str [params.channel]: the channel to subscribe to, tickers by default. Can be tickers, sprd-tickers, index-tickers, block-tickers
@@ -56,6 +59,9 @@ class bithumb(ccxt.async_support.bithumb):
56
59
  async def watch_tickers(self, symbols: Strings = None, params={}) -> Tickers:
57
60
  """
58
61
  watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for all markets of a specific list
62
+
63
+ https://apidocs.bithumb.com/v1.2.0/reference/%EB%B9%97%EC%8D%B8-%EA%B1%B0%EB%9E%98%EC%86%8C-%EC%A0%95%EB%B3%B4-%EC%88%98%EC%8B%A0
64
+
59
65
  :param str[] symbols: unified symbol of the market to fetch the ticker for
60
66
  :param dict [params]: extra parameters specific to the exchange API endpoint
61
67
  :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
@@ -165,6 +171,9 @@ class bithumb(ccxt.async_support.bithumb):
165
171
 
166
172
  async def watch_order_book(self, symbol: str, limit: Int = None, params={}) -> OrderBook:
167
173
  """
174
+
175
+ https://apidocs.bithumb.com/v1.2.0/reference/%EB%B9%97%EC%8D%B8-%EA%B1%B0%EB%9E%98%EC%86%8C-%EC%A0%95%EB%B3%B4-%EC%88%98%EC%8B%A0
176
+
168
177
  watches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
169
178
  :param str symbol: unified symbol of the market to fetch the order book for
170
179
  :param int [limit]: the maximum amount of order book entries to return
@@ -248,6 +257,9 @@ class bithumb(ccxt.async_support.bithumb):
248
257
  async def watch_trades(self, symbol: str, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
249
258
  """
250
259
  get the list of most recent trades for a particular symbol
260
+
261
+ https://apidocs.bithumb.com/v1.2.0/reference/%EB%B9%97%EC%8D%B8-%EA%B1%B0%EB%9E%98%EC%86%8C-%EC%A0%95%EB%B3%B4-%EC%88%98%EC%8B%A0
262
+
251
263
  :param str symbol: unified symbol of the market to fetch trades for
252
264
  :param int [since]: timestamp in ms of the earliest trade to fetch
253
265
  :param int [limit]: the maximum amount of trades to fetch
@@ -311,18 +323,20 @@ class bithumb(ccxt.async_support.bithumb):
311
323
  # "contPrice" : "10579000",
312
324
  # "contQty" : "0.01",
313
325
  # "contAmt" : "105790.00",
314
- # "contDtm" : "2020-01-29 12:24:18.830039",
326
+ # "contDtm" : "2020-01-29 12:24:18.830038",
315
327
  # "updn" : "dn"
316
328
  # }
317
329
  #
318
330
  marketId = self.safe_string(trade, 'symbol')
319
331
  datetime = self.safe_string(trade, 'contDtm')
332
+ # that date is not UTC iso8601, but exchange's local time, -9hr difference
333
+ timestamp = self.parse8601(datetime) - 32400000
320
334
  sideId = self.safe_string(trade, 'buySellGb')
321
335
  return self.safe_trade({
322
336
  'id': None,
323
337
  'info': trade,
324
- 'timestamp': self.parse8601(datetime),
325
- 'datetime': datetime,
338
+ 'timestamp': timestamp,
339
+ 'datetime': self.iso8601(timestamp),
326
340
  'symbol': self.safe_symbol(marketId, market, '_'),
327
341
  'order': None,
328
342
  'type': None,
@@ -334,7 +348,7 @@ class bithumb(ccxt.async_support.bithumb):
334
348
  'fee': None,
335
349
  }, market)
336
350
 
337
- def handle_error_message(self, client: Client, message):
351
+ def handle_error_message(self, client: Client, message) -> Bool:
338
352
  #
339
353
  # {
340
354
  # "status" : "5100",
ccxt/pro/bitmart.py CHANGED
@@ -7,7 +7,7 @@ import ccxt.async_support
7
7
  from ccxt.async_support.base.ws.cache import ArrayCache, ArrayCacheBySymbolById, ArrayCacheBySymbolBySide, ArrayCacheByTimestamp
8
8
  from ccxt.async_support.base.ws.order_book_side import Asks, Bids
9
9
  import hashlib
10
- from ccxt.base.types import Balances, Int, Market, Order, OrderBook, Position, Str, Strings, Ticker, Tickers, Trade
10
+ from ccxt.base.types import Any, Balances, Bool, Int, Market, Order, OrderBook, Position, Str, Strings, Ticker, Tickers, Trade
11
11
  from ccxt.async_support.base.ws.client import Client
12
12
  from typing import List
13
13
  from ccxt.base.errors import ExchangeError
@@ -17,7 +17,7 @@ from ccxt.base.errors import NotSupported
17
17
 
18
18
  class bitmart(ccxt.async_support.bitmart):
19
19
 
20
- def describe(self):
20
+ def describe(self) -> Any:
21
21
  return self.deep_extend(super(bitmart, self).describe(), {
22
22
  'has': {
23
23
  'createOrderWs': False,
@@ -31,6 +31,7 @@ class bitmart(ccxt.async_support.bitmart):
31
31
  'watchBalance': True,
32
32
  'watchTicker': True,
33
33
  'watchTickers': True,
34
+ 'watchBidsAsks': True,
34
35
  'watchOrderBook': True,
35
36
  'watchOrderBookForSymbols': True,
36
37
  'watchOrders': True,
@@ -48,8 +49,8 @@ class bitmart(ccxt.async_support.bitmart):
48
49
  'private': 'wss://ws-manager-compress.{hostname}/user?protocol=1.1',
49
50
  },
50
51
  'swap': {
51
- 'public': 'wss://openapi-ws.{hostname}/api?protocol=1.1',
52
- 'private': 'wss://openapi-ws.{hostname}/user?protocol=1.1',
52
+ 'public': 'wss://openapi-ws-v2.{hostname}/api?protocol=1.1',
53
+ 'private': 'wss://openapi-ws-v2.{hostname}/user?protocol=1.1',
53
54
  },
54
55
  },
55
56
  },
@@ -70,6 +71,9 @@ class bitmart(ccxt.async_support.bitmart):
70
71
  'watchOrderBookForSymbols': {
71
72
  'depth': 'depth/increase100',
72
73
  },
74
+ 'watchTrades': {
75
+ 'ignoreDuplicates': True,
76
+ },
73
77
  'ws': {
74
78
  'inflate': True,
75
79
  },
@@ -107,6 +111,10 @@ class bitmart(ccxt.async_support.bitmart):
107
111
  }
108
112
  else:
109
113
  messageHash = 'futures/' + channel + ':' + market['id']
114
+ speed = self.safe_string(params, 'speed')
115
+ if speed is not None:
116
+ params = self.omit(params, 'speed')
117
+ messageHash += ':' + speed
110
118
  request = {
111
119
  'action': 'subscribe',
112
120
  'args': [messageHash],
@@ -126,8 +134,10 @@ class bitmart(ccxt.async_support.bitmart):
126
134
  rawSubscriptions.append(message)
127
135
  messageHashes.append(channel + ':' + market['symbol'])
128
136
  # exclusion, futures "tickers" need one generic request for all symbols
129
- if (type != 'spot') and (channel == 'ticker'):
130
- rawSubscriptions = [channelType + '/' + channel]
137
+ # if (type != 'spot') and (channel == 'ticker'):
138
+ # rawSubscriptions = [channelType + '/' + channel]
139
+ # }
140
+ # Exchange update from 2025-02-11 supports subscription by trading pair for swap
131
141
  request: dict = {
132
142
  'args': rawSubscriptions,
133
143
  }
@@ -136,8 +146,10 @@ class bitmart(ccxt.async_support.bitmart):
136
146
 
137
147
  async def watch_balance(self, params={}) -> Balances:
138
148
  """
139
- :see: https://developer-pro.bitmart.com/en/spot/#private-balance-change
140
- :see: https://developer-pro.bitmart.com/en/futures/#private-assets-channel
149
+
150
+ https://developer-pro.bitmart.com/en/spot/#private-balance-change
151
+ https://developer-pro.bitmart.com/en/futuresv2/#private-assets-channel
152
+
141
153
  watch balance and get the amount of funds available for trading or funds locked in orders
142
154
  :param dict [params]: extra parameters specific to the exchange API endpoint
143
155
  :returns dict: a `balance structure <https://docs.ccxt.com/#/?id=balance-structure>`
@@ -256,8 +268,10 @@ class bitmart(ccxt.async_support.bitmart):
256
268
 
257
269
  async def watch_trades(self, symbol: str, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
258
270
  """
259
- :see: https://developer-pro.bitmart.com/en/spot/#public-trade-channel
260
- :see: https://developer-pro.bitmart.com/en/futures/#public-trade-channel
271
+
272
+ https://developer-pro.bitmart.com/en/spot/#public-trade-channel
273
+ https://developer-pro.bitmart.com/en/futuresv2/#public-trade-channel
274
+
261
275
  get the list of most recent trades for a particular symbol
262
276
  :param str symbol: unified symbol of the market to fetch trades for
263
277
  :param int [since]: timestamp in ms of the earliest trade to fetch
@@ -269,7 +283,9 @@ class bitmart(ccxt.async_support.bitmart):
269
283
 
270
284
  async def watch_trades_for_symbols(self, symbols: List[str], since: Int = None, limit: Int = None, params={}) -> List[Trade]:
271
285
  """
272
- :see: https://developer-pro.bitmart.com/en/spot/#public-trade-channel
286
+
287
+ https://developer-pro.bitmart.com/en/spot/#public-trade-channel
288
+
273
289
  get the list of most recent trades for a list of symbols
274
290
  :param str[] symbols: unified symbol of the market to fetch trades for
275
291
  :param int [since]: timestamp in ms of the earliest trade to fetch
@@ -286,7 +302,12 @@ class bitmart(ccxt.async_support.bitmart):
286
302
  first = self.safe_dict(trades, 0)
287
303
  tradeSymbol = self.safe_string(first, 'symbol')
288
304
  limit = trades.getLimit(tradeSymbol, limit)
289
- return self.filter_by_since_limit(trades, since, limit, 'timestamp', True)
305
+ result = self.filter_by_since_limit(trades, since, limit, 'timestamp', True)
306
+ if self.handle_option('watchTrades', 'ignoreDuplicates', True):
307
+ filtered = self.remove_repeated_trades_from_array(result)
308
+ filtered = self.sort_by(filtered, 'timestamp')
309
+ return filtered
310
+ return result
290
311
 
291
312
  def get_params_for_multiple_sub(self, methodName: str, symbols: List[str], limit: Int = None, params={}):
292
313
  symbols = self.market_symbols(symbols, None, False, True)
@@ -300,7 +321,10 @@ class bitmart(ccxt.async_support.bitmart):
300
321
 
301
322
  async def watch_ticker(self, symbol: str, params={}) -> Ticker:
302
323
  """
303
- :see: https://developer-pro.bitmart.com/en/spot/#public-ticker-channel
324
+
325
+ https://developer-pro.bitmart.com/en/spot/#public-ticker-channel
326
+ https://developer-pro.bitmart.com/en/futuresv2/#public-ticker-channel
327
+
304
328
  watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
305
329
  :param str symbol: unified symbol of the market to fetch the ticker for
306
330
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -313,7 +337,10 @@ class bitmart(ccxt.async_support.bitmart):
313
337
 
314
338
  async def watch_tickers(self, symbols: Strings = None, params={}) -> Tickers:
315
339
  """
316
- :see: https://developer-pro.bitmart.com/en/futures/#overview
340
+
341
+ https://developer-pro.bitmart.com/en/spot/#public-ticker-channel
342
+ https://developer-pro.bitmart.com/en/futuresv2/#public-ticker-channel
343
+
317
344
  watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for all markets of a specific list
318
345
  :param str[] symbols: unified symbol of the market to fetch the ticker for
319
346
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -330,11 +357,84 @@ class bitmart(ccxt.async_support.bitmart):
330
357
  return tickers
331
358
  return self.filter_by_array(self.tickers, 'symbol', symbols)
332
359
 
360
+ async def watch_bids_asks(self, symbols: Strings = None, params={}) -> Tickers:
361
+ """
362
+
363
+ https://developer-pro.bitmart.com/en/spot/#public-ticker-channel
364
+ https://developer-pro.bitmart.com/en/futuresv2/#public-ticker-channel
365
+
366
+ watches best bid & ask for symbols
367
+ :param str[] symbols: unified symbol of the market to fetch the ticker for
368
+ :param dict [params]: extra parameters specific to the exchange API endpoint
369
+ :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
370
+ """
371
+ await self.load_markets()
372
+ symbols = self.market_symbols(symbols, None, False)
373
+ firstMarket = self.get_market_from_symbols(symbols)
374
+ marketType = None
375
+ marketType, params = self.handle_market_type_and_params('watchBidsAsks', firstMarket, params)
376
+ url = self.implode_hostname(self.urls['api']['ws'][marketType]['public'])
377
+ channelType = 'spot' if (marketType == 'spot') else 'futures'
378
+ actionType = 'op' if (marketType == 'spot') else 'action'
379
+ rawSubscriptions = []
380
+ messageHashes = []
381
+ for i in range(0, len(symbols)):
382
+ market = self.market(symbols[i])
383
+ rawSubscriptions.append(channelType + '/ticker:' + market['id'])
384
+ messageHashes.append('bidask:' + symbols[i])
385
+ if marketType != 'spot':
386
+ rawSubscriptions = [channelType + '/ticker']
387
+ request: dict = {
388
+ 'args': rawSubscriptions,
389
+ }
390
+ request[actionType] = 'subscribe'
391
+ newTickers = await self.watch_multiple(url, messageHashes, request, rawSubscriptions)
392
+ if self.newUpdates:
393
+ tickers: dict = {}
394
+ tickers[newTickers['symbol']] = newTickers
395
+ return tickers
396
+ return self.filter_by_array(self.bidsasks, 'symbol', symbols)
397
+
398
+ def handle_bid_ask(self, client: Client, message):
399
+ table = self.safe_string(message, 'table')
400
+ isSpot = (table is not None)
401
+ rawTickers = []
402
+ if isSpot:
403
+ rawTickers = self.safe_list(message, 'data', [])
404
+ else:
405
+ rawTickers = [self.safe_value(message, 'data', {})]
406
+ if not len(rawTickers):
407
+ return
408
+ for i in range(0, len(rawTickers)):
409
+ ticker = self.parse_ws_bid_ask(rawTickers[i])
410
+ symbol = ticker['symbol']
411
+ self.bidsasks[symbol] = ticker
412
+ messageHash = 'bidask:' + symbol
413
+ client.resolve(ticker, messageHash)
414
+
415
+ def parse_ws_bid_ask(self, ticker, market=None):
416
+ marketId = self.safe_string(ticker, 'symbol')
417
+ market = self.safe_market(marketId, market)
418
+ symbol = self.safe_string(market, 'symbol')
419
+ timestamp = self.safe_integer(ticker, 'ms_t')
420
+ return self.safe_ticker({
421
+ 'symbol': symbol,
422
+ 'timestamp': timestamp,
423
+ 'datetime': self.iso8601(timestamp),
424
+ 'ask': self.safe_string_2(ticker, 'ask_px', 'ask_price'),
425
+ 'askVolume': self.safe_string_2(ticker, 'ask_sz', 'ask_vol'),
426
+ 'bid': self.safe_string_2(ticker, 'bid_px', 'bid_price'),
427
+ 'bidVolume': self.safe_string_2(ticker, 'bid_sz', 'bid_vol'),
428
+ 'info': ticker,
429
+ }, market)
430
+
333
431
  async def watch_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
334
432
  """
335
433
  watches information on multiple orders made by the user
336
- :see: https://developer-pro.bitmart.com/en/spot/#private-order-progress
337
- :see: https://developer-pro.bitmart.com/en/futures/#private-order-channel
434
+
435
+ https://developer-pro.bitmart.com/en/spot/#private-order-progress
436
+ https://developer-pro.bitmart.com/en/futuresv2/#private-order-channel
437
+
338
438
  :param str symbol: unified market symbol of the market orders were made in
339
439
  :param int [since]: the earliest time in ms to fetch orders for
340
440
  :param int [limit]: the maximum number of order structures to retrieve
@@ -452,7 +552,7 @@ class bitmart(ccxt.async_support.bitmart):
452
552
  client.resolve(newOrders, symbolSpecificMessageHash)
453
553
  client.resolve(newOrders, messageHash)
454
554
 
455
- def parse_ws_order(self, order, market: Market = None):
555
+ def parse_ws_order(self, order: dict, market: Market = None):
456
556
  #
457
557
  # spot
458
558
  # {
@@ -604,9 +704,13 @@ class bitmart(ccxt.async_support.bitmart):
604
704
 
605
705
  async def watch_positions(self, symbols: Strings = None, since: Int = None, limit: Int = None, params={}) -> List[Position]:
606
706
  """
607
- :see: https://developer-pro.bitmart.com/en/futures/#private-position-channel
707
+
708
+ https://developer-pro.bitmart.com/en/futures/#private-position-channel
709
+
608
710
  watch all open positions
609
711
  :param str[]|None symbols: list of unified market symbols
712
+ :param int [since]: the earliest time in ms to fetch positions
713
+ :param int [limit]: the maximum number of positions to retrieve
610
714
  :param dict params: extra parameters specific to the exchange API endpoint
611
715
  :returns dict[]: a list of `position structure <https://docs.ccxt.com/en/latest/manual.html#position-structure>`
612
716
  """
@@ -707,8 +811,8 @@ class bitmart(ccxt.async_support.bitmart):
707
811
  symbol = market['symbol']
708
812
  openTimestamp = self.safe_integer(position, 'create_time')
709
813
  timestamp = self.safe_integer(position, 'update_time')
710
- side = self.safe_number(position, 'position_type')
711
- marginModeId = self.safe_number(position, 'open_type')
814
+ side = self.safe_integer(position, 'position_type')
815
+ marginModeId = self.safe_integer(position, 'open_type')
712
816
  return self.safe_position({
713
817
  'info': position,
714
818
  'id': None,
@@ -762,15 +866,12 @@ class bitmart(ccxt.async_support.bitmart):
762
866
  # "data":[
763
867
  # {
764
868
  # "trade_id":6798697637,
765
- # "contract_id":1,
766
869
  # "symbol":"BTCUSDT",
767
870
  # "deal_price":"39735.8",
768
871
  # "deal_vol":"2",
769
- # "type":0,
770
872
  # "way":1,
771
- # "create_time":1701618503,
772
- # "create_time_mill":1701618503517,
773
- # "created_at":"2023-12-03T15:48:23.517518538Z"
873
+ # "created_at":"2023-12-03T15:48:23.517518538Z",
874
+ # "m": True,
774
875
  # }
775
876
  # ]
776
877
  # }
@@ -802,47 +903,61 @@ class bitmart(ccxt.async_support.bitmart):
802
903
  stored.append(trade)
803
904
  return symbol
804
905
 
805
- def parse_ws_trade(self, trade, market: Market = None):
906
+ def parse_ws_trade(self, trade: dict, market: Market = None):
907
+ #
806
908
  # spot
807
- # {
808
- # "price": "52700.50",
809
- # "s_t": 1630982050,
810
- # "side": "buy",
811
- # "size": "0.00112",
812
- # "symbol": "BTC_USDT"
813
- # }
909
+ # {
910
+ # "ms_t": 1740320841473,
911
+ # "price": "2806.54",
912
+ # "s_t": 1740320841,
913
+ # "side": "sell",
914
+ # "size": "0.77598",
915
+ # "symbol": "ETH_USDT"
916
+ # }
917
+ #
814
918
  # swap
815
- # {
816
- # "trade_id":6798697637,
817
- # "contract_id":1,
818
- # "symbol":"BTCUSDT",
819
- # "deal_price":"39735.8",
820
- # "deal_vol":"2",
821
- # "type":0,
822
- # "way":1,
823
- # "create_time":1701618503,
824
- # "create_time_mill":1701618503517,
825
- # "created_at":"2023-12-03T15:48:23.517518538Z"
826
- # }
919
+ # {
920
+ # "trade_id": "3000000245258661",
921
+ # "symbol": "ETHUSDT",
922
+ # "deal_price": "2811.1",
923
+ # "deal_vol": "1858",
924
+ # "way": 2,
925
+ # "m": True,
926
+ # "created_at": "2025-02-23T13:59:59.646490751Z"
927
+ # }
827
928
  #
828
- contractId = self.safe_string(trade, 'contract_id')
829
- marketType = 'spot' if (contractId is None) else 'swap'
830
- marketDelimiter = '_' if (marketType == 'spot') else ''
831
- timestamp = self.safe_integer(trade, 'create_time_mill', self.safe_timestamp(trade, 's_t'))
832
929
  marketId = self.safe_string(trade, 'symbol')
930
+ market = self.safe_market(marketId, market)
931
+ timestamp = self.safe_integer(trade, 'ms_t')
932
+ datetime: Str = None
933
+ if timestamp is None:
934
+ datetime = self.safe_string(trade, 'created_at')
935
+ timestamp = self.parse8601(datetime)
936
+ else:
937
+ datetime = self.iso8601(timestamp)
938
+ takerOrMaker = None # True for public trades
939
+ side = self.safe_string(trade, 'side')
940
+ buyerMaker = self.safe_bool(trade, 'm')
941
+ if buyerMaker is not None:
942
+ if side is None:
943
+ if buyerMaker:
944
+ side = 'sell'
945
+ else:
946
+ side = 'buy'
947
+ takerOrMaker = 'taker'
833
948
  return self.safe_trade({
834
949
  'info': trade,
835
950
  'id': self.safe_string(trade, 'trade_id'),
836
951
  'order': None,
837
952
  'timestamp': timestamp,
838
- 'datetime': self.iso8601(timestamp),
839
- 'symbol': self.safe_symbol(marketId, market, marketDelimiter, marketType),
953
+ 'datetime': datetime,
954
+ 'symbol': market['symbol'],
840
955
  'type': None,
841
- 'side': self.safe_string(trade, 'side'),
956
+ 'side': side,
842
957
  'price': self.safe_string_2(trade, 'price', 'deal_price'),
843
958
  'amount': self.safe_string_2(trade, 'size', 'deal_vol'),
844
959
  'cost': None,
845
- 'takerOrMaker': None,
960
+ 'takerOrMaker': takerOrMaker,
846
961
  'fee': None,
847
962
  }, market)
848
963
 
@@ -862,21 +977,24 @@ class bitmart(ccxt.async_support.bitmart):
862
977
  # ],
863
978
  # "table": "spot/ticker"
864
979
  # }
865
- # {
866
- # "group":"futures/ticker",
867
- # "data":{
868
- # "symbol":"BTCUSDT",
869
- # "volume_24":"117387.58",
870
- # "fair_price":"146.24",
871
- # "last_price":"146.24",
872
- # "range":"147.17",
873
- # "ask_price": "147.11",
874
- # "ask_vol": "1",
875
- # "bid_price": "142.11",
876
- # "bid_vol": "1"
877
- # }
878
- # }
879
980
  #
981
+ # {
982
+ # "data": {
983
+ # "symbol": "ETHUSDT",
984
+ # "last_price": "2807.73",
985
+ # "volume_24": "2227011952",
986
+ # "range": "0.0273398194664491",
987
+ # "mark_price": "2807.5",
988
+ # "index_price": "2808.71047619",
989
+ # "ask_price": "2808.04",
990
+ # "ask_vol": "7371",
991
+ # "bid_price": "2807.28",
992
+ # "bid_vol": "3561"
993
+ # },
994
+ # "group": "futures/ticker:ETHUSDT@100ms"
995
+ # }
996
+ #
997
+ self.handle_bid_ask(client, message)
880
998
  table = self.safe_string(message, 'table')
881
999
  isSpot = (table is not None)
882
1000
  rawTickers = []
@@ -895,17 +1013,19 @@ class bitmart(ccxt.async_support.bitmart):
895
1013
 
896
1014
  def parse_ws_swap_ticker(self, ticker, market: Market = None):
897
1015
  #
898
- # {
899
- # "symbol":"BTCUSDT",
900
- # "volume_24":"117387.58",
901
- # "fair_price":"146.24",
902
- # "last_price":"146.24",
903
- # "range":"147.17",
904
- # "ask_price": "147.11",
905
- # "ask_vol": "1",
906
- # "bid_price": "142.11",
907
- # "bid_vol": "1"
908
- # }
1016
+ # {
1017
+ # "symbol": "ETHUSDT",
1018
+ # "last_price": "2807.73",
1019
+ # "volume_24": "2227011952",
1020
+ # "range": "0.0273398194664491",
1021
+ # "mark_price": "2807.5",
1022
+ # "index_price": "2808.71047619",
1023
+ # "ask_price": "2808.04",
1024
+ # "ask_vol": "7371",
1025
+ # "bid_price": "2807.28",
1026
+ # "bid_vol": "3561"
1027
+ # }
1028
+ #
909
1029
  marketId = self.safe_string(ticker, 'symbol')
910
1030
  return self.safe_ticker({
911
1031
  'symbol': self.safe_symbol(marketId, market, '', 'swap'),
@@ -924,16 +1044,20 @@ class bitmart(ccxt.async_support.bitmart):
924
1044
  'previousClose': None,
925
1045
  'change': None,
926
1046
  'percentage': None,
927
- 'average': self.safe_string(ticker, 'fair_price'),
1047
+ 'average': None,
928
1048
  'baseVolume': None,
929
1049
  'quoteVolume': self.safe_string(ticker, 'volume_24'),
930
1050
  'info': ticker,
1051
+ 'markPrice': self.safe_string(ticker, 'mark_price'),
1052
+ 'indexPrice': self.safe_string(ticker, 'index_price'),
931
1053
  }, market)
932
1054
 
933
1055
  async def watch_ohlcv(self, symbol: str, timeframe='1m', since: Int = None, limit: Int = None, params={}) -> List[list]:
934
1056
  """
935
- :see: https://developer-pro.bitmart.com/en/spot/#public-kline-channel
936
- :see: https://developer-pro.bitmart.com/en/futures/#public-klinebin-channel
1057
+
1058
+ https://developer-pro.bitmart.com/en/spot/#public-kline-channel
1059
+ https://developer-pro.bitmart.com/en/futuresv2/#public-klinebin-channel
1060
+
937
1061
  watches historical candlestick data containing the open, high, low, and close price, and the volume of a market
938
1062
  :param str symbol: unified symbol of the market to fetch OHLCV data for
939
1063
  :param str timeframe: the length of time each candle represents
@@ -1047,13 +1171,16 @@ class bitmart(ccxt.async_support.bitmart):
1047
1171
 
1048
1172
  async def watch_order_book(self, symbol: str, limit: Int = None, params={}) -> OrderBook:
1049
1173
  """
1050
- :see: https://developer-pro.bitmart.com/en/spot/#public-depth-all-channel
1051
- :see: https://developer-pro.bitmart.com/en/spot/#public-depth-increase-channel
1052
- :see: https://developer-pro.bitmart.com/en/futures/#public-depth-channel
1174
+
1175
+ https://developer-pro.bitmart.com/en/spot/#public-depth-all-channel
1176
+ https://developer-pro.bitmart.com/en/spot/#public-depth-increase-channel
1177
+ https://developer-pro.bitmart.com/en/futuresv2/#public-depth-channel
1178
+
1053
1179
  watches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
1054
1180
  :param str symbol: unified symbol of the market to fetch the order book for
1055
1181
  :param int [limit]: the maximum amount of order book entries to return
1056
1182
  :param dict [params]: extra parameters specific to the exchange API endpoint
1183
+ :param str [params.speed]: *futures only* '100ms' or '200ms'
1057
1184
  :returns dict: A dictionary of `order book structures <https://docs.ccxt.com/#/?id=order-book-structure>` indexed by market symbols
1058
1185
  """
1059
1186
  await self.load_markets()
@@ -1234,7 +1361,7 @@ class bitmart(ccxt.async_support.bitmart):
1234
1361
  ob['symbol'] = symbol
1235
1362
  self.orderbooks[symbol] = ob
1236
1363
  orderbook = self.orderbooks[symbol]
1237
- way = self.safe_number(data, 'way')
1364
+ way = self.safe_integer(data, 'way')
1238
1365
  side = 'bids' if (way == 1) else 'asks'
1239
1366
  if way == 1:
1240
1367
  orderbook[side] = Bids([], limit)
@@ -1262,7 +1389,9 @@ class bitmart(ccxt.async_support.bitmart):
1262
1389
  async def watch_order_book_for_symbols(self, symbols: List[str], limit: Int = None, params={}) -> OrderBook:
1263
1390
  """
1264
1391
  watches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
1265
- :see: https://developer-pro.bitmart.com/en/spot/#public-depth-increase-channel
1392
+
1393
+ https://developer-pro.bitmart.com/en/spot/#public-depth-increase-channel
1394
+
1266
1395
  :param str[] symbols: unified array of symbols
1267
1396
  :param int [limit]: the maximum amount of order book entries to return
1268
1397
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -1333,7 +1462,7 @@ class bitmart(ccxt.async_support.bitmart):
1333
1462
  future = self.safe_value(client.futures, messageHash)
1334
1463
  future.resolve(True)
1335
1464
 
1336
- def handle_error_message(self, client: Client, message):
1465
+ def handle_error_message(self, client: Client, message) -> Bool:
1337
1466
  #
1338
1467
  # {event: "error", message: "Invalid sign", errorCode: 30013}
1339
1468
  # {"event":"error","message":"Unrecognized request: {\"event\":\"subscribe\",\"channel\":\"spot/depth:BTC-USDT\"}","errorCode":30039}