ccxt-ir 4.3.46.0.1__py2.py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (772) hide show
  1. ccxt/__init__.py +358 -0
  2. ccxt/abantether.py +316 -0
  3. ccxt/abstract/__init__.py +0 -0
  4. ccxt/abstract/abantether.py +5 -0
  5. ccxt/abstract/ace.py +15 -0
  6. ccxt/abstract/afratether.py +6 -0
  7. ccxt/abstract/alpaca.py +70 -0
  8. ccxt/abstract/arzinja.py +5 -0
  9. ccxt/abstract/arzplus.py +7 -0
  10. ccxt/abstract/ascendex.py +77 -0
  11. ccxt/abstract/bequant.py +115 -0
  12. ccxt/abstract/bigone.py +45 -0
  13. ccxt/abstract/binance.py +712 -0
  14. ccxt/abstract/binancecoinm.py +712 -0
  15. ccxt/abstract/binanceus.py +764 -0
  16. ccxt/abstract/binanceusdm.py +712 -0
  17. ccxt/abstract/bingx.py +113 -0
  18. ccxt/abstract/bit2c.py +27 -0
  19. ccxt/abstract/bitbank.py +27 -0
  20. ccxt/abstract/bitbay.py +53 -0
  21. ccxt/abstract/bitbns.py +40 -0
  22. ccxt/abstract/bitcoincom.py +115 -0
  23. ccxt/abstract/bitfinex.py +69 -0
  24. ccxt/abstract/bitfinex2.py +139 -0
  25. ccxt/abstract/bitflyer.py +38 -0
  26. ccxt/abstract/bitget.py +508 -0
  27. ccxt/abstract/bithumb.py +32 -0
  28. ccxt/abstract/bitimen.py +7 -0
  29. ccxt/abstract/bitir.py +7 -0
  30. ccxt/abstract/bitmart.py +99 -0
  31. ccxt/abstract/bitmex.py +97 -0
  32. ccxt/abstract/bitopro.py +29 -0
  33. ccxt/abstract/bitpanda.py +35 -0
  34. ccxt/abstract/bitpin.py +7 -0
  35. ccxt/abstract/bitrue.py +72 -0
  36. ccxt/abstract/bitso.py +43 -0
  37. ccxt/abstract/bitstamp.py +258 -0
  38. ccxt/abstract/bitteam.py +29 -0
  39. ccxt/abstract/bitvavo.py +27 -0
  40. ccxt/abstract/bl3p.py +19 -0
  41. ccxt/abstract/blockchaincom.py +28 -0
  42. ccxt/abstract/blofin.py +37 -0
  43. ccxt/abstract/btcalpha.py +18 -0
  44. ccxt/abstract/btcbox.py +13 -0
  45. ccxt/abstract/btcmarkets.py +39 -0
  46. ccxt/abstract/btcturk.py +20 -0
  47. ccxt/abstract/bybit.py +298 -0
  48. ccxt/abstract/cex.py +33 -0
  49. ccxt/abstract/coinbase.py +94 -0
  50. ccxt/abstract/coinbaseadvanced.py +94 -0
  51. ccxt/abstract/coinbaseexchange.py +67 -0
  52. ccxt/abstract/coinbaseinternational.py +39 -0
  53. ccxt/abstract/coincatch.py +94 -0
  54. ccxt/abstract/coincheck.py +33 -0
  55. ccxt/abstract/coinex.py +237 -0
  56. ccxt/abstract/coinlist.py +54 -0
  57. ccxt/abstract/coinmate.py +62 -0
  58. ccxt/abstract/coinmetro.py +34 -0
  59. ccxt/abstract/coinone.py +67 -0
  60. ccxt/abstract/coinsph.py +54 -0
  61. ccxt/abstract/coinspot.py +28 -0
  62. ccxt/abstract/cryptocom.py +107 -0
  63. ccxt/abstract/currencycom.py +68 -0
  64. ccxt/abstract/delta.py +50 -0
  65. ccxt/abstract/deribit.py +125 -0
  66. ccxt/abstract/digifinex.py +91 -0
  67. ccxt/abstract/eterex.py +5 -0
  68. ccxt/abstract/excoino.py +7 -0
  69. ccxt/abstract/exir.py +8 -0
  70. ccxt/abstract/exmo.py +55 -0
  71. ccxt/abstract/exnovin.py +6 -0
  72. ccxt/abstract/farhadexchange.py +5 -0
  73. ccxt/abstract/fmfwio.py +115 -0
  74. ccxt/abstract/gate.py +265 -0
  75. ccxt/abstract/gateio.py +265 -0
  76. ccxt/abstract/gemini.py +58 -0
  77. ccxt/abstract/hashkey.py +67 -0
  78. ccxt/abstract/hitbtc.py +115 -0
  79. ccxt/abstract/hitbtc3.py +115 -0
  80. ccxt/abstract/hitobit.py +8 -0
  81. ccxt/abstract/hollaex.py +33 -0
  82. ccxt/abstract/htx.py +548 -0
  83. ccxt/abstract/huobi.py +548 -0
  84. ccxt/abstract/huobijp.py +114 -0
  85. ccxt/abstract/hyperliquid.py +6 -0
  86. ccxt/abstract/idex.py +26 -0
  87. ccxt/abstract/independentreserve.py +37 -0
  88. ccxt/abstract/indodax.py +26 -0
  89. ccxt/abstract/jibitex.py +7 -0
  90. ccxt/abstract/kraken.py +57 -0
  91. ccxt/abstract/krakenfutures.py +38 -0
  92. ccxt/abstract/kucoin.py +214 -0
  93. ccxt/abstract/kucoinfutures.py +233 -0
  94. ccxt/abstract/kuna.py +182 -0
  95. ccxt/abstract/latoken.py +56 -0
  96. ccxt/abstract/lbank.py +61 -0
  97. ccxt/abstract/luno.py +37 -0
  98. ccxt/abstract/lykke.py +29 -0
  99. ccxt/abstract/mercado.py +25 -0
  100. ccxt/abstract/mexc.py +178 -0
  101. ccxt/abstract/ndax.py +97 -0
  102. ccxt/abstract/nobitex.py +7 -0
  103. ccxt/abstract/novadax.py +29 -0
  104. ccxt/abstract/oceanex.py +22 -0
  105. ccxt/abstract/okcoin.py +74 -0
  106. ccxt/abstract/okexchange.py +8 -0
  107. ccxt/abstract/okx.py +324 -0
  108. ccxt/abstract/ompfinex.py +7 -0
  109. ccxt/abstract/onetrading.py +35 -0
  110. ccxt/abstract/oxfun.py +34 -0
  111. ccxt/abstract/p2b.py +22 -0
  112. ccxt/abstract/paradex.py +40 -0
  113. ccxt/abstract/paymium.py +28 -0
  114. ccxt/abstract/phemex.py +115 -0
  115. ccxt/abstract/poloniex.py +69 -0
  116. ccxt/abstract/poloniexfutures.py +48 -0
  117. ccxt/abstract/probit.py +23 -0
  118. ccxt/abstract/ramzinex.py +7 -0
  119. ccxt/abstract/sarmayex.py +5 -0
  120. ccxt/abstract/sarrafex.py +7 -0
  121. ccxt/abstract/tabdeal.py +7 -0
  122. ccxt/abstract/tetherland.py +5 -0
  123. ccxt/abstract/timex.py +62 -0
  124. ccxt/abstract/tokocrypto.py +37 -0
  125. ccxt/abstract/tradeogre.py +16 -0
  126. ccxt/abstract/twox.py +5 -0
  127. ccxt/abstract/ubitex.py +7 -0
  128. ccxt/abstract/upbit.py +38 -0
  129. ccxt/abstract/vertex.py +19 -0
  130. ccxt/abstract/wallex.py +8 -0
  131. ccxt/abstract/wavesexchange.py +154 -0
  132. ccxt/abstract/wazirx.py +30 -0
  133. ccxt/abstract/whitebit.py +98 -0
  134. ccxt/abstract/woo.py +83 -0
  135. ccxt/abstract/woofipro.py +119 -0
  136. ccxt/abstract/xt.py +152 -0
  137. ccxt/abstract/yobit.py +16 -0
  138. ccxt/abstract/zaif.py +38 -0
  139. ccxt/abstract/zonda.py +53 -0
  140. ccxt/ace.py +1012 -0
  141. ccxt/afratether.py +293 -0
  142. ccxt/alpaca.py +1083 -0
  143. ccxt/arzinja.py +285 -0
  144. ccxt/arzplus.py +412 -0
  145. ccxt/ascendex.py +3330 -0
  146. ccxt/async_support/__init__.py +337 -0
  147. ccxt/async_support/abantether.py +316 -0
  148. ccxt/async_support/ace.py +1012 -0
  149. ccxt/async_support/afratether.py +293 -0
  150. ccxt/async_support/alpaca.py +1083 -0
  151. ccxt/async_support/arzinja.py +285 -0
  152. ccxt/async_support/arzplus.py +412 -0
  153. ccxt/async_support/ascendex.py +3330 -0
  154. ccxt/async_support/base/__init__.py +1 -0
  155. ccxt/async_support/base/exchange.py +1966 -0
  156. ccxt/async_support/base/throttler.py +50 -0
  157. ccxt/async_support/base/ws/__init__.py +38 -0
  158. ccxt/async_support/base/ws/aiohttp_client.py +125 -0
  159. ccxt/async_support/base/ws/cache.py +212 -0
  160. ccxt/async_support/base/ws/client.py +193 -0
  161. ccxt/async_support/base/ws/fast_client.py +96 -0
  162. ccxt/async_support/base/ws/functions.py +59 -0
  163. ccxt/async_support/base/ws/future.py +58 -0
  164. ccxt/async_support/base/ws/order_book.py +78 -0
  165. ccxt/async_support/base/ws/order_book_side.py +174 -0
  166. ccxt/async_support/bequant.py +33 -0
  167. ccxt/async_support/bigone.py +2113 -0
  168. ccxt/async_support/binance.py +12234 -0
  169. ccxt/async_support/binancecoinm.py +45 -0
  170. ccxt/async_support/binanceus.py +211 -0
  171. ccxt/async_support/binanceusdm.py +58 -0
  172. ccxt/async_support/bingx.py +4325 -0
  173. ccxt/async_support/bit2c.py +866 -0
  174. ccxt/async_support/bitbank.py +1001 -0
  175. ccxt/async_support/bitbay.py +17 -0
  176. ccxt/async_support/bitbns.py +1154 -0
  177. ccxt/async_support/bitcoincom.py +17 -0
  178. ccxt/async_support/bitfinex.py +1617 -0
  179. ccxt/async_support/bitfinex2.py +3552 -0
  180. ccxt/async_support/bitflyer.py +995 -0
  181. ccxt/async_support/bitget.py +8273 -0
  182. ccxt/async_support/bithumb.py +1061 -0
  183. ccxt/async_support/bitimen.py +401 -0
  184. ccxt/async_support/bitir.py +490 -0
  185. ccxt/async_support/bitmart.py +4415 -0
  186. ccxt/async_support/bitmex.py +2756 -0
  187. ccxt/async_support/bitopro.py +1630 -0
  188. ccxt/async_support/bitpanda.py +16 -0
  189. ccxt/async_support/bitpin.py +454 -0
  190. ccxt/async_support/bitrue.py +3027 -0
  191. ccxt/async_support/bitso.py +1670 -0
  192. ccxt/async_support/bitstamp.py +2203 -0
  193. ccxt/async_support/bitteam.py +2239 -0
  194. ccxt/async_support/bitvavo.py +1968 -0
  195. ccxt/async_support/bl3p.py +485 -0
  196. ccxt/async_support/blockchaincom.py +1104 -0
  197. ccxt/async_support/blofin.py +2066 -0
  198. ccxt/async_support/btcalpha.py +891 -0
  199. ccxt/async_support/btcbox.py +544 -0
  200. ccxt/async_support/btcmarkets.py +1221 -0
  201. ccxt/async_support/btcturk.py +911 -0
  202. ccxt/async_support/bybit.py +8159 -0
  203. ccxt/async_support/cex.py +1605 -0
  204. ccxt/async_support/coinbase.py +4475 -0
  205. ccxt/async_support/coinbaseadvanced.py +17 -0
  206. ccxt/async_support/coinbaseexchange.py +1734 -0
  207. ccxt/async_support/coinbaseinternational.py +1899 -0
  208. ccxt/async_support/coincatch.py +5069 -0
  209. ccxt/async_support/coincheck.py +815 -0
  210. ccxt/async_support/coinex.py +5526 -0
  211. ccxt/async_support/coinlist.py +2243 -0
  212. ccxt/async_support/coinmate.py +1067 -0
  213. ccxt/async_support/coinmetro.py +1797 -0
  214. ccxt/async_support/coinone.py +1127 -0
  215. ccxt/async_support/coinsph.py +1850 -0
  216. ccxt/async_support/coinspot.py +534 -0
  217. ccxt/async_support/cryptocom.py +2822 -0
  218. ccxt/async_support/currencycom.py +1950 -0
  219. ccxt/async_support/delta.py +3376 -0
  220. ccxt/async_support/deribit.py +3437 -0
  221. ccxt/async_support/digifinex.py +3960 -0
  222. ccxt/async_support/eterex.py +286 -0
  223. ccxt/async_support/excoino.py +399 -0
  224. ccxt/async_support/exir.py +375 -0
  225. ccxt/async_support/exmo.py +2462 -0
  226. ccxt/async_support/exnovin.py +360 -0
  227. ccxt/async_support/farhadexchange.py +266 -0
  228. ccxt/async_support/fmfwio.py +34 -0
  229. ccxt/async_support/gate.py +6976 -0
  230. ccxt/async_support/gateio.py +16 -0
  231. ccxt/async_support/gemini.py +1825 -0
  232. ccxt/async_support/hashkey.py +4150 -0
  233. ccxt/async_support/hitbtc.py +3423 -0
  234. ccxt/async_support/hitbtc3.py +16 -0
  235. ccxt/async_support/hitobit.py +391 -0
  236. ccxt/async_support/hollaex.py +1813 -0
  237. ccxt/async_support/htx.py +8506 -0
  238. ccxt/async_support/huobi.py +16 -0
  239. ccxt/async_support/huobijp.py +1801 -0
  240. ccxt/async_support/hyperliquid.py +2431 -0
  241. ccxt/async_support/idex.py +1766 -0
  242. ccxt/async_support/independentreserve.py +784 -0
  243. ccxt/async_support/indodax.py +1247 -0
  244. ccxt/async_support/jibitex.py +395 -0
  245. ccxt/async_support/kraken.py +2894 -0
  246. ccxt/async_support/krakenfutures.py +2601 -0
  247. ccxt/async_support/kucoin.py +4602 -0
  248. ccxt/async_support/kucoinfutures.py +2698 -0
  249. ccxt/async_support/kuna.py +1841 -0
  250. ccxt/async_support/latoken.py +1664 -0
  251. ccxt/async_support/lbank.py +2683 -0
  252. ccxt/async_support/luno.py +1067 -0
  253. ccxt/async_support/lykke.py +1270 -0
  254. ccxt/async_support/mercado.py +842 -0
  255. ccxt/async_support/mexc.py +5369 -0
  256. ccxt/async_support/ndax.py +2354 -0
  257. ccxt/async_support/nobitex.py +419 -0
  258. ccxt/async_support/novadax.py +1484 -0
  259. ccxt/async_support/oceanex.py +903 -0
  260. ccxt/async_support/okcoin.py +2936 -0
  261. ccxt/async_support/okexchange.py +349 -0
  262. ccxt/async_support/okx.py +7827 -0
  263. ccxt/async_support/ompfinex.py +472 -0
  264. ccxt/async_support/onetrading.py +1911 -0
  265. ccxt/async_support/oxfun.py +2773 -0
  266. ccxt/async_support/p2b.py +1194 -0
  267. ccxt/async_support/paradex.py +2015 -0
  268. ccxt/async_support/paymium.py +564 -0
  269. ccxt/async_support/phemex.py +4473 -0
  270. ccxt/async_support/poloniex.py +2232 -0
  271. ccxt/async_support/poloniexfutures.py +1717 -0
  272. ccxt/async_support/probit.py +1734 -0
  273. ccxt/async_support/ramzinex.py +476 -0
  274. ccxt/async_support/sarmayex.py +357 -0
  275. ccxt/async_support/sarrafex.py +478 -0
  276. ccxt/async_support/tabdeal.py +364 -0
  277. ccxt/async_support/tetherland.py +349 -0
  278. ccxt/async_support/timex.py +1593 -0
  279. ccxt/async_support/tokocrypto.py +2405 -0
  280. ccxt/async_support/tradeogre.py +608 -0
  281. ccxt/async_support/twox.py +326 -0
  282. ccxt/async_support/ubitex.py +409 -0
  283. ccxt/async_support/upbit.py +1833 -0
  284. ccxt/async_support/vertex.py +2922 -0
  285. ccxt/async_support/wallex.py +445 -0
  286. ccxt/async_support/wavesexchange.py +2473 -0
  287. ccxt/async_support/wazirx.py +1224 -0
  288. ccxt/async_support/whitebit.py +2469 -0
  289. ccxt/async_support/woo.py +3114 -0
  290. ccxt/async_support/woofipro.py +2533 -0
  291. ccxt/async_support/xt.py +4454 -0
  292. ccxt/async_support/yobit.py +1283 -0
  293. ccxt/async_support/zaif.py +725 -0
  294. ccxt/async_support/zonda.py +1828 -0
  295. ccxt/base/__init__.py +27 -0
  296. ccxt/base/decimal_to_precision.py +174 -0
  297. ccxt/base/errors.py +242 -0
  298. ccxt/base/exchange.py +5941 -0
  299. ccxt/base/precise.py +287 -0
  300. ccxt/base/types.py +502 -0
  301. ccxt/bequant.py +33 -0
  302. ccxt/bigone.py +2112 -0
  303. ccxt/binance.py +12233 -0
  304. ccxt/binancecoinm.py +45 -0
  305. ccxt/binanceus.py +211 -0
  306. ccxt/binanceusdm.py +58 -0
  307. ccxt/bingx.py +4324 -0
  308. ccxt/bit2c.py +866 -0
  309. ccxt/bitbank.py +1001 -0
  310. ccxt/bitbay.py +17 -0
  311. ccxt/bitbns.py +1154 -0
  312. ccxt/bitcoincom.py +17 -0
  313. ccxt/bitfinex.py +1617 -0
  314. ccxt/bitfinex2.py +3552 -0
  315. ccxt/bitflyer.py +995 -0
  316. ccxt/bitget.py +8272 -0
  317. ccxt/bithumb.py +1061 -0
  318. ccxt/bitimen.py +401 -0
  319. ccxt/bitir.py +490 -0
  320. ccxt/bitmart.py +4415 -0
  321. ccxt/bitmex.py +2756 -0
  322. ccxt/bitopro.py +1630 -0
  323. ccxt/bitpanda.py +16 -0
  324. ccxt/bitpin.py +454 -0
  325. ccxt/bitrue.py +3026 -0
  326. ccxt/bitso.py +1670 -0
  327. ccxt/bitstamp.py +2203 -0
  328. ccxt/bitteam.py +2239 -0
  329. ccxt/bitvavo.py +1968 -0
  330. ccxt/bl3p.py +485 -0
  331. ccxt/blockchaincom.py +1104 -0
  332. ccxt/blofin.py +2066 -0
  333. ccxt/btcalpha.py +891 -0
  334. ccxt/btcbox.py +544 -0
  335. ccxt/btcmarkets.py +1221 -0
  336. ccxt/btcturk.py +911 -0
  337. ccxt/bybit.py +8158 -0
  338. ccxt/cex.py +1605 -0
  339. ccxt/coinbase.py +4474 -0
  340. ccxt/coinbaseadvanced.py +17 -0
  341. ccxt/coinbaseexchange.py +1734 -0
  342. ccxt/coinbaseinternational.py +1899 -0
  343. ccxt/coincatch.py +5069 -0
  344. ccxt/coincheck.py +815 -0
  345. ccxt/coinex.py +5525 -0
  346. ccxt/coinlist.py +2243 -0
  347. ccxt/coinmate.py +1067 -0
  348. ccxt/coinmetro.py +1797 -0
  349. ccxt/coinone.py +1127 -0
  350. ccxt/coinsph.py +1850 -0
  351. ccxt/coinspot.py +534 -0
  352. ccxt/cryptocom.py +2822 -0
  353. ccxt/currencycom.py +1950 -0
  354. ccxt/delta.py +3376 -0
  355. ccxt/deribit.py +3437 -0
  356. ccxt/digifinex.py +3959 -0
  357. ccxt/eterex.py +286 -0
  358. ccxt/excoino.py +399 -0
  359. ccxt/exir.py +375 -0
  360. ccxt/exmo.py +2462 -0
  361. ccxt/exnovin.py +360 -0
  362. ccxt/farhadexchange.py +266 -0
  363. ccxt/fmfwio.py +34 -0
  364. ccxt/gate.py +6975 -0
  365. ccxt/gateio.py +16 -0
  366. ccxt/gemini.py +1824 -0
  367. ccxt/hashkey.py +4150 -0
  368. ccxt/hitbtc.py +3423 -0
  369. ccxt/hitbtc3.py +16 -0
  370. ccxt/hitobit.py +391 -0
  371. ccxt/hollaex.py +1813 -0
  372. ccxt/htx.py +8505 -0
  373. ccxt/huobi.py +16 -0
  374. ccxt/huobijp.py +1801 -0
  375. ccxt/hyperliquid.py +2430 -0
  376. ccxt/idex.py +1766 -0
  377. ccxt/independentreserve.py +784 -0
  378. ccxt/indodax.py +1247 -0
  379. ccxt/jibitex.py +395 -0
  380. ccxt/kraken.py +2894 -0
  381. ccxt/krakenfutures.py +2601 -0
  382. ccxt/kucoin.py +4601 -0
  383. ccxt/kucoinfutures.py +2698 -0
  384. ccxt/kuna.py +1841 -0
  385. ccxt/latoken.py +1664 -0
  386. ccxt/lbank.py +2682 -0
  387. ccxt/luno.py +1067 -0
  388. ccxt/lykke.py +1270 -0
  389. ccxt/mercado.py +842 -0
  390. ccxt/mexc.py +5369 -0
  391. ccxt/ndax.py +2354 -0
  392. ccxt/nobitex.py +419 -0
  393. ccxt/novadax.py +1484 -0
  394. ccxt/oceanex.py +903 -0
  395. ccxt/okcoin.py +2936 -0
  396. ccxt/okexchange.py +349 -0
  397. ccxt/okx.py +7826 -0
  398. ccxt/ompfinex.py +472 -0
  399. ccxt/onetrading.py +1911 -0
  400. ccxt/oxfun.py +2772 -0
  401. ccxt/p2b.py +1194 -0
  402. ccxt/paradex.py +2015 -0
  403. ccxt/paymium.py +564 -0
  404. ccxt/phemex.py +4473 -0
  405. ccxt/poloniex.py +2232 -0
  406. ccxt/poloniexfutures.py +1717 -0
  407. ccxt/pro/__init__.py +149 -0
  408. ccxt/pro/alpaca.py +685 -0
  409. ccxt/pro/ascendex.py +916 -0
  410. ccxt/pro/bequant.py +38 -0
  411. ccxt/pro/binance.py +3488 -0
  412. ccxt/pro/binancecoinm.py +28 -0
  413. ccxt/pro/binanceus.py +48 -0
  414. ccxt/pro/binanceusdm.py +31 -0
  415. ccxt/pro/bingx.py +1264 -0
  416. ccxt/pro/bitcoincom.py +34 -0
  417. ccxt/pro/bitfinex.py +621 -0
  418. ccxt/pro/bitfinex2.py +1083 -0
  419. ccxt/pro/bitget.py +1692 -0
  420. ccxt/pro/bithumb.py +368 -0
  421. ccxt/pro/bitmart.py +1449 -0
  422. ccxt/pro/bitmex.py +1656 -0
  423. ccxt/pro/bitopro.py +445 -0
  424. ccxt/pro/bitpanda.py +15 -0
  425. ccxt/pro/bitrue.py +447 -0
  426. ccxt/pro/bitstamp.py +522 -0
  427. ccxt/pro/bitvavo.py +1270 -0
  428. ccxt/pro/blockchaincom.py +738 -0
  429. ccxt/pro/blofin.py +692 -0
  430. ccxt/pro/bybit.py +2000 -0
  431. ccxt/pro/cex.py +1440 -0
  432. ccxt/pro/coinbase.py +678 -0
  433. ccxt/pro/coinbaseadvanced.py +16 -0
  434. ccxt/pro/coinbaseexchange.py +895 -0
  435. ccxt/pro/coinbaseinternational.py +620 -0
  436. ccxt/pro/coincatch.py +1464 -0
  437. ccxt/pro/coincheck.py +199 -0
  438. ccxt/pro/coinex.py +1061 -0
  439. ccxt/pro/coinone.py +395 -0
  440. ccxt/pro/cryptocom.py +947 -0
  441. ccxt/pro/currencycom.py +536 -0
  442. ccxt/pro/deribit.py +892 -0
  443. ccxt/pro/exmo.py +629 -0
  444. ccxt/pro/gate.py +1416 -0
  445. ccxt/pro/gateio.py +15 -0
  446. ccxt/pro/gemini.py +865 -0
  447. ccxt/pro/hashkey.py +802 -0
  448. ccxt/pro/hitbtc.py +1216 -0
  449. ccxt/pro/hollaex.py +563 -0
  450. ccxt/pro/htx.py +2215 -0
  451. ccxt/pro/huobi.py +15 -0
  452. ccxt/pro/huobijp.py +570 -0
  453. ccxt/pro/hyperliquid.py +525 -0
  454. ccxt/pro/idex.py +672 -0
  455. ccxt/pro/independentreserve.py +270 -0
  456. ccxt/pro/kraken.py +1356 -0
  457. ccxt/pro/krakenfutures.py +1492 -0
  458. ccxt/pro/kucoin.py +1133 -0
  459. ccxt/pro/kucoinfutures.py +1081 -0
  460. ccxt/pro/lbank.py +843 -0
  461. ccxt/pro/luno.py +303 -0
  462. ccxt/pro/mexc.py +1122 -0
  463. ccxt/pro/ndax.py +506 -0
  464. ccxt/pro/okcoin.py +698 -0
  465. ccxt/pro/okx.py +1851 -0
  466. ccxt/pro/onetrading.py +1275 -0
  467. ccxt/pro/oxfun.py +950 -0
  468. ccxt/pro/p2b.py +419 -0
  469. ccxt/pro/paradex.py +352 -0
  470. ccxt/pro/phemex.py +1441 -0
  471. ccxt/pro/poloniex.py +1166 -0
  472. ccxt/pro/poloniexfutures.py +990 -0
  473. ccxt/pro/probit.py +551 -0
  474. ccxt/pro/upbit.py +520 -0
  475. ccxt/pro/vertex.py +943 -0
  476. ccxt/pro/wazirx.py +749 -0
  477. ccxt/pro/whitebit.py +864 -0
  478. ccxt/pro/woo.py +1078 -0
  479. ccxt/pro/woofipro.py +1183 -0
  480. ccxt/pro/xt.py +1067 -0
  481. ccxt/probit.py +1734 -0
  482. ccxt/ramzinex.py +476 -0
  483. ccxt/sarmayex.py +357 -0
  484. ccxt/sarrafex.py +478 -0
  485. ccxt/static_dependencies/__init__.py +1 -0
  486. ccxt/static_dependencies/ecdsa/__init__.py +14 -0
  487. ccxt/static_dependencies/ecdsa/_version.py +520 -0
  488. ccxt/static_dependencies/ecdsa/curves.py +56 -0
  489. ccxt/static_dependencies/ecdsa/der.py +221 -0
  490. ccxt/static_dependencies/ecdsa/ecdsa.py +310 -0
  491. ccxt/static_dependencies/ecdsa/ellipticcurve.py +197 -0
  492. ccxt/static_dependencies/ecdsa/keys.py +332 -0
  493. ccxt/static_dependencies/ecdsa/numbertheory.py +531 -0
  494. ccxt/static_dependencies/ecdsa/rfc6979.py +100 -0
  495. ccxt/static_dependencies/ecdsa/util.py +266 -0
  496. ccxt/static_dependencies/ethereum/__init__.py +7 -0
  497. ccxt/static_dependencies/ethereum/abi/__init__.py +16 -0
  498. ccxt/static_dependencies/ethereum/abi/abi.py +19 -0
  499. ccxt/static_dependencies/ethereum/abi/base.py +152 -0
  500. ccxt/static_dependencies/ethereum/abi/codec.py +217 -0
  501. ccxt/static_dependencies/ethereum/abi/constants.py +3 -0
  502. ccxt/static_dependencies/ethereum/abi/decoding.py +565 -0
  503. ccxt/static_dependencies/ethereum/abi/encoding.py +720 -0
  504. ccxt/static_dependencies/ethereum/abi/exceptions.py +139 -0
  505. ccxt/static_dependencies/ethereum/abi/grammar.py +443 -0
  506. ccxt/static_dependencies/ethereum/abi/packed.py +13 -0
  507. ccxt/static_dependencies/ethereum/abi/py.typed +0 -0
  508. ccxt/static_dependencies/ethereum/abi/registry.py +643 -0
  509. ccxt/static_dependencies/ethereum/abi/tools/__init__.py +3 -0
  510. ccxt/static_dependencies/ethereum/abi/tools/_strategies.py +230 -0
  511. ccxt/static_dependencies/ethereum/abi/utils/__init__.py +0 -0
  512. ccxt/static_dependencies/ethereum/abi/utils/numeric.py +83 -0
  513. ccxt/static_dependencies/ethereum/abi/utils/padding.py +27 -0
  514. ccxt/static_dependencies/ethereum/abi/utils/string.py +19 -0
  515. ccxt/static_dependencies/ethereum/account/__init__.py +3 -0
  516. ccxt/static_dependencies/ethereum/account/encode_typed_data/__init__.py +4 -0
  517. ccxt/static_dependencies/ethereum/account/encode_typed_data/encoding_and_hashing.py +239 -0
  518. ccxt/static_dependencies/ethereum/account/encode_typed_data/helpers.py +40 -0
  519. ccxt/static_dependencies/ethereum/account/messages.py +263 -0
  520. ccxt/static_dependencies/ethereum/account/py.typed +0 -0
  521. ccxt/static_dependencies/ethereum/hexbytes/__init__.py +5 -0
  522. ccxt/static_dependencies/ethereum/hexbytes/_utils.py +54 -0
  523. ccxt/static_dependencies/ethereum/hexbytes/main.py +65 -0
  524. ccxt/static_dependencies/ethereum/hexbytes/py.typed +0 -0
  525. ccxt/static_dependencies/ethereum/typing/__init__.py +63 -0
  526. ccxt/static_dependencies/ethereum/typing/abi.py +6 -0
  527. ccxt/static_dependencies/ethereum/typing/bls.py +7 -0
  528. ccxt/static_dependencies/ethereum/typing/discovery.py +5 -0
  529. ccxt/static_dependencies/ethereum/typing/encoding.py +7 -0
  530. ccxt/static_dependencies/ethereum/typing/enums.py +17 -0
  531. ccxt/static_dependencies/ethereum/typing/ethpm.py +9 -0
  532. ccxt/static_dependencies/ethereum/typing/evm.py +20 -0
  533. ccxt/static_dependencies/ethereum/typing/networks.py +1122 -0
  534. ccxt/static_dependencies/ethereum/typing/py.typed +0 -0
  535. ccxt/static_dependencies/ethereum/utils/__init__.py +115 -0
  536. ccxt/static_dependencies/ethereum/utils/abi.py +72 -0
  537. ccxt/static_dependencies/ethereum/utils/address.py +171 -0
  538. ccxt/static_dependencies/ethereum/utils/applicators.py +151 -0
  539. ccxt/static_dependencies/ethereum/utils/conversions.py +190 -0
  540. ccxt/static_dependencies/ethereum/utils/currency.py +107 -0
  541. ccxt/static_dependencies/ethereum/utils/curried/__init__.py +269 -0
  542. ccxt/static_dependencies/ethereum/utils/debug.py +20 -0
  543. ccxt/static_dependencies/ethereum/utils/decorators.py +132 -0
  544. ccxt/static_dependencies/ethereum/utils/encoding.py +6 -0
  545. ccxt/static_dependencies/ethereum/utils/exceptions.py +4 -0
  546. ccxt/static_dependencies/ethereum/utils/functional.py +75 -0
  547. ccxt/static_dependencies/ethereum/utils/hexadecimal.py +74 -0
  548. ccxt/static_dependencies/ethereum/utils/humanize.py +188 -0
  549. ccxt/static_dependencies/ethereum/utils/logging.py +159 -0
  550. ccxt/static_dependencies/ethereum/utils/module_loading.py +31 -0
  551. ccxt/static_dependencies/ethereum/utils/numeric.py +43 -0
  552. ccxt/static_dependencies/ethereum/utils/py.typed +0 -0
  553. ccxt/static_dependencies/ethereum/utils/toolz.py +76 -0
  554. ccxt/static_dependencies/ethereum/utils/types.py +54 -0
  555. ccxt/static_dependencies/ethereum/utils/typing/__init__.py +18 -0
  556. ccxt/static_dependencies/ethereum/utils/typing/misc.py +14 -0
  557. ccxt/static_dependencies/ethereum/utils/units.py +31 -0
  558. ccxt/static_dependencies/keccak/__init__.py +3 -0
  559. ccxt/static_dependencies/keccak/keccak.py +197 -0
  560. ccxt/static_dependencies/lark/__init__.py +38 -0
  561. ccxt/static_dependencies/lark/__pyinstaller/__init__.py +6 -0
  562. ccxt/static_dependencies/lark/__pyinstaller/hook-lark.py +14 -0
  563. ccxt/static_dependencies/lark/ast_utils.py +59 -0
  564. ccxt/static_dependencies/lark/common.py +86 -0
  565. ccxt/static_dependencies/lark/exceptions.py +292 -0
  566. ccxt/static_dependencies/lark/grammar.py +130 -0
  567. ccxt/static_dependencies/lark/grammars/__init__.py +0 -0
  568. ccxt/static_dependencies/lark/indenter.py +143 -0
  569. ccxt/static_dependencies/lark/lark.py +658 -0
  570. ccxt/static_dependencies/lark/lexer.py +678 -0
  571. ccxt/static_dependencies/lark/load_grammar.py +1428 -0
  572. ccxt/static_dependencies/lark/parse_tree_builder.py +391 -0
  573. ccxt/static_dependencies/lark/parser_frontends.py +257 -0
  574. ccxt/static_dependencies/lark/parsers/__init__.py +0 -0
  575. ccxt/static_dependencies/lark/parsers/cyk.py +340 -0
  576. ccxt/static_dependencies/lark/parsers/earley.py +314 -0
  577. ccxt/static_dependencies/lark/parsers/earley_common.py +42 -0
  578. ccxt/static_dependencies/lark/parsers/earley_forest.py +801 -0
  579. ccxt/static_dependencies/lark/parsers/grammar_analysis.py +203 -0
  580. ccxt/static_dependencies/lark/parsers/lalr_analysis.py +332 -0
  581. ccxt/static_dependencies/lark/parsers/lalr_interactive_parser.py +158 -0
  582. ccxt/static_dependencies/lark/parsers/lalr_parser.py +122 -0
  583. ccxt/static_dependencies/lark/parsers/lalr_parser_state.py +110 -0
  584. ccxt/static_dependencies/lark/parsers/xearley.py +165 -0
  585. ccxt/static_dependencies/lark/reconstruct.py +107 -0
  586. ccxt/static_dependencies/lark/tools/__init__.py +70 -0
  587. ccxt/static_dependencies/lark/tools/nearley.py +202 -0
  588. ccxt/static_dependencies/lark/tools/serialize.py +32 -0
  589. ccxt/static_dependencies/lark/tools/standalone.py +196 -0
  590. ccxt/static_dependencies/lark/tree.py +267 -0
  591. ccxt/static_dependencies/lark/tree_matcher.py +186 -0
  592. ccxt/static_dependencies/lark/tree_templates.py +180 -0
  593. ccxt/static_dependencies/lark/utils.py +343 -0
  594. ccxt/static_dependencies/lark/visitors.py +596 -0
  595. ccxt/static_dependencies/marshmallow/__init__.py +81 -0
  596. ccxt/static_dependencies/marshmallow/base.py +65 -0
  597. ccxt/static_dependencies/marshmallow/class_registry.py +94 -0
  598. ccxt/static_dependencies/marshmallow/decorators.py +231 -0
  599. ccxt/static_dependencies/marshmallow/error_store.py +60 -0
  600. ccxt/static_dependencies/marshmallow/exceptions.py +71 -0
  601. ccxt/static_dependencies/marshmallow/fields.py +2114 -0
  602. ccxt/static_dependencies/marshmallow/orderedset.py +89 -0
  603. ccxt/static_dependencies/marshmallow/schema.py +1228 -0
  604. ccxt/static_dependencies/marshmallow/types.py +12 -0
  605. ccxt/static_dependencies/marshmallow/utils.py +378 -0
  606. ccxt/static_dependencies/marshmallow/validate.py +678 -0
  607. ccxt/static_dependencies/marshmallow/warnings.py +2 -0
  608. ccxt/static_dependencies/marshmallow_dataclass/__init__.py +1047 -0
  609. ccxt/static_dependencies/marshmallow_dataclass/collection_field.py +51 -0
  610. ccxt/static_dependencies/marshmallow_dataclass/lazy_class_attribute.py +45 -0
  611. ccxt/static_dependencies/marshmallow_dataclass/mypy.py +71 -0
  612. ccxt/static_dependencies/marshmallow_dataclass/typing.py +14 -0
  613. ccxt/static_dependencies/marshmallow_dataclass/union_field.py +82 -0
  614. ccxt/static_dependencies/marshmallow_oneofschema/__init__.py +1 -0
  615. ccxt/static_dependencies/marshmallow_oneofschema/one_of_schema.py +193 -0
  616. ccxt/static_dependencies/msgpack/__init__.py +55 -0
  617. ccxt/static_dependencies/msgpack/exceptions.py +48 -0
  618. ccxt/static_dependencies/msgpack/ext.py +168 -0
  619. ccxt/static_dependencies/msgpack/fallback.py +951 -0
  620. ccxt/static_dependencies/parsimonious/__init__.py +10 -0
  621. ccxt/static_dependencies/parsimonious/exceptions.py +105 -0
  622. ccxt/static_dependencies/parsimonious/expressions.py +479 -0
  623. ccxt/static_dependencies/parsimonious/grammar.py +487 -0
  624. ccxt/static_dependencies/parsimonious/nodes.py +325 -0
  625. ccxt/static_dependencies/parsimonious/utils.py +40 -0
  626. ccxt/static_dependencies/starknet/__init__.py +0 -0
  627. ccxt/static_dependencies/starknet/cairo/__init__.py +0 -0
  628. ccxt/static_dependencies/starknet/cairo/data_types.py +123 -0
  629. ccxt/static_dependencies/starknet/cairo/deprecated_parse/__init__.py +0 -0
  630. ccxt/static_dependencies/starknet/cairo/deprecated_parse/cairo_types.py +77 -0
  631. ccxt/static_dependencies/starknet/cairo/deprecated_parse/parser.py +46 -0
  632. ccxt/static_dependencies/starknet/cairo/deprecated_parse/parser_transformer.py +138 -0
  633. ccxt/static_dependencies/starknet/cairo/felt.py +64 -0
  634. ccxt/static_dependencies/starknet/cairo/type_parser.py +121 -0
  635. ccxt/static_dependencies/starknet/cairo/v1/__init__.py +0 -0
  636. ccxt/static_dependencies/starknet/cairo/v1/type_parser.py +59 -0
  637. ccxt/static_dependencies/starknet/cairo/v2/__init__.py +0 -0
  638. ccxt/static_dependencies/starknet/cairo/v2/type_parser.py +77 -0
  639. ccxt/static_dependencies/starknet/ccxt_utils.py +7 -0
  640. ccxt/static_dependencies/starknet/common.py +15 -0
  641. ccxt/static_dependencies/starknet/constants.py +39 -0
  642. ccxt/static_dependencies/starknet/hash/__init__.py +0 -0
  643. ccxt/static_dependencies/starknet/hash/address.py +79 -0
  644. ccxt/static_dependencies/starknet/hash/compiled_class_hash_objects.py +111 -0
  645. ccxt/static_dependencies/starknet/hash/selector.py +16 -0
  646. ccxt/static_dependencies/starknet/hash/storage.py +12 -0
  647. ccxt/static_dependencies/starknet/hash/utils.py +78 -0
  648. ccxt/static_dependencies/starknet/models/__init__.py +0 -0
  649. ccxt/static_dependencies/starknet/models/typed_data.py +45 -0
  650. ccxt/static_dependencies/starknet/serialization/__init__.py +24 -0
  651. ccxt/static_dependencies/starknet/serialization/_calldata_reader.py +40 -0
  652. ccxt/static_dependencies/starknet/serialization/_context.py +142 -0
  653. ccxt/static_dependencies/starknet/serialization/data_serializers/__init__.py +10 -0
  654. ccxt/static_dependencies/starknet/serialization/data_serializers/_common.py +82 -0
  655. ccxt/static_dependencies/starknet/serialization/data_serializers/array_serializer.py +43 -0
  656. ccxt/static_dependencies/starknet/serialization/data_serializers/bool_serializer.py +37 -0
  657. ccxt/static_dependencies/starknet/serialization/data_serializers/byte_array_serializer.py +66 -0
  658. ccxt/static_dependencies/starknet/serialization/data_serializers/cairo_data_serializer.py +71 -0
  659. ccxt/static_dependencies/starknet/serialization/data_serializers/enum_serializer.py +71 -0
  660. ccxt/static_dependencies/starknet/serialization/data_serializers/felt_serializer.py +50 -0
  661. ccxt/static_dependencies/starknet/serialization/data_serializers/named_tuple_serializer.py +58 -0
  662. ccxt/static_dependencies/starknet/serialization/data_serializers/option_serializer.py +43 -0
  663. ccxt/static_dependencies/starknet/serialization/data_serializers/output_serializer.py +40 -0
  664. ccxt/static_dependencies/starknet/serialization/data_serializers/payload_serializer.py +72 -0
  665. ccxt/static_dependencies/starknet/serialization/data_serializers/struct_serializer.py +36 -0
  666. ccxt/static_dependencies/starknet/serialization/data_serializers/tuple_serializer.py +36 -0
  667. ccxt/static_dependencies/starknet/serialization/data_serializers/uint256_serializer.py +76 -0
  668. ccxt/static_dependencies/starknet/serialization/data_serializers/uint_serializer.py +100 -0
  669. ccxt/static_dependencies/starknet/serialization/data_serializers/unit_serializer.py +32 -0
  670. ccxt/static_dependencies/starknet/serialization/errors.py +10 -0
  671. ccxt/static_dependencies/starknet/serialization/factory.py +229 -0
  672. ccxt/static_dependencies/starknet/serialization/function_serialization_adapter.py +110 -0
  673. ccxt/static_dependencies/starknet/serialization/tuple_dataclass.py +59 -0
  674. ccxt/static_dependencies/starknet/utils/__init__.py +0 -0
  675. ccxt/static_dependencies/starknet/utils/constructor_args_translator.py +86 -0
  676. ccxt/static_dependencies/starknet/utils/iterable.py +13 -0
  677. ccxt/static_dependencies/starknet/utils/schema.py +13 -0
  678. ccxt/static_dependencies/starknet/utils/typed_data.py +182 -0
  679. ccxt/static_dependencies/starkware/__init__.py +0 -0
  680. ccxt/static_dependencies/starkware/crypto/__init__.py +0 -0
  681. ccxt/static_dependencies/starkware/crypto/fast_pedersen_hash.py +50 -0
  682. ccxt/static_dependencies/starkware/crypto/math_utils.py +78 -0
  683. ccxt/static_dependencies/starkware/crypto/signature.py +2344 -0
  684. ccxt/static_dependencies/starkware/crypto/utils.py +63 -0
  685. ccxt/static_dependencies/sympy/__init__.py +0 -0
  686. ccxt/static_dependencies/sympy/core/__init__.py +0 -0
  687. ccxt/static_dependencies/sympy/core/intfunc.py +35 -0
  688. ccxt/static_dependencies/sympy/external/__init__.py +0 -0
  689. ccxt/static_dependencies/sympy/external/gmpy.py +345 -0
  690. ccxt/static_dependencies/sympy/external/importtools.py +187 -0
  691. ccxt/static_dependencies/sympy/external/ntheory.py +637 -0
  692. ccxt/static_dependencies/sympy/external/pythonmpq.py +341 -0
  693. ccxt/static_dependencies/toolz/__init__.py +26 -0
  694. ccxt/static_dependencies/toolz/_signatures.py +784 -0
  695. ccxt/static_dependencies/toolz/_version.py +520 -0
  696. ccxt/static_dependencies/toolz/compatibility.py +30 -0
  697. ccxt/static_dependencies/toolz/curried/__init__.py +101 -0
  698. ccxt/static_dependencies/toolz/curried/exceptions.py +22 -0
  699. ccxt/static_dependencies/toolz/curried/operator.py +22 -0
  700. ccxt/static_dependencies/toolz/dicttoolz.py +339 -0
  701. ccxt/static_dependencies/toolz/functoolz.py +1049 -0
  702. ccxt/static_dependencies/toolz/itertoolz.py +1057 -0
  703. ccxt/static_dependencies/toolz/recipes.py +46 -0
  704. ccxt/static_dependencies/toolz/utils.py +9 -0
  705. ccxt/static_dependencies/typing_inspect/__init__.py +0 -0
  706. ccxt/static_dependencies/typing_inspect/typing_inspect.py +851 -0
  707. ccxt/tabdeal.py +364 -0
  708. ccxt/test/__init__.py +3 -0
  709. ccxt/test/base/__init__.py +29 -0
  710. ccxt/test/base/test_account.py +26 -0
  711. ccxt/test/base/test_balance.py +56 -0
  712. ccxt/test/base/test_borrow_interest.py +35 -0
  713. ccxt/test/base/test_borrow_rate.py +32 -0
  714. ccxt/test/base/test_calculate_fee.py +51 -0
  715. ccxt/test/base/test_crypto.py +127 -0
  716. ccxt/test/base/test_currency.py +76 -0
  717. ccxt/test/base/test_datetime.py +109 -0
  718. ccxt/test/base/test_decimal_to_precision.py +392 -0
  719. ccxt/test/base/test_deep_extend.py +68 -0
  720. ccxt/test/base/test_deposit_withdrawal.py +50 -0
  721. ccxt/test/base/test_exchange_datetime_functions.py +76 -0
  722. ccxt/test/base/test_funding_rate_history.py +29 -0
  723. ccxt/test/base/test_last_price.py +31 -0
  724. ccxt/test/base/test_ledger_entry.py +45 -0
  725. ccxt/test/base/test_ledger_item.py +48 -0
  726. ccxt/test/base/test_leverage_tier.py +33 -0
  727. ccxt/test/base/test_liquidation.py +50 -0
  728. ccxt/test/base/test_margin_mode.py +24 -0
  729. ccxt/test/base/test_margin_modification.py +35 -0
  730. ccxt/test/base/test_market.py +193 -0
  731. ccxt/test/base/test_number.py +411 -0
  732. ccxt/test/base/test_ohlcv.py +33 -0
  733. ccxt/test/base/test_open_interest.py +32 -0
  734. ccxt/test/base/test_order.py +64 -0
  735. ccxt/test/base/test_order_book.py +69 -0
  736. ccxt/test/base/test_position.py +60 -0
  737. ccxt/test/base/test_shared_methods.py +353 -0
  738. ccxt/test/base/test_status.py +24 -0
  739. ccxt/test/base/test_throttle.py +126 -0
  740. ccxt/test/base/test_ticker.py +92 -0
  741. ccxt/test/base/test_trade.py +47 -0
  742. ccxt/test/base/test_trading_fee.py +26 -0
  743. ccxt/test/base/test_transaction.py +39 -0
  744. ccxt/test/test_async.py +1649 -0
  745. ccxt/test/test_sync.py +1648 -0
  746. ccxt/test/tests_async.py +1558 -0
  747. ccxt/test/tests_helpers.py +287 -0
  748. ccxt/test/tests_init.py +39 -0
  749. ccxt/test/tests_sync.py +1555 -0
  750. ccxt/tetherland.py +349 -0
  751. ccxt/timex.py +1593 -0
  752. ccxt/tokocrypto.py +2405 -0
  753. ccxt/tradeogre.py +608 -0
  754. ccxt/twox.py +326 -0
  755. ccxt/ubitex.py +409 -0
  756. ccxt/upbit.py +1833 -0
  757. ccxt/vertex.py +2922 -0
  758. ccxt/wallex.py +445 -0
  759. ccxt/wavesexchange.py +2472 -0
  760. ccxt/wazirx.py +1224 -0
  761. ccxt/whitebit.py +2469 -0
  762. ccxt/woo.py +3114 -0
  763. ccxt/woofipro.py +2533 -0
  764. ccxt/xt.py +4453 -0
  765. ccxt/yobit.py +1283 -0
  766. ccxt/zaif.py +725 -0
  767. ccxt/zonda.py +1828 -0
  768. ccxt_ir-4.3.46.0.1.dist-info/LICENSE.txt +21 -0
  769. ccxt_ir-4.3.46.0.1.dist-info/METADATA +655 -0
  770. ccxt_ir-4.3.46.0.1.dist-info/RECORD +772 -0
  771. ccxt_ir-4.3.46.0.1.dist-info/WHEEL +6 -0
  772. ccxt_ir-4.3.46.0.1.dist-info/top_level.txt +1 -0
@@ -0,0 +1,1083 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ # PLEASE DO NOT EDIT THIS FILE, IT IS GENERATED AND WILL BE OVERWRITTEN:
4
+ # https://github.com/ccxt/ccxt/blob/master/CONTRIBUTING.md#how-to-contribute-code
5
+
6
+ from ccxt.async_support.base.exchange import Exchange
7
+ from ccxt.abstract.alpaca import ImplicitAPI
8
+ from ccxt.base.types import Int, Market, Num, Order, OrderBook, OrderSide, OrderType, Str, Trade
9
+ from typing import List
10
+ from ccxt.base.errors import ExchangeError
11
+ from ccxt.base.errors import PermissionDenied
12
+ from ccxt.base.errors import BadRequest
13
+ from ccxt.base.errors import BadSymbol
14
+ from ccxt.base.errors import InsufficientFunds
15
+ from ccxt.base.errors import InvalidOrder
16
+ from ccxt.base.errors import NotSupported
17
+ from ccxt.base.errors import RateLimitExceeded
18
+ from ccxt.base.decimal_to_precision import TICK_SIZE
19
+
20
+
21
+ class alpaca(Exchange, ImplicitAPI):
22
+
23
+ def describe(self):
24
+ return self.deep_extend(super(alpaca, self).describe(), {
25
+ 'id': 'alpaca',
26
+ 'name': 'Alpaca',
27
+ 'countries': ['US'],
28
+ # 3 req/s for free
29
+ # 150 req/s for subscribers: https://alpaca.markets/data
30
+ # for brokers: https://alpaca.markets/docs/api-references/broker-api/#authentication-and-rate-limit
31
+ 'rateLimit': 333,
32
+ 'hostname': 'alpaca.markets',
33
+ 'pro': True,
34
+ 'urls': {
35
+ 'logo': 'https://user-images.githubusercontent.com/1294454/187234005-b864db3d-f1e3-447a-aaf9-a9fc7b955d07.jpg',
36
+ 'www': 'https://alpaca.markets',
37
+ 'api': {
38
+ 'broker': 'https://broker-api.{hostname}',
39
+ 'trader': 'https://api.{hostname}',
40
+ 'market': 'https://data.{hostname}',
41
+ },
42
+ 'test': {
43
+ 'broker': 'https://broker-api.sandbox.{hostname}',
44
+ 'trader': 'https://paper-api.{hostname}',
45
+ 'market': 'https://data.sandbox.{hostname}',
46
+ },
47
+ 'doc': 'https://alpaca.markets/docs/',
48
+ 'fees': 'https://docs.alpaca.markets/docs/crypto-fees',
49
+ },
50
+ 'has': {
51
+ 'CORS': False,
52
+ 'spot': True,
53
+ 'margin': False,
54
+ 'swap': False,
55
+ 'future': False,
56
+ 'option': False,
57
+ 'cancelAllOrders': True,
58
+ 'cancelOrder': True,
59
+ 'closeAllPositions': False,
60
+ 'closePosition': False,
61
+ 'createOrder': True,
62
+ 'fetchBalance': False,
63
+ 'fetchBidsAsks': False,
64
+ 'fetchClosedOrders': True,
65
+ 'fetchCurrencies': False,
66
+ 'fetchDepositAddress': False,
67
+ 'fetchDepositAddressesByNetwork': False,
68
+ 'fetchDeposits': False,
69
+ 'fetchDepositsWithdrawals': False,
70
+ 'fetchFundingHistory': False,
71
+ 'fetchFundingRate': False,
72
+ 'fetchFundingRates': False,
73
+ 'fetchL1OrderBook': True,
74
+ 'fetchL2OrderBook': False,
75
+ 'fetchMarkets': True,
76
+ 'fetchMyTrades': False,
77
+ 'fetchOHLCV': True,
78
+ 'fetchOpenOrder': False,
79
+ 'fetchOpenOrders': True,
80
+ 'fetchOrder': True,
81
+ 'fetchOrderBook': True,
82
+ 'fetchOrders': True,
83
+ 'fetchPosition': False,
84
+ 'fetchPositionHistory': False,
85
+ 'fetchPositionMode': False,
86
+ 'fetchPositions': False,
87
+ 'fetchPositionsForSymbol': False,
88
+ 'fetchPositionsHistory': False,
89
+ 'fetchPositionsRisk': False,
90
+ 'fetchStatus': False,
91
+ 'fetchTicker': False,
92
+ 'fetchTickers': False,
93
+ 'fetchTime': True,
94
+ 'fetchTrades': True,
95
+ 'fetchTradingFee': False,
96
+ 'fetchTradingFees': False,
97
+ 'fetchTransactionFees': False,
98
+ 'fetchTransactions': False,
99
+ 'fetchTransfers': False,
100
+ 'fetchWithdrawals': False,
101
+ 'sandbox': True,
102
+ 'setLeverage': False,
103
+ 'setMarginMode': False,
104
+ 'transfer': False,
105
+ 'withdraw': False,
106
+ },
107
+ 'api': {
108
+ 'broker': {
109
+ },
110
+ 'trader': {
111
+ 'private': {
112
+ 'get': [
113
+ 'v2/account',
114
+ 'v2/orders',
115
+ 'v2/orders/{order_id}',
116
+ 'v2/positions',
117
+ 'v2/positions/{symbol_or_asset_id}',
118
+ 'v2/account/portfolio/history',
119
+ 'v2/watchlists',
120
+ 'v2/watchlists/{watchlist_id}',
121
+ 'v2/watchlists:by_name',
122
+ 'v2/account/configurations',
123
+ 'v2/account/activities',
124
+ 'v2/account/activities/{activity_type}',
125
+ 'v2/calendar',
126
+ 'v2/clock',
127
+ 'v2/assets',
128
+ 'v2/assets/{symbol_or_asset_id}',
129
+ 'v2/corporate_actions/announcements/{id}',
130
+ 'v2/corporate_actions/announcements',
131
+ ],
132
+ 'post': [
133
+ 'v2/orders',
134
+ 'v2/watchlists',
135
+ 'v2/watchlists/{watchlist_id}',
136
+ 'v2/watchlists:by_name',
137
+ ],
138
+ 'put': [
139
+ 'v2/watchlists/{watchlist_id}',
140
+ 'v2/watchlists:by_name',
141
+ ],
142
+ 'patch': [
143
+ 'v2/orders/{order_id}',
144
+ 'v2/account/configurations',
145
+ ],
146
+ 'delete': [
147
+ 'v2/orders',
148
+ 'v2/orders/{order_id}',
149
+ 'v2/positions',
150
+ 'v2/positions/{symbol_or_asset_id}',
151
+ 'v2/watchlists/{watchlist_id}',
152
+ 'v2/watchlists:by_name',
153
+ 'v2/watchlists/{watchlist_id}/{symbol}',
154
+ ],
155
+ },
156
+ },
157
+ 'market': {
158
+ 'public': {
159
+ 'get': [
160
+ 'v1beta3/crypto/{loc}/bars',
161
+ 'v1beta3/crypto/{loc}/latest/bars',
162
+ 'v1beta3/crypto/{loc}/latest/orderbooks',
163
+ 'v1beta3/crypto/{loc}/latest/quotes',
164
+ 'v1beta3/crypto/{loc}/latest/trades',
165
+ 'v1beta3/crypto/{loc}/quotes',
166
+ 'v1beta3/crypto/{loc}/snapshots',
167
+ 'v1beta3/crypto/{loc}/trades',
168
+ ],
169
+ },
170
+ 'private': {
171
+ 'get': [
172
+ 'v1beta1/corporate-actions',
173
+ 'v1beta1/forex/latest/rates',
174
+ 'v1beta1/forex/rates',
175
+ 'v1beta1/logos/{symbol}',
176
+ 'v1beta1/news',
177
+ 'v1beta1/screener/stocks/most-actives',
178
+ 'v1beta1/screener/{market_type}/movers',
179
+ 'v2/stocks/auctions',
180
+ 'v2/stocks/bars',
181
+ 'v2/stocks/bars/latest',
182
+ 'v2/stocks/meta/conditions/{ticktype}',
183
+ 'v2/stocks/meta/exchanges',
184
+ 'v2/stocks/quotes',
185
+ 'v2/stocks/quotes/latest',
186
+ 'v2/stocks/snapshots',
187
+ 'v2/stocks/trades',
188
+ 'v2/stocks/trades/latest',
189
+ 'v2/stocks/{symbol}/auctions',
190
+ 'v2/stocks/{symbol}/bars',
191
+ 'v2/stocks/{symbol}/bars/latest',
192
+ 'v2/stocks/{symbol}/quotes',
193
+ 'v2/stocks/{symbol}/quotes/latest',
194
+ 'v2/stocks/{symbol}/snapshot',
195
+ 'v2/stocks/{symbol}/trades',
196
+ 'v2/stocks/{symbol}/trades/latest',
197
+ ],
198
+ },
199
+ },
200
+ },
201
+ 'timeframes': {
202
+ '1m': '1min',
203
+ '3m': '3min',
204
+ '5m': '5min',
205
+ '15m': '15min',
206
+ '30m': '30min',
207
+ '1h': '1H',
208
+ '2h': '2H',
209
+ '4h': '4H',
210
+ '6h': '6H',
211
+ '8h': '8H',
212
+ '12h': '12H',
213
+ '1d': '1D',
214
+ '3d': '3D',
215
+ '1w': '1W',
216
+ '1M': '1M',
217
+ },
218
+ 'precisionMode': TICK_SIZE,
219
+ 'requiredCredentials': {
220
+ 'apiKey': True,
221
+ 'secret': True,
222
+ },
223
+ 'fees': {
224
+ 'trading': {
225
+ 'tierBased': True,
226
+ 'percentage': True,
227
+ 'maker': self.parse_number('0.0015'),
228
+ 'taker': self.parse_number('0.0025'),
229
+ 'tiers': {
230
+ 'taker': [
231
+ [self.parse_number('0'), self.parse_number('0.0025')],
232
+ [self.parse_number('100000'), self.parse_number('0.0022')],
233
+ [self.parse_number('500000'), self.parse_number('0.0020')],
234
+ [self.parse_number('1000000'), self.parse_number('0.0018')],
235
+ [self.parse_number('10000000'), self.parse_number('0.0015')],
236
+ [self.parse_number('25000000'), self.parse_number('0.0013')],
237
+ [self.parse_number('50000000'), self.parse_number('0.0012')],
238
+ [self.parse_number('100000000'), self.parse_number('0.001')],
239
+ ],
240
+ 'maker': [
241
+ [self.parse_number('0'), self.parse_number('0.0015')],
242
+ [self.parse_number('100000'), self.parse_number('0.0012')],
243
+ [self.parse_number('500000'), self.parse_number('0.001')],
244
+ [self.parse_number('1000000'), self.parse_number('0.0008')],
245
+ [self.parse_number('10000000'), self.parse_number('0.0005')],
246
+ [self.parse_number('25000000'), self.parse_number('0.0002')],
247
+ [self.parse_number('50000000'), self.parse_number('0.0002')],
248
+ [self.parse_number('100000000'), self.parse_number('0.00')],
249
+ ],
250
+ },
251
+ },
252
+ },
253
+ 'headers': {
254
+ 'APCA-PARTNER-ID': 'ccxt',
255
+ },
256
+ 'options': {
257
+ 'defaultExchange': 'CBSE',
258
+ 'exchanges': [
259
+ 'CBSE', # Coinbase
260
+ 'FTX', # FTXUS
261
+ 'GNSS', # Genesis
262
+ 'ERSX', # ErisX
263
+ ],
264
+ 'defaultTimeInForce': 'gtc', # fok, gtc, ioc
265
+ 'clientOrderId': 'ccxt_{id}',
266
+ },
267
+ 'exceptions': {
268
+ 'exact': {
269
+ 'forbidden.': PermissionDenied, # {"message": "forbidden."}
270
+ '40410000': InvalidOrder, # {"code": 40410000, "message": "order is not found."}
271
+ '40010001': BadRequest, # {"code":40010001,"message":"invalid order type for crypto order"}
272
+ '40110000': PermissionDenied, # {"code": 40110000, "message": "request is not authorized"}
273
+ '40310000': InsufficientFunds, # {"available":"0","balance":"0","code":40310000,"message":"insufficient balance for USDT(requested: 221.63, available: 0)","symbol":"USDT"}
274
+ '42910000': RateLimitExceeded, # {"code":42910000,"message":"rate limit exceeded"}
275
+ },
276
+ 'broad': {
277
+ 'Invalid format for parameter': BadRequest, # {"message":"Invalid format for parameter start: error parsing '0' or 2006-01-02 time: parsing time \"0\" as \"2006-01-02\": cannot parse \"0\" as \"2006\""}
278
+ 'Invalid symbol': BadSymbol, # {"message":"Invalid symbol(s): BTC/USDdsda does not match ^[A-Z]+/[A-Z]+$"}
279
+ },
280
+ },
281
+ })
282
+
283
+ async def fetch_time(self, params={}):
284
+ """
285
+ fetches the current integer timestamp in milliseconds from the exchange server
286
+ :param dict [params]: extra parameters specific to the exchange API endpoint
287
+ :returns int: the current integer timestamp in milliseconds from the exchange server
288
+ """
289
+ response = await self.traderPrivateGetV2Clock(params)
290
+ #
291
+ # {
292
+ # timestamp: '2023-11-22T08:07:57.654738097-05:00',
293
+ # is_open: False,
294
+ # next_open: '2023-11-22T09:30:00-05:00',
295
+ # next_close: '2023-11-22T16:00:00-05:00'
296
+ # }
297
+ #
298
+ timestamp = self.safe_string(response, 'timestamp')
299
+ localTime = timestamp[0:23]
300
+ jetlagStrStart = len(timestamp) - 6
301
+ jetlagStrEnd = len(timestamp) - 3
302
+ jetlag = timestamp[jetlagStrStart:jetlagStrEnd]
303
+ iso = self.parse8601(localTime) - self.parse_to_numeric(jetlag) * 3600 * 1000
304
+ return iso
305
+
306
+ async def fetch_markets(self, params={}) -> List[Market]:
307
+ """
308
+ retrieves data on all markets for alpaca
309
+ :see: https://docs.alpaca.markets/reference/get-v2-assets
310
+ :param dict [params]: extra parameters specific to the exchange api endpoint
311
+ :returns dict[]: an array of objects representing market data
312
+ """
313
+ request: dict = {
314
+ 'asset_class': 'crypto',
315
+ 'status': 'active',
316
+ }
317
+ assets = await self.traderPrivateGetV2Assets(self.extend(request, params))
318
+ #
319
+ # [
320
+ # {
321
+ # "id": "c150e086-1e75-44e6-9c2c-093bb1e93139",
322
+ # "class": "crypto",
323
+ # "exchange": "CRYPTO",
324
+ # "symbol": "BTC/USDT",
325
+ # "name": "Bitcoin / USD Tether",
326
+ # "status": "active",
327
+ # "tradable": True,
328
+ # "marginable": False,
329
+ # "maintenance_margin_requirement": 100,
330
+ # "shortable": False,
331
+ # "easy_to_borrow": False,
332
+ # "fractionable": True,
333
+ # "attributes": [],
334
+ # "min_order_size": "0.000026873",
335
+ # "min_trade_increment": "0.000000001",
336
+ # "price_increment": "1"
337
+ # }
338
+ # ]
339
+ #
340
+ return self.parse_markets(assets)
341
+
342
+ def parse_market(self, asset) -> Market:
343
+ #
344
+ # {
345
+ # "id": "c150e086-1e75-44e6-9c2c-093bb1e93139",
346
+ # "class": "crypto",
347
+ # "exchange": "CRYPTO",
348
+ # "symbol": "BTC/USDT",
349
+ # "name": "Bitcoin / USD Tether",
350
+ # "status": "active",
351
+ # "tradable": True,
352
+ # "marginable": False,
353
+ # "maintenance_margin_requirement": 100,
354
+ # "shortable": False,
355
+ # "easy_to_borrow": False,
356
+ # "fractionable": True,
357
+ # "attributes": [],
358
+ # "min_order_size": "0.000026873",
359
+ # "min_trade_increment": "0.000000001",
360
+ # "price_increment": "1"
361
+ # }
362
+ #
363
+ marketId = self.safe_string(asset, 'symbol')
364
+ parts = marketId.split('/')
365
+ assetClass = self.safe_string(asset, 'class')
366
+ baseId = self.safe_string(parts, 0)
367
+ quoteId = self.safe_string(parts, 1)
368
+ base = self.safe_currency_code(baseId)
369
+ quote = self.safe_currency_code(quoteId)
370
+ # Us equity markets do not include quote in symbol.
371
+ # We can safely coerce us_equity quote to USD
372
+ if quote is None and assetClass == 'us_equity':
373
+ quote = 'USD'
374
+ symbol = base + '/' + quote
375
+ status = self.safe_string(asset, 'status')
376
+ active = (status == 'active')
377
+ minAmount = self.safe_number(asset, 'min_order_size')
378
+ amount = self.safe_number(asset, 'min_trade_increment')
379
+ price = self.safe_number(asset, 'price_increment')
380
+ return {
381
+ 'id': marketId,
382
+ 'symbol': symbol,
383
+ 'base': base,
384
+ 'quote': quote,
385
+ 'settle': None,
386
+ 'baseId': baseId,
387
+ 'quoteId': quoteId,
388
+ 'settleId': None,
389
+ 'type': 'spot',
390
+ 'spot': True,
391
+ 'margin': None,
392
+ 'swap': False,
393
+ 'future': False,
394
+ 'option': False,
395
+ 'active': active,
396
+ 'contract': False,
397
+ 'linear': None,
398
+ 'inverse': None,
399
+ 'contractSize': None,
400
+ 'expiry': None,
401
+ 'expiryDatetime': None,
402
+ 'strike': None,
403
+ 'optionType': None,
404
+ 'precision': {
405
+ 'amount': amount,
406
+ 'price': price,
407
+ },
408
+ 'limits': {
409
+ 'leverage': {
410
+ 'min': None,
411
+ 'max': None,
412
+ },
413
+ 'amount': {
414
+ 'min': minAmount,
415
+ 'max': None,
416
+ },
417
+ 'price': {
418
+ 'min': None,
419
+ 'max': None,
420
+ },
421
+ 'cost': {
422
+ 'min': None,
423
+ 'max': None,
424
+ },
425
+ },
426
+ 'created': None,
427
+ 'info': asset,
428
+ }
429
+
430
+ async def fetch_trades(self, symbol: str, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
431
+ """
432
+ get the list of most recent trades for a particular symbol
433
+ :see: https://docs.alpaca.markets/reference/cryptotrades
434
+ :see: https://docs.alpaca.markets/reference/cryptolatesttrades
435
+ :param str symbol: unified symbol of the market to fetch trades for
436
+ :param int [since]: timestamp in ms of the earliest trade to fetch
437
+ :param int [limit]: the maximum amount of trades to fetch
438
+ :param dict [params]: extra parameters specific to the exchange API endpoint
439
+ :param str [params.loc]: crypto location, default: us
440
+ :param str [params.method]: method, default: marketPublicGetV1beta3CryptoLocTrades
441
+ :returns Trade[]: a list of `trade structures <https://docs.ccxt.com/#/?id=public-trades>`
442
+ """
443
+ await self.load_markets()
444
+ market = self.market(symbol)
445
+ marketId = market['id']
446
+ loc = self.safe_string(params, 'loc', 'us')
447
+ method = self.safe_string(params, 'method', 'marketPublicGetV1beta3CryptoLocTrades')
448
+ request: dict = {
449
+ 'symbols': marketId,
450
+ 'loc': loc,
451
+ }
452
+ params = self.omit(params, ['loc', 'method'])
453
+ symbolTrades = None
454
+ if method == 'marketPublicGetV1beta3CryptoLocTrades':
455
+ if since is not None:
456
+ request['start'] = self.iso8601(since)
457
+ if limit is not None:
458
+ request['limit'] = limit
459
+ response = await self.marketPublicGetV1beta3CryptoLocTrades(self.extend(request, params))
460
+ #
461
+ # {
462
+ # "next_page_token": null,
463
+ # "trades": {
464
+ # "BTC/USD": [
465
+ # {
466
+ # "i": 36440704,
467
+ # "p": 22625,
468
+ # "s": 0.0001,
469
+ # "t": "2022-07-21T11:47:31.073391Z",
470
+ # "tks": "B"
471
+ # }
472
+ # ]
473
+ # }
474
+ # }
475
+ #
476
+ trades = self.safe_dict(response, 'trades', {})
477
+ symbolTrades = self.safe_list(trades, marketId, [])
478
+ elif method == 'marketPublicGetV1beta3CryptoLocLatestTrades':
479
+ response = await self.marketPublicGetV1beta3CryptoLocLatestTrades(self.extend(request, params))
480
+ #
481
+ # {
482
+ # "trades": {
483
+ # "BTC/USD": {
484
+ # "i": 36440704,
485
+ # "p": 22625,
486
+ # "s": 0.0001,
487
+ # "t": "2022-07-21T11:47:31.073391Z",
488
+ # "tks": "B"
489
+ # }
490
+ # }
491
+ # }
492
+ #
493
+ trades = self.safe_dict(response, 'trades', {})
494
+ symbolTrades = self.safe_dict(trades, marketId, {})
495
+ symbolTrades = [symbolTrades]
496
+ else:
497
+ raise NotSupported(self.id + ' fetchTrades() does not support ' + method + ', marketPublicGetV1beta3CryptoLocTrades and marketPublicGetV1beta3CryptoLocLatestTrades are supported')
498
+ return self.parse_trades(symbolTrades, market, since, limit)
499
+
500
+ async def fetch_order_book(self, symbol: str, limit: Int = None, params={}) -> OrderBook:
501
+ """
502
+ fetches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
503
+ :see: https://docs.alpaca.markets/reference/cryptolatestorderbooks
504
+ :param str symbol: unified symbol of the market to fetch the order book for
505
+ :param int [limit]: the maximum amount of order book entries to return
506
+ :param dict [params]: extra parameters specific to the exchange API endpoint
507
+ :param str [params.loc]: crypto location, default: us
508
+ :returns dict: A dictionary of `order book structures <https://github.com/ccxt/ccxt/wiki/Manual#order-book-structure>` indexed by market symbols
509
+ """
510
+ await self.load_markets()
511
+ market = self.market(symbol)
512
+ id = market['id']
513
+ loc = self.safe_string(params, 'loc', 'us')
514
+ request: dict = {
515
+ 'symbols': id,
516
+ 'loc': loc,
517
+ }
518
+ response = await self.marketPublicGetV1beta3CryptoLocLatestOrderbooks(self.extend(request, params))
519
+ #
520
+ # {
521
+ # "orderbooks":{
522
+ # "BTC/USD":{
523
+ # "a":[
524
+ # {
525
+ # "p":22208,
526
+ # "s":0.0051
527
+ # },
528
+ # {
529
+ # "p":22209,
530
+ # "s":0.1123
531
+ # },
532
+ # {
533
+ # "p":22210,
534
+ # "s":0.2465
535
+ # }
536
+ # ],
537
+ # "b":[
538
+ # {
539
+ # "p":22203,
540
+ # "s":0.395
541
+ # },
542
+ # {
543
+ # "p":22202,
544
+ # "s":0.2465
545
+ # },
546
+ # {
547
+ # "p":22201,
548
+ # "s":0.6455
549
+ # }
550
+ # ],
551
+ # "t":"2022-07-19T13:41:55.13210112Z"
552
+ # }
553
+ # }
554
+ # }
555
+ #
556
+ orderbooks = self.safe_value(response, 'orderbooks', {})
557
+ rawOrderbook = self.safe_value(orderbooks, id, {})
558
+ timestamp = self.parse8601(self.safe_string(rawOrderbook, 't'))
559
+ return self.parse_order_book(rawOrderbook, market['symbol'], timestamp, 'b', 'a', 'p', 's')
560
+
561
+ async def fetch_ohlcv(self, symbol: str, timeframe='1m', since: Int = None, limit: Int = None, params={}) -> List[list]:
562
+ """
563
+ fetches historical candlestick data containing the open, high, low, and close price, and the volume of a market
564
+ :see: https://docs.alpaca.markets/reference/cryptobars
565
+ :see: https://docs.alpaca.markets/reference/cryptolatestbars
566
+ :param str symbol: unified symbol of the market to fetch OHLCV data for
567
+ :param str timeframe: the length of time each candle represents
568
+ :param int [since]: timestamp in ms of the earliest candle to fetch
569
+ :param int [limit]: the maximum amount of candles to fetch
570
+ :param dict [params]: extra parameters specific to the alpha api endpoint
571
+ :param str [params.loc]: crypto location, default: us
572
+ :param str [params.method]: method, default: marketPublicGetV1beta3CryptoLocBars
573
+ :returns int[][]: A list of candles ordered, open, high, low, close, volume
574
+ """
575
+ await self.load_markets()
576
+ market = self.market(symbol)
577
+ marketId = market['id']
578
+ loc = self.safe_string(params, 'loc', 'us')
579
+ method = self.safe_string(params, 'method', 'marketPublicGetV1beta3CryptoLocBars')
580
+ request: dict = {
581
+ 'symbols': marketId,
582
+ 'loc': loc,
583
+ }
584
+ params = self.omit(params, ['loc', 'method'])
585
+ ohlcvs = None
586
+ if method == 'marketPublicGetV1beta3CryptoLocBars':
587
+ if limit is not None:
588
+ request['limit'] = limit
589
+ if since is not None:
590
+ request['start'] = self.yyyymmdd(since)
591
+ request['timeframe'] = self.safe_string(self.timeframes, timeframe, timeframe)
592
+ response = await self.marketPublicGetV1beta3CryptoLocBars(self.extend(request, params))
593
+ #
594
+ # {
595
+ # "bars": {
596
+ # "BTC/USD": [
597
+ # {
598
+ # "c": 22887,
599
+ # "h": 22888,
600
+ # "l": 22873,
601
+ # "n": 11,
602
+ # "o": 22883,
603
+ # "t": "2022-07-21T05:00:00Z",
604
+ # "v": 1.1138,
605
+ # "vw": 22883.0155324116
606
+ # },
607
+ # {
608
+ # "c": 22895,
609
+ # "h": 22895,
610
+ # "l": 22884,
611
+ # "n": 6,
612
+ # "o": 22884,
613
+ # "t": "2022-07-21T05:01:00Z",
614
+ # "v": 0.001,
615
+ # "vw": 22889.5
616
+ # }
617
+ # ]
618
+ # },
619
+ # "next_page_token": "QlRDL1VTRHxNfDIwMjItMDctMjFUMDU6MDE6MDAuMDAwMDAwMDAwWg=="
620
+ # }
621
+ #
622
+ bars = self.safe_dict(response, 'bars', {})
623
+ ohlcvs = self.safe_list(bars, marketId, [])
624
+ elif method == 'marketPublicGetV1beta3CryptoLocLatestBars':
625
+ response = await self.marketPublicGetV1beta3CryptoLocLatestBars(self.extend(request, params))
626
+ #
627
+ # {
628
+ # "bars": {
629
+ # "BTC/USD": {
630
+ # "c": 22887,
631
+ # "h": 22888,
632
+ # "l": 22873,
633
+ # "n": 11,
634
+ # "o": 22883,
635
+ # "t": "2022-07-21T05:00:00Z",
636
+ # "v": 1.1138,
637
+ # "vw": 22883.0155324116
638
+ # }
639
+ # }
640
+ # }
641
+ #
642
+ bars = self.safe_dict(response, 'bars', {})
643
+ ohlcvs = self.safe_dict(bars, marketId, {})
644
+ ohlcvs = [ohlcvs]
645
+ else:
646
+ raise NotSupported(self.id + ' fetchOHLCV() does not support ' + method + ', marketPublicGetV1beta3CryptoLocBars and marketPublicGetV1beta3CryptoLocLatestBars are supported')
647
+ return self.parse_ohlcvs(ohlcvs, market, timeframe, since, limit)
648
+
649
+ def parse_ohlcv(self, ohlcv, market: Market = None) -> list:
650
+ #
651
+ # {
652
+ # "c":22895,
653
+ # "h":22895,
654
+ # "l":22884,
655
+ # "n":6,
656
+ # "o":22884,
657
+ # "t":"2022-07-21T05:01:00Z",
658
+ # "v":0.001,
659
+ # "vw":22889.5
660
+ # }
661
+ #
662
+ datetime = self.safe_string(ohlcv, 't')
663
+ timestamp = self.parse8601(datetime)
664
+ return [
665
+ timestamp, # timestamp
666
+ self.safe_number(ohlcv, 'o'), # open
667
+ self.safe_number(ohlcv, 'h'), # high
668
+ self.safe_number(ohlcv, 'l'), # low
669
+ self.safe_number(ohlcv, 'c'), # close
670
+ self.safe_number(ohlcv, 'v'), # volume
671
+ ]
672
+
673
+ async def create_order(self, symbol: str, type: OrderType, side: OrderSide, amount: float, price: Num = None, params={}):
674
+ """
675
+ create a trade order
676
+ :see: https://docs.alpaca.markets/reference/postorder
677
+ :param str symbol: unified symbol of the market to create an order in
678
+ :param str type: 'market', 'limit' or 'stop_limit'
679
+ :param str side: 'buy' or 'sell'
680
+ :param float amount: how much of currency you want to trade in units of base currency
681
+ :param float [price]: the price at which the order is to be fullfilled, in units of the quote currency, ignored in market orders
682
+ :param dict [params]: extra parameters specific to the exchange API endpoint
683
+ :param float [params.triggerPrice]: The price at which a trigger order is triggered at
684
+ :returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
685
+ """
686
+ await self.load_markets()
687
+ market = self.market(symbol)
688
+ id = market['id']
689
+ request: dict = {
690
+ 'symbol': id,
691
+ 'qty': self.amount_to_precision(symbol, amount),
692
+ 'side': side,
693
+ 'type': type, # market, limit, stop_limit
694
+ }
695
+ triggerPrice = self.safe_string_n(params, ['triggerPrice', 'stop_price'])
696
+ if triggerPrice is not None:
697
+ newType = None
698
+ if type.find('limit') >= 0:
699
+ newType = 'stop_limit'
700
+ else:
701
+ raise NotSupported(self.id + ' createOrder() does not support stop orders for ' + type + ' orders, only stop_limit orders are supported')
702
+ request['stop_price'] = self.price_to_precision(symbol, triggerPrice)
703
+ request['type'] = newType
704
+ if type.find('limit') >= 0:
705
+ request['limit_price'] = self.price_to_precision(symbol, price)
706
+ defaultTIF = self.safe_string(self.options, 'defaultTimeInForce')
707
+ request['time_in_force'] = self.safe_string(params, 'timeInForce', defaultTIF)
708
+ params = self.omit(params, ['timeInForce', 'triggerPrice'])
709
+ clientOrderIdprefix = self.safe_string(self.options, 'clientOrderId')
710
+ uuid = self.uuid()
711
+ parts = uuid.split('-')
712
+ random_id = ''.join(parts)
713
+ defaultClientId = self.implode_params(clientOrderIdprefix, {'id': random_id})
714
+ clientOrderId = self.safe_string(params, 'clientOrderId', defaultClientId)
715
+ request['client_order_id'] = clientOrderId
716
+ params = self.omit(params, ['clientOrderId'])
717
+ order = await self.traderPrivatePostV2Orders(self.extend(request, params))
718
+ #
719
+ # {
720
+ # "id": "61e69015-8549-4bfd-b9c3-01e75843f47d",
721
+ # "client_order_id": "eb9e2aaa-f71a-4f51-b5b4-52a6c565dad4",
722
+ # "created_at": "2021-03-16T18:38:01.942282Z",
723
+ # "updated_at": "2021-03-16T18:38:01.942282Z",
724
+ # "submitted_at": "2021-03-16T18:38:01.937734Z",
725
+ # "filled_at": null,
726
+ # "expired_at": null,
727
+ # "canceled_at": null,
728
+ # "failed_at": null,
729
+ # "replaced_at": null,
730
+ # "replaced_by": null,
731
+ # "replaces": null,
732
+ # "asset_id": "b0b6dd9d-8b9b-48a9-ba46-b9d54906e415",
733
+ # "symbol": "AAPL",
734
+ # "asset_class": "us_equity",
735
+ # "notional": "500",
736
+ # "qty": null,
737
+ # "filled_qty": "0",
738
+ # "filled_avg_price": null,
739
+ # "order_class": "",
740
+ # "order_type": "market",
741
+ # "type": "market",
742
+ # "side": "buy",
743
+ # "time_in_force": "day",
744
+ # "limit_price": null,
745
+ # "stop_price": null,
746
+ # "status": "accepted",
747
+ # "extended_hours": False,
748
+ # "legs": null,
749
+ # "trail_percent": null,
750
+ # "trail_price": null,
751
+ # "hwm": null
752
+ # }
753
+ #
754
+ return self.parse_order(order, market)
755
+
756
+ async def cancel_order(self, id: str, symbol: Str = None, params={}):
757
+ """
758
+ cancels an open order
759
+ :see: https://docs.alpaca.markets/reference/deleteorderbyorderid
760
+ :param str id: order id
761
+ :param str symbol: unified symbol of the market the order was made in
762
+ :param dict [params]: extra parameters specific to the exchange API endpoint
763
+ :returns dict: An `order structure <https://docs.ccxt.com/#/?id=order-structure>`
764
+ """
765
+ request: dict = {
766
+ 'order_id': id,
767
+ }
768
+ response = await self.traderPrivateDeleteV2OrdersOrderId(self.extend(request, params))
769
+ #
770
+ # {
771
+ # "code": 40410000,
772
+ # "message": "order is not found."
773
+ # }
774
+ #
775
+ return self.parse_order(response)
776
+
777
+ async def cancel_all_orders(self, symbol: Str = None, params={}):
778
+ """
779
+ cancel all open orders in a market
780
+ :see: https://docs.alpaca.markets/reference/deleteallorders
781
+ :param str symbol: alpaca cancelAllOrders cannot setting symbol, it will cancel all open orders
782
+ :param dict [params]: extra parameters specific to the exchange API endpoint
783
+ :returns dict[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
784
+ """
785
+ await self.load_markets()
786
+ response = await self.traderPrivateDeleteV2Orders(params)
787
+ if isinstance(response, list):
788
+ return self.parse_orders(response, None)
789
+ else:
790
+ return response
791
+
792
+ async def fetch_order(self, id: str, symbol: Str = None, params={}):
793
+ """
794
+ fetches information on an order made by the user
795
+ :see: https://docs.alpaca.markets/reference/getorderbyorderid
796
+ :param str symbol: unified symbol of the market the order was made in
797
+ :param dict [params]: extra parameters specific to the exchange API endpoint
798
+ :returns dict: An `order structure <https://docs.ccxt.com/#/?id=order-structure>`
799
+ """
800
+ await self.load_markets()
801
+ request: dict = {
802
+ 'order_id': id,
803
+ }
804
+ order = await self.traderPrivateGetV2OrdersOrderId(self.extend(request, params))
805
+ marketId = self.safe_string(order, 'symbol')
806
+ market = self.safe_market(marketId)
807
+ return self.parse_order(order, market)
808
+
809
+ async def fetch_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
810
+ """
811
+ fetches information on multiple orders made by the user
812
+ :see: https://docs.alpaca.markets/reference/getallorders
813
+ :param str symbol: unified market symbol of the market orders were made in
814
+ :param int [since]: the earliest time in ms to fetch orders for
815
+ :param int [limit]: the maximum number of order structures to retrieve
816
+ :param dict [params]: extra parameters specific to the exchange API endpoint
817
+ :param int [params.until]: the latest time in ms to fetch orders for
818
+ :returns Order[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
819
+ """
820
+ await self.load_markets()
821
+ request: dict = {
822
+ 'status': 'all',
823
+ }
824
+ market = None
825
+ if symbol is not None:
826
+ market = self.market(symbol)
827
+ request['symbols'] = market['id']
828
+ until = self.safe_integer(params, 'until')
829
+ if until is not None:
830
+ params = self.omit(params, 'until')
831
+ request['endTime'] = until
832
+ if since is not None:
833
+ request['after'] = since
834
+ if limit is not None:
835
+ request['limit'] = limit
836
+ response = await self.traderPrivateGetV2Orders(self.extend(request, params))
837
+ #
838
+ # [
839
+ # {
840
+ # "id": "cbaf12d7-69b8-49c0-a31b-b46af35c755c",
841
+ # "client_order_id": "ccxt_b36156ae6fd44d098ac9c179bab33efd",
842
+ # "created_at": "2023-11-17T04:21:42.234579Z",
843
+ # "updated_at": "2023-11-17T04:22:34.442765Z",
844
+ # "submitted_at": "2023-11-17T04:21:42.233357Z",
845
+ # "filled_at": null,
846
+ # "expired_at": null,
847
+ # "canceled_at": "2023-11-17T04:22:34.399019Z",
848
+ # "failed_at": null,
849
+ # "replaced_at": null,
850
+ # "replaced_by": null,
851
+ # "replaces": null,
852
+ # "asset_id": "77c6f47f-0939-4b23-b41e-47b4469c4bc8",
853
+ # "symbol": "LTC/USDT",
854
+ # "asset_class": "crypto",
855
+ # "notional": null,
856
+ # "qty": "0.001",
857
+ # "filled_qty": "0",
858
+ # "filled_avg_price": null,
859
+ # "order_class": "",
860
+ # "order_type": "limit",
861
+ # "type": "limit",
862
+ # "side": "sell",
863
+ # "time_in_force": "gtc",
864
+ # "limit_price": "1000",
865
+ # "stop_price": null,
866
+ # "status": "canceled",
867
+ # "extended_hours": False,
868
+ # "legs": null,
869
+ # "trail_percent": null,
870
+ # "trail_price": null,
871
+ # "hwm": null,
872
+ # "subtag": null,
873
+ # "source": "access_key"
874
+ # }
875
+ # ]
876
+ #
877
+ return self.parse_orders(response, market, since, limit)
878
+
879
+ async def fetch_open_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
880
+ """
881
+ fetch all unfilled currently open orders
882
+ :see: https://docs.alpaca.markets/reference/getallorders
883
+ :param str symbol: unified market symbol of the market orders were made in
884
+ :param int [since]: the earliest time in ms to fetch orders for
885
+ :param int [limit]: the maximum number of order structures to retrieve
886
+ :param dict [params]: extra parameters specific to the exchange API endpoint
887
+ :param int [params.until]: the latest time in ms to fetch orders for
888
+ :returns Order[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
889
+ """
890
+ request: dict = {
891
+ 'status': 'open',
892
+ }
893
+ return await self.fetch_orders(symbol, since, limit, self.extend(request, params))
894
+
895
+ async def fetch_closed_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
896
+ """
897
+ fetches information on multiple closed orders made by the user
898
+ :see: https://docs.alpaca.markets/reference/getallorders
899
+ :param str symbol: unified market symbol of the market orders were made in
900
+ :param int [since]: the earliest time in ms to fetch orders for
901
+ :param int [limit]: the maximum number of order structures to retrieve
902
+ :param dict [params]: extra parameters specific to the exchange API endpoint
903
+ :param int [params.until]: the latest time in ms to fetch orders for
904
+ :returns Order[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
905
+ """
906
+ request: dict = {
907
+ 'status': 'closed',
908
+ }
909
+ return await self.fetch_orders(symbol, since, limit, self.extend(request, params))
910
+
911
+ def parse_order(self, order: dict, market: Market = None) -> Order:
912
+ #
913
+ # {
914
+ # "id":"6ecfcc34-4bed-4b53-83ba-c564aa832a81",
915
+ # "client_order_id":"ccxt_1c6ceab0b5e84727b2f1c0394ba17560",
916
+ # "created_at":"2022-06-14T13:59:30.224037068Z",
917
+ # "updated_at":"2022-06-14T13:59:30.224037068Z",
918
+ # "submitted_at":"2022-06-14T13:59:30.221856828Z",
919
+ # "filled_at":null,
920
+ # "expired_at":null,
921
+ # "canceled_at":null,
922
+ # "failed_at":null,
923
+ # "replaced_at":null,
924
+ # "replaced_by":null,
925
+ # "replaces":null,
926
+ # "asset_id":"64bbff51-59d6-4b3c-9351-13ad85e3c752",
927
+ # "symbol":"BTCUSD",
928
+ # "asset_class":"crypto",
929
+ # "notional":null,
930
+ # "qty":"0.01",
931
+ # "filled_qty":"0",
932
+ # "filled_avg_price":null,
933
+ # "order_class":"",
934
+ # "order_type":"limit",
935
+ # "type":"limit",
936
+ # "side":"buy",
937
+ # "time_in_force":"day",
938
+ # "limit_price":"14000",
939
+ # "stop_price":null,
940
+ # "status":"accepted",
941
+ # "extended_hours":false,
942
+ # "legs":null,
943
+ # "trail_percent":null,
944
+ # "trail_price":null,
945
+ # "hwm":null,
946
+ # "commission":"0.42",
947
+ # "source":null
948
+ # }
949
+ #
950
+ marketId = self.safe_string(order, 'symbol')
951
+ market = self.safe_market(marketId, market)
952
+ symbol = market['symbol']
953
+ alpacaStatus = self.safe_string(order, 'status')
954
+ status = self.parse_order_status(alpacaStatus)
955
+ feeValue = self.safe_string(order, 'commission')
956
+ fee = None
957
+ if feeValue is not None:
958
+ fee = {
959
+ 'cost': feeValue,
960
+ 'currency': 'USD',
961
+ }
962
+ orderType = self.safe_string(order, 'order_type')
963
+ if orderType is not None:
964
+ if orderType.find('limit') >= 0:
965
+ # might be limit or stop-limit
966
+ orderType = 'limit'
967
+ datetime = self.safe_string(order, 'submitted_at')
968
+ timestamp = self.parse8601(datetime)
969
+ return self.safe_order({
970
+ 'id': self.safe_string(order, 'id'),
971
+ 'clientOrderId': self.safe_string(order, 'client_order_id'),
972
+ 'timestamp': timestamp,
973
+ 'datetime': datetime,
974
+ 'lastTradeTimeStamp': None,
975
+ 'status': status,
976
+ 'symbol': symbol,
977
+ 'type': orderType,
978
+ 'timeInForce': self.parse_time_in_force(self.safe_string(order, 'time_in_force')),
979
+ 'postOnly': None,
980
+ 'side': self.safe_string(order, 'side'),
981
+ 'price': self.safe_number(order, 'limit_price'),
982
+ 'stopPrice': self.safe_number(order, 'stop_price'),
983
+ 'triggerPrice': self.safe_number(order, 'stop_price'),
984
+ 'cost': None,
985
+ 'average': self.safe_number(order, 'filled_avg_price'),
986
+ 'amount': self.safe_number(order, 'qty'),
987
+ 'filled': self.safe_number(order, 'filled_qty'),
988
+ 'remaining': None,
989
+ 'trades': None,
990
+ 'fee': fee,
991
+ 'info': order,
992
+ }, market)
993
+
994
+ def parse_order_status(self, status: Str):
995
+ statuses: dict = {
996
+ 'pending_new': 'open',
997
+ 'accepted': 'open',
998
+ 'new': 'open',
999
+ 'partially_filled': 'open',
1000
+ 'activated': 'open',
1001
+ 'filled': 'closed',
1002
+ }
1003
+ return self.safe_string(statuses, status, status)
1004
+
1005
+ def parse_time_in_force(self, timeInForce: Str):
1006
+ timeInForces: dict = {
1007
+ 'day': 'Day',
1008
+ }
1009
+ return self.safe_string(timeInForces, timeInForce, timeInForce)
1010
+
1011
+ def parse_trade(self, trade: dict, market: Market = None) -> Trade:
1012
+ #
1013
+ # {
1014
+ # "t":"2022-06-14T05:00:00.027869Z",
1015
+ # "x":"CBSE",
1016
+ # "p":"21942.15",
1017
+ # "s":"0.0001",
1018
+ # "tks":"S",
1019
+ # "i":"355681339"
1020
+ # }
1021
+ #
1022
+ marketId = self.safe_string(trade, 'S')
1023
+ symbol = self.safe_symbol(marketId, market)
1024
+ datetime = self.safe_string(trade, 't')
1025
+ timestamp = self.parse8601(datetime)
1026
+ alpacaSide = self.safe_string(trade, 'tks')
1027
+ side: str
1028
+ if alpacaSide == 'B':
1029
+ side = 'buy'
1030
+ elif alpacaSide == 'S':
1031
+ side = 'sell'
1032
+ priceString = self.safe_string(trade, 'p')
1033
+ amountString = self.safe_string(trade, 's')
1034
+ return self.safe_trade({
1035
+ 'info': trade,
1036
+ 'id': self.safe_string(trade, 'i'),
1037
+ 'timestamp': timestamp,
1038
+ 'datetime': self.iso8601(timestamp),
1039
+ 'symbol': symbol,
1040
+ 'order': None,
1041
+ 'type': None,
1042
+ 'side': side,
1043
+ 'takerOrMaker': 'taker',
1044
+ 'price': priceString,
1045
+ 'amount': amountString,
1046
+ 'cost': None,
1047
+ 'fee': None,
1048
+ }, market)
1049
+
1050
+ def sign(self, path, api='public', method='GET', params={}, headers=None, body=None):
1051
+ endpoint = '/' + self.implode_params(path, params)
1052
+ url = self.implode_hostname(self.urls['api'][api[0]])
1053
+ headers = headers if (headers is not None) else {}
1054
+ if api[1] == 'private':
1055
+ headers['APCA-API-KEY-ID'] = self.apiKey
1056
+ headers['APCA-API-SECRET-KEY'] = self.secret
1057
+ query = self.omit(params, self.extract_params(path))
1058
+ if query:
1059
+ if (method == 'GET') or (method == 'DELETE'):
1060
+ endpoint += '?' + self.urlencode(query)
1061
+ else:
1062
+ body = self.json(query)
1063
+ headers['Content-Type'] = 'application/json'
1064
+ url = url + endpoint
1065
+ return {'url': url, 'method': method, 'body': body, 'headers': headers}
1066
+
1067
+ def handle_errors(self, code: int, reason: str, url: str, method: str, headers: dict, body: str, response, requestHeaders, requestBody):
1068
+ if response is None:
1069
+ return None # default error handler
1070
+ # {
1071
+ # "code": 40110000,
1072
+ # "message": "request is not authorized"
1073
+ # }
1074
+ feedback = self.id + ' ' + body
1075
+ errorCode = self.safe_string(response, 'code')
1076
+ if code is not None:
1077
+ self.throw_exactly_matched_exception(self.exceptions['exact'], errorCode, feedback)
1078
+ message = self.safe_value(response, 'message', None)
1079
+ if message is not None:
1080
+ self.throw_exactly_matched_exception(self.exceptions['exact'], message, feedback)
1081
+ self.throw_broadly_matched_exception(self.exceptions['broad'], message, feedback)
1082
+ raise ExchangeError(feedback)
1083
+ return None