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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (528) hide show
  1. ccxt/__init__.py +39 -35
  2. ccxt/abantether.py +9 -9
  3. ccxt/abstract/alpaca.py +4 -0
  4. ccxt/abstract/apex.py +31 -0
  5. ccxt/abstract/bigone.py +1 -1
  6. ccxt/abstract/binance.py +106 -48
  7. ccxt/abstract/binancecoinm.py +106 -48
  8. ccxt/abstract/binanceus.py +141 -83
  9. ccxt/abstract/binanceusdm.py +106 -48
  10. ccxt/abstract/bingx.py +50 -1
  11. ccxt/abstract/bitbank.py +5 -0
  12. ccxt/abstract/bitfinex.py +136 -65
  13. ccxt/abstract/bitflyer.py +1 -0
  14. ccxt/abstract/bitget.py +67 -0
  15. ccxt/abstract/bitmart.py +19 -1
  16. ccxt/abstract/bitopro.py +1 -0
  17. ccxt/abstract/bitrue.py +68 -68
  18. ccxt/abstract/bitstamp.py +1 -0
  19. ccxt/abstract/blofin.py +30 -0
  20. ccxt/abstract/btcbox.py +2 -0
  21. ccxt/abstract/bybit.py +28 -13
  22. ccxt/abstract/cex.py +28 -29
  23. ccxt/abstract/coinbaseexchange.py +1 -0
  24. ccxt/abstract/coinbaseinternational.py +1 -1
  25. ccxt/abstract/cryptocom.py +16 -0
  26. ccxt/abstract/cryptomus.py +20 -0
  27. ccxt/abstract/defx.py +69 -0
  28. ccxt/abstract/deribit.py +1 -0
  29. ccxt/abstract/derive.py +117 -0
  30. ccxt/abstract/digifinex.py +1 -0
  31. ccxt/abstract/ellipx.py +25 -0
  32. ccxt/abstract/foxbit.py +26 -0
  33. ccxt/abstract/gate.py +19 -0
  34. ccxt/abstract/gateio.py +19 -0
  35. ccxt/abstract/gemini.py +1 -0
  36. ccxt/abstract/hibachi.py +26 -0
  37. ccxt/abstract/hyperliquid.py +1 -1
  38. ccxt/abstract/independentreserve.py +6 -0
  39. ccxt/abstract/kraken.py +1 -0
  40. ccxt/abstract/krakenfutures.py +4 -0
  41. ccxt/abstract/kucoin.py +10 -0
  42. ccxt/abstract/kucoinfutures.py +18 -0
  43. ccxt/abstract/lbank.py +2 -1
  44. ccxt/abstract/luno.py +1 -0
  45. ccxt/abstract/mexc.py +2 -0
  46. ccxt/abstract/modetrade.py +119 -0
  47. ccxt/abstract/myokx.py +349 -0
  48. ccxt/abstract/oceanex.py +5 -0
  49. ccxt/abstract/okx.py +25 -0
  50. ccxt/abstract/okxus.py +349 -0
  51. ccxt/abstract/onetrading.py +0 -12
  52. ccxt/abstract/paradex.py +23 -0
  53. ccxt/abstract/phemex.py +2 -0
  54. ccxt/abstract/poloniex.py +36 -0
  55. ccxt/abstract/tradeogre.py +3 -1
  56. ccxt/abstract/upbit.py +51 -34
  57. ccxt/abstract/whitebit.py +16 -0
  58. ccxt/abstract/woo.py +64 -6
  59. ccxt/abstract/xt.py +10 -5
  60. ccxt/afratether.py +7 -7
  61. ccxt/alpaca.py +828 -51
  62. ccxt/apex.py +1875 -0
  63. ccxt/arzinja.py +7 -7
  64. ccxt/arzplus.py +9 -9
  65. ccxt/ascendex.py +501 -306
  66. ccxt/async_support/__init__.py +39 -35
  67. ccxt/async_support/abantether.py +10 -10
  68. ccxt/async_support/afratether.py +9 -9
  69. ccxt/async_support/alpaca.py +828 -51
  70. ccxt/async_support/apex.py +1875 -0
  71. ccxt/async_support/arzinja.py +10 -10
  72. ccxt/async_support/arzplus.py +12 -12
  73. ccxt/async_support/ascendex.py +502 -306
  74. ccxt/async_support/base/exchange.py +303 -89
  75. ccxt/async_support/base/ws/cache.py +9 -3
  76. ccxt/async_support/base/ws/client.py +173 -38
  77. ccxt/async_support/base/ws/future.py +25 -37
  78. ccxt/async_support/bequant.py +5 -3
  79. ccxt/async_support/bigone.py +279 -144
  80. ccxt/async_support/binance.py +2347 -1158
  81. ccxt/async_support/binancecoinm.py +9 -3
  82. ccxt/async_support/binanceus.py +17 -3
  83. ccxt/async_support/binanceusdm.py +9 -4
  84. ccxt/async_support/bingx.py +2962 -920
  85. ccxt/async_support/bit2c.py +147 -27
  86. ccxt/async_support/bitbank.py +151 -23
  87. ccxt/async_support/bitbns.py +104 -30
  88. ccxt/async_support/bitfinex.py +3291 -1113
  89. ccxt/async_support/bitflyer.py +202 -27
  90. ccxt/async_support/bitget.py +3683 -1538
  91. ccxt/async_support/bithumb.py +195 -38
  92. ccxt/async_support/bitimen.py +12 -12
  93. ccxt/async_support/bitir.py +38 -38
  94. ccxt/async_support/bitmart.py +1288 -350
  95. ccxt/async_support/bitmex.py +260 -75
  96. ccxt/async_support/bitopro.py +262 -62
  97. ccxt/async_support/bitpin.py +17 -16
  98. ccxt/async_support/bitrue.py +459 -290
  99. ccxt/async_support/bitso.py +199 -54
  100. ccxt/async_support/bitstamp.py +230 -96
  101. ccxt/async_support/bitteam.py +167 -25
  102. ccxt/async_support/{huobijp.py → bittrade.py} +158 -30
  103. ccxt/async_support/bitvavo.py +213 -49
  104. ccxt/async_support/blockchaincom.py +160 -46
  105. ccxt/async_support/blofin.py +502 -120
  106. ccxt/async_support/btcalpha.py +169 -31
  107. ccxt/async_support/btcbox.py +292 -23
  108. ccxt/async_support/btcmarkets.py +211 -58
  109. ccxt/async_support/btcturk.py +161 -38
  110. ccxt/async_support/bybit.py +1775 -1030
  111. ccxt/async_support/cex.py +1440 -1303
  112. ccxt/async_support/coinbase.py +724 -212
  113. ccxt/async_support/coinbaseadvanced.py +2 -1
  114. ccxt/async_support/coinbaseexchange.py +388 -89
  115. ccxt/async_support/coinbaseinternational.py +412 -57
  116. ccxt/async_support/coincatch.py +177 -78
  117. ccxt/async_support/coincheck.py +135 -19
  118. ccxt/async_support/coinex.py +606 -232
  119. ccxt/async_support/coinmate.py +189 -63
  120. ccxt/async_support/coinmetro.py +195 -54
  121. ccxt/async_support/coinone.py +158 -51
  122. ccxt/async_support/coinsph.py +336 -61
  123. ccxt/async_support/coinspot.py +151 -52
  124. ccxt/async_support/cryptocom.py +661 -111
  125. ccxt/async_support/cryptomus.py +1137 -0
  126. ccxt/async_support/defx.py +2071 -0
  127. ccxt/async_support/delta.py +299 -99
  128. ccxt/async_support/deribit.py +348 -126
  129. ccxt/async_support/derive.py +2572 -0
  130. ccxt/async_support/digifinex.py +430 -214
  131. ccxt/async_support/ellipx.py +2029 -0
  132. ccxt/async_support/eterex.py +10 -10
  133. ccxt/async_support/excoino.py +31 -31
  134. ccxt/async_support/exir.py +14 -14
  135. ccxt/async_support/exmo.py +344 -131
  136. ccxt/async_support/exnovin.py +10 -10
  137. ccxt/async_support/farhadexchange.py +12 -12
  138. ccxt/async_support/fmfwio.py +2 -1
  139. ccxt/async_support/foxbit.py +1935 -0
  140. ccxt/async_support/gate.py +1351 -529
  141. ccxt/async_support/gateio.py +2 -1
  142. ccxt/async_support/gemini.py +144 -39
  143. ccxt/async_support/hashkey.py +152 -109
  144. ccxt/async_support/hibachi.py +2080 -0
  145. ccxt/async_support/hitbtc.py +395 -167
  146. ccxt/async_support/hitobit.py +12 -12
  147. ccxt/async_support/hollaex.py +307 -119
  148. ccxt/async_support/htx.py +851 -383
  149. ccxt/async_support/huobi.py +2 -1
  150. ccxt/async_support/hyperliquid.py +1848 -536
  151. ccxt/async_support/independentreserve.py +288 -15
  152. ccxt/async_support/indodax.py +190 -33
  153. ccxt/async_support/jibitex.py +12 -12
  154. ccxt/async_support/kraken.py +795 -351
  155. ccxt/async_support/krakenfutures.py +214 -62
  156. ccxt/async_support/kucoin.py +715 -396
  157. ccxt/async_support/kucoinfutures.py +652 -89
  158. ccxt/async_support/latoken.py +217 -113
  159. ccxt/async_support/lbank.py +425 -97
  160. ccxt/async_support/luno.py +382 -35
  161. ccxt/async_support/mercado.py +113 -6
  162. ccxt/async_support/mexc.py +874 -437
  163. ccxt/async_support/modetrade.py +2818 -0
  164. ccxt/async_support/myokx.py +54 -0
  165. ccxt/async_support/ndax.py +221 -64
  166. ccxt/async_support/nobitex.py +31 -37
  167. ccxt/async_support/novadax.py +190 -34
  168. ccxt/async_support/oceanex.py +217 -28
  169. ccxt/async_support/okcoin.py +253 -145
  170. ccxt/async_support/okexchange.py +11 -11
  171. ccxt/async_support/okx.py +1088 -351
  172. ccxt/async_support/okxus.py +54 -0
  173. ccxt/async_support/ompfinex.py +25 -24
  174. ccxt/async_support/onetrading.py +213 -392
  175. ccxt/async_support/oxfun.py +245 -166
  176. ccxt/async_support/p2b.py +151 -29
  177. ccxt/async_support/paradex.py +562 -49
  178. ccxt/async_support/paymium.py +82 -19
  179. ccxt/async_support/phemex.py +713 -172
  180. ccxt/async_support/poloniex.py +1602 -283
  181. ccxt/async_support/probit.py +224 -95
  182. ccxt/async_support/ramzinex.py +30 -27
  183. ccxt/async_support/sarmayex.py +9 -9
  184. ccxt/async_support/sarrafex.py +13 -13
  185. ccxt/async_support/tabdeal.py +14 -13
  186. ccxt/async_support/tetherland.py +9 -9
  187. ccxt/async_support/timex.py +210 -51
  188. ccxt/async_support/tokocrypto.py +167 -47
  189. ccxt/async_support/tradeogre.py +266 -31
  190. ccxt/async_support/twox.py +9 -9
  191. ccxt/async_support/ubitex.py +12 -12
  192. ccxt/async_support/upbit.py +568 -165
  193. ccxt/async_support/vertex.py +160 -32
  194. ccxt/async_support/wallex.py +12 -12
  195. ccxt/async_support/wavesexchange.py +165 -30
  196. ccxt/async_support/whitebit.py +975 -127
  197. ccxt/async_support/woo.py +1918 -1016
  198. ccxt/async_support/woofipro.py +433 -141
  199. ccxt/async_support/xt.py +649 -193
  200. ccxt/async_support/yobit.py +195 -70
  201. ccxt/async_support/zaif.py +91 -15
  202. ccxt/async_support/zonda.py +151 -36
  203. ccxt/base/decimal_to_precision.py +14 -10
  204. ccxt/base/errors.py +49 -18
  205. ccxt/base/exchange.py +1556 -450
  206. ccxt/base/precise.py +10 -0
  207. ccxt/base/types.py +114 -6
  208. ccxt/bequant.py +5 -3
  209. ccxt/bigone.py +279 -144
  210. ccxt/binance.py +2347 -1158
  211. ccxt/binancecoinm.py +9 -3
  212. ccxt/binanceus.py +17 -3
  213. ccxt/binanceusdm.py +9 -4
  214. ccxt/bingx.py +2962 -920
  215. ccxt/bit2c.py +147 -27
  216. ccxt/bitbank.py +151 -23
  217. ccxt/bitbns.py +104 -30
  218. ccxt/bitfinex.py +3290 -1113
  219. ccxt/bitflyer.py +202 -27
  220. ccxt/bitget.py +3683 -1538
  221. ccxt/bithumb.py +194 -38
  222. ccxt/bitimen.py +9 -9
  223. ccxt/bitir.py +35 -35
  224. ccxt/bitmart.py +1288 -350
  225. ccxt/bitmex.py +260 -75
  226. ccxt/bitopro.py +262 -62
  227. ccxt/bitpin.py +15 -14
  228. ccxt/bitrue.py +459 -290
  229. ccxt/bitso.py +199 -54
  230. ccxt/bitstamp.py +230 -96
  231. ccxt/bitteam.py +167 -25
  232. ccxt/{huobijp.py → bittrade.py} +158 -30
  233. ccxt/bitvavo.py +213 -49
  234. ccxt/blockchaincom.py +160 -46
  235. ccxt/blofin.py +502 -120
  236. ccxt/btcalpha.py +169 -31
  237. ccxt/btcbox.py +291 -23
  238. ccxt/btcmarkets.py +211 -58
  239. ccxt/btcturk.py +161 -38
  240. ccxt/bybit.py +1775 -1030
  241. ccxt/cex.py +1439 -1303
  242. ccxt/coinbase.py +724 -212
  243. ccxt/coinbaseadvanced.py +2 -1
  244. ccxt/coinbaseexchange.py +388 -89
  245. ccxt/coinbaseinternational.py +412 -57
  246. ccxt/coincatch.py +177 -78
  247. ccxt/coincheck.py +135 -19
  248. ccxt/coinex.py +606 -232
  249. ccxt/coinmate.py +189 -63
  250. ccxt/coinmetro.py +194 -54
  251. ccxt/coinone.py +158 -51
  252. ccxt/coinsph.py +336 -61
  253. ccxt/coinspot.py +151 -52
  254. ccxt/cryptocom.py +661 -111
  255. ccxt/cryptomus.py +1137 -0
  256. ccxt/defx.py +2070 -0
  257. ccxt/delta.py +299 -99
  258. ccxt/deribit.py +348 -126
  259. ccxt/derive.py +2571 -0
  260. ccxt/digifinex.py +430 -214
  261. ccxt/ellipx.py +2029 -0
  262. ccxt/eterex.py +7 -7
  263. ccxt/excoino.py +29 -29
  264. ccxt/exir.py +11 -11
  265. ccxt/exmo.py +343 -131
  266. ccxt/exnovin.py +8 -8
  267. ccxt/farhadexchange.py +10 -10
  268. ccxt/fmfwio.py +2 -1
  269. ccxt/foxbit.py +1935 -0
  270. ccxt/gate.py +1351 -529
  271. ccxt/gateio.py +2 -1
  272. ccxt/gemini.py +144 -39
  273. ccxt/hashkey.py +152 -109
  274. ccxt/hibachi.py +2079 -0
  275. ccxt/hitbtc.py +395 -167
  276. ccxt/hitobit.py +9 -9
  277. ccxt/hollaex.py +307 -119
  278. ccxt/htx.py +851 -383
  279. ccxt/huobi.py +2 -1
  280. ccxt/hyperliquid.py +1848 -536
  281. ccxt/independentreserve.py +287 -15
  282. ccxt/indodax.py +190 -33
  283. ccxt/jibitex.py +9 -9
  284. ccxt/kraken.py +794 -351
  285. ccxt/krakenfutures.py +214 -62
  286. ccxt/kucoin.py +715 -396
  287. ccxt/kucoinfutures.py +652 -89
  288. ccxt/latoken.py +217 -113
  289. ccxt/lbank.py +425 -97
  290. ccxt/luno.py +382 -35
  291. ccxt/mercado.py +113 -6
  292. ccxt/mexc.py +873 -437
  293. ccxt/modetrade.py +2818 -0
  294. ccxt/myokx.py +54 -0
  295. ccxt/ndax.py +221 -64
  296. ccxt/nobitex.py +29 -35
  297. ccxt/novadax.py +190 -34
  298. ccxt/oceanex.py +217 -28
  299. ccxt/okcoin.py +253 -145
  300. ccxt/okexchange.py +9 -9
  301. ccxt/okx.py +1088 -351
  302. ccxt/okxus.py +54 -0
  303. ccxt/ompfinex.py +22 -21
  304. ccxt/onetrading.py +213 -392
  305. ccxt/oxfun.py +245 -166
  306. ccxt/p2b.py +151 -29
  307. ccxt/paradex.py +562 -49
  308. ccxt/paymium.py +82 -19
  309. ccxt/phemex.py +712 -172
  310. ccxt/poloniex.py +1601 -283
  311. ccxt/pro/__init__.py +76 -17
  312. ccxt/pro/alpaca.py +21 -6
  313. ccxt/pro/apex.py +984 -0
  314. ccxt/pro/ascendex.py +58 -10
  315. ccxt/pro/bequant.py +6 -1
  316. ccxt/pro/binance.py +728 -156
  317. ccxt/pro/binancecoinm.py +6 -2
  318. ccxt/pro/binanceus.py +8 -4
  319. ccxt/pro/binanceusdm.py +7 -2
  320. ccxt/pro/bingx.py +333 -142
  321. ccxt/pro/bitfinex.py +727 -262
  322. ccxt/pro/bitget.py +570 -79
  323. ccxt/pro/bithumb.py +20 -6
  324. ccxt/pro/bitmart.py +216 -87
  325. ccxt/pro/bitmex.py +47 -9
  326. ccxt/pro/bitopro.py +26 -14
  327. ccxt/pro/bitrue.py +22 -22
  328. ccxt/pro/bitstamp.py +54 -21
  329. ccxt/pro/{huobijp.py → bittrade.py} +7 -6
  330. ccxt/pro/bitvavo.py +191 -67
  331. ccxt/pro/blockchaincom.py +21 -8
  332. ccxt/pro/blofin.py +9 -1
  333. ccxt/pro/bybit.py +632 -245
  334. ccxt/pro/cex.py +59 -24
  335. ccxt/pro/coinbase.py +102 -73
  336. ccxt/pro/coinbaseadvanced.py +2 -1
  337. ccxt/pro/coinbaseexchange.py +8 -8
  338. ccxt/pro/coinbaseinternational.py +181 -25
  339. ccxt/pro/coincatch.py +6 -7
  340. ccxt/pro/coincheck.py +11 -6
  341. ccxt/pro/coinex.py +967 -665
  342. ccxt/pro/coinone.py +16 -9
  343. ccxt/pro/cryptocom.py +448 -45
  344. ccxt/pro/defx.py +831 -0
  345. ccxt/pro/deribit.py +150 -14
  346. ccxt/pro/derive.py +704 -0
  347. ccxt/pro/exmo.py +239 -6
  348. ccxt/pro/gate.py +623 -65
  349. ccxt/pro/gateio.py +2 -1
  350. ccxt/pro/gemini.py +27 -11
  351. ccxt/pro/hashkey.py +2 -2
  352. ccxt/pro/hitbtc.py +196 -91
  353. ccxt/pro/hollaex.py +23 -7
  354. ccxt/pro/htx.py +51 -14
  355. ccxt/pro/huobi.py +2 -1
  356. ccxt/pro/hyperliquid.py +591 -27
  357. ccxt/pro/independentreserve.py +9 -6
  358. ccxt/pro/kraken.py +640 -320
  359. ccxt/pro/krakenfutures.py +62 -35
  360. ccxt/pro/kucoin.py +267 -46
  361. ccxt/pro/kucoinfutures.py +165 -21
  362. ccxt/pro/lbank.py +102 -21
  363. ccxt/pro/luno.py +12 -8
  364. ccxt/pro/mexc.py +877 -111
  365. ccxt/pro/modetrade.py +1271 -0
  366. ccxt/pro/myokx.py +38 -0
  367. ccxt/pro/ndax.py +15 -2
  368. ccxt/pro/okcoin.py +23 -4
  369. ccxt/pro/okx.py +573 -98
  370. ccxt/pro/okxus.py +38 -0
  371. ccxt/pro/onetrading.py +30 -13
  372. ccxt/pro/oxfun.py +131 -27
  373. ccxt/pro/p2b.py +88 -22
  374. ccxt/pro/paradex.py +3 -3
  375. ccxt/pro/phemex.py +75 -21
  376. ccxt/pro/poloniex.py +124 -41
  377. ccxt/pro/probit.py +87 -80
  378. ccxt/pro/tradeogre.py +272 -0
  379. ccxt/pro/upbit.py +152 -12
  380. ccxt/pro/vertex.py +8 -3
  381. ccxt/pro/whitebit.py +58 -5
  382. ccxt/pro/woo.py +228 -37
  383. ccxt/pro/woofipro.py +106 -18
  384. ccxt/pro/xt.py +111 -5
  385. ccxt/probit.py +224 -95
  386. ccxt/protobuf/__init__.py +0 -0
  387. ccxt/protobuf/mexc/PrivateAccountV3Api_pb2.py +37 -0
  388. ccxt/protobuf/mexc/PrivateDealsV3Api_pb2.py +37 -0
  389. ccxt/protobuf/mexc/PrivateOrdersV3Api_pb2.py +37 -0
  390. ccxt/protobuf/mexc/PublicAggreBookTickerV3Api_pb2.py +37 -0
  391. ccxt/protobuf/mexc/PublicAggreDealsV3Api_pb2.py +39 -0
  392. ccxt/protobuf/mexc/PublicAggreDepthsV3Api_pb2.py +39 -0
  393. ccxt/protobuf/mexc/PublicBookTickerBatchV3Api_pb2.py +38 -0
  394. ccxt/protobuf/mexc/PublicBookTickerV3Api_pb2.py +37 -0
  395. ccxt/protobuf/mexc/PublicDealsV3Api_pb2.py +39 -0
  396. ccxt/protobuf/mexc/PublicIncreaseDepthsBatchV3Api_pb2.py +38 -0
  397. ccxt/protobuf/mexc/PublicIncreaseDepthsV3Api_pb2.py +39 -0
  398. ccxt/protobuf/mexc/PublicLimitDepthsV3Api_pb2.py +39 -0
  399. ccxt/protobuf/mexc/PublicMiniTickerV3Api_pb2.py +37 -0
  400. ccxt/protobuf/mexc/PublicMiniTickersV3Api_pb2.py +38 -0
  401. ccxt/protobuf/mexc/PublicSpotKlineV3Api_pb2.py +37 -0
  402. ccxt/protobuf/mexc/PushDataV3ApiWrapper_pb2.py +52 -0
  403. ccxt/protobuf/mexc/__init__.py +0 -0
  404. ccxt/ramzinex.py +28 -25
  405. ccxt/sarmayex.py +7 -7
  406. ccxt/sarrafex.py +10 -10
  407. ccxt/static_dependencies/__init__.py +1 -1
  408. ccxt/static_dependencies/lark/py.typed +0 -0
  409. ccxt/static_dependencies/marshmallow/py.typed +0 -0
  410. ccxt/static_dependencies/marshmallow_dataclass/py.typed +0 -0
  411. ccxt/static_dependencies/marshmallow_oneofschema/py.typed +0 -0
  412. ccxt/tabdeal.py +12 -11
  413. ccxt/test/tests_async.py +261 -57
  414. ccxt/test/tests_helpers.py +1 -3
  415. ccxt/test/tests_init.py +4 -3
  416. ccxt/test/tests_sync.py +261 -57
  417. ccxt/tetherland.py +7 -7
  418. ccxt/timex.py +210 -51
  419. ccxt/tokocrypto.py +167 -47
  420. ccxt/tradeogre.py +266 -31
  421. ccxt/twox.py +7 -7
  422. ccxt/ubitex.py +9 -9
  423. ccxt/upbit.py +568 -165
  424. ccxt/vertex.py +160 -32
  425. ccxt/wallex.py +9 -9
  426. ccxt/wavesexchange.py +165 -30
  427. ccxt/whitebit.py +975 -127
  428. ccxt/woo.py +1917 -1016
  429. ccxt/woofipro.py +432 -141
  430. ccxt/xt.py +649 -193
  431. ccxt/yobit.py +194 -70
  432. ccxt/zaif.py +91 -15
  433. ccxt/zonda.py +151 -36
  434. {ccxt_ir-4.3.46.0.2.dist-info → ccxt_ir-4.5.0.dist-info}/METADATA +225 -73
  435. ccxt_ir-4.5.0.dist-info/RECORD +743 -0
  436. {ccxt_ir-4.3.46.0.2.dist-info → ccxt_ir-4.5.0.dist-info}/WHEEL +1 -1
  437. ccxt/abstract/ace.py +0 -15
  438. ccxt/abstract/bitbay.py +0 -53
  439. ccxt/abstract/bitcoincom.py +0 -115
  440. ccxt/abstract/bitfinex2.py +0 -139
  441. ccxt/abstract/bitpanda.py +0 -35
  442. ccxt/abstract/bl3p.py +0 -19
  443. ccxt/abstract/coinlist.py +0 -54
  444. ccxt/abstract/currencycom.py +0 -68
  445. ccxt/abstract/hitbtc3.py +0 -115
  446. ccxt/abstract/idex.py +0 -26
  447. ccxt/abstract/kuna.py +0 -182
  448. ccxt/abstract/lykke.py +0 -29
  449. ccxt/abstract/poloniexfutures.py +0 -48
  450. ccxt/abstract/wazirx.py +0 -30
  451. ccxt/ace.py +0 -1012
  452. ccxt/async_support/ace.py +0 -1012
  453. ccxt/async_support/base/ws/aiohttp_client.py +0 -125
  454. ccxt/async_support/base/ws/fast_client.py +0 -96
  455. ccxt/async_support/bitbay.py +0 -17
  456. ccxt/async_support/bitcoincom.py +0 -17
  457. ccxt/async_support/bitfinex2.py +0 -3552
  458. ccxt/async_support/bitpanda.py +0 -16
  459. ccxt/async_support/bl3p.py +0 -485
  460. ccxt/async_support/coinlist.py +0 -2243
  461. ccxt/async_support/currencycom.py +0 -1950
  462. ccxt/async_support/hitbtc3.py +0 -16
  463. ccxt/async_support/idex.py +0 -1766
  464. ccxt/async_support/kuna.py +0 -1841
  465. ccxt/async_support/lykke.py +0 -1270
  466. ccxt/async_support/poloniexfutures.py +0 -1717
  467. ccxt/async_support/wazirx.py +0 -1224
  468. ccxt/bitbay.py +0 -17
  469. ccxt/bitcoincom.py +0 -17
  470. ccxt/bitfinex2.py +0 -3552
  471. ccxt/bitpanda.py +0 -16
  472. ccxt/bl3p.py +0 -485
  473. ccxt/coinlist.py +0 -2243
  474. ccxt/currencycom.py +0 -1950
  475. ccxt/hitbtc3.py +0 -16
  476. ccxt/idex.py +0 -1766
  477. ccxt/kuna.py +0 -1841
  478. ccxt/lykke.py +0 -1270
  479. ccxt/poloniexfutures.py +0 -1717
  480. ccxt/pro/bitcoincom.py +0 -34
  481. ccxt/pro/bitfinex2.py +0 -1083
  482. ccxt/pro/bitpanda.py +0 -15
  483. ccxt/pro/currencycom.py +0 -536
  484. ccxt/pro/idex.py +0 -672
  485. ccxt/pro/poloniexfutures.py +0 -990
  486. ccxt/pro/wazirx.py +0 -749
  487. ccxt/test/base/__init__.py +0 -29
  488. ccxt/test/base/test_account.py +0 -26
  489. ccxt/test/base/test_balance.py +0 -56
  490. ccxt/test/base/test_borrow_interest.py +0 -35
  491. ccxt/test/base/test_borrow_rate.py +0 -32
  492. ccxt/test/base/test_calculate_fee.py +0 -51
  493. ccxt/test/base/test_crypto.py +0 -127
  494. ccxt/test/base/test_currency.py +0 -76
  495. ccxt/test/base/test_datetime.py +0 -109
  496. ccxt/test/base/test_decimal_to_precision.py +0 -392
  497. ccxt/test/base/test_deep_extend.py +0 -68
  498. ccxt/test/base/test_deposit_withdrawal.py +0 -50
  499. ccxt/test/base/test_exchange_datetime_functions.py +0 -76
  500. ccxt/test/base/test_funding_rate_history.py +0 -29
  501. ccxt/test/base/test_last_price.py +0 -31
  502. ccxt/test/base/test_ledger_entry.py +0 -45
  503. ccxt/test/base/test_ledger_item.py +0 -48
  504. ccxt/test/base/test_leverage_tier.py +0 -33
  505. ccxt/test/base/test_liquidation.py +0 -50
  506. ccxt/test/base/test_margin_mode.py +0 -24
  507. ccxt/test/base/test_margin_modification.py +0 -35
  508. ccxt/test/base/test_market.py +0 -193
  509. ccxt/test/base/test_number.py +0 -411
  510. ccxt/test/base/test_ohlcv.py +0 -33
  511. ccxt/test/base/test_open_interest.py +0 -32
  512. ccxt/test/base/test_order.py +0 -64
  513. ccxt/test/base/test_order_book.py +0 -69
  514. ccxt/test/base/test_position.py +0 -60
  515. ccxt/test/base/test_shared_methods.py +0 -353
  516. ccxt/test/base/test_status.py +0 -24
  517. ccxt/test/base/test_throttle.py +0 -126
  518. ccxt/test/base/test_ticker.py +0 -92
  519. ccxt/test/base/test_trade.py +0 -47
  520. ccxt/test/base/test_trading_fee.py +0 -26
  521. ccxt/test/base/test_transaction.py +0 -39
  522. ccxt/test/test_async.py +0 -1649
  523. ccxt/test/test_sync.py +0 -1648
  524. ccxt/wazirx.py +0 -1224
  525. ccxt_ir-4.3.46.0.2.dist-info/RECORD +0 -772
  526. /ccxt/abstract/{huobijp.py → bittrade.py} +0 -0
  527. {ccxt_ir-4.3.46.0.2.dist-info → ccxt_ir-4.5.0.dist-info/licenses}/LICENSE.txt +0 -0
  528. {ccxt_ir-4.3.46.0.2.dist-info → ccxt_ir-4.5.0.dist-info}/top_level.txt +0 -0
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 Any, 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,11 +17,12 @@ 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):
22
24
 
23
- def describe(self):
25
+ def describe(self) -> Any:
24
26
  return self.deep_extend(super(alpaca, self).describe(), {
25
27
  'id': 'alpaca',
26
28
  'name': 'Alpaca',
@@ -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',
@@ -54,29 +56,77 @@ class alpaca(Exchange, ImplicitAPI):
54
56
  'swap': False,
55
57
  'future': False,
56
58
  'option': False,
59
+ 'addMargin': False,
60
+ 'borrowCrossMargin': False,
61
+ 'borrowIsolatedMargin': False,
62
+ 'borrowMargin': False,
57
63
  'cancelAllOrders': True,
58
64
  'cancelOrder': True,
59
65
  'closeAllPositions': False,
60
66
  'closePosition': False,
67
+ 'createMarketBuyOrder': True,
68
+ 'createMarketBuyOrderWithCost': True,
69
+ 'createMarketOrderWithCost': True,
61
70
  'createOrder': True,
62
- 'fetchBalance': False,
71
+ 'createOrderWithTakeProfitAndStopLoss': False,
72
+ 'createOrderWithTakeProfitAndStopLossWs': False,
73
+ 'createReduceOnlyOrder': False,
74
+ 'createStopOrder': True,
75
+ 'createTriggerOrder': True,
76
+ 'editOrder': True,
77
+ 'fetchBalance': True,
63
78
  'fetchBidsAsks': False,
79
+ 'fetchBorrowInterest': False,
80
+ 'fetchBorrowRate': False,
81
+ 'fetchBorrowRateHistories': False,
82
+ 'fetchBorrowRateHistory': False,
83
+ 'fetchBorrowRates': False,
84
+ 'fetchBorrowRatesPerSymbol': False,
64
85
  'fetchClosedOrders': True,
86
+ 'fetchCrossBorrowRate': False,
87
+ 'fetchCrossBorrowRates': False,
65
88
  'fetchCurrencies': False,
66
- 'fetchDepositAddress': False,
89
+ 'fetchDepositAddress': True,
67
90
  'fetchDepositAddressesByNetwork': False,
68
- 'fetchDeposits': False,
69
- 'fetchDepositsWithdrawals': False,
91
+ 'fetchDeposits': True,
92
+ 'fetchDepositsWithdrawals': True,
70
93
  'fetchFundingHistory': False,
94
+ 'fetchFundingInterval': False,
95
+ 'fetchFundingIntervals': False,
71
96
  'fetchFundingRate': False,
97
+ 'fetchFundingRateHistory': False,
72
98
  'fetchFundingRates': False,
99
+ 'fetchGreeks': False,
100
+ 'fetchIndexOHLCV': False,
101
+ 'fetchIsolatedBorrowRate': False,
102
+ 'fetchIsolatedBorrowRates': False,
103
+ 'fetchIsolatedPositions': False,
73
104
  'fetchL1OrderBook': True,
74
105
  'fetchL2OrderBook': False,
106
+ 'fetchLeverage': False,
107
+ 'fetchLeverages': False,
108
+ 'fetchLeverageTiers': False,
109
+ 'fetchLiquidations': False,
110
+ 'fetchLongShortRatio': False,
111
+ 'fetchLongShortRatioHistory': False,
112
+ 'fetchMarginAdjustmentHistory': False,
113
+ 'fetchMarginMode': False,
114
+ 'fetchMarginModes': False,
115
+ 'fetchMarketLeverageTiers': False,
75
116
  'fetchMarkets': True,
76
- 'fetchMyTrades': False,
117
+ 'fetchMarkOHLCV': False,
118
+ 'fetchMarkPrices': False,
119
+ 'fetchMyLiquidations': False,
120
+ 'fetchMySettlementHistory': False,
121
+ 'fetchMyTrades': True,
77
122
  'fetchOHLCV': True,
123
+ 'fetchOpenInterest': False,
124
+ 'fetchOpenInterestHistory': False,
125
+ 'fetchOpenInterests': False,
78
126
  'fetchOpenOrder': False,
79
127
  'fetchOpenOrders': True,
128
+ 'fetchOption': False,
129
+ 'fetchOptionChain': False,
80
130
  'fetchOrder': True,
81
131
  'fetchOrderBook': True,
82
132
  'fetchOrders': True,
@@ -87,9 +137,11 @@ class alpaca(Exchange, ImplicitAPI):
87
137
  'fetchPositionsForSymbol': False,
88
138
  'fetchPositionsHistory': False,
89
139
  'fetchPositionsRisk': False,
140
+ 'fetchPremiumIndexOHLCV': False,
141
+ 'fetchSettlementHistory': False,
90
142
  'fetchStatus': False,
91
- 'fetchTicker': False,
92
- 'fetchTickers': False,
143
+ 'fetchTicker': True,
144
+ 'fetchTickers': True,
93
145
  'fetchTime': True,
94
146
  'fetchTrades': True,
95
147
  'fetchTradingFee': False,
@@ -97,12 +149,18 @@ class alpaca(Exchange, ImplicitAPI):
97
149
  'fetchTransactionFees': False,
98
150
  'fetchTransactions': False,
99
151
  'fetchTransfers': False,
100
- 'fetchWithdrawals': False,
152
+ 'fetchVolatilityHistory': False,
153
+ 'fetchWithdrawals': True,
154
+ 'reduceMargin': False,
155
+ 'repayCrossMargin': False,
156
+ 'repayIsolatedMargin': False,
101
157
  'sandbox': True,
102
158
  'setLeverage': False,
159
+ 'setMargin': False,
103
160
  'setMarginMode': False,
161
+ 'setPositionMode': False,
104
162
  'transfer': False,
105
- 'withdraw': False,
163
+ 'withdraw': True,
106
164
  },
107
165
  'api': {
108
166
  'broker': {
@@ -128,14 +186,18 @@ class alpaca(Exchange, ImplicitAPI):
128
186
  'v2/assets/{symbol_or_asset_id}',
129
187
  'v2/corporate_actions/announcements/{id}',
130
188
  'v2/corporate_actions/announcements',
189
+ 'v2/wallets',
190
+ 'v2/wallets/transfers',
131
191
  ],
132
192
  'post': [
133
193
  'v2/orders',
134
194
  'v2/watchlists',
135
195
  'v2/watchlists/{watchlist_id}',
136
196
  'v2/watchlists:by_name',
197
+ 'v2/wallets/transfers',
137
198
  ],
138
199
  'put': [
200
+ 'v2/orders/{order_id}',
139
201
  'v2/watchlists/{watchlist_id}',
140
202
  'v2/watchlists:by_name',
141
203
  ],
@@ -264,6 +326,91 @@ class alpaca(Exchange, ImplicitAPI):
264
326
  'defaultTimeInForce': 'gtc', # fok, gtc, ioc
265
327
  'clientOrderId': 'ccxt_{id}',
266
328
  },
329
+ 'features': {
330
+ 'spot': {
331
+ 'sandbox': True,
332
+ 'createOrder': {
333
+ 'marginMode': False,
334
+ 'triggerPrice': True,
335
+ 'triggerPriceType': None,
336
+ 'triggerDirection': False,
337
+ 'stopLossPrice': False, # todo
338
+ 'takeProfitPrice': False, # todo
339
+ 'attachedStopLossTakeProfit': {
340
+ 'triggerPriceType': {
341
+ 'last': True,
342
+ 'mark': True,
343
+ 'index': True,
344
+ },
345
+ 'price': True,
346
+ },
347
+ 'timeInForce': {
348
+ 'IOC': True,
349
+ 'FOK': True,
350
+ 'PO': True,
351
+ 'GTD': False,
352
+ },
353
+ 'hedged': False,
354
+ 'trailing': True, # todo: implementation
355
+ 'leverage': False,
356
+ 'marketBuyRequiresPrice': False,
357
+ 'marketBuyByCost': False,
358
+ 'selfTradePrevention': False,
359
+ 'iceberg': False,
360
+ },
361
+ 'createOrders': None,
362
+ 'fetchMyTrades': {
363
+ 'marginMode': False,
364
+ 'limit': 100,
365
+ 'daysBack': 100000,
366
+ 'untilDays': 100000,
367
+ 'symbolRequired': False,
368
+ },
369
+ 'fetchOrder': {
370
+ 'marginMode': False,
371
+ 'trigger': False,
372
+ 'trailing': False,
373
+ 'symbolRequired': False,
374
+ },
375
+ 'fetchOpenOrders': {
376
+ 'marginMode': False,
377
+ 'limit': 500,
378
+ 'trigger': False,
379
+ 'trailing': False,
380
+ 'symbolRequired': False,
381
+ },
382
+ 'fetchOrders': {
383
+ 'marginMode': False,
384
+ 'limit': 500,
385
+ 'daysBack': 100000,
386
+ 'untilDays': 100000,
387
+ 'trigger': False,
388
+ 'trailing': False,
389
+ 'symbolRequired': False,
390
+ },
391
+ 'fetchClosedOrders': {
392
+ 'marginMode': False,
393
+ 'limit': 500,
394
+ 'daysBack': 100000,
395
+ 'daysBackCanceled': None,
396
+ 'untilDays': 100000,
397
+ 'trigger': False,
398
+ 'trailing': False,
399
+ 'symbolRequired': False,
400
+ },
401
+ 'fetchOHLCV': {
402
+ 'limit': 1000,
403
+ },
404
+ },
405
+ 'swap': {
406
+ 'linear': None,
407
+ 'inverse': None,
408
+ },
409
+ 'future': {
410
+ 'linear': None,
411
+ 'inverse': None,
412
+ },
413
+ },
267
414
  'exceptions': {
268
415
  'exact': {
269
416
  'forbidden.': PermissionDenied, # {"message": "forbidden."}
@@ -280,7 +427,7 @@ class alpaca(Exchange, ImplicitAPI):
280
427
  },
281
428
  })
282
429
 
283
- def fetch_time(self, params={}):
430
+ def fetch_time(self, params={}) -> Int:
284
431
  """
285
432
  fetches the current integer timestamp in milliseconds from the exchange server
286
433
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -306,7 +453,9 @@ class alpaca(Exchange, ImplicitAPI):
306
453
  def fetch_markets(self, params={}) -> List[Market]:
307
454
  """
308
455
  retrieves data on all markets for alpaca
309
- :see: https://docs.alpaca.markets/reference/get-v2-assets
456
+
457
+ https://docs.alpaca.markets/reference/get-v2-assets
458
+
310
459
  :param dict [params]: extra parameters specific to the exchange api endpoint
311
460
  :returns dict[]: an array of objects representing market data
312
461
  """
@@ -350,7 +499,7 @@ class alpaca(Exchange, ImplicitAPI):
350
499
  # "status": "active",
351
500
  # "tradable": True,
352
501
  # "marginable": False,
353
- # "maintenance_margin_requirement": 100,
502
+ # "maintenance_margin_requirement": 101,
354
503
  # "shortable": False,
355
504
  # "easy_to_borrow": False,
356
505
  # "fractionable": True,
@@ -430,8 +579,10 @@ class alpaca(Exchange, ImplicitAPI):
430
579
  def fetch_trades(self, symbol: str, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
431
580
  """
432
581
  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
582
+
583
+ https://docs.alpaca.markets/reference/cryptotrades
584
+ https://docs.alpaca.markets/reference/cryptolatesttrades
585
+
435
586
  :param str symbol: unified symbol of the market to fetch trades for
436
587
  :param int [since]: timestamp in ms of the earliest trade to fetch
437
588
  :param int [limit]: the maximum amount of trades to fetch
@@ -500,7 +651,9 @@ class alpaca(Exchange, ImplicitAPI):
500
651
  def fetch_order_book(self, symbol: str, limit: Int = None, params={}) -> OrderBook:
501
652
  """
502
653
  fetches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
503
- :see: https://docs.alpaca.markets/reference/cryptolatestorderbooks
654
+
655
+ https://docs.alpaca.markets/reference/cryptolatestorderbooks
656
+
504
657
  :param str symbol: unified symbol of the market to fetch the order book for
505
658
  :param int [limit]: the maximum amount of order book entries to return
506
659
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -553,16 +706,18 @@ class alpaca(Exchange, ImplicitAPI):
553
706
  # }
554
707
  # }
555
708
  #
556
- orderbooks = self.safe_value(response, 'orderbooks', {})
557
- rawOrderbook = self.safe_value(orderbooks, id, {})
709
+ orderbooks = self.safe_dict(response, 'orderbooks', {})
710
+ rawOrderbook = self.safe_dict(orderbooks, id, {})
558
711
  timestamp = self.parse8601(self.safe_string(rawOrderbook, 't'))
559
712
  return self.parse_order_book(rawOrderbook, market['symbol'], timestamp, 'b', 'a', 'p', 's')
560
713
 
561
714
  def fetch_ohlcv(self, symbol: str, timeframe='1m', since: Int = None, limit: Int = None, params={}) -> List[list]:
562
715
  """
563
716
  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
717
+
718
+ https://docs.alpaca.markets/reference/cryptobars
719
+ https://docs.alpaca.markets/reference/cryptolatestbars
720
+
566
721
  :param str symbol: unified symbol of the market to fetch OHLCV data for
567
722
  :param str timeframe: the length of time each candle represents
568
723
  :param int [since]: timestamp in ms of the earliest candle to fetch
@@ -670,17 +825,209 @@ class alpaca(Exchange, ImplicitAPI):
670
825
  self.safe_number(ohlcv, 'v'), # volume
671
826
  ]
672
827
 
828
+ def fetch_ticker(self, symbol: str, params={}) -> Ticker:
829
+ """
830
+ fetches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
831
+
832
+ https://docs.alpaca.markets/reference/cryptosnapshots-1
833
+
834
+ :param str symbol: unified symbol of the market to fetch the ticker for
835
+ :param dict [params]: extra parameters specific to the exchange API endpoint
836
+ :param str [params.loc]: crypto location, default: us
837
+ :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
838
+ """
839
+ self.load_markets()
840
+ symbol = self.symbol(symbol)
841
+ tickers = self.fetch_tickers([symbol], params)
842
+ return self.safe_dict(tickers, symbol)
843
+
844
+ def fetch_tickers(self, symbols: Strings = None, params={}) -> Tickers:
845
+ """
846
+ fetches price tickers for multiple markets, statistical information calculated over the past 24 hours for each market
847
+
848
+ https://docs.alpaca.markets/reference/cryptosnapshots-1
849
+
850
+ :param str[] symbols: unified symbols of the markets to fetch tickers for
851
+ :param dict [params]: extra parameters specific to the exchange API endpoint
852
+ :param str [params.loc]: crypto location, default: us
853
+ :returns dict: a dictionary of `ticker structures <https://docs.ccxt.com/#/?id=ticker-structure>`
854
+ """
855
+ if symbols is None:
856
+ raise ArgumentsRequired(self.id + ' fetchTickers() requires a symbols argument')
857
+ self.load_markets()
858
+ symbols = self.market_symbols(symbols)
859
+ loc = self.safe_string(params, 'loc', 'us')
860
+ ids = self.market_ids(symbols)
861
+ request = {
862
+ 'symbols': ','.join(ids),
863
+ 'loc': loc,
864
+ }
865
+ params = self.omit(params, 'loc')
866
+ response = self.marketPublicGetV1beta3CryptoLocSnapshots(self.extend(request, params))
867
+ #
868
+ # {
869
+ # "snapshots": {
870
+ # "BTC/USD": {
871
+ # "dailyBar": {
872
+ # "c": 69403.554,
873
+ # "h": 69609.6515,
874
+ # "l": 69013.26,
875
+ # "n": 9,
876
+ # "o": 69536.7,
877
+ # "t": "2024-11-01T05:00:00Z",
878
+ # "v": 0.210809181,
879
+ # "vw": 69327.655393908
880
+ # },
881
+ # "latestQuote": {
882
+ # "ap": 69424.19,
883
+ # "as": 0.68149,
884
+ # "bp": 69366.086,
885
+ # "bs": 0.68312,
886
+ # "t": "2024-11-01T08:31:41.880246926Z"
887
+ # },
888
+ # "latestTrade": {
889
+ # "i": 5272941104897543146,
890
+ # "p": 69416.9,
891
+ # "s": 0.014017324,
892
+ # "t": "2024-11-01T08:14:28.245088803Z",
893
+ # "tks": "B"
894
+ # },
895
+ # "minuteBar": {
896
+ # "c": 69403.554,
897
+ # "h": 69403.554,
898
+ # "l": 69399.125,
899
+ # "n": 0,
900
+ # "o": 69399.125,
901
+ # "t": "2024-11-01T08:30:00Z",
902
+ # "v": 0,
903
+ # "vw": 0
904
+ # },
905
+ # "prevDailyBar": {
906
+ # "c": 69515.1415,
907
+ # "h": 72668.837,
908
+ # "l": 68796.85,
909
+ # "n": 129,
910
+ # "o": 72258.9,
911
+ # "t": "2024-10-31T05:00:00Z",
912
+ # "v": 2.217683307,
913
+ # "vw": 70782.6811608144
914
+ # }
915
+ # },
916
+ # }
917
+ # }
918
+ #
919
+ results = []
920
+ snapshots = self.safe_dict(response, 'snapshots', {})
921
+ marketIds = list(snapshots.keys())
922
+ for i in range(0, len(marketIds)):
923
+ marketId = marketIds[i]
924
+ market = self.safe_market(marketId)
925
+ entry = self.safe_dict(snapshots, marketId)
926
+ dailyBar = self.safe_dict(entry, 'dailyBar', {})
927
+ prevDailyBar = self.safe_dict(entry, 'prevDailyBar', {})
928
+ latestQuote = self.safe_dict(entry, 'latestQuote', {})
929
+ latestTrade = self.safe_dict(entry, 'latestTrade', {})
930
+ datetime = self.safe_string(latestQuote, 't')
931
+ ticker = self.safe_ticker({
932
+ 'info': entry,
933
+ 'symbol': market['symbol'],
934
+ 'timestamp': self.parse8601(datetime),
935
+ 'datetime': datetime,
936
+ 'high': self.safe_string(dailyBar, 'h'),
937
+ 'low': self.safe_string(dailyBar, 'l'),
938
+ 'bid': self.safe_string(latestQuote, 'bp'),
939
+ 'bidVolume': self.safe_string(latestQuote, 'bs'),
940
+ 'ask': self.safe_string(latestQuote, 'ap'),
941
+ 'askVolume': self.safe_string(latestQuote, 'as'),
942
+ 'vwap': self.safe_string(dailyBar, 'vw'),
943
+ 'open': self.safe_string(dailyBar, 'o'),
944
+ 'close': self.safe_string(dailyBar, 'c'),
945
+ 'last': self.safe_string(latestTrade, 'p'),
946
+ 'previousClose': self.safe_string(prevDailyBar, 'c'),
947
+ 'change': None,
948
+ 'percentage': None,
949
+ 'average': None,
950
+ 'baseVolume': self.safe_string(dailyBar, 'v'),
951
+ 'quoteVolume': self.safe_string(dailyBar, 'n'),
952
+ }, market)
953
+ results.append(ticker)
954
+ return self.filter_by_array(results, 'symbol', symbols)
955
+
956
+ def generate_client_order_id(self, params):
957
+ clientOrderIdprefix = self.safe_string(self.options, 'clientOrderId')
958
+ uuid = self.uuid()
959
+ parts = uuid.split('-')
960
+ random_id = ''.join(parts)
961
+ defaultClientId = self.implode_params(clientOrderIdprefix, {'id': random_id})
962
+ clientOrderId = self.safe_string(params, 'clientOrderId', defaultClientId)
963
+ return clientOrderId
964
+
965
+ def create_market_order_with_cost(self, symbol: str, side: OrderSide, cost: float, params={}):
966
+ """
967
+ create a market order by providing the symbol, side and cost
968
+
969
+ https://docs.alpaca.markets/reference/postorder
970
+
971
+ :param str symbol: unified symbol of the market to create an order in
972
+ :param str side: 'buy' or 'sell'
973
+ :param float cost: how much you want to trade in units of the quote currency
974
+ :param dict [params]: extra parameters specific to the exchange API endpoint
975
+ :returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
976
+ """
977
+ self.load_markets()
978
+ req = {
979
+ 'cost': cost,
980
+ }
981
+ return self.create_order(symbol, 'market', side, 0, None, self.extend(req, params))
982
+
983
+ def create_market_buy_order_with_cost(self, symbol: str, cost: float, params={}):
984
+ """
985
+ create a market buy order by providing the symbol and cost
986
+
987
+ https://docs.alpaca.markets/reference/postorder
988
+
989
+ :param str symbol: unified symbol of the market to create an order in
990
+ :param float cost: how much you want to trade in units of the quote currency
991
+ :param dict [params]: extra parameters specific to the exchange API endpoint
992
+ :returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
993
+ """
994
+ self.load_markets()
995
+ req = {
996
+ 'cost': cost,
997
+ }
998
+ return self.create_order(symbol, 'market', 'buy', 0, None, self.extend(req, params))
999
+
1000
+ def create_market_sell_order_with_cost(self, symbol: str, cost: float, params={}):
1001
+ """
1002
+ create a market sell order by providing the symbol and cost
1003
+
1004
+ https://docs.alpaca.markets/reference/postorder
1005
+
1006
+ :param str symbol: unified symbol of the market to create an order in
1007
+ :param float cost: how much you want to trade in units of the quote currency
1008
+ :param dict [params]: extra parameters specific to the exchange API endpoint
1009
+ :returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
1010
+ """
1011
+ self.load_markets()
1012
+ req = {
1013
+ 'cost': cost,
1014
+ }
1015
+ return self.create_order(symbol, 'market', 'sell', cost, None, self.extend(req, params))
1016
+
673
1017
  def create_order(self, symbol: str, type: OrderType, side: OrderSide, amount: float, price: Num = None, params={}):
674
1018
  """
675
1019
  create a trade order
676
- :see: https://docs.alpaca.markets/reference/postorder
1020
+
1021
+ https://docs.alpaca.markets/reference/postorder
1022
+
677
1023
  :param str symbol: unified symbol of the market to create an order in
678
1024
  :param str type: 'market', 'limit' or 'stop_limit'
679
1025
  :param str side: 'buy' or 'sell'
680
1026
  :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
1027
+ :param float [price]: the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
682
1028
  :param dict [params]: extra parameters specific to the exchange API endpoint
683
1029
  :param float [params.triggerPrice]: The price at which a trigger order is triggered at
1030
+ :param float [params.cost]: *market orders only* the cost of the order in units of the quote currency
684
1031
  :returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
685
1032
  """
686
1033
  self.load_markets()
@@ -688,13 +1035,12 @@ class alpaca(Exchange, ImplicitAPI):
688
1035
  id = market['id']
689
1036
  request: dict = {
690
1037
  'symbol': id,
691
- 'qty': self.amount_to_precision(symbol, amount),
692
1038
  'side': side,
693
1039
  'type': type, # market, limit, stop_limit
694
1040
  }
695
1041
  triggerPrice = self.safe_string_n(params, ['triggerPrice', 'stop_price'])
696
1042
  if triggerPrice is not None:
697
- newType = None
1043
+ newType: str
698
1044
  if type.find('limit') >= 0:
699
1045
  newType = 'stop_limit'
700
1046
  else:
@@ -703,16 +1049,16 @@ class alpaca(Exchange, ImplicitAPI):
703
1049
  request['type'] = newType
704
1050
  if type.find('limit') >= 0:
705
1051
  request['limit_price'] = self.price_to_precision(symbol, price)
1052
+ cost = self.safe_string(params, 'cost')
1053
+ if cost is not None:
1054
+ params = self.omit(params, 'cost')
1055
+ request['notional'] = self.cost_to_precision(symbol, cost)
1056
+ else:
1057
+ request['qty'] = self.amount_to_precision(symbol, amount)
706
1058
  defaultTIF = self.safe_string(self.options, 'defaultTimeInForce')
707
1059
  request['time_in_force'] = self.safe_string(params, 'timeInForce', defaultTIF)
708
1060
  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
1061
+ request['client_order_id'] = self.generate_client_order_id(params)
716
1062
  params = self.omit(params, ['clientOrderId'])
717
1063
  order = self.traderPrivatePostV2Orders(self.extend(request, params))
718
1064
  #
@@ -756,7 +1102,9 @@ class alpaca(Exchange, ImplicitAPI):
756
1102
  def cancel_order(self, id: str, symbol: Str = None, params={}):
757
1103
  """
758
1104
  cancels an open order
759
- :see: https://docs.alpaca.markets/reference/deleteorderbyorderid
1105
+
1106
+ https://docs.alpaca.markets/reference/deleteorderbyorderid
1107
+
760
1108
  :param str id: order id
761
1109
  :param str symbol: unified symbol of the market the order was made in
762
1110
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -777,7 +1125,9 @@ class alpaca(Exchange, ImplicitAPI):
777
1125
  def cancel_all_orders(self, symbol: Str = None, params={}):
778
1126
  """
779
1127
  cancel all open orders in a market
780
- :see: https://docs.alpaca.markets/reference/deleteallorders
1128
+
1129
+ https://docs.alpaca.markets/reference/deleteallorders
1130
+
781
1131
  :param str symbol: alpaca cancelAllOrders cannot setting symbol, it will cancel all open orders
782
1132
  :param dict [params]: extra parameters specific to the exchange API endpoint
783
1133
  :returns dict[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
@@ -787,12 +1137,19 @@ class alpaca(Exchange, ImplicitAPI):
787
1137
  if isinstance(response, list):
788
1138
  return self.parse_orders(response, None)
789
1139
  else:
790
- return response
1140
+ return [
1141
+ self.safe_order({
1142
+ 'info': response,
1143
+ }),
1144
+ ]
791
1145
 
792
1146
  def fetch_order(self, id: str, symbol: Str = None, params={}):
793
1147
  """
794
1148
  fetches information on an order made by the user
795
- :see: https://docs.alpaca.markets/reference/getorderbyorderid
1149
+
1150
+ https://docs.alpaca.markets/reference/getorderbyorderid
1151
+
1152
+ :param str id: the order id
796
1153
  :param str symbol: unified symbol of the market the order was made in
797
1154
  :param dict [params]: extra parameters specific to the exchange API endpoint
798
1155
  :returns dict: An `order structure <https://docs.ccxt.com/#/?id=order-structure>`
@@ -809,7 +1166,9 @@ class alpaca(Exchange, ImplicitAPI):
809
1166
  def fetch_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
810
1167
  """
811
1168
  fetches information on multiple orders made by the user
812
- :see: https://docs.alpaca.markets/reference/getallorders
1169
+
1170
+ https://docs.alpaca.markets/reference/getallorders
1171
+
813
1172
  :param str symbol: unified market symbol of the market orders were made in
814
1173
  :param int [since]: the earliest time in ms to fetch orders for
815
1174
  :param int [limit]: the maximum number of order structures to retrieve
@@ -828,9 +1187,9 @@ class alpaca(Exchange, ImplicitAPI):
828
1187
  until = self.safe_integer(params, 'until')
829
1188
  if until is not None:
830
1189
  params = self.omit(params, 'until')
831
- request['endTime'] = until
1190
+ request['endTime'] = self.iso8601(until)
832
1191
  if since is not None:
833
- request['after'] = since
1192
+ request['after'] = self.iso8601(since)
834
1193
  if limit is not None:
835
1194
  request['limit'] = limit
836
1195
  response = self.traderPrivateGetV2Orders(self.extend(request, params))
@@ -879,7 +1238,9 @@ class alpaca(Exchange, ImplicitAPI):
879
1238
  def fetch_open_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
880
1239
  """
881
1240
  fetch all unfilled currently open orders
882
- :see: https://docs.alpaca.markets/reference/getallorders
1241
+
1242
+ https://docs.alpaca.markets/reference/getallorders
1243
+
883
1244
  :param str symbol: unified market symbol of the market orders were made in
884
1245
  :param int [since]: the earliest time in ms to fetch orders for
885
1246
  :param int [limit]: the maximum number of order structures to retrieve
@@ -895,7 +1256,9 @@ class alpaca(Exchange, ImplicitAPI):
895
1256
  def fetch_closed_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
896
1257
  """
897
1258
  fetches information on multiple closed orders made by the user
898
- :see: https://docs.alpaca.markets/reference/getallorders
1259
+
1260
+ https://docs.alpaca.markets/reference/getallorders
1261
+
899
1262
  :param str symbol: unified market symbol of the market orders were made in
900
1263
  :param int [since]: the earliest time in ms to fetch orders for
901
1264
  :param int [limit]: the maximum number of order structures to retrieve
@@ -908,6 +1271,48 @@ class alpaca(Exchange, ImplicitAPI):
908
1271
  }
909
1272
  return self.fetch_orders(symbol, since, limit, self.extend(request, params))
910
1273
 
1274
+ def edit_order(self, id: str, symbol: str, type: OrderType, side: OrderSide, amount: Num = None, price: Num = None, params={}):
1275
+ """
1276
+ edit a trade order
1277
+
1278
+ https://docs.alpaca.markets/reference/patchorderbyorderid-1
1279
+
1280
+ :param str id: order id
1281
+ :param str [symbol]: unified symbol of the market to create an order in
1282
+ :param str [type]: 'market', 'limit' or 'stop_limit'
1283
+ :param str [side]: 'buy' or 'sell'
1284
+ :param float [amount]: how much of the currency you want to trade in units of the base currency
1285
+ :param float [price]: the price for the order, in units of the quote currency, ignored in market orders
1286
+ :param dict [params]: extra parameters specific to the exchange API endpoint
1287
+ :param str [params.triggerPrice]: the price to trigger a stop order
1288
+ :param str [params.timeInForce]: for crypto trading either 'gtc' or 'ioc' can be used
1289
+ :param str [params.clientOrderId]: a unique identifier for the order, automatically generated if not sent
1290
+ :returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
1291
+ """
1292
+ self.load_markets()
1293
+ request: dict = {
1294
+ 'order_id': id,
1295
+ }
1296
+ market = None
1297
+ if symbol is not None:
1298
+ market = self.market(symbol)
1299
+ if amount is not None:
1300
+ request['qty'] = self.amount_to_precision(symbol, amount)
1301
+ triggerPrice = self.safe_string_n(params, ['triggerPrice', 'stop_price'])
1302
+ if triggerPrice is not None:
1303
+ request['stop_price'] = self.price_to_precision(symbol, triggerPrice)
1304
+ params = self.omit(params, 'triggerPrice')
1305
+ if price is not None:
1306
+ request['limit_price'] = self.price_to_precision(symbol, price)
1307
+ timeInForce = None
1308
+ timeInForce, params = self.handle_option_and_params_2(params, 'editOrder', 'timeInForce', 'defaultTimeInForce')
1309
+ if timeInForce is not None:
1310
+ request['time_in_force'] = timeInForce
1311
+ request['client_order_id'] = self.generate_client_order_id(params)
1312
+ params = self.omit(params, ['clientOrderId'])
1313
+ response = self.traderPrivatePatchV2OrdersOrderId(self.extend(request, params))
1314
+ return self.parse_order(response, market)
1315
+
911
1316
  def parse_order(self, order: dict, market: Market = None) -> Order:
912
1317
  #
913
1318
  # {
@@ -979,7 +1384,6 @@ class alpaca(Exchange, ImplicitAPI):
979
1384
  'postOnly': None,
980
1385
  'side': self.safe_string(order, 'side'),
981
1386
  'price': self.safe_number(order, 'limit_price'),
982
- 'stopPrice': self.safe_number(order, 'stop_price'),
983
1387
  'triggerPrice': self.safe_number(order, 'stop_price'),
984
1388
  'cost': None,
985
1389
  'average': self.safe_number(order, 'filled_avg_price'),
@@ -1008,7 +1412,61 @@ class alpaca(Exchange, ImplicitAPI):
1008
1412
  }
1009
1413
  return self.safe_string(timeInForces, timeInForce, timeInForce)
1010
1414
 
1415
+ def fetch_my_trades(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}):
1416
+ """
1417
+ fetch all trades made by the user
1418
+
1419
+ https://docs.alpaca.markets/reference/getaccountactivitiesbyactivitytype-1
1420
+
1421
+ :param str [symbol]: unified market symbol
1422
+ :param int [since]: the earliest time in ms to fetch trades for
1423
+ :param int [limit]: the maximum number of trade structures to retrieve
1424
+ :param dict [params]: extra parameters specific to the exchange API endpoint
1425
+ :param int [params.until]: the latest time in ms to fetch trades for
1426
+ :param str [params.page_token]: page_token - used for paging
1427
+ :returns Trade[]: a list of `trade structures <https://docs.ccxt.com/#/?id=trade-structure>`
1428
+ """
1429
+ self.load_markets()
1430
+ market = None
1431
+ request: dict = {
1432
+ 'activity_type': 'FILL',
1433
+ }
1434
+ if symbol is not None:
1435
+ market = self.market(symbol)
1436
+ until = self.safe_integer(params, 'until')
1437
+ if until is not None:
1438
+ params = self.omit(params, 'until')
1439
+ request['until'] = self.iso8601(until)
1440
+ if since is not None:
1441
+ request['after'] = self.iso8601(since)
1442
+ if limit is not None:
1443
+ request['page_size'] = limit
1444
+ request, params = self.handle_until_option('until', request, params)
1445
+ response = self.traderPrivateGetV2AccountActivitiesActivityType(self.extend(request, params))
1446
+ #
1447
+ # [
1448
+ # {
1449
+ # "id": "20221228071929579::ca2aafd0-1270-4b56-b0a9-85423b4a07c8",
1450
+ # "activity_type": "FILL",
1451
+ # "transaction_time": "2022-12-28T12:19:29.579352Z",
1452
+ # "type": "fill",
1453
+ # "price": "67.31",
1454
+ # "qty": "0.07",
1455
+ # "side": "sell",
1456
+ # "symbol": "LTC/USD",
1457
+ # "leaves_qty": "0",
1458
+ # "order_id": "82eebcf7-6e66-4b7e-93f8-be0df0e4f12e",
1459
+ # "cum_qty": "0.07",
1460
+ # "order_status": "filled",
1461
+ # "swap_rate": "1"
1462
+ # },
1463
+ # ]
1464
+ #
1465
+ return self.parse_trades(response, market, since, limit)
1466
+
1011
1467
  def parse_trade(self, trade: dict, market: Market = None) -> Trade:
1468
+ #
1469
+ # fetchTrades
1012
1470
  #
1013
1471
  # {
1014
1472
  # "t":"2022-06-14T05:00:00.027869Z",
@@ -1019,25 +1477,43 @@ class alpaca(Exchange, ImplicitAPI):
1019
1477
  # "i":"355681339"
1020
1478
  # }
1021
1479
  #
1022
- marketId = self.safe_string(trade, 'S')
1480
+ # fetchMyTrades
1481
+ #
1482
+ # {
1483
+ # "id": "20221228071929579::ca2aafd0-1270-4b56-b0a9-85423b4a07c8",
1484
+ # "activity_type": "FILL",
1485
+ # "transaction_time": "2022-12-28T12:19:29.579352Z",
1486
+ # "type": "fill",
1487
+ # "price": "67.31",
1488
+ # "qty": "0.07",
1489
+ # "side": "sell",
1490
+ # "symbol": "LTC/USD",
1491
+ # "leaves_qty": "0",
1492
+ # "order_id": "82eebcf7-6e66-4b7e-93f8-be0df0e4f12e",
1493
+ # "cum_qty": "0.07",
1494
+ # "order_status": "filled",
1495
+ # "swap_rate": "1"
1496
+ # },
1497
+ #
1498
+ marketId = self.safe_string_2(trade, 'S', 'symbol')
1023
1499
  symbol = self.safe_symbol(marketId, market)
1024
- datetime = self.safe_string(trade, 't')
1500
+ datetime = self.safe_string_2(trade, 't', 'transaction_time')
1025
1501
  timestamp = self.parse8601(datetime)
1026
1502
  alpacaSide = self.safe_string(trade, 'tks')
1027
- side: str
1503
+ side = self.safe_string(trade, 'side')
1028
1504
  if alpacaSide == 'B':
1029
1505
  side = 'buy'
1030
1506
  elif alpacaSide == 'S':
1031
1507
  side = 'sell'
1032
- priceString = self.safe_string(trade, 'p')
1033
- amountString = self.safe_string(trade, 's')
1508
+ priceString = self.safe_string_2(trade, 'p', 'price')
1509
+ amountString = self.safe_string_2(trade, 's', 'qty')
1034
1510
  return self.safe_trade({
1035
1511
  'info': trade,
1036
- 'id': self.safe_string(trade, 'i'),
1512
+ 'id': self.safe_string_2(trade, 'i', 'id'),
1037
1513
  'timestamp': timestamp,
1038
1514
  'datetime': self.iso8601(timestamp),
1039
1515
  'symbol': symbol,
1040
- 'order': None,
1516
+ 'order': self.safe_string(trade, 'order_id'),
1041
1517
  'type': None,
1042
1518
  'side': side,
1043
1519
  'takerOrMaker': 'taker',
@@ -1047,11 +1523,312 @@ class alpaca(Exchange, ImplicitAPI):
1047
1523
  'fee': None,
1048
1524
  }, market)
1049
1525
 
1526
+ def fetch_deposit_address(self, code: str, params={}) -> DepositAddress:
1527
+ """
1528
+ fetch the deposit address for a currency associated with self account
1529
+
1530
+ https://docs.alpaca.markets/reference/listcryptofundingwallets
1531
+
1532
+ :param str code: unified currency code
1533
+ :param dict [params]: extra parameters specific to the exchange API endpoint
1534
+ :returns dict: an `address structure <https://docs.ccxt.com/#/?id=address-structure>`
1535
+ """
1536
+ self.load_markets()
1537
+ currency = self.currency(code)
1538
+ request: dict = {
1539
+ 'asset': currency['id'],
1540
+ }
1541
+ response = self.traderPrivateGetV2Wallets(self.extend(request, params))
1542
+ #
1543
+ # {
1544
+ # "asset_id": "4fa30c85-77b7-4cbc-92dd-7b7513640aad",
1545
+ # "address": "bc1q2fpskfnwem3uq9z8660e4z6pfv7aqfamysk75r",
1546
+ # "created_at": "2024-11-03T07:30:05.609976344Z"
1547
+ # }
1548
+ #
1549
+ return self.parse_deposit_address(response, currency)
1550
+
1551
+ def parse_deposit_address(self, depositAddress, currency: Currency = None) -> DepositAddress:
1552
+ #
1553
+ # {
1554
+ # "asset_id": "4fa30c85-77b7-4cbc-92dd-7b7513640aad",
1555
+ # "address": "bc1q2fpskfnwem3uq9z8660e4z6pfv7aqfamysk75r",
1556
+ # "created_at": "2024-11-03T07:30:05.609976344Z"
1557
+ # }
1558
+ #
1559
+ parsedCurrency = None
1560
+ if currency is not None:
1561
+ parsedCurrency = currency['id']
1562
+ return {
1563
+ 'info': depositAddress,
1564
+ 'currency': parsedCurrency,
1565
+ 'network': None,
1566
+ 'address': self.safe_string(depositAddress, 'address'),
1567
+ 'tag': None,
1568
+ }
1569
+
1570
+ def withdraw(self, code: str, amount: float, address: str, tag: Str = None, params={}) -> Transaction:
1571
+ """
1572
+ make a withdrawal
1573
+
1574
+ https://docs.alpaca.markets/reference/createcryptotransferforaccount
1575
+
1576
+ :param str code: unified currency code
1577
+ :param float amount: the amount to withdraw
1578
+ :param str address: the address to withdraw to
1579
+ :param str tag: a memo for the transaction
1580
+ :param dict [params]: extra parameters specific to the exchange API endpoint
1581
+ :returns dict: a `transaction structure <https://docs.ccxt.com/#/?id=transaction-structure>`
1582
+ """
1583
+ tag, params = self.handle_withdraw_tag_and_params(tag, params)
1584
+ self.check_address(address)
1585
+ self.load_markets()
1586
+ currency = self.currency(code)
1587
+ if tag:
1588
+ address = address + ':' + tag
1589
+ request: dict = {
1590
+ 'asset': currency['id'],
1591
+ 'address': address,
1592
+ 'amount': self.number_to_string(amount),
1593
+ }
1594
+ response = self.traderPrivatePostV2WalletsTransfers(self.extend(request, params))
1595
+ #
1596
+ # {
1597
+ # "id": "e27b70a6-5610-40d7-8468-a516a284b776",
1598
+ # "tx_hash": null,
1599
+ # "direction": "OUTGOING",
1600
+ # "amount": "20",
1601
+ # "usd_value": "19.99856",
1602
+ # "chain": "ETH",
1603
+ # "asset": "USDT",
1604
+ # "from_address": "0x123930E4dCA196E070d39B60c644C8Aae02f23",
1605
+ # "to_address": "0x1232c0925196e4dcf05945f67f690153190fbaab",
1606
+ # "status": "PROCESSING",
1607
+ # "created_at": "2024-11-07T02:39:01.775495Z",
1608
+ # "network_fee": "4",
1609
+ # "fees": "0.1"
1610
+ # }
1611
+ #
1612
+ return self.parse_transaction(response, currency)
1613
+
1614
+ def fetch_transactions_helper(self, type, code, since, limit, params):
1615
+ self.load_markets()
1616
+ currency = None
1617
+ if code is not None:
1618
+ currency = self.currency(code)
1619
+ response = self.traderPrivateGetV2WalletsTransfers(params)
1620
+ #
1621
+ # {
1622
+ # "id": "e27b70a6-5610-40d7-8468-a516a284b776",
1623
+ # "tx_hash": null,
1624
+ # "direction": "OUTGOING",
1625
+ # "amount": "20",
1626
+ # "usd_value": "19.99856",
1627
+ # "chain": "ETH",
1628
+ # "asset": "USDT",
1629
+ # "from_address": "0x123930E4dCA196E070d39B60c644C8Aae02f23",
1630
+ # "to_address": "0x1232c0925196e4dcf05945f67f690153190fbaab",
1631
+ # "status": "PROCESSING",
1632
+ # "created_at": "2024-11-07T02:39:01.775495Z",
1633
+ # "network_fee": "4",
1634
+ # "fees": "0.1"
1635
+ # }
1636
+ #
1637
+ results = []
1638
+ for i in range(0, len(response)):
1639
+ entry = response[i]
1640
+ direction = self.safe_string(entry, 'direction')
1641
+ if direction == type:
1642
+ results.append(entry)
1643
+ elif type == 'BOTH':
1644
+ results.append(entry)
1645
+ return self.parse_transactions(results, currency, since, limit, params)
1646
+
1647
+ def fetch_deposits_withdrawals(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Transaction]:
1648
+ """
1649
+ fetch history of deposits and withdrawals
1650
+
1651
+ https://docs.alpaca.markets/reference/listcryptofundingtransfers
1652
+
1653
+ :param str [code]: unified currency code for the currency of the deposit/withdrawals, default is None
1654
+ :param int [since]: timestamp in ms of the earliest deposit/withdrawal, default is None
1655
+ :param int [limit]: max number of deposit/withdrawals to return, default is None
1656
+ :param dict [params]: extra parameters specific to the exchange API endpoint
1657
+ :returns dict: a list of `transaction structure <https://docs.ccxt.com/#/?id=transaction-structure>`
1658
+ """
1659
+ return self.fetch_transactions_helper('BOTH', code, since, limit, params)
1660
+
1661
+ def fetch_deposits(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Transaction]:
1662
+ """
1663
+ fetch all deposits made to an account
1664
+
1665
+ https://docs.alpaca.markets/reference/listcryptofundingtransfers
1666
+
1667
+ :param str [code]: unified currency code
1668
+ :param int [since]: the earliest time in ms to fetch deposits for
1669
+ :param int [limit]: the maximum number of deposit structures to retrieve
1670
+ :param dict [params]: extra parameters specific to the exchange API endpoint
1671
+ :returns dict[]: a list of `transaction structures <https://docs.ccxt.com/#/?id=transaction-structure>`
1672
+ """
1673
+ return self.fetch_transactions_helper('INCOMING', code, since, limit, params)
1674
+
1675
+ def fetch_withdrawals(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Transaction]:
1676
+ """
1677
+ fetch all withdrawals made from an account
1678
+
1679
+ https://docs.alpaca.markets/reference/listcryptofundingtransfers
1680
+
1681
+ :param str [code]: unified currency code
1682
+ :param int [since]: the earliest time in ms to fetch withdrawals for
1683
+ :param int [limit]: the maximum number of withdrawal structures to retrieve
1684
+ :param dict [params]: extra parameters specific to the exchange API endpoint
1685
+ :returns dict[]: a list of `transaction structures <https://docs.ccxt.com/#/?id=transaction-structure>`
1686
+ """
1687
+ return self.fetch_transactions_helper('OUTGOING', code, since, limit, params)
1688
+
1689
+ def parse_transaction(self, transaction: dict, currency: Currency = None) -> Transaction:
1690
+ #
1691
+ # {
1692
+ # "id": "e27b70a6-5610-40d7-8468-a516a284b776",
1693
+ # "tx_hash": null,
1694
+ # "direction": "OUTGOING",
1695
+ # "amount": "20",
1696
+ # "usd_value": "19.99856",
1697
+ # "chain": "ETH",
1698
+ # "asset": "USDT",
1699
+ # "from_address": "0x123930E4dCA196E070d39B60c644C8Aae02f23",
1700
+ # "to_address": "0x1232c0925196e4dcf05945f67f690153190fbaab",
1701
+ # "status": "PROCESSING",
1702
+ # "created_at": "2024-11-07T02:39:01.775495Z",
1703
+ # "network_fee": "4",
1704
+ # "fees": "0.1"
1705
+ # }
1706
+ #
1707
+ datetime = self.safe_string(transaction, 'created_at')
1708
+ currencyId = self.safe_string(transaction, 'asset')
1709
+ code = self.safe_currency_code(currencyId, currency)
1710
+ fees = self.safe_string(transaction, 'fees')
1711
+ networkFee = self.safe_string(transaction, 'network_fee')
1712
+ totalFee = Precise.string_add(fees, networkFee)
1713
+ fee = {
1714
+ 'cost': self.parse_number(totalFee),
1715
+ 'currency': code,
1716
+ }
1717
+ return {
1718
+ 'info': transaction,
1719
+ 'id': self.safe_string(transaction, 'id'),
1720
+ 'txid': self.safe_string(transaction, 'tx_hash'),
1721
+ 'timestamp': self.parse8601(datetime),
1722
+ 'datetime': datetime,
1723
+ 'network': self.safe_string(transaction, 'chain'),
1724
+ 'address': self.safe_string(transaction, 'to_address'),
1725
+ 'addressTo': self.safe_string(transaction, 'to_address'),
1726
+ 'addressFrom': self.safe_string(transaction, 'from_address'),
1727
+ 'tag': None,
1728
+ 'tagTo': None,
1729
+ 'tagFrom': None,
1730
+ 'type': self.parse_transaction_type(self.safe_string(transaction, 'direction')),
1731
+ 'amount': self.safe_number(transaction, 'amount'),
1732
+ 'currency': code,
1733
+ 'status': self.parse_transaction_status(self.safe_string(transaction, 'status')),
1734
+ 'updated': None,
1735
+ 'fee': fee,
1736
+ 'comment': None,
1737
+ 'internal': None,
1738
+ }
1739
+
1740
+ def parse_transaction_status(self, status: Str):
1741
+ statuses: dict = {
1742
+ 'PROCESSING': 'pending',
1743
+ 'FAILED': 'failed',
1744
+ 'COMPLETE': 'ok',
1745
+ }
1746
+ return self.safe_string(statuses, status, status)
1747
+
1748
+ def parse_transaction_type(self, type):
1749
+ types: dict = {
1750
+ 'INCOMING': 'deposit',
1751
+ 'OUTGOING': 'withdrawal',
1752
+ }
1753
+ return self.safe_string(types, type, type)
1754
+
1755
+ def fetch_balance(self, params={}) -> Balances:
1756
+ """
1757
+ query for balance and get the amount of funds available for trading or funds locked in orders
1758
+
1759
+ https://docs.alpaca.markets/reference/getaccount-1
1760
+
1761
+ :param dict [params]: extra parameters specific to the exchange API endpoint
1762
+ :returns dict: a `balance structure <https://docs.ccxt.com/#/?id=balance-structure>`
1763
+ """
1764
+ self.load_markets()
1765
+ response = self.traderPrivateGetV2Account(params)
1766
+ #
1767
+ # {
1768
+ # "id": "43a01bde-4eb1-64fssc26adb5",
1769
+ # "admin_configurations": {
1770
+ # "allow_instant_ach": True,
1771
+ # "max_margin_multiplier": "4"
1772
+ # },
1773
+ # "user_configurations": {
1774
+ # "fractional_trading": True,
1775
+ # "max_margin_multiplier": "4"
1776
+ # },
1777
+ # "account_number": "744873727",
1778
+ # "status": "ACTIVE",
1779
+ # "crypto_status": "ACTIVE",
1780
+ # "currency": "USD",
1781
+ # "buying_power": "5.92",
1782
+ # "regt_buying_power": "5.92",
1783
+ # "daytrading_buying_power": "0",
1784
+ # "effective_buying_power": "5.92",
1785
+ # "non_marginable_buying_power": "5.92",
1786
+ # "bod_dtbp": "0",
1787
+ # "cash": "5.92",
1788
+ # "accrued_fees": "0",
1789
+ # "portfolio_value": "48.6",
1790
+ # "pattern_day_trader": False,
1791
+ # "trading_blocked": False,
1792
+ # "transfers_blocked": False,
1793
+ # "account_blocked": False,
1794
+ # "created_at": "2022-06-13T14:59:18.318096Z",
1795
+ # "trade_suspended_by_user": False,
1796
+ # "multiplier": "1",
1797
+ # "shorting_enabled": False,
1798
+ # "equity": "48.6",
1799
+ # "last_equity": "48.8014266",
1800
+ # "long_market_value": "42.68",
1801
+ # "short_market_value": "0",
1802
+ # "position_market_value": "42.68",
1803
+ # "initial_margin": "0",
1804
+ # "maintenance_margin": "0",
1805
+ # "last_maintenance_margin": "0",
1806
+ # "sma": "5.92",
1807
+ # "daytrade_count": 0,
1808
+ # "balance_asof": "2024-12-10",
1809
+ # "crypto_tier": 1,
1810
+ # "intraday_adjustments": "0",
1811
+ # "pending_reg_taf_fees": "0"
1812
+ # }
1813
+ #
1814
+ return self.parse_balance(response)
1815
+
1816
+ def parse_balance(self, response) -> Balances:
1817
+ result: dict = {'info': response}
1818
+ account = self.account()
1819
+ currencyId = self.safe_string(response, 'currency')
1820
+ code = self.safe_currency_code(currencyId)
1821
+ account['free'] = self.safe_string(response, 'cash')
1822
+ account['total'] = self.safe_string(response, 'equity')
1823
+ result[code] = account
1824
+ return self.safe_balance(result)
1825
+
1050
1826
  def sign(self, path, api='public', method='GET', params={}, headers=None, body=None):
1051
1827
  endpoint = '/' + self.implode_params(path, params)
1052
1828
  url = self.implode_hostname(self.urls['api'][api[0]])
1053
1829
  headers = headers if (headers is not None) else {}
1054
1830
  if api[1] == 'private':
1831
+ self.check_required_credentials()
1055
1832
  headers['APCA-API-KEY-ID'] = self.apiKey
1056
1833
  headers['APCA-API-SECRET-KEY'] = self.secret
1057
1834
  query = self.omit(params, self.extract_params(path))