ccxt 4.2.76__py2.py3-none-any.whl → 4.4.48__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 (546) hide show
  1. ccxt/__init__.py +36 -14
  2. ccxt/abstract/alpaca.py +4 -0
  3. ccxt/abstract/bigone.py +1 -1
  4. ccxt/abstract/binance.py +112 -48
  5. ccxt/abstract/binancecoinm.py +112 -48
  6. ccxt/abstract/binanceus.py +147 -83
  7. ccxt/abstract/binanceusdm.py +112 -48
  8. ccxt/abstract/bingx.py +133 -78
  9. ccxt/abstract/bitbank.py +5 -0
  10. ccxt/abstract/bitfinex.py +136 -65
  11. ccxt/abstract/bitfinex1.py +69 -0
  12. ccxt/abstract/bitflyer.py +1 -0
  13. ccxt/abstract/bitget.py +8 -1
  14. ccxt/abstract/bitmart.py +13 -1
  15. ccxt/abstract/bitopro.py +1 -0
  16. ccxt/abstract/bitpanda.py +0 -12
  17. ccxt/abstract/bitrue.py +3 -3
  18. ccxt/abstract/bitstamp.py +26 -3
  19. ccxt/abstract/blofin.py +24 -0
  20. ccxt/abstract/btcbox.py +1 -0
  21. ccxt/abstract/bybit.py +29 -14
  22. ccxt/abstract/cex.py +28 -29
  23. ccxt/abstract/coinbase.py +6 -0
  24. ccxt/abstract/coinbaseadvanced.py +94 -0
  25. ccxt/abstract/{coinbasepro.py → coinbaseexchange.py} +1 -0
  26. ccxt/abstract/coinbaseinternational.py +1 -1
  27. ccxt/abstract/coincatch.py +94 -0
  28. ccxt/abstract/coinex.py +233 -123
  29. ccxt/abstract/coinmetro.py +1 -0
  30. ccxt/abstract/cryptocom.py +14 -0
  31. ccxt/abstract/defx.py +69 -0
  32. ccxt/abstract/deribit.py +1 -0
  33. ccxt/abstract/digifinex.py +1 -0
  34. ccxt/abstract/ellipx.py +25 -0
  35. ccxt/abstract/gate.py +20 -0
  36. ccxt/abstract/gateio.py +20 -0
  37. ccxt/abstract/gemini.py +1 -0
  38. ccxt/abstract/hashkey.py +67 -0
  39. ccxt/abstract/hyperliquid.py +1 -1
  40. ccxt/abstract/independentreserve.py +6 -0
  41. ccxt/abstract/kraken.py +4 -3
  42. ccxt/abstract/krakenfutures.py +4 -0
  43. ccxt/abstract/kucoin.py +25 -0
  44. ccxt/abstract/kucoinfutures.py +35 -0
  45. ccxt/abstract/luno.py +2 -0
  46. ccxt/abstract/mexc.py +4 -0
  47. ccxt/abstract/myokx.py +340 -0
  48. ccxt/abstract/oceanex.py +5 -0
  49. ccxt/abstract/okx.py +30 -0
  50. ccxt/abstract/onetrading.py +0 -12
  51. ccxt/abstract/oxfun.py +34 -0
  52. ccxt/abstract/paradex.py +40 -0
  53. ccxt/abstract/phemex.py +1 -0
  54. ccxt/abstract/upbit.py +4 -0
  55. ccxt/abstract/vertex.py +19 -0
  56. ccxt/abstract/whitebit.py +31 -1
  57. ccxt/abstract/woo.py +6 -2
  58. ccxt/abstract/woofipro.py +119 -0
  59. ccxt/abstract/xt.py +153 -0
  60. ccxt/abstract/zonda.py +6 -0
  61. ccxt/ace.py +164 -60
  62. ccxt/alpaca.py +727 -63
  63. ccxt/ascendex.py +395 -249
  64. ccxt/async_support/__init__.py +36 -14
  65. ccxt/async_support/ace.py +164 -60
  66. ccxt/async_support/alpaca.py +727 -63
  67. ccxt/async_support/ascendex.py +396 -249
  68. ccxt/async_support/base/exchange.py +531 -155
  69. ccxt/async_support/base/ws/aiohttp_client.py +28 -5
  70. ccxt/async_support/base/ws/cache.py +3 -2
  71. ccxt/async_support/base/ws/client.py +26 -5
  72. ccxt/async_support/base/ws/fast_client.py +4 -3
  73. ccxt/async_support/base/ws/functions.py +1 -1
  74. ccxt/async_support/base/ws/future.py +40 -31
  75. ccxt/async_support/base/ws/order_book_side.py +3 -0
  76. ccxt/async_support/bequant.py +1 -1
  77. ccxt/async_support/bigone.py +329 -202
  78. ccxt/async_support/binance.py +3513 -1511
  79. ccxt/async_support/binancecoinm.py +2 -1
  80. ccxt/async_support/binanceus.py +12 -1
  81. ccxt/async_support/binanceusdm.py +3 -1
  82. ccxt/async_support/bingx.py +3105 -881
  83. ccxt/async_support/bit2c.py +119 -38
  84. ccxt/async_support/bitbank.py +215 -76
  85. ccxt/async_support/bitbns.py +124 -53
  86. ccxt/async_support/bitfinex.py +3236 -1078
  87. ccxt/async_support/bitfinex1.py +1711 -0
  88. ccxt/async_support/bitflyer.py +239 -50
  89. ccxt/async_support/bitget.py +1513 -563
  90. ccxt/async_support/bithumb.py +201 -67
  91. ccxt/async_support/bitmart.py +1320 -435
  92. ccxt/async_support/bitmex.py +308 -111
  93. ccxt/async_support/bitopro.py +256 -96
  94. ccxt/async_support/bitrue.py +365 -233
  95. ccxt/async_support/bitso.py +201 -89
  96. ccxt/async_support/bitstamp.py +438 -269
  97. ccxt/async_support/bitteam.py +179 -73
  98. ccxt/async_support/bitvavo.py +180 -70
  99. ccxt/async_support/bl3p.py +92 -25
  100. ccxt/async_support/blockchaincom.py +193 -79
  101. ccxt/async_support/blofin.py +403 -150
  102. ccxt/async_support/btcalpha.py +161 -55
  103. ccxt/async_support/btcbox.py +250 -34
  104. ccxt/async_support/btcmarkets.py +232 -85
  105. ccxt/async_support/btcturk.py +159 -60
  106. ccxt/async_support/bybit.py +2326 -1255
  107. ccxt/async_support/cex.py +1409 -1329
  108. ccxt/async_support/coinbase.py +1455 -288
  109. ccxt/async_support/coinbaseadvanced.py +17 -0
  110. ccxt/async_support/{coinbasepro.py → coinbaseexchange.py} +233 -99
  111. ccxt/async_support/coinbaseinternational.py +428 -88
  112. ccxt/async_support/coincatch.py +5152 -0
  113. ccxt/async_support/coincheck.py +121 -38
  114. ccxt/async_support/coinex.py +4020 -3339
  115. ccxt/async_support/coinlist.py +273 -116
  116. ccxt/async_support/coinmate.py +204 -97
  117. ccxt/async_support/coinmetro.py +203 -110
  118. ccxt/async_support/coinone.py +142 -68
  119. ccxt/async_support/coinsph.py +206 -89
  120. ccxt/async_support/coinspot.py +137 -62
  121. ccxt/async_support/cryptocom.py +515 -185
  122. ccxt/async_support/currencycom.py +203 -85
  123. ccxt/async_support/defx.py +2066 -0
  124. ccxt/async_support/delta.py +467 -158
  125. ccxt/async_support/deribit.py +558 -324
  126. ccxt/async_support/digifinex.py +340 -223
  127. ccxt/async_support/ellipx.py +1826 -0
  128. ccxt/async_support/exmo.py +259 -128
  129. ccxt/async_support/gate.py +1473 -464
  130. ccxt/async_support/gemini.py +206 -84
  131. ccxt/async_support/hashkey.py +4164 -0
  132. ccxt/async_support/hitbtc.py +334 -178
  133. ccxt/async_support/hollaex.py +134 -83
  134. ccxt/async_support/htx.py +1095 -563
  135. ccxt/async_support/huobijp.py +105 -56
  136. ccxt/async_support/hyperliquid.py +1634 -269
  137. ccxt/async_support/idex.py +148 -95
  138. ccxt/async_support/independentreserve.py +236 -31
  139. ccxt/async_support/indodax.py +165 -62
  140. ccxt/async_support/kraken.py +871 -354
  141. ccxt/async_support/krakenfutures.py +324 -100
  142. ccxt/async_support/kucoin.py +1050 -355
  143. ccxt/async_support/kucoinfutures.py +1004 -149
  144. ccxt/async_support/kuna.py +138 -106
  145. ccxt/async_support/latoken.py +135 -79
  146. ccxt/async_support/lbank.py +290 -113
  147. ccxt/async_support/luno.py +112 -62
  148. ccxt/async_support/lykke.py +104 -55
  149. ccxt/async_support/mercado.py +36 -29
  150. ccxt/async_support/mexc.py +995 -429
  151. ccxt/async_support/myokx.py +43 -0
  152. ccxt/async_support/ndax.py +163 -82
  153. ccxt/async_support/novadax.py +121 -75
  154. ccxt/async_support/oceanex.py +175 -59
  155. ccxt/async_support/okcoin.py +222 -163
  156. ccxt/async_support/okx.py +1777 -455
  157. ccxt/async_support/onetrading.py +132 -414
  158. ccxt/async_support/oxfun.py +2832 -0
  159. ccxt/async_support/p2b.py +79 -51
  160. ccxt/async_support/paradex.py +2017 -0
  161. ccxt/async_support/paymium.py +56 -32
  162. ccxt/async_support/phemex.py +572 -196
  163. ccxt/async_support/poloniex.py +218 -95
  164. ccxt/async_support/poloniexfutures.py +260 -92
  165. ccxt/async_support/probit.py +143 -110
  166. ccxt/async_support/timex.py +123 -70
  167. ccxt/async_support/tokocrypto.py +129 -93
  168. ccxt/async_support/tradeogre.py +39 -25
  169. ccxt/async_support/upbit.py +322 -113
  170. ccxt/async_support/vertex.py +2983 -0
  171. ccxt/async_support/wavesexchange.py +227 -173
  172. ccxt/async_support/wazirx.py +145 -65
  173. ccxt/async_support/whitebit.py +533 -138
  174. ccxt/async_support/woo.py +1155 -295
  175. ccxt/async_support/woofipro.py +2716 -0
  176. ccxt/async_support/xt.py +4628 -0
  177. ccxt/async_support/yobit.py +160 -92
  178. ccxt/async_support/zaif.py +80 -33
  179. ccxt/async_support/zonda.py +140 -69
  180. ccxt/base/errors.py +51 -20
  181. ccxt/base/exchange.py +1729 -482
  182. ccxt/base/precise.py +10 -0
  183. ccxt/base/types.py +223 -4
  184. ccxt/bequant.py +1 -1
  185. ccxt/bigone.py +329 -202
  186. ccxt/binance.py +3513 -1511
  187. ccxt/binancecoinm.py +2 -1
  188. ccxt/binanceus.py +12 -1
  189. ccxt/binanceusdm.py +3 -1
  190. ccxt/bingx.py +3105 -881
  191. ccxt/bit2c.py +119 -38
  192. ccxt/bitbank.py +215 -76
  193. ccxt/bitbns.py +124 -53
  194. ccxt/bitfinex.py +3235 -1078
  195. ccxt/bitfinex1.py +1710 -0
  196. ccxt/bitflyer.py +239 -50
  197. ccxt/bitget.py +1513 -563
  198. ccxt/bithumb.py +200 -67
  199. ccxt/bitmart.py +1320 -435
  200. ccxt/bitmex.py +308 -111
  201. ccxt/bitopro.py +256 -96
  202. ccxt/bitrue.py +365 -233
  203. ccxt/bitso.py +201 -89
  204. ccxt/bitstamp.py +438 -269
  205. ccxt/bitteam.py +179 -73
  206. ccxt/bitvavo.py +180 -70
  207. ccxt/bl3p.py +92 -25
  208. ccxt/blockchaincom.py +193 -79
  209. ccxt/blofin.py +403 -150
  210. ccxt/btcalpha.py +161 -55
  211. ccxt/btcbox.py +250 -34
  212. ccxt/btcmarkets.py +232 -85
  213. ccxt/btcturk.py +159 -60
  214. ccxt/bybit.py +2326 -1255
  215. ccxt/cex.py +1408 -1329
  216. ccxt/coinbase.py +1455 -288
  217. ccxt/coinbaseadvanced.py +17 -0
  218. ccxt/{coinbasepro.py → coinbaseexchange.py} +233 -99
  219. ccxt/coinbaseinternational.py +428 -88
  220. ccxt/coincatch.py +5152 -0
  221. ccxt/coincheck.py +121 -38
  222. ccxt/coinex.py +4020 -3339
  223. ccxt/coinlist.py +273 -116
  224. ccxt/coinmate.py +204 -97
  225. ccxt/coinmetro.py +203 -110
  226. ccxt/coinone.py +142 -68
  227. ccxt/coinsph.py +206 -89
  228. ccxt/coinspot.py +137 -62
  229. ccxt/cryptocom.py +515 -185
  230. ccxt/currencycom.py +203 -85
  231. ccxt/defx.py +2065 -0
  232. ccxt/delta.py +467 -158
  233. ccxt/deribit.py +558 -324
  234. ccxt/digifinex.py +340 -223
  235. ccxt/ellipx.py +1826 -0
  236. ccxt/exmo.py +259 -128
  237. ccxt/gate.py +1473 -464
  238. ccxt/gemini.py +206 -84
  239. ccxt/hashkey.py +4164 -0
  240. ccxt/hitbtc.py +334 -178
  241. ccxt/hollaex.py +134 -83
  242. ccxt/htx.py +1095 -563
  243. ccxt/huobijp.py +105 -56
  244. ccxt/hyperliquid.py +1633 -269
  245. ccxt/idex.py +148 -95
  246. ccxt/independentreserve.py +235 -31
  247. ccxt/indodax.py +165 -62
  248. ccxt/kraken.py +871 -354
  249. ccxt/krakenfutures.py +324 -100
  250. ccxt/kucoin.py +1050 -355
  251. ccxt/kucoinfutures.py +1004 -149
  252. ccxt/kuna.py +138 -106
  253. ccxt/latoken.py +135 -79
  254. ccxt/lbank.py +290 -113
  255. ccxt/luno.py +112 -62
  256. ccxt/lykke.py +104 -55
  257. ccxt/mercado.py +36 -29
  258. ccxt/mexc.py +994 -429
  259. ccxt/myokx.py +43 -0
  260. ccxt/ndax.py +163 -82
  261. ccxt/novadax.py +121 -75
  262. ccxt/oceanex.py +175 -59
  263. ccxt/okcoin.py +222 -163
  264. ccxt/okx.py +1777 -455
  265. ccxt/onetrading.py +132 -414
  266. ccxt/oxfun.py +2831 -0
  267. ccxt/p2b.py +79 -51
  268. ccxt/paradex.py +2017 -0
  269. ccxt/paymium.py +56 -32
  270. ccxt/phemex.py +572 -196
  271. ccxt/poloniex.py +218 -95
  272. ccxt/poloniexfutures.py +260 -92
  273. ccxt/pro/__init__.py +29 -5
  274. ccxt/pro/alpaca.py +32 -17
  275. ccxt/pro/ascendex.py +63 -15
  276. ccxt/pro/bequant.py +4 -0
  277. ccxt/pro/binance.py +1596 -329
  278. ccxt/pro/binancecoinm.py +1 -0
  279. ccxt/pro/binanceus.py +2 -9
  280. ccxt/pro/binanceusdm.py +2 -0
  281. ccxt/pro/bingx.py +527 -134
  282. ccxt/pro/bitcoincom.py +4 -1
  283. ccxt/pro/bitfinex.py +731 -266
  284. ccxt/pro/bitfinex1.py +635 -0
  285. ccxt/pro/bitget.py +726 -357
  286. ccxt/pro/bithumb.py +380 -0
  287. ccxt/pro/bitmart.py +138 -39
  288. ccxt/pro/bitmex.py +199 -40
  289. ccxt/pro/bitopro.py +25 -13
  290. ccxt/pro/bitrue.py +31 -32
  291. ccxt/pro/bitstamp.py +7 -6
  292. ccxt/pro/bitvavo.py +204 -82
  293. ccxt/pro/blockchaincom.py +30 -17
  294. ccxt/pro/blofin.py +692 -0
  295. ccxt/pro/bybit.py +791 -82
  296. ccxt/pro/cex.py +99 -51
  297. ccxt/pro/coinbase.py +220 -30
  298. ccxt/{async_support/hitbtc3.py → pro/coinbaseadvanced.py} +5 -5
  299. ccxt/pro/{coinbasepro.py → coinbaseexchange.py} +19 -19
  300. ccxt/pro/coinbaseinternational.py +193 -30
  301. ccxt/pro/coincatch.py +1464 -0
  302. ccxt/pro/coincheck.py +11 -6
  303. ccxt/pro/coinex.py +967 -661
  304. ccxt/pro/coinone.py +17 -10
  305. ccxt/pro/cryptocom.py +446 -66
  306. ccxt/pro/currencycom.py +11 -10
  307. ccxt/pro/defx.py +832 -0
  308. ccxt/pro/deribit.py +168 -32
  309. ccxt/pro/exmo.py +253 -21
  310. ccxt/pro/gate.py +729 -64
  311. ccxt/pro/gemini.py +44 -26
  312. ccxt/pro/hashkey.py +802 -0
  313. ccxt/pro/hitbtc.py +208 -103
  314. ccxt/pro/hollaex.py +25 -9
  315. ccxt/pro/htx.py +83 -39
  316. ccxt/pro/huobijp.py +17 -16
  317. ccxt/pro/hyperliquid.py +502 -31
  318. ccxt/pro/idex.py +28 -13
  319. ccxt/pro/independentreserve.py +21 -16
  320. ccxt/pro/kraken.py +298 -51
  321. ccxt/pro/krakenfutures.py +166 -75
  322. ccxt/pro/kucoin.py +395 -77
  323. ccxt/pro/kucoinfutures.py +400 -99
  324. ccxt/pro/lbank.py +52 -31
  325. ccxt/pro/luno.py +12 -10
  326. ccxt/pro/mexc.py +400 -50
  327. ccxt/pro/myokx.py +28 -0
  328. ccxt/pro/ndax.py +25 -12
  329. ccxt/pro/okcoin.py +28 -9
  330. ccxt/pro/okx.py +935 -124
  331. ccxt/pro/onetrading.py +41 -24
  332. ccxt/pro/oxfun.py +1054 -0
  333. ccxt/pro/p2b.py +100 -24
  334. ccxt/pro/paradex.py +352 -0
  335. ccxt/pro/phemex.py +93 -34
  336. ccxt/pro/poloniex.py +129 -50
  337. ccxt/pro/poloniexfutures.py +53 -32
  338. ccxt/pro/probit.py +93 -86
  339. ccxt/pro/upbit.py +401 -8
  340. ccxt/pro/vertex.py +943 -0
  341. ccxt/pro/wazirx.py +46 -28
  342. ccxt/pro/whitebit.py +65 -12
  343. ccxt/pro/woo.py +486 -70
  344. ccxt/pro/woofipro.py +1271 -0
  345. ccxt/pro/xt.py +1067 -0
  346. ccxt/probit.py +143 -110
  347. ccxt/static_dependencies/__init__.py +1 -1
  348. ccxt/static_dependencies/lark/__init__.py +38 -0
  349. ccxt/static_dependencies/lark/__pyinstaller/__init__.py +6 -0
  350. ccxt/static_dependencies/lark/__pyinstaller/hook-lark.py +14 -0
  351. ccxt/static_dependencies/lark/ast_utils.py +59 -0
  352. ccxt/static_dependencies/lark/common.py +86 -0
  353. ccxt/static_dependencies/lark/exceptions.py +292 -0
  354. ccxt/static_dependencies/lark/grammar.py +130 -0
  355. ccxt/static_dependencies/lark/grammars/__init__.py +0 -0
  356. ccxt/static_dependencies/lark/indenter.py +143 -0
  357. ccxt/static_dependencies/lark/lark.py +658 -0
  358. ccxt/static_dependencies/lark/lexer.py +678 -0
  359. ccxt/static_dependencies/lark/load_grammar.py +1428 -0
  360. ccxt/static_dependencies/lark/parse_tree_builder.py +391 -0
  361. ccxt/static_dependencies/lark/parser_frontends.py +257 -0
  362. ccxt/static_dependencies/lark/parsers/__init__.py +0 -0
  363. ccxt/static_dependencies/lark/parsers/cyk.py +340 -0
  364. ccxt/static_dependencies/lark/parsers/earley.py +314 -0
  365. ccxt/static_dependencies/lark/parsers/earley_common.py +42 -0
  366. ccxt/static_dependencies/lark/parsers/earley_forest.py +801 -0
  367. ccxt/static_dependencies/lark/parsers/grammar_analysis.py +203 -0
  368. ccxt/static_dependencies/lark/parsers/lalr_analysis.py +332 -0
  369. ccxt/static_dependencies/lark/parsers/lalr_interactive_parser.py +158 -0
  370. ccxt/static_dependencies/lark/parsers/lalr_parser.py +122 -0
  371. ccxt/static_dependencies/lark/parsers/lalr_parser_state.py +110 -0
  372. ccxt/static_dependencies/lark/parsers/xearley.py +165 -0
  373. ccxt/static_dependencies/lark/py.typed +0 -0
  374. ccxt/static_dependencies/lark/reconstruct.py +107 -0
  375. ccxt/static_dependencies/lark/tools/__init__.py +70 -0
  376. ccxt/static_dependencies/lark/tools/nearley.py +202 -0
  377. ccxt/static_dependencies/lark/tools/serialize.py +32 -0
  378. ccxt/static_dependencies/lark/tools/standalone.py +196 -0
  379. ccxt/static_dependencies/lark/tree.py +267 -0
  380. ccxt/static_dependencies/lark/tree_matcher.py +186 -0
  381. ccxt/static_dependencies/lark/tree_templates.py +180 -0
  382. ccxt/static_dependencies/lark/utils.py +343 -0
  383. ccxt/static_dependencies/lark/visitors.py +596 -0
  384. ccxt/static_dependencies/marshmallow/__init__.py +81 -0
  385. ccxt/static_dependencies/marshmallow/base.py +65 -0
  386. ccxt/static_dependencies/marshmallow/class_registry.py +94 -0
  387. ccxt/static_dependencies/marshmallow/decorators.py +231 -0
  388. ccxt/static_dependencies/marshmallow/error_store.py +60 -0
  389. ccxt/static_dependencies/marshmallow/exceptions.py +71 -0
  390. ccxt/static_dependencies/marshmallow/fields.py +2114 -0
  391. ccxt/static_dependencies/marshmallow/orderedset.py +89 -0
  392. ccxt/static_dependencies/marshmallow/py.typed +0 -0
  393. ccxt/static_dependencies/marshmallow/schema.py +1228 -0
  394. ccxt/static_dependencies/marshmallow/types.py +12 -0
  395. ccxt/static_dependencies/marshmallow/utils.py +378 -0
  396. ccxt/static_dependencies/marshmallow/validate.py +678 -0
  397. ccxt/static_dependencies/marshmallow/warnings.py +2 -0
  398. ccxt/static_dependencies/marshmallow_dataclass/__init__.py +1047 -0
  399. ccxt/static_dependencies/marshmallow_dataclass/collection_field.py +51 -0
  400. ccxt/static_dependencies/marshmallow_dataclass/lazy_class_attribute.py +45 -0
  401. ccxt/static_dependencies/marshmallow_dataclass/mypy.py +71 -0
  402. ccxt/static_dependencies/marshmallow_dataclass/py.typed +0 -0
  403. ccxt/static_dependencies/marshmallow_dataclass/typing.py +14 -0
  404. ccxt/static_dependencies/marshmallow_dataclass/union_field.py +82 -0
  405. ccxt/static_dependencies/marshmallow_oneofschema/__init__.py +1 -0
  406. ccxt/static_dependencies/marshmallow_oneofschema/one_of_schema.py +193 -0
  407. ccxt/static_dependencies/marshmallow_oneofschema/py.typed +0 -0
  408. ccxt/static_dependencies/starknet/__init__.py +0 -0
  409. ccxt/static_dependencies/starknet/cairo/__init__.py +0 -0
  410. ccxt/static_dependencies/starknet/cairo/data_types.py +123 -0
  411. ccxt/static_dependencies/starknet/cairo/deprecated_parse/__init__.py +0 -0
  412. ccxt/static_dependencies/starknet/cairo/deprecated_parse/cairo_types.py +77 -0
  413. ccxt/static_dependencies/starknet/cairo/deprecated_parse/parser.py +46 -0
  414. ccxt/static_dependencies/starknet/cairo/deprecated_parse/parser_transformer.py +138 -0
  415. ccxt/static_dependencies/starknet/cairo/felt.py +64 -0
  416. ccxt/static_dependencies/starknet/cairo/type_parser.py +121 -0
  417. ccxt/static_dependencies/starknet/cairo/v1/__init__.py +0 -0
  418. ccxt/static_dependencies/starknet/cairo/v1/type_parser.py +59 -0
  419. ccxt/static_dependencies/starknet/cairo/v2/__init__.py +0 -0
  420. ccxt/static_dependencies/starknet/cairo/v2/type_parser.py +77 -0
  421. ccxt/static_dependencies/starknet/ccxt_utils.py +7 -0
  422. ccxt/static_dependencies/starknet/common.py +15 -0
  423. ccxt/static_dependencies/starknet/constants.py +39 -0
  424. ccxt/static_dependencies/starknet/hash/__init__.py +0 -0
  425. ccxt/static_dependencies/starknet/hash/address.py +79 -0
  426. ccxt/static_dependencies/starknet/hash/compiled_class_hash_objects.py +111 -0
  427. ccxt/static_dependencies/starknet/hash/selector.py +16 -0
  428. ccxt/static_dependencies/starknet/hash/storage.py +12 -0
  429. ccxt/static_dependencies/starknet/hash/utils.py +78 -0
  430. ccxt/static_dependencies/starknet/models/__init__.py +0 -0
  431. ccxt/static_dependencies/starknet/models/typed_data.py +45 -0
  432. ccxt/static_dependencies/starknet/serialization/__init__.py +24 -0
  433. ccxt/static_dependencies/starknet/serialization/_calldata_reader.py +40 -0
  434. ccxt/static_dependencies/starknet/serialization/_context.py +142 -0
  435. ccxt/static_dependencies/starknet/serialization/data_serializers/__init__.py +10 -0
  436. ccxt/static_dependencies/starknet/serialization/data_serializers/_common.py +82 -0
  437. ccxt/static_dependencies/starknet/serialization/data_serializers/array_serializer.py +43 -0
  438. ccxt/static_dependencies/starknet/serialization/data_serializers/bool_serializer.py +37 -0
  439. ccxt/static_dependencies/starknet/serialization/data_serializers/byte_array_serializer.py +66 -0
  440. ccxt/static_dependencies/starknet/serialization/data_serializers/cairo_data_serializer.py +71 -0
  441. ccxt/static_dependencies/starknet/serialization/data_serializers/enum_serializer.py +71 -0
  442. ccxt/static_dependencies/starknet/serialization/data_serializers/felt_serializer.py +50 -0
  443. ccxt/static_dependencies/starknet/serialization/data_serializers/named_tuple_serializer.py +58 -0
  444. ccxt/static_dependencies/starknet/serialization/data_serializers/option_serializer.py +43 -0
  445. ccxt/static_dependencies/starknet/serialization/data_serializers/output_serializer.py +40 -0
  446. ccxt/static_dependencies/starknet/serialization/data_serializers/payload_serializer.py +72 -0
  447. ccxt/static_dependencies/starknet/serialization/data_serializers/struct_serializer.py +36 -0
  448. ccxt/static_dependencies/starknet/serialization/data_serializers/tuple_serializer.py +36 -0
  449. ccxt/static_dependencies/starknet/serialization/data_serializers/uint256_serializer.py +76 -0
  450. ccxt/static_dependencies/starknet/serialization/data_serializers/uint_serializer.py +100 -0
  451. ccxt/static_dependencies/starknet/serialization/data_serializers/unit_serializer.py +32 -0
  452. ccxt/static_dependencies/starknet/serialization/errors.py +10 -0
  453. ccxt/static_dependencies/starknet/serialization/factory.py +229 -0
  454. ccxt/static_dependencies/starknet/serialization/function_serialization_adapter.py +110 -0
  455. ccxt/static_dependencies/starknet/serialization/tuple_dataclass.py +59 -0
  456. ccxt/static_dependencies/starknet/utils/__init__.py +0 -0
  457. ccxt/static_dependencies/starknet/utils/constructor_args_translator.py +86 -0
  458. ccxt/static_dependencies/starknet/utils/iterable.py +13 -0
  459. ccxt/static_dependencies/starknet/utils/schema.py +13 -0
  460. ccxt/static_dependencies/starknet/utils/typed_data.py +182 -0
  461. ccxt/static_dependencies/starkware/__init__.py +0 -0
  462. ccxt/static_dependencies/starkware/crypto/__init__.py +0 -0
  463. ccxt/static_dependencies/starkware/crypto/fast_pedersen_hash.py +50 -0
  464. ccxt/static_dependencies/starkware/crypto/math_utils.py +78 -0
  465. ccxt/static_dependencies/starkware/crypto/signature.py +2344 -0
  466. ccxt/static_dependencies/starkware/crypto/utils.py +63 -0
  467. ccxt/static_dependencies/sympy/__init__.py +0 -0
  468. ccxt/static_dependencies/sympy/core/__init__.py +0 -0
  469. ccxt/static_dependencies/sympy/core/intfunc.py +35 -0
  470. ccxt/static_dependencies/sympy/external/__init__.py +0 -0
  471. ccxt/static_dependencies/sympy/external/gmpy.py +345 -0
  472. ccxt/static_dependencies/sympy/external/importtools.py +187 -0
  473. ccxt/static_dependencies/sympy/external/ntheory.py +637 -0
  474. ccxt/static_dependencies/sympy/external/pythonmpq.py +341 -0
  475. ccxt/static_dependencies/typing_inspect/__init__.py +0 -0
  476. ccxt/static_dependencies/typing_inspect/typing_inspect.py +851 -0
  477. ccxt/test/{test_async.py → tests_async.py} +465 -407
  478. ccxt/test/tests_helpers.py +285 -0
  479. ccxt/test/tests_init.py +39 -0
  480. ccxt/test/{test_sync.py → tests_sync.py} +465 -409
  481. ccxt/timex.py +123 -70
  482. ccxt/tokocrypto.py +129 -93
  483. ccxt/tradeogre.py +39 -25
  484. ccxt/upbit.py +322 -113
  485. ccxt/vertex.py +2983 -0
  486. ccxt/wavesexchange.py +227 -173
  487. ccxt/wazirx.py +145 -65
  488. ccxt/whitebit.py +533 -138
  489. ccxt/woo.py +1155 -295
  490. ccxt/woofipro.py +2716 -0
  491. ccxt/xt.py +4627 -0
  492. ccxt/yobit.py +159 -92
  493. ccxt/zaif.py +80 -33
  494. ccxt/zonda.py +140 -69
  495. ccxt-4.4.48.dist-info/LICENSE.txt +21 -0
  496. ccxt-4.4.48.dist-info/METADATA +646 -0
  497. ccxt-4.4.48.dist-info/RECORD +669 -0
  498. {ccxt-4.2.76.dist-info → ccxt-4.4.48.dist-info}/WHEEL +1 -1
  499. ccxt/abstract/bitbay.py +0 -47
  500. ccxt/abstract/bitfinex2.py +0 -139
  501. ccxt/abstract/hitbtc3.py +0 -115
  502. ccxt/async_support/bitbay.py +0 -17
  503. ccxt/async_support/bitfinex2.py +0 -3496
  504. ccxt/async_support/flowbtc.py +0 -34
  505. ccxt/bitbay.py +0 -17
  506. ccxt/bitfinex2.py +0 -3496
  507. ccxt/flowbtc.py +0 -34
  508. ccxt/hitbtc3.py +0 -16
  509. ccxt/pro/bitfinex2.py +0 -1081
  510. ccxt/test/base/__init__.py +0 -28
  511. ccxt/test/base/test_account.py +0 -26
  512. ccxt/test/base/test_balance.py +0 -56
  513. ccxt/test/base/test_borrow_interest.py +0 -35
  514. ccxt/test/base/test_borrow_rate.py +0 -32
  515. ccxt/test/base/test_calculate_fee.py +0 -51
  516. ccxt/test/base/test_crypto.py +0 -127
  517. ccxt/test/base/test_currency.py +0 -76
  518. ccxt/test/base/test_datetime.py +0 -103
  519. ccxt/test/base/test_decimal_to_precision.py +0 -392
  520. ccxt/test/base/test_deep_extend.py +0 -68
  521. ccxt/test/base/test_deposit_withdrawal.py +0 -50
  522. ccxt/test/base/test_exchange_datetime_functions.py +0 -76
  523. ccxt/test/base/test_funding_rate_history.py +0 -29
  524. ccxt/test/base/test_last_price.py +0 -32
  525. ccxt/test/base/test_ledger_entry.py +0 -45
  526. ccxt/test/base/test_ledger_item.py +0 -48
  527. ccxt/test/base/test_leverage_tier.py +0 -33
  528. ccxt/test/base/test_margin_mode.py +0 -24
  529. ccxt/test/base/test_margin_modification.py +0 -35
  530. ccxt/test/base/test_market.py +0 -190
  531. ccxt/test/base/test_number.py +0 -411
  532. ccxt/test/base/test_ohlcv.py +0 -32
  533. ccxt/test/base/test_open_interest.py +0 -32
  534. ccxt/test/base/test_order.py +0 -64
  535. ccxt/test/base/test_order_book.py +0 -63
  536. ccxt/test/base/test_position.py +0 -60
  537. ccxt/test/base/test_shared_methods.py +0 -345
  538. ccxt/test/base/test_status.py +0 -24
  539. ccxt/test/base/test_throttle.py +0 -126
  540. ccxt/test/base/test_ticker.py +0 -86
  541. ccxt/test/base/test_trade.py +0 -47
  542. ccxt/test/base/test_trading_fee.py +0 -26
  543. ccxt/test/base/test_transaction.py +0 -39
  544. ccxt-4.2.76.dist-info/METADATA +0 -626
  545. ccxt-4.2.76.dist-info/RECORD +0 -534
  546. {ccxt-4.2.76.dist-info → ccxt-4.4.48.dist-info}/top_level.txt +0 -0
ccxt/pro/bitmex.py CHANGED
@@ -6,12 +6,12 @@
6
6
  import ccxt.async_support
7
7
  from ccxt.async_support.base.ws.cache import ArrayCache, ArrayCacheBySymbolById, ArrayCacheBySymbolBySide, ArrayCacheByTimestamp
8
8
  import hashlib
9
- from ccxt.base.types import Balances, Int, Order, OrderBook, Position, Str, Strings, Ticker, Tickers, Trade
9
+ from ccxt.base.types import Balances, Int, Liquidation, Order, OrderBook, Position, Str, Strings, Ticker, Tickers, Trade
10
10
  from ccxt.async_support.base.ws.client import Client
11
11
  from typing import List
12
12
  from ccxt.base.errors import ExchangeError
13
- from ccxt.base.errors import RateLimitExceeded
14
13
  from ccxt.base.errors import AuthenticationError
14
+ from ccxt.base.errors import RateLimitExceeded
15
15
 
16
16
 
17
17
  class bitmex(ccxt.async_support.bitmex):
@@ -21,6 +21,10 @@ class bitmex(ccxt.async_support.bitmex):
21
21
  'has': {
22
22
  'ws': True,
23
23
  'watchBalance': True,
24
+ 'watchLiquidations': True,
25
+ 'watchLiquidationsForSymbols': True,
26
+ 'watchMyLiquidations': None,
27
+ 'watchMyLiquidationsForSymbols': None,
24
28
  'watchMyTrades': True,
25
29
  'watchOHLCV': True,
26
30
  'watchOrderBook': True,
@@ -62,6 +66,9 @@ class bitmex(ccxt.async_support.bitmex):
62
66
  async def watch_ticker(self, symbol: str, params={}) -> Ticker:
63
67
  """
64
68
  watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
69
+
70
+ https://www.bitmex.com/app/wsAPI#Subscriptions
71
+
65
72
  :param str symbol: unified symbol of the market to fetch the ticker for
66
73
  :param dict [params]: extra parameters specific to the exchange API endpoint
67
74
  :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
@@ -74,6 +81,9 @@ class bitmex(ccxt.async_support.bitmex):
74
81
  async def watch_tickers(self, symbols: Strings = None, params={}) -> Tickers:
75
82
  """
76
83
  watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for all markets of a specific list
84
+
85
+ https://www.bitmex.com/app/wsAPI#Subscriptions
86
+
77
87
  :param str[] symbols: unified symbol of the market to fetch the ticker for
78
88
  :param dict [params]: extra parameters specific to the exchange API endpoint
79
89
  :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
@@ -95,13 +105,13 @@ class bitmex(ccxt.async_support.bitmex):
95
105
  else:
96
106
  rawSubscriptions.append(name)
97
107
  messageHashes.append('alltickers')
98
- request = {
108
+ request: dict = {
99
109
  'op': 'subscribe',
100
110
  'args': rawSubscriptions,
101
111
  }
102
112
  ticker = await self.watch_multiple(url, messageHashes, self.extend(request, params), rawSubscriptions)
103
113
  if self.newUpdates:
104
- result = {}
114
+ result: dict = {}
105
115
  result[ticker['symbol']] = ticker
106
116
  return result
107
117
  return self.filter_by_array(self.tickers, 'symbol', symbols)
@@ -334,7 +344,7 @@ class bitmex(ccxt.async_support.bitmex):
334
344
  # }
335
345
  #
336
346
  data = self.safe_list(message, 'data', [])
337
- tickers = {}
347
+ tickers: dict = {}
338
348
  for i in range(0, len(data)):
339
349
  update = data[i]
340
350
  marketId = self.safe_string(update, 'symbol')
@@ -350,9 +360,108 @@ class bitmex(ccxt.async_support.bitmex):
350
360
  client.resolve(fullParsedTicker, 'alltickers')
351
361
  return message
352
362
 
363
+ async def watch_liquidations(self, symbol: str, since: Int = None, limit: Int = None, params={}) -> List[Liquidation]:
364
+ """
365
+ watch the public liquidations of a trading pair
366
+
367
+ https://www.bitmex.com/app/wsAPI#Liquidation
368
+
369
+ :param str symbol: unified CCXT market symbol
370
+ :param int [since]: the earliest time in ms to fetch liquidations for
371
+ :param int [limit]: the maximum number of liquidation structures to retrieve
372
+ :param dict [params]: exchange specific parameters for the bitmex api endpoint
373
+ :returns dict: an array of `liquidation structures <https://github.com/ccxt/ccxt/wiki/Manual#liquidation-structure>`
374
+ """
375
+ return self.watch_liquidations_for_symbols([symbol], since, limit, params)
376
+
377
+ async def watch_liquidations_for_symbols(self, symbols: List[str] = None, since: Int = None, limit: Int = None, params={}) -> List[Liquidation]:
378
+ """
379
+ watch the public liquidations of a trading pair
380
+
381
+ https://www.bitmex.com/app/wsAPI#Liquidation
382
+
383
+ :param str[] symbols:
384
+ :param int [since]: the earliest time in ms to fetch liquidations for
385
+ :param int [limit]: the maximum number of liquidation structures to retrieve
386
+ :param dict [params]: exchange specific parameters for the bitmex api endpoint
387
+ :returns dict: an array of `liquidation structures <https://github.com/ccxt/ccxt/wiki/Manual#liquidation-structure>`
388
+ """
389
+ await self.load_markets()
390
+ symbols = self.market_symbols(symbols, None, True, True)
391
+ messageHashes = []
392
+ subscriptionHashes = []
393
+ if self.is_empty(symbols):
394
+ subscriptionHashes.append('liquidation')
395
+ messageHashes.append('liquidations')
396
+ else:
397
+ for i in range(0, len(symbols)):
398
+ symbol = symbols[i]
399
+ market = self.market(symbol)
400
+ subscriptionHashes.append('liquidation:' + market['id'])
401
+ messageHashes.append('liquidations::' + symbol)
402
+ url = self.urls['api']['ws']
403
+ request = {
404
+ 'op': 'subscribe',
405
+ 'args': subscriptionHashes,
406
+ }
407
+ newLiquidations = await self.watch_multiple(url, messageHashes, self.deep_extend(request, params), subscriptionHashes)
408
+ if self.newUpdates:
409
+ return newLiquidations
410
+ return self.filter_by_symbols_since_limit(self.liquidations, symbols, since, limit, True)
411
+
412
+ def handle_liquidation(self, client: Client, message):
413
+ #
414
+ # {
415
+ # "table":"liquidation",
416
+ # "action":"partial",
417
+ # "keys":[
418
+ # "orderID"
419
+ # ],
420
+ # "types":{
421
+ # "orderID":"guid",
422
+ # "symbol":"symbol",
423
+ # "side":"symbol",
424
+ # "price":"float",
425
+ # "leavesQty":"long"
426
+ # },
427
+ # "filter":{},
428
+ # "data":[
429
+ # {
430
+ # "orderID":"e0a568ee-7830-4428-92c3-73e82b9576ce",
431
+ # "symbol":"XPLAUSDT",
432
+ # "side":"Sell",
433
+ # "price":0.206,
434
+ # "leavesQty":340
435
+ # }
436
+ # ]
437
+ # }
438
+ #
439
+ rawLiquidations = self.safe_value(message, 'data', [])
440
+ newLiquidations = []
441
+ for i in range(0, len(rawLiquidations)):
442
+ rawLiquidation = rawLiquidations[i]
443
+ liquidation = self.parse_liquidation(rawLiquidation)
444
+ symbol = liquidation['symbol']
445
+ liquidations = self.safe_value(self.liquidations, symbol)
446
+ if liquidations is None:
447
+ limit = self.safe_integer(self.options, 'liquidationsLimit', 1000)
448
+ liquidations = ArrayCache(limit)
449
+ liquidations.append(liquidation)
450
+ self.liquidations[symbol] = liquidations
451
+ newLiquidations.append(liquidation)
452
+ client.resolve(newLiquidations, 'liquidations')
453
+ liquidationsBySymbol = self.index_by(newLiquidations, 'symbol')
454
+ symbols = list(liquidationsBySymbol.keys())
455
+ for i in range(0, len(symbols)):
456
+ symbol = symbols[i]
457
+ client.resolve(liquidationsBySymbol[symbol], 'liquidations::' + symbol)
458
+
353
459
  async def watch_balance(self, params={}) -> Balances:
354
460
  """
355
461
  watch balance and get the amount of funds available for trading or funds locked in orders
462
+
463
+ https://www.bitmex.com/app/wsAPI#Subscriptions
464
+
356
465
  :param dict [params]: extra parameters specific to the exchange API endpoint
357
466
  :returns dict: a `balance structure <https://docs.ccxt.com/#/?id=balance-structure>`
358
467
  """
@@ -360,7 +469,7 @@ class bitmex(ccxt.async_support.bitmex):
360
469
  await self.authenticate()
361
470
  messageHash = 'margin'
362
471
  url = self.urls['api']['ws']
363
- request = {
472
+ request: dict = {
364
473
  'op': 'subscribe',
365
474
  'args': [
366
475
  messageHash,
@@ -540,8 +649,8 @@ class bitmex(ccxt.async_support.bitmex):
540
649
  for i in range(0, len(marketIds)):
541
650
  marketId = marketIds[i]
542
651
  market = self.safe_market(marketId)
543
- messageHash = table + ':' + marketId
544
652
  symbol = market['symbol']
653
+ messageHash = table + ':' + symbol
545
654
  trades = self.parse_trades(dataByMarketIds[marketId], market)
546
655
  stored = self.safe_value(self.trades, symbol)
547
656
  if stored is None:
@@ -555,28 +664,16 @@ class bitmex(ccxt.async_support.bitmex):
555
664
  async def watch_trades(self, symbol: str, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
556
665
  """
557
666
  get the list of most recent trades for a particular symbol
667
+
668
+ https://www.bitmex.com/app/wsAPI#Subscriptions
669
+
558
670
  :param str symbol: unified symbol of the market to fetch trades for
559
671
  :param int [since]: timestamp in ms of the earliest trade to fetch
560
672
  :param int [limit]: the maximum amount of trades to fetch
561
673
  :param dict [params]: extra parameters specific to the exchange API endpoint
562
674
  :returns dict[]: a list of `trade structures <https://docs.ccxt.com/#/?id=public-trades>`
563
675
  """
564
- await self.load_markets()
565
- market = self.market(symbol)
566
- symbol = market['symbol']
567
- table = 'trade'
568
- messageHash = table + ':' + market['id']
569
- url = self.urls['api']['ws']
570
- request = {
571
- 'op': 'subscribe',
572
- 'args': [
573
- messageHash,
574
- ],
575
- }
576
- trades = await self.watch(url, messageHash, self.extend(request, params), messageHash)
577
- if self.newUpdates:
578
- limit = trades.getLimit(symbol, limit)
579
- return self.filter_by_since_limit(trades, since, limit, 'timestamp', True)
676
+ return await self.watch_trades_for_symbols([symbol], since, limit, params)
580
677
 
581
678
  async def authenticate(self, params={}):
582
679
  url = self.urls['api']['ws']
@@ -589,7 +686,7 @@ class bitmex(ccxt.async_support.bitmex):
589
686
  timestamp = self.milliseconds()
590
687
  payload = 'GET' + '/realtime' + str(timestamp)
591
688
  signature = self.hmac(self.encode(payload), self.encode(self.secret), hashlib.sha256)
592
- request = {
689
+ request: dict = {
593
690
  'op': 'authKeyExpires',
594
691
  'args': [
595
692
  self.apiKey,
@@ -599,7 +696,7 @@ class bitmex(ccxt.async_support.bitmex):
599
696
  }
600
697
  message = self.extend(request, params)
601
698
  self.watch(url, messageHash, message, messageHash)
602
- return future
699
+ return await future
603
700
 
604
701
  def handle_authentication_message(self, client: Client, message):
605
702
  authenticated = self.safe_bool(message, 'success', False)
@@ -616,9 +713,13 @@ class bitmex(ccxt.async_support.bitmex):
616
713
 
617
714
  async def watch_positions(self, symbols: Strings = None, since: Int = None, limit: Int = None, params={}) -> List[Position]:
618
715
  """
619
- :see: https://www.bitmex.com/app/wsAPI
620
716
  watch all open positions
717
+
718
+ https://www.bitmex.com/app/wsAPI#Subscriptions
719
+
621
720
  :param str[]|None symbols: list of unified market symbols
721
+ :param int [since]: the earliest time in ms to watch positions for
722
+ :param int [limit]: the maximum number of positions to retrieve
622
723
  :param dict params: extra parameters specific to the exchange API endpoint
623
724
  :returns dict[]: a list of `position structure <https://docs.ccxt.com/en/latest/manual.html#position-structure>`
624
725
  """
@@ -629,7 +730,7 @@ class bitmex(ccxt.async_support.bitmex):
629
730
  if not self.is_empty(symbols):
630
731
  messageHash = '::' + ','.join(symbols)
631
732
  url = self.urls['api']['ws']
632
- request = {
733
+ request: dict = {
633
734
  'op': 'subscribe',
634
735
  'args': [
635
736
  subscriptionHash,
@@ -813,6 +914,9 @@ class bitmex(ccxt.async_support.bitmex):
813
914
  async def watch_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
814
915
  """
815
916
  watches information on multiple orders made by the user
917
+
918
+ https://www.bitmex.com/app/wsAPI#Subscriptions
919
+
816
920
  :param str symbol: unified market symbol of the market orders were made in
817
921
  :param int [since]: the earliest time in ms to fetch orders for
818
922
  :param int [limit]: the maximum number of order structures to retrieve
@@ -828,7 +932,7 @@ class bitmex(ccxt.async_support.bitmex):
828
932
  symbol = self.symbol(symbol)
829
933
  messageHash += ':' + symbol
830
934
  url = self.urls['api']['ws']
831
- request = {
935
+ request: dict = {
832
936
  'op': 'subscribe',
833
937
  'args': [
834
938
  subscriptionHash,
@@ -998,7 +1102,7 @@ class bitmex(ccxt.async_support.bitmex):
998
1102
  limit = self.safe_integer(self.options, 'ordersLimit', 1000)
999
1103
  self.orders = ArrayCacheBySymbolById(limit)
1000
1104
  stored = self.orders
1001
- symbols = {}
1105
+ symbols: dict = {}
1002
1106
  for i in range(0, dataLength):
1003
1107
  currentOrder = data[i]
1004
1108
  orderId = self.safe_string(currentOrder, 'orderID')
@@ -1019,11 +1123,14 @@ class bitmex(ccxt.async_support.bitmex):
1019
1123
  async def watch_my_trades(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
1020
1124
  """
1021
1125
  watches information on multiple trades made by the user
1126
+
1127
+ https://www.bitmex.com/app/wsAPI#Subscriptions
1128
+
1022
1129
  :param str symbol: unified market symbol of the market trades were made in
1023
1130
  :param int [since]: the earliest time in ms to fetch trades for
1024
1131
  :param int [limit]: the maximum number of trade structures to retrieve
1025
1132
  :param dict [params]: extra parameters specific to the exchange API endpoint
1026
- :returns dict[]: a list of [trade structures]{@link https://docs.ccxt.com/#/?id=trade-structure
1133
+ :returns dict[]: a list of `trade structures <https://docs.ccxt.com/#/?id=trade-structure>`
1027
1134
  """
1028
1135
  await self.load_markets()
1029
1136
  await self.authenticate()
@@ -1034,7 +1141,7 @@ class bitmex(ccxt.async_support.bitmex):
1034
1141
  symbol = self.symbol(symbol)
1035
1142
  messageHash += ':' + symbol
1036
1143
  url = self.urls['api']['ws']
1037
- request = {
1144
+ request: dict = {
1038
1145
  'op': 'subscribe',
1039
1146
  'args': [
1040
1147
  subscriptionHash,
@@ -1112,7 +1219,7 @@ class bitmex(ccxt.async_support.bitmex):
1112
1219
  limit = self.safe_integer(self.options, 'tradesLimit', 1000)
1113
1220
  self.myTrades = ArrayCacheBySymbolById(limit)
1114
1221
  stored = self.myTrades
1115
- symbols = {}
1222
+ symbols: dict = {}
1116
1223
  for j in range(0, len(trades)):
1117
1224
  trade = trades[j]
1118
1225
  symbol = trade['symbol']
@@ -1128,6 +1235,9 @@ class bitmex(ccxt.async_support.bitmex):
1128
1235
  async def watch_order_book(self, symbol: str, limit: Int = None, params={}) -> OrderBook:
1129
1236
  """
1130
1237
  watches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
1238
+
1239
+ https://www.bitmex.com/app/wsAPI#OrderBookL2
1240
+
1131
1241
  :param str symbol: unified symbol of the market to fetch the order book for
1132
1242
  :param int [limit]: the maximum amount of order book entries to return
1133
1243
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -1138,6 +1248,9 @@ class bitmex(ccxt.async_support.bitmex):
1138
1248
  async def watch_order_book_for_symbols(self, symbols: List[str], limit: Int = None, params={}) -> OrderBook:
1139
1249
  """
1140
1250
  watches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
1251
+
1252
+ https://www.bitmex.com/app/wsAPI#OrderBookL2
1253
+
1141
1254
  :param str[] symbols: unified array of symbols
1142
1255
  :param int [limit]: the maximum amount of order book entries to return
1143
1256
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -1164,16 +1277,55 @@ class bitmex(ccxt.async_support.bitmex):
1164
1277
  messageHash = table + ':' + symbol
1165
1278
  messageHashes.append(messageHash)
1166
1279
  url = self.urls['api']['ws']
1167
- request = {
1280
+ request: dict = {
1168
1281
  'op': 'subscribe',
1169
1282
  'args': topics,
1170
1283
  }
1171
1284
  orderbook = await self.watch_multiple(url, messageHashes, self.deep_extend(request, params), topics)
1172
1285
  return orderbook.limit()
1173
1286
 
1287
+ async def watch_trades_for_symbols(self, symbols: List[str], since: Int = None, limit: Int = None, params={}) -> List[Trade]:
1288
+ """
1289
+ get the list of most recent trades for a list of symbols
1290
+
1291
+ https://www.bitmex.com/app/wsAPI#Subscriptions
1292
+
1293
+ :param str[] symbols: unified symbol of the market to fetch trades for
1294
+ :param int [since]: timestamp in ms of the earliest trade to fetch
1295
+ :param int [limit]: the maximum amount of trades to fetch
1296
+ :param dict [params]: extra parameters specific to the exchange API endpoint
1297
+ :returns dict[]: a list of `trade structures <https://docs.ccxt.com/#/?id=public-trades>`
1298
+ """
1299
+ await self.load_markets()
1300
+ symbols = self.market_symbols(symbols, None, False)
1301
+ table = 'trade'
1302
+ topics = []
1303
+ messageHashes = []
1304
+ for i in range(0, len(symbols)):
1305
+ symbol = symbols[i]
1306
+ market = self.market(symbol)
1307
+ topic = table + ':' + market['id']
1308
+ topics.append(topic)
1309
+ messageHash = table + ':' + symbol
1310
+ messageHashes.append(messageHash)
1311
+ url = self.urls['api']['ws']
1312
+ request: dict = {
1313
+ 'op': 'subscribe',
1314
+ 'args': topics,
1315
+ }
1316
+ trades = await self.watch_multiple(url, messageHashes, self.deep_extend(request, params), topics)
1317
+ if self.newUpdates:
1318
+ first = self.safe_value(trades, 0)
1319
+ tradeSymbol = self.safe_string(first, 'symbol')
1320
+ limit = trades.getLimit(tradeSymbol, limit)
1321
+ return self.filter_by_since_limit(trades, since, limit, 'timestamp', True)
1322
+
1174
1323
  async def watch_ohlcv(self, symbol: str, timeframe='1m', since: Int = None, limit: Int = None, params={}) -> List[list]:
1175
1324
  """
1176
1325
  watches historical candlestick data containing the open, high, low, and close price, and the volume of a market
1326
+
1327
+ https://www.bitmex.com/app/wsAPI#Subscriptions
1328
+
1177
1329
  :param str symbol: unified symbol of the market to fetch OHLCV data for
1178
1330
  :param str timeframe: the length of time each candle represents
1179
1331
  :param int [since]: timestamp in ms of the earliest candle to fetch
@@ -1187,7 +1339,7 @@ class bitmex(ccxt.async_support.bitmex):
1187
1339
  table = 'tradeBin' + self.safe_string(self.timeframes, timeframe, timeframe)
1188
1340
  messageHash = table + ':' + market['id']
1189
1341
  url = self.urls['api']['ws']
1190
- request = {
1342
+ request: dict = {
1191
1343
  'op': 'subscribe',
1192
1344
  'args': [
1193
1345
  messageHash,
@@ -1269,7 +1421,7 @@ class bitmex(ccxt.async_support.bitmex):
1269
1421
  timeframe = self.find_timeframe(interval)
1270
1422
  duration = self.parse_timeframe(timeframe)
1271
1423
  candles = self.safe_value(message, 'data', [])
1272
- results = {}
1424
+ results: dict = {}
1273
1425
  for i in range(0, len(candles)):
1274
1426
  candle = candles[i]
1275
1427
  marketId = self.safe_string(candle, 'symbol')
@@ -1355,11 +1507,15 @@ class bitmex(ccxt.async_support.bitmex):
1355
1507
  #
1356
1508
  action = self.safe_string(message, 'action')
1357
1509
  table = self.safe_string(message, 'table')
1510
+ if table is None:
1511
+ return # protecting from weird updates
1358
1512
  data = self.safe_value(message, 'data', [])
1359
1513
  # if it's an initial snapshot
1360
1514
  if action == 'partial':
1361
- filter = self.safe_value(message, 'filter', {})
1515
+ filter = self.safe_dict(message, 'filter', {})
1362
1516
  marketId = self.safe_value(filter, 'symbol')
1517
+ if marketId is None:
1518
+ return # protecting from weird update
1363
1519
  market = self.safe_market(marketId)
1364
1520
  symbol = market['symbol']
1365
1521
  if table == 'orderBookL2':
@@ -1377,16 +1533,18 @@ class bitmex(ccxt.async_support.bitmex):
1377
1533
  side = self.safe_string(data[i], 'side')
1378
1534
  side = 'bids' if (side == 'Buy') else 'asks'
1379
1535
  bookside = orderbook[side]
1380
- bookside.store(price, size, id)
1536
+ bookside.storeArray([price, size, id])
1381
1537
  datetime = self.safe_string(data[i], 'timestamp')
1382
1538
  orderbook['timestamp'] = self.parse8601(datetime)
1383
1539
  orderbook['datetime'] = datetime
1384
1540
  messageHash = table + ':' + symbol
1385
1541
  client.resolve(orderbook, messageHash)
1386
1542
  else:
1387
- numUpdatesByMarketId = {}
1543
+ numUpdatesByMarketId: dict = {}
1388
1544
  for i in range(0, len(data)):
1389
1545
  marketId = self.safe_value(data[i], 'symbol')
1546
+ if marketId is None:
1547
+ return # protecting from weird update
1390
1548
  if not (marketId in numUpdatesByMarketId):
1391
1549
  numUpdatesByMarketId[marketId] = 0
1392
1550
  numUpdatesByMarketId[marketId] = self.sum(numUpdatesByMarketId, 1)
@@ -1399,7 +1557,7 @@ class bitmex(ccxt.async_support.bitmex):
1399
1557
  side = self.safe_string(data[i], 'side')
1400
1558
  side = 'bids' if (side == 'Buy') else 'asks'
1401
1559
  bookside = orderbook[side]
1402
- bookside.store(price, size, id)
1560
+ bookside.storeArray([price, size, id])
1403
1561
  datetime = self.safe_string(data[i], 'timestamp')
1404
1562
  orderbook['timestamp'] = self.parse8601(datetime)
1405
1563
  orderbook['datetime'] = datetime
@@ -1510,7 +1668,7 @@ class bitmex(ccxt.async_support.bitmex):
1510
1668
  #
1511
1669
  if self.handle_error_message(client, message):
1512
1670
  table = self.safe_string(message, 'table')
1513
- methods = {
1671
+ methods: dict = {
1514
1672
  'orderBookL2': self.handle_order_book,
1515
1673
  'orderBookL2_25': self.handle_order_book,
1516
1674
  'orderBook10': self.handle_order_book,
@@ -1523,6 +1681,7 @@ class bitmex(ccxt.async_support.bitmex):
1523
1681
  'order': self.handle_orders,
1524
1682
  'execution': self.handle_my_trades,
1525
1683
  'margin': self.handle_balance,
1684
+ 'liquidation': self.handle_liquidation,
1526
1685
  'position': self.handle_positions,
1527
1686
  }
1528
1687
  method = self.safe_value(methods, table)
ccxt/pro/bitopro.py CHANGED
@@ -26,6 +26,7 @@ class bitopro(ccxt.async_support.bitopro):
26
26
  'watchTicker': True,
27
27
  'watchTickers': False,
28
28
  'watchTrades': True,
29
+ 'watchTradesForSymbols': False,
29
30
  },
30
31
  'urls': {
31
32
  'ws': {
@@ -57,7 +58,9 @@ class bitopro(ccxt.async_support.bitopro):
57
58
  async def watch_order_book(self, symbol: str, limit: Int = None, params={}) -> OrderBook:
58
59
  """
59
60
  watches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
60
- :see: https://github.com/bitoex/bitopro-offical-api-docs/blob/master/ws/public/order_book_stream.md
61
+
62
+ https://github.com/bitoex/bitopro-offical-api-docs/blob/master/ws/public/order_book_stream.md
63
+
61
64
  :param str symbol: unified symbol of the market to fetch the order book for
62
65
  :param int [limit]: the maximum amount of order book entries to return
63
66
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -74,7 +77,7 @@ class bitopro(ccxt.async_support.bitopro):
74
77
  if limit is None:
75
78
  endPart = market['id']
76
79
  else:
77
- endPart = market['id'] + ':' + limit
80
+ endPart = market['id'] + ':' + self.number_to_string(limit)
78
81
  orderbook = await self.watch_public('order-books', messageHash, endPart)
79
82
  return orderbook.limit()
80
83
 
@@ -116,7 +119,9 @@ class bitopro(ccxt.async_support.bitopro):
116
119
  async def watch_trades(self, symbol: str, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
117
120
  """
118
121
  get the list of most recent trades for a particular symbol
119
- :see: https://github.com/bitoex/bitopro-offical-api-docs/blob/master/ws/public/trade_stream.md
122
+
123
+ https://github.com/bitoex/bitopro-offical-api-docs/blob/master/ws/public/trade_stream.md
124
+
120
125
  :param str symbol: unified symbol of the market to fetch trades for
121
126
  :param int [since]: timestamp in ms of the earliest trade to fetch
122
127
  :param int [limit]: the maximum amount of trades to fetch
@@ -171,12 +176,14 @@ class bitopro(ccxt.async_support.bitopro):
171
176
  async def watch_my_trades(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
172
177
  """
173
178
  watches information on multiple trades made by the user
174
- :see: https://github.com/bitoex/bitopro-offical-api-docs/blob/master/ws/private/matches_stream.md
179
+
180
+ https://github.com/bitoex/bitopro-offical-api-docs/blob/master/ws/private/matches_stream.md
181
+
175
182
  :param str symbol: unified market symbol of the market trades were made in
176
183
  :param int [since]: the earliest time in ms to fetch trades for
177
184
  :param int [limit]: the maximum number of trade structures to retrieve
178
185
  :param dict [params]: extra parameters specific to the exchange API endpoint
179
- :returns dict[]: a list of [trade structures]{@link https://docs.ccxt.com/#/?id=trade-structure
186
+ :returns dict[]: a list of `trade structures <https://docs.ccxt.com/#/?id=trade-structure>`
180
187
  """
181
188
  self.check_required_credentials()
182
189
  await self.load_markets()
@@ -231,7 +238,7 @@ class bitopro(ccxt.async_support.bitopro):
231
238
  client.resolve(trades, messageHash)
232
239
  client.resolve(trades, messageHash + ':' + symbol)
233
240
 
234
- def parse_ws_trade(self, trade, market: Market = None) -> Trade:
241
+ def parse_ws_trade(self, trade: dict, market: Market = None) -> Trade:
235
242
  #
236
243
  # {
237
244
  # "base": "usdt",
@@ -303,7 +310,9 @@ class bitopro(ccxt.async_support.bitopro):
303
310
  async def watch_ticker(self, symbol: str, params={}) -> Ticker:
304
311
  """
305
312
  watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
306
- :see: https://github.com/bitoex/bitopro-offical-api-docs/blob/master/ws/public/ticker_stream.md
313
+
314
+ https://github.com/bitoex/bitopro-offical-api-docs/blob/master/ws/public/ticker_stream.md
315
+
307
316
  :param str symbol: unified symbol of the market to fetch the ticker for
308
317
  :param dict [params]: extra parameters specific to the exchange API endpoint
309
318
  :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
@@ -357,16 +366,17 @@ class bitopro(ccxt.async_support.bitopro):
357
366
  })
358
367
  payload = self.string_to_base64(rawData)
359
368
  signature = self.hmac(self.encode(payload), self.encode(self.secret), hashlib.sha384)
360
- defaultOptions = {
369
+ defaultOptions: dict = {
361
370
  'ws': {
362
371
  'options': {
363
372
  'headers': {},
364
373
  },
365
374
  },
366
375
  }
367
- self.options = self.extend(defaultOptions, self.options)
376
+ # self.options = self.extend(defaultOptions, self.options)
377
+ self.extend_exchange_options(defaultOptions)
368
378
  originalHeaders = self.options['ws']['options']['headers']
369
- headers = {
379
+ headers: dict = {
370
380
  'X-BITOPRO-API': 'ccxt',
371
381
  'X-BITOPRO-APIKEY': self.apiKey,
372
382
  'X-BITOPRO-PAYLOAD': payload,
@@ -380,7 +390,9 @@ class bitopro(ccxt.async_support.bitopro):
380
390
  async def watch_balance(self, params={}) -> Balances:
381
391
  """
382
392
  watch balance and get the amount of funds available for trading or funds locked in orders
383
- :see: https://github.com/bitoex/bitopro-offical-api-docs/blob/master/ws/private/user_balance_stream.md
393
+
394
+ https://github.com/bitoex/bitopro-offical-api-docs/blob/master/ws/private/user_balance_stream.md
395
+
384
396
  :param dict [params]: extra parameters specific to the exchange API endpoint
385
397
  :returns dict: a `balance structure <https://docs.ccxt.com/#/?id=balance-structure>`
386
398
  """
@@ -413,7 +425,7 @@ class bitopro(ccxt.async_support.bitopro):
413
425
  timestamp = self.safe_integer(message, 'timestamp')
414
426
  datetime = self.safe_string(message, 'datetime')
415
427
  currencies = list(data.keys())
416
- result = {
428
+ result: dict = {
417
429
  'info': data,
418
430
  'timestamp': timestamp,
419
431
  'datetime': datetime,
@@ -431,7 +443,7 @@ class bitopro(ccxt.async_support.bitopro):
431
443
  client.resolve(self.balance, event)
432
444
 
433
445
  def handle_message(self, client: Client, message):
434
- methods = {
446
+ methods: dict = {
435
447
  'TRADE': self.handle_trade,
436
448
  'TICKER': self.handle_ticker,
437
449
  'ORDER_BOOK': self.handle_order_book,