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
@@ -6,9 +6,10 @@
6
6
  from ccxt.async_support.base.exchange import Exchange
7
7
  from ccxt.abstract.bitmex import ImplicitAPI
8
8
  import hashlib
9
- from ccxt.base.types import Balances, Currency, Int, Leverage, Leverages, Market, MarketType, Num, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, Transaction
9
+ from ccxt.base.types import Balances, Currencies, Currency, DepositAddress, Int, LedgerEntry, Leverage, Leverages, Market, MarketType, Num, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, FundingRate, FundingRates, Trade, Transaction
10
10
  from typing import List
11
11
  from ccxt.base.errors import ExchangeError
12
+ from ccxt.base.errors import AuthenticationError
12
13
  from ccxt.base.errors import PermissionDenied
13
14
  from ccxt.base.errors import ArgumentsRequired
14
15
  from ccxt.base.errors import BadRequest
@@ -18,7 +19,6 @@ from ccxt.base.errors import InvalidOrder
18
19
  from ccxt.base.errors import OrderNotFound
19
20
  from ccxt.base.errors import DDoSProtection
20
21
  from ccxt.base.errors import ExchangeNotAvailable
21
- from ccxt.base.errors import AuthenticationError
22
22
  from ccxt.base.decimal_to_precision import TICK_SIZE
23
23
  from ccxt.base.precise import Precise
24
24
 
@@ -48,13 +48,16 @@ class bitmex(Exchange, ImplicitAPI):
48
48
  'option': False,
49
49
  'addMargin': None,
50
50
  'cancelAllOrders': True,
51
+ 'cancelAllOrdersAfter': True,
51
52
  'cancelOrder': True,
52
53
  'cancelOrders': True,
53
54
  'closeAllPositions': False,
54
55
  'closePosition': True,
55
56
  'createOrder': True,
56
57
  'createReduceOnlyOrder': True,
58
+ 'createStopOrder': True,
57
59
  'createTrailingAmountOrder': True,
60
+ 'createTriggerOrder': True,
58
61
  'editOrder': True,
59
62
  'fetchBalance': True,
60
63
  'fetchClosedOrders': True,
@@ -66,7 +69,7 @@ class bitmex(Exchange, ImplicitAPI):
66
69
  'fetchDepositWithdrawFee': 'emulated',
67
70
  'fetchDepositWithdrawFees': True,
68
71
  'fetchFundingHistory': False,
69
- 'fetchFundingRate': False,
72
+ 'fetchFundingRate': 'emulated', # emulated in exchange
70
73
  'fetchFundingRateHistory': True,
71
74
  'fetchFundingRates': True,
72
75
  'fetchIndexOHLCV': False,
@@ -75,6 +78,7 @@ class bitmex(Exchange, ImplicitAPI):
75
78
  'fetchLeverages': True,
76
79
  'fetchLeverageTiers': False,
77
80
  'fetchLiquidations': True,
81
+ 'fetchMarginAdjustmentHistory': False,
78
82
  'fetchMarketLeverageTiers': False,
79
83
  'fetchMarkets': True,
80
84
  'fetchMarkOHLCV': False,
@@ -86,7 +90,9 @@ class bitmex(Exchange, ImplicitAPI):
86
90
  'fetchOrderBook': True,
87
91
  'fetchOrders': True,
88
92
  'fetchPosition': False,
93
+ 'fetchPositionHistory': False,
89
94
  'fetchPositions': True,
95
+ 'fetchPositionsHistory': False,
90
96
  'fetchPositionsRisk': False,
91
97
  'fetchPremiumIndexOHLCV': False,
92
98
  'fetchTicker': True,
@@ -96,6 +102,7 @@ class bitmex(Exchange, ImplicitAPI):
96
102
  'fetchTransfer': False,
97
103
  'fetchTransfers': False,
98
104
  'reduceMargin': None,
105
+ 'sandbox': True,
99
106
  'setLeverage': True,
100
107
  'setMargin': None,
101
108
  'setMarginMode': True,
@@ -114,7 +121,7 @@ class bitmex(Exchange, ImplicitAPI):
114
121
  'public': 'https://testnet.bitmex.com',
115
122
  'private': 'https://testnet.bitmex.com',
116
123
  },
117
- 'logo': 'https://github.com/ccxt/ccxt/assets/43336371/cea9cfe5-c57e-4b84-b2ac-77b960b04445',
124
+ 'logo': 'https://github.com/user-attachments/assets/c78425ab-78d5-49d6-bd14-db7734798f04',
118
125
  'api': {
119
126
  'public': 'https://www.bitmex.com',
120
127
  'private': 'https://www.bitmex.com',
@@ -248,6 +255,7 @@ class bitmex(Exchange, ImplicitAPI):
248
255
  'orderQty is invalid': InvalidOrder,
249
256
  'Invalid price': InvalidOrder,
250
257
  'Invalid stopPx for ordType': InvalidOrder,
258
+ 'Account is restricted': PermissionDenied, # {"error":{"message":"Account is restricted","name":"HTTPError"}}
251
259
  },
252
260
  'broad': {
253
261
  'Signature not valid': AuthenticationError,
@@ -278,6 +286,108 @@ class bitmex(Exchange, ImplicitAPI):
278
286
  'SOL': 'sol',
279
287
  'ADA': 'ada',
280
288
  },
289
+ 'features': {
290
+ 'default': {
291
+ 'sandbox': True,
292
+ 'createOrder': {
293
+ 'marginMode': True,
294
+ 'triggerPrice': True,
295
+ 'triggerPriceType': {
296
+ 'last': True,
297
+ 'mark': True,
298
+ },
299
+ 'triggerDirection': True,
300
+ 'stopLossPrice': False,
301
+ 'takeProfitPrice': False,
302
+ 'attachedStopLossTakeProfit': None,
303
+ 'timeInForce': {
304
+ 'IOC': True,
305
+ 'FOK': True,
306
+ 'PO': True,
307
+ 'GTD': False,
308
+ },
309
+ 'hedged': False,
310
+ 'trailing': True,
311
+ 'marketBuyRequiresPrice': False,
312
+ 'marketBuyByCost': False,
313
+ # exchange-supported features
314
+ # 'selfTradePrevention': True,
315
+ # 'twap': False,
316
+ # 'iceberg': False,
317
+ # 'oco': False,
318
+ },
319
+ 'createOrders': None,
320
+ 'fetchMyTrades': {
321
+ 'marginMode': False,
322
+ 'limit': 500,
323
+ 'daysBack': None,
324
+ 'untilDays': 1000000,
325
+ },
326
+ 'fetchOrder': {
327
+ 'marginMode': False,
328
+ 'trigger': False,
329
+ 'trailing': False,
330
+ },
331
+ 'fetchOpenOrders': {
332
+ 'marginMode': False,
333
+ 'limit': 500,
334
+ 'trigger': False,
335
+ 'trailing': False,
336
+ },
337
+ 'fetchOrders': {
338
+ 'marginMode': False,
339
+ 'limit': 500,
340
+ 'daysBack': None,
341
+ 'untilDays': 1000000,
342
+ 'trigger': False,
343
+ 'trailing': False,
344
+ },
345
+ 'fetchClosedOrders': {
346
+ 'marginMode': False,
347
+ 'limit': 500,
348
+ 'daysBackClosed': None,
349
+ 'daysBackCanceled': None,
350
+ 'untilDays': 1000000,
351
+ 'trigger': False,
352
+ 'trailing': False,
353
+ },
354
+ 'fetchOHLCV': {
355
+ 'limit': 10000,
356
+ },
357
+ },
358
+ 'spot': {
359
+ 'extends': 'default',
360
+ 'createOrder': {
361
+ 'triggerPriceType': {
362
+ 'index': False,
363
+ },
364
+ },
365
+ },
366
+ 'forDeriv': {
367
+ 'extends': 'default',
368
+ 'createOrder': {
369
+ 'triggerPriceType': {
370
+ 'index': True,
371
+ },
372
+ },
373
+ },
374
+ 'swap': {
375
+ 'linear': {
376
+ 'extends': 'forDeriv',
377
+ },
378
+ 'inverse': {
379
+ 'extends': 'forDeriv',
380
+ },
381
+ },
382
+ 'future': {
383
+ 'linear': {
384
+ 'extends': 'forDeriv',
385
+ },
386
+ 'inverse': {
387
+ 'extends': 'forDeriv',
388
+ },
389
+ },
390
+ },
281
391
  },
282
392
  'commonCurrencies': {
283
393
  'USDt': 'USDT',
@@ -290,10 +400,12 @@ class bitmex(Exchange, ImplicitAPI):
290
400
  },
291
401
  })
292
402
 
293
- async def fetch_currencies(self, params={}):
403
+ async def fetch_currencies(self, params={}) -> Currencies:
294
404
  """
295
405
  fetches all available currencies on an exchange
296
- :see: https://www.bitmex.com/api/explorer/#not /Wallet/Wallet_getAssetsConfig
406
+
407
+ https://www.bitmex.com/api/explorer/#not /Wallet/Wallet_getAssetsConfig
408
+
297
409
  :param dict [params]: extra parameters specific to the exchange API endpoint
298
410
  :returns dict: an associative dictionary of currencies
299
411
  """
@@ -331,7 +443,7 @@ class bitmex(Exchange, ImplicitAPI):
331
443
  # },
332
444
  # }
333
445
  #
334
- result = {}
446
+ result: dict = {}
335
447
  for i in range(0, len(response)):
336
448
  currency = response[i]
337
449
  asset = self.safe_string(currency, 'asset')
@@ -341,7 +453,7 @@ class bitmex(Exchange, ImplicitAPI):
341
453
  chains = self.safe_value(currency, 'networks', [])
342
454
  depositEnabled = False
343
455
  withdrawEnabled = False
344
- networks = {}
456
+ networks: dict = {}
345
457
  scale = self.safe_string(currency, 'scale')
346
458
  precisionString = self.parse_precision(scale)
347
459
  precision = self.parse_number(precisionString)
@@ -453,10 +565,12 @@ class bitmex(Exchange, ImplicitAPI):
453
565
  def convert_from_raw_cost(self, symbol, rawQuantity):
454
566
  return self.convert_from_raw_quantity(symbol, rawQuantity, 'quote')
455
567
 
456
- async def fetch_markets(self, params={}):
568
+ async def fetch_markets(self, params={}) -> List[Market]:
457
569
  """
458
570
  retrieves data on all markets for bitmex
459
- :see: https://www.bitmex.com/api/explorer/#not /Instrument/Instrument_getActive
571
+
572
+ https://www.bitmex.com/api/explorer/#not /Instrument/Instrument_getActive
573
+
460
574
  :param dict [params]: extra parameters specific to the exchange API endpoint
461
575
  :returns dict[]: an array of objects representing market data
462
576
  """
@@ -574,7 +688,7 @@ class bitmex(Exchange, ImplicitAPI):
574
688
  #
575
689
  return self.parse_markets(response)
576
690
 
577
- def parse_market(self, market) -> Market:
691
+ def parse_market(self, market: dict) -> Market:
578
692
  id = self.safe_string(market, 'symbol')
579
693
  baseId = self.safe_string(market, 'underlying')
580
694
  quoteId = self.safe_string(market, 'quoteCurrency')
@@ -738,7 +852,7 @@ class bitmex(Exchange, ImplicitAPI):
738
852
  # }
739
853
  # ]
740
854
  #
741
- result = {'info': response}
855
+ result: dict = {'info': response}
742
856
  for i in range(0, len(response)):
743
857
  balance = response[i]
744
858
  currencyId = self.safe_string(balance, 'currency')
@@ -754,12 +868,14 @@ class bitmex(Exchange, ImplicitAPI):
754
868
  async def fetch_balance(self, params={}) -> Balances:
755
869
  """
756
870
  query for balance and get the amount of funds available for trading or funds locked in orders
757
- :see: https://www.bitmex.com/api/explorer/#not /User/User_getMargin
871
+
872
+ https://www.bitmex.com/api/explorer/#not /User/User_getMargin
873
+
758
874
  :param dict [params]: extra parameters specific to the exchange API endpoint
759
875
  :returns dict: a `balance structure <https://docs.ccxt.com/#/?id=balance-structure>`
760
876
  """
761
877
  await self.load_markets()
762
- request = {
878
+ request: dict = {
763
879
  'currency': 'all',
764
880
  }
765
881
  response = await self.privateGetUserMargin(self.extend(request, params))
@@ -815,7 +931,9 @@ class bitmex(Exchange, ImplicitAPI):
815
931
  async def fetch_order_book(self, symbol: str, limit: Int = None, params={}) -> OrderBook:
816
932
  """
817
933
  fetches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
818
- :see: https://www.bitmex.com/api/explorer/#not /OrderBook/OrderBook_getL2
934
+
935
+ https://www.bitmex.com/api/explorer/#not /OrderBook/OrderBook_getL2
936
+
819
937
  :param str symbol: unified symbol of the market to fetch the order book for
820
938
  :param int [limit]: the maximum amount of order book entries to return
821
939
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -823,13 +941,13 @@ class bitmex(Exchange, ImplicitAPI):
823
941
  """
824
942
  await self.load_markets()
825
943
  market = self.market(symbol)
826
- request = {
944
+ request: dict = {
827
945
  'symbol': market['id'],
828
946
  }
829
947
  if limit is not None:
830
948
  request['depth'] = limit
831
949
  response = await self.publicGetOrderBookL2(self.extend(request, params))
832
- result = {
950
+ result: dict = {
833
951
  'symbol': symbol,
834
952
  'bids': [],
835
953
  'asks': [],
@@ -854,12 +972,15 @@ class bitmex(Exchange, ImplicitAPI):
854
972
  async def fetch_order(self, id: str, symbol: Str = None, params={}):
855
973
  """
856
974
  fetches information on an order made by the user
857
- :see: https://www.bitmex.com/api/explorer/#not /Order/Order_getOrders
975
+
976
+ https://www.bitmex.com/api/explorer/#not /Order/Order_getOrders
977
+
978
+ :param str id: the order id
858
979
  :param str symbol: unified symbol of the market the order was made in
859
980
  :param dict [params]: extra parameters specific to the exchange API endpoint
860
981
  :returns dict: An `order structure <https://docs.ccxt.com/#/?id=order-structure>`
861
982
  """
862
- filter = {
983
+ filter: dict = {
863
984
  'filter': {
864
985
  'orderID': id,
865
986
  },
@@ -872,7 +993,9 @@ class bitmex(Exchange, ImplicitAPI):
872
993
 
873
994
  async def fetch_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
874
995
  """
875
- :see: https://www.bitmex.com/api/explorer/#not /Order/Order_getOrders
996
+
997
+ https://www.bitmex.com/api/explorer/#not /Order/Order_getOrders
998
+
876
999
  fetches information on multiple orders made by the user
877
1000
  :param str symbol: unified market symbol of the market orders were made in
878
1001
  :param int [since]: the earliest time in ms to fetch orders for
@@ -888,7 +1011,7 @@ class bitmex(Exchange, ImplicitAPI):
888
1011
  if paginate:
889
1012
  return await self.fetch_paginated_call_dynamic('fetchOrders', symbol, since, limit, params, 100)
890
1013
  market = None
891
- request = {}
1014
+ request: dict = {}
892
1015
  if symbol is not None:
893
1016
  market = self.market(symbol)
894
1017
  request['symbol'] = market['id']
@@ -912,14 +1035,16 @@ class bitmex(Exchange, ImplicitAPI):
912
1035
  async def fetch_open_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
913
1036
  """
914
1037
  fetch all unfilled currently open orders
915
- :see: https://www.bitmex.com/api/explorer/#not /Order/Order_getOrders
1038
+
1039
+ https://www.bitmex.com/api/explorer/#not /Order/Order_getOrders
1040
+
916
1041
  :param str symbol: unified market symbol
917
1042
  :param int [since]: the earliest time in ms to fetch open orders for
918
1043
  :param int [limit]: the maximum number of open orders structures to retrieve
919
1044
  :param dict [params]: extra parameters specific to the exchange API endpoint
920
1045
  :returns Order[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
921
1046
  """
922
- request = {
1047
+ request: dict = {
923
1048
  'filter': {
924
1049
  'open': True,
925
1050
  },
@@ -929,7 +1054,9 @@ class bitmex(Exchange, ImplicitAPI):
929
1054
  async def fetch_closed_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
930
1055
  """
931
1056
  fetches information on multiple closed orders made by the user
932
- :see: https://www.bitmex.com/api/explorer/#not /Order/Order_getOrders
1057
+
1058
+ https://www.bitmex.com/api/explorer/#not /Order/Order_getOrders
1059
+
933
1060
  :param str symbol: unified market symbol of the market orders were made in
934
1061
  :param int [since]: the earliest time in ms to fetch orders for
935
1062
  :param int [limit]: the maximum number of order structures to retrieve
@@ -943,7 +1070,9 @@ class bitmex(Exchange, ImplicitAPI):
943
1070
  async def fetch_my_trades(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}):
944
1071
  """
945
1072
  fetch all trades made by the user
946
- :see: https://www.bitmex.com/api/explorer/#not /Execution/Execution_getTradeHistory
1073
+
1074
+ https://www.bitmex.com/api/explorer/#not /Execution/Execution_getTradeHistory
1075
+
947
1076
  :param str symbol: unified market symbol
948
1077
  :param int [since]: the earliest time in ms to fetch trades for
949
1078
  :param int [limit]: the maximum number of trades structures to retrieve
@@ -957,14 +1086,14 @@ class bitmex(Exchange, ImplicitAPI):
957
1086
  if paginate:
958
1087
  return await self.fetch_paginated_call_dynamic('fetchMyTrades', symbol, since, limit, params, 100)
959
1088
  market = None
960
- request = {}
1089
+ request: dict = {}
961
1090
  if symbol is not None:
962
1091
  market = self.market(symbol)
963
1092
  request['symbol'] = market['id']
964
1093
  if since is not None:
965
1094
  request['startTime'] = self.iso8601(since)
966
1095
  if limit is not None:
967
- request['count'] = limit
1096
+ request['count'] = min(500, limit)
968
1097
  until = self.safe_integer_2(params, 'until', 'endTime')
969
1098
  if until is not None:
970
1099
  params = self.omit(params, ['until'])
@@ -1032,7 +1161,7 @@ class bitmex(Exchange, ImplicitAPI):
1032
1161
  return self.parse_trades(response, market, since, limit)
1033
1162
 
1034
1163
  def parse_ledger_entry_type(self, type):
1035
- types = {
1164
+ types: dict = {
1036
1165
  'Withdrawal': 'transaction',
1037
1166
  'RealisedPNL': 'margin',
1038
1167
  'UnrealisedPNL': 'margin',
@@ -1043,7 +1172,7 @@ class bitmex(Exchange, ImplicitAPI):
1043
1172
  }
1044
1173
  return self.safe_string(types, type, type)
1045
1174
 
1046
- def parse_ledger_entry(self, item, currency: Currency = None):
1175
+ def parse_ledger_entry(self, item: dict, currency: Currency = None) -> LedgerEntry:
1047
1176
  #
1048
1177
  # {
1049
1178
  # "transactID": "69573da3-7744-5467-3207-89fd6efe7a47",
@@ -1092,6 +1221,7 @@ class bitmex(Exchange, ImplicitAPI):
1092
1221
  type = self.parse_ledger_entry_type(self.safe_string(item, 'transactType'))
1093
1222
  currencyId = self.safe_string(item, 'currency')
1094
1223
  code = self.safe_currency_code(currencyId, currency)
1224
+ currency = self.safe_currency(currencyId, currency)
1095
1225
  amountString = self.safe_string(item, 'amount')
1096
1226
  amount = self.convert_to_real_amount(code, amountString)
1097
1227
  timestamp = self.parse8601(self.safe_string(item, 'transactTime'))
@@ -1100,13 +1230,14 @@ class bitmex(Exchange, ImplicitAPI):
1100
1230
  # set the timestamp to zero, 1970 Jan 1 00:00:00
1101
1231
  # for unrealized pnl and other transactions without a timestamp
1102
1232
  timestamp = 0 # see comments above
1233
+ fee = None
1103
1234
  feeCost = self.safe_string(item, 'fee')
1104
1235
  if feeCost is not None:
1105
1236
  feeCost = self.convert_to_real_amount(code, feeCost)
1106
- fee = {
1107
- 'cost': self.parse_number(feeCost),
1108
- 'currency': code,
1109
- }
1237
+ fee = {
1238
+ 'cost': self.parse_number(feeCost),
1239
+ 'currency': code,
1240
+ }
1110
1241
  after = self.safe_string(item, 'walletBalance')
1111
1242
  if after is not None:
1112
1243
  after = self.convert_to_real_amount(code, after)
@@ -1118,9 +1249,9 @@ class bitmex(Exchange, ImplicitAPI):
1118
1249
  else:
1119
1250
  direction = 'in'
1120
1251
  status = self.parse_transaction_status(self.safe_string(item, 'transactStatus'))
1121
- return {
1122
- 'id': id,
1252
+ return self.safe_ledger_entry({
1123
1253
  'info': item,
1254
+ 'id': id,
1124
1255
  'timestamp': timestamp,
1125
1256
  'datetime': self.iso8601(timestamp),
1126
1257
  'direction': direction,
@@ -1129,25 +1260,27 @@ class bitmex(Exchange, ImplicitAPI):
1129
1260
  'referenceAccount': referenceAccount,
1130
1261
  'type': type,
1131
1262
  'currency': code,
1132
- 'amount': amount,
1263
+ 'amount': self.parse_number(amount),
1133
1264
  'before': before,
1134
1265
  'after': self.parse_number(after),
1135
1266
  'status': status,
1136
1267
  'fee': fee,
1137
- }
1268
+ }, currency)
1138
1269
 
1139
- async def fetch_ledger(self, code: Str = None, since: Int = None, limit: Int = None, params={}):
1270
+ async def fetch_ledger(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[LedgerEntry]:
1140
1271
  """
1141
- fetch the history of changes, actions done by the user or operations that altered balance of the user
1142
- :see: https://www.bitmex.com/api/explorer/#not /User/User_getWalletHistory
1143
- :param str code: unified currency code, default is None
1272
+ fetch the history of changes, actions done by the user or operations that altered the balance of the user
1273
+
1274
+ https://www.bitmex.com/api/explorer/#not /User/User_getWalletHistory
1275
+
1276
+ :param str [code]: unified currency code, default is None
1144
1277
  :param int [since]: timestamp in ms of the earliest ledger entry, default is None
1145
- :param int [limit]: max number of ledger entrys to return, default is None
1278
+ :param int [limit]: max number of ledger entries to return, default is None
1146
1279
  :param dict [params]: extra parameters specific to the exchange API endpoint
1147
- :returns dict: a `ledger structure <https://docs.ccxt.com/#/?id=ledger-structure>`
1280
+ :returns dict: a `ledger structure <https://docs.ccxt.com/#/?id=ledger>`
1148
1281
  """
1149
1282
  await self.load_markets()
1150
- request = {
1283
+ request: dict = {
1151
1284
  # 'start': 123,
1152
1285
  }
1153
1286
  #
@@ -1187,7 +1320,9 @@ class bitmex(Exchange, ImplicitAPI):
1187
1320
  async def fetch_deposits_withdrawals(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Transaction]:
1188
1321
  """
1189
1322
  fetch history of deposits and withdrawals
1190
- :see: https://www.bitmex.com/api/explorer/#not /User/User_getWalletHistory
1323
+
1324
+ https://www.bitmex.com/api/explorer/#not /User/User_getWalletHistory
1325
+
1191
1326
  :param str [code]: unified currency code for the currency of the deposit/withdrawals, default is None
1192
1327
  :param int [since]: timestamp in ms of the earliest deposit/withdrawal, default is None
1193
1328
  :param int [limit]: max number of deposit/withdrawals to return, default is None
@@ -1195,7 +1330,7 @@ class bitmex(Exchange, ImplicitAPI):
1195
1330
  :returns dict: a list of `transaction structure <https://docs.ccxt.com/#/?id=transaction-structure>`
1196
1331
  """
1197
1332
  await self.load_markets()
1198
- request = {
1333
+ request: dict = {
1199
1334
  'currency': 'all',
1200
1335
  # 'start': 123,
1201
1336
  }
@@ -1214,8 +1349,8 @@ class bitmex(Exchange, ImplicitAPI):
1214
1349
  transactions = self.filter_by_array(response, 'transactType', ['Withdrawal', 'Deposit'], False)
1215
1350
  return self.parse_transactions(transactions, currency, since, limit)
1216
1351
 
1217
- def parse_transaction_status(self, status):
1218
- statuses = {
1352
+ def parse_transaction_status(self, status: Str):
1353
+ statuses: dict = {
1219
1354
  'Confirmed': 'pending',
1220
1355
  'Canceled': 'canceled',
1221
1356
  'Completed': 'ok',
@@ -1223,7 +1358,7 @@ class bitmex(Exchange, ImplicitAPI):
1223
1358
  }
1224
1359
  return self.safe_string(statuses, status, status)
1225
1360
 
1226
- def parse_transaction(self, transaction, currency: Currency = None) -> Transaction:
1361
+ def parse_transaction(self, transaction: dict, currency: Currency = None) -> Transaction:
1227
1362
  #
1228
1363
  # {
1229
1364
  # "transactID": "ffe699c2-95ee-4c13-91f9-0faf41daec25",
@@ -1299,14 +1434,16 @@ class bitmex(Exchange, ImplicitAPI):
1299
1434
  async def fetch_ticker(self, symbol: str, params={}) -> Ticker:
1300
1435
  """
1301
1436
  fetches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
1302
- :see: https://www.bitmex.com/api/explorer/#not /Instrument/Instrument_get
1437
+
1438
+ https://www.bitmex.com/api/explorer/#not /Instrument/Instrument_get
1439
+
1303
1440
  :param str symbol: unified symbol of the market to fetch the ticker for
1304
1441
  :param dict [params]: extra parameters specific to the exchange API endpoint
1305
1442
  :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
1306
1443
  """
1307
1444
  await self.load_markets()
1308
1445
  market = self.market(symbol)
1309
- request = {
1446
+ request: dict = {
1310
1447
  'symbol': market['id'],
1311
1448
  }
1312
1449
  response = await self.publicGetInstrument(self.extend(request, params))
@@ -1318,7 +1455,9 @@ class bitmex(Exchange, ImplicitAPI):
1318
1455
  async def fetch_tickers(self, symbols: Strings = None, params={}) -> Tickers:
1319
1456
  """
1320
1457
  fetches price tickers for multiple markets, statistical information calculated over the past 24 hours for each market
1321
- :see: https://www.bitmex.com/api/explorer/#not /Instrument/Instrument_getActiveAndIndices
1458
+
1459
+ https://www.bitmex.com/api/explorer/#not /Instrument/Instrument_getActiveAndIndices
1460
+
1322
1461
  :param str[]|None symbols: unified symbols of the markets to fetch the ticker for, all market tickers are returned if not assigned
1323
1462
  :param dict [params]: extra parameters specific to the exchange API endpoint
1324
1463
  :returns dict: a dictionary of `ticker structures <https://docs.ccxt.com/#/?id=ticker-structure>`
@@ -1327,7 +1466,7 @@ class bitmex(Exchange, ImplicitAPI):
1327
1466
  symbols = self.market_symbols(symbols)
1328
1467
  response = await self.publicGetInstrumentActiveAndIndices(params)
1329
1468
  # same response "fetchMarkets"
1330
- result = {}
1469
+ result: dict = {}
1331
1470
  for i in range(0, len(response)):
1332
1471
  ticker = self.parse_ticker(response[i])
1333
1472
  symbol = self.safe_string(ticker, 'symbol')
@@ -1335,7 +1474,7 @@ class bitmex(Exchange, ImplicitAPI):
1335
1474
  result[symbol] = ticker
1336
1475
  return self.filter_by_array_tickers(result, 'symbol', symbols)
1337
1476
 
1338
- def parse_ticker(self, ticker, market: Market = None) -> Ticker:
1477
+ def parse_ticker(self, ticker: dict, market: Market = None) -> Ticker:
1339
1478
  # see response sample under "fetchMarkets" because same endpoint is being used here
1340
1479
  marketId = self.safe_string(ticker, 'symbol')
1341
1480
  symbol = self.safe_symbol(marketId, market)
@@ -1362,6 +1501,7 @@ class bitmex(Exchange, ImplicitAPI):
1362
1501
  'average': None,
1363
1502
  'baseVolume': self.safe_string(ticker, 'homeNotional24h'),
1364
1503
  'quoteVolume': self.safe_string(ticker, 'foreignNotional24h'),
1504
+ 'markPrice': self.safe_string(ticker, 'markPrice'),
1365
1505
  'info': ticker,
1366
1506
  }, market)
1367
1507
 
@@ -1398,7 +1538,9 @@ class bitmex(Exchange, ImplicitAPI):
1398
1538
  async def fetch_ohlcv(self, symbol: str, timeframe='1m', since: Int = None, limit: Int = None, params={}) -> List[list]:
1399
1539
  """
1400
1540
  fetches historical candlestick data containing the open, high, low, and close price, and the volume of a market
1401
- :see: https://www.bitmex.com/api/explorer/#not /Trade/Trade_getBucketed
1541
+
1542
+ https://www.bitmex.com/api/explorer/#not /Trade/Trade_getBucketed
1543
+
1402
1544
  :param str symbol: unified symbol of the market to fetch OHLCV data for
1403
1545
  :param str timeframe: the length of time each candle represents
1404
1546
  :param int [since]: timestamp in ms of the earliest candle to fetch
@@ -1414,12 +1556,12 @@ class bitmex(Exchange, ImplicitAPI):
1414
1556
  return await self.fetch_paginated_call_deterministic('fetchOHLCV', symbol, since, limit, timeframe, params)
1415
1557
  # send JSON key/value pairs, such as {"key": "value"}
1416
1558
  # filter by individual fields and do advanced queries on timestamps
1417
- # filter = {'key': 'value'}
1559
+ # filter: Dict = {'key': 'value'}
1418
1560
  # send a bare series(e.g. XBU) to nearest expiring contract in that series
1419
1561
  # you can also send a timeframe, e.g. XBU:monthly
1420
1562
  # timeframes: daily, weekly, monthly, quarterly, and biquarterly
1421
1563
  market = self.market(symbol)
1422
- request = {
1564
+ request: dict = {
1423
1565
  'symbol': market['id'],
1424
1566
  'binSize': self.safe_string(self.timeframes, timeframe, timeframe),
1425
1567
  'partial': True, # True == include yet-incomplete current bins
@@ -1431,7 +1573,7 @@ class bitmex(Exchange, ImplicitAPI):
1431
1573
  }
1432
1574
  if limit is not None:
1433
1575
  request['count'] = limit # default 100, max 500
1434
- until = self.safe_integer_2(params, 'until', 'endTime')
1576
+ until = self.safe_integer(params, 'until')
1435
1577
  if until is not None:
1436
1578
  params = self.omit(params, ['until'])
1437
1579
  request['endTime'] = self.iso8601(until)
@@ -1463,7 +1605,7 @@ class bitmex(Exchange, ImplicitAPI):
1463
1605
  result[i][0] = result[i][0] - duration
1464
1606
  return result
1465
1607
 
1466
- def parse_trade(self, trade, market: Market = None) -> Trade:
1608
+ def parse_trade(self, trade: dict, market: Market = None) -> Trade:
1467
1609
  #
1468
1610
  # fetchTrades(public)
1469
1611
  #
@@ -1573,8 +1715,8 @@ class bitmex(Exchange, ImplicitAPI):
1573
1715
  'fee': fee,
1574
1716
  }, market)
1575
1717
 
1576
- def parse_order_status(self, status):
1577
- statuses = {
1718
+ def parse_order_status(self, status: Str):
1719
+ statuses: dict = {
1578
1720
  'New': 'open',
1579
1721
  'PartiallyFilled': 'open',
1580
1722
  'Filled': 'closed',
@@ -1590,8 +1732,8 @@ class bitmex(Exchange, ImplicitAPI):
1590
1732
  }
1591
1733
  return self.safe_string(statuses, status, status)
1592
1734
 
1593
- def parse_time_in_force(self, timeInForce):
1594
- timeInForces = {
1735
+ def parse_time_in_force(self, timeInForce: Str):
1736
+ timeInForces: dict = {
1595
1737
  'Day': 'Day',
1596
1738
  'GoodTillCancel': 'GTC',
1597
1739
  'ImmediateOrCancel': 'IOC',
@@ -1599,7 +1741,7 @@ class bitmex(Exchange, ImplicitAPI):
1599
1741
  }
1600
1742
  return self.safe_string(timeInForces, timeInForce, timeInForce)
1601
1743
 
1602
- def parse_order(self, order, market: Market = None) -> Order:
1744
+ def parse_order(self, order: dict, market: Market = None) -> Order:
1603
1745
  #
1604
1746
  # {
1605
1747
  # "orderID":"56222c7a-9956-413a-82cf-99f4812c214b",
@@ -1665,7 +1807,7 @@ class bitmex(Exchange, ImplicitAPI):
1665
1807
  if execInst is not None:
1666
1808
  postOnly = (execInst == 'ParticipateDoNotInitiate')
1667
1809
  timestamp = self.parse8601(self.safe_string(order, 'timestamp'))
1668
- stopPrice = self.safe_number(order, 'stopPx')
1810
+ triggerPrice = self.safe_number(order, 'stopPx')
1669
1811
  remaining = self.safe_string(order, 'leavesQty')
1670
1812
  return self.safe_order({
1671
1813
  'info': order,
@@ -1680,8 +1822,7 @@ class bitmex(Exchange, ImplicitAPI):
1680
1822
  'postOnly': postOnly,
1681
1823
  'side': self.safe_string_lower(order, 'side'),
1682
1824
  'price': self.safe_string(order, 'price'),
1683
- 'stopPrice': stopPrice,
1684
- 'triggerPrice': stopPrice,
1825
+ 'triggerPrice': triggerPrice,
1685
1826
  'amount': amount,
1686
1827
  'cost': cost,
1687
1828
  'average': average,
@@ -1695,7 +1836,9 @@ class bitmex(Exchange, ImplicitAPI):
1695
1836
  async def fetch_trades(self, symbol: str, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
1696
1837
  """
1697
1838
  get the list of most recent trades for a particular symbol
1698
- :see: https://www.bitmex.com/api/explorer/#not /Trade/Trade_get
1839
+
1840
+ https://www.bitmex.com/api/explorer/#not /Trade/Trade_get
1841
+
1699
1842
  :param str symbol: unified symbol of the market to fetch trades for
1700
1843
  :param int [since]: timestamp in ms of the earliest trade to fetch
1701
1844
  :param int [limit]: the maximum amount of trades to fetch
@@ -1709,7 +1852,7 @@ class bitmex(Exchange, ImplicitAPI):
1709
1852
  if paginate:
1710
1853
  return await self.fetch_paginated_call_dynamic('fetchTrades', symbol, since, limit, params)
1711
1854
  market = self.market(symbol)
1712
- request = {
1855
+ request: dict = {
1713
1856
  'symbol': market['id'],
1714
1857
  }
1715
1858
  if since is not None:
@@ -1757,12 +1900,14 @@ class bitmex(Exchange, ImplicitAPI):
1757
1900
  async def create_order(self, symbol: str, type: OrderType, side: OrderSide, amount: float, price: Num = None, params={}):
1758
1901
  """
1759
1902
  create a trade order
1760
- :see: https://www.bitmex.com/api/explorer/#not /Order/Order_new
1903
+
1904
+ https://www.bitmex.com/api/explorer/#not /Order/Order_new
1905
+
1761
1906
  :param str symbol: unified symbol of the market to create an order in
1762
1907
  :param str type: 'market' or 'limit'
1763
1908
  :param str side: 'buy' or 'sell'
1764
1909
  :param float amount: how much of currency you want to trade in units of base currency
1765
- :param float [price]: the price at which the order is to be fullfilled, in units of the quote currency, ignored in market orders
1910
+ :param float [price]: the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
1766
1911
  :param dict [params]: extra parameters specific to the exchange API endpoint
1767
1912
  :param dict [params.triggerPrice]: the price at which a trigger order is triggered at
1768
1913
  :param dict [params.triggerDirection]: the direction whenever the trigger happens with relation to price - 'above' or 'below'
@@ -1778,7 +1923,7 @@ class bitmex(Exchange, ImplicitAPI):
1778
1923
  raise InvalidOrder(self.id + ' createOrder() does not support reduceOnly for ' + market['type'] + ' orders, reduceOnly orders are supported for swap and future markets only')
1779
1924
  brokerId = self.safe_string(self.options, 'brokerId', 'CCXT')
1780
1925
  qty = self.parse_to_int(self.amount_to_precision(symbol, amount))
1781
- request = {
1926
+ request: dict = {
1782
1927
  'symbol': market['id'],
1783
1928
  'side': self.capitalize(side),
1784
1929
  'orderQty': qty, # lot size multiplied by the number of contracts
@@ -1815,7 +1960,7 @@ class bitmex(Exchange, ImplicitAPI):
1815
1960
  else:
1816
1961
  if triggerPrice is None:
1817
1962
  # if exchange specific trigger types were provided
1818
- raise ArgumentsRequired(self.id + ' createOrder() requires a triggerPrice(stopPx|stopPrice) parameter for the ' + orderType + ' order type')
1963
+ raise ArgumentsRequired(self.id + ' createOrder() requires a triggerPrice parameter for the ' + orderType + ' order type')
1819
1964
  request['stopPx'] = self.parse_to_numeric(self.price_to_precision(symbol, triggerPrice))
1820
1965
  request['ordType'] = orderType
1821
1966
  params = self.omit(params, ['triggerPrice', 'stopPrice', 'stopPx', 'triggerDirection', 'trailingAmount'])
@@ -1830,7 +1975,7 @@ class bitmex(Exchange, ImplicitAPI):
1830
1975
 
1831
1976
  async def edit_order(self, id: str, symbol: str, type: OrderType, side: OrderSide, amount: Num = None, price: Num = None, params={}):
1832
1977
  await self.load_markets()
1833
- request = {}
1978
+ request: dict = {}
1834
1979
  trailingAmount = self.safe_string_2(params, 'trailingAmount', 'pegOffsetValue')
1835
1980
  isTrailingAmountOrder = trailingAmount is not None
1836
1981
  if isTrailingAmountOrder:
@@ -1877,7 +2022,9 @@ class bitmex(Exchange, ImplicitAPI):
1877
2022
  async def cancel_order(self, id: str, symbol: Str = None, params={}):
1878
2023
  """
1879
2024
  cancels an open order
1880
- :see: https://www.bitmex.com/api/explorer/#not /Order/Order_cancel
2025
+
2026
+ https://www.bitmex.com/api/explorer/#not /Order/Order_cancel
2027
+
1881
2028
  :param str id: order id
1882
2029
  :param str symbol: not used by bitmex cancelOrder()
1883
2030
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -1886,7 +2033,7 @@ class bitmex(Exchange, ImplicitAPI):
1886
2033
  await self.load_markets()
1887
2034
  # https://github.com/ccxt/ccxt/issues/6507
1888
2035
  clientOrderId = self.safe_value_2(params, 'clOrdID', 'clientOrderId')
1889
- request = {}
2036
+ request: dict = {}
1890
2037
  if clientOrderId is None:
1891
2038
  request['orderID'] = id
1892
2039
  else:
@@ -1903,7 +2050,9 @@ class bitmex(Exchange, ImplicitAPI):
1903
2050
  async def cancel_orders(self, ids, symbol: Str = None, params={}):
1904
2051
  """
1905
2052
  cancel multiple orders
1906
- :see: https://www.bitmex.com/api/explorer/#not /Order/Order_cancel
2053
+
2054
+ https://www.bitmex.com/api/explorer/#not /Order/Order_cancel
2055
+
1907
2056
  :param str[] ids: order ids
1908
2057
  :param str symbol: not used by bitmex cancelOrders()
1909
2058
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -1913,7 +2062,7 @@ class bitmex(Exchange, ImplicitAPI):
1913
2062
  await self.load_markets()
1914
2063
  # https://github.com/ccxt/ccxt/issues/6507
1915
2064
  clientOrderId = self.safe_value_2(params, 'clOrdID', 'clientOrderId')
1916
- request = {}
2065
+ request: dict = {}
1917
2066
  if clientOrderId is None:
1918
2067
  request['orderID'] = ids
1919
2068
  else:
@@ -1925,13 +2074,15 @@ class bitmex(Exchange, ImplicitAPI):
1925
2074
  async def cancel_all_orders(self, symbol: Str = None, params={}):
1926
2075
  """
1927
2076
  cancel all open orders
1928
- :see: https://www.bitmex.com/api/explorer/#not /Order/Order_cancelAll
2077
+
2078
+ https://www.bitmex.com/api/explorer/#not /Order/Order_cancelAll
2079
+
1929
2080
  :param str symbol: unified market symbol, only orders in the market of self symbol are cancelled when symbol is not None
1930
2081
  :param dict [params]: extra parameters specific to the exchange API endpoint
1931
2082
  :returns dict[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
1932
2083
  """
1933
2084
  await self.load_markets()
1934
- request = {}
2085
+ request: dict = {}
1935
2086
  market = None
1936
2087
  if symbol is not None:
1937
2088
  market = self.market(symbol)
@@ -1978,10 +2129,35 @@ class bitmex(Exchange, ImplicitAPI):
1978
2129
  #
1979
2130
  return self.parse_orders(response, market)
1980
2131
 
1981
- async def fetch_leverages(self, symbols: List[str] = None, params={}) -> Leverages:
2132
+ async def cancel_all_orders_after(self, timeout: Int, params={}):
2133
+ """
2134
+ dead man's switch, cancel all orders after the given timeout
2135
+
2136
+ https://www.bitmex.com/api/explorer/#not /Order/Order_cancelAllAfter
2137
+
2138
+ :param number timeout: time in milliseconds, 0 represents cancel the timer
2139
+ :param dict [params]: extra parameters specific to the exchange API endpoint
2140
+ :returns dict: the api result
2141
+ """
2142
+ await self.load_markets()
2143
+ request: dict = {
2144
+ 'timeout': self.parse_to_int(timeout / 1000) if (timeout > 0) else 0,
2145
+ }
2146
+ response = await self.privatePostOrderCancelAllAfter(self.extend(request, params))
2147
+ #
2148
+ # {
2149
+ # now: '2024-04-09T09:01:56.560Z',
2150
+ # cancelTime: '2024-04-09T09:01:56.660Z'
2151
+ # }
2152
+ #
2153
+ return response
2154
+
2155
+ async def fetch_leverages(self, symbols: Strings = None, params={}) -> Leverages:
1982
2156
  """
1983
2157
  fetch the set leverage for all contract markets
1984
- :see: https://www.bitmex.com/api/explorer/#not /Position/Position_get
2158
+
2159
+ https://www.bitmex.com/api/explorer/#not /Position/Position_get
2160
+
1985
2161
  :param str[] [symbols]: a list of unified market symbols
1986
2162
  :param dict [params]: extra parameters specific to the exchange API endpoint
1987
2163
  :returns dict: a list of `leverage structures <https://docs.ccxt.com/#/?id=leverage-structure>`
@@ -1990,7 +2166,7 @@ class bitmex(Exchange, ImplicitAPI):
1990
2166
  leverages = await self.fetch_positions(symbols, params)
1991
2167
  return self.parse_leverages(leverages, symbols, 'symbol')
1992
2168
 
1993
- def parse_leverage(self, leverage, market=None) -> Leverage:
2169
+ def parse_leverage(self, leverage: dict, market: Market = None) -> Leverage:
1994
2170
  marketId = self.safe_string(leverage, 'symbol')
1995
2171
  return {
1996
2172
  'info': leverage,
@@ -2003,7 +2179,9 @@ class bitmex(Exchange, ImplicitAPI):
2003
2179
  async def fetch_positions(self, symbols: Strings = None, params={}):
2004
2180
  """
2005
2181
  fetch all open positions
2006
- :see: https://www.bitmex.com/api/explorer/#not /Position/Position_get
2182
+
2183
+ https://www.bitmex.com/api/explorer/#not /Position/Position_get
2184
+
2007
2185
  :param str[]|None symbols: list of unified market symbols
2008
2186
  :param dict [params]: extra parameters specific to the exchange API endpoint
2009
2187
  :returns dict[]: a list of `position structure <https://docs.ccxt.com/#/?id=position-structure>`
@@ -2110,7 +2288,7 @@ class bitmex(Exchange, ImplicitAPI):
2110
2288
  results = self.parse_positions(response, symbols)
2111
2289
  return self.filter_by_array_positions(results, 'symbol', symbols, False)
2112
2290
 
2113
- def parse_position(self, position, market: Market = None):
2291
+ def parse_position(self, position: dict, market: Market = None):
2114
2292
  #
2115
2293
  # {
2116
2294
  # "account": 9371654,
@@ -2254,10 +2432,12 @@ class bitmex(Exchange, ImplicitAPI):
2254
2432
  'takeProfitPrice': None,
2255
2433
  })
2256
2434
 
2257
- async def withdraw(self, code: str, amount: float, address, tag=None, params={}):
2435
+ async def withdraw(self, code: str, amount: float, address: str, tag=None, params={}) -> Transaction:
2258
2436
  """
2259
2437
  make a withdrawal
2260
- :see: https://www.bitmex.com/api/explorer/#not /User/User_requestWithdrawal
2438
+
2439
+ https://www.bitmex.com/api/explorer/#not /User/User_requestWithdrawal
2440
+
2261
2441
  :param str code: unified currency code
2262
2442
  :param float amount: the amount to withdraw
2263
2443
  :param str address: the address to withdraw to
@@ -2272,7 +2452,7 @@ class bitmex(Exchange, ImplicitAPI):
2272
2452
  qty = self.convert_from_real_amount(code, amount)
2273
2453
  networkCode = None
2274
2454
  networkCode, params = self.handle_network_code_and_params(params)
2275
- request = {
2455
+ request: dict = {
2276
2456
  'currency': currency['id'],
2277
2457
  'amount': qty,
2278
2458
  'address': address,
@@ -2280,6 +2460,8 @@ class bitmex(Exchange, ImplicitAPI):
2280
2460
  # 'otpToken': '123456', # requires if two-factor auth(OTP) is enabled
2281
2461
  # 'fee': 0.001, # bitcoin network fee
2282
2462
  }
2463
+ if self.twofa is not None:
2464
+ request['otpToken'] = self.totp(self.twofa)
2283
2465
  response = await self.privatePostUserRequestWithdrawal(self.extend(request, params))
2284
2466
  #
2285
2467
  # {
@@ -2300,13 +2482,15 @@ class bitmex(Exchange, ImplicitAPI):
2300
2482
  #
2301
2483
  return self.parse_transaction(response, currency)
2302
2484
 
2303
- async def fetch_funding_rates(self, symbols: Strings = None, params={}):
2485
+ async def fetch_funding_rates(self, symbols: Strings = None, params={}) -> FundingRates:
2304
2486
  """
2305
2487
  fetch the funding rate for multiple markets
2306
- :see: https://www.bitmex.com/api/explorer/#not /Instrument/Instrument_getActiveAndIndices
2488
+
2489
+ https://www.bitmex.com/api/explorer/#not /Instrument/Instrument_getActiveAndIndices
2490
+
2307
2491
  :param str[]|None symbols: list of unified market symbols
2308
2492
  :param dict [params]: extra parameters specific to the exchange API endpoint
2309
- :returns dict: a dictionary of `funding rates structures <https://docs.ccxt.com/#/?id=funding-rates-structure>`, indexe by market symbols
2493
+ :returns dict[]: a list of `funding rate structures <https://docs.ccxt.com/#/?id=funding-rates-structure>`, indexed by market symbols
2310
2494
  """
2311
2495
  await self.load_markets()
2312
2496
  response = await self.publicGetInstrumentActiveAndIndices(params)
@@ -2323,7 +2507,7 @@ class bitmex(Exchange, ImplicitAPI):
2323
2507
  result = self.parse_funding_rates(filteredResponse)
2324
2508
  return self.filter_by_array(result, 'symbol', symbols)
2325
2509
 
2326
- def parse_funding_rate(self, contract, market: Market = None):
2510
+ def parse_funding_rate(self, contract, market: Market = None) -> FundingRate:
2327
2511
  # see response sample under "fetchMarkets" because same endpoint is being used here
2328
2512
  datetime = self.safe_string(contract, 'timestamp')
2329
2513
  marketId = self.safe_string(contract, 'symbol')
@@ -2338,7 +2522,7 @@ class bitmex(Exchange, ImplicitAPI):
2338
2522
  'timestamp': self.parse8601(datetime),
2339
2523
  'datetime': datetime,
2340
2524
  'fundingRate': self.safe_number(contract, 'fundingRate'),
2341
- 'fundingTimestamp': self.iso8601(fundingDatetime),
2525
+ 'fundingTimestamp': self.parse8601(fundingDatetime),
2342
2526
  'fundingDatetime': fundingDatetime,
2343
2527
  'nextFundingRate': self.safe_number(contract, 'indicativeFundingRate'),
2344
2528
  'nextFundingTimestamp': None,
@@ -2346,12 +2530,15 @@ class bitmex(Exchange, ImplicitAPI):
2346
2530
  'previousFundingRate': None,
2347
2531
  'previousFundingTimestamp': None,
2348
2532
  'previousFundingDatetime': None,
2533
+ 'interval': None,
2349
2534
  }
2350
2535
 
2351
2536
  async def fetch_funding_rate_history(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}):
2352
2537
  """
2353
2538
  Fetches the history of funding rates
2354
- :see: https://www.bitmex.com/api/explorer/#not /Funding/Funding_get
2539
+
2540
+ https://www.bitmex.com/api/explorer/#not /Funding/Funding_get
2541
+
2355
2542
  :param str symbol: unified symbol of the market to fetch the funding rate history for
2356
2543
  :param int [since]: timestamp in ms of the earliest funding rate to fetch
2357
2544
  :param int [limit]: the maximum amount of `funding rate structures <https://docs.ccxt.com/#/?id=funding-rate-history-structure>` to fetch
@@ -2364,7 +2551,7 @@ class bitmex(Exchange, ImplicitAPI):
2364
2551
  :returns dict[]: a list of `funding rate structures <https://docs.ccxt.com/#/?id=funding-rate-history-structure>`
2365
2552
  """
2366
2553
  await self.load_markets()
2367
- request = {}
2554
+ request: dict = {}
2368
2555
  market = None
2369
2556
  if symbol in self.currencies:
2370
2557
  code = self.currency(symbol)
@@ -2384,8 +2571,8 @@ class bitmex(Exchange, ImplicitAPI):
2384
2571
  request['startTime'] = self.iso8601(since)
2385
2572
  if limit is not None:
2386
2573
  request['count'] = limit
2387
- until = self.safe_integer_2(params, 'until', 'till')
2388
- params = self.omit(params, ['until', 'till'])
2574
+ until = self.safe_integer(params, 'until')
2575
+ params = self.omit(params, ['until'])
2389
2576
  if until is not None:
2390
2577
  request['endTime'] = self.iso8601(until)
2391
2578
  if (since is None) and (until is None):
@@ -2427,7 +2614,9 @@ class bitmex(Exchange, ImplicitAPI):
2427
2614
  async def set_leverage(self, leverage: Int, symbol: Str = None, params={}):
2428
2615
  """
2429
2616
  set the level of leverage for a market
2430
- :see: https://www.bitmex.com/api/explorer/#not /Position/Position_updateLeverage
2617
+
2618
+ https://www.bitmex.com/api/explorer/#not /Position/Position_updateLeverage
2619
+
2431
2620
  :param float leverage: the rate of leverage
2432
2621
  :param str symbol: unified market symbol
2433
2622
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -2441,7 +2630,7 @@ class bitmex(Exchange, ImplicitAPI):
2441
2630
  market = self.market(symbol)
2442
2631
  if market['type'] != 'swap' and market['type'] != 'future':
2443
2632
  raise BadSymbol(self.id + ' setLeverage() supports future and swap contracts only')
2444
- request = {
2633
+ request: dict = {
2445
2634
  'symbol': market['id'],
2446
2635
  'leverage': leverage,
2447
2636
  }
@@ -2450,7 +2639,9 @@ class bitmex(Exchange, ImplicitAPI):
2450
2639
  async def set_margin_mode(self, marginMode: str, symbol: Str = None, params={}):
2451
2640
  """
2452
2641
  set margin mode to 'cross' or 'isolated'
2453
- :see: https://www.bitmex.com/api/explorer/#not /Position/Position_isolateMargin
2642
+
2643
+ https://www.bitmex.com/api/explorer/#not /Position/Position_isolateMargin
2644
+
2454
2645
  :param str marginMode: 'cross' or 'isolated'
2455
2646
  :param str symbol: unified market symbol
2456
2647
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -2466,16 +2657,18 @@ class bitmex(Exchange, ImplicitAPI):
2466
2657
  if (market['type'] != 'swap') and (market['type'] != 'future'):
2467
2658
  raise BadSymbol(self.id + ' setMarginMode() supports swap and future contracts only')
2468
2659
  enabled = False if (marginMode == 'cross') else True
2469
- request = {
2660
+ request: dict = {
2470
2661
  'symbol': market['id'],
2471
2662
  'enabled': enabled,
2472
2663
  }
2473
2664
  return await self.privatePostPositionIsolate(self.extend(request, params))
2474
2665
 
2475
- async def fetch_deposit_address(self, code: str, params={}):
2666
+ async def fetch_deposit_address(self, code: str, params={}) -> DepositAddress:
2476
2667
  """
2477
2668
  fetch the deposit address for a currency associated with self account
2478
- :see: https://www.bitmex.com/api/explorer/#not /User/User_getDepositAddress
2669
+
2670
+ https://www.bitmex.com/api/explorer/#not /User/User_getDepositAddress
2671
+
2479
2672
  :param str code: unified currency code
2480
2673
  :param dict [params]: extra parameters specific to the exchange API endpoint
2481
2674
  :param str [params.network]: deposit chain, can view all chains via self.publicGetWalletAssets, default is eth, unless the currency has a default chain within self.options['networks']
@@ -2488,7 +2681,7 @@ class bitmex(Exchange, ImplicitAPI):
2488
2681
  raise ArgumentsRequired(self.id + ' fetchDepositAddress requires params["network"]')
2489
2682
  currency = self.currency(code)
2490
2683
  params = self.omit(params, 'network')
2491
- request = {
2684
+ request: dict = {
2492
2685
  'currency': currency['id'],
2493
2686
  'network': self.network_code_to_id(networkCode, currency['code']),
2494
2687
  }
@@ -2497,11 +2690,11 @@ class bitmex(Exchange, ImplicitAPI):
2497
2690
  # '"bc1qmex3puyrzn2gduqcnlu70c2uscpyaa9nm2l2j9le2lt2wkgmw33sy7ndjg"'
2498
2691
  #
2499
2692
  return {
2693
+ 'info': response,
2500
2694
  'currency': code,
2695
+ 'network': networkCode,
2501
2696
  'address': response.replace('"', '').replace('"', ''), # Done twice because some languages only replace the first instance
2502
2697
  'tag': None,
2503
- 'network': networkCode,
2504
- 'info': response,
2505
2698
  }
2506
2699
 
2507
2700
  def parse_deposit_withdraw_fee(self, fee, currency: Currency = None):
@@ -2533,7 +2726,7 @@ class bitmex(Exchange, ImplicitAPI):
2533
2726
  #
2534
2727
  networks = self.safe_value(fee, 'networks', [])
2535
2728
  networksLength = len(networks)
2536
- result = {
2729
+ result: dict = {
2537
2730
  'info': fee,
2538
2731
  'withdraw': {
2539
2732
  'fee': None,
@@ -2567,7 +2760,9 @@ class bitmex(Exchange, ImplicitAPI):
2567
2760
  async def fetch_deposit_withdraw_fees(self, codes: Strings = None, params={}):
2568
2761
  """
2569
2762
  fetch deposit and withdraw fees
2570
- :see: https://www.bitmex.com/api/explorer/#not /Wallet/Wallet_getAssetsConfig
2763
+
2764
+ https://www.bitmex.com/api/explorer/#not /Wallet/Wallet_getAssetsConfig
2765
+
2571
2766
  :param str[]|None codes: list of unified currency codes
2572
2767
  :param dict [params]: extra parameters specific to the exchange API endpoint
2573
2768
  :returns dict: a list of `fee structures <https://docs.ccxt.com/#/?id=fee-structure>`
@@ -2618,7 +2813,9 @@ class bitmex(Exchange, ImplicitAPI):
2618
2813
  async def fetch_liquidations(self, symbol: str, since: Int = None, limit: Int = None, params={}):
2619
2814
  """
2620
2815
  retrieves the public liquidations of a trading pair
2621
- :see: https://www.bitmex.com/api/explorer/#not /Liquidation/Liquidation_get
2816
+
2817
+ https://www.bitmex.com/api/explorer/#not /Liquidation/Liquidation_get
2818
+
2622
2819
  :param str symbol: unified CCXT market symbol
2623
2820
  :param int [since]: the earliest time in ms to fetch liquidations for
2624
2821
  :param int [limit]: the maximum number of liquidation structures to retrieve
@@ -2633,7 +2830,7 @@ class bitmex(Exchange, ImplicitAPI):
2633
2830
  if paginate:
2634
2831
  return await self.fetch_paginated_call_dynamic('fetchLiquidations', symbol, since, limit, params)
2635
2832
  market = self.market(symbol)
2636
- request = {
2833
+ request: dict = {
2637
2834
  'symbol': market['id'],
2638
2835
  }
2639
2836
  if since is not None:
@@ -2678,7 +2875,7 @@ class bitmex(Exchange, ImplicitAPI):
2678
2875
  'datetime': None,
2679
2876
  })
2680
2877
 
2681
- def handle_errors(self, code, reason, url, method, headers, body, response, requestHeaders, requestBody):
2878
+ def handle_errors(self, code: int, reason: str, url: str, method: str, headers: dict, body: str, response, requestHeaders, requestBody):
2682
2879
  if response is None:
2683
2880
  return None
2684
2881
  if code == 429: