ccxt 4.2.76__py2.py3-none-any.whl → 4.4.48__py2.py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (546) hide show
  1. ccxt/__init__.py +36 -14
  2. ccxt/abstract/alpaca.py +4 -0
  3. ccxt/abstract/bigone.py +1 -1
  4. ccxt/abstract/binance.py +112 -48
  5. ccxt/abstract/binancecoinm.py +112 -48
  6. ccxt/abstract/binanceus.py +147 -83
  7. ccxt/abstract/binanceusdm.py +112 -48
  8. ccxt/abstract/bingx.py +133 -78
  9. ccxt/abstract/bitbank.py +5 -0
  10. ccxt/abstract/bitfinex.py +136 -65
  11. ccxt/abstract/bitfinex1.py +69 -0
  12. ccxt/abstract/bitflyer.py +1 -0
  13. ccxt/abstract/bitget.py +8 -1
  14. ccxt/abstract/bitmart.py +13 -1
  15. ccxt/abstract/bitopro.py +1 -0
  16. ccxt/abstract/bitpanda.py +0 -12
  17. ccxt/abstract/bitrue.py +3 -3
  18. ccxt/abstract/bitstamp.py +26 -3
  19. ccxt/abstract/blofin.py +24 -0
  20. ccxt/abstract/btcbox.py +1 -0
  21. ccxt/abstract/bybit.py +29 -14
  22. ccxt/abstract/cex.py +28 -29
  23. ccxt/abstract/coinbase.py +6 -0
  24. ccxt/abstract/coinbaseadvanced.py +94 -0
  25. ccxt/abstract/{coinbasepro.py → coinbaseexchange.py} +1 -0
  26. ccxt/abstract/coinbaseinternational.py +1 -1
  27. ccxt/abstract/coincatch.py +94 -0
  28. ccxt/abstract/coinex.py +233 -123
  29. ccxt/abstract/coinmetro.py +1 -0
  30. ccxt/abstract/cryptocom.py +14 -0
  31. ccxt/abstract/defx.py +69 -0
  32. ccxt/abstract/deribit.py +1 -0
  33. ccxt/abstract/digifinex.py +1 -0
  34. ccxt/abstract/ellipx.py +25 -0
  35. ccxt/abstract/gate.py +20 -0
  36. ccxt/abstract/gateio.py +20 -0
  37. ccxt/abstract/gemini.py +1 -0
  38. ccxt/abstract/hashkey.py +67 -0
  39. ccxt/abstract/hyperliquid.py +1 -1
  40. ccxt/abstract/independentreserve.py +6 -0
  41. ccxt/abstract/kraken.py +4 -3
  42. ccxt/abstract/krakenfutures.py +4 -0
  43. ccxt/abstract/kucoin.py +25 -0
  44. ccxt/abstract/kucoinfutures.py +35 -0
  45. ccxt/abstract/luno.py +2 -0
  46. ccxt/abstract/mexc.py +4 -0
  47. ccxt/abstract/myokx.py +340 -0
  48. ccxt/abstract/oceanex.py +5 -0
  49. ccxt/abstract/okx.py +30 -0
  50. ccxt/abstract/onetrading.py +0 -12
  51. ccxt/abstract/oxfun.py +34 -0
  52. ccxt/abstract/paradex.py +40 -0
  53. ccxt/abstract/phemex.py +1 -0
  54. ccxt/abstract/upbit.py +4 -0
  55. ccxt/abstract/vertex.py +19 -0
  56. ccxt/abstract/whitebit.py +31 -1
  57. ccxt/abstract/woo.py +6 -2
  58. ccxt/abstract/woofipro.py +119 -0
  59. ccxt/abstract/xt.py +153 -0
  60. ccxt/abstract/zonda.py +6 -0
  61. ccxt/ace.py +164 -60
  62. ccxt/alpaca.py +727 -63
  63. ccxt/ascendex.py +395 -249
  64. ccxt/async_support/__init__.py +36 -14
  65. ccxt/async_support/ace.py +164 -60
  66. ccxt/async_support/alpaca.py +727 -63
  67. ccxt/async_support/ascendex.py +396 -249
  68. ccxt/async_support/base/exchange.py +531 -155
  69. ccxt/async_support/base/ws/aiohttp_client.py +28 -5
  70. ccxt/async_support/base/ws/cache.py +3 -2
  71. ccxt/async_support/base/ws/client.py +26 -5
  72. ccxt/async_support/base/ws/fast_client.py +4 -3
  73. ccxt/async_support/base/ws/functions.py +1 -1
  74. ccxt/async_support/base/ws/future.py +40 -31
  75. ccxt/async_support/base/ws/order_book_side.py +3 -0
  76. ccxt/async_support/bequant.py +1 -1
  77. ccxt/async_support/bigone.py +329 -202
  78. ccxt/async_support/binance.py +3513 -1511
  79. ccxt/async_support/binancecoinm.py +2 -1
  80. ccxt/async_support/binanceus.py +12 -1
  81. ccxt/async_support/binanceusdm.py +3 -1
  82. ccxt/async_support/bingx.py +3105 -881
  83. ccxt/async_support/bit2c.py +119 -38
  84. ccxt/async_support/bitbank.py +215 -76
  85. ccxt/async_support/bitbns.py +124 -53
  86. ccxt/async_support/bitfinex.py +3236 -1078
  87. ccxt/async_support/bitfinex1.py +1711 -0
  88. ccxt/async_support/bitflyer.py +239 -50
  89. ccxt/async_support/bitget.py +1513 -563
  90. ccxt/async_support/bithumb.py +201 -67
  91. ccxt/async_support/bitmart.py +1320 -435
  92. ccxt/async_support/bitmex.py +308 -111
  93. ccxt/async_support/bitopro.py +256 -96
  94. ccxt/async_support/bitrue.py +365 -233
  95. ccxt/async_support/bitso.py +201 -89
  96. ccxt/async_support/bitstamp.py +438 -269
  97. ccxt/async_support/bitteam.py +179 -73
  98. ccxt/async_support/bitvavo.py +180 -70
  99. ccxt/async_support/bl3p.py +92 -25
  100. ccxt/async_support/blockchaincom.py +193 -79
  101. ccxt/async_support/blofin.py +403 -150
  102. ccxt/async_support/btcalpha.py +161 -55
  103. ccxt/async_support/btcbox.py +250 -34
  104. ccxt/async_support/btcmarkets.py +232 -85
  105. ccxt/async_support/btcturk.py +159 -60
  106. ccxt/async_support/bybit.py +2326 -1255
  107. ccxt/async_support/cex.py +1409 -1329
  108. ccxt/async_support/coinbase.py +1455 -288
  109. ccxt/async_support/coinbaseadvanced.py +17 -0
  110. ccxt/async_support/{coinbasepro.py → coinbaseexchange.py} +233 -99
  111. ccxt/async_support/coinbaseinternational.py +428 -88
  112. ccxt/async_support/coincatch.py +5152 -0
  113. ccxt/async_support/coincheck.py +121 -38
  114. ccxt/async_support/coinex.py +4020 -3339
  115. ccxt/async_support/coinlist.py +273 -116
  116. ccxt/async_support/coinmate.py +204 -97
  117. ccxt/async_support/coinmetro.py +203 -110
  118. ccxt/async_support/coinone.py +142 -68
  119. ccxt/async_support/coinsph.py +206 -89
  120. ccxt/async_support/coinspot.py +137 -62
  121. ccxt/async_support/cryptocom.py +515 -185
  122. ccxt/async_support/currencycom.py +203 -85
  123. ccxt/async_support/defx.py +2066 -0
  124. ccxt/async_support/delta.py +467 -158
  125. ccxt/async_support/deribit.py +558 -324
  126. ccxt/async_support/digifinex.py +340 -223
  127. ccxt/async_support/ellipx.py +1826 -0
  128. ccxt/async_support/exmo.py +259 -128
  129. ccxt/async_support/gate.py +1473 -464
  130. ccxt/async_support/gemini.py +206 -84
  131. ccxt/async_support/hashkey.py +4164 -0
  132. ccxt/async_support/hitbtc.py +334 -178
  133. ccxt/async_support/hollaex.py +134 -83
  134. ccxt/async_support/htx.py +1095 -563
  135. ccxt/async_support/huobijp.py +105 -56
  136. ccxt/async_support/hyperliquid.py +1634 -269
  137. ccxt/async_support/idex.py +148 -95
  138. ccxt/async_support/independentreserve.py +236 -31
  139. ccxt/async_support/indodax.py +165 -62
  140. ccxt/async_support/kraken.py +871 -354
  141. ccxt/async_support/krakenfutures.py +324 -100
  142. ccxt/async_support/kucoin.py +1050 -355
  143. ccxt/async_support/kucoinfutures.py +1004 -149
  144. ccxt/async_support/kuna.py +138 -106
  145. ccxt/async_support/latoken.py +135 -79
  146. ccxt/async_support/lbank.py +290 -113
  147. ccxt/async_support/luno.py +112 -62
  148. ccxt/async_support/lykke.py +104 -55
  149. ccxt/async_support/mercado.py +36 -29
  150. ccxt/async_support/mexc.py +995 -429
  151. ccxt/async_support/myokx.py +43 -0
  152. ccxt/async_support/ndax.py +163 -82
  153. ccxt/async_support/novadax.py +121 -75
  154. ccxt/async_support/oceanex.py +175 -59
  155. ccxt/async_support/okcoin.py +222 -163
  156. ccxt/async_support/okx.py +1777 -455
  157. ccxt/async_support/onetrading.py +132 -414
  158. ccxt/async_support/oxfun.py +2832 -0
  159. ccxt/async_support/p2b.py +79 -51
  160. ccxt/async_support/paradex.py +2017 -0
  161. ccxt/async_support/paymium.py +56 -32
  162. ccxt/async_support/phemex.py +572 -196
  163. ccxt/async_support/poloniex.py +218 -95
  164. ccxt/async_support/poloniexfutures.py +260 -92
  165. ccxt/async_support/probit.py +143 -110
  166. ccxt/async_support/timex.py +123 -70
  167. ccxt/async_support/tokocrypto.py +129 -93
  168. ccxt/async_support/tradeogre.py +39 -25
  169. ccxt/async_support/upbit.py +322 -113
  170. ccxt/async_support/vertex.py +2983 -0
  171. ccxt/async_support/wavesexchange.py +227 -173
  172. ccxt/async_support/wazirx.py +145 -65
  173. ccxt/async_support/whitebit.py +533 -138
  174. ccxt/async_support/woo.py +1155 -295
  175. ccxt/async_support/woofipro.py +2716 -0
  176. ccxt/async_support/xt.py +4628 -0
  177. ccxt/async_support/yobit.py +160 -92
  178. ccxt/async_support/zaif.py +80 -33
  179. ccxt/async_support/zonda.py +140 -69
  180. ccxt/base/errors.py +51 -20
  181. ccxt/base/exchange.py +1729 -482
  182. ccxt/base/precise.py +10 -0
  183. ccxt/base/types.py +223 -4
  184. ccxt/bequant.py +1 -1
  185. ccxt/bigone.py +329 -202
  186. ccxt/binance.py +3513 -1511
  187. ccxt/binancecoinm.py +2 -1
  188. ccxt/binanceus.py +12 -1
  189. ccxt/binanceusdm.py +3 -1
  190. ccxt/bingx.py +3105 -881
  191. ccxt/bit2c.py +119 -38
  192. ccxt/bitbank.py +215 -76
  193. ccxt/bitbns.py +124 -53
  194. ccxt/bitfinex.py +3235 -1078
  195. ccxt/bitfinex1.py +1710 -0
  196. ccxt/bitflyer.py +239 -50
  197. ccxt/bitget.py +1513 -563
  198. ccxt/bithumb.py +200 -67
  199. ccxt/bitmart.py +1320 -435
  200. ccxt/bitmex.py +308 -111
  201. ccxt/bitopro.py +256 -96
  202. ccxt/bitrue.py +365 -233
  203. ccxt/bitso.py +201 -89
  204. ccxt/bitstamp.py +438 -269
  205. ccxt/bitteam.py +179 -73
  206. ccxt/bitvavo.py +180 -70
  207. ccxt/bl3p.py +92 -25
  208. ccxt/blockchaincom.py +193 -79
  209. ccxt/blofin.py +403 -150
  210. ccxt/btcalpha.py +161 -55
  211. ccxt/btcbox.py +250 -34
  212. ccxt/btcmarkets.py +232 -85
  213. ccxt/btcturk.py +159 -60
  214. ccxt/bybit.py +2326 -1255
  215. ccxt/cex.py +1408 -1329
  216. ccxt/coinbase.py +1455 -288
  217. ccxt/coinbaseadvanced.py +17 -0
  218. ccxt/{coinbasepro.py → coinbaseexchange.py} +233 -99
  219. ccxt/coinbaseinternational.py +428 -88
  220. ccxt/coincatch.py +5152 -0
  221. ccxt/coincheck.py +121 -38
  222. ccxt/coinex.py +4020 -3339
  223. ccxt/coinlist.py +273 -116
  224. ccxt/coinmate.py +204 -97
  225. ccxt/coinmetro.py +203 -110
  226. ccxt/coinone.py +142 -68
  227. ccxt/coinsph.py +206 -89
  228. ccxt/coinspot.py +137 -62
  229. ccxt/cryptocom.py +515 -185
  230. ccxt/currencycom.py +203 -85
  231. ccxt/defx.py +2065 -0
  232. ccxt/delta.py +467 -158
  233. ccxt/deribit.py +558 -324
  234. ccxt/digifinex.py +340 -223
  235. ccxt/ellipx.py +1826 -0
  236. ccxt/exmo.py +259 -128
  237. ccxt/gate.py +1473 -464
  238. ccxt/gemini.py +206 -84
  239. ccxt/hashkey.py +4164 -0
  240. ccxt/hitbtc.py +334 -178
  241. ccxt/hollaex.py +134 -83
  242. ccxt/htx.py +1095 -563
  243. ccxt/huobijp.py +105 -56
  244. ccxt/hyperliquid.py +1633 -269
  245. ccxt/idex.py +148 -95
  246. ccxt/independentreserve.py +235 -31
  247. ccxt/indodax.py +165 -62
  248. ccxt/kraken.py +871 -354
  249. ccxt/krakenfutures.py +324 -100
  250. ccxt/kucoin.py +1050 -355
  251. ccxt/kucoinfutures.py +1004 -149
  252. ccxt/kuna.py +138 -106
  253. ccxt/latoken.py +135 -79
  254. ccxt/lbank.py +290 -113
  255. ccxt/luno.py +112 -62
  256. ccxt/lykke.py +104 -55
  257. ccxt/mercado.py +36 -29
  258. ccxt/mexc.py +994 -429
  259. ccxt/myokx.py +43 -0
  260. ccxt/ndax.py +163 -82
  261. ccxt/novadax.py +121 -75
  262. ccxt/oceanex.py +175 -59
  263. ccxt/okcoin.py +222 -163
  264. ccxt/okx.py +1777 -455
  265. ccxt/onetrading.py +132 -414
  266. ccxt/oxfun.py +2831 -0
  267. ccxt/p2b.py +79 -51
  268. ccxt/paradex.py +2017 -0
  269. ccxt/paymium.py +56 -32
  270. ccxt/phemex.py +572 -196
  271. ccxt/poloniex.py +218 -95
  272. ccxt/poloniexfutures.py +260 -92
  273. ccxt/pro/__init__.py +29 -5
  274. ccxt/pro/alpaca.py +32 -17
  275. ccxt/pro/ascendex.py +63 -15
  276. ccxt/pro/bequant.py +4 -0
  277. ccxt/pro/binance.py +1596 -329
  278. ccxt/pro/binancecoinm.py +1 -0
  279. ccxt/pro/binanceus.py +2 -9
  280. ccxt/pro/binanceusdm.py +2 -0
  281. ccxt/pro/bingx.py +527 -134
  282. ccxt/pro/bitcoincom.py +4 -1
  283. ccxt/pro/bitfinex.py +731 -266
  284. ccxt/pro/bitfinex1.py +635 -0
  285. ccxt/pro/bitget.py +726 -357
  286. ccxt/pro/bithumb.py +380 -0
  287. ccxt/pro/bitmart.py +138 -39
  288. ccxt/pro/bitmex.py +199 -40
  289. ccxt/pro/bitopro.py +25 -13
  290. ccxt/pro/bitrue.py +31 -32
  291. ccxt/pro/bitstamp.py +7 -6
  292. ccxt/pro/bitvavo.py +204 -82
  293. ccxt/pro/blockchaincom.py +30 -17
  294. ccxt/pro/blofin.py +692 -0
  295. ccxt/pro/bybit.py +791 -82
  296. ccxt/pro/cex.py +99 -51
  297. ccxt/pro/coinbase.py +220 -30
  298. ccxt/{async_support/hitbtc3.py → pro/coinbaseadvanced.py} +5 -5
  299. ccxt/pro/{coinbasepro.py → coinbaseexchange.py} +19 -19
  300. ccxt/pro/coinbaseinternational.py +193 -30
  301. ccxt/pro/coincatch.py +1464 -0
  302. ccxt/pro/coincheck.py +11 -6
  303. ccxt/pro/coinex.py +967 -661
  304. ccxt/pro/coinone.py +17 -10
  305. ccxt/pro/cryptocom.py +446 -66
  306. ccxt/pro/currencycom.py +11 -10
  307. ccxt/pro/defx.py +832 -0
  308. ccxt/pro/deribit.py +168 -32
  309. ccxt/pro/exmo.py +253 -21
  310. ccxt/pro/gate.py +729 -64
  311. ccxt/pro/gemini.py +44 -26
  312. ccxt/pro/hashkey.py +802 -0
  313. ccxt/pro/hitbtc.py +208 -103
  314. ccxt/pro/hollaex.py +25 -9
  315. ccxt/pro/htx.py +83 -39
  316. ccxt/pro/huobijp.py +17 -16
  317. ccxt/pro/hyperliquid.py +502 -31
  318. ccxt/pro/idex.py +28 -13
  319. ccxt/pro/independentreserve.py +21 -16
  320. ccxt/pro/kraken.py +298 -51
  321. ccxt/pro/krakenfutures.py +166 -75
  322. ccxt/pro/kucoin.py +395 -77
  323. ccxt/pro/kucoinfutures.py +400 -99
  324. ccxt/pro/lbank.py +52 -31
  325. ccxt/pro/luno.py +12 -10
  326. ccxt/pro/mexc.py +400 -50
  327. ccxt/pro/myokx.py +28 -0
  328. ccxt/pro/ndax.py +25 -12
  329. ccxt/pro/okcoin.py +28 -9
  330. ccxt/pro/okx.py +935 -124
  331. ccxt/pro/onetrading.py +41 -24
  332. ccxt/pro/oxfun.py +1054 -0
  333. ccxt/pro/p2b.py +100 -24
  334. ccxt/pro/paradex.py +352 -0
  335. ccxt/pro/phemex.py +93 -34
  336. ccxt/pro/poloniex.py +129 -50
  337. ccxt/pro/poloniexfutures.py +53 -32
  338. ccxt/pro/probit.py +93 -86
  339. ccxt/pro/upbit.py +401 -8
  340. ccxt/pro/vertex.py +943 -0
  341. ccxt/pro/wazirx.py +46 -28
  342. ccxt/pro/whitebit.py +65 -12
  343. ccxt/pro/woo.py +486 -70
  344. ccxt/pro/woofipro.py +1271 -0
  345. ccxt/pro/xt.py +1067 -0
  346. ccxt/probit.py +143 -110
  347. ccxt/static_dependencies/__init__.py +1 -1
  348. ccxt/static_dependencies/lark/__init__.py +38 -0
  349. ccxt/static_dependencies/lark/__pyinstaller/__init__.py +6 -0
  350. ccxt/static_dependencies/lark/__pyinstaller/hook-lark.py +14 -0
  351. ccxt/static_dependencies/lark/ast_utils.py +59 -0
  352. ccxt/static_dependencies/lark/common.py +86 -0
  353. ccxt/static_dependencies/lark/exceptions.py +292 -0
  354. ccxt/static_dependencies/lark/grammar.py +130 -0
  355. ccxt/static_dependencies/lark/grammars/__init__.py +0 -0
  356. ccxt/static_dependencies/lark/indenter.py +143 -0
  357. ccxt/static_dependencies/lark/lark.py +658 -0
  358. ccxt/static_dependencies/lark/lexer.py +678 -0
  359. ccxt/static_dependencies/lark/load_grammar.py +1428 -0
  360. ccxt/static_dependencies/lark/parse_tree_builder.py +391 -0
  361. ccxt/static_dependencies/lark/parser_frontends.py +257 -0
  362. ccxt/static_dependencies/lark/parsers/__init__.py +0 -0
  363. ccxt/static_dependencies/lark/parsers/cyk.py +340 -0
  364. ccxt/static_dependencies/lark/parsers/earley.py +314 -0
  365. ccxt/static_dependencies/lark/parsers/earley_common.py +42 -0
  366. ccxt/static_dependencies/lark/parsers/earley_forest.py +801 -0
  367. ccxt/static_dependencies/lark/parsers/grammar_analysis.py +203 -0
  368. ccxt/static_dependencies/lark/parsers/lalr_analysis.py +332 -0
  369. ccxt/static_dependencies/lark/parsers/lalr_interactive_parser.py +158 -0
  370. ccxt/static_dependencies/lark/parsers/lalr_parser.py +122 -0
  371. ccxt/static_dependencies/lark/parsers/lalr_parser_state.py +110 -0
  372. ccxt/static_dependencies/lark/parsers/xearley.py +165 -0
  373. ccxt/static_dependencies/lark/py.typed +0 -0
  374. ccxt/static_dependencies/lark/reconstruct.py +107 -0
  375. ccxt/static_dependencies/lark/tools/__init__.py +70 -0
  376. ccxt/static_dependencies/lark/tools/nearley.py +202 -0
  377. ccxt/static_dependencies/lark/tools/serialize.py +32 -0
  378. ccxt/static_dependencies/lark/tools/standalone.py +196 -0
  379. ccxt/static_dependencies/lark/tree.py +267 -0
  380. ccxt/static_dependencies/lark/tree_matcher.py +186 -0
  381. ccxt/static_dependencies/lark/tree_templates.py +180 -0
  382. ccxt/static_dependencies/lark/utils.py +343 -0
  383. ccxt/static_dependencies/lark/visitors.py +596 -0
  384. ccxt/static_dependencies/marshmallow/__init__.py +81 -0
  385. ccxt/static_dependencies/marshmallow/base.py +65 -0
  386. ccxt/static_dependencies/marshmallow/class_registry.py +94 -0
  387. ccxt/static_dependencies/marshmallow/decorators.py +231 -0
  388. ccxt/static_dependencies/marshmallow/error_store.py +60 -0
  389. ccxt/static_dependencies/marshmallow/exceptions.py +71 -0
  390. ccxt/static_dependencies/marshmallow/fields.py +2114 -0
  391. ccxt/static_dependencies/marshmallow/orderedset.py +89 -0
  392. ccxt/static_dependencies/marshmallow/py.typed +0 -0
  393. ccxt/static_dependencies/marshmallow/schema.py +1228 -0
  394. ccxt/static_dependencies/marshmallow/types.py +12 -0
  395. ccxt/static_dependencies/marshmallow/utils.py +378 -0
  396. ccxt/static_dependencies/marshmallow/validate.py +678 -0
  397. ccxt/static_dependencies/marshmallow/warnings.py +2 -0
  398. ccxt/static_dependencies/marshmallow_dataclass/__init__.py +1047 -0
  399. ccxt/static_dependencies/marshmallow_dataclass/collection_field.py +51 -0
  400. ccxt/static_dependencies/marshmallow_dataclass/lazy_class_attribute.py +45 -0
  401. ccxt/static_dependencies/marshmallow_dataclass/mypy.py +71 -0
  402. ccxt/static_dependencies/marshmallow_dataclass/py.typed +0 -0
  403. ccxt/static_dependencies/marshmallow_dataclass/typing.py +14 -0
  404. ccxt/static_dependencies/marshmallow_dataclass/union_field.py +82 -0
  405. ccxt/static_dependencies/marshmallow_oneofschema/__init__.py +1 -0
  406. ccxt/static_dependencies/marshmallow_oneofschema/one_of_schema.py +193 -0
  407. ccxt/static_dependencies/marshmallow_oneofschema/py.typed +0 -0
  408. ccxt/static_dependencies/starknet/__init__.py +0 -0
  409. ccxt/static_dependencies/starknet/cairo/__init__.py +0 -0
  410. ccxt/static_dependencies/starknet/cairo/data_types.py +123 -0
  411. ccxt/static_dependencies/starknet/cairo/deprecated_parse/__init__.py +0 -0
  412. ccxt/static_dependencies/starknet/cairo/deprecated_parse/cairo_types.py +77 -0
  413. ccxt/static_dependencies/starknet/cairo/deprecated_parse/parser.py +46 -0
  414. ccxt/static_dependencies/starknet/cairo/deprecated_parse/parser_transformer.py +138 -0
  415. ccxt/static_dependencies/starknet/cairo/felt.py +64 -0
  416. ccxt/static_dependencies/starknet/cairo/type_parser.py +121 -0
  417. ccxt/static_dependencies/starknet/cairo/v1/__init__.py +0 -0
  418. ccxt/static_dependencies/starknet/cairo/v1/type_parser.py +59 -0
  419. ccxt/static_dependencies/starknet/cairo/v2/__init__.py +0 -0
  420. ccxt/static_dependencies/starknet/cairo/v2/type_parser.py +77 -0
  421. ccxt/static_dependencies/starknet/ccxt_utils.py +7 -0
  422. ccxt/static_dependencies/starknet/common.py +15 -0
  423. ccxt/static_dependencies/starknet/constants.py +39 -0
  424. ccxt/static_dependencies/starknet/hash/__init__.py +0 -0
  425. ccxt/static_dependencies/starknet/hash/address.py +79 -0
  426. ccxt/static_dependencies/starknet/hash/compiled_class_hash_objects.py +111 -0
  427. ccxt/static_dependencies/starknet/hash/selector.py +16 -0
  428. ccxt/static_dependencies/starknet/hash/storage.py +12 -0
  429. ccxt/static_dependencies/starknet/hash/utils.py +78 -0
  430. ccxt/static_dependencies/starknet/models/__init__.py +0 -0
  431. ccxt/static_dependencies/starknet/models/typed_data.py +45 -0
  432. ccxt/static_dependencies/starknet/serialization/__init__.py +24 -0
  433. ccxt/static_dependencies/starknet/serialization/_calldata_reader.py +40 -0
  434. ccxt/static_dependencies/starknet/serialization/_context.py +142 -0
  435. ccxt/static_dependencies/starknet/serialization/data_serializers/__init__.py +10 -0
  436. ccxt/static_dependencies/starknet/serialization/data_serializers/_common.py +82 -0
  437. ccxt/static_dependencies/starknet/serialization/data_serializers/array_serializer.py +43 -0
  438. ccxt/static_dependencies/starknet/serialization/data_serializers/bool_serializer.py +37 -0
  439. ccxt/static_dependencies/starknet/serialization/data_serializers/byte_array_serializer.py +66 -0
  440. ccxt/static_dependencies/starknet/serialization/data_serializers/cairo_data_serializer.py +71 -0
  441. ccxt/static_dependencies/starknet/serialization/data_serializers/enum_serializer.py +71 -0
  442. ccxt/static_dependencies/starknet/serialization/data_serializers/felt_serializer.py +50 -0
  443. ccxt/static_dependencies/starknet/serialization/data_serializers/named_tuple_serializer.py +58 -0
  444. ccxt/static_dependencies/starknet/serialization/data_serializers/option_serializer.py +43 -0
  445. ccxt/static_dependencies/starknet/serialization/data_serializers/output_serializer.py +40 -0
  446. ccxt/static_dependencies/starknet/serialization/data_serializers/payload_serializer.py +72 -0
  447. ccxt/static_dependencies/starknet/serialization/data_serializers/struct_serializer.py +36 -0
  448. ccxt/static_dependencies/starknet/serialization/data_serializers/tuple_serializer.py +36 -0
  449. ccxt/static_dependencies/starknet/serialization/data_serializers/uint256_serializer.py +76 -0
  450. ccxt/static_dependencies/starknet/serialization/data_serializers/uint_serializer.py +100 -0
  451. ccxt/static_dependencies/starknet/serialization/data_serializers/unit_serializer.py +32 -0
  452. ccxt/static_dependencies/starknet/serialization/errors.py +10 -0
  453. ccxt/static_dependencies/starknet/serialization/factory.py +229 -0
  454. ccxt/static_dependencies/starknet/serialization/function_serialization_adapter.py +110 -0
  455. ccxt/static_dependencies/starknet/serialization/tuple_dataclass.py +59 -0
  456. ccxt/static_dependencies/starknet/utils/__init__.py +0 -0
  457. ccxt/static_dependencies/starknet/utils/constructor_args_translator.py +86 -0
  458. ccxt/static_dependencies/starknet/utils/iterable.py +13 -0
  459. ccxt/static_dependencies/starknet/utils/schema.py +13 -0
  460. ccxt/static_dependencies/starknet/utils/typed_data.py +182 -0
  461. ccxt/static_dependencies/starkware/__init__.py +0 -0
  462. ccxt/static_dependencies/starkware/crypto/__init__.py +0 -0
  463. ccxt/static_dependencies/starkware/crypto/fast_pedersen_hash.py +50 -0
  464. ccxt/static_dependencies/starkware/crypto/math_utils.py +78 -0
  465. ccxt/static_dependencies/starkware/crypto/signature.py +2344 -0
  466. ccxt/static_dependencies/starkware/crypto/utils.py +63 -0
  467. ccxt/static_dependencies/sympy/__init__.py +0 -0
  468. ccxt/static_dependencies/sympy/core/__init__.py +0 -0
  469. ccxt/static_dependencies/sympy/core/intfunc.py +35 -0
  470. ccxt/static_dependencies/sympy/external/__init__.py +0 -0
  471. ccxt/static_dependencies/sympy/external/gmpy.py +345 -0
  472. ccxt/static_dependencies/sympy/external/importtools.py +187 -0
  473. ccxt/static_dependencies/sympy/external/ntheory.py +637 -0
  474. ccxt/static_dependencies/sympy/external/pythonmpq.py +341 -0
  475. ccxt/static_dependencies/typing_inspect/__init__.py +0 -0
  476. ccxt/static_dependencies/typing_inspect/typing_inspect.py +851 -0
  477. ccxt/test/{test_async.py → tests_async.py} +465 -407
  478. ccxt/test/tests_helpers.py +285 -0
  479. ccxt/test/tests_init.py +39 -0
  480. ccxt/test/{test_sync.py → tests_sync.py} +465 -409
  481. ccxt/timex.py +123 -70
  482. ccxt/tokocrypto.py +129 -93
  483. ccxt/tradeogre.py +39 -25
  484. ccxt/upbit.py +322 -113
  485. ccxt/vertex.py +2983 -0
  486. ccxt/wavesexchange.py +227 -173
  487. ccxt/wazirx.py +145 -65
  488. ccxt/whitebit.py +533 -138
  489. ccxt/woo.py +1155 -295
  490. ccxt/woofipro.py +2716 -0
  491. ccxt/xt.py +4627 -0
  492. ccxt/yobit.py +159 -92
  493. ccxt/zaif.py +80 -33
  494. ccxt/zonda.py +140 -69
  495. ccxt-4.4.48.dist-info/LICENSE.txt +21 -0
  496. ccxt-4.4.48.dist-info/METADATA +646 -0
  497. ccxt-4.4.48.dist-info/RECORD +669 -0
  498. {ccxt-4.2.76.dist-info → ccxt-4.4.48.dist-info}/WHEEL +1 -1
  499. ccxt/abstract/bitbay.py +0 -47
  500. ccxt/abstract/bitfinex2.py +0 -139
  501. ccxt/abstract/hitbtc3.py +0 -115
  502. ccxt/async_support/bitbay.py +0 -17
  503. ccxt/async_support/bitfinex2.py +0 -3496
  504. ccxt/async_support/flowbtc.py +0 -34
  505. ccxt/bitbay.py +0 -17
  506. ccxt/bitfinex2.py +0 -3496
  507. ccxt/flowbtc.py +0 -34
  508. ccxt/hitbtc3.py +0 -16
  509. ccxt/pro/bitfinex2.py +0 -1081
  510. ccxt/test/base/__init__.py +0 -28
  511. ccxt/test/base/test_account.py +0 -26
  512. ccxt/test/base/test_balance.py +0 -56
  513. ccxt/test/base/test_borrow_interest.py +0 -35
  514. ccxt/test/base/test_borrow_rate.py +0 -32
  515. ccxt/test/base/test_calculate_fee.py +0 -51
  516. ccxt/test/base/test_crypto.py +0 -127
  517. ccxt/test/base/test_currency.py +0 -76
  518. ccxt/test/base/test_datetime.py +0 -103
  519. ccxt/test/base/test_decimal_to_precision.py +0 -392
  520. ccxt/test/base/test_deep_extend.py +0 -68
  521. ccxt/test/base/test_deposit_withdrawal.py +0 -50
  522. ccxt/test/base/test_exchange_datetime_functions.py +0 -76
  523. ccxt/test/base/test_funding_rate_history.py +0 -29
  524. ccxt/test/base/test_last_price.py +0 -32
  525. ccxt/test/base/test_ledger_entry.py +0 -45
  526. ccxt/test/base/test_ledger_item.py +0 -48
  527. ccxt/test/base/test_leverage_tier.py +0 -33
  528. ccxt/test/base/test_margin_mode.py +0 -24
  529. ccxt/test/base/test_margin_modification.py +0 -35
  530. ccxt/test/base/test_market.py +0 -190
  531. ccxt/test/base/test_number.py +0 -411
  532. ccxt/test/base/test_ohlcv.py +0 -32
  533. ccxt/test/base/test_open_interest.py +0 -32
  534. ccxt/test/base/test_order.py +0 -64
  535. ccxt/test/base/test_order_book.py +0 -63
  536. ccxt/test/base/test_position.py +0 -60
  537. ccxt/test/base/test_shared_methods.py +0 -345
  538. ccxt/test/base/test_status.py +0 -24
  539. ccxt/test/base/test_throttle.py +0 -126
  540. ccxt/test/base/test_ticker.py +0 -86
  541. ccxt/test/base/test_trade.py +0 -47
  542. ccxt/test/base/test_trading_fee.py +0 -26
  543. ccxt/test/base/test_transaction.py +0 -39
  544. ccxt-4.2.76.dist-info/METADATA +0 -626
  545. ccxt-4.2.76.dist-info/RECORD +0 -534
  546. {ccxt-4.2.76.dist-info → ccxt-4.4.48.dist-info}/top_level.txt +0 -0
ccxt/alpaca.py CHANGED
@@ -5,10 +5,11 @@
5
5
 
6
6
  from ccxt.base.exchange import Exchange
7
7
  from ccxt.abstract.alpaca import ImplicitAPI
8
- from ccxt.base.types import Int, Market, Num, Order, OrderBook, OrderSide, OrderType, Str, Trade
8
+ from ccxt.base.types import Balances, Currency, DepositAddress, Int, Market, Num, Order, OrderBook, OrderSide, OrderType, 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 PermissionDenied
12
+ from ccxt.base.errors import ArgumentsRequired
12
13
  from ccxt.base.errors import BadRequest
13
14
  from ccxt.base.errors import BadSymbol
14
15
  from ccxt.base.errors import InsufficientFunds
@@ -16,6 +17,7 @@ from ccxt.base.errors import InvalidOrder
16
17
  from ccxt.base.errors import NotSupported
17
18
  from ccxt.base.errors import RateLimitExceeded
18
19
  from ccxt.base.decimal_to_precision import TICK_SIZE
20
+ from ccxt.base.precise import Precise
19
21
 
20
22
 
21
23
  class alpaca(Exchange, ImplicitAPI):
@@ -32,7 +34,7 @@ class alpaca(Exchange, ImplicitAPI):
32
34
  'hostname': 'alpaca.markets',
33
35
  'pro': True,
34
36
  'urls': {
35
- 'logo': 'https://user-images.githubusercontent.com/1294454/187234005-b864db3d-f1e3-447a-aaf9-a9fc7b955d07.jpg',
37
+ 'logo': 'https://github.com/user-attachments/assets/e9476df8-a450-4c3e-ab9a-1a7794219e1b',
36
38
  'www': 'https://alpaca.markets',
37
39
  'api': {
38
40
  'broker': 'https://broker-api.{hostname}',
@@ -42,7 +44,7 @@ class alpaca(Exchange, ImplicitAPI):
42
44
  'test': {
43
45
  'broker': 'https://broker-api.sandbox.{hostname}',
44
46
  'trader': 'https://paper-api.{hostname}',
45
- 'market': 'https://data.sandbox.{hostname}',
47
+ 'market': 'https://data.{hostname}',
46
48
  },
47
49
  'doc': 'https://alpaca.markets/docs/',
48
50
  'fees': 'https://docs.alpaca.markets/docs/crypto-fees',
@@ -59,31 +61,41 @@ class alpaca(Exchange, ImplicitAPI):
59
61
  'closeAllPositions': False,
60
62
  'closePosition': False,
61
63
  'createOrder': True,
62
- 'fetchBalance': False,
64
+ 'createStopOrder': True,
65
+ 'createTriggerOrder': True,
66
+ 'editOrder': True,
67
+ 'fetchBalance': True,
63
68
  'fetchBidsAsks': False,
64
69
  'fetchClosedOrders': True,
65
70
  'fetchCurrencies': False,
66
- 'fetchDepositAddress': False,
71
+ 'fetchDepositAddress': True,
67
72
  'fetchDepositAddressesByNetwork': False,
68
- 'fetchDeposits': False,
69
- 'fetchDepositsWithdrawals': False,
73
+ 'fetchDeposits': True,
74
+ 'fetchDepositsWithdrawals': True,
70
75
  'fetchFundingHistory': False,
71
76
  'fetchFundingRate': False,
77
+ 'fetchFundingRateHistory': False,
72
78
  'fetchFundingRates': False,
73
79
  'fetchL1OrderBook': True,
74
80
  'fetchL2OrderBook': False,
75
81
  'fetchMarkets': True,
76
- 'fetchMyTrades': False,
82
+ 'fetchMyTrades': True,
77
83
  'fetchOHLCV': True,
78
84
  'fetchOpenOrder': False,
79
85
  'fetchOpenOrders': True,
80
86
  'fetchOrder': True,
81
87
  'fetchOrderBook': True,
82
88
  'fetchOrders': True,
89
+ 'fetchPosition': False,
90
+ 'fetchPositionHistory': False,
91
+ 'fetchPositionMode': False,
83
92
  'fetchPositions': False,
93
+ 'fetchPositionsForSymbol': False,
94
+ 'fetchPositionsHistory': False,
95
+ 'fetchPositionsRisk': False,
84
96
  'fetchStatus': False,
85
- 'fetchTicker': False,
86
- 'fetchTickers': False,
97
+ 'fetchTicker': True,
98
+ 'fetchTickers': True,
87
99
  'fetchTime': True,
88
100
  'fetchTrades': True,
89
101
  'fetchTradingFee': False,
@@ -91,11 +103,12 @@ class alpaca(Exchange, ImplicitAPI):
91
103
  'fetchTransactionFees': False,
92
104
  'fetchTransactions': False,
93
105
  'fetchTransfers': False,
94
- 'fetchWithdrawals': False,
106
+ 'fetchWithdrawals': True,
107
+ 'sandbox': True,
95
108
  'setLeverage': False,
96
109
  'setMarginMode': False,
97
110
  'transfer': False,
98
- 'withdraw': False,
111
+ 'withdraw': True,
99
112
  },
100
113
  'api': {
101
114
  'broker': {
@@ -121,14 +134,18 @@ class alpaca(Exchange, ImplicitAPI):
121
134
  'v2/assets/{symbol_or_asset_id}',
122
135
  'v2/corporate_actions/announcements/{id}',
123
136
  'v2/corporate_actions/announcements',
137
+ 'v2/wallets',
138
+ 'v2/wallets/transfers',
124
139
  ],
125
140
  'post': [
126
141
  'v2/orders',
127
142
  'v2/watchlists',
128
143
  'v2/watchlists/{watchlist_id}',
129
144
  'v2/watchlists:by_name',
145
+ 'v2/wallets/transfers',
130
146
  ],
131
147
  'put': [
148
+ 'v2/orders/{order_id}',
132
149
  'v2/watchlists/{watchlist_id}',
133
150
  'v2/watchlists:by_name',
134
151
  ],
@@ -257,6 +274,86 @@ class alpaca(Exchange, ImplicitAPI):
257
274
  'defaultTimeInForce': 'gtc', # fok, gtc, ioc
258
275
  'clientOrderId': 'ccxt_{id}',
259
276
  },
277
+ 'features': {
278
+ 'spot': {
279
+ 'sandbox': True,
280
+ 'createOrder': {
281
+ 'marginMode': False,
282
+ 'triggerPrice': True,
283
+ 'triggerPriceType': None,
284
+ 'triggerDirection': False,
285
+ 'stopLossPrice': False, # todo
286
+ 'takeProfitPrice': False, # todo
287
+ 'attachedStopLossTakeProfit': {
288
+ 'triggerPriceType': {
289
+ 'last': True,
290
+ 'mark': True,
291
+ 'index': True,
292
+ },
293
+ 'price': True,
294
+ },
295
+ 'timeInForce': {
296
+ 'IOC': True,
297
+ 'FOK': True,
298
+ 'PO': True,
299
+ 'GTD': False,
300
+ },
301
+ 'hedged': False,
302
+ 'trailing': True, # todo: implementation
303
+ 'leverage': False,
304
+ 'marketBuyRequiresPrice': False,
305
+ 'marketBuyByCost': False,
306
+ 'selfTradePrevention': False,
307
+ 'iceberg': False,
308
+ },
309
+ 'createOrders': None,
310
+ 'fetchMyTrades': {
311
+ 'marginMode': False,
312
+ 'limit': 100,
313
+ 'daysBack': 100000,
314
+ 'untilDays': 100000,
315
+ },
316
+ 'fetchOrder': {
317
+ 'marginMode': False,
318
+ 'trigger': False,
319
+ 'trailing': False,
320
+ },
321
+ 'fetchOpenOrders': {
322
+ 'marginMode': False,
323
+ 'limit': 500,
324
+ 'trigger': False,
325
+ 'trailing': False,
326
+ },
327
+ 'fetchOrders': {
328
+ 'marginMode': False,
329
+ 'limit': 500,
330
+ 'daysBack': 100000,
331
+ 'untilDays': 100000,
332
+ 'trigger': False,
333
+ 'trailing': False,
334
+ },
335
+ 'fetchClosedOrders': {
336
+ 'marginMode': False,
337
+ 'limit': 500,
338
+ 'daysBack': 100000,
339
+ 'daysBackCanceled': None,
340
+ 'untilDays': 100000,
341
+ 'trigger': False,
342
+ 'trailing': False,
343
+ },
344
+ 'fetchOHLCV': {
345
+ 'limit': 1000,
346
+ },
347
+ },
348
+ 'swap': {
349
+ 'linear': None,
350
+ 'inverse': None,
351
+ },
352
+ 'future': {
353
+ 'linear': None,
354
+ 'inverse': None,
355
+ },
356
+ },
260
357
  'exceptions': {
261
358
  'exact': {
262
359
  'forbidden.': PermissionDenied, # {"message": "forbidden."}
@@ -296,14 +393,16 @@ class alpaca(Exchange, ImplicitAPI):
296
393
  iso = self.parse8601(localTime) - self.parse_to_numeric(jetlag) * 3600 * 1000
297
394
  return iso
298
395
 
299
- def fetch_markets(self, params={}):
396
+ def fetch_markets(self, params={}) -> List[Market]:
300
397
  """
301
398
  retrieves data on all markets for alpaca
302
- :see: https://docs.alpaca.markets/reference/get-v2-assets
399
+
400
+ https://docs.alpaca.markets/reference/get-v2-assets
401
+
303
402
  :param dict [params]: extra parameters specific to the exchange api endpoint
304
403
  :returns dict[]: an array of objects representing market data
305
404
  """
306
- request = {
405
+ request: dict = {
307
406
  'asset_class': 'crypto',
308
407
  'status': 'active',
309
408
  }
@@ -423,8 +522,10 @@ class alpaca(Exchange, ImplicitAPI):
423
522
  def fetch_trades(self, symbol: str, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
424
523
  """
425
524
  get the list of most recent trades for a particular symbol
426
- :see: https://docs.alpaca.markets/reference/cryptotrades
427
- :see: https://docs.alpaca.markets/reference/cryptolatesttrades
525
+
526
+ https://docs.alpaca.markets/reference/cryptotrades
527
+ https://docs.alpaca.markets/reference/cryptolatesttrades
528
+
428
529
  :param str symbol: unified symbol of the market to fetch trades for
429
530
  :param int [since]: timestamp in ms of the earliest trade to fetch
430
531
  :param int [limit]: the maximum amount of trades to fetch
@@ -438,7 +539,7 @@ class alpaca(Exchange, ImplicitAPI):
438
539
  marketId = market['id']
439
540
  loc = self.safe_string(params, 'loc', 'us')
440
541
  method = self.safe_string(params, 'method', 'marketPublicGetV1beta3CryptoLocTrades')
441
- request = {
542
+ request: dict = {
442
543
  'symbols': marketId,
443
544
  'loc': loc,
444
545
  }
@@ -493,7 +594,9 @@ class alpaca(Exchange, ImplicitAPI):
493
594
  def fetch_order_book(self, symbol: str, limit: Int = None, params={}) -> OrderBook:
494
595
  """
495
596
  fetches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
496
- :see: https://docs.alpaca.markets/reference/cryptolatestorderbooks
597
+
598
+ https://docs.alpaca.markets/reference/cryptolatestorderbooks
599
+
497
600
  :param str symbol: unified symbol of the market to fetch the order book for
498
601
  :param int [limit]: the maximum amount of order book entries to return
499
602
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -504,7 +607,7 @@ class alpaca(Exchange, ImplicitAPI):
504
607
  market = self.market(symbol)
505
608
  id = market['id']
506
609
  loc = self.safe_string(params, 'loc', 'us')
507
- request = {
610
+ request: dict = {
508
611
  'symbols': id,
509
612
  'loc': loc,
510
613
  }
@@ -546,16 +649,18 @@ class alpaca(Exchange, ImplicitAPI):
546
649
  # }
547
650
  # }
548
651
  #
549
- orderbooks = self.safe_value(response, 'orderbooks', {})
550
- rawOrderbook = self.safe_value(orderbooks, id, {})
652
+ orderbooks = self.safe_dict(response, 'orderbooks', {})
653
+ rawOrderbook = self.safe_dict(orderbooks, id, {})
551
654
  timestamp = self.parse8601(self.safe_string(rawOrderbook, 't'))
552
655
  return self.parse_order_book(rawOrderbook, market['symbol'], timestamp, 'b', 'a', 'p', 's')
553
656
 
554
657
  def fetch_ohlcv(self, symbol: str, timeframe='1m', since: Int = None, limit: Int = None, params={}) -> List[list]:
555
658
  """
556
659
  fetches historical candlestick data containing the open, high, low, and close price, and the volume of a market
557
- :see: https://docs.alpaca.markets/reference/cryptobars
558
- :see: https://docs.alpaca.markets/reference/cryptolatestbars
660
+
661
+ https://docs.alpaca.markets/reference/cryptobars
662
+ https://docs.alpaca.markets/reference/cryptolatestbars
663
+
559
664
  :param str symbol: unified symbol of the market to fetch OHLCV data for
560
665
  :param str timeframe: the length of time each candle represents
561
666
  :param int [since]: timestamp in ms of the earliest candle to fetch
@@ -570,7 +675,7 @@ class alpaca(Exchange, ImplicitAPI):
570
675
  marketId = market['id']
571
676
  loc = self.safe_string(params, 'loc', 'us')
572
677
  method = self.safe_string(params, 'method', 'marketPublicGetV1beta3CryptoLocBars')
573
- request = {
678
+ request: dict = {
574
679
  'symbols': marketId,
575
680
  'loc': loc,
576
681
  }
@@ -663,15 +768,154 @@ class alpaca(Exchange, ImplicitAPI):
663
768
  self.safe_number(ohlcv, 'v'), # volume
664
769
  ]
665
770
 
771
+ def fetch_ticker(self, symbol: str, params={}) -> Ticker:
772
+ """
773
+ fetches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
774
+
775
+ https://docs.alpaca.markets/reference/cryptosnapshots-1
776
+
777
+ :param str symbol: unified symbol of the market to fetch the ticker for
778
+ :param dict [params]: extra parameters specific to the exchange API endpoint
779
+ :param str [params.loc]: crypto location, default: us
780
+ :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
781
+ """
782
+ self.load_markets()
783
+ symbol = self.symbol(symbol)
784
+ tickers = self.fetch_tickers([symbol], params)
785
+ return self.safe_dict(tickers, symbol)
786
+
787
+ def fetch_tickers(self, symbols: Strings = None, params={}) -> Tickers:
788
+ """
789
+ fetches price tickers for multiple markets, statistical information calculated over the past 24 hours for each market
790
+
791
+ https://docs.alpaca.markets/reference/cryptosnapshots-1
792
+
793
+ :param str[] symbols: unified symbols of the markets to fetch tickers for
794
+ :param dict [params]: extra parameters specific to the exchange API endpoint
795
+ :param str [params.loc]: crypto location, default: us
796
+ :returns dict: a dictionary of `ticker structures <https://docs.ccxt.com/#/?id=ticker-structure>`
797
+ """
798
+ if symbols is None:
799
+ raise ArgumentsRequired(self.id + ' fetchTickers() requires a symbols argument')
800
+ self.load_markets()
801
+ symbols = self.market_symbols(symbols)
802
+ loc = self.safe_string(params, 'loc', 'us')
803
+ ids = self.market_ids(symbols)
804
+ request = {
805
+ 'symbols': ','.join(ids),
806
+ 'loc': loc,
807
+ }
808
+ params = self.omit(params, 'loc')
809
+ response = self.marketPublicGetV1beta3CryptoLocSnapshots(self.extend(request, params))
810
+ #
811
+ # {
812
+ # "snapshots": {
813
+ # "BTC/USD": {
814
+ # "dailyBar": {
815
+ # "c": 69403.554,
816
+ # "h": 69609.6515,
817
+ # "l": 69013.26,
818
+ # "n": 9,
819
+ # "o": 69536.7,
820
+ # "t": "2024-11-01T05:00:00Z",
821
+ # "v": 0.210809181,
822
+ # "vw": 69327.655393908
823
+ # },
824
+ # "latestQuote": {
825
+ # "ap": 69424.19,
826
+ # "as": 0.68149,
827
+ # "bp": 69366.086,
828
+ # "bs": 0.68312,
829
+ # "t": "2024-11-01T08:31:41.880246926Z"
830
+ # },
831
+ # "latestTrade": {
832
+ # "i": 5272941104897543146,
833
+ # "p": 69416.9,
834
+ # "s": 0.014017324,
835
+ # "t": "2024-11-01T08:14:28.245088803Z",
836
+ # "tks": "B"
837
+ # },
838
+ # "minuteBar": {
839
+ # "c": 69403.554,
840
+ # "h": 69403.554,
841
+ # "l": 69399.125,
842
+ # "n": 0,
843
+ # "o": 69399.125,
844
+ # "t": "2024-11-01T08:30:00Z",
845
+ # "v": 0,
846
+ # "vw": 0
847
+ # },
848
+ # "prevDailyBar": {
849
+ # "c": 69515.1415,
850
+ # "h": 72668.837,
851
+ # "l": 68796.85,
852
+ # "n": 129,
853
+ # "o": 72258.9,
854
+ # "t": "2024-10-31T05:00:00Z",
855
+ # "v": 2.217683307,
856
+ # "vw": 70782.6811608144
857
+ # }
858
+ # },
859
+ # }
860
+ # }
861
+ #
862
+ results = []
863
+ snapshots = self.safe_dict(response, 'snapshots', {})
864
+ marketIds = list(snapshots.keys())
865
+ for i in range(0, len(marketIds)):
866
+ marketId = marketIds[i]
867
+ market = self.safe_market(marketId)
868
+ entry = self.safe_dict(snapshots, marketId)
869
+ dailyBar = self.safe_dict(entry, 'dailyBar', {})
870
+ prevDailyBar = self.safe_dict(entry, 'prevDailyBar', {})
871
+ latestQuote = self.safe_dict(entry, 'latestQuote', {})
872
+ latestTrade = self.safe_dict(entry, 'latestTrade', {})
873
+ datetime = self.safe_string(latestQuote, 't')
874
+ ticker = self.safe_ticker({
875
+ 'info': entry,
876
+ 'symbol': market['symbol'],
877
+ 'timestamp': self.parse8601(datetime),
878
+ 'datetime': datetime,
879
+ 'high': self.safe_string(dailyBar, 'h'),
880
+ 'low': self.safe_string(dailyBar, 'l'),
881
+ 'bid': self.safe_string(latestQuote, 'bp'),
882
+ 'bidVolume': self.safe_string(latestQuote, 'bs'),
883
+ 'ask': self.safe_string(latestQuote, 'ap'),
884
+ 'askVolume': self.safe_string(latestQuote, 'as'),
885
+ 'vwap': self.safe_string(dailyBar, 'vw'),
886
+ 'open': self.safe_string(dailyBar, 'o'),
887
+ 'close': self.safe_string(dailyBar, 'c'),
888
+ 'last': self.safe_string(latestTrade, 'p'),
889
+ 'previousClose': self.safe_string(prevDailyBar, 'c'),
890
+ 'change': None,
891
+ 'percentage': None,
892
+ 'average': None,
893
+ 'baseVolume': self.safe_string(dailyBar, 'v'),
894
+ 'quoteVolume': self.safe_string(dailyBar, 'n'),
895
+ }, market)
896
+ results.append(ticker)
897
+ return self.filter_by_array(results, 'symbol', symbols)
898
+
899
+ def generate_client_order_id(self, params):
900
+ clientOrderIdprefix = self.safe_string(self.options, 'clientOrderId')
901
+ uuid = self.uuid()
902
+ parts = uuid.split('-')
903
+ random_id = ''.join(parts)
904
+ defaultClientId = self.implode_params(clientOrderIdprefix, {'id': random_id})
905
+ clientOrderId = self.safe_string(params, 'clientOrderId', defaultClientId)
906
+ return clientOrderId
907
+
666
908
  def create_order(self, symbol: str, type: OrderType, side: OrderSide, amount: float, price: Num = None, params={}):
667
909
  """
668
910
  create a trade order
669
- :see: https://docs.alpaca.markets/reference/postorder
911
+
912
+ https://docs.alpaca.markets/reference/postorder
913
+
670
914
  :param str symbol: unified symbol of the market to create an order in
671
915
  :param str type: 'market', 'limit' or 'stop_limit'
672
916
  :param str side: 'buy' or 'sell'
673
917
  :param float amount: how much of currency you want to trade in units of base currency
674
- :param float [price]: the price at which the order is to be fullfilled, in units of the quote currency, ignored in market orders
918
+ :param float [price]: the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
675
919
  :param dict [params]: extra parameters specific to the exchange API endpoint
676
920
  :param float [params.triggerPrice]: The price at which a trigger order is triggered at
677
921
  :returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
@@ -679,7 +923,7 @@ class alpaca(Exchange, ImplicitAPI):
679
923
  self.load_markets()
680
924
  market = self.market(symbol)
681
925
  id = market['id']
682
- request = {
926
+ request: dict = {
683
927
  'symbol': id,
684
928
  'qty': self.amount_to_precision(symbol, amount),
685
929
  'side': side,
@@ -699,13 +943,7 @@ class alpaca(Exchange, ImplicitAPI):
699
943
  defaultTIF = self.safe_string(self.options, 'defaultTimeInForce')
700
944
  request['time_in_force'] = self.safe_string(params, 'timeInForce', defaultTIF)
701
945
  params = self.omit(params, ['timeInForce', 'triggerPrice'])
702
- clientOrderIdprefix = self.safe_string(self.options, 'clientOrderId')
703
- uuid = self.uuid()
704
- parts = uuid.split('-')
705
- random_id = ''.join(parts)
706
- defaultClientId = self.implode_params(clientOrderIdprefix, {'id': random_id})
707
- clientOrderId = self.safe_string(params, 'clientOrderId', defaultClientId)
708
- request['client_order_id'] = clientOrderId
946
+ request['client_order_id'] = self.generate_client_order_id(params)
709
947
  params = self.omit(params, ['clientOrderId'])
710
948
  order = self.traderPrivatePostV2Orders(self.extend(request, params))
711
949
  #
@@ -749,13 +987,15 @@ class alpaca(Exchange, ImplicitAPI):
749
987
  def cancel_order(self, id: str, symbol: Str = None, params={}):
750
988
  """
751
989
  cancels an open order
752
- :see: https://docs.alpaca.markets/reference/deleteorderbyorderid
990
+
991
+ https://docs.alpaca.markets/reference/deleteorderbyorderid
992
+
753
993
  :param str id: order id
754
994
  :param str symbol: unified symbol of the market the order was made in
755
995
  :param dict [params]: extra parameters specific to the exchange API endpoint
756
996
  :returns dict: An `order structure <https://docs.ccxt.com/#/?id=order-structure>`
757
997
  """
758
- request = {
998
+ request: dict = {
759
999
  'order_id': id,
760
1000
  }
761
1001
  response = self.traderPrivateDeleteV2OrdersOrderId(self.extend(request, params))
@@ -765,12 +1005,14 @@ class alpaca(Exchange, ImplicitAPI):
765
1005
  # "message": "order is not found."
766
1006
  # }
767
1007
  #
768
- return self.safe_value(response, 'message', {})
1008
+ return self.parse_order(response)
769
1009
 
770
1010
  def cancel_all_orders(self, symbol: Str = None, params={}):
771
1011
  """
772
1012
  cancel all open orders in a market
773
- :see: https://docs.alpaca.markets/reference/deleteallorders
1013
+
1014
+ https://docs.alpaca.markets/reference/deleteallorders
1015
+
774
1016
  :param str symbol: alpaca cancelAllOrders cannot setting symbol, it will cancel all open orders
775
1017
  :param dict [params]: extra parameters specific to the exchange API endpoint
776
1018
  :returns dict[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
@@ -780,18 +1022,25 @@ class alpaca(Exchange, ImplicitAPI):
780
1022
  if isinstance(response, list):
781
1023
  return self.parse_orders(response, None)
782
1024
  else:
783
- return response
1025
+ return [
1026
+ self.safe_order({
1027
+ 'info': response,
1028
+ }),
1029
+ ]
784
1030
 
785
1031
  def fetch_order(self, id: str, symbol: Str = None, params={}):
786
1032
  """
787
1033
  fetches information on an order made by the user
788
- :see: https://docs.alpaca.markets/reference/getorderbyorderid
1034
+
1035
+ https://docs.alpaca.markets/reference/getorderbyorderid
1036
+
1037
+ :param str id: the order id
789
1038
  :param str symbol: unified symbol of the market the order was made in
790
1039
  :param dict [params]: extra parameters specific to the exchange API endpoint
791
1040
  :returns dict: An `order structure <https://docs.ccxt.com/#/?id=order-structure>`
792
1041
  """
793
1042
  self.load_markets()
794
- request = {
1043
+ request: dict = {
795
1044
  'order_id': id,
796
1045
  }
797
1046
  order = self.traderPrivateGetV2OrdersOrderId(self.extend(request, params))
@@ -802,7 +1051,9 @@ class alpaca(Exchange, ImplicitAPI):
802
1051
  def fetch_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
803
1052
  """
804
1053
  fetches information on multiple orders made by the user
805
- :see: https://docs.alpaca.markets/reference/getallorders
1054
+
1055
+ https://docs.alpaca.markets/reference/getallorders
1056
+
806
1057
  :param str symbol: unified market symbol of the market orders were made in
807
1058
  :param int [since]: the earliest time in ms to fetch orders for
808
1059
  :param int [limit]: the maximum number of order structures to retrieve
@@ -811,7 +1062,7 @@ class alpaca(Exchange, ImplicitAPI):
811
1062
  :returns Order[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
812
1063
  """
813
1064
  self.load_markets()
814
- request = {
1065
+ request: dict = {
815
1066
  'status': 'all',
816
1067
  }
817
1068
  market = None
@@ -872,7 +1123,9 @@ class alpaca(Exchange, ImplicitAPI):
872
1123
  def fetch_open_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
873
1124
  """
874
1125
  fetch all unfilled currently open orders
875
- :see: https://docs.alpaca.markets/reference/getallorders
1126
+
1127
+ https://docs.alpaca.markets/reference/getallorders
1128
+
876
1129
  :param str symbol: unified market symbol of the market orders were made in
877
1130
  :param int [since]: the earliest time in ms to fetch orders for
878
1131
  :param int [limit]: the maximum number of order structures to retrieve
@@ -880,7 +1133,7 @@ class alpaca(Exchange, ImplicitAPI):
880
1133
  :param int [params.until]: the latest time in ms to fetch orders for
881
1134
  :returns Order[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
882
1135
  """
883
- request = {
1136
+ request: dict = {
884
1137
  'status': 'open',
885
1138
  }
886
1139
  return self.fetch_orders(symbol, since, limit, self.extend(request, params))
@@ -888,7 +1141,9 @@ class alpaca(Exchange, ImplicitAPI):
888
1141
  def fetch_closed_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
889
1142
  """
890
1143
  fetches information on multiple closed orders made by the user
891
- :see: https://docs.alpaca.markets/reference/getallorders
1144
+
1145
+ https://docs.alpaca.markets/reference/getallorders
1146
+
892
1147
  :param str symbol: unified market symbol of the market orders were made in
893
1148
  :param int [since]: the earliest time in ms to fetch orders for
894
1149
  :param int [limit]: the maximum number of order structures to retrieve
@@ -896,12 +1151,54 @@ class alpaca(Exchange, ImplicitAPI):
896
1151
  :param int [params.until]: the latest time in ms to fetch orders for
897
1152
  :returns Order[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
898
1153
  """
899
- request = {
1154
+ request: dict = {
900
1155
  'status': 'closed',
901
1156
  }
902
1157
  return self.fetch_orders(symbol, since, limit, self.extend(request, params))
903
1158
 
904
- def parse_order(self, order, market: Market = None) -> Order:
1159
+ def edit_order(self, id: str, symbol: str, type: OrderType, side: OrderSide, amount: Num = None, price: Num = None, params={}):
1160
+ """
1161
+ edit a trade order
1162
+
1163
+ https://docs.alpaca.markets/reference/patchorderbyorderid-1
1164
+
1165
+ :param str id: order id
1166
+ :param str [symbol]: unified symbol of the market to create an order in
1167
+ :param str [type]: 'market', 'limit' or 'stop_limit'
1168
+ :param str [side]: 'buy' or 'sell'
1169
+ :param float [amount]: how much of the currency you want to trade in units of the base currency
1170
+ :param float [price]: the price for the order, in units of the quote currency, ignored in market orders
1171
+ :param dict [params]: extra parameters specific to the exchange API endpoint
1172
+ :param str [params.triggerPrice]: the price to trigger a stop order
1173
+ :param str [params.timeInForce]: for crypto trading either 'gtc' or 'ioc' can be used
1174
+ :param str [params.clientOrderId]: a unique identifier for the order, automatically generated if not sent
1175
+ :returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
1176
+ """
1177
+ self.load_markets()
1178
+ request: dict = {
1179
+ 'order_id': id,
1180
+ }
1181
+ market = None
1182
+ if symbol is not None:
1183
+ market = self.market(symbol)
1184
+ if amount is not None:
1185
+ request['qty'] = self.amount_to_precision(symbol, amount)
1186
+ triggerPrice = self.safe_string_n(params, ['triggerPrice', 'stop_price'])
1187
+ if triggerPrice is not None:
1188
+ request['stop_price'] = self.price_to_precision(symbol, triggerPrice)
1189
+ params = self.omit(params, 'triggerPrice')
1190
+ if price is not None:
1191
+ request['limit_price'] = self.price_to_precision(symbol, price)
1192
+ timeInForce = None
1193
+ timeInForce, params = self.handle_option_and_params_2(params, 'editOrder', 'timeInForce', 'defaultTimeInForce')
1194
+ if timeInForce is not None:
1195
+ request['time_in_force'] = timeInForce
1196
+ request['client_order_id'] = self.generate_client_order_id(params)
1197
+ params = self.omit(params, ['clientOrderId'])
1198
+ response = self.traderPrivatePatchV2OrdersOrderId(self.extend(request, params))
1199
+ return self.parse_order(response, market)
1200
+
1201
+ def parse_order(self, order: dict, market: Market = None) -> Order:
905
1202
  #
906
1203
  # {
907
1204
  # "id":"6ecfcc34-4bed-4b53-83ba-c564aa832a81",
@@ -972,7 +1269,6 @@ class alpaca(Exchange, ImplicitAPI):
972
1269
  'postOnly': None,
973
1270
  'side': self.safe_string(order, 'side'),
974
1271
  'price': self.safe_number(order, 'limit_price'),
975
- 'stopPrice': self.safe_number(order, 'stop_price'),
976
1272
  'triggerPrice': self.safe_number(order, 'stop_price'),
977
1273
  'cost': None,
978
1274
  'average': self.safe_number(order, 'filled_avg_price'),
@@ -984,8 +1280,8 @@ class alpaca(Exchange, ImplicitAPI):
984
1280
  'info': order,
985
1281
  }, market)
986
1282
 
987
- def parse_order_status(self, status):
988
- statuses = {
1283
+ def parse_order_status(self, status: Str):
1284
+ statuses: dict = {
989
1285
  'pending_new': 'open',
990
1286
  'accepted': 'open',
991
1287
  'new': 'open',
@@ -995,13 +1291,62 @@ class alpaca(Exchange, ImplicitAPI):
995
1291
  }
996
1292
  return self.safe_string(statuses, status, status)
997
1293
 
998
- def parse_time_in_force(self, timeInForce):
999
- timeInForces = {
1294
+ def parse_time_in_force(self, timeInForce: Str):
1295
+ timeInForces: dict = {
1000
1296
  'day': 'Day',
1001
1297
  }
1002
1298
  return self.safe_string(timeInForces, timeInForce, timeInForce)
1003
1299
 
1004
- def parse_trade(self, trade, market: Market = None) -> Trade:
1300
+ def fetch_my_trades(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}):
1301
+ """
1302
+ fetch all trades made by the user
1303
+
1304
+ https://docs.alpaca.markets/reference/getaccountactivitiesbyactivitytype-1
1305
+
1306
+ :param str [symbol]: unified market symbol
1307
+ :param int [since]: the earliest time in ms to fetch trades for
1308
+ :param int [limit]: the maximum number of trade structures to retrieve
1309
+ :param dict [params]: extra parameters specific to the exchange API endpoint
1310
+ :param int [params.until]: the latest time in ms to fetch trades for
1311
+ :returns Trade[]: a list of `trade structures <https://docs.ccxt.com/#/?id=trade-structure>`
1312
+ """
1313
+ self.load_markets()
1314
+ market = None
1315
+ request: dict = {
1316
+ 'activity_type': 'FILL',
1317
+ }
1318
+ if symbol is not None:
1319
+ market = self.market(symbol)
1320
+ if since is not None:
1321
+ request['after'] = since
1322
+ if limit is not None:
1323
+ request['page_size'] = limit
1324
+ request, params = self.handle_until_option('until', request, params)
1325
+ response = self.traderPrivateGetV2AccountActivitiesActivityType(self.extend(request, params))
1326
+ #
1327
+ # [
1328
+ # {
1329
+ # "id": "20221228071929579::ca2aafd0-1270-4b56-b0a9-85423b4a07c8",
1330
+ # "activity_type": "FILL",
1331
+ # "transaction_time": "2022-12-28T12:19:29.579352Z",
1332
+ # "type": "fill",
1333
+ # "price": "67.31",
1334
+ # "qty": "0.07",
1335
+ # "side": "sell",
1336
+ # "symbol": "LTC/USD",
1337
+ # "leaves_qty": "0",
1338
+ # "order_id": "82eebcf7-6e66-4b7e-93f8-be0df0e4f12e",
1339
+ # "cum_qty": "0.07",
1340
+ # "order_status": "filled",
1341
+ # "swap_rate": "1"
1342
+ # },
1343
+ # ]
1344
+ #
1345
+ return self.parse_trades(response, market, since, limit)
1346
+
1347
+ def parse_trade(self, trade: dict, market: Market = None) -> Trade:
1348
+ #
1349
+ # fetchTrades
1005
1350
  #
1006
1351
  # {
1007
1352
  # "t":"2022-06-14T05:00:00.027869Z",
@@ -1012,25 +1357,43 @@ class alpaca(Exchange, ImplicitAPI):
1012
1357
  # "i":"355681339"
1013
1358
  # }
1014
1359
  #
1015
- marketId = self.safe_string(trade, 'S')
1360
+ # fetchMyTrades
1361
+ #
1362
+ # {
1363
+ # "id": "20221228071929579::ca2aafd0-1270-4b56-b0a9-85423b4a07c8",
1364
+ # "activity_type": "FILL",
1365
+ # "transaction_time": "2022-12-28T12:19:29.579352Z",
1366
+ # "type": "fill",
1367
+ # "price": "67.31",
1368
+ # "qty": "0.07",
1369
+ # "side": "sell",
1370
+ # "symbol": "LTC/USD",
1371
+ # "leaves_qty": "0",
1372
+ # "order_id": "82eebcf7-6e66-4b7e-93f8-be0df0e4f12e",
1373
+ # "cum_qty": "0.07",
1374
+ # "order_status": "filled",
1375
+ # "swap_rate": "1"
1376
+ # },
1377
+ #
1378
+ marketId = self.safe_string_2(trade, 'S', 'symbol')
1016
1379
  symbol = self.safe_symbol(marketId, market)
1017
- datetime = self.safe_string(trade, 't')
1380
+ datetime = self.safe_string_2(trade, 't', 'transaction_time')
1018
1381
  timestamp = self.parse8601(datetime)
1019
1382
  alpacaSide = self.safe_string(trade, 'tks')
1020
- side: str
1383
+ side = self.safe_string(trade, 'side')
1021
1384
  if alpacaSide == 'B':
1022
1385
  side = 'buy'
1023
1386
  elif alpacaSide == 'S':
1024
1387
  side = 'sell'
1025
- priceString = self.safe_string(trade, 'p')
1026
- amountString = self.safe_string(trade, 's')
1388
+ priceString = self.safe_string_2(trade, 'p', 'price')
1389
+ amountString = self.safe_string_2(trade, 's', 'qty')
1027
1390
  return self.safe_trade({
1028
1391
  'info': trade,
1029
- 'id': self.safe_string(trade, 'i'),
1392
+ 'id': self.safe_string_2(trade, 'i', 'id'),
1030
1393
  'timestamp': timestamp,
1031
1394
  'datetime': self.iso8601(timestamp),
1032
1395
  'symbol': symbol,
1033
- 'order': None,
1396
+ 'order': self.safe_string(trade, 'order_id'),
1034
1397
  'type': None,
1035
1398
  'side': side,
1036
1399
  'takerOrMaker': 'taker',
@@ -1040,11 +1403,312 @@ class alpaca(Exchange, ImplicitAPI):
1040
1403
  'fee': None,
1041
1404
  }, market)
1042
1405
 
1406
+ def fetch_deposit_address(self, code: str, params={}) -> DepositAddress:
1407
+ """
1408
+ fetch the deposit address for a currency associated with self account
1409
+
1410
+ https://docs.alpaca.markets/reference/listcryptofundingwallets
1411
+
1412
+ :param str code: unified currency code
1413
+ :param dict [params]: extra parameters specific to the exchange API endpoint
1414
+ :returns dict: an `address structure <https://docs.ccxt.com/#/?id=address-structure>`
1415
+ """
1416
+ self.load_markets()
1417
+ currency = self.currency(code)
1418
+ request: dict = {
1419
+ 'asset': currency['id'],
1420
+ }
1421
+ response = self.traderPrivateGetV2Wallets(self.extend(request, params))
1422
+ #
1423
+ # {
1424
+ # "asset_id": "4fa30c85-77b7-4cbc-92dd-7b7513640aad",
1425
+ # "address": "bc1q2fpskfnwem3uq9z8660e4z6pfv7aqfamysk75r",
1426
+ # "created_at": "2024-11-03T07:30:05.609976344Z"
1427
+ # }
1428
+ #
1429
+ return self.parse_deposit_address(response, currency)
1430
+
1431
+ def parse_deposit_address(self, depositAddress, currency: Currency = None) -> DepositAddress:
1432
+ #
1433
+ # {
1434
+ # "asset_id": "4fa30c85-77b7-4cbc-92dd-7b7513640aad",
1435
+ # "address": "bc1q2fpskfnwem3uq9z8660e4z6pfv7aqfamysk75r",
1436
+ # "created_at": "2024-11-03T07:30:05.609976344Z"
1437
+ # }
1438
+ #
1439
+ parsedCurrency = None
1440
+ if currency is not None:
1441
+ parsedCurrency = currency['id']
1442
+ return {
1443
+ 'info': depositAddress,
1444
+ 'currency': parsedCurrency,
1445
+ 'network': None,
1446
+ 'address': self.safe_string(depositAddress, 'address'),
1447
+ 'tag': None,
1448
+ }
1449
+
1450
+ def withdraw(self, code: str, amount: float, address: str, tag=None, params={}) -> Transaction:
1451
+ """
1452
+ make a withdrawal
1453
+
1454
+ https://docs.alpaca.markets/reference/createcryptotransferforaccount
1455
+
1456
+ :param str code: unified currency code
1457
+ :param float amount: the amount to withdraw
1458
+ :param str address: the address to withdraw to
1459
+ :param str tag: a memo for the transaction
1460
+ :param dict [params]: extra parameters specific to the exchange API endpoint
1461
+ :returns dict: a `transaction structure <https://docs.ccxt.com/#/?id=transaction-structure>`
1462
+ """
1463
+ tag, params = self.handle_withdraw_tag_and_params(tag, params)
1464
+ self.check_address(address)
1465
+ self.load_markets()
1466
+ currency = self.currency(code)
1467
+ if tag:
1468
+ address = address + ':' + tag
1469
+ request: dict = {
1470
+ 'asset': currency['id'],
1471
+ 'address': address,
1472
+ 'amount': self.number_to_string(amount),
1473
+ }
1474
+ response = self.traderPrivatePostV2WalletsTransfers(self.extend(request, params))
1475
+ #
1476
+ # {
1477
+ # "id": "e27b70a6-5610-40d7-8468-a516a284b776",
1478
+ # "tx_hash": null,
1479
+ # "direction": "OUTGOING",
1480
+ # "amount": "20",
1481
+ # "usd_value": "19.99856",
1482
+ # "chain": "ETH",
1483
+ # "asset": "USDT",
1484
+ # "from_address": "0x123930E4dCA196E070d39B60c644C8Aae02f23",
1485
+ # "to_address": "0x1232c0925196e4dcf05945f67f690153190fbaab",
1486
+ # "status": "PROCESSING",
1487
+ # "created_at": "2024-11-07T02:39:01.775495Z",
1488
+ # "network_fee": "4",
1489
+ # "fees": "0.1"
1490
+ # }
1491
+ #
1492
+ return self.parse_transaction(response, currency)
1493
+
1494
+ def fetch_transactions_helper(self, type, code, since, limit, params):
1495
+ self.load_markets()
1496
+ currency = None
1497
+ if code is not None:
1498
+ currency = self.currency(code)
1499
+ response = self.traderPrivateGetV2WalletsTransfers(params)
1500
+ #
1501
+ # {
1502
+ # "id": "e27b70a6-5610-40d7-8468-a516a284b776",
1503
+ # "tx_hash": null,
1504
+ # "direction": "OUTGOING",
1505
+ # "amount": "20",
1506
+ # "usd_value": "19.99856",
1507
+ # "chain": "ETH",
1508
+ # "asset": "USDT",
1509
+ # "from_address": "0x123930E4dCA196E070d39B60c644C8Aae02f23",
1510
+ # "to_address": "0x1232c0925196e4dcf05945f67f690153190fbaab",
1511
+ # "status": "PROCESSING",
1512
+ # "created_at": "2024-11-07T02:39:01.775495Z",
1513
+ # "network_fee": "4",
1514
+ # "fees": "0.1"
1515
+ # }
1516
+ #
1517
+ results = []
1518
+ for i in range(0, len(response)):
1519
+ entry = response[i]
1520
+ direction = self.safe_string(entry, 'direction')
1521
+ if direction == type:
1522
+ results.append(entry)
1523
+ elif type == 'BOTH':
1524
+ results.append(entry)
1525
+ return self.parse_transactions(results, currency, since, limit, params)
1526
+
1527
+ def fetch_deposits_withdrawals(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Transaction]:
1528
+ """
1529
+ fetch history of deposits and withdrawals
1530
+
1531
+ https://docs.alpaca.markets/reference/listcryptofundingtransfers
1532
+
1533
+ :param str [code]: unified currency code for the currency of the deposit/withdrawals, default is None
1534
+ :param int [since]: timestamp in ms of the earliest deposit/withdrawal, default is None
1535
+ :param int [limit]: max number of deposit/withdrawals to return, default is None
1536
+ :param dict [params]: extra parameters specific to the exchange API endpoint
1537
+ :returns dict: a list of `transaction structure <https://docs.ccxt.com/#/?id=transaction-structure>`
1538
+ """
1539
+ return self.fetch_transactions_helper('BOTH', code, since, limit, params)
1540
+
1541
+ def fetch_deposits(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Transaction]:
1542
+ """
1543
+ fetch all deposits made to an account
1544
+
1545
+ https://docs.alpaca.markets/reference/listcryptofundingtransfers
1546
+
1547
+ :param str [code]: unified currency code
1548
+ :param int [since]: the earliest time in ms to fetch deposits for
1549
+ :param int [limit]: the maximum number of deposit structures to retrieve
1550
+ :param dict [params]: extra parameters specific to the exchange API endpoint
1551
+ :returns dict[]: a list of `transaction structures <https://docs.ccxt.com/#/?id=transaction-structure>`
1552
+ """
1553
+ return self.fetch_transactions_helper('INCOMING', code, since, limit, params)
1554
+
1555
+ def fetch_withdrawals(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Transaction]:
1556
+ """
1557
+ fetch all withdrawals made from an account
1558
+
1559
+ https://docs.alpaca.markets/reference/listcryptofundingtransfers
1560
+
1561
+ :param str [code]: unified currency code
1562
+ :param int [since]: the earliest time in ms to fetch withdrawals for
1563
+ :param int [limit]: the maximum number of withdrawal structures to retrieve
1564
+ :param dict [params]: extra parameters specific to the exchange API endpoint
1565
+ :returns dict[]: a list of `transaction structures <https://docs.ccxt.com/#/?id=transaction-structure>`
1566
+ """
1567
+ return self.fetch_transactions_helper('OUTGOING', code, since, limit, params)
1568
+
1569
+ def parse_transaction(self, transaction: dict, currency: Currency = None) -> Transaction:
1570
+ #
1571
+ # {
1572
+ # "id": "e27b70a6-5610-40d7-8468-a516a284b776",
1573
+ # "tx_hash": null,
1574
+ # "direction": "OUTGOING",
1575
+ # "amount": "20",
1576
+ # "usd_value": "19.99856",
1577
+ # "chain": "ETH",
1578
+ # "asset": "USDT",
1579
+ # "from_address": "0x123930E4dCA196E070d39B60c644C8Aae02f23",
1580
+ # "to_address": "0x1232c0925196e4dcf05945f67f690153190fbaab",
1581
+ # "status": "PROCESSING",
1582
+ # "created_at": "2024-11-07T02:39:01.775495Z",
1583
+ # "network_fee": "4",
1584
+ # "fees": "0.1"
1585
+ # }
1586
+ #
1587
+ datetime = self.safe_string(transaction, 'created_at')
1588
+ currencyId = self.safe_string(transaction, 'asset')
1589
+ code = self.safe_currency_code(currencyId, currency)
1590
+ fees = self.safe_string(transaction, 'fees')
1591
+ networkFee = self.safe_string(transaction, 'network_fee')
1592
+ totalFee = Precise.string_add(fees, networkFee)
1593
+ fee = {
1594
+ 'cost': self.parse_number(totalFee),
1595
+ 'currency': code,
1596
+ }
1597
+ return {
1598
+ 'info': transaction,
1599
+ 'id': self.safe_string(transaction, 'id'),
1600
+ 'txid': self.safe_string(transaction, 'tx_hash'),
1601
+ 'timestamp': self.parse8601(datetime),
1602
+ 'datetime': datetime,
1603
+ 'network': self.safe_string(transaction, 'chain'),
1604
+ 'address': self.safe_string(transaction, 'to_address'),
1605
+ 'addressTo': self.safe_string(transaction, 'to_address'),
1606
+ 'addressFrom': self.safe_string(transaction, 'from_address'),
1607
+ 'tag': None,
1608
+ 'tagTo': None,
1609
+ 'tagFrom': None,
1610
+ 'type': self.parse_transaction_type(self.safe_string(transaction, 'direction')),
1611
+ 'amount': self.safe_number(transaction, 'amount'),
1612
+ 'currency': code,
1613
+ 'status': self.parse_transaction_status(self.safe_string(transaction, 'status')),
1614
+ 'updated': None,
1615
+ 'fee': fee,
1616
+ 'comment': None,
1617
+ 'internal': None,
1618
+ }
1619
+
1620
+ def parse_transaction_status(self, status: Str):
1621
+ statuses: dict = {
1622
+ 'PROCESSING': 'pending',
1623
+ 'FAILED': 'failed',
1624
+ 'COMPLETE': 'ok',
1625
+ }
1626
+ return self.safe_string(statuses, status, status)
1627
+
1628
+ def parse_transaction_type(self, type):
1629
+ types: dict = {
1630
+ 'INCOMING': 'deposit',
1631
+ 'OUTGOING': 'withdrawal',
1632
+ }
1633
+ return self.safe_string(types, type, type)
1634
+
1635
+ def fetch_balance(self, params={}) -> Balances:
1636
+ """
1637
+ query for balance and get the amount of funds available for trading or funds locked in orders
1638
+
1639
+ https://docs.alpaca.markets/reference/getaccount-1
1640
+
1641
+ :param dict [params]: extra parameters specific to the exchange API endpoint
1642
+ :returns dict: a `balance structure <https://docs.ccxt.com/#/?id=balance-structure>`
1643
+ """
1644
+ self.load_markets()
1645
+ response = self.traderPrivateGetV2Account(params)
1646
+ #
1647
+ # {
1648
+ # "id": "43a01bde-4eb1-64fssc26adb5",
1649
+ # "admin_configurations": {
1650
+ # "allow_instant_ach": True,
1651
+ # "max_margin_multiplier": "4"
1652
+ # },
1653
+ # "user_configurations": {
1654
+ # "fractional_trading": True,
1655
+ # "max_margin_multiplier": "4"
1656
+ # },
1657
+ # "account_number": "744873727",
1658
+ # "status": "ACTIVE",
1659
+ # "crypto_status": "ACTIVE",
1660
+ # "currency": "USD",
1661
+ # "buying_power": "5.92",
1662
+ # "regt_buying_power": "5.92",
1663
+ # "daytrading_buying_power": "0",
1664
+ # "effective_buying_power": "5.92",
1665
+ # "non_marginable_buying_power": "5.92",
1666
+ # "bod_dtbp": "0",
1667
+ # "cash": "5.92",
1668
+ # "accrued_fees": "0",
1669
+ # "portfolio_value": "48.6",
1670
+ # "pattern_day_trader": False,
1671
+ # "trading_blocked": False,
1672
+ # "transfers_blocked": False,
1673
+ # "account_blocked": False,
1674
+ # "created_at": "2022-06-13T14:59:18.318096Z",
1675
+ # "trade_suspended_by_user": False,
1676
+ # "multiplier": "1",
1677
+ # "shorting_enabled": False,
1678
+ # "equity": "48.6",
1679
+ # "last_equity": "48.8014266",
1680
+ # "long_market_value": "42.68",
1681
+ # "short_market_value": "0",
1682
+ # "position_market_value": "42.68",
1683
+ # "initial_margin": "0",
1684
+ # "maintenance_margin": "0",
1685
+ # "last_maintenance_margin": "0",
1686
+ # "sma": "5.92",
1687
+ # "daytrade_count": 0,
1688
+ # "balance_asof": "2024-12-10",
1689
+ # "crypto_tier": 1,
1690
+ # "intraday_adjustments": "0",
1691
+ # "pending_reg_taf_fees": "0"
1692
+ # }
1693
+ #
1694
+ return self.parse_balance(response)
1695
+
1696
+ def parse_balance(self, response) -> Balances:
1697
+ result: dict = {'info': response}
1698
+ account = self.account()
1699
+ currencyId = self.safe_string(response, 'currency')
1700
+ code = self.safe_currency_code(currencyId)
1701
+ account['free'] = self.safe_string(response, 'cash')
1702
+ account['total'] = self.safe_string(response, 'equity')
1703
+ result[code] = account
1704
+ return self.safe_balance(result)
1705
+
1043
1706
  def sign(self, path, api='public', method='GET', params={}, headers=None, body=None):
1044
1707
  endpoint = '/' + self.implode_params(path, params)
1045
1708
  url = self.implode_hostname(self.urls['api'][api[0]])
1046
1709
  headers = headers if (headers is not None) else {}
1047
1710
  if api[1] == 'private':
1711
+ self.check_required_credentials()
1048
1712
  headers['APCA-API-KEY-ID'] = self.apiKey
1049
1713
  headers['APCA-API-SECRET-KEY'] = self.secret
1050
1714
  query = self.omit(params, self.extract_params(path))
@@ -1057,7 +1721,7 @@ class alpaca(Exchange, ImplicitAPI):
1057
1721
  url = url + endpoint
1058
1722
  return {'url': url, 'method': method, 'body': body, 'headers': headers}
1059
1723
 
1060
- def handle_errors(self, code, reason, url, method, headers, body, response, requestHeaders, requestBody):
1724
+ def handle_errors(self, code: int, reason: str, url: str, method: str, headers: dict, body: str, response, requestHeaders, requestBody):
1061
1725
  if response is None:
1062
1726
  return None # default error handler
1063
1727
  # {