ccxt-ir 4.3.46.0.2__py2.py3-none-any.whl → 4.5.0__py2.py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (528) hide show
  1. ccxt/__init__.py +39 -35
  2. ccxt/abantether.py +9 -9
  3. ccxt/abstract/alpaca.py +4 -0
  4. ccxt/abstract/apex.py +31 -0
  5. ccxt/abstract/bigone.py +1 -1
  6. ccxt/abstract/binance.py +106 -48
  7. ccxt/abstract/binancecoinm.py +106 -48
  8. ccxt/abstract/binanceus.py +141 -83
  9. ccxt/abstract/binanceusdm.py +106 -48
  10. ccxt/abstract/bingx.py +50 -1
  11. ccxt/abstract/bitbank.py +5 -0
  12. ccxt/abstract/bitfinex.py +136 -65
  13. ccxt/abstract/bitflyer.py +1 -0
  14. ccxt/abstract/bitget.py +67 -0
  15. ccxt/abstract/bitmart.py +19 -1
  16. ccxt/abstract/bitopro.py +1 -0
  17. ccxt/abstract/bitrue.py +68 -68
  18. ccxt/abstract/bitstamp.py +1 -0
  19. ccxt/abstract/blofin.py +30 -0
  20. ccxt/abstract/btcbox.py +2 -0
  21. ccxt/abstract/bybit.py +28 -13
  22. ccxt/abstract/cex.py +28 -29
  23. ccxt/abstract/coinbaseexchange.py +1 -0
  24. ccxt/abstract/coinbaseinternational.py +1 -1
  25. ccxt/abstract/cryptocom.py +16 -0
  26. ccxt/abstract/cryptomus.py +20 -0
  27. ccxt/abstract/defx.py +69 -0
  28. ccxt/abstract/deribit.py +1 -0
  29. ccxt/abstract/derive.py +117 -0
  30. ccxt/abstract/digifinex.py +1 -0
  31. ccxt/abstract/ellipx.py +25 -0
  32. ccxt/abstract/foxbit.py +26 -0
  33. ccxt/abstract/gate.py +19 -0
  34. ccxt/abstract/gateio.py +19 -0
  35. ccxt/abstract/gemini.py +1 -0
  36. ccxt/abstract/hibachi.py +26 -0
  37. ccxt/abstract/hyperliquid.py +1 -1
  38. ccxt/abstract/independentreserve.py +6 -0
  39. ccxt/abstract/kraken.py +1 -0
  40. ccxt/abstract/krakenfutures.py +4 -0
  41. ccxt/abstract/kucoin.py +10 -0
  42. ccxt/abstract/kucoinfutures.py +18 -0
  43. ccxt/abstract/lbank.py +2 -1
  44. ccxt/abstract/luno.py +1 -0
  45. ccxt/abstract/mexc.py +2 -0
  46. ccxt/abstract/modetrade.py +119 -0
  47. ccxt/abstract/myokx.py +349 -0
  48. ccxt/abstract/oceanex.py +5 -0
  49. ccxt/abstract/okx.py +25 -0
  50. ccxt/abstract/okxus.py +349 -0
  51. ccxt/abstract/onetrading.py +0 -12
  52. ccxt/abstract/paradex.py +23 -0
  53. ccxt/abstract/phemex.py +2 -0
  54. ccxt/abstract/poloniex.py +36 -0
  55. ccxt/abstract/tradeogre.py +3 -1
  56. ccxt/abstract/upbit.py +51 -34
  57. ccxt/abstract/whitebit.py +16 -0
  58. ccxt/abstract/woo.py +64 -6
  59. ccxt/abstract/xt.py +10 -5
  60. ccxt/afratether.py +7 -7
  61. ccxt/alpaca.py +828 -51
  62. ccxt/apex.py +1875 -0
  63. ccxt/arzinja.py +7 -7
  64. ccxt/arzplus.py +9 -9
  65. ccxt/ascendex.py +501 -306
  66. ccxt/async_support/__init__.py +39 -35
  67. ccxt/async_support/abantether.py +10 -10
  68. ccxt/async_support/afratether.py +9 -9
  69. ccxt/async_support/alpaca.py +828 -51
  70. ccxt/async_support/apex.py +1875 -0
  71. ccxt/async_support/arzinja.py +10 -10
  72. ccxt/async_support/arzplus.py +12 -12
  73. ccxt/async_support/ascendex.py +502 -306
  74. ccxt/async_support/base/exchange.py +303 -89
  75. ccxt/async_support/base/ws/cache.py +9 -3
  76. ccxt/async_support/base/ws/client.py +173 -38
  77. ccxt/async_support/base/ws/future.py +25 -37
  78. ccxt/async_support/bequant.py +5 -3
  79. ccxt/async_support/bigone.py +279 -144
  80. ccxt/async_support/binance.py +2347 -1158
  81. ccxt/async_support/binancecoinm.py +9 -3
  82. ccxt/async_support/binanceus.py +17 -3
  83. ccxt/async_support/binanceusdm.py +9 -4
  84. ccxt/async_support/bingx.py +2962 -920
  85. ccxt/async_support/bit2c.py +147 -27
  86. ccxt/async_support/bitbank.py +151 -23
  87. ccxt/async_support/bitbns.py +104 -30
  88. ccxt/async_support/bitfinex.py +3291 -1113
  89. ccxt/async_support/bitflyer.py +202 -27
  90. ccxt/async_support/bitget.py +3683 -1538
  91. ccxt/async_support/bithumb.py +195 -38
  92. ccxt/async_support/bitimen.py +12 -12
  93. ccxt/async_support/bitir.py +38 -38
  94. ccxt/async_support/bitmart.py +1288 -350
  95. ccxt/async_support/bitmex.py +260 -75
  96. ccxt/async_support/bitopro.py +262 -62
  97. ccxt/async_support/bitpin.py +17 -16
  98. ccxt/async_support/bitrue.py +459 -290
  99. ccxt/async_support/bitso.py +199 -54
  100. ccxt/async_support/bitstamp.py +230 -96
  101. ccxt/async_support/bitteam.py +167 -25
  102. ccxt/async_support/{huobijp.py → bittrade.py} +158 -30
  103. ccxt/async_support/bitvavo.py +213 -49
  104. ccxt/async_support/blockchaincom.py +160 -46
  105. ccxt/async_support/blofin.py +502 -120
  106. ccxt/async_support/btcalpha.py +169 -31
  107. ccxt/async_support/btcbox.py +292 -23
  108. ccxt/async_support/btcmarkets.py +211 -58
  109. ccxt/async_support/btcturk.py +161 -38
  110. ccxt/async_support/bybit.py +1775 -1030
  111. ccxt/async_support/cex.py +1440 -1303
  112. ccxt/async_support/coinbase.py +724 -212
  113. ccxt/async_support/coinbaseadvanced.py +2 -1
  114. ccxt/async_support/coinbaseexchange.py +388 -89
  115. ccxt/async_support/coinbaseinternational.py +412 -57
  116. ccxt/async_support/coincatch.py +177 -78
  117. ccxt/async_support/coincheck.py +135 -19
  118. ccxt/async_support/coinex.py +606 -232
  119. ccxt/async_support/coinmate.py +189 -63
  120. ccxt/async_support/coinmetro.py +195 -54
  121. ccxt/async_support/coinone.py +158 -51
  122. ccxt/async_support/coinsph.py +336 -61
  123. ccxt/async_support/coinspot.py +151 -52
  124. ccxt/async_support/cryptocom.py +661 -111
  125. ccxt/async_support/cryptomus.py +1137 -0
  126. ccxt/async_support/defx.py +2071 -0
  127. ccxt/async_support/delta.py +299 -99
  128. ccxt/async_support/deribit.py +348 -126
  129. ccxt/async_support/derive.py +2572 -0
  130. ccxt/async_support/digifinex.py +430 -214
  131. ccxt/async_support/ellipx.py +2029 -0
  132. ccxt/async_support/eterex.py +10 -10
  133. ccxt/async_support/excoino.py +31 -31
  134. ccxt/async_support/exir.py +14 -14
  135. ccxt/async_support/exmo.py +344 -131
  136. ccxt/async_support/exnovin.py +10 -10
  137. ccxt/async_support/farhadexchange.py +12 -12
  138. ccxt/async_support/fmfwio.py +2 -1
  139. ccxt/async_support/foxbit.py +1935 -0
  140. ccxt/async_support/gate.py +1351 -529
  141. ccxt/async_support/gateio.py +2 -1
  142. ccxt/async_support/gemini.py +144 -39
  143. ccxt/async_support/hashkey.py +152 -109
  144. ccxt/async_support/hibachi.py +2080 -0
  145. ccxt/async_support/hitbtc.py +395 -167
  146. ccxt/async_support/hitobit.py +12 -12
  147. ccxt/async_support/hollaex.py +307 -119
  148. ccxt/async_support/htx.py +851 -383
  149. ccxt/async_support/huobi.py +2 -1
  150. ccxt/async_support/hyperliquid.py +1848 -536
  151. ccxt/async_support/independentreserve.py +288 -15
  152. ccxt/async_support/indodax.py +190 -33
  153. ccxt/async_support/jibitex.py +12 -12
  154. ccxt/async_support/kraken.py +795 -351
  155. ccxt/async_support/krakenfutures.py +214 -62
  156. ccxt/async_support/kucoin.py +715 -396
  157. ccxt/async_support/kucoinfutures.py +652 -89
  158. ccxt/async_support/latoken.py +217 -113
  159. ccxt/async_support/lbank.py +425 -97
  160. ccxt/async_support/luno.py +382 -35
  161. ccxt/async_support/mercado.py +113 -6
  162. ccxt/async_support/mexc.py +874 -437
  163. ccxt/async_support/modetrade.py +2818 -0
  164. ccxt/async_support/myokx.py +54 -0
  165. ccxt/async_support/ndax.py +221 -64
  166. ccxt/async_support/nobitex.py +31 -37
  167. ccxt/async_support/novadax.py +190 -34
  168. ccxt/async_support/oceanex.py +217 -28
  169. ccxt/async_support/okcoin.py +253 -145
  170. ccxt/async_support/okexchange.py +11 -11
  171. ccxt/async_support/okx.py +1088 -351
  172. ccxt/async_support/okxus.py +54 -0
  173. ccxt/async_support/ompfinex.py +25 -24
  174. ccxt/async_support/onetrading.py +213 -392
  175. ccxt/async_support/oxfun.py +245 -166
  176. ccxt/async_support/p2b.py +151 -29
  177. ccxt/async_support/paradex.py +562 -49
  178. ccxt/async_support/paymium.py +82 -19
  179. ccxt/async_support/phemex.py +713 -172
  180. ccxt/async_support/poloniex.py +1602 -283
  181. ccxt/async_support/probit.py +224 -95
  182. ccxt/async_support/ramzinex.py +30 -27
  183. ccxt/async_support/sarmayex.py +9 -9
  184. ccxt/async_support/sarrafex.py +13 -13
  185. ccxt/async_support/tabdeal.py +14 -13
  186. ccxt/async_support/tetherland.py +9 -9
  187. ccxt/async_support/timex.py +210 -51
  188. ccxt/async_support/tokocrypto.py +167 -47
  189. ccxt/async_support/tradeogre.py +266 -31
  190. ccxt/async_support/twox.py +9 -9
  191. ccxt/async_support/ubitex.py +12 -12
  192. ccxt/async_support/upbit.py +568 -165
  193. ccxt/async_support/vertex.py +160 -32
  194. ccxt/async_support/wallex.py +12 -12
  195. ccxt/async_support/wavesexchange.py +165 -30
  196. ccxt/async_support/whitebit.py +975 -127
  197. ccxt/async_support/woo.py +1918 -1016
  198. ccxt/async_support/woofipro.py +433 -141
  199. ccxt/async_support/xt.py +649 -193
  200. ccxt/async_support/yobit.py +195 -70
  201. ccxt/async_support/zaif.py +91 -15
  202. ccxt/async_support/zonda.py +151 -36
  203. ccxt/base/decimal_to_precision.py +14 -10
  204. ccxt/base/errors.py +49 -18
  205. ccxt/base/exchange.py +1556 -450
  206. ccxt/base/precise.py +10 -0
  207. ccxt/base/types.py +114 -6
  208. ccxt/bequant.py +5 -3
  209. ccxt/bigone.py +279 -144
  210. ccxt/binance.py +2347 -1158
  211. ccxt/binancecoinm.py +9 -3
  212. ccxt/binanceus.py +17 -3
  213. ccxt/binanceusdm.py +9 -4
  214. ccxt/bingx.py +2962 -920
  215. ccxt/bit2c.py +147 -27
  216. ccxt/bitbank.py +151 -23
  217. ccxt/bitbns.py +104 -30
  218. ccxt/bitfinex.py +3290 -1113
  219. ccxt/bitflyer.py +202 -27
  220. ccxt/bitget.py +3683 -1538
  221. ccxt/bithumb.py +194 -38
  222. ccxt/bitimen.py +9 -9
  223. ccxt/bitir.py +35 -35
  224. ccxt/bitmart.py +1288 -350
  225. ccxt/bitmex.py +260 -75
  226. ccxt/bitopro.py +262 -62
  227. ccxt/bitpin.py +15 -14
  228. ccxt/bitrue.py +459 -290
  229. ccxt/bitso.py +199 -54
  230. ccxt/bitstamp.py +230 -96
  231. ccxt/bitteam.py +167 -25
  232. ccxt/{huobijp.py → bittrade.py} +158 -30
  233. ccxt/bitvavo.py +213 -49
  234. ccxt/blockchaincom.py +160 -46
  235. ccxt/blofin.py +502 -120
  236. ccxt/btcalpha.py +169 -31
  237. ccxt/btcbox.py +291 -23
  238. ccxt/btcmarkets.py +211 -58
  239. ccxt/btcturk.py +161 -38
  240. ccxt/bybit.py +1775 -1030
  241. ccxt/cex.py +1439 -1303
  242. ccxt/coinbase.py +724 -212
  243. ccxt/coinbaseadvanced.py +2 -1
  244. ccxt/coinbaseexchange.py +388 -89
  245. ccxt/coinbaseinternational.py +412 -57
  246. ccxt/coincatch.py +177 -78
  247. ccxt/coincheck.py +135 -19
  248. ccxt/coinex.py +606 -232
  249. ccxt/coinmate.py +189 -63
  250. ccxt/coinmetro.py +194 -54
  251. ccxt/coinone.py +158 -51
  252. ccxt/coinsph.py +336 -61
  253. ccxt/coinspot.py +151 -52
  254. ccxt/cryptocom.py +661 -111
  255. ccxt/cryptomus.py +1137 -0
  256. ccxt/defx.py +2070 -0
  257. ccxt/delta.py +299 -99
  258. ccxt/deribit.py +348 -126
  259. ccxt/derive.py +2571 -0
  260. ccxt/digifinex.py +430 -214
  261. ccxt/ellipx.py +2029 -0
  262. ccxt/eterex.py +7 -7
  263. ccxt/excoino.py +29 -29
  264. ccxt/exir.py +11 -11
  265. ccxt/exmo.py +343 -131
  266. ccxt/exnovin.py +8 -8
  267. ccxt/farhadexchange.py +10 -10
  268. ccxt/fmfwio.py +2 -1
  269. ccxt/foxbit.py +1935 -0
  270. ccxt/gate.py +1351 -529
  271. ccxt/gateio.py +2 -1
  272. ccxt/gemini.py +144 -39
  273. ccxt/hashkey.py +152 -109
  274. ccxt/hibachi.py +2079 -0
  275. ccxt/hitbtc.py +395 -167
  276. ccxt/hitobit.py +9 -9
  277. ccxt/hollaex.py +307 -119
  278. ccxt/htx.py +851 -383
  279. ccxt/huobi.py +2 -1
  280. ccxt/hyperliquid.py +1848 -536
  281. ccxt/independentreserve.py +287 -15
  282. ccxt/indodax.py +190 -33
  283. ccxt/jibitex.py +9 -9
  284. ccxt/kraken.py +794 -351
  285. ccxt/krakenfutures.py +214 -62
  286. ccxt/kucoin.py +715 -396
  287. ccxt/kucoinfutures.py +652 -89
  288. ccxt/latoken.py +217 -113
  289. ccxt/lbank.py +425 -97
  290. ccxt/luno.py +382 -35
  291. ccxt/mercado.py +113 -6
  292. ccxt/mexc.py +873 -437
  293. ccxt/modetrade.py +2818 -0
  294. ccxt/myokx.py +54 -0
  295. ccxt/ndax.py +221 -64
  296. ccxt/nobitex.py +29 -35
  297. ccxt/novadax.py +190 -34
  298. ccxt/oceanex.py +217 -28
  299. ccxt/okcoin.py +253 -145
  300. ccxt/okexchange.py +9 -9
  301. ccxt/okx.py +1088 -351
  302. ccxt/okxus.py +54 -0
  303. ccxt/ompfinex.py +22 -21
  304. ccxt/onetrading.py +213 -392
  305. ccxt/oxfun.py +245 -166
  306. ccxt/p2b.py +151 -29
  307. ccxt/paradex.py +562 -49
  308. ccxt/paymium.py +82 -19
  309. ccxt/phemex.py +712 -172
  310. ccxt/poloniex.py +1601 -283
  311. ccxt/pro/__init__.py +76 -17
  312. ccxt/pro/alpaca.py +21 -6
  313. ccxt/pro/apex.py +984 -0
  314. ccxt/pro/ascendex.py +58 -10
  315. ccxt/pro/bequant.py +6 -1
  316. ccxt/pro/binance.py +728 -156
  317. ccxt/pro/binancecoinm.py +6 -2
  318. ccxt/pro/binanceus.py +8 -4
  319. ccxt/pro/binanceusdm.py +7 -2
  320. ccxt/pro/bingx.py +333 -142
  321. ccxt/pro/bitfinex.py +727 -262
  322. ccxt/pro/bitget.py +570 -79
  323. ccxt/pro/bithumb.py +20 -6
  324. ccxt/pro/bitmart.py +216 -87
  325. ccxt/pro/bitmex.py +47 -9
  326. ccxt/pro/bitopro.py +26 -14
  327. ccxt/pro/bitrue.py +22 -22
  328. ccxt/pro/bitstamp.py +54 -21
  329. ccxt/pro/{huobijp.py → bittrade.py} +7 -6
  330. ccxt/pro/bitvavo.py +191 -67
  331. ccxt/pro/blockchaincom.py +21 -8
  332. ccxt/pro/blofin.py +9 -1
  333. ccxt/pro/bybit.py +632 -245
  334. ccxt/pro/cex.py +59 -24
  335. ccxt/pro/coinbase.py +102 -73
  336. ccxt/pro/coinbaseadvanced.py +2 -1
  337. ccxt/pro/coinbaseexchange.py +8 -8
  338. ccxt/pro/coinbaseinternational.py +181 -25
  339. ccxt/pro/coincatch.py +6 -7
  340. ccxt/pro/coincheck.py +11 -6
  341. ccxt/pro/coinex.py +967 -665
  342. ccxt/pro/coinone.py +16 -9
  343. ccxt/pro/cryptocom.py +448 -45
  344. ccxt/pro/defx.py +831 -0
  345. ccxt/pro/deribit.py +150 -14
  346. ccxt/pro/derive.py +704 -0
  347. ccxt/pro/exmo.py +239 -6
  348. ccxt/pro/gate.py +623 -65
  349. ccxt/pro/gateio.py +2 -1
  350. ccxt/pro/gemini.py +27 -11
  351. ccxt/pro/hashkey.py +2 -2
  352. ccxt/pro/hitbtc.py +196 -91
  353. ccxt/pro/hollaex.py +23 -7
  354. ccxt/pro/htx.py +51 -14
  355. ccxt/pro/huobi.py +2 -1
  356. ccxt/pro/hyperliquid.py +591 -27
  357. ccxt/pro/independentreserve.py +9 -6
  358. ccxt/pro/kraken.py +640 -320
  359. ccxt/pro/krakenfutures.py +62 -35
  360. ccxt/pro/kucoin.py +267 -46
  361. ccxt/pro/kucoinfutures.py +165 -21
  362. ccxt/pro/lbank.py +102 -21
  363. ccxt/pro/luno.py +12 -8
  364. ccxt/pro/mexc.py +877 -111
  365. ccxt/pro/modetrade.py +1271 -0
  366. ccxt/pro/myokx.py +38 -0
  367. ccxt/pro/ndax.py +15 -2
  368. ccxt/pro/okcoin.py +23 -4
  369. ccxt/pro/okx.py +573 -98
  370. ccxt/pro/okxus.py +38 -0
  371. ccxt/pro/onetrading.py +30 -13
  372. ccxt/pro/oxfun.py +131 -27
  373. ccxt/pro/p2b.py +88 -22
  374. ccxt/pro/paradex.py +3 -3
  375. ccxt/pro/phemex.py +75 -21
  376. ccxt/pro/poloniex.py +124 -41
  377. ccxt/pro/probit.py +87 -80
  378. ccxt/pro/tradeogre.py +272 -0
  379. ccxt/pro/upbit.py +152 -12
  380. ccxt/pro/vertex.py +8 -3
  381. ccxt/pro/whitebit.py +58 -5
  382. ccxt/pro/woo.py +228 -37
  383. ccxt/pro/woofipro.py +106 -18
  384. ccxt/pro/xt.py +111 -5
  385. ccxt/probit.py +224 -95
  386. ccxt/protobuf/__init__.py +0 -0
  387. ccxt/protobuf/mexc/PrivateAccountV3Api_pb2.py +37 -0
  388. ccxt/protobuf/mexc/PrivateDealsV3Api_pb2.py +37 -0
  389. ccxt/protobuf/mexc/PrivateOrdersV3Api_pb2.py +37 -0
  390. ccxt/protobuf/mexc/PublicAggreBookTickerV3Api_pb2.py +37 -0
  391. ccxt/protobuf/mexc/PublicAggreDealsV3Api_pb2.py +39 -0
  392. ccxt/protobuf/mexc/PublicAggreDepthsV3Api_pb2.py +39 -0
  393. ccxt/protobuf/mexc/PublicBookTickerBatchV3Api_pb2.py +38 -0
  394. ccxt/protobuf/mexc/PublicBookTickerV3Api_pb2.py +37 -0
  395. ccxt/protobuf/mexc/PublicDealsV3Api_pb2.py +39 -0
  396. ccxt/protobuf/mexc/PublicIncreaseDepthsBatchV3Api_pb2.py +38 -0
  397. ccxt/protobuf/mexc/PublicIncreaseDepthsV3Api_pb2.py +39 -0
  398. ccxt/protobuf/mexc/PublicLimitDepthsV3Api_pb2.py +39 -0
  399. ccxt/protobuf/mexc/PublicMiniTickerV3Api_pb2.py +37 -0
  400. ccxt/protobuf/mexc/PublicMiniTickersV3Api_pb2.py +38 -0
  401. ccxt/protobuf/mexc/PublicSpotKlineV3Api_pb2.py +37 -0
  402. ccxt/protobuf/mexc/PushDataV3ApiWrapper_pb2.py +52 -0
  403. ccxt/protobuf/mexc/__init__.py +0 -0
  404. ccxt/ramzinex.py +28 -25
  405. ccxt/sarmayex.py +7 -7
  406. ccxt/sarrafex.py +10 -10
  407. ccxt/static_dependencies/__init__.py +1 -1
  408. ccxt/static_dependencies/lark/py.typed +0 -0
  409. ccxt/static_dependencies/marshmallow/py.typed +0 -0
  410. ccxt/static_dependencies/marshmallow_dataclass/py.typed +0 -0
  411. ccxt/static_dependencies/marshmallow_oneofschema/py.typed +0 -0
  412. ccxt/tabdeal.py +12 -11
  413. ccxt/test/tests_async.py +261 -57
  414. ccxt/test/tests_helpers.py +1 -3
  415. ccxt/test/tests_init.py +4 -3
  416. ccxt/test/tests_sync.py +261 -57
  417. ccxt/tetherland.py +7 -7
  418. ccxt/timex.py +210 -51
  419. ccxt/tokocrypto.py +167 -47
  420. ccxt/tradeogre.py +266 -31
  421. ccxt/twox.py +7 -7
  422. ccxt/ubitex.py +9 -9
  423. ccxt/upbit.py +568 -165
  424. ccxt/vertex.py +160 -32
  425. ccxt/wallex.py +9 -9
  426. ccxt/wavesexchange.py +165 -30
  427. ccxt/whitebit.py +975 -127
  428. ccxt/woo.py +1917 -1016
  429. ccxt/woofipro.py +432 -141
  430. ccxt/xt.py +649 -193
  431. ccxt/yobit.py +194 -70
  432. ccxt/zaif.py +91 -15
  433. ccxt/zonda.py +151 -36
  434. {ccxt_ir-4.3.46.0.2.dist-info → ccxt_ir-4.5.0.dist-info}/METADATA +225 -73
  435. ccxt_ir-4.5.0.dist-info/RECORD +743 -0
  436. {ccxt_ir-4.3.46.0.2.dist-info → ccxt_ir-4.5.0.dist-info}/WHEEL +1 -1
  437. ccxt/abstract/ace.py +0 -15
  438. ccxt/abstract/bitbay.py +0 -53
  439. ccxt/abstract/bitcoincom.py +0 -115
  440. ccxt/abstract/bitfinex2.py +0 -139
  441. ccxt/abstract/bitpanda.py +0 -35
  442. ccxt/abstract/bl3p.py +0 -19
  443. ccxt/abstract/coinlist.py +0 -54
  444. ccxt/abstract/currencycom.py +0 -68
  445. ccxt/abstract/hitbtc3.py +0 -115
  446. ccxt/abstract/idex.py +0 -26
  447. ccxt/abstract/kuna.py +0 -182
  448. ccxt/abstract/lykke.py +0 -29
  449. ccxt/abstract/poloniexfutures.py +0 -48
  450. ccxt/abstract/wazirx.py +0 -30
  451. ccxt/ace.py +0 -1012
  452. ccxt/async_support/ace.py +0 -1012
  453. ccxt/async_support/base/ws/aiohttp_client.py +0 -125
  454. ccxt/async_support/base/ws/fast_client.py +0 -96
  455. ccxt/async_support/bitbay.py +0 -17
  456. ccxt/async_support/bitcoincom.py +0 -17
  457. ccxt/async_support/bitfinex2.py +0 -3552
  458. ccxt/async_support/bitpanda.py +0 -16
  459. ccxt/async_support/bl3p.py +0 -485
  460. ccxt/async_support/coinlist.py +0 -2243
  461. ccxt/async_support/currencycom.py +0 -1950
  462. ccxt/async_support/hitbtc3.py +0 -16
  463. ccxt/async_support/idex.py +0 -1766
  464. ccxt/async_support/kuna.py +0 -1841
  465. ccxt/async_support/lykke.py +0 -1270
  466. ccxt/async_support/poloniexfutures.py +0 -1717
  467. ccxt/async_support/wazirx.py +0 -1224
  468. ccxt/bitbay.py +0 -17
  469. ccxt/bitcoincom.py +0 -17
  470. ccxt/bitfinex2.py +0 -3552
  471. ccxt/bitpanda.py +0 -16
  472. ccxt/bl3p.py +0 -485
  473. ccxt/coinlist.py +0 -2243
  474. ccxt/currencycom.py +0 -1950
  475. ccxt/hitbtc3.py +0 -16
  476. ccxt/idex.py +0 -1766
  477. ccxt/kuna.py +0 -1841
  478. ccxt/lykke.py +0 -1270
  479. ccxt/poloniexfutures.py +0 -1717
  480. ccxt/pro/bitcoincom.py +0 -34
  481. ccxt/pro/bitfinex2.py +0 -1083
  482. ccxt/pro/bitpanda.py +0 -15
  483. ccxt/pro/currencycom.py +0 -536
  484. ccxt/pro/idex.py +0 -672
  485. ccxt/pro/poloniexfutures.py +0 -990
  486. ccxt/pro/wazirx.py +0 -749
  487. ccxt/test/base/__init__.py +0 -29
  488. ccxt/test/base/test_account.py +0 -26
  489. ccxt/test/base/test_balance.py +0 -56
  490. ccxt/test/base/test_borrow_interest.py +0 -35
  491. ccxt/test/base/test_borrow_rate.py +0 -32
  492. ccxt/test/base/test_calculate_fee.py +0 -51
  493. ccxt/test/base/test_crypto.py +0 -127
  494. ccxt/test/base/test_currency.py +0 -76
  495. ccxt/test/base/test_datetime.py +0 -109
  496. ccxt/test/base/test_decimal_to_precision.py +0 -392
  497. ccxt/test/base/test_deep_extend.py +0 -68
  498. ccxt/test/base/test_deposit_withdrawal.py +0 -50
  499. ccxt/test/base/test_exchange_datetime_functions.py +0 -76
  500. ccxt/test/base/test_funding_rate_history.py +0 -29
  501. ccxt/test/base/test_last_price.py +0 -31
  502. ccxt/test/base/test_ledger_entry.py +0 -45
  503. ccxt/test/base/test_ledger_item.py +0 -48
  504. ccxt/test/base/test_leverage_tier.py +0 -33
  505. ccxt/test/base/test_liquidation.py +0 -50
  506. ccxt/test/base/test_margin_mode.py +0 -24
  507. ccxt/test/base/test_margin_modification.py +0 -35
  508. ccxt/test/base/test_market.py +0 -193
  509. ccxt/test/base/test_number.py +0 -411
  510. ccxt/test/base/test_ohlcv.py +0 -33
  511. ccxt/test/base/test_open_interest.py +0 -32
  512. ccxt/test/base/test_order.py +0 -64
  513. ccxt/test/base/test_order_book.py +0 -69
  514. ccxt/test/base/test_position.py +0 -60
  515. ccxt/test/base/test_shared_methods.py +0 -353
  516. ccxt/test/base/test_status.py +0 -24
  517. ccxt/test/base/test_throttle.py +0 -126
  518. ccxt/test/base/test_ticker.py +0 -92
  519. ccxt/test/base/test_trade.py +0 -47
  520. ccxt/test/base/test_trading_fee.py +0 -26
  521. ccxt/test/base/test_transaction.py +0 -39
  522. ccxt/test/test_async.py +0 -1649
  523. ccxt/test/test_sync.py +0 -1648
  524. ccxt/wazirx.py +0 -1224
  525. ccxt_ir-4.3.46.0.2.dist-info/RECORD +0 -772
  526. /ccxt/abstract/{huobijp.py → bittrade.py} +0 -0
  527. {ccxt_ir-4.3.46.0.2.dist-info → ccxt_ir-4.5.0.dist-info/licenses}/LICENSE.txt +0 -0
  528. {ccxt_ir-4.3.46.0.2.dist-info → ccxt_ir-4.5.0.dist-info}/top_level.txt +0 -0
@@ -5,7 +5,7 @@
5
5
 
6
6
  from ccxt.async_support.base.exchange import Exchange
7
7
  from ccxt.abstract.paradex import ImplicitAPI
8
- from ccxt.base.types import Balances, Currency, Int, Market, Num, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, Transaction
8
+ from ccxt.base.types import Any, Balances, Currency, Greeks, Int, Leverage, MarginMode, Market, Num, Order, OrderBook, OrderSide, OrderType, Position, Str, Strings, Ticker, Tickers, Trade, Transaction
9
9
  from typing import List
10
10
  from ccxt.base.errors import ExchangeError
11
11
  from ccxt.base.errors import AuthenticationError
@@ -20,7 +20,7 @@ from ccxt.base.precise import Precise
20
20
 
21
21
  class paradex(Exchange, ImplicitAPI):
22
22
 
23
- def describe(self):
23
+ def describe(self) -> Any:
24
24
  return self.deep_extend(super(paradex, self).describe(), {
25
25
  'id': 'paradex',
26
26
  'name': 'Paradex',
@@ -53,8 +53,11 @@ class paradex(Exchange, ImplicitAPI):
53
53
  'createOrder': True,
54
54
  'createOrders': False,
55
55
  'createReduceOnlyOrder': False,
56
+ 'createStopOrder': True,
57
+ 'createTriggerOrder': True,
56
58
  'editOrder': False,
57
59
  'fetchAccounts': False,
60
+ 'fetchAllGreeks': True,
58
61
  'fetchBalance': True,
59
62
  'fetchBorrowInterest': False,
60
63
  'fetchBorrowRateHistories': False,
@@ -73,14 +76,15 @@ class paradex(Exchange, ImplicitAPI):
73
76
  'fetchFundingRate': False,
74
77
  'fetchFundingRateHistory': False,
75
78
  'fetchFundingRates': False,
79
+ 'fetchGreeks': True,
76
80
  'fetchIndexOHLCV': False,
77
81
  'fetchIsolatedBorrowRate': False,
78
82
  'fetchIsolatedBorrowRates': False,
79
83
  'fetchLedger': False,
80
- 'fetchLeverage': False,
84
+ 'fetchLeverage': True,
81
85
  'fetchLeverageTiers': False,
82
86
  'fetchLiquidations': True,
83
- 'fetchMarginMode': None,
87
+ 'fetchMarginMode': True,
84
88
  'fetchMarketLeverageTiers': False,
85
89
  'fetchMarkets': True,
86
90
  'fetchMarkOHLCV': False,
@@ -114,8 +118,8 @@ class paradex(Exchange, ImplicitAPI):
114
118
  'repayCrossMargin': False,
115
119
  'repayIsolatedMargin': False,
116
120
  'sandbox': True,
117
- 'setLeverage': False,
118
- 'setMarginMode': False,
121
+ 'setLeverage': True,
122
+ 'setMarginMode': True,
119
123
  'setPositionMode': False,
120
124
  'transfer': False,
121
125
  'withdraw': False,
@@ -157,12 +161,23 @@ class paradex(Exchange, ImplicitAPI):
157
161
  'system/state': 1,
158
162
  'system/time': 1,
159
163
  'trades': 1,
164
+ 'vaults': 1,
165
+ 'vaults/balance': 1,
166
+ 'vaults/config': 1,
167
+ 'vaults/history': 1,
168
+ 'vaults/positions': 1,
169
+ 'vaults/summary': 1,
170
+ 'vaults/transfers': 1,
160
171
  },
161
172
  },
162
173
  'private': {
163
174
  'get': {
164
175
  'account': 1,
176
+ 'account/info': 1,
177
+ 'account/history': 1,
178
+ 'account/margin': 1,
165
179
  'account/profile': 1,
180
+ 'account/subaccounts': 1,
166
181
  'balance': 1,
167
182
  'fills': 1,
168
183
  'funding/payments': 1,
@@ -175,20 +190,34 @@ class paradex(Exchange, ImplicitAPI):
175
190
  'orders/by_client_id/{client_id}': 1,
176
191
  'orders/{order_id}': 1,
177
192
  'points_data/{market}/{program}': 1,
193
+ 'referrals/qr-code': 1,
178
194
  'referrals/summary': 1,
179
195
  'transfers': 1,
196
+ 'algo/orders': 1,
197
+ 'algo/orders-history': 1,
198
+ 'algo/orders/{algo_id}': 1,
199
+ 'vaults/account-summary': 1,
180
200
  },
181
201
  'post': {
202
+ 'account/margin/{market}': 1,
203
+ 'account/profile/max_slippage': 1,
182
204
  'account/profile/referral_code': 1,
183
205
  'account/profile/username': 1,
184
206
  'auth': 1,
185
207
  'onboarding': 1,
186
208
  'orders': 1,
209
+ 'orders/batch': 1,
210
+ 'algo/orders': 1,
211
+ 'vaults': 1,
212
+ },
213
+ 'put': {
214
+ 'orders/{order_id}': 1,
187
215
  },
188
216
  'delete': {
189
217
  'orders': 1,
190
218
  'orders/by_client_id/{client_id}': 1,
191
219
  'orders/{order_id}': 1,
220
+ 'algo/orders/{algo_id}': 1,
192
221
  },
193
222
  },
194
223
  },
@@ -268,17 +297,91 @@ class paradex(Exchange, ImplicitAPI):
268
297
  '40112': PermissionDenied, # Geo IP blocked
269
298
  },
270
299
  'broad': {
300
+ 'missing or malformed jwt': AuthenticationError,
271
301
  },
272
302
  },
273
303
  'precisionMode': TICK_SIZE,
274
304
  'commonCurrencies': {
275
305
  },
276
306
  'options': {
307
+ 'paradexAccount': None, # add {"privateKey": A, "publicKey": B, "address": C}
277
308
  'broker': 'CCXT',
278
309
  },
310
+ 'features': {
311
+ 'spot': None,
312
+ 'forSwap': {
313
+ 'sandbox': True,
314
+ 'createOrder': {
315
+ 'marginMode': False,
316
+ 'triggerPrice': True,
317
+ 'triggerDirection': True, # todo
318
+ 'triggerPriceType': None,
319
+ 'stopLossPrice': False, # todo
320
+ 'takeProfitPrice': False, # todo
321
+ 'attachedStopLossTakeProfit': None,
322
+ 'timeInForce': {
323
+ 'IOC': True,
324
+ 'FOK': False,
325
+ 'PO': True,
326
+ 'GTD': False,
327
+ },
328
+ 'hedged': False,
329
+ 'trailing': False,
330
+ 'leverage': False,
331
+ 'marketBuyByCost': False,
332
+ 'marketBuyRequiresPrice': False,
333
+ 'selfTradePrevention': True, # todo
334
+ 'iceberg': False,
335
+ },
336
+ 'createOrders': None, # todo
337
+ 'fetchMyTrades': {
338
+ 'marginMode': False,
339
+ 'limit': 100, # todo
340
+ 'daysBack': 100000, # todo
341
+ 'untilDays': 100000, # todo
342
+ 'symbolRequired': False,
343
+ },
344
+ 'fetchOrder': {
345
+ 'marginMode': False,
346
+ 'trigger': False,
347
+ 'trailing': False,
348
+ 'symbolRequired': False,
349
+ },
350
+ 'fetchOpenOrders': {
351
+ 'marginMode': False,
352
+ 'limit': 100, # todo
353
+ 'trigger': False,
354
+ 'trailing': False,
355
+ 'symbolRequired': False,
356
+ },
357
+ 'fetchOrders': {
358
+ 'marginMode': False,
359
+ 'limit': 100,
360
+ 'daysBack': 100000, # todo
361
+ 'untilDays': 100000, # todo
362
+ 'trigger': False,
363
+ 'trailing': False,
364
+ 'symbolRequired': False,
365
+ },
366
+ 'fetchClosedOrders': None, # todo
367
+ 'fetchOHLCV': {
368
+ 'limit': None, # todo by from/to
369
+ },
370
+ },
371
+ 'swap': {
372
+ 'linear': {
373
+ 'extends': 'forSwap',
374
+ },
375
+ 'inverse': None,
376
+ },
377
+ 'future': {
378
+ 'linear': None,
379
+ 'inverse': None,
380
+ },
381
+ },
279
382
  })
280
383
 
281
- async def fetch_time(self, params={}):
384
+ async def fetch_time(self, params={}) -> Int:
282
385
  """
283
386
  fetches the current integer timestamp in milliseconds from the exchange server
284
387
 
@@ -395,6 +498,57 @@ class paradex(Exchange, ImplicitAPI):
395
498
  # "max_tob_spread": "0.2"
396
499
  # }
397
500
  #
501
+ # {
502
+ # "symbol":"BTC-USD-96000-C",
503
+ # "base_currency":"BTC",
504
+ # "quote_currency":"USD",
505
+ # "settlement_currency":"USDC",
506
+ # "order_size_increment":"0.001",
507
+ # "price_tick_size":"0.01",
508
+ # "min_notional":"100",
509
+ # "open_at":"1736764200000",
510
+ # "expiry_at":"0",
511
+ # "asset_kind":"PERP_OPTION",
512
+ # "market_kind":"cross",
513
+ # "position_limit":"10",
514
+ # "price_bands_width":"0.05",
515
+ # "iv_bands_width":"0.05",
516
+ # "max_open_orders":"100",
517
+ # "max_funding_rate":"0.02",
518
+ # "option_cross_margin_params":{
519
+ # "imf":{
520
+ # "long_itm":"0.2",
521
+ # "short_itm":"0.15",
522
+ # "short_otm":"0.1",
523
+ # "short_put_cap":"0.5",
524
+ # "premium_multiplier":"1"
525
+ # },
526
+ # "mmf":{
527
+ # "long_itm":"0.1",
528
+ # "short_itm":"0.075",
529
+ # "short_otm":"0.05",
530
+ # "short_put_cap":"0.5",
531
+ # "premium_multiplier":"0.5"
532
+ # }
533
+ # },
534
+ # "price_feed_id":"GVXRSBjFk6e6J3NbVPXohDJetcTjaeeuykUpbQF8UoMU",
535
+ # "oracle_ewma_factor":"0.20000046249626113",
536
+ # "max_order_size":"2",
537
+ # "max_funding_rate_change":"0.02",
538
+ # "max_tob_spread":"0.2",
539
+ # "interest_rate":"0.0001",
540
+ # "clamp_rate":"0.02",
541
+ # "option_type":"CALL",
542
+ # "strike_price":"96000",
543
+ # "funding_period_hours":"24",
544
+ # "tags":[
545
+ # ]
546
+ # }
547
+ #
548
+ assetKind = self.safe_string(market, 'asset_kind')
549
+ isOption = (assetKind == 'PERP_OPTION')
550
+ type = 'option' if (isOption) else 'swap'
551
+ isSwap = (type == 'swap')
398
552
  marketId = self.safe_string(market, 'symbol')
399
553
  quoteId = self.safe_string(market, 'quote_currency')
400
554
  baseId = self.safe_string(market, 'base_currency')
@@ -404,8 +558,16 @@ class paradex(Exchange, ImplicitAPI):
404
558
  settle = self.safe_currency_code(settleId)
405
559
  symbol = base + '/' + quote + ':' + settle
406
560
  expiry = self.safe_integer(market, 'expiry_at')
561
+ optionType = self.safe_string(market, 'option_type')
562
+ strikePrice = self.safe_string(market, 'strike_price')
407
563
  takerFee = self.parse_number('0.0003')
408
564
  makerFee = self.parse_number('-0.00005')
565
+ if isOption:
566
+ optionTypeSuffix = 'C' if (optionType == 'CALL') else 'P'
567
+ symbol = symbol + '-' + strikePrice + '-' + optionTypeSuffix
568
+ makerFee = self.parse_number('0.0003')
569
+ else:
570
+ expiry = None
409
571
  return self.safe_market_structure({
410
572
  'id': marketId,
411
573
  'symbol': symbol,
@@ -415,23 +577,23 @@ class paradex(Exchange, ImplicitAPI):
415
577
  'baseId': baseId,
416
578
  'quoteId': quoteId,
417
579
  'settleId': settleId,
418
- 'type': 'swap',
580
+ 'type': type,
419
581
  'spot': False,
420
582
  'margin': None,
421
- 'swap': True,
583
+ 'swap': isSwap,
422
584
  'future': False,
423
- 'option': False,
585
+ 'option': isOption,
424
586
  'active': self.safe_bool(market, 'enableTrading'),
425
587
  'contract': True,
426
588
  'linear': True,
427
- 'inverse': None,
589
+ 'inverse': False,
428
590
  'taker': takerFee,
429
591
  'maker': makerFee,
430
592
  'contractSize': self.parse_number('1'),
431
- 'expiry': None if (expiry == 0) else expiry,
593
+ 'expiry': expiry,
432
594
  'expiryDatetime': None if (expiry == 0) else self.iso8601(expiry),
433
- 'strike': None,
434
- 'optionType': None,
595
+ 'strike': self.parse_number(strikePrice),
596
+ 'optionType': self.safe_string_lower(market, 'option_type'),
435
597
  'precision': {
436
598
  'amount': self.safe_number(market, 'order_size_increment'),
437
599
  'price': self.safe_number(market, 'price_tick_size'),
@@ -544,14 +706,9 @@ class paradex(Exchange, ImplicitAPI):
544
706
  """
545
707
  await self.load_markets()
546
708
  symbols = self.market_symbols(symbols)
547
- request: dict = {}
548
- if symbols is not None:
549
- if isinstance(symbols, list):
550
- request['market'] = self.market_id(symbols[0])
551
- else:
552
- request['market'] = self.market_id(symbols)
553
- else:
554
- request['market'] = 'ALL'
709
+ request: dict = {
710
+ 'market': 'ALL',
711
+ }
555
712
  response = await self.publicGetMarketsSummary(self.extend(request, params))
556
713
  #
557
714
  # {
@@ -629,7 +786,7 @@ class paradex(Exchange, ImplicitAPI):
629
786
  # "ask": "69578.2",
630
787
  # "volume_24h": "5815541.397939004",
631
788
  # "total_volume": "584031465.525259686",
632
- # "created_at": 1718170156580,
789
+ # "created_at": 1718170156581,
633
790
  # "underlying_price": "67367.37268422",
634
791
  # "open_interest": "162.272",
635
792
  # "funding_rate": "0.01629574927887",
@@ -871,7 +1028,7 @@ class paradex(Exchange, ImplicitAPI):
871
1028
  #
872
1029
  # {
873
1030
  # "symbol": "BTC-USD-PERP",
874
- # "oracle_price": "68465.17449906",
1031
+ # "oracle_price": "68465.17449904",
875
1032
  # "mark_price": "68465.17449906",
876
1033
  # "last_traded_price": "68495.1",
877
1034
  # "bid": "68477.6",
@@ -950,22 +1107,24 @@ class paradex(Exchange, ImplicitAPI):
950
1107
  async def prepare_paradex_domain(self, l1=False):
951
1108
  systemConfig = await self.get_system_config()
952
1109
  if l1 is True:
953
- return {
1110
+ l1D = {
954
1111
  'name': 'Paradex',
955
1112
  'chainId': systemConfig['l1_chain_id'],
956
1113
  'version': '1',
957
1114
  }
958
- return {
1115
+ return l1D
1116
+ domain = {
959
1117
  'name': 'Paradex',
960
1118
  'chainId': systemConfig['starknet_chain_id'],
961
1119
  'version': 1,
962
1120
  }
1121
+ return domain
963
1122
 
964
1123
  async def retrieve_account(self):
965
- self.check_required_credentials()
966
1124
  cachedAccount: dict = self.safe_dict(self.options, 'paradexAccount')
967
1125
  if cachedAccount is not None:
968
1126
  return cachedAccount
1127
+ self.check_required_credentials()
969
1128
  systemConfig = await self.get_system_config()
970
1129
  domain = await self.prepare_paradex_domain(True)
971
1130
  messageTypes = {
@@ -1013,7 +1172,8 @@ class paradex(Exchange, ImplicitAPI):
1013
1172
  if now < cachedExpires:
1014
1173
  return cachedToken
1015
1174
  account = await self.retrieve_account()
1016
- expires = now + 86400 * 7
1175
+ # https://docs.paradex.trade/api-reference/general-information/authentication
1176
+ expires = now + 180
1017
1177
  req = {
1018
1178
  'method': 'POST',
1019
1179
  'path': '/v1/auth',
@@ -1086,12 +1246,21 @@ class paradex(Exchange, ImplicitAPI):
1086
1246
  price = self.safe_string(order, 'price')
1087
1247
  amount = self.safe_string(order, 'size')
1088
1248
  orderType = self.safe_string(order, 'type')
1249
+ cancelReason = self.safe_string(order, 'cancel_reason')
1089
1250
  status = self.safe_string(order, 'status')
1251
+ if cancelReason is not None:
1252
+ if cancelReason == 'NOT_ENOUGH_MARGIN' or cancelReason == 'ORDER_EXCEEDS_POSITION_LIMIT':
1253
+ status = 'rejected'
1254
+ else:
1255
+ status = 'canceled'
1090
1256
  side = self.safe_string_lower(order, 'side')
1091
1257
  average = self.omit_zero(self.safe_string(order, 'avg_fill_price'))
1092
1258
  remaining = self.omit_zero(self.safe_string(order, 'remaining_size'))
1093
- stopPrice = self.safe_string(order, 'trigger_price')
1094
1259
  lastUpdateTimestamp = self.safe_integer(order, 'last_updated_at')
1260
+ flags = self.safe_list(order, 'flags', [])
1261
+ reduceOnly = None
1262
+ if 'REDUCE_ONLY' in flags:
1263
+ reduceOnly = True
1095
1264
  return self.safe_order({
1096
1265
  'id': orderId,
1097
1266
  'clientOrderId': clientOrderId,
@@ -1102,13 +1271,12 @@ class paradex(Exchange, ImplicitAPI):
1102
1271
  'status': self.parse_order_status(status),
1103
1272
  'symbol': symbol,
1104
1273
  'type': self.parse_order_type(orderType),
1105
- 'timeInForce': self.parse_time_in_force(self.safe_string(order, 'instrunction')),
1274
+ 'timeInForce': self.parse_time_in_force(self.safe_string(order, 'instruction')),
1106
1275
  'postOnly': None,
1107
- 'reduceOnly': None,
1276
+ 'reduceOnly': reduceOnly,
1108
1277
  'side': side,
1109
1278
  'price': price,
1110
- 'stopPrice': stopPrice,
1111
- 'triggerPrice': stopPrice,
1279
+ 'triggerPrice': self.safe_string(order, 'trigger_price'),
1112
1280
  'takeProfitPrice': None,
1113
1281
  'stopLossPrice': None,
1114
1282
  'average': average,
@@ -1171,8 +1339,10 @@ class paradex(Exchange, ImplicitAPI):
1171
1339
  :param float amount: how much of currency you want to trade in units of base currency
1172
1340
  :param float [price]: the price at which the order is to be fullfilled, in units of the quote currency, ignored in market orders
1173
1341
  :param dict [params]: extra parameters specific to the exchange API endpoint
1174
- :param float [params.stopPrice]: The price a trigger order is triggered at
1342
+ :param float [params.stopPrice]: alias for triggerPrice
1175
1343
  :param float [params.triggerPrice]: The price a trigger order is triggered at
1344
+ :param float [params.stopLossPrice]: the price that a stop loss order is triggered at
1345
+ :param float [params.takeProfitPrice]: the price that a take profit order is triggered at
1176
1346
  :param str [params.timeInForce]: "GTC", "IOC", or "POST_ONLY"
1177
1347
  :param bool [params.postOnly]: True or False
1178
1348
  :param bool [params.reduceOnly]: Ensures that the executed order does not flip the opened position.
@@ -1188,11 +1358,15 @@ class paradex(Exchange, ImplicitAPI):
1188
1358
  request: dict = {
1189
1359
  'market': market['id'],
1190
1360
  'side': orderSide,
1191
- 'type': orderType, # LIMIT/MARKET/STOP_LIMIT/STOP_MARKET
1192
- 'size': self.amount_to_precision(symbol, amount),
1361
+ 'type': orderType, # LIMIT/MARKET/STOP_LIMIT/STOP_MARKET,STOP_LOSS_MARKET,STOP_LOSS_LIMIT,TAKE_PROFIT_MARKET,TAKE_PROFIT_LIMIT
1193
1362
  }
1194
- stopPrice = self.safe_string_2(params, 'triggerPrice', 'stopPrice')
1363
+ triggerPrice = self.safe_string_2(params, 'triggerPrice', 'stopPrice')
1364
+ stopLossPrice = self.safe_string(params, 'stopLossPrice')
1365
+ takeProfitPrice = self.safe_string(params, 'takeProfitPrice')
1195
1366
  isMarket = orderType == 'MARKET'
1367
+ isTakeProfitOrder = (takeProfitPrice is not None)
1368
+ isStopLossOrder = (stopLossPrice is not None)
1369
+ isStopOrder = (triggerPrice is not None) or isTakeProfitOrder or isStopLossOrder
1196
1370
  timeInForce = self.safe_string_upper(params, 'timeInForce')
1197
1371
  postOnly = self.is_post_only(isMarket, None, params)
1198
1372
  if not isMarket:
@@ -1200,22 +1374,51 @@ class paradex(Exchange, ImplicitAPI):
1200
1374
  request['instruction'] = 'POST_ONLY'
1201
1375
  elif timeInForce == 'ioc':
1202
1376
  request['instruction'] = 'IOC'
1203
- if reduceOnly:
1204
- request['flags'] = [
1205
- 'REDUCE_ONLY',
1206
- ]
1207
1377
  if price is not None:
1208
1378
  request['price'] = self.price_to_precision(symbol, price)
1209
1379
  clientOrderId = self.safe_string_n(params, ['clOrdID', 'clientOrderId', 'client_order_id'])
1210
1380
  if clientOrderId is not None:
1211
1381
  request['client_id'] = clientOrderId
1212
- if stopPrice is not None:
1382
+ sizeString = '0'
1383
+ stopPrice = None
1384
+ if isStopOrder:
1385
+ # flags: Reduce_Only must be provided for TPSL orders.
1213
1386
  if isMarket:
1214
- request['type'] = 'STOP_MARKET'
1387
+ if isStopLossOrder:
1388
+ stopPrice = self.price_to_precision(symbol, stopLossPrice)
1389
+ reduceOnly = True
1390
+ request['type'] = 'STOP_LOSS_MARKET'
1391
+ elif isTakeProfitOrder:
1392
+ stopPrice = self.price_to_precision(symbol, takeProfitPrice)
1393
+ reduceOnly = True
1394
+ request['type'] = 'TAKE_PROFIT_MARKET'
1395
+ else:
1396
+ stopPrice = self.price_to_precision(symbol, triggerPrice)
1397
+ sizeString = self.amount_to_precision(symbol, amount)
1398
+ request['type'] = 'STOP_MARKET'
1215
1399
  else:
1216
- request['type'] = 'STOP_LIMIT'
1217
- request['trigger_price'] = self.price_to_precision(symbol, stopPrice)
1218
- params = self.omit(params, ['reduceOnly', 'reduce_only', 'clOrdID', 'clientOrderId', 'client_order_id', 'postOnly', 'timeInForce', 'stopPrice', 'triggerPrice'])
1400
+ if isStopLossOrder:
1401
+ stopPrice = self.price_to_precision(symbol, stopLossPrice)
1402
+ reduceOnly = True
1403
+ request['type'] = 'STOP_LOSS_LIMIT'
1404
+ elif isTakeProfitOrder:
1405
+ stopPrice = self.price_to_precision(symbol, takeProfitPrice)
1406
+ reduceOnly = True
1407
+ request['type'] = 'TAKE_PROFIT_LIMIT'
1408
+ else:
1409
+ stopPrice = self.price_to_precision(symbol, triggerPrice)
1410
+ sizeString = self.amount_to_precision(symbol, amount)
1411
+ request['type'] = 'STOP_LIMIT'
1412
+ else:
1413
+ sizeString = self.amount_to_precision(symbol, amount)
1414
+ if stopPrice is not None:
1415
+ request['trigger_price'] = stopPrice
1416
+ request['size'] = sizeString
1417
+ if reduceOnly:
1418
+ request['flags'] = [
1419
+ 'REDUCE_ONLY',
1420
+ ]
1421
+ params = self.omit(params, ['reduceOnly', 'reduce_only', 'clOrdID', 'clientOrderId', 'client_order_id', 'postOnly', 'timeInForce', 'stopPrice', 'triggerPrice', 'stopLossPrice', 'takeProfitPrice'])
1219
1422
  account = await self.retrieve_account()
1220
1423
  now = self.nonce()
1221
1424
  orderReq = {
@@ -1324,7 +1527,7 @@ class paradex(Exchange, ImplicitAPI):
1324
1527
  #
1325
1528
  # if success, no response...
1326
1529
  #
1327
- return response
1530
+ return [self.safe_order({'info': response})]
1328
1531
 
1329
1532
  async def fetch_order(self, id: str, symbol: Str = None, params={}):
1330
1533
  """
@@ -1621,7 +1824,7 @@ class paradex(Exchange, ImplicitAPI):
1621
1824
  positions = await self.fetch_positions([market['symbol']], params)
1622
1825
  return self.safe_dict(positions, 0, {})
1623
1826
 
1624
- async def fetch_positions(self, symbols: Strings = None, params={}):
1827
+ async def fetch_positions(self, symbols: Strings = None, params={}) -> List[Position]:
1625
1828
  """
1626
1829
  fetch all open positions
1627
1830
 
@@ -1768,6 +1971,7 @@ class paradex(Exchange, ImplicitAPI):
1768
1971
  'contracts': None,
1769
1972
  'contractSize': None,
1770
1973
  'price': None,
1974
+ 'side': None,
1771
1975
  'baseValue': None,
1772
1976
  'quoteValue': None,
1773
1977
  'timestamp': timestamp,
@@ -1947,6 +2151,316 @@ class paradex(Exchange, ImplicitAPI):
1947
2151
  }
1948
2152
  return self.safe_string(statuses, status, status)
1949
2153
 
2154
+ async def fetch_margin_mode(self, symbol: str, params={}) -> MarginMode:
2155
+ """
2156
+ fetches the margin mode of a specific symbol
2157
+
2158
+ https://docs.api.testnet.paradex.trade/#get-account-margin-configuration
2159
+
2160
+ :param str symbol: unified symbol of the market the order was made in
2161
+ :param dict [params]: extra parameters specific to the exchange API endpoint
2162
+ :returns dict: a `margin mode structure <https://docs.ccxt.com/#/?id=margin-mode-structure>`
2163
+ """
2164
+ await self.authenticate_rest()
2165
+ await self.load_markets()
2166
+ market = self.market(symbol)
2167
+ request: dict = {
2168
+ 'market': market['id'],
2169
+ }
2170
+ response = await self.privateGetAccountMargin(self.extend(request, params))
2171
+ #
2172
+ # {
2173
+ # "account": "0x6343248026a845b39a8a73fbe9c7ef0a841db31ed5c61ec1446aa9d25e54dbc",
2174
+ # "configs": [
2175
+ # {
2176
+ # "market": "SOL-USD-PERP",
2177
+ # "leverage": 50,
2178
+ # "margin_type": "CROSS"
2179
+ # }
2180
+ # ]
2181
+ # }
2182
+ #
2183
+ configs = self.safe_list(response, 'configs')
2184
+ return self.parse_margin_mode(self.safe_dict(configs, 0), market)
2185
+
2186
+ def parse_margin_mode(self, rawMarginMode: dict, market=None) -> MarginMode:
2187
+ marketId = self.safe_string(rawMarginMode, 'market')
2188
+ market = self.safe_market(marketId, market)
2189
+ marginMode = self.safe_string_lower(rawMarginMode, 'margin_type')
2190
+ return {
2191
+ 'info': rawMarginMode,
2192
+ 'symbol': market['symbol'],
2193
+ 'marginMode': marginMode,
2194
+ }
2195
+
2196
+ async def set_margin_mode(self, marginMode: str, symbol: Str = None, params={}):
2197
+ """
2198
+ set margin mode to 'cross' or 'isolated'
2199
+
2200
+ https://docs.api.testnet.paradex.trade/#set-margin-configuration
2201
+
2202
+ :param str marginMode: 'cross' or 'isolated'
2203
+ :param str symbol: unified market symbol
2204
+ :param dict [params]: extra parameters specific to the exchange API endpoint
2205
+ :param float [params.leverage]: the rate of leverage
2206
+ :returns dict: response from the exchange
2207
+ """
2208
+ self.check_required_argument('setMarginMode', symbol, 'symbol')
2209
+ await self.authenticate_rest()
2210
+ await self.load_markets()
2211
+ market: Market = self.market(symbol)
2212
+ leverage: Str = None
2213
+ leverage, params = self.handle_option_and_params(params, 'setMarginMode', 'leverage', 1)
2214
+ request: dict = {
2215
+ 'market': market['id'],
2216
+ 'leverage': leverage,
2217
+ 'margin_type': self.encode_margin_mode(marginMode),
2218
+ }
2219
+ return await self.privatePostAccountMarginMarket(self.extend(request, params))
2220
+
2221
+ async def fetch_leverage(self, symbol: str, params={}) -> Leverage:
2222
+ """
2223
+ fetch the set leverage for a market
2224
+
2225
+ https://docs.api.testnet.paradex.trade/#get-account-margin-configuration
2226
+
2227
+ :param str symbol: unified market symbol
2228
+ :param dict [params]: extra parameters specific to the exchange API endpoint
2229
+ :returns dict: a `leverage structure <https://docs.ccxt.com/#/?id=leverage-structure>`
2230
+ """
2231
+ await self.authenticate_rest()
2232
+ await self.load_markets()
2233
+ market = self.market(symbol)
2234
+ request: dict = {
2235
+ 'market': market['id'],
2236
+ }
2237
+ response = await self.privateGetAccountMargin(self.extend(request, params))
2238
+ #
2239
+ # {
2240
+ # "account": "0x6343248026a845b39a8a73fbe9c7ef0a841db31ed5c61ec1446aa9d25e54dbc",
2241
+ # "configs": [
2242
+ # {
2243
+ # "market": "SOL-USD-PERP",
2244
+ # "leverage": 50,
2245
+ # "margin_type": "CROSS"
2246
+ # }
2247
+ # ]
2248
+ # }
2249
+ #
2250
+ configs = self.safe_list(response, 'configs')
2251
+ return self.parse_leverage(self.safe_dict(configs, 0), market)
2252
+
2253
+ def parse_leverage(self, leverage: dict, market: Market = None) -> Leverage:
2254
+ marketId = self.safe_string(leverage, 'market')
2255
+ market = self.safe_market(marketId, market)
2256
+ marginMode = self.safe_string_lower(leverage, 'margin_type')
2257
+ return {
2258
+ 'info': leverage,
2259
+ 'symbol': self.safe_symbol(marketId, market),
2260
+ 'marginMode': marginMode,
2261
+ 'longLeverage': self.safe_integer(leverage, 'leverage'),
2262
+ 'shortLeverage': self.safe_integer(leverage, 'leverage'),
2263
+ }
2264
+
2265
+ def encode_margin_mode(self, mode):
2266
+ modes = {
2267
+ 'cross': 'CROSS',
2268
+ 'isolated': 'ISOLATED',
2269
+ }
2270
+ return self.safe_string(modes, mode, mode)
2271
+
2272
+ async def set_leverage(self, leverage: int, symbol: Str = None, params={}):
2273
+ """
2274
+ set the level of leverage for a market
2275
+
2276
+ https://docs.api.testnet.paradex.trade/#set-margin-configuration
2277
+
2278
+ :param float leverage: the rate of leverage
2279
+ :param str [symbol]: unified market symbol(is mandatory for swap markets)
2280
+ :param dict [params]: extra parameters specific to the exchange API endpoint
2281
+ :param str [params.marginMode]: 'cross' or 'isolated'
2282
+ :returns dict: response from the exchange
2283
+ """
2284
+ self.check_required_argument('setLeverage', symbol, 'symbol')
2285
+ await self.authenticate_rest()
2286
+ await self.load_markets()
2287
+ market: Market = self.market(symbol)
2288
+ marginMode: Str = None
2289
+ marginMode, params = self.handle_margin_mode_and_params('setLeverage', params, 'cross')
2290
+ request: dict = {
2291
+ 'market': market['id'],
2292
+ 'leverage': leverage,
2293
+ 'margin_type': self.encode_margin_mode(marginMode),
2294
+ }
2295
+ return await self.privatePostAccountMarginMarket(self.extend(request, params))
2296
+
2297
+ async def fetch_greeks(self, symbol: str, params={}) -> Greeks:
2298
+ """
2299
+ fetches an option contracts greeks, financial metrics used to measure the factors that affect the price of an options contract
2300
+
2301
+ https://docs.api.testnet.paradex.trade/#list-available-markets-summary
2302
+
2303
+ :param str symbol: unified symbol of the market to fetch greeks for
2304
+ :param dict [params]: extra parameters specific to the exchange API endpoint
2305
+ :returns dict: a `greeks structure <https://docs.ccxt.com/#/?id=greeks-structure>`
2306
+ """
2307
+ await self.load_markets()
2308
+ market = self.market(symbol)
2309
+ request: dict = {
2310
+ 'market': market['id'],
2311
+ }
2312
+ response = await self.publicGetMarketsSummary(self.extend(request, params))
2313
+ #
2314
+ # {
2315
+ # "results": [
2316
+ # {
2317
+ # "symbol": "BTC-USD-114000-P",
2318
+ # "mark_price": "10835.66892602",
2319
+ # "mark_iv": "0.71781855",
2320
+ # "delta": "-0.98726024",
2321
+ # "greeks": {
2322
+ # "delta": "-0.9872602390817709",
2323
+ # "gamma": "0.000004560958862297231",
2324
+ # "vega": "227.11344863639806",
2325
+ # "rho": "-302.0617972461581",
2326
+ # "vanna": "0.06609830491614832",
2327
+ # "volga": "925.9501532805552"
2328
+ # },
2329
+ # "last_traded_price": "10551.5",
2330
+ # "bid": "10794.9",
2331
+ # "bid_iv": "0.05",
2332
+ # "ask": "10887.3",
2333
+ # "ask_iv": "0.8783283",
2334
+ # "last_iv": "0.05",
2335
+ # "volume_24h": "0",
2336
+ # "total_volume": "195240.72672261014",
2337
+ # "created_at": 1747644009995,
2338
+ # "underlying_price": "103164.79162649",
2339
+ # "open_interest": "0",
2340
+ # "funding_rate": "0.000004464241170536191",
2341
+ # "price_change_rate_24h": "0.074915",
2342
+ # "future_funding_rate": "0.0001"
2343
+ # }
2344
+ # ]
2345
+ # }
2346
+ #
2347
+ data = self.safe_list(response, 'results', [])
2348
+ greeks = self.safe_dict(data, 0, {})
2349
+ return self.parse_greeks(greeks, market)
2350
+
2351
+ async def fetch_all_greeks(self, symbols: Strings = None, params={}) -> List[Greeks]:
2352
+ """
2353
+ fetches all option contracts greeks, financial metrics used to measure the factors that affect the price of an options contract
2354
+
2355
+ https://docs.api.testnet.paradex.trade/#list-available-markets-summary
2356
+
2357
+ :param str[] [symbols]: unified symbols of the markets to fetch greeks for, all markets are returned if not assigned
2358
+ :param dict [params]: extra parameters specific to the exchange API endpoint
2359
+ :returns dict: a `greeks structure <https://docs.ccxt.com/#/?id=greeks-structure>`
2360
+ """
2361
+ await self.load_markets()
2362
+ symbols = self.market_symbols(symbols, None, True, True, True)
2363
+ request: dict = {
2364
+ 'market': 'ALL',
2365
+ }
2366
+ response = await self.publicGetMarketsSummary(self.extend(request, params))
2367
+ #
2368
+ # {
2369
+ # "results": [
2370
+ # {
2371
+ # "symbol": "BTC-USD-114000-P",
2372
+ # "mark_price": "10835.66892602",
2373
+ # "mark_iv": "0.71781855",
2374
+ # "delta": "-0.98726024",
2375
+ # "greeks": {
2376
+ # "delta": "-0.9872602390817709",
2377
+ # "gamma": "0.000004560958862297231",
2378
+ # "vega": "227.11344863639806",
2379
+ # "rho": "-302.0617972461581",
2380
+ # "vanna": "0.06609830491614832",
2381
+ # "volga": "925.9501532805552"
2382
+ # },
2383
+ # "last_traded_price": "10551.5",
2384
+ # "bid": "10794.9",
2385
+ # "bid_iv": "0.05",
2386
+ # "ask": "10887.3",
2387
+ # "ask_iv": "0.8783283",
2388
+ # "last_iv": "0.05",
2389
+ # "volume_24h": "0",
2390
+ # "total_volume": "195240.72672261014",
2391
+ # "created_at": 1747644009995,
2392
+ # "underlying_price": "103164.79162649",
2393
+ # "open_interest": "0",
2394
+ # "funding_rate": "0.000004464241170536191",
2395
+ # "price_change_rate_24h": "0.074915",
2396
+ # "future_funding_rate": "0.0001"
2397
+ # }
2398
+ # ]
2399
+ # }
2400
+ #
2401
+ results = self.safe_list(response, 'results', [])
2402
+ return self.parse_all_greeks(results, symbols)
2403
+
2404
+ def parse_greeks(self, greeks: dict, market: Market = None) -> Greeks:
2405
+ #
2406
+ # {
2407
+ # "symbol": "BTC-USD-114000-P",
2408
+ # "mark_price": "10835.66892602",
2409
+ # "mark_iv": "0.71781855",
2410
+ # "delta": "-0.98726024",
2411
+ # "greeks": {
2412
+ # "delta": "-0.9872602390817709",
2413
+ # "gamma": "0.000004560958862297231",
2414
+ # "vega": "227.11344863639806",
2415
+ # "rho": "-302.0617972461581",
2416
+ # "vanna": "0.06609830491614832",
2417
+ # "volga": "925.9501532805552"
2418
+ # },
2419
+ # "last_traded_price": "10551.5",
2420
+ # "bid": "10794.9",
2421
+ # "bid_iv": "0.05",
2422
+ # "ask": "10887.3",
2423
+ # "ask_iv": "0.8783283",
2424
+ # "last_iv": "0.05",
2425
+ # "volume_24h": "0",
2426
+ # "total_volume": "195240.72672261014",
2427
+ # "created_at": 1747644009995,
2428
+ # "underlying_price": "103164.79162649",
2429
+ # "open_interest": "0",
2430
+ # "funding_rate": "0.000004464241170536191",
2431
+ # "price_change_rate_24h": "0.074915",
2432
+ # "future_funding_rate": "0.0001"
2433
+ # }
2434
+ #
2435
+ marketId = self.safe_string(greeks, 'symbol')
2436
+ market = self.safe_market(marketId, market, None, 'option')
2437
+ symbol = market['symbol']
2438
+ timestamp = self.safe_integer(greeks, 'created_at')
2439
+ greeksData = self.safe_dict(greeks, 'greeks', {})
2440
+ return {
2441
+ 'symbol': symbol,
2442
+ 'timestamp': timestamp,
2443
+ 'datetime': self.iso8601(timestamp),
2444
+ 'delta': self.safe_number(greeksData, 'delta'),
2445
+ 'gamma': self.safe_number(greeksData, 'gamma'),
2446
+ 'theta': None,
2447
+ 'vega': self.safe_number(greeksData, 'vega'),
2448
+ 'rho': self.safe_number(greeksData, 'rho'),
2449
+ 'vanna': self.safe_number(greeksData, 'vanna'),
2450
+ 'volga': self.safe_number(greeksData, 'volga'),
2451
+ 'bidSize': None,
2452
+ 'askSize': None,
2453
+ 'bidImpliedVolatility': self.safe_number(greeks, 'bid_iv'),
2454
+ 'askImpliedVolatility': self.safe_number(greeks, 'ask_iv'),
2455
+ 'markImpliedVolatility': self.safe_number(greeks, 'mark_iv'),
2456
+ 'bidPrice': self.safe_number(greeks, 'bid'),
2457
+ 'askPrice': self.safe_number(greeks, 'ask'),
2458
+ 'markPrice': self.safe_number(greeks, 'mark_price'),
2459
+ 'lastPrice': self.safe_number(greeks, 'last_traded_price'),
2460
+ 'underlyingPrice': self.safe_number(greeks, 'underlying_price'),
2461
+ 'info': greeks,
2462
+ }
2463
+
1950
2464
  def sign(self, path, api='public', method='GET', params={}, headers=None, body=None):
1951
2465
  url = self.implode_hostname(self.urls['api'][self.version]) + '/' + self.implode_params(path, params)
1952
2466
  query = self.omit(params, self.extract_params(path))
@@ -1954,7 +2468,6 @@ class paradex(Exchange, ImplicitAPI):
1954
2468
  if query:
1955
2469
  url += '?' + self.urlencode(query)
1956
2470
  elif api == 'private':
1957
- self.check_required_credentials()
1958
2471
  headers = {
1959
2472
  'Accept': 'application/json',
1960
2473
  'PARADEX-PARTNER': self.safe_string(self.options, 'broker', 'CCXT'),