ccxt 4.4.97 → 4.4.99

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 (488) hide show
  1. package/README.md +6 -5
  2. package/dist/ccxt.browser.min.js +2 -2
  3. package/dist/cjs/ccxt.js +5 -1
  4. package/dist/cjs/src/abstract/alpaca.js +1 -1
  5. package/dist/cjs/src/abstract/apex.js +1 -1
  6. package/dist/cjs/src/abstract/ascendex.js +1 -1
  7. package/dist/cjs/src/abstract/bigone.js +1 -1
  8. package/dist/cjs/src/abstract/binance.js +1 -1
  9. package/dist/cjs/src/abstract/bingx.js +1 -1
  10. package/dist/cjs/src/abstract/bit2c.js +1 -1
  11. package/dist/cjs/src/abstract/bitbank.js +1 -1
  12. package/dist/cjs/src/abstract/bitbns.js +1 -1
  13. package/dist/cjs/src/abstract/bitfinex.js +1 -1
  14. package/dist/cjs/src/abstract/bitflyer.js +1 -1
  15. package/dist/cjs/src/abstract/bitget.js +1 -1
  16. package/dist/cjs/src/abstract/bithumb.js +1 -1
  17. package/dist/cjs/src/abstract/bitmart.js +1 -1
  18. package/dist/cjs/src/abstract/bitmex.js +1 -1
  19. package/dist/cjs/src/abstract/bitopro.js +1 -1
  20. package/dist/cjs/src/abstract/bitrue.js +1 -1
  21. package/dist/cjs/src/abstract/bitso.js +1 -1
  22. package/dist/cjs/src/abstract/bitstamp.js +1 -1
  23. package/dist/cjs/src/abstract/bitteam.js +1 -1
  24. package/dist/cjs/src/abstract/bittrade.js +1 -1
  25. package/dist/cjs/src/abstract/bitvavo.js +1 -1
  26. package/dist/cjs/src/abstract/blockchaincom.js +1 -1
  27. package/dist/cjs/src/abstract/blofin.js +1 -1
  28. package/dist/cjs/src/abstract/btcalpha.js +1 -1
  29. package/dist/cjs/src/abstract/btcbox.js +1 -1
  30. package/dist/cjs/src/abstract/btcmarkets.js +1 -1
  31. package/dist/cjs/src/abstract/btcturk.js +1 -1
  32. package/dist/cjs/src/abstract/bybit.js +1 -1
  33. package/dist/cjs/src/abstract/cex.js +1 -1
  34. package/dist/cjs/src/abstract/coinbase.js +1 -1
  35. package/dist/cjs/src/abstract/coinbaseexchange.js +1 -1
  36. package/dist/cjs/src/abstract/coinbaseinternational.js +1 -1
  37. package/dist/cjs/src/abstract/coincatch.js +1 -1
  38. package/dist/cjs/src/abstract/coincheck.js +1 -1
  39. package/dist/cjs/src/abstract/coinex.js +1 -1
  40. package/dist/cjs/src/abstract/coinmate.js +1 -1
  41. package/dist/cjs/src/abstract/coinmetro.js +1 -1
  42. package/dist/cjs/src/abstract/coinone.js +1 -1
  43. package/dist/cjs/src/abstract/coinsph.js +1 -1
  44. package/dist/cjs/src/abstract/coinspot.js +1 -1
  45. package/dist/cjs/src/abstract/cryptocom.js +1 -1
  46. package/dist/cjs/src/abstract/cryptomus.js +1 -1
  47. package/dist/cjs/src/abstract/defx.js +1 -1
  48. package/dist/cjs/src/abstract/delta.js +1 -1
  49. package/dist/cjs/src/abstract/deribit.js +1 -1
  50. package/dist/cjs/src/abstract/derive.js +1 -1
  51. package/dist/cjs/src/abstract/digifinex.js +1 -1
  52. package/dist/cjs/src/abstract/ellipx.js +1 -1
  53. package/dist/cjs/src/abstract/exmo.js +1 -1
  54. package/dist/cjs/src/abstract/foxbit.js +1 -1
  55. package/dist/cjs/src/abstract/gate.js +1 -1
  56. package/dist/cjs/src/abstract/gemini.js +1 -1
  57. package/dist/cjs/src/abstract/hashkey.js +1 -1
  58. package/dist/cjs/src/abstract/hibachi.js +9 -0
  59. package/dist/cjs/src/abstract/hitbtc.js +1 -1
  60. package/dist/cjs/src/abstract/hollaex.js +1 -1
  61. package/dist/cjs/src/abstract/htx.js +1 -1
  62. package/dist/cjs/src/abstract/hyperliquid.js +1 -1
  63. package/dist/cjs/src/abstract/independentreserve.js +1 -1
  64. package/dist/cjs/src/abstract/indodax.js +1 -1
  65. package/dist/cjs/src/abstract/kraken.js +1 -1
  66. package/dist/cjs/src/abstract/krakenfutures.js +1 -1
  67. package/dist/cjs/src/abstract/kucoin.js +1 -1
  68. package/dist/cjs/src/abstract/kucoinfutures.js +1 -1
  69. package/dist/cjs/src/abstract/latoken.js +1 -1
  70. package/dist/cjs/src/abstract/lbank.js +1 -1
  71. package/dist/cjs/src/abstract/luno.js +1 -1
  72. package/dist/cjs/src/abstract/mercado.js +1 -1
  73. package/dist/cjs/src/abstract/mexc.js +1 -1
  74. package/dist/cjs/src/abstract/modetrade.js +1 -1
  75. package/dist/cjs/src/abstract/ndax.js +1 -1
  76. package/dist/cjs/src/abstract/novadax.js +1 -1
  77. package/dist/cjs/src/abstract/oceanex.js +1 -1
  78. package/dist/cjs/src/abstract/okcoin.js +1 -1
  79. package/dist/cjs/src/abstract/okx.js +1 -1
  80. package/dist/cjs/src/abstract/onetrading.js +1 -1
  81. package/dist/cjs/src/abstract/oxfun.js +1 -1
  82. package/dist/cjs/src/abstract/p2b.js +1 -1
  83. package/dist/cjs/src/abstract/paradex.js +1 -1
  84. package/dist/cjs/src/abstract/paymium.js +1 -1
  85. package/dist/cjs/src/abstract/phemex.js +1 -1
  86. package/dist/cjs/src/abstract/poloniex.js +1 -1
  87. package/dist/cjs/src/abstract/probit.js +1 -1
  88. package/dist/cjs/src/abstract/timex.js +1 -1
  89. package/dist/cjs/src/abstract/tokocrypto.js +1 -1
  90. package/dist/cjs/src/abstract/tradeogre.js +1 -1
  91. package/dist/cjs/src/abstract/upbit.js +1 -1
  92. package/dist/cjs/src/abstract/vertex.js +1 -1
  93. package/dist/cjs/src/abstract/wavesexchange.js +1 -1
  94. package/dist/cjs/src/abstract/whitebit.js +1 -1
  95. package/dist/cjs/src/abstract/woo.js +1 -1
  96. package/dist/cjs/src/abstract/woofipro.js +1 -1
  97. package/dist/cjs/src/abstract/xt.js +1 -1
  98. package/dist/cjs/src/abstract/yobit.js +1 -1
  99. package/dist/cjs/src/abstract/zaif.js +1 -1
  100. package/dist/cjs/src/abstract/zonda.js +1 -1
  101. package/dist/cjs/src/alpaca.js +1 -1
  102. package/dist/cjs/src/apex.js +1 -1
  103. package/dist/cjs/src/ascendex.js +1 -1
  104. package/dist/cjs/src/base/Precise.js +0 -6
  105. package/dist/cjs/src/base/errors.js +8 -7
  106. package/dist/cjs/src/base/functions/crypto.js +1 -1
  107. package/dist/cjs/src/base/functions/encode.js +1 -1
  108. package/dist/cjs/src/base/functions/misc.js +0 -1
  109. package/dist/cjs/src/base/functions/number.js +0 -6
  110. package/dist/cjs/src/base/functions/platform.js +0 -6
  111. package/dist/cjs/src/base/functions/rsa.js +0 -1
  112. package/dist/cjs/src/base/functions/string.js +0 -6
  113. package/dist/cjs/src/base/functions/throttle.js +1 -1
  114. package/dist/cjs/src/base/functions/time.js +0 -6
  115. package/dist/cjs/src/base/functions/totp.js +0 -1
  116. package/dist/cjs/src/base/functions/type.js +0 -6
  117. package/dist/cjs/src/base/functions.js +1 -1
  118. package/dist/cjs/src/base/ws/Cache.js +0 -6
  119. package/dist/cjs/src/base/ws/Client.js +0 -1
  120. package/dist/cjs/src/base/ws/Future.js +1 -1
  121. package/dist/cjs/src/base/ws/OrderBook.js +1 -1
  122. package/dist/cjs/src/base/ws/OrderBookSide.js +0 -6
  123. package/dist/cjs/src/base/ws/WsClient.js +1 -1
  124. package/dist/cjs/src/bequant.js +1 -1
  125. package/dist/cjs/src/bigone.js +1 -1
  126. package/dist/cjs/src/binance.js +9 -7
  127. package/dist/cjs/src/binancecoinm.js +1 -1
  128. package/dist/cjs/src/binanceus.js +1 -1
  129. package/dist/cjs/src/binanceusdm.js +1 -1
  130. package/dist/cjs/src/bingx.js +1 -1
  131. package/dist/cjs/src/bit2c.js +1 -1
  132. package/dist/cjs/src/bitbank.js +1 -1
  133. package/dist/cjs/src/bitbns.js +1 -1
  134. package/dist/cjs/src/bitfinex.js +1 -1
  135. package/dist/cjs/src/bitflyer.js +1 -1
  136. package/dist/cjs/src/bitget.js +2150 -535
  137. package/dist/cjs/src/bithumb.js +1 -1
  138. package/dist/cjs/src/bitmart.js +1 -1
  139. package/dist/cjs/src/bitmex.js +1 -1
  140. package/dist/cjs/src/bitopro.js +1 -1
  141. package/dist/cjs/src/bitrue.js +1 -1
  142. package/dist/cjs/src/bitso.js +1 -1
  143. package/dist/cjs/src/bitstamp.js +1 -1
  144. package/dist/cjs/src/bitteam.js +1 -1
  145. package/dist/cjs/src/bittrade.js +1 -1
  146. package/dist/cjs/src/blockchaincom.js +1 -1
  147. package/dist/cjs/src/blofin.js +1 -1
  148. package/dist/cjs/src/btcalpha.js +1 -1
  149. package/dist/cjs/src/btcbox.js +1 -1
  150. package/dist/cjs/src/btcmarkets.js +1 -1
  151. package/dist/cjs/src/btcturk.js +1 -1
  152. package/dist/cjs/src/bybit.js +7 -2
  153. package/dist/cjs/src/cex.js +1 -1
  154. package/dist/cjs/src/coinbaseadvanced.js +1 -1
  155. package/dist/cjs/src/coincatch.js +1 -1
  156. package/dist/cjs/src/coincheck.js +1 -1
  157. package/dist/cjs/src/coinex.js +68 -4
  158. package/dist/cjs/src/coinmate.js +1 -1
  159. package/dist/cjs/src/coinmetro.js +3 -4
  160. package/dist/cjs/src/coinone.js +1 -1
  161. package/dist/cjs/src/coinsph.js +0 -1
  162. package/dist/cjs/src/coinspot.js +1 -1
  163. package/dist/cjs/src/cryptocom.js +3 -2
  164. package/dist/cjs/src/cryptomus.js +1 -1
  165. package/dist/cjs/src/defx.js +1 -1
  166. package/dist/cjs/src/delta.js +1 -1
  167. package/dist/cjs/src/deribit.js +1 -1
  168. package/dist/cjs/src/derive.js +1 -1
  169. package/dist/cjs/src/digifinex.js +1 -1
  170. package/dist/cjs/src/ellipx.js +1 -1
  171. package/dist/cjs/src/exmo.js +1 -1
  172. package/dist/cjs/src/fmfwio.js +1 -1
  173. package/dist/cjs/src/foxbit.js +1 -1
  174. package/dist/cjs/src/gate.js +2 -3
  175. package/dist/cjs/src/gateio.js +1 -1
  176. package/dist/cjs/src/gemini.js +1 -1
  177. package/dist/cjs/src/hashkey.js +1 -1
  178. package/dist/cjs/src/hibachi.js +2136 -0
  179. package/dist/cjs/src/hitbtc.js +0 -1
  180. package/dist/cjs/src/hollaex.js +1 -1
  181. package/dist/cjs/src/htx.js +1 -1
  182. package/dist/cjs/src/huobi.js +1 -1
  183. package/dist/cjs/src/hyperliquid.js +1 -1
  184. package/dist/cjs/src/independentreserve.js +1 -1
  185. package/dist/cjs/src/indodax.js +1 -1
  186. package/dist/cjs/src/kraken.js +1 -1
  187. package/dist/cjs/src/krakenfutures.js +1 -1
  188. package/dist/cjs/src/kucoin.js +1 -1
  189. package/dist/cjs/src/kucoinfutures.js +1 -1
  190. package/dist/cjs/src/latoken.js +1 -1
  191. package/dist/cjs/src/lbank.js +1 -1
  192. package/dist/cjs/src/luno.js +1 -1
  193. package/dist/cjs/src/mercado.js +1 -1
  194. package/dist/cjs/src/mexc.js +1 -1
  195. package/dist/cjs/src/modetrade.js +1 -1
  196. package/dist/cjs/src/myokx.js +1 -1
  197. package/dist/cjs/src/ndax.js +9 -1
  198. package/dist/cjs/src/novadax.js +35 -1
  199. package/dist/cjs/src/oceanex.js +1 -1
  200. package/dist/cjs/src/okcoin.js +1 -1
  201. package/dist/cjs/src/okx.js +2 -1
  202. package/dist/cjs/src/okxus.js +1 -1
  203. package/dist/cjs/src/onetrading.js +1 -1
  204. package/dist/cjs/src/oxfun.js +1 -1
  205. package/dist/cjs/src/p2b.js +1 -1
  206. package/dist/cjs/src/paradex.js +1 -1
  207. package/dist/cjs/src/paymium.js +1 -1
  208. package/dist/cjs/src/poloniex.js +1 -1
  209. package/dist/cjs/src/pro/alpaca.js +1 -1
  210. package/dist/cjs/src/pro/apex.js +1 -1
  211. package/dist/cjs/src/pro/ascendex.js +1 -1
  212. package/dist/cjs/src/pro/bequant.js +1 -1
  213. package/dist/cjs/src/pro/binance.js +2 -5
  214. package/dist/cjs/src/pro/binancecoinm.js +1 -1
  215. package/dist/cjs/src/pro/binanceus.js +1 -1
  216. package/dist/cjs/src/pro/binanceusdm.js +1 -1
  217. package/dist/cjs/src/pro/bingx.js +1 -1
  218. package/dist/cjs/src/pro/bitfinex.js +1 -1
  219. package/dist/cjs/src/pro/bitget.js +2 -2
  220. package/dist/cjs/src/pro/bithumb.js +1 -1
  221. package/dist/cjs/src/pro/bitmart.js +1 -1
  222. package/dist/cjs/src/pro/bitmex.js +2 -2
  223. package/dist/cjs/src/pro/bitrue.js +1 -1
  224. package/dist/cjs/src/pro/bitstamp.js +2 -2
  225. package/dist/cjs/src/pro/bitvavo.js +3 -1
  226. package/dist/cjs/src/pro/blockchaincom.js +1 -1
  227. package/dist/cjs/src/pro/blofin.js +1 -1
  228. package/dist/cjs/src/pro/bybit.js +1 -1
  229. package/dist/cjs/src/pro/cex.js +2 -1
  230. package/dist/cjs/src/pro/coinbase.js +1 -1
  231. package/dist/cjs/src/pro/coinbaseadvanced.js +1 -1
  232. package/dist/cjs/src/pro/coinbaseexchange.js +3 -3
  233. package/dist/cjs/src/pro/coinbaseinternational.js +1 -1
  234. package/dist/cjs/src/pro/coincatch.js +1 -1
  235. package/dist/cjs/src/pro/coincheck.js +1 -1
  236. package/dist/cjs/src/pro/coinex.js +1 -1
  237. package/dist/cjs/src/pro/coinone.js +1 -1
  238. package/dist/cjs/src/pro/cryptocom.js +1 -1
  239. package/dist/cjs/src/pro/defx.js +1 -1
  240. package/dist/cjs/src/pro/deribit.js +1 -1
  241. package/dist/cjs/src/pro/exmo.js +1 -1
  242. package/dist/cjs/src/pro/gate.js +2 -2
  243. package/dist/cjs/src/pro/gateio.js +1 -1
  244. package/dist/cjs/src/pro/gemini.js +1 -1
  245. package/dist/cjs/src/pro/hashkey.js +1 -1
  246. package/dist/cjs/src/pro/hitbtc.js +1 -1
  247. package/dist/cjs/src/pro/hollaex.js +1 -1
  248. package/dist/cjs/src/pro/htx.js +2 -2
  249. package/dist/cjs/src/pro/huobi.js +1 -1
  250. package/dist/cjs/src/pro/hyperliquid.js +1 -1
  251. package/dist/cjs/src/pro/independentreserve.js +1 -1
  252. package/dist/cjs/src/pro/kraken.js +1 -1
  253. package/dist/cjs/src/pro/krakenfutures.js +3 -2
  254. package/dist/cjs/src/pro/kucoin.js +2 -1
  255. package/dist/cjs/src/pro/kucoinfutures.js +2 -1
  256. package/dist/cjs/src/pro/lbank.js +0 -1
  257. package/dist/cjs/src/pro/luno.js +1 -1
  258. package/dist/cjs/src/pro/mexc.js +1 -1
  259. package/dist/cjs/src/pro/myokx.js +1 -1
  260. package/dist/cjs/src/pro/ndax.js +1 -1
  261. package/dist/cjs/src/pro/okcoin.js +1 -1
  262. package/dist/cjs/src/pro/okx.js +4 -4
  263. package/dist/cjs/src/pro/okxus.js +1 -1
  264. package/dist/cjs/src/pro/onetrading.js +1 -1
  265. package/dist/cjs/src/pro/oxfun.js +1 -1
  266. package/dist/cjs/src/pro/p2b.js +1 -1
  267. package/dist/cjs/src/pro/paradex.js +1 -1
  268. package/dist/cjs/src/pro/phemex.js +1 -1
  269. package/dist/cjs/src/pro/poloniex.js +1 -1
  270. package/dist/cjs/src/pro/probit.js +1 -1
  271. package/dist/cjs/src/pro/tradeogre.js +1 -1
  272. package/dist/cjs/src/pro/upbit.js +1 -1
  273. package/dist/cjs/src/pro/whitebit.js +1 -1
  274. package/dist/cjs/src/pro/xt.js +1 -1
  275. package/dist/cjs/src/probit.js +1 -1
  276. package/dist/cjs/src/static_dependencies/ethers/abi-coder.js +0 -6
  277. package/dist/cjs/src/static_dependencies/ethers/address/address.js +1 -1
  278. package/dist/cjs/src/static_dependencies/ethers/coders/abstract-coder.js +0 -6
  279. package/dist/cjs/src/static_dependencies/ethers/coders/address.js +0 -1
  280. package/dist/cjs/src/static_dependencies/ethers/coders/anonymous.js +0 -1
  281. package/dist/cjs/src/static_dependencies/ethers/coders/array.js +0 -1
  282. package/dist/cjs/src/static_dependencies/ethers/coders/boolean.js +0 -1
  283. package/dist/cjs/src/static_dependencies/ethers/coders/bytes.js +0 -1
  284. package/dist/cjs/src/static_dependencies/ethers/coders/fixed-bytes.js +0 -1
  285. package/dist/cjs/src/static_dependencies/ethers/coders/null.js +0 -1
  286. package/dist/cjs/src/static_dependencies/ethers/coders/number.js +0 -1
  287. package/dist/cjs/src/static_dependencies/ethers/coders/string.js +0 -1
  288. package/dist/cjs/src/static_dependencies/ethers/coders/tuple.js +0 -1
  289. package/dist/cjs/src/static_dependencies/ethers/fragments.js +0 -6
  290. package/dist/cjs/src/static_dependencies/ethers/hash/typed-data.js +0 -6
  291. package/dist/cjs/src/static_dependencies/ethers/index.js +10 -1
  292. package/dist/cjs/src/static_dependencies/ethers/interface.js +0 -6
  293. package/dist/cjs/src/static_dependencies/ethers/typed.js +0 -6
  294. package/dist/cjs/src/static_dependencies/ethers/utils/base58.js +13 -1
  295. package/dist/cjs/src/static_dependencies/ethers/utils/data.js +6 -1
  296. package/dist/cjs/src/static_dependencies/ethers/utils/errors.js +9 -1
  297. package/dist/cjs/src/static_dependencies/ethers/utils/events.js +0 -6
  298. package/dist/cjs/src/static_dependencies/ethers/utils/fixednumber.js +0 -6
  299. package/dist/cjs/src/static_dependencies/ethers/utils/index.js +7 -1
  300. package/dist/cjs/src/static_dependencies/ethers/utils/maths.js +5 -1
  301. package/dist/cjs/src/static_dependencies/ethers/utils/properties.js +0 -6
  302. package/dist/cjs/src/static_dependencies/ethers/utils/utf8.js +8 -1
  303. package/dist/cjs/src/static_dependencies/fflake/browser.js +1 -1
  304. package/dist/cjs/src/static_dependencies/jsencrypt/JSEncrypt.js +0 -1
  305. package/dist/cjs/src/static_dependencies/jsencrypt/JSEncryptRSAKey.js +0 -1
  306. package/dist/cjs/src/static_dependencies/jsencrypt/lib/asn1js/asn1.js +1 -1
  307. package/dist/cjs/src/static_dependencies/jsencrypt/lib/asn1js/base64.js +0 -6
  308. package/dist/cjs/src/static_dependencies/jsencrypt/lib/asn1js/hex.js +0 -6
  309. package/dist/cjs/src/static_dependencies/jsencrypt/lib/asn1js/int10.js +0 -6
  310. package/dist/cjs/src/static_dependencies/jsencrypt/lib/jsbn/base64.js +0 -1
  311. package/dist/cjs/src/static_dependencies/jsencrypt/lib/jsbn/jsbn.js +1 -1
  312. package/dist/cjs/src/static_dependencies/jsencrypt/lib/jsbn/prng4.js +0 -6
  313. package/dist/cjs/src/static_dependencies/jsencrypt/lib/jsbn/rng.js +1 -1
  314. package/dist/cjs/src/static_dependencies/jsencrypt/lib/jsbn/rsa.js +1 -1
  315. package/dist/cjs/src/static_dependencies/jsencrypt/lib/jsbn/util.js +0 -6
  316. package/dist/cjs/src/static_dependencies/jsencrypt/lib/jsrsasign/asn1-1.0.js +1 -1
  317. package/dist/cjs/src/static_dependencies/jsencrypt/lib/jsrsasign/yahoo.js +0 -6
  318. package/dist/cjs/src/static_dependencies/messagepack/msgpack.js +0 -6
  319. package/dist/cjs/src/static_dependencies/noble-curves/_shortw_utils.js +1 -1
  320. package/dist/cjs/src/static_dependencies/noble-curves/abstract/curve.js +1 -1
  321. package/dist/cjs/src/static_dependencies/noble-curves/abstract/edwards.js +1 -1
  322. package/dist/cjs/src/static_dependencies/noble-curves/abstract/hash-to-curve.js +0 -1
  323. package/dist/cjs/src/static_dependencies/noble-curves/abstract/modular.js +1 -1
  324. package/dist/cjs/src/static_dependencies/noble-curves/abstract/montgomery.js +1 -1
  325. package/dist/cjs/src/static_dependencies/noble-curves/abstract/poseidon.js +1 -1
  326. package/dist/cjs/src/static_dependencies/noble-curves/abstract/utils.js +0 -6
  327. package/dist/cjs/src/static_dependencies/noble-curves/abstract/weierstrass.js +1 -1
  328. package/dist/cjs/src/static_dependencies/noble-curves/ed25519.js +1 -1
  329. package/dist/cjs/src/static_dependencies/noble-curves/p256.js +1 -1
  330. package/dist/cjs/src/static_dependencies/noble-curves/secp256k1.js +1 -1
  331. package/dist/cjs/src/static_dependencies/noble-hashes/_assert.js +0 -6
  332. package/dist/cjs/src/static_dependencies/noble-hashes/_sha2.js +0 -1
  333. package/dist/cjs/src/static_dependencies/noble-hashes/_u64.js +0 -6
  334. package/dist/cjs/src/static_dependencies/noble-hashes/crypto.js +0 -6
  335. package/dist/cjs/src/static_dependencies/noble-hashes/hmac.js +0 -1
  336. package/dist/cjs/src/static_dependencies/noble-hashes/md5.js +0 -1
  337. package/dist/cjs/src/static_dependencies/noble-hashes/sha1.js +0 -1
  338. package/dist/cjs/src/static_dependencies/noble-hashes/sha256.js +0 -1
  339. package/dist/cjs/src/static_dependencies/noble-hashes/sha3.js +0 -1
  340. package/dist/cjs/src/static_dependencies/noble-hashes/sha512.js +0 -1
  341. package/dist/cjs/src/static_dependencies/noble-hashes/utils.js +1 -1
  342. package/dist/cjs/src/static_dependencies/node-fetch/body.js +5 -1
  343. package/dist/cjs/src/static_dependencies/node-fetch/errors/abort-error.js +0 -1
  344. package/dist/cjs/src/static_dependencies/node-fetch/errors/base.js +0 -6
  345. package/dist/cjs/src/static_dependencies/node-fetch/errors/fetch-error.js +0 -1
  346. package/dist/cjs/src/static_dependencies/node-fetch/headers.js +5 -1
  347. package/dist/cjs/src/static_dependencies/node-fetch/index.js +7 -1
  348. package/dist/cjs/src/static_dependencies/node-fetch/request.js +7 -1
  349. package/dist/cjs/src/static_dependencies/node-fetch/response.js +5 -1
  350. package/dist/cjs/src/static_dependencies/node-fetch/utils/get-search.js +0 -6
  351. package/dist/cjs/src/static_dependencies/node-fetch/utils/is-redirect.js +0 -6
  352. package/dist/cjs/src/static_dependencies/node-fetch/utils/is.js +0 -6
  353. package/dist/cjs/src/static_dependencies/node-fetch/utils/referrer.js +0 -1
  354. package/dist/cjs/src/static_dependencies/proxies/agent-base/index.js +0 -1
  355. package/dist/cjs/src/static_dependencies/proxies/http-proxy-agent/index.js +0 -1
  356. package/dist/cjs/src/static_dependencies/proxies/https-proxy-agent/index.js +0 -1
  357. package/dist/cjs/src/static_dependencies/proxies/https-proxy-agent/parse-proxy-response.js +0 -6
  358. package/dist/cjs/src/static_dependencies/scure-base/index.js +0 -6
  359. package/dist/cjs/src/static_dependencies/scure-starknet/index.js +1 -1
  360. package/dist/cjs/src/static_dependencies/starknet/constants.js +1 -1
  361. package/dist/cjs/src/static_dependencies/starknet/types/calldata.js +0 -6
  362. package/dist/cjs/src/static_dependencies/starknet/types/lib/contract/abi.js +0 -6
  363. package/dist/cjs/src/static_dependencies/starknet/types/lib/contract/index.js +0 -6
  364. package/dist/cjs/src/static_dependencies/starknet/types/lib/index.js +0 -6
  365. package/dist/cjs/src/static_dependencies/starknet/types/typedData.js +0 -6
  366. package/dist/cjs/src/static_dependencies/starknet/utils/assert.js +0 -6
  367. package/dist/cjs/src/static_dependencies/starknet/utils/cairoDataTypes/felt.js +1 -1
  368. package/dist/cjs/src/static_dependencies/starknet/utils/cairoDataTypes/uint256.js +1 -1
  369. package/dist/cjs/src/static_dependencies/starknet/utils/cairoDataTypes/uint512.js +1 -1
  370. package/dist/cjs/src/static_dependencies/starknet/utils/calldata/byteArray.js +0 -1
  371. package/dist/cjs/src/static_dependencies/starknet/utils/calldata/cairo.js +0 -1
  372. package/dist/cjs/src/static_dependencies/starknet/utils/calldata/enum/CairoCustomEnum.js +0 -6
  373. package/dist/cjs/src/static_dependencies/starknet/utils/calldata/enum/CairoOption.js +0 -6
  374. package/dist/cjs/src/static_dependencies/starknet/utils/calldata/enum/CairoResult.js +0 -6
  375. package/dist/cjs/src/static_dependencies/starknet/utils/calldata/formatter.js +0 -1
  376. package/dist/cjs/src/static_dependencies/starknet/utils/calldata/index.js +1 -1
  377. package/dist/cjs/src/static_dependencies/starknet/utils/calldata/parser/index.js +0 -1
  378. package/dist/cjs/src/static_dependencies/starknet/utils/calldata/parser/parser-0-1.1.0.js +0 -1
  379. package/dist/cjs/src/static_dependencies/starknet/utils/calldata/parser/parser-2.0.0.js +0 -6
  380. package/dist/cjs/src/static_dependencies/starknet/utils/calldata/propertyOrder.js +0 -1
  381. package/dist/cjs/src/static_dependencies/starknet/utils/calldata/requestParser.js +0 -1
  382. package/dist/cjs/src/static_dependencies/starknet/utils/calldata/responseParser.js +0 -1
  383. package/dist/cjs/src/static_dependencies/starknet/utils/calldata/tuple.js +1 -1
  384. package/dist/cjs/src/static_dependencies/starknet/utils/calldata/validate.js +4 -1
  385. package/dist/cjs/src/static_dependencies/starknet/utils/encode.js +0 -1
  386. package/dist/cjs/src/static_dependencies/starknet/utils/hash/classHash.js +3 -1
  387. package/dist/cjs/src/static_dependencies/starknet/utils/merkle.js +0 -1
  388. package/dist/cjs/src/static_dependencies/starknet/utils/num.js +0 -1
  389. package/dist/cjs/src/static_dependencies/starknet/utils/selector.js +0 -1
  390. package/dist/cjs/src/static_dependencies/starknet/utils/shortString.js +0 -1
  391. package/dist/cjs/src/static_dependencies/starknet/utils/typedData.js +1 -1
  392. package/dist/cjs/src/static_dependencies/watchable/src/unpromise.js +0 -6
  393. package/dist/cjs/src/static_dependencies/zklink/zklink-sdk-web.js +0 -6
  394. package/dist/cjs/src/timex.js +0 -1
  395. package/dist/cjs/src/tokocrypto.js +1 -1
  396. package/dist/cjs/src/tradeogre.js +1 -1
  397. package/dist/cjs/src/upbit.js +1 -1
  398. package/dist/cjs/src/vertex.js +1 -1
  399. package/dist/cjs/src/wavesexchange.js +1 -1
  400. package/dist/cjs/src/whitebit.js +1 -1
  401. package/dist/cjs/src/woo.js +1 -1
  402. package/dist/cjs/src/woofipro.js +1 -1
  403. package/dist/cjs/src/xt.js +1 -1
  404. package/dist/cjs/src/yobit.js +1 -1
  405. package/dist/cjs/src/zaif.js +1 -1
  406. package/dist/cjs/src/zonda.js +1 -1
  407. package/js/ccxt.d.ts +6 -3
  408. package/js/ccxt.js +5 -3
  409. package/js/src/abstract/bitget.d.ts +6 -0
  410. package/js/src/abstract/hibachi.d.ts +29 -0
  411. package/js/src/abstract/hibachi.js +5 -0
  412. package/js/src/base/Exchange.d.ts +2 -2
  413. package/js/src/base/errorHierarchy.d.ts +1 -0
  414. package/js/src/base/errorHierarchy.js +1 -0
  415. package/js/src/base/errors.d.ts +5 -1
  416. package/js/src/base/errors.js +8 -2
  417. package/js/src/binance.js +8 -6
  418. package/js/src/bitget.d.ts +73 -7
  419. package/js/src/bitget.js +2149 -534
  420. package/js/src/bybit.js +6 -1
  421. package/js/src/coinbaseexchange.d.ts +1 -1
  422. package/js/src/coinex.d.ts +10 -0
  423. package/js/src/coinex.js +67 -3
  424. package/js/src/coinmetro.js +2 -3
  425. package/js/src/cryptocom.js +2 -1
  426. package/js/src/gate.js +1 -2
  427. package/js/src/hibachi.d.ts +346 -0
  428. package/js/src/hibachi.js +2131 -0
  429. package/js/src/ndax.js +8 -0
  430. package/js/src/novadax.js +34 -0
  431. package/js/src/okx.js +2 -1
  432. package/js/src/pro/alpaca.d.ts +2 -2
  433. package/js/src/pro/apex.d.ts +2 -2
  434. package/js/src/pro/ascendex.d.ts +2 -2
  435. package/js/src/pro/binance.d.ts +2 -2
  436. package/js/src/pro/binance.js +2 -5
  437. package/js/src/pro/bitget.d.ts +2 -2
  438. package/js/src/pro/bitget.js +1 -1
  439. package/js/src/pro/bithumb.d.ts +2 -2
  440. package/js/src/pro/bitmart.d.ts +2 -2
  441. package/js/src/pro/bitmex.d.ts +3 -3
  442. package/js/src/pro/bitmex.js +1 -1
  443. package/js/src/pro/bitstamp.d.ts +2 -2
  444. package/js/src/pro/bitstamp.js +1 -1
  445. package/js/src/pro/bittrade.d.ts +2 -2
  446. package/js/src/pro/bitvavo.d.ts +2 -2
  447. package/js/src/pro/bitvavo.js +2 -0
  448. package/js/src/pro/bybit.d.ts +4 -4
  449. package/js/src/pro/cex.d.ts +2 -2
  450. package/js/src/pro/cex.js +1 -0
  451. package/js/src/pro/coinbaseexchange.d.ts +4 -4
  452. package/js/src/pro/coinbaseexchange.js +2 -2
  453. package/js/src/pro/coinbaseinternational.d.ts +2 -2
  454. package/js/src/pro/coincatch.d.ts +2 -2
  455. package/js/src/pro/coinone.d.ts +2 -2
  456. package/js/src/pro/cryptocom.d.ts +2 -2
  457. package/js/src/pro/derive.d.ts +2 -2
  458. package/js/src/pro/gate.d.ts +3 -3
  459. package/js/src/pro/gate.js +1 -1
  460. package/js/src/pro/hollaex.d.ts +2 -2
  461. package/js/src/pro/htx.d.ts +2 -2
  462. package/js/src/pro/htx.js +1 -1
  463. package/js/src/pro/hyperliquid.d.ts +2 -2
  464. package/js/src/pro/kraken.d.ts +2 -2
  465. package/js/src/pro/krakenfutures.d.ts +3 -3
  466. package/js/src/pro/krakenfutures.js +2 -1
  467. package/js/src/pro/kucoin.d.ts +2 -2
  468. package/js/src/pro/kucoin.js +1 -0
  469. package/js/src/pro/kucoinfutures.d.ts +2 -2
  470. package/js/src/pro/kucoinfutures.js +1 -0
  471. package/js/src/pro/modetrade.d.ts +2 -2
  472. package/js/src/pro/okcoin.d.ts +2 -2
  473. package/js/src/pro/okx.d.ts +4 -4
  474. package/js/src/pro/okx.js +3 -3
  475. package/js/src/pro/onetrading.d.ts +2 -2
  476. package/js/src/pro/p2b.d.ts +2 -2
  477. package/js/src/pro/paradex.d.ts +2 -2
  478. package/js/src/pro/poloniex.d.ts +2 -2
  479. package/js/src/pro/probit.d.ts +2 -2
  480. package/js/src/pro/vertex.d.ts +2 -2
  481. package/js/src/pro/whitebit.d.ts +2 -2
  482. package/js/src/pro/woo.d.ts +2 -2
  483. package/js/src/pro/woofipro.d.ts +2 -2
  484. package/js/src/static_dependencies/fflake/browser.d.ts +5 -5
  485. package/js/src/static_dependencies/jsencrypt/lib/jsbn/jsbn.d.ts +1 -1
  486. package/js/src/static_dependencies/noble-curves/abstract/weierstrass.d.ts +0 -1
  487. package/js/src/static_dependencies/starknet/utils/calldata/parser/index.d.ts +1 -1
  488. package/package.json +2 -2
@@ -6,7 +6,7 @@ var Precise = require('./base/Precise.js');
6
6
  var number = require('./base/functions/number.js');
7
7
  var sha256 = require('./static_dependencies/noble-hashes/sha256.js');
8
8
 
9
- // ----------------------------------------------------------------------------
9
+ // ---------------------------------------------------------------------------
10
10
  // ---------------------------------------------------------------------------
11
11
  /**
12
12
  * @class bitget
@@ -805,6 +805,7 @@ class bitget extends bitget$1 {
805
805
  'get': {
806
806
  'v3/account/assets': 1,
807
807
  'v3/account/settings': 1,
808
+ 'v3/account/deposit-records': 2,
808
809
  'v3/account/financial-records': 1,
809
810
  'v3/account/repayable-coins': 2,
810
811
  'v3/account/payment-coins': 2,
@@ -823,7 +824,9 @@ class bitget extends bitget$1 {
823
824
  'v3/position/history-position': 1,
824
825
  'v3/trade/order-info': 1,
825
826
  'v3/trade/unfilled-orders': 1,
827
+ 'v3/trade/unfilled-strategy-orders': 1,
826
828
  'v3/trade/history-orders': 1,
829
+ 'v3/trade/history-strategy-orders': 1,
827
830
  'v3/trade/fills': 1,
828
831
  'v3/user/sub-list': 2,
829
832
  'v3/user/sub-api-list': 2,
@@ -837,8 +840,11 @@ class bitget extends bitget$1 {
837
840
  'v3/account/max-open-available': 4,
838
841
  'v3/ins-loan/bind-uid': 6.6667,
839
842
  'v3/trade/place-order': 2,
843
+ 'v3/trade/place-strategy-order': 2,
840
844
  'v3/trade/modify-order': 2,
845
+ 'v3/trade/modify-strategy-order': 2,
841
846
  'v3/trade/cancel-order': 2,
847
+ 'v3/trade/cancel-strategy-order': 2,
842
848
  'v3/trade/place-batch': 4,
843
849
  'v3/trade/batch-modify-order': 2,
844
850
  'v3/trade/cancel-batch': 4,
@@ -884,6 +890,7 @@ class bitget extends bitget$1 {
884
890
  // '0': ExchangeError, // 200 successful,when the order placement / cancellation / operation is successful
885
891
  '4001': errors.ExchangeError,
886
892
  '4002': errors.ExchangeError,
893
+ '40020': errors.BadRequest,
887
894
  // --------------------------------------------------------
888
895
  '30001': errors.AuthenticationError,
889
896
  '30002': errors.AuthenticationError,
@@ -1428,6 +1435,19 @@ class bitget extends bitget$1 {
1428
1435
  '1w': '1Wutc',
1429
1436
  '1M': '1Mutc',
1430
1437
  },
1438
+ 'uta': {
1439
+ '1m': '1m',
1440
+ '3m': '3m',
1441
+ '5m': '5m',
1442
+ '15m': '15m',
1443
+ '30m': '30m',
1444
+ '1h': '1H',
1445
+ '2h': '2H',
1446
+ '4h': '4H',
1447
+ '6h': '6H',
1448
+ '12h': '12H',
1449
+ '1d': '1D',
1450
+ },
1431
1451
  },
1432
1452
  'fetchMarkets': {
1433
1453
  'types': ['spot', 'swap'], // there is future markets but they use the same endpoints as swap
@@ -1517,7 +1537,6 @@ class bitget extends bitget$1 {
1517
1537
  'ERC20': 'ERC20',
1518
1538
  'BEP20': 'BSC',
1519
1539
  // 'BEP20': 'BEP20', // different for BEP20
1520
- 'BSC': 'BEP20',
1521
1540
  'ATOM': 'ATOM',
1522
1541
  'ACA': 'AcalaToken',
1523
1542
  'APT': 'Aptos',
@@ -1771,10 +1790,20 @@ class bitget extends bitget$1 {
1771
1790
  defaultProductType = (subType === 'linear') ? 'USDT-FUTURES' : 'COIN-FUTURES';
1772
1791
  // }
1773
1792
  }
1774
- let productType = this.safeString(params, 'productType', defaultProductType);
1793
+ let productType = this.safeString2(params, 'productType', 'category', defaultProductType);
1775
1794
  if ((productType === undefined) && (market !== undefined)) {
1776
1795
  const settle = market['settle'];
1777
- if (settle === 'USDT') {
1796
+ if (market['spot']) {
1797
+ let marginMode = undefined;
1798
+ [marginMode, params] = this.handleMarginModeAndParams('handleProductTypeAndParams', params);
1799
+ if (marginMode !== undefined) {
1800
+ productType = 'MARGIN';
1801
+ }
1802
+ else {
1803
+ productType = 'SPOT';
1804
+ }
1805
+ }
1806
+ else if (settle === 'USDT') {
1778
1807
  productType = 'USDT-FUTURES';
1779
1808
  }
1780
1809
  else if (settle === 'USDC') {
@@ -1794,9 +1823,9 @@ class bitget extends bitget$1 {
1794
1823
  }
1795
1824
  }
1796
1825
  if (productType === undefined) {
1797
- throw new errors.ArgumentsRequired(this.id + ' requires a productType param, one of "USDT-FUTURES", "USDC-FUTURES", "COIN-FUTURES", "SUSDT-FUTURES", "SUSDC-FUTURES" or "SCOIN-FUTURES"');
1826
+ throw new errors.ArgumentsRequired(this.id + ' requires a productType param, one of "USDT-FUTURES", "USDC-FUTURES", "COIN-FUTURES", "SUSDT-FUTURES", "SUSDC-FUTURES", "SCOIN-FUTURES" or for uta only "SPOT"');
1798
1827
  }
1799
- params = this.omit(params, 'productType');
1828
+ params = this.omit(params, ['productType', 'category']);
1800
1829
  return [productType, params];
1801
1830
  }
1802
1831
  /**
@@ -1829,9 +1858,9 @@ class bitget extends bitget$1 {
1829
1858
  * @see https://www.bitget.com/api-doc/spot/market/Get-Symbols
1830
1859
  * @see https://www.bitget.com/api-doc/contract/market/Get-All-Symbols-Contracts
1831
1860
  * @see https://www.bitget.com/api-doc/margin/common/support-currencies
1832
- * @see https://www.bitget.bike/api-doc/uta/public/Instruments
1861
+ * @see https://www.bitget.com/api-doc/uta/public/Instruments
1833
1862
  * @param {object} [params] extra parameters specific to the exchange API endpoint
1834
- * @param {string} [params.uta] set to true to fetch markets for the unified trading account (uta), defaults to false
1863
+ * @param {boolean} [params.uta] set to true for the unified trading account (uta), defaults to false
1835
1864
  * @returns {object[]} an array of objects representing market data
1836
1865
  */
1837
1866
  async fetchMarkets(params = {}) {
@@ -2477,11 +2506,13 @@ class bitget extends bitget$1 {
2477
2506
  * @see https://www.bitget.com/api-doc/contract/position/Get-Query-Position-Lever
2478
2507
  * @see https://www.bitget.com/api-doc/margin/cross/account/Cross-Tier-Data
2479
2508
  * @see https://www.bitget.com/api-doc/margin/isolated/account/Isolated-Tier-Data
2509
+ * @see https://www.bitget.com/api-doc/uta/public/Get-Position-Tier-Data
2480
2510
  * @param {string} symbol unified market symbol
2481
2511
  * @param {object} [params] extra parameters specific to the exchange API endpoint
2482
2512
  * @param {string} [params.marginMode] for spot margin 'cross' or 'isolated', default is 'isolated'
2483
2513
  * @param {string} [params.code] required for cross spot margin
2484
- * @param {string} [params.productType] *contract only* 'USDT-FUTURES', 'USDC-FUTURES', 'COIN-FUTURES', 'SUSDT-FUTURES', 'SUSDC-FUTURES' or 'SCOIN-FUTURES'
2514
+ * @param {string} [params.productType] *contract and uta only* 'USDT-FUTURES', 'USDC-FUTURES', 'COIN-FUTURES', 'SUSDT-FUTURES', 'SUSDC-FUTURES' or 'SCOIN-FUTURES'
2515
+ * @param {boolean} [params.uta] set to true for the unified trading account (uta), defaults to false
2485
2516
  * @returns {object} a [leverage tiers structure]{@link https://docs.ccxt.com/#/?id=leverage-tiers-structure}
2486
2517
  */
2487
2518
  async fetchMarketLeverageTiers(symbol, params = {}) {
@@ -2490,10 +2521,22 @@ class bitget extends bitget$1 {
2490
2521
  const request = {};
2491
2522
  let response = undefined;
2492
2523
  let marginMode = undefined;
2524
+ let productType = undefined;
2525
+ let uta = undefined;
2493
2526
  [marginMode, params] = this.handleMarginModeAndParams('fetchMarketLeverageTiers', params, 'isolated');
2494
- if ((market['swap']) || (market['future'])) {
2495
- let productType = undefined;
2496
- [productType, params] = this.handleProductTypeAndParams(market, params);
2527
+ [productType, params] = this.handleProductTypeAndParams(market, params);
2528
+ [uta, params] = this.handleOptionAndParams(params, 'fetchMarketLeverageTiers', 'uta', false);
2529
+ if (uta) {
2530
+ if (productType === 'SPOT') {
2531
+ if (marginMode !== undefined) {
2532
+ productType = 'MARGIN';
2533
+ }
2534
+ }
2535
+ request['symbol'] = market['id'];
2536
+ request['category'] = productType;
2537
+ response = await this.publicUtaGetV3MarketPositionTier(this.extend(request, params));
2538
+ }
2539
+ else if ((market['swap']) || (market['future'])) {
2497
2540
  request['productType'] = productType;
2498
2541
  request['symbol'] = market['id'];
2499
2542
  response = await this.publicMixGetV2MixMarketQueryPositionLever(this.extend(request, params));
@@ -2572,6 +2615,23 @@ class bitget extends bitget$1 {
2572
2615
  // ]
2573
2616
  // }
2574
2617
  //
2618
+ // uta
2619
+ //
2620
+ // {
2621
+ // "code": "00000",
2622
+ // "msg": "success",
2623
+ // "requestTime": 1752735673127,
2624
+ // "data": [
2625
+ // {
2626
+ // "tier": "1",
2627
+ // "minTierValue": "0",
2628
+ // "maxTierValue": "150000",
2629
+ // "leverage": "125",
2630
+ // "mmr": "0.004"
2631
+ // },
2632
+ // ]
2633
+ // }
2634
+ //
2575
2635
  const result = this.safeValue(response, 'data', []);
2576
2636
  return this.parseMarketLeverageTiers(result, market);
2577
2637
  }
@@ -2612,15 +2672,25 @@ class bitget extends bitget$1 {
2612
2672
  // "maintainMarginRate": "0.1"
2613
2673
  // }
2614
2674
  //
2675
+ // uta
2676
+ //
2677
+ // {
2678
+ // "tier": "1",
2679
+ // "minTierValue": "0",
2680
+ // "maxTierValue": "150000",
2681
+ // "leverage": "125",
2682
+ // "mmr": "0.004"
2683
+ // }
2684
+ //
2615
2685
  const tiers = [];
2616
2686
  let minNotional = 0;
2617
2687
  for (let i = 0; i < info.length; i++) {
2618
2688
  const item = info[i];
2619
- const minimumNotional = this.safeNumber(item, 'startUnit');
2689
+ const minimumNotional = this.safeNumber2(item, 'startUnit', 'minTierValue');
2620
2690
  if (minimumNotional !== undefined) {
2621
2691
  minNotional = minimumNotional;
2622
2692
  }
2623
- const maxNotional = this.safeNumberN(item, ['endUnit', 'maxBorrowableAmount', 'baseMaxBorrowableAmount']);
2693
+ const maxNotional = this.safeNumberN(item, ['endUnit', 'maxBorrowableAmount', 'baseMaxBorrowableAmount', 'maxTierValue']);
2624
2694
  const marginCurrency = this.safeString2(item, 'coin', 'baseCoin');
2625
2695
  const currencyId = (marginCurrency !== undefined) ? marginCurrency : market['base'];
2626
2696
  const marketId = this.safeString(item, 'symbol');
@@ -2630,7 +2700,7 @@ class bitget extends bitget$1 {
2630
2700
  'currency': this.safeCurrencyCode(currencyId),
2631
2701
  'minNotional': minNotional,
2632
2702
  'maxNotional': maxNotional,
2633
- 'maintenanceMarginRate': this.safeNumber2(item, 'keepMarginRate', 'maintainMarginRate'),
2703
+ 'maintenanceMarginRate': this.safeNumberN(item, ['keepMarginRate', 'maintainMarginRate', 'mmr']),
2634
2704
  'maxLeverage': this.safeNumber(item, 'leverage'),
2635
2705
  'info': item,
2636
2706
  });
@@ -2989,9 +3059,11 @@ class bitget extends bitget$1 {
2989
3059
  * @description fetches information on open orders with bid (buy) and ask (sell) prices, volumes and other data
2990
3060
  * @see https://www.bitget.com/api-doc/spot/market/Get-Orderbook
2991
3061
  * @see https://www.bitget.com/api-doc/contract/market/Get-Merge-Depth
3062
+ * @see https://www.bitget.com/api-doc/uta/public/OrderBook
2992
3063
  * @param {string} symbol unified symbol of the market to fetch the order book for
2993
3064
  * @param {int} [limit] the maximum amount of order book entries to return
2994
3065
  * @param {object} [params] extra parameters specific to the exchange API endpoint
3066
+ * @param {boolean} [params.uta] set to true for the unified trading account (uta), defaults to false
2995
3067
  * @returns {object} A dictionary of [order book structures]{@link https://docs.ccxt.com/#/?id=order-book-structure} indexed by market symbols
2996
3068
  */
2997
3069
  async fetchOrderBook(symbol, limit = undefined, params = {}) {
@@ -3003,13 +3075,19 @@ class bitget extends bitget$1 {
3003
3075
  if (limit !== undefined) {
3004
3076
  request['limit'] = limit;
3005
3077
  }
3078
+ let productType = undefined;
3079
+ [productType, params] = this.handleProductTypeAndParams(market, params);
3006
3080
  let response = undefined;
3007
- if (market['spot']) {
3081
+ let uta = undefined;
3082
+ [uta, params] = this.handleOptionAndParams(params, 'fetchOrderBook', 'uta', false);
3083
+ if (uta) {
3084
+ request['category'] = productType;
3085
+ response = await this.publicUtaGetV3MarketOrderbook(this.extend(request, params));
3086
+ }
3087
+ else if (market['spot']) {
3008
3088
  response = await this.publicSpotGetV2SpotMarketOrderbook(this.extend(request, params));
3009
3089
  }
3010
3090
  else {
3011
- let productType = undefined;
3012
- [productType, params] = this.handleProductTypeAndParams(market, params);
3013
3091
  request['productType'] = productType;
3014
3092
  response = await this.publicMixGetV2MixMarketMergeDepth(this.extend(request, params));
3015
3093
  }
@@ -3025,9 +3103,24 @@ class bitget extends bitget$1 {
3025
3103
  // }
3026
3104
  // }
3027
3105
  //
3106
+ // uta
3107
+ //
3108
+ // {
3109
+ // "code": "00000",
3110
+ // "msg": "success",
3111
+ // "requestTime": 1750329437753,
3112
+ // "data": {
3113
+ // "a": [ [ 104992.60, 0.018411 ] ],
3114
+ // "b":[ [104927.40, 0.229914 ] ],
3115
+ // "ts": "1750329437763"
3116
+ // }
3117
+ // }
3118
+ //
3028
3119
  const data = this.safeValue(response, 'data', {});
3120
+ const bidsKey = uta ? 'b' : 'bids';
3121
+ const asksKey = uta ? 'a' : 'asks';
3029
3122
  const timestamp = this.safeInteger(data, 'ts');
3030
- return this.parseOrderBook(data, market['symbol'], timestamp);
3123
+ return this.parseOrderBook(data, market['symbol'], timestamp, bidsKey, asksKey);
3031
3124
  }
3032
3125
  parseTicker(ticker, market = undefined) {
3033
3126
  //
@@ -3039,7 +3132,7 @@ class bitget extends bitget$1 {
3039
3132
  // "ts": "1695793390482"
3040
3133
  // }
3041
3134
  //
3042
- // spot: fetchTicker, fetchTickers
3135
+ // spot
3043
3136
  //
3044
3137
  // {
3045
3138
  // "open": "37202.46",
@@ -3060,92 +3153,118 @@ class bitget extends bitget$1 {
3060
3153
  // "change24h": "0.00321"
3061
3154
  // }
3062
3155
  //
3063
- // swap and future: fetchTicker
3156
+ // swap and future
3064
3157
  //
3065
3158
  // {
3066
3159
  // "symbol": "BTCUSDT",
3067
- // "lastPr": "37577.2",
3068
- // "askPr": "37577.3",
3069
- // "bidPr": "37577.2",
3070
- // "bidSz": "3.679",
3071
- // "askSz": "0.02",
3072
- // "high24h": "37765",
3073
- // "low24h": "36628.9",
3074
- // "ts": "1700533070359",
3075
- // "change24h": "0.00288",
3076
- // "baseVolume": "108606.181",
3077
- // "quoteVolume": "4051316303.9608",
3078
- // "usdtVolume": "4051316303.9608",
3079
- // "openUtc": "37451.5",
3080
- // "changeUtc24h": "0.00336",
3081
- // "indexPrice": "37574.489253",
3082
- // "fundingRate": "0.0001",
3083
- // "holdingAmount": "53464.529",
3160
+ // "lastPr": "104823.8",
3161
+ // "askPr": "104823.8",
3162
+ // "bidPr": "104823.5",
3163
+ // "bidSz": "0.703",
3164
+ // "askSz": "13.894",
3165
+ // "high24h": "105289.3",
3166
+ // "low24h": "103447.9",
3167
+ // "ts": "1750332210370",
3168
+ // "change24h": "0.00471",
3169
+ // "baseVolume": "79089.5675",
3170
+ // "quoteVolume": "8274870921.80485",
3171
+ // "usdtVolume": "8274870921.80485",
3172
+ // "openUtc": "104833",
3173
+ // "changeUtc24h": "-0.00009",
3174
+ // "indexPrice": "104881.953125",
3175
+ // "fundingRate": "-0.000014",
3176
+ // "holdingAmount": "7452.6421",
3084
3177
  // "deliveryStartTime": null,
3085
3178
  // "deliveryTime": null,
3086
3179
  // "deliveryStatus": "",
3087
- // "open24h": "37235.7"
3180
+ // "open24h": "104332.3",
3181
+ // "markPrice": "104824.2"
3182
+ // }
3183
+ //
3184
+ // spot uta
3185
+ //
3186
+ // {
3187
+ // "category": "SPOT",
3188
+ // "symbol": "BTCUSDT",
3189
+ // "ts": "1750330651972",
3190
+ // "lastPrice": "104900.2",
3191
+ // "openPrice24h": "104321.2",
3192
+ // "highPrice24h": "107956.8",
3193
+ // "lowPrice24h": "103600.1",
3194
+ // "ask1Price": "104945.8",
3195
+ // "bid1Price": "104880.6",
3196
+ // "bid1Size": "0.266534",
3197
+ // "ask1Size": "0.014001",
3198
+ // "price24hPcnt": "0.00555",
3199
+ // "volume24h": "355.941109",
3200
+ // "turnover24h": "37302936.008134"
3088
3201
  // }
3089
3202
  //
3090
- // swap and future: fetchTickers
3203
+ // swap and future uta
3091
3204
  //
3092
3205
  // {
3093
- // "open": "14.9776",
3094
- // "symbol": "LINKUSDT",
3095
- // "high24h": "15.3942",
3096
- // "low24h": "14.3457",
3097
- // "lastPr": "14.3748",
3098
- // "quoteVolume": "7008612.4299",
3099
- // "baseVolume": "469908.8523",
3100
- // "usdtVolume": "7008612.42986561",
3101
- // "ts": "1700533772309",
3102
- // "bidPr": "14.375",
3103
- // "askPr": "14.3769",
3104
- // "bidSz": "50.004",
3105
- // "askSz": "0.7647",
3106
- // "openUtc": "14.478",
3107
- // "changeUtc24h": "-0.00713",
3108
- // "change24h": "-0.04978"
3206
+ // "category": "USDT-FUTURES",
3207
+ // "symbol": "BTCUSDT",
3208
+ // "ts": "1750332730472",
3209
+ // "lastPrice": "104738",
3210
+ // "openPrice24h": "104374",
3211
+ // "highPrice24h": "105289.3",
3212
+ // "lowPrice24h": "103447.9",
3213
+ // "ask1Price": "104738",
3214
+ // "bid1Price": "104737.7",
3215
+ // "bid1Size": "2.036",
3216
+ // "ask1Size": "8.094",
3217
+ // "price24hPcnt": "0.00349",
3218
+ // "volume24h": "79101.6477",
3219
+ // "turnover24h": "8276293391.45973",
3220
+ // "indexPrice": "104785.956168",
3221
+ // "markPrice": "104738",
3222
+ // "fundingRate": "-0.000007",
3223
+ // "openInterest": "7465.5938",
3224
+ // "deliveryStartTime": "",
3225
+ // "deliveryTime": "",
3226
+ // "deliveryStatus": ""
3109
3227
  // }
3110
3228
  //
3111
3229
  const marketId = this.safeString(ticker, 'symbol');
3112
- const close = this.safeString(ticker, 'lastPr');
3230
+ const close = this.safeString2(ticker, 'lastPr', 'lastPrice');
3113
3231
  const timestamp = this.safeIntegerOmitZero(ticker, 'ts'); // exchange bitget provided 0
3114
3232
  const change = this.safeString(ticker, 'change24h');
3115
- const open24 = this.safeString2(ticker, 'open24', 'open24h');
3116
- const open = this.safeString(ticker, 'open');
3117
- let symbol;
3118
- let openValue;
3119
- if (open === undefined) {
3120
- symbol = this.safeSymbol(marketId, market, undefined, 'contract');
3121
- openValue = open24;
3233
+ const category = this.safeString(ticker, 'category');
3234
+ const markPrice = this.safeString(ticker, 'markPrice');
3235
+ let marketType;
3236
+ if ((markPrice !== undefined) && (category !== 'SPOT')) {
3237
+ marketType = 'contract';
3122
3238
  }
3123
3239
  else {
3124
- symbol = this.safeSymbol(marketId, market, undefined, 'spot');
3125
- openValue = open;
3240
+ marketType = 'spot';
3241
+ }
3242
+ let percentage = this.safeString(ticker, 'price24hPcnt');
3243
+ if (percentage === undefined) {
3244
+ percentage = Precise["default"].stringMul(change, '100');
3126
3245
  }
3127
3246
  return this.safeTicker({
3128
- 'symbol': symbol,
3247
+ 'symbol': this.safeSymbol(marketId, market, undefined, marketType),
3129
3248
  'timestamp': timestamp,
3130
3249
  'datetime': this.iso8601(timestamp),
3131
- 'high': this.safeString(ticker, 'high24h'),
3132
- 'low': this.safeString(ticker, 'low24h'),
3133
- 'bid': this.safeString(ticker, 'bidPr'),
3134
- 'bidVolume': this.safeString(ticker, 'bidSz'),
3135
- 'ask': this.safeString(ticker, 'askPr'),
3136
- 'askVolume': this.safeString(ticker, 'askSz'),
3250
+ 'high': this.safeString2(ticker, 'high24h', 'highPrice24h'),
3251
+ 'low': this.safeString2(ticker, 'low24h', 'lowPrice24h'),
3252
+ 'bid': this.safeString2(ticker, 'bidPr', 'bid1Price'),
3253
+ 'bidVolume': this.safeString2(ticker, 'bidSz', 'bid1Size'),
3254
+ 'ask': this.safeString2(ticker, 'askPr', 'ask1Price'),
3255
+ 'askVolume': this.safeString2(ticker, 'askSz', 'ask1Size'),
3137
3256
  'vwap': undefined,
3138
- 'open': openValue,
3257
+ 'open': this.safeStringN(ticker, ['open', 'open24h', 'openPrice24h']),
3139
3258
  'close': close,
3140
3259
  'last': close,
3141
3260
  'previousClose': undefined,
3142
3261
  'change': change,
3143
- 'percentage': Precise["default"].stringMul(change, '100'),
3262
+ 'percentage': percentage,
3144
3263
  'average': undefined,
3145
- 'baseVolume': this.safeString(ticker, 'baseVolume'),
3146
- 'quoteVolume': this.safeString(ticker, 'quoteVolume'),
3264
+ 'baseVolume': this.safeString2(ticker, 'baseVolume', 'volume24h'),
3265
+ 'quoteVolume': this.safeString2(ticker, 'quoteVolume', 'turnover24h'),
3147
3266
  'indexPrice': this.safeString(ticker, 'indexPrice'),
3148
- 'markPrice': this.safeString(ticker, 'markPrice'),
3267
+ 'markPrice': markPrice,
3149
3268
  'info': ticker,
3150
3269
  }, market);
3151
3270
  }
@@ -3155,8 +3274,10 @@ class bitget extends bitget$1 {
3155
3274
  * @description fetches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
3156
3275
  * @see https://www.bitget.com/api-doc/spot/market/Get-Tickers
3157
3276
  * @see https://www.bitget.com/api-doc/contract/market/Get-Ticker
3277
+ * @see https://www.bitget.com/api-doc/uta/public/Tickers
3158
3278
  * @param {string} symbol unified symbol of the market to fetch the ticker for
3159
3279
  * @param {object} [params] extra parameters specific to the exchange API endpoint
3280
+ * @param {boolean} [params.uta] set to true for the unified trading account (uta), defaults to false
3160
3281
  * @returns {object} a [ticker structure]{@link https://docs.ccxt.com/#/?id=ticker-structure}
3161
3282
  */
3162
3283
  async fetchTicker(symbol, params = {}) {
@@ -3165,13 +3286,19 @@ class bitget extends bitget$1 {
3165
3286
  const request = {
3166
3287
  'symbol': market['id'],
3167
3288
  };
3289
+ let productType = undefined;
3290
+ [productType, params] = this.handleProductTypeAndParams(market, params);
3168
3291
  let response = undefined;
3169
- if (market['spot']) {
3292
+ let uta = undefined;
3293
+ [uta, params] = this.handleOptionAndParams(params, 'fetchTicker', 'uta', false);
3294
+ if (uta) {
3295
+ request['category'] = productType;
3296
+ response = await this.publicUtaGetV3MarketTickers(this.extend(request, params));
3297
+ }
3298
+ else if (market['spot']) {
3170
3299
  response = await this.publicSpotGetV2SpotMarketTickers(this.extend(request, params));
3171
3300
  }
3172
3301
  else {
3173
- let productType = undefined;
3174
- [productType, params] = this.handleProductTypeAndParams(market, params);
3175
3302
  request['productType'] = productType;
3176
3303
  response = await this.publicMixGetV2MixMarketTicker(this.extend(request, params));
3177
3304
  }
@@ -3206,34 +3333,94 @@ class bitget extends bitget$1 {
3206
3333
  //
3207
3334
  // swap and future
3208
3335
  //
3209
- // {
3336
+ // {
3210
3337
  // "code": "00000",
3211
3338
  // "msg": "success",
3212
- // "requestTime": 1700533070357,
3339
+ // "requestTime": 1750332210369,
3213
3340
  // "data": [
3214
3341
  // {
3215
3342
  // "symbol": "BTCUSDT",
3216
- // "lastPr": "37577.2",
3217
- // "askPr": "37577.3",
3218
- // "bidPr": "37577.2",
3219
- // "bidSz": "3.679",
3220
- // "askSz": "0.02",
3221
- // "high24h": "37765",
3222
- // "low24h": "36628.9",
3223
- // "ts": "1700533070359",
3224
- // "change24h": "0.00288",
3225
- // "baseVolume": "108606.181",
3226
- // "quoteVolume": "4051316303.9608",
3227
- // "usdtVolume": "4051316303.9608",
3228
- // "openUtc": "37451.5",
3229
- // "changeUtc24h": "0.00336",
3230
- // "indexPrice": "37574.489253",
3231
- // "fundingRate": "0.0001",
3232
- // "holdingAmount": "53464.529",
3343
+ // "lastPr": "104823.8",
3344
+ // "askPr": "104823.8",
3345
+ // "bidPr": "104823.5",
3346
+ // "bidSz": "0.703",
3347
+ // "askSz": "13.894",
3348
+ // "high24h": "105289.3",
3349
+ // "low24h": "103447.9",
3350
+ // "ts": "1750332210370",
3351
+ // "change24h": "0.00471",
3352
+ // "baseVolume": "79089.5675",
3353
+ // "quoteVolume": "8274870921.80485",
3354
+ // "usdtVolume": "8274870921.80485",
3355
+ // "openUtc": "104833",
3356
+ // "changeUtc24h": "-0.00009",
3357
+ // "indexPrice": "104881.953125",
3358
+ // "fundingRate": "-0.000014",
3359
+ // "holdingAmount": "7452.6421",
3233
3360
  // "deliveryStartTime": null,
3234
3361
  // "deliveryTime": null,
3235
3362
  // "deliveryStatus": "",
3236
- // "open24h": "37235.7"
3363
+ // "open24h": "104332.3",
3364
+ // "markPrice": "104824.2"
3365
+ // }
3366
+ // ]
3367
+ // }
3368
+ //
3369
+ // spot uta
3370
+ //
3371
+ // {
3372
+ // "code": "00000",
3373
+ // "msg": "success",
3374
+ // "requestTime": 1750330653575,
3375
+ // "data": [
3376
+ // {
3377
+ // "category": "SPOT",
3378
+ // "symbol": "BTCUSDT",
3379
+ // "ts": "1750330651972",
3380
+ // "lastPrice": "104900.2",
3381
+ // "openPrice24h": "104321.2",
3382
+ // "highPrice24h": "107956.8",
3383
+ // "lowPrice24h": "103600.1",
3384
+ // "ask1Price": "104945.8",
3385
+ // "bid1Price": "104880.6",
3386
+ // "bid1Size": "0.266534",
3387
+ // "ask1Size": "0.014001",
3388
+ // "price24hPcnt": "0.00555",
3389
+ // "volume24h": "355.941109",
3390
+ // "turnover24h": "37302936.008134"
3391
+ // }
3392
+ // ]
3393
+ // }
3394
+ //
3395
+ // swap and future uta
3396
+ //
3397
+ // {
3398
+ // "code": "00000",
3399
+ // "msg": "success",
3400
+ // "requestTime": 1750332731203,
3401
+ // "data": [
3402
+ // {
3403
+ // "category": "USDT-FUTURES",
3404
+ // "symbol": "BTCUSDT",
3405
+ // "ts": "1750332730472",
3406
+ // "lastPrice": "104738",
3407
+ // "openPrice24h": "104374",
3408
+ // "highPrice24h": "105289.3",
3409
+ // "lowPrice24h": "103447.9",
3410
+ // "ask1Price": "104738",
3411
+ // "bid1Price": "104737.7",
3412
+ // "bid1Size": "2.036",
3413
+ // "ask1Size": "8.094",
3414
+ // "price24hPcnt": "0.00349",
3415
+ // "volume24h": "79101.6477",
3416
+ // "turnover24h": "8276293391.45973",
3417
+ // "indexPrice": "104785.956168",
3418
+ // "markPrice": "104738",
3419
+ // "fundingRate": "-0.000007",
3420
+ // "openInterest": "7465.5938",
3421
+ // "deliveryStartTime": "",
3422
+ // "deliveryTime": "",
3423
+ // "deliveryStatus": ""
3237
3424
  // }
3238
3425
  // ]
3239
3426
  // }
@@ -3275,8 +3462,10 @@ class bitget extends bitget$1 {
3275
3462
  * @description fetches price tickers for multiple markets, statistical information calculated over the past 24 hours for each market
3276
3463
  * @see https://www.bitget.com/api-doc/spot/market/Get-Tickers
3277
3464
  * @see https://www.bitget.com/api-doc/contract/market/Get-All-Symbol-Ticker
3465
+ * @see https://www.bitget.com/api-doc/uta/public/Tickers
3278
3466
  * @param {string[]|undefined} symbols unified symbols of the markets to fetch the ticker for, all market tickers are returned if not assigned
3279
3467
  * @param {object} [params] extra parameters specific to the exchange API endpoint
3468
+ * @param {boolean} [params.uta] set to true for the unified trading account (uta), defaults to false
3280
3469
  * @param {string} [params.subType] *contract only* 'linear', 'inverse'
3281
3470
  * @param {string} [params.productType] *contract only* 'USDT-FUTURES', 'USDC-FUTURES', 'COIN-FUTURES', 'SUSDT-FUTURES', 'SUSDC-FUTURES' or 'SCOIN-FUTURES'
3282
3471
  * @returns {object} a dictionary of [ticker structures]{@link https://docs.ccxt.com/#/?id=ticker-structure}
@@ -3299,7 +3488,17 @@ class bitget extends bitget$1 {
3299
3488
  let productType = undefined;
3300
3489
  [productType, params] = this.handleProductTypeAndParams(market, params);
3301
3490
  // only if passedSubType && productType is undefined, then use spot
3302
- if (type === 'spot' && passedSubType === undefined) {
3491
+ let uta = undefined;
3492
+ [uta, params] = this.handleOptionAndParams(params, 'fetchTickers', 'uta', false);
3493
+ if (uta) {
3494
+ const symbolsLength = symbols.length;
3495
+ if ((symbols !== undefined) && (symbolsLength === 1)) {
3496
+ request['symbol'] = market['id'];
3497
+ }
3498
+ request['category'] = productType;
3499
+ response = await this.publicUtaGetV3MarketTickers(this.extend(request, params));
3500
+ }
3501
+ else if (type === 'spot' && passedSubType === undefined) {
3303
3502
  response = await this.publicSpotGetV2SpotMarketTickers(this.extend(request, params));
3304
3503
  }
3305
3504
  else {
@@ -3363,6 +3562,65 @@ class bitget extends bitget$1 {
3363
3562
  // ]
3364
3563
  // }
3365
3564
  //
3565
+ // spot uta
3566
+ //
3567
+ // {
3568
+ // "code": "00000",
3569
+ // "msg": "success",
3570
+ // "requestTime": 1750330653575,
3571
+ // "data": [
3572
+ // {
3573
+ // "category": "SPOT",
3574
+ // "symbol": "BTCUSDT",
3575
+ // "ts": "1750330651972",
3576
+ // "lastPrice": "104900.2",
3577
+ // "openPrice24h": "104321.2",
3578
+ // "highPrice24h": "107956.8",
3579
+ // "lowPrice24h": "103600.1",
3580
+ // "ask1Price": "104945.8",
3581
+ // "bid1Price": "104880.6",
3582
+ // "bid1Size": "0.266534",
3583
+ // "ask1Size": "0.014001",
3584
+ // "price24hPcnt": "0.00555",
3585
+ // "volume24h": "355.941109",
3586
+ // "turnover24h": "37302936.008134"
3587
+ // }
3588
+ // ]
3589
+ // }
3590
+ //
3591
+ // swap and future uta
3592
+ //
3593
+ // {
3594
+ // "code": "00000",
3595
+ // "msg": "success",
3596
+ // "requestTime": 1750332731203,
3597
+ // "data": [
3598
+ // {
3599
+ // "category": "USDT-FUTURES",
3600
+ // "symbol": "BTCUSDT",
3601
+ // "ts": "1750332730472",
3602
+ // "lastPrice": "104738",
3603
+ // "openPrice24h": "104374",
3604
+ // "highPrice24h": "105289.3",
3605
+ // "lowPrice24h": "103447.9",
3606
+ // "ask1Price": "104738",
3607
+ // "bid1Price": "104737.7",
3608
+ // "bid1Size": "2.036",
3609
+ // "ask1Size": "8.094",
3610
+ // "price24hPcnt": "0.00349",
3611
+ // "volume24h": "79101.6477",
3612
+ // "turnover24h": "8276293391.45973",
3613
+ // "indexPrice": "104785.956168",
3614
+ // "markPrice": "104738",
3615
+ // "fundingRate": "-0.000007",
3616
+ // "openInterest": "7465.5938",
3617
+ // "deliveryStartTime": "",
3618
+ // "deliveryTime": "",
3619
+ // "deliveryStatus": ""
3620
+ // }
3621
+ // ]
3622
+ // }
3623
+ //
3366
3624
  const data = this.safeList(response, 'data', []);
3367
3625
  return this.parseTickers(data, symbols);
3368
3626
  }
@@ -3449,19 +3707,53 @@ class bitget extends bitget$1 {
3449
3707
  // "cTime": "1700720700342"
3450
3708
  // }
3451
3709
  //
3710
+ // uta fetchTrades
3711
+ //
3712
+ // {
3713
+ // "execId": "1319896716324937729",
3714
+ // "price": "105909.1",
3715
+ // "size": "6.3090",
3716
+ // "side": "sell",
3717
+ // "ts": "1750413820344"
3718
+ // }
3719
+ //
3720
+ // uta fetchMyTrades
3721
+ //
3722
+ // {
3723
+ // "execId": "1322441401010528257",
3724
+ // "orderId": "1322441400976261120",
3725
+ // "category": "USDT-FUTURES",
3726
+ // "symbol": "BTCUSDT",
3727
+ // "orderType": "market",
3728
+ // "side": "sell",
3729
+ // "execPrice": "107005.4",
3730
+ // "execQty": "0.0001",
3731
+ // "execValue": "10.7005",
3732
+ // "tradeScope": "taker",
3733
+ // "feeDetail": [{
3734
+ // "feeCoin": "USDT",
3735
+ // "fee":"0.00642032"
3736
+ // }],
3737
+ // "createdTime": "1751020520451",
3738
+ // "updatedTime": "1751020520458",
3739
+ // "execPnl": "0.00017"
3740
+ // }
3741
+ //
3452
3742
  const marketId = this.safeString(trade, 'symbol');
3453
3743
  const symbol = this.safeSymbol(marketId, market);
3454
- const timestamp = this.safeInteger2(trade, 'cTime', 'ts');
3744
+ const timestamp = this.safeIntegerN(trade, ['cTime', 'ts', 'createdTime']);
3455
3745
  let fee = undefined;
3456
3746
  const feeDetail = this.safeValue(trade, 'feeDetail');
3457
3747
  const posMode = this.safeString(trade, 'posMode');
3458
- const feeStructure = (posMode !== undefined) ? feeDetail[0] : feeDetail;
3748
+ const category = this.safeString(trade, 'category');
3749
+ const isFeeStructure = (posMode !== undefined) || (category !== undefined);
3750
+ const feeStructure = isFeeStructure ? feeDetail[0] : feeDetail;
3459
3751
  if (feeStructure !== undefined) {
3460
3752
  const currencyCode = this.safeCurrencyCode(this.safeString(feeStructure, 'feeCoin'));
3461
3753
  fee = {
3462
3754
  'currency': currencyCode,
3463
3755
  };
3464
- const feeCostString = this.safeString(feeStructure, 'totalFee');
3756
+ const feeCostString = this.safeString2(feeStructure, 'totalFee', 'fee');
3465
3757
  const deduction = this.safeString(feeStructure, 'deduction') === 'yes' ? true : false;
3466
3758
  if (deduction) {
3467
3759
  fee['cost'] = feeCostString;
@@ -3472,15 +3764,15 @@ class bitget extends bitget$1 {
3472
3764
  }
3473
3765
  return this.safeTrade({
3474
3766
  'info': trade,
3475
- 'id': this.safeString(trade, 'tradeId'),
3767
+ 'id': this.safeString2(trade, 'tradeId', 'execId'),
3476
3768
  'order': this.safeString(trade, 'orderId'),
3477
3769
  'symbol': symbol,
3478
3770
  'side': this.safeStringLower(trade, 'side'),
3479
3771
  'type': this.safeString(trade, 'orderType'),
3480
3772
  'takerOrMaker': this.safeString(trade, 'tradeScope'),
3481
- 'price': this.safeString2(trade, 'priceAvg', 'price'),
3482
- 'amount': this.safeString2(trade, 'baseVolume', 'size'),
3483
- 'cost': this.safeString2(trade, 'quoteVolume', 'amount'),
3773
+ 'price': this.safeStringN(trade, ['priceAvg', 'price', 'execPrice']),
3774
+ 'amount': this.safeStringN(trade, ['baseVolume', 'size', 'execQty']),
3775
+ 'cost': this.safeStringN(trade, ['quoteVolume', 'amount', 'execValue']),
3484
3776
  'timestamp': timestamp,
3485
3777
  'datetime': this.iso8601(timestamp),
3486
3778
  'fee': fee,
@@ -3494,10 +3786,12 @@ class bitget extends bitget$1 {
3494
3786
  * @see https://www.bitget.com/api-doc/spot/market/Get-Market-Trades
3495
3787
  * @see https://www.bitget.com/api-doc/contract/market/Get-Recent-Fills
3496
3788
  * @see https://www.bitget.com/api-doc/contract/market/Get-Fills-History
3789
+ * @see https://www.bitget.com/api-doc/uta/public/Fills
3497
3790
  * @param {string} symbol unified symbol of the market to fetch trades for
3498
3791
  * @param {int} [since] timestamp in ms of the earliest trade to fetch
3499
3792
  * @param {int} [limit] the maximum amount of trades to fetch
3500
3793
  * @param {object} [params] extra parameters specific to the exchange API endpoint
3794
+ * @param {boolean} [params.uta] set to true for the unified trading account (uta), defaults to false
3501
3795
  * @param {int} [params.until] *only applies to publicSpotGetV2SpotMarketFillsHistory and publicMixGetV2MixMarketFillsHistory* the latest time in ms to fetch trades for
3502
3796
  * @param {boolean} [params.paginate] *only applies to publicSpotGetV2SpotMarketFillsHistory and publicMixGetV2MixMarketFillsHistory* default false, when true will automatically paginate by calling this endpoint multiple times
3503
3797
  * @returns {Trade[]} a list of [trade structures]{@link https://docs.ccxt.com/#/?id=public-trades}
@@ -3513,8 +3807,13 @@ class bitget extends bitget$1 {
3513
3807
  let request = {
3514
3808
  'symbol': market['id'],
3515
3809
  };
3810
+ let uta = undefined;
3811
+ [uta, params] = this.handleOptionAndParams(params, 'fetchTrades', 'uta', false);
3516
3812
  if (limit !== undefined) {
3517
- if (market['contract']) {
3813
+ if (uta) {
3814
+ request['limit'] = Math.min(limit, 100);
3815
+ }
3816
+ else if (market['contract']) {
3518
3817
  request['limit'] = Math.min(limit, 1000);
3519
3818
  }
3520
3819
  else {
@@ -3523,7 +3822,20 @@ class bitget extends bitget$1 {
3523
3822
  }
3524
3823
  const options = this.safeValue(this.options, 'fetchTrades', {});
3525
3824
  let response = undefined;
3526
- if (market['spot']) {
3825
+ let productType = undefined;
3826
+ [productType, params] = this.handleProductTypeAndParams(market, params);
3827
+ if (uta) {
3828
+ if (productType === 'SPOT') {
3829
+ let marginMode = undefined;
3830
+ [marginMode, params] = this.handleMarginModeAndParams('fetchTrades', params);
3831
+ if (marginMode !== undefined) {
3832
+ productType = 'MARGIN';
3833
+ }
3834
+ }
3835
+ request['category'] = productType;
3836
+ response = await this.publicUtaGetV3MarketFills(this.extend(request, params));
3837
+ }
3838
+ else if (market['spot']) {
3527
3839
  const spotOptions = this.safeValue(options, 'spot', {});
3528
3840
  const defaultSpotMethod = this.safeString(spotOptions, 'method', 'publicSpotGetV2SpotMarketFillsHistory');
3529
3841
  const spotMethod = this.safeString(params, 'method', defaultSpotMethod);
@@ -3544,8 +3856,6 @@ class bitget extends bitget$1 {
3544
3856
  const defaultSwapMethod = this.safeString(swapOptions, 'method', 'publicMixGetV2MixMarketFillsHistory');
3545
3857
  const swapMethod = this.safeString(params, 'method', defaultSwapMethod);
3546
3858
  params = this.omit(params, 'method');
3547
- let productType = undefined;
3548
- [productType, params] = this.handleProductTypeAndParams(market, params);
3549
3859
  request['productType'] = productType;
3550
3860
  if (swapMethod === 'publicMixGetV2MixMarketFillsHistory') {
3551
3861
  [request, params] = this.handleUntilOption('endTime', request, params);
@@ -3595,6 +3905,23 @@ class bitget extends bitget$1 {
3595
3905
  // ]
3596
3906
  // }
3597
3907
  //
3908
+ // uta
3909
+ //
3910
+ // {
3911
+ // "code": "00000",
3912
+ // "msg": "success",
3913
+ // "requestTime": 1750413823980,
3914
+ // "data": [
3915
+ // {
3916
+ // "execId": "1319896716324937729",
3917
+ // "price": "105909.1",
3918
+ // "size": "6.3090",
3919
+ // "side": "sell",
3920
+ // "ts": "1750413820344"
3921
+ // }
3922
+ // ]
3923
+ // }
3924
+ //
3598
3925
  const data = this.safeList(response, 'data', []);
3599
3926
  return this.parseTrades(data, market, since, limit);
3600
3927
  }
@@ -3786,13 +4113,15 @@ class bitget extends bitget$1 {
3786
4113
  // "1399132.341"
3787
4114
  // ]
3788
4115
  //
4116
+ const inverse = this.safeBool(market, 'inverse');
4117
+ const volumeIndex = inverse ? 6 : 5;
3789
4118
  return [
3790
4119
  this.safeInteger(ohlcv, 0),
3791
4120
  this.safeNumber(ohlcv, 1),
3792
4121
  this.safeNumber(ohlcv, 2),
3793
4122
  this.safeNumber(ohlcv, 3),
3794
4123
  this.safeNumber(ohlcv, 4),
3795
- this.safeNumber(ohlcv, 5),
4124
+ this.safeNumber(ohlcv, volumeIndex),
3796
4125
  ];
3797
4126
  }
3798
4127
  /**
@@ -3805,11 +4134,13 @@ class bitget extends bitget$1 {
3805
4134
  * @see https://www.bitget.com/api-doc/contract/market/Get-History-Candle-Data
3806
4135
  * @see https://www.bitget.com/api-doc/contract/market/Get-History-Index-Candle-Data
3807
4136
  * @see https://www.bitget.com/api-doc/contract/market/Get-History-Mark-Candle-Data
4137
+ * @see https://www.bitget.com/api-doc/uta/public/Get-Candle-Data
3808
4138
  * @param {string} symbol unified symbol of the market to fetch OHLCV data for
3809
4139
  * @param {string} timeframe the length of time each candle represents
3810
4140
  * @param {int} [since] timestamp in ms of the earliest candle to fetch
3811
4141
  * @param {int} [limit] the maximum amount of candles to fetch
3812
4142
  * @param {object} [params] extra parameters specific to the exchange API endpoint
4143
+ * @param {boolean} [params.uta] set to true for the unified trading account (uta), defaults to false
3813
4144
  * @param {int} [params.until] timestamp in ms of the latest candle to fetch
3814
4145
  * @param {boolean} [params.useHistoryEndpoint] whether to force to use historical endpoint (it has max limit of 200)
3815
4146
  * @param {boolean} [params.useHistoryEndpointForPagination] whether to force to use historical endpoint for pagination (default true)
@@ -3831,12 +4162,22 @@ class bitget extends bitget$1 {
3831
4162
  return await this.fetchPaginatedCallDeterministic('fetchOHLCV', symbol, since, limit, timeframe, params, limitForPagination);
3832
4163
  }
3833
4164
  const market = this.market(symbol);
3834
- const marketType = market['spot'] ? 'spot' : 'swap';
3835
- const timeframes = this.options['timeframes'][marketType];
3836
4165
  const request = {
3837
4166
  'symbol': market['id'],
3838
- 'granularity': this.safeString(timeframes, timeframe, timeframe),
3839
4167
  };
4168
+ let marketType = undefined;
4169
+ let timeframes = undefined;
4170
+ let uta = undefined;
4171
+ [uta, params] = this.handleOptionAndParams(params, 'fetchOHLCV', 'uta', false);
4172
+ if (uta) {
4173
+ timeframes = this.options['timeframes']['uta'];
4174
+ request['interval'] = this.safeString(timeframes, timeframe, timeframe);
4175
+ }
4176
+ else {
4177
+ marketType = market['spot'] ? 'spot' : 'swap';
4178
+ timeframes = this.options['timeframes'][marketType];
4179
+ request['granularity'] = this.safeString(timeframes, timeframe, timeframe);
4180
+ }
3840
4181
  const msInDay = 86400000;
3841
4182
  const now = this.milliseconds();
3842
4183
  const duration = this.parseTimeframe(timeframe) * 1000;
@@ -3906,24 +4247,48 @@ class bitget extends bitget$1 {
3906
4247
  request['limit'] = limit;
3907
4248
  // make request
3908
4249
  let response = undefined;
3909
- if (market['spot']) {
4250
+ let productType = undefined;
4251
+ let priceType = undefined;
4252
+ [priceType, params] = this.handleParamString(params, 'price');
4253
+ [productType, params] = this.handleProductTypeAndParams(market, params);
4254
+ if (uta) {
4255
+ if (priceType !== undefined) {
4256
+ if (priceType === 'mark') {
4257
+ request['type'] = 'MARK';
4258
+ }
4259
+ else if (priceType === 'index') {
4260
+ request['type'] = 'INDEX';
4261
+ }
4262
+ }
4263
+ request['category'] = productType;
4264
+ response = await this.publicUtaGetV3MarketCandles(this.extend(request, params));
4265
+ }
4266
+ else if (market['spot']) {
3910
4267
  // checks if we need history endpoint
3911
4268
  if (historicalEndpointNeeded) {
3912
4269
  response = await this.publicSpotGetV2SpotMarketHistoryCandles(this.extend(request, params));
3913
4270
  }
3914
4271
  else {
4272
+ if (!limitDefined) {
4273
+ request['limit'] = 1000;
4274
+ limit = 1000;
4275
+ }
3915
4276
  response = await this.publicSpotGetV2SpotMarketCandles(this.extend(request, params));
3916
4277
  }
3917
4278
  }
3918
4279
  else {
3919
- let priceType = undefined;
3920
- [priceType, params] = this.handleParamString(params, 'price');
3921
- let productType = undefined;
3922
- [productType, params] = this.handleProductTypeAndParams(market, params);
3923
4280
  request['productType'] = productType;
3924
4281
  const extended = this.extend(request, params);
3925
- // todo: mark & index also have their "recent" endpoints, but not priority now.
3926
- if (priceType === 'mark') {
4282
+ if (!historicalEndpointNeeded && (priceType === 'mark' || priceType === 'index')) {
4283
+ if (!limitDefined) {
4284
+ extended['limit'] = 1000;
4285
+ limit = 1000;
4286
+ }
4287
+ // Recent endpoint for mark/index prices
4288
+ // https://www.bitget.com/api-doc/contract/market/Get-Candle-Data
4289
+ response = await this.publicMixGetV2MixMarketCandles(this.extend({ 'kLineType': priceType }, extended));
4290
+ }
4291
+ else if (priceType === 'mark') {
3927
4292
  response = await this.publicMixGetV2MixMarketHistoryMarkCandles(extended);
3928
4293
  }
3929
4294
  else if (priceType === 'index') {
@@ -3934,6 +4299,10 @@ class bitget extends bitget$1 {
3934
4299
  response = await this.publicMixGetV2MixMarketHistoryCandles(extended);
3935
4300
  }
3936
4301
  else {
4302
+ if (!limitDefined) {
4303
+ extended['limit'] = 1000;
4304
+ limit = 1000;
4305
+ }
3937
4306
  response = await this.publicMixGetV2MixMarketCandles(extended);
3938
4307
  }
3939
4308
  }
@@ -3955,8 +4324,10 @@ class bitget extends bitget$1 {
3955
4324
  * @see https://www.bitget.com/api-doc/margin/isolated/account/Get-Isolated-Assets
3956
4325
  * @see https://bitgetlimited.github.io/apidoc/en/margin/#get-cross-assets
3957
4326
  * @see https://bitgetlimited.github.io/apidoc/en/margin/#get-isolated-assets
4327
+ * @see https://www.bitget.com/api-doc/uta/account/Get-Account
3958
4328
  * @param {object} [params] extra parameters specific to the exchange API endpoint
3959
4329
  * @param {string} [params.productType] *contract only* 'USDT-FUTURES', 'USDC-FUTURES', 'COIN-FUTURES', 'SUSDT-FUTURES', 'SUSDC-FUTURES' or 'SCOIN-FUTURES'
4330
+ * @param {string} [params.uta] set to true for the unified trading account (uta), defaults to false
3960
4331
  * @returns {object} a [balance structure]{@link https://docs.ccxt.com/#/?id=balance-structure}
3961
4332
  */
3962
4333
  async fetchBalance(params = {}) {
@@ -3965,9 +4336,17 @@ class bitget extends bitget$1 {
3965
4336
  let marketType = undefined;
3966
4337
  let marginMode = undefined;
3967
4338
  let response = undefined;
4339
+ let uta = undefined;
4340
+ [uta, params] = this.handleOptionAndParams(params, 'fetchBalance', 'uta', false);
3968
4341
  [marketType, params] = this.handleMarketTypeAndParams('fetchBalance', undefined, params);
3969
4342
  [marginMode, params] = this.handleMarginModeAndParams('fetchBalance', params);
3970
- if ((marketType === 'swap') || (marketType === 'future')) {
4343
+ if (uta) {
4344
+ response = await this.privateUtaGetV3AccountAssets(this.extend(request, params));
4345
+ const results = this.safeDict(response, 'data', {});
4346
+ const assets = this.safeList(results, 'assets', []);
4347
+ return this.parseUtaBalance(assets);
4348
+ }
4349
+ else if ((marketType === 'swap') || (marketType === 'future')) {
3971
4350
  let productType = undefined;
3972
4351
  [productType, params] = this.handleProductTypeAndParams(undefined, params);
3973
4352
  request['productType'] = productType;
@@ -4072,9 +4451,67 @@ class bitget extends bitget$1 {
4072
4451
  // ]
4073
4452
  // }
4074
4453
  //
4454
+ // uta
4455
+ //
4456
+ // {
4457
+ // "code": "00000",
4458
+ // "msg": "success",
4459
+ // "requestTime": 1749980065089,
4460
+ // "data": {
4461
+ // "accountEquity": "11.13919278",
4462
+ // "usdtEquity": "11.13921165",
4463
+ // "btcEquity": "0.00011256",
4464
+ // "unrealisedPnl": "0",
4465
+ // "usdtUnrealisedPnl": "0",
4466
+ // "btcUnrealizedPnl": "0",
4467
+ // "effEquity": "6.19299777",
4468
+ // "mmr": "0",
4469
+ // "imr": "0",
4470
+ // "mgnRatio": "0",
4471
+ // "positionMgnRatio": "0",
4472
+ // "assets": [
4473
+ // {
4474
+ // "coin": "USDT",
4475
+ // "equity": "6.19300826",
4476
+ // "usdValue": "6.19299777",
4477
+ // "balance": "6.19300826",
4478
+ // "available": "6.19300826",
4479
+ // "debt": "0",
4480
+ // "locked": "0"
4481
+ // }
4482
+ // ]
4483
+ // }
4484
+ // }
4485
+ //
4075
4486
  const data = this.safeValue(response, 'data', []);
4076
4487
  return this.parseBalance(data);
4077
4488
  }
4489
+ parseUtaBalance(balance) {
4490
+ const result = { 'info': balance };
4491
+ //
4492
+ // {
4493
+ // "coin": "USDT",
4494
+ // "equity": "6.19300826",
4495
+ // "usdValue": "6.19299777",
4496
+ // "balance": "6.19300826",
4497
+ // "available": "6.19300826",
4498
+ // "debt": "0",
4499
+ // "locked": "0"
4500
+ // }
4501
+ //
4502
+ for (let i = 0; i < balance.length; i++) {
4503
+ const entry = balance[i];
4504
+ const account = this.account();
4505
+ const currencyId = this.safeString(entry, 'coin');
4506
+ const code = this.safeCurrencyCode(currencyId);
4507
+ account['debt'] = this.safeString(entry, 'debt');
4508
+ account['used'] = this.safeString(entry, 'locked');
4509
+ account['free'] = this.safeString(entry, 'available');
4510
+ account['total'] = this.safeString(entry, 'balance');
4511
+ result[code] = account;
4512
+ }
4513
+ return this.safeBalance(result);
4514
+ }
4078
4515
  parseBalance(balance) {
4079
4516
  const result = { 'info': balance };
4080
4517
  //
@@ -4213,7 +4650,7 @@ class bitget extends bitget$1 {
4213
4650
  // },
4214
4651
  // ]
4215
4652
  //
4216
- // spot, swap, future and spot margin: cancelOrder, cancelOrders
4653
+ // spot, swap, future, spot margin and uta: cancelOrder, cancelOrders, cancelAllOrders
4217
4654
  //
4218
4655
  // {
4219
4656
  // "orderId": "1098758604547850241",
@@ -4342,6 +4779,66 @@ class bitget extends bitget$1 {
4342
4779
  // "stopLossTriggerType": "fill_price",
4343
4780
  // }
4344
4781
  //
4782
+ // uta: fetchOrder, fetchOpenOrders, fetchCanceledAndClosedOrders
4783
+ //
4784
+ // {
4785
+ // "orderId": "1320244799629316096",
4786
+ // "clientOid": "1320244799633510400",
4787
+ // "category": "USDT-FUTURES",
4788
+ // "symbol": "BTCUSDT",
4789
+ // "orderType": "limit",
4790
+ // "side": "buy",
4791
+ // "price": "50000",
4792
+ // "qty": "0.001",
4793
+ // "amount": "0",
4794
+ // "cumExecQty": "0",
4795
+ // "cumExecValue": "0",
4796
+ // "avgPrice": "0",
4797
+ // "timeInForce": "gtc",
4798
+ // "orderStatus": "live",
4799
+ // "posSide": "long",
4800
+ // "holdMode": "hedge_mode",
4801
+ // "reduceOnly": "NO",
4802
+ // "feeDetail": [{
4803
+ // "feeCoin": "",
4804
+ // "fee": ""
4805
+ // }],
4806
+ // "createdTime": "1750496809871",
4807
+ // "updatedTime": "1750496809886",
4808
+ // "cancelReason": "",
4809
+ // "execType": "normal",
4810
+ // "stpMode": "none",
4811
+ // "tpTriggerBy": null,
4812
+ // "slTriggerBy": null,
4813
+ // "takeProfit": null,
4814
+ // "stopLoss": null,
4815
+ // "tpOrderType": null,
4816
+ // "slOrderType": null,
4817
+ // "tpLimitPrice": null,
4818
+ // "slLimitPrice": null
4819
+ // }
4820
+ //
4821
+ // uta trigger: fetchClosedOrders, fetchCanceledOrders
4822
+ //
4823
+ // {
4824
+ // "orderId": "1330984742276198400",
4825
+ // "clientOid": "1330984742276198400",
4826
+ // "symbol": "BTCUSDT",
4827
+ // "category": "USDT-FUTURES",
4828
+ // "qty": "0.001",
4829
+ // "posSide": "long",
4830
+ // "tpTriggerBy": "market",
4831
+ // "slTriggerBy": "mark",
4832
+ // "takeProfit": "",
4833
+ // "stopLoss": "112000",
4834
+ // "tpOrderType": "market",
4835
+ // "slOrderType": "limit",
4836
+ // "tpLimitPrice": "",
4837
+ // "slLimitPrice": "111000",
4838
+ // "createdTime": "1753057411736",
4839
+ // "updatedTime": "1753058267412"
4840
+ // }
4841
+ //
4345
4842
  const errorMessage = this.safeString(order, 'errorMsg');
4346
4843
  if (errorMessage !== undefined) {
4347
4844
  return this.safeOrder({
@@ -4351,17 +4848,17 @@ class bitget extends bitget$1 {
4351
4848
  'status': 'rejected',
4352
4849
  }, market);
4353
4850
  }
4354
- const isContractOrder = ('posSide' in order);
4851
+ const posSide = this.safeString(order, 'posSide');
4852
+ const isContractOrder = (posSide !== undefined);
4355
4853
  let marketType = isContractOrder ? 'contract' : 'spot';
4356
4854
  if (market !== undefined) {
4357
4855
  marketType = market['type'];
4358
4856
  }
4359
4857
  const marketId = this.safeString(order, 'symbol');
4360
4858
  market = this.safeMarket(marketId, market, undefined, marketType);
4361
- const timestamp = this.safeInteger2(order, 'cTime', 'ctime');
4362
- const updateTimestamp = this.safeInteger(order, 'uTime');
4363
- let rawStatus = this.safeString2(order, 'status', 'state');
4364
- rawStatus = this.safeString(order, 'planStatus', rawStatus);
4859
+ const timestamp = this.safeIntegerN(order, ['cTime', 'ctime', 'createdTime']);
4860
+ const updateTimestamp = this.safeInteger2(order, 'uTime', 'updatedTime');
4861
+ const rawStatus = this.safeStringN(order, ['status', 'state', 'orderStatus', 'planStatus']);
4365
4862
  let fee = undefined;
4366
4863
  const feeCostString = this.safeString(order, 'fee');
4367
4864
  if (feeCostString !== undefined) {
@@ -4372,24 +4869,35 @@ class bitget extends bitget$1 {
4372
4869
  };
4373
4870
  }
4374
4871
  const feeDetail = this.safeValue(order, 'feeDetail');
4375
- if (feeDetail !== undefined) {
4376
- const parsedFeeDetail = JSON.parse(feeDetail);
4377
- const feeValues = Object.values(parsedFeeDetail);
4378
- let feeObject = undefined;
4379
- for (let i = 0; i < feeValues.length; i++) {
4380
- const feeValue = feeValues[i];
4381
- if (this.safeValue(feeValue, 'feeCoinCode') !== undefined) {
4382
- feeObject = feeValue;
4383
- break;
4384
- }
4385
- }
4872
+ const uta = this.safeString(order, 'category') !== undefined;
4873
+ if (uta) {
4874
+ const feeResult = this.safeDict(feeDetail, 0, {});
4875
+ const utaFee = this.safeString(feeResult, 'fee');
4386
4876
  fee = {
4387
- 'cost': this.parseNumber(Precise["default"].stringNeg(this.safeString(feeObject, 'totalFee'))),
4388
- 'currency': this.safeCurrencyCode(this.safeString(feeObject, 'feeCoinCode')),
4877
+ 'cost': this.parseNumber(Precise["default"].stringNeg(utaFee)),
4878
+ 'currency': market['settle'],
4389
4879
  };
4390
4880
  }
4881
+ else {
4882
+ if (feeDetail !== undefined) {
4883
+ const parsedFeeDetail = JSON.parse(feeDetail);
4884
+ const feeValues = Object.values(parsedFeeDetail);
4885
+ let feeObject = undefined;
4886
+ for (let i = 0; i < feeValues.length; i++) {
4887
+ const feeValue = feeValues[i];
4888
+ if (this.safeValue(feeValue, 'feeCoinCode') !== undefined) {
4889
+ feeObject = feeValue;
4890
+ break;
4891
+ }
4892
+ }
4893
+ fee = {
4894
+ 'cost': this.parseNumber(Precise["default"].stringNeg(this.safeString(feeObject, 'totalFee'))),
4895
+ 'currency': this.safeCurrencyCode(this.safeString(feeObject, 'feeCoinCode')),
4896
+ };
4897
+ }
4898
+ }
4391
4899
  let postOnly = undefined;
4392
- let timeInForce = this.safeStringUpper(order, 'force');
4900
+ let timeInForce = this.safeStringUpper2(order, 'force', 'timeInForce');
4393
4901
  if (timeInForce === 'POST_ONLY') {
4394
4902
  postOnly = true;
4395
4903
  timeInForce = 'PO';
@@ -4408,7 +4916,7 @@ class bitget extends bitget$1 {
4408
4916
  average = this.safeString(order, 'basePrice');
4409
4917
  }
4410
4918
  else {
4411
- price = this.safeString2(order, 'price', 'executePrice');
4919
+ price = this.safeStringN(order, ['price', 'executePrice', 'slLimitPrice', 'tpLimitPrice']);
4412
4920
  average = this.safeString(order, 'priceAvg');
4413
4921
  }
4414
4922
  let size = undefined;
@@ -4420,8 +4928,8 @@ class bitget extends bitget$1 {
4420
4928
  filled = this.safeString(order, 'size');
4421
4929
  }
4422
4930
  else {
4423
- size = this.safeString(order, 'size');
4424
- filled = this.safeString(order, 'baseVolume');
4931
+ size = this.safeString2(order, 'size', 'qty');
4932
+ filled = this.safeString2(order, 'baseVolume', 'cumExecQty');
4425
4933
  }
4426
4934
  let side = this.safeString(order, 'side');
4427
4935
  const posMode = this.safeString(order, 'posMode');
@@ -4457,8 +4965,8 @@ class bitget extends bitget$1 {
4457
4965
  'postOnly': postOnly,
4458
4966
  'reduceOnly': reduceOnly,
4459
4967
  'triggerPrice': this.safeNumber(order, 'triggerPrice'),
4460
- 'takeProfitPrice': this.safeNumber2(order, 'presetStopSurplusPrice', 'stopSurplusTriggerPrice'),
4461
- 'stopLossPrice': this.safeNumber2(order, 'presetStopLossPrice', 'stopLossTriggerPrice'),
4968
+ 'takeProfitPrice': this.safeNumberN(order, ['presetStopSurplusPrice', 'stopSurplusTriggerPrice', 'takeProfit']),
4969
+ 'stopLossPrice': this.safeNumberN(order, ['presetStopLossPrice', 'stopLossTriggerPrice', 'stopLoss']),
4462
4970
  'status': this.parseOrderStatus(rawStatus),
4463
4971
  'fee': fee,
4464
4972
  'trades': undefined,
@@ -4498,6 +5006,8 @@ class bitget extends bitget$1 {
4498
5006
  * @see https://www.bitget.com/api-doc/contract/plan/Place-Plan-Order
4499
5007
  * @see https://www.bitget.com/api-doc/margin/cross/trade/Cross-Place-Order
4500
5008
  * @see https://www.bitget.com/api-doc/margin/isolated/trade/Isolated-Place-Order
5009
+ * @see https://www.bitget.com/api-doc/uta/trade/Place-Order
5010
+ * @see https://www.bitget.com/api-doc/uta/strategy/Place-Strategy-Order
4501
5011
  * @param {string} symbol unified symbol of the market to create an order in
4502
5012
  * @param {string} type 'market' or 'limit'
4503
5013
  * @param {string} side 'buy' or 'sell'
@@ -4526,6 +5036,8 @@ class bitget extends bitget$1 {
4526
5036
  * @param {boolean} [params.oneWayMode] *swap and future only* required to set this to true in one_way_mode and you can leave this as undefined in hedge_mode, can adjust the mode using the setPositionMode() method
4527
5037
  * @param {bool} [params.hedged] *swap and future only* true for hedged mode, false for one way mode, default is false
4528
5038
  * @param {bool} [params.reduceOnly] true or false whether the order is reduce-only
5039
+ * @param {boolean} [params.uta] set to true for the unified trading account (uta), defaults to false
5040
+ * @param {string} [params.posSide] *uta only* hedged two-way position side, long or short
4529
5041
  * @returns {object} an [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
4530
5042
  */
4531
5043
  async createOrder(symbol, type, side, amount, price = undefined, params = {}) {
@@ -4542,31 +5054,44 @@ class bitget extends bitget$1 {
4542
5054
  const isStopLossTriggerOrder = stopLossTriggerPrice !== undefined;
4543
5055
  const isTakeProfitTriggerOrder = takeProfitTriggerPrice !== undefined;
4544
5056
  const isStopLossOrTakeProfitTrigger = isStopLossTriggerOrder || isTakeProfitTriggerOrder;
4545
- const request = this.createOrderRequest(symbol, type, side, amount, price, params);
4546
5057
  let response = undefined;
4547
- if (market['spot']) {
4548
- if (isTriggerOrder) {
4549
- response = await this.privateSpotPostV2SpotTradePlacePlanOrder(request);
4550
- }
4551
- else if (marginMode === 'isolated') {
4552
- response = await this.privateMarginPostV2MarginIsolatedPlaceOrder(request);
4553
- }
4554
- else if (marginMode === 'cross') {
4555
- response = await this.privateMarginPostV2MarginCrossedPlaceOrder(request);
5058
+ let uta = undefined;
5059
+ [uta, params] = this.handleOptionAndParams(params, 'createOrder', 'uta', false);
5060
+ if (uta) {
5061
+ const request = this.createUtaOrderRequest(symbol, type, side, amount, price, params);
5062
+ if (isStopLossOrTakeProfitTrigger) {
5063
+ response = await this.privateUtaPostV3TradePlaceStrategyOrder(request);
4556
5064
  }
4557
5065
  else {
4558
- response = await this.privateSpotPostV2SpotTradePlaceOrder(request);
5066
+ response = await this.privateUtaPostV3TradePlaceOrder(request);
4559
5067
  }
4560
5068
  }
4561
5069
  else {
4562
- if (isTriggerOrder || isTrailingPercentOrder) {
4563
- response = await this.privateMixPostV2MixOrderPlacePlanOrder(request);
4564
- }
4565
- else if (isStopLossOrTakeProfitTrigger) {
4566
- response = await this.privateMixPostV2MixOrderPlaceTpslOrder(request);
5070
+ const request = this.createOrderRequest(symbol, type, side, amount, price, params);
5071
+ if (market['spot']) {
5072
+ if (isTriggerOrder) {
5073
+ response = await this.privateSpotPostV2SpotTradePlacePlanOrder(request);
5074
+ }
5075
+ else if (marginMode === 'isolated') {
5076
+ response = await this.privateMarginPostV2MarginIsolatedPlaceOrder(request);
5077
+ }
5078
+ else if (marginMode === 'cross') {
5079
+ response = await this.privateMarginPostV2MarginCrossedPlaceOrder(request);
5080
+ }
5081
+ else {
5082
+ response = await this.privateSpotPostV2SpotTradePlaceOrder(request);
5083
+ }
4567
5084
  }
4568
5085
  else {
4569
- response = await this.privateMixPostV2MixOrderPlaceOrder(request);
5086
+ if (isTriggerOrder || isTrailingPercentOrder) {
5087
+ response = await this.privateMixPostV2MixOrderPlacePlanOrder(request);
5088
+ }
5089
+ else if (isStopLossOrTakeProfitTrigger) {
5090
+ response = await this.privateMixPostV2MixOrderPlaceTpslOrder(request);
5091
+ }
5092
+ else {
5093
+ response = await this.privateMixPostV2MixOrderPlaceOrder(request);
5094
+ }
4570
5095
  }
4571
5096
  }
4572
5097
  //
@@ -4583,6 +5108,133 @@ class bitget extends bitget$1 {
4583
5108
  const data = this.safeDict(response, 'data', {});
4584
5109
  return this.parseOrder(data, market);
4585
5110
  }
5111
+ createUtaOrderRequest(symbol, type, side, amount, price = undefined, params = {}) {
5112
+ const market = this.market(symbol);
5113
+ let productType = undefined;
5114
+ [productType, params] = this.handleProductTypeAndParams(market, params);
5115
+ if (productType === 'SPOT') {
5116
+ let marginMode = undefined;
5117
+ [marginMode, params] = this.handleMarginModeAndParams('createOrder', params);
5118
+ if (marginMode !== undefined) {
5119
+ productType = 'MARGIN';
5120
+ }
5121
+ }
5122
+ const request = {
5123
+ 'category': productType,
5124
+ 'symbol': market['id'],
5125
+ 'qty': this.amountToPrecision(symbol, amount),
5126
+ 'side': side,
5127
+ };
5128
+ const clientOrderId = this.safeString2(params, 'clientOid', 'clientOrderId');
5129
+ if (clientOrderId !== undefined) {
5130
+ request['clientOid'] = clientOrderId;
5131
+ params = this.omit(params, 'clientOrderId');
5132
+ }
5133
+ const stopLossTriggerPrice = this.safeNumber(params, 'stopLossPrice');
5134
+ const takeProfitTriggerPrice = this.safeNumber(params, 'takeProfitPrice');
5135
+ const stopLoss = this.safeValue(params, 'stopLoss');
5136
+ const takeProfit = this.safeValue(params, 'takeProfit');
5137
+ const isStopLoss = stopLoss !== undefined;
5138
+ const isTakeProfit = takeProfit !== undefined;
5139
+ const isStopLossTrigger = stopLossTriggerPrice !== undefined;
5140
+ const isTakeProfitTrigger = takeProfitTriggerPrice !== undefined;
5141
+ const isStopLossOrTakeProfitTrigger = isStopLossTrigger || isTakeProfitTrigger;
5142
+ if (isStopLossOrTakeProfitTrigger) {
5143
+ if (isStopLossTrigger) {
5144
+ const slType = this.safeString(params, 'slTriggerBy', 'mark');
5145
+ request['slTriggerBy'] = slType;
5146
+ request['stopLoss'] = this.priceToPrecision(symbol, stopLossTriggerPrice);
5147
+ if (price !== undefined) {
5148
+ request['slLimitPrice'] = this.priceToPrecision(symbol, price);
5149
+ request['slOrderType'] = this.safeString(params, 'slOrderType', 'limit');
5150
+ }
5151
+ else {
5152
+ request['slOrderType'] = this.safeString(params, 'slOrderType', 'market');
5153
+ }
5154
+ }
5155
+ else if (isTakeProfitTrigger) {
5156
+ const tpType = this.safeString(params, 'tpTriggerBy', 'mark');
5157
+ request['tpTriggerBy'] = tpType;
5158
+ request['takeProfit'] = this.priceToPrecision(symbol, takeProfitTriggerPrice);
5159
+ if (price !== undefined) {
5160
+ request['tpLimitPrice'] = this.priceToPrecision(symbol, price);
5161
+ request['tpOrderType'] = this.safeString(params, 'tpOrderType', 'limit');
5162
+ }
5163
+ else {
5164
+ request['tpOrderType'] = this.safeString(params, 'tpOrderType', 'market');
5165
+ }
5166
+ }
5167
+ params = this.omit(params, ['stopLossPrice', 'takeProfitPrice']);
5168
+ }
5169
+ else {
5170
+ if (isStopLoss) {
5171
+ const slTriggerPrice = this.safeNumber2(stopLoss, 'triggerPrice', 'stopPrice');
5172
+ const slLimitPrice = this.safeNumber(stopLoss, 'price');
5173
+ request['stopLoss'] = this.priceToPrecision(symbol, slTriggerPrice);
5174
+ if (slLimitPrice !== undefined) {
5175
+ request['slLimitPrice'] = this.priceToPrecision(symbol, slLimitPrice);
5176
+ request['slOrderType'] = this.safeString(params, 'slOrderType', 'limit');
5177
+ }
5178
+ else {
5179
+ request['slOrderType'] = this.safeString(params, 'slOrderType', 'market');
5180
+ }
5181
+ }
5182
+ if (isTakeProfit) {
5183
+ const tpTriggerPrice = this.safeNumber2(takeProfit, 'triggerPrice', 'stopPrice');
5184
+ const tpLimitPrice = this.safeNumber(takeProfit, 'price');
5185
+ request['takeProfit'] = this.priceToPrecision(symbol, tpTriggerPrice);
5186
+ if (tpLimitPrice !== undefined) {
5187
+ request['tpLimitPrice'] = this.priceToPrecision(symbol, tpLimitPrice);
5188
+ request['tpOrderType'] = this.safeString(params, 'tpOrderType', 'limit');
5189
+ }
5190
+ else {
5191
+ request['tpOrderType'] = this.safeString(params, 'tpOrderType', 'market');
5192
+ }
5193
+ }
5194
+ const isMarketOrder = type === 'market';
5195
+ if (!isMarketOrder) {
5196
+ request['price'] = this.priceToPrecision(symbol, price);
5197
+ }
5198
+ request['orderType'] = type;
5199
+ const exchangeSpecificTifParam = this.safeString(params, 'timeInForce');
5200
+ let postOnly = undefined;
5201
+ [postOnly, params] = this.handlePostOnly(isMarketOrder, exchangeSpecificTifParam === 'post_only', params);
5202
+ const defaultTimeInForce = this.safeStringUpper(this.options, 'defaultTimeInForce');
5203
+ const timeInForce = this.safeStringUpper(params, 'timeInForce', defaultTimeInForce);
5204
+ if (postOnly) {
5205
+ request['timeInForce'] = 'post_only';
5206
+ }
5207
+ else if (timeInForce === 'GTC') {
5208
+ request['timeInForce'] = 'gtc';
5209
+ }
5210
+ else if (timeInForce === 'FOK') {
5211
+ request['timeInForce'] = 'fok';
5212
+ }
5213
+ else if (timeInForce === 'IOC') {
5214
+ request['timeInForce'] = 'ioc';
5215
+ }
5216
+ }
5217
+ const reduceOnly = this.safeBool(params, 'reduceOnly', false);
5218
+ let hedged = undefined;
5219
+ [hedged, params] = this.handleParamBool(params, 'hedged', false);
5220
+ if (reduceOnly) {
5221
+ if (hedged || isStopLossOrTakeProfitTrigger) {
5222
+ const reduceOnlyPosSide = (side === 'sell') ? 'long' : 'short';
5223
+ request['posSide'] = reduceOnlyPosSide;
5224
+ }
5225
+ else if (!isStopLossOrTakeProfitTrigger) {
5226
+ request['reduceOnly'] = 'yes';
5227
+ }
5228
+ }
5229
+ else {
5230
+ if (hedged) {
5231
+ const posSide = (side === 'buy') ? 'long' : 'short';
5232
+ request['posSide'] = posSide;
5233
+ }
5234
+ }
5235
+ params = this.omit(params, ['stopLoss', 'takeProfit', 'postOnly', 'reduceOnly', 'hedged']);
5236
+ return this.extend(request, params);
5237
+ }
4586
5238
  createOrderRequest(symbol, type, side, amount, price = undefined, params = {}) {
4587
5239
  const market = this.market(symbol);
4588
5240
  let marketType = undefined;
@@ -4666,17 +5318,17 @@ class bitget extends bitget$1 {
4666
5318
  request['executePrice'] = this.priceToPrecision(symbol, price);
4667
5319
  }
4668
5320
  if (isStopLoss) {
4669
- const slTriggerPrice = this.safeNumber2(stopLoss, 'triggerPrice', 'stopPrice');
5321
+ const slTriggerPrice = this.safeString2(stopLoss, 'triggerPrice', 'stopPrice');
4670
5322
  request['stopLossTriggerPrice'] = this.priceToPrecision(symbol, slTriggerPrice);
4671
- const slPrice = this.safeNumber(stopLoss, 'price');
5323
+ const slPrice = this.safeString(stopLoss, 'price');
4672
5324
  request['stopLossExecutePrice'] = this.priceToPrecision(symbol, slPrice);
4673
5325
  const slType = this.safeString(stopLoss, 'type', 'mark_price');
4674
5326
  request['stopLossTriggerType'] = slType;
4675
5327
  }
4676
5328
  if (isTakeProfit) {
4677
- const tpTriggerPrice = this.safeNumber2(takeProfit, 'triggerPrice', 'stopPrice');
5329
+ const tpTriggerPrice = this.safeString2(takeProfit, 'triggerPrice', 'stopPrice');
4678
5330
  request['stopSurplusTriggerPrice'] = this.priceToPrecision(symbol, tpTriggerPrice);
4679
- const tpPrice = this.safeNumber(takeProfit, 'price');
5331
+ const tpPrice = this.safeString(takeProfit, 'price');
4680
5332
  request['stopSurplusExecutePrice'] = this.priceToPrecision(symbol, tpPrice);
4681
5333
  const tpType = this.safeString(takeProfit, 'type', 'mark_price');
4682
5334
  request['stopSurplusTriggerType'] = tpType;
@@ -4805,6 +5457,60 @@ class bitget extends bitget$1 {
4805
5457
  }
4806
5458
  return this.extend(request, params);
4807
5459
  }
5460
+ async createUtaOrders(orders, params = {}) {
5461
+ await this.loadMarkets();
5462
+ const ordersRequests = [];
5463
+ let symbol = undefined;
5464
+ let marginMode = undefined;
5465
+ for (let i = 0; i < orders.length; i++) {
5466
+ const rawOrder = orders[i];
5467
+ const marketId = this.safeString(rawOrder, 'symbol');
5468
+ if (symbol === undefined) {
5469
+ symbol = marketId;
5470
+ }
5471
+ else {
5472
+ if (symbol !== marketId) {
5473
+ throw new errors.BadRequest(this.id + ' createOrders() requires all orders to have the same symbol');
5474
+ }
5475
+ }
5476
+ const type = this.safeString(rawOrder, 'type');
5477
+ const side = this.safeString(rawOrder, 'side');
5478
+ const amount = this.safeValue(rawOrder, 'amount');
5479
+ const price = this.safeValue(rawOrder, 'price');
5480
+ const orderParams = this.safeValue(rawOrder, 'params', {});
5481
+ const marginResult = this.handleMarginModeAndParams('createOrders', orderParams);
5482
+ const currentMarginMode = marginResult[0];
5483
+ if (currentMarginMode !== undefined) {
5484
+ if (marginMode === undefined) {
5485
+ marginMode = currentMarginMode;
5486
+ }
5487
+ else {
5488
+ if (marginMode !== currentMarginMode) {
5489
+ throw new errors.BadRequest(this.id + ' createOrders() requires all orders to have the same margin mode (isolated or cross)');
5490
+ }
5491
+ }
5492
+ }
5493
+ const orderRequest = this.createUtaOrderRequest(marketId, type, side, amount, price, orderParams);
5494
+ ordersRequests.push(orderRequest);
5495
+ }
5496
+ const market = this.market(symbol);
5497
+ const response = await this.privateUtaPostV3TradePlaceBatch(ordersRequests);
5498
+ //
5499
+ // {
5500
+ // "code": "00000",
5501
+ // "msg": "success",
5502
+ // "requestTime": 1752810184560,
5503
+ // "data": [
5504
+ // {
5505
+ // "orderId": "1329947796441513984",
5506
+ // "clientOid": "1329947796483457024"
5507
+ // },
5508
+ // ]
5509
+ // }
5510
+ //
5511
+ const data = this.safeList(response, 'data', []);
5512
+ return this.parseOrders(data, market);
5513
+ }
4808
5514
  /**
4809
5515
  * @method
4810
5516
  * @name bitget#createOrders
@@ -4813,12 +5519,19 @@ class bitget extends bitget$1 {
4813
5519
  * @see https://www.bitget.com/api-doc/contract/trade/Batch-Order
4814
5520
  * @see https://www.bitget.com/api-doc/margin/isolated/trade/Isolated-Batch-Order
4815
5521
  * @see https://www.bitget.com/api-doc/margin/cross/trade/Cross-Batch-Order
5522
+ * @see https://www.bitget.com/api-doc/uta/trade/Place-Batch
4816
5523
  * @param {Array} orders list of orders to create, each object should contain the parameters required by createOrder, namely symbol, type, side, amount, price and params
4817
5524
  * @param {object} [params] extra parameters specific to the api endpoint
5525
+ * @param {boolean} [params.uta] set to true for the unified trading account (uta), defaults to false
4818
5526
  * @returns {object} an [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
4819
5527
  */
4820
5528
  async createOrders(orders, params = {}) {
4821
5529
  await this.loadMarkets();
5530
+ let uta = undefined;
5531
+ [uta, params] = this.handleOptionAndParams(params, 'createOrders', 'uta', false);
5532
+ if (uta) {
5533
+ return await this.createUtaOrders(orders, params);
5534
+ }
4822
5535
  const ordersRequests = [];
4823
5536
  let symbol = undefined;
4824
5537
  let marginMode = undefined;
@@ -4917,6 +5630,8 @@ class bitget extends bitget$1 {
4917
5630
  * @see https://www.bitget.com/api-doc/contract/trade/Modify-Order
4918
5631
  * @see https://www.bitget.com/api-doc/contract/plan/Modify-Tpsl-Order
4919
5632
  * @see https://www.bitget.com/api-doc/contract/plan/Modify-Plan-Order
5633
+ * @see https://www.bitget.com/api-doc/uta/trade/Modify-Order
5634
+ * @see https://www.bitget.com/api-doc/uta/strategy/Modify-Strategy-Order
4920
5635
  * @param {string} id cancel order id
4921
5636
  * @param {string} symbol unified symbol of the market to create an order in
4922
5637
  * @param {string} type 'market' or 'limit'
@@ -4938,6 +5653,7 @@ class bitget extends bitget$1 {
4938
5653
  * @param {string} [params.trailingPercent] *swap and future only* the percent to trail away from the current market price, rate can not be greater than 10
4939
5654
  * @param {string} [params.trailingTriggerPrice] *swap and future only* the price to trigger a trailing stop order, default uses the price argument
4940
5655
  * @param {string} [params.newTriggerType] *swap and future only* 'fill_price', 'mark_price' or 'index_price'
5656
+ * @param {boolean} [params.uta] set to true for the unified trading account (uta), defaults to false
4941
5657
  * @returns {object} an [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
4942
5658
  */
4943
5659
  async editOrder(id, symbol, type, side, amount = undefined, price = undefined, params = {}) {
@@ -4969,7 +5685,50 @@ class bitget extends bitget$1 {
4969
5685
  }
4970
5686
  params = this.omit(params, ['stopPrice', 'triggerType', 'stopLossPrice', 'takeProfitPrice', 'stopLoss', 'takeProfit', 'clientOrderId', 'trailingTriggerPrice', 'trailingPercent']);
4971
5687
  let response = undefined;
4972
- if (market['spot']) {
5688
+ let productType = undefined;
5689
+ let uta = undefined;
5690
+ [productType, params] = this.handleProductTypeAndParams(market, params);
5691
+ [uta, params] = this.handleOptionAndParams(params, 'editOrder', 'uta', false);
5692
+ if (uta) {
5693
+ if (amount !== undefined) {
5694
+ request['qty'] = this.amountToPrecision(symbol, amount);
5695
+ }
5696
+ if (isStopLossOrder || isTakeProfitOrder) {
5697
+ if (isStopLossOrder) {
5698
+ const slType = this.safeString(params, 'slTriggerBy', 'mark');
5699
+ request['slTriggerBy'] = slType;
5700
+ request['stopLoss'] = this.priceToPrecision(symbol, stopLossPrice);
5701
+ if (price !== undefined) {
5702
+ request['slLimitPrice'] = this.priceToPrecision(symbol, price);
5703
+ request['slOrderType'] = this.safeString(params, 'slOrderType', 'limit');
5704
+ }
5705
+ else {
5706
+ request['slOrderType'] = this.safeString(params, 'slOrderType', 'market');
5707
+ }
5708
+ }
5709
+ else if (isTakeProfitOrder) {
5710
+ const tpType = this.safeString(params, 'tpTriggerBy', 'mark');
5711
+ request['tpTriggerBy'] = tpType;
5712
+ request['takeProfit'] = this.priceToPrecision(symbol, takeProfitPrice);
5713
+ if (price !== undefined) {
5714
+ request['tpLimitPrice'] = this.priceToPrecision(symbol, price);
5715
+ request['tpOrderType'] = this.safeString(params, 'tpOrderType', 'limit');
5716
+ }
5717
+ else {
5718
+ request['tpOrderType'] = this.safeString(params, 'tpOrderType', 'market');
5719
+ }
5720
+ }
5721
+ params = this.omit(params, ['stopLossPrice', 'takeProfitPrice']);
5722
+ response = await this.privateUtaPostV3TradeModifyStrategyOrder(this.extend(request, params));
5723
+ }
5724
+ else {
5725
+ if (price !== undefined) {
5726
+ request['price'] = this.priceToPrecision(symbol, price);
5727
+ }
5728
+ response = await this.privateUtaPostV3TradeModifyOrder(this.extend(request, params));
5729
+ }
5730
+ }
5731
+ else if (market['spot']) {
4973
5732
  if (triggerPrice === undefined) {
4974
5733
  throw new errors.NotSupported(this.id + ' editOrder() only supports plan/trigger spot orders');
4975
5734
  }
@@ -4998,8 +5757,6 @@ class bitget extends bitget$1 {
4998
5757
  throw new errors.NotSupported(this.id + ' editOrder() does not support ' + market['type'] + ' orders');
4999
5758
  }
5000
5759
  request['symbol'] = market['id'];
5001
- let productType = undefined;
5002
- [productType, params] = this.handleProductTypeAndParams(market, params);
5003
5760
  request['productType'] = productType;
5004
5761
  if (!isTakeProfitOrder && !isStopLossOrder) {
5005
5762
  request['newSize'] = this.amountToPrecision(symbol, amount);
@@ -5091,6 +5848,8 @@ class bitget extends bitget$1 {
5091
5848
  * @see https://www.bitget.com/api-doc/contract/plan/Cancel-Plan-Order
5092
5849
  * @see https://www.bitget.com/api-doc/margin/cross/trade/Cross-Cancel-Order
5093
5850
  * @see https://www.bitget.com/api-doc/margin/isolated/trade/Isolated-Cancel-Order
5851
+ * @see https://www.bitget.com/api-doc/uta/trade/Cancel-Order
5852
+ * @see https://www.bitget.com/api-doc/uta/strategy/Cancel-Strategy-Order
5094
5853
  * @param {string} id order id
5095
5854
  * @param {string} symbol unified symbol of the market the order was made in
5096
5855
  * @param {object} [params] extra parameters specific to the exchange API endpoint
@@ -5098,6 +5857,7 @@ class bitget extends bitget$1 {
5098
5857
  * @param {boolean} [params.trigger] set to true for canceling trigger orders
5099
5858
  * @param {string} [params.planType] *swap only* either profit_plan, loss_plan, normal_plan, pos_profit, pos_loss, moving_plan or track_plan
5100
5859
  * @param {boolean} [params.trailing] set to true if you want to cancel a trailing order
5860
+ * @param {boolean} [params.uta] set to true for the unified trading account (uta), defaults to false
5101
5861
  * @returns {object} An [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
5102
5862
  */
5103
5863
  async cancelOrder(id, symbol = undefined, params = {}) {
@@ -5119,7 +5879,18 @@ class bitget extends bitget$1 {
5119
5879
  if (!((market['swap'] || market['future']) && trigger)) {
5120
5880
  request['orderId'] = id;
5121
5881
  }
5122
- if ((market['swap']) || (market['future'])) {
5882
+ let uta = undefined;
5883
+ [uta, params] = this.handleOptionAndParams(params, 'cancelOrder', 'uta', false);
5884
+ if (uta) {
5885
+ request['orderId'] = id;
5886
+ if (trigger) {
5887
+ response = await this.privateUtaPostV3TradeCancelStrategyOrder(this.extend(request, params));
5888
+ }
5889
+ else {
5890
+ response = await this.privateUtaPostV3TradeCancelOrder(this.extend(request, params));
5891
+ }
5892
+ }
5893
+ else if ((market['swap']) || (market['future'])) {
5123
5894
  let productType = undefined;
5124
5895
  [productType, params] = this.handleProductTypeAndParams(market, params);
5125
5896
  request['productType'] = productType;
@@ -5205,17 +5976,66 @@ class bitget extends bitget$1 {
5205
5976
  // }
5206
5977
  // }
5207
5978
  //
5979
+ // uta trigger
5980
+ //
5981
+ // {
5982
+ // "code": "00000",
5983
+ // "msg": "success",
5984
+ // "requestTime": "1753058267399",
5985
+ // "data": null
5986
+ // }
5987
+ //
5208
5988
  const data = this.safeValue(response, 'data', {});
5209
5989
  let order = undefined;
5210
- if ((market['swap'] || market['future']) && trigger) {
5990
+ if ((market['swap'] || market['future']) && trigger && !uta) {
5211
5991
  const orderInfo = this.safeValue(data, 'successList', []);
5212
5992
  order = orderInfo[0];
5213
5993
  }
5214
5994
  else {
5215
- order = data;
5995
+ if (uta && trigger) {
5996
+ order = response;
5997
+ }
5998
+ else {
5999
+ order = data;
6000
+ }
5216
6001
  }
5217
6002
  return this.parseOrder(order, market);
5218
6003
  }
6004
+ async cancelUtaOrders(ids, symbol = undefined, params = {}) {
6005
+ if (symbol === undefined) {
6006
+ throw new errors.ArgumentsRequired(this.id + ' cancelOrders() requires a symbol argument');
6007
+ }
6008
+ await this.loadMarkets();
6009
+ const market = this.market(symbol);
6010
+ let productType = undefined;
6011
+ [productType, params] = this.handleProductTypeAndParams(market, params);
6012
+ const requestList = [];
6013
+ for (let i = 0; i < ids.length; i++) {
6014
+ const individualId = ids[i];
6015
+ const order = {
6016
+ 'orderId': individualId,
6017
+ 'symbol': market['id'],
6018
+ 'category': productType,
6019
+ };
6020
+ requestList.push(order);
6021
+ }
6022
+ const response = await this.privateUtaPostV3TradeCancelBatch(requestList);
6023
+ //
6024
+ // {
6025
+ // "code": "00000",
6026
+ // "msg": "success",
6027
+ // "requestTime": 1752813731517,
6028
+ // "data": [
6029
+ // {
6030
+ // "orderId": "1329948909442023424",
6031
+ // "clientOid": "1329948909446217728"
6032
+ // },
6033
+ // ]
6034
+ // }
6035
+ //
6036
+ const data = this.safeList(response, 'data', []);
6037
+ return this.parseOrders(data, market);
6038
+ }
5219
6039
  /**
5220
6040
  * @method
5221
6041
  * @name bitget#cancelOrders
@@ -5225,11 +6045,13 @@ class bitget extends bitget$1 {
5225
6045
  * @see https://www.bitget.com/api-doc/contract/plan/Cancel-Plan-Order
5226
6046
  * @see https://www.bitget.com/api-doc/margin/cross/trade/Cross-Batch-Cancel-Order
5227
6047
  * @see https://www.bitget.com/api-doc/margin/isolated/trade/Isolated-Batch-Cancel-Orders
6048
+ * @see https://www.bitget.com/api-doc/uta/trade/Cancel-Batch
5228
6049
  * @param {string[]} ids order ids
5229
6050
  * @param {string} symbol unified market symbol, default is undefined
5230
6051
  * @param {object} [params] extra parameters specific to the exchange API endpoint
5231
6052
  * @param {string} [params.marginMode] 'isolated' or 'cross' for spot margin trading
5232
6053
  * @param {boolean} [params.trigger] *contract only* set to true for canceling trigger orders
6054
+ * @param {boolean} [params.uta] set to true for the unified trading account (uta), defaults to false
5233
6055
  * @returns {object} an array of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
5234
6056
  */
5235
6057
  async cancelOrders(ids, symbol = undefined, params = {}) {
@@ -5238,6 +6060,11 @@ class bitget extends bitget$1 {
5238
6060
  }
5239
6061
  await this.loadMarkets();
5240
6062
  const market = this.market(symbol);
6063
+ let uta = undefined;
6064
+ [uta, params] = this.handleOptionAndParams(params, 'cancelOrders', 'uta', false);
6065
+ if (uta) {
6066
+ return await this.cancelUtaOrders(ids, symbol, params);
6067
+ }
5241
6068
  let marginMode = undefined;
5242
6069
  [marginMode, params] = this.handleMarginModeAndParams('cancelOrders', params);
5243
6070
  const trigger = this.safeValue2(params, 'stop', 'trigger');
@@ -5313,10 +6140,12 @@ class bitget extends bitget$1 {
5313
6140
  * @see https://www.bitget.com/api-doc/contract/trade/Batch-Cancel-Orders
5314
6141
  * @see https://bitgetlimited.github.io/apidoc/en/margin/#isolated-batch-cancel-orders
5315
6142
  * @see https://bitgetlimited.github.io/apidoc/en/margin/#cross-batch-cancel-order
6143
+ * @see https://www.bitget.com/api-doc/uta/trade/Cancel-All-Order
5316
6144
  * @param {string} symbol unified market symbol
5317
6145
  * @param {object} [params] extra parameters specific to the exchange API endpoint
5318
6146
  * @param {string} [params.marginMode] 'isolated' or 'cross' for spot margin trading
5319
6147
  * @param {boolean} [params.trigger] *contract only* set to true for canceling trigger orders
6148
+ * @param {boolean} [params.uta] set to true for the unified trading account (uta), defaults to false
5320
6149
  * @returns {object[]} a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
5321
6150
  */
5322
6151
  async cancelAllOrders(symbol = undefined, params = {}) {
@@ -5327,13 +6156,41 @@ class bitget extends bitget$1 {
5327
6156
  const market = this.market(symbol);
5328
6157
  let marginMode = undefined;
5329
6158
  [marginMode, params] = this.handleMarginModeAndParams('cancelAllOrders', params);
6159
+ let productType = undefined;
6160
+ [productType, params] = this.handleProductTypeAndParams(market, params);
5330
6161
  const request = {
5331
6162
  'symbol': market['id'],
5332
6163
  };
5333
6164
  const trigger = this.safeBool2(params, 'stop', 'trigger');
5334
6165
  params = this.omit(params, ['stop', 'trigger']);
5335
6166
  let response = undefined;
5336
- if (market['spot']) {
6167
+ let uta = undefined;
6168
+ [uta, params] = this.handleOptionAndParams(params, 'cancelAllOrders', 'uta', false);
6169
+ if (uta) {
6170
+ if (productType === 'SPOT') {
6171
+ if (marginMode !== undefined) {
6172
+ productType = 'MARGIN';
6173
+ }
6174
+ }
6175
+ request['category'] = productType;
6176
+ response = await this.privateUtaPostV3TradeCancelSymbolOrder(this.extend(request, params));
6177
+ //
6178
+ // {
6179
+ // "code": "00000",
6180
+ // "msg": "success",
6181
+ // "requestTime": 1750751578138,
6182
+ // "data": {
6183
+ // "list": [
6184
+ // {
6185
+ // "orderId": "1321313242969427968",
6186
+ // "clientOid": "1321313242969427969"
6187
+ // }
6188
+ // ]
6189
+ // }
6190
+ // }
6191
+ //
6192
+ }
6193
+ else if (market['spot']) {
5337
6194
  if (marginMode !== undefined) {
5338
6195
  if (marginMode === 'cross') {
5339
6196
  response = await this.privateMarginPostMarginV1CrossOrderBatchCancelOrder(this.extend(request, params));
@@ -5392,8 +6249,6 @@ class bitget extends bitget$1 {
5392
6249
  }
5393
6250
  }
5394
6251
  else {
5395
- let productType = undefined;
5396
- [productType, params] = this.handleProductTypeAndParams(market, params);
5397
6252
  request['productType'] = productType;
5398
6253
  if (trigger) {
5399
6254
  response = await this.privateMixPostV2MixOrderCancelPlanOrder(this.extend(request, params));
@@ -5417,9 +6272,15 @@ class bitget extends bitget$1 {
5417
6272
  // }
5418
6273
  }
5419
6274
  const data = this.safeDict(response, 'data');
5420
- const resultList = this.safeList2(data, 'resultList', 'successList');
6275
+ const resultList = this.safeListN(data, ['resultList', 'successList', 'list']);
5421
6276
  const failureList = this.safeList2(data, 'failure', 'failureList');
5422
- const responseList = this.arrayConcat(resultList, failureList);
6277
+ let responseList = undefined;
6278
+ if ((resultList !== undefined) && (failureList !== undefined)) {
6279
+ responseList = this.arrayConcat(resultList, failureList);
6280
+ }
6281
+ else {
6282
+ responseList = resultList;
6283
+ }
5423
6284
  return this.parseOrders(responseList);
5424
6285
  }
5425
6286
  /**
@@ -5428,9 +6289,11 @@ class bitget extends bitget$1 {
5428
6289
  * @description fetches information on an order made by the user
5429
6290
  * @see https://www.bitget.com/api-doc/spot/trade/Get-Order-Info
5430
6291
  * @see https://www.bitget.com/api-doc/contract/trade/Get-Order-Details
6292
+ * @see https://www.bitget.com/api-doc/uta/trade/Get-Order-Details
5431
6293
  * @param {string} id the order id
5432
6294
  * @param {string} symbol unified symbol of the market the order was made in
5433
6295
  * @param {object} [params] extra parameters specific to the exchange API endpoint
6296
+ * @param {boolean} [params.uta] set to true for the unified trading account (uta), defaults to false
5434
6297
  * @returns {object} An [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
5435
6298
  */
5436
6299
  async fetchOrder(id, symbol = undefined, params = {}) {
@@ -5443,7 +6306,12 @@ class bitget extends bitget$1 {
5443
6306
  'orderId': id,
5444
6307
  };
5445
6308
  let response = undefined;
5446
- if (market['spot']) {
6309
+ let uta = undefined;
6310
+ [uta, params] = this.handleOptionAndParams(params, 'fetchOrder', 'uta', false);
6311
+ if (uta) {
6312
+ response = await this.privateUtaGetV3TradeOrderInfo(this.extend(request, params));
6313
+ }
6314
+ else if (market['spot']) {
5447
6315
  response = await this.privateSpotGetV2SpotTradeOrderInfo(this.extend(request, params));
5448
6316
  }
5449
6317
  else if (market['swap'] || market['future']) {
@@ -5523,7 +6391,51 @@ class bitget extends bitget$1 {
5523
6391
  // }
5524
6392
  // }
5525
6393
  //
5526
- if (typeof response === 'string') {
6394
+ // uta
6395
+ //
6396
+ // {
6397
+ // "code": "00000",
6398
+ // "msg": "success",
6399
+ // "requestTime": 1750496858333,
6400
+ // "data": {
6401
+ // "orderId": "1320244799629316096",
6402
+ // "clientOid": "1320244799633510400",
6403
+ // "category": "USDT-FUTURES",
6404
+ // "symbol": "BTCUSDT",
6405
+ // "orderType": "limit",
6406
+ // "side": "buy",
6407
+ // "price": "50000",
6408
+ // "qty": "0.001",
6409
+ // "amount": "0",
6410
+ // "cumExecQty": "0",
6411
+ // "cumExecValue": "0",
6412
+ // "avgPrice": "0",
6413
+ // "timeInForce": "gtc",
6414
+ // "orderStatus": "live",
6415
+ // "posSide": "long",
6416
+ // "holdMode": "hedge_mode",
6417
+ // "reduceOnly": "NO",
6418
+ // "feeDetail": [{
6419
+ // "feeCoin": "",
6420
+ // "fee": ""
6421
+ // }],
6422
+ // "createdTime": "1750496809871",
6423
+ // "updatedTime": "1750496809886",
6424
+ // "cancelReason": "",
6425
+ // "execType": "normal",
6426
+ // "stpMode": "none",
6427
+ // "tpTriggerBy": null,
6428
+ // "slTriggerBy": null,
6429
+ // "takeProfit": null,
6430
+ // "stopLoss": null,
6431
+ // "tpOrderType": null,
6432
+ // "slOrderType": null,
6433
+ // "tpLimitPrice": null,
6434
+ // "slLimitPrice": null
6435
+ // }
6436
+ // }
6437
+ //
6438
+ if (!uta && (typeof response === 'string')) {
5527
6439
  response = JSON.parse(response);
5528
6440
  }
5529
6441
  const data = this.safeDict(response, 'data');
@@ -5533,6 +6445,10 @@ class bitget extends bitget$1 {
5533
6445
  }
5534
6446
  }
5535
6447
  const dataList = this.safeList(response, 'data', []);
6448
+ const dataListLength = dataList.length;
6449
+ if (dataListLength === 0) {
6450
+ throw new errors.OrderNotFound(this.id + ' fetchOrder() could not find order id ' + id + ' in ' + this.json(response));
6451
+ }
5536
6452
  const first = this.safeDict(dataList, 0, {});
5537
6453
  return this.parseOrder(first, market);
5538
6454
  // const first = this.safeDict (data, 0, data);
@@ -5548,6 +6464,7 @@ class bitget extends bitget$1 {
5548
6464
  * @see https://www.bitget.com/api-doc/contract/plan/get-orders-plan-pending
5549
6465
  * @see https://www.bitget.com/api-doc/margin/cross/trade/Get-Cross-Open-Orders
5550
6466
  * @see https://www.bitget.com/api-doc/margin/isolated/trade/Isolated-Open-Orders
6467
+ * @see https://www.bitget.com/api-doc/uta/strategy/Get-Unfilled-Strategy-Orders
5551
6468
  * @param {string} symbol unified market symbol
5552
6469
  * @param {int} [since] the earliest time in ms to fetch open orders for
5553
6470
  * @param {int} [limit] the maximum number of open order structures to retrieve
@@ -5558,6 +6475,7 @@ class bitget extends bitget$1 {
5558
6475
  * @param {boolean} [params.paginate] default false, when true will automatically paginate by calling this endpoint multiple times. See in the docs all the [available parameters](https://github.com/ccxt/ccxt/wiki/Manual#pagination-params)
5559
6476
  * @param {string} [params.isPlan] *swap only* 'plan' for stop orders and 'profit_loss' for tp/sl orders, default is 'plan'
5560
6477
  * @param {boolean} [params.trailing] set to true if you want to fetch trailing orders
6478
+ * @param {boolean} [params.uta] set to true for the unified trading account (uta), defaults to false
5561
6479
  * @returns {Order[]} a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
5562
6480
  */
5563
6481
  async fetchOpenOrders(symbol = undefined, since = undefined, limit = undefined, params = {}) {
@@ -5567,6 +6485,8 @@ class bitget extends bitget$1 {
5567
6485
  let request = {};
5568
6486
  let marginMode = undefined;
5569
6487
  [marginMode, params] = this.handleMarginModeAndParams('fetchOpenOrders', params);
6488
+ let uta = undefined;
6489
+ [uta, params] = this.handleOptionAndParams(params, 'fetchOpenOrders', 'uta', false);
5570
6490
  if (symbol !== undefined) {
5571
6491
  market = this.market(symbol);
5572
6492
  request['symbol'] = market['id'];
@@ -5582,22 +6502,28 @@ class bitget extends bitget$1 {
5582
6502
  [paginate, params] = this.handleOptionAndParams(params, 'fetchOpenOrders', 'paginate');
5583
6503
  if (paginate) {
5584
6504
  let cursorReceived = undefined;
5585
- if (type === 'spot') {
6505
+ let cursorSent = undefined;
6506
+ if (uta) {
6507
+ cursorReceived = 'cursor';
6508
+ cursorSent = 'cursor';
6509
+ }
6510
+ else if (type === 'spot') {
5586
6511
  if (marginMode !== undefined) {
5587
6512
  cursorReceived = 'minId';
6513
+ cursorSent = 'idLessThan';
5588
6514
  }
5589
6515
  }
5590
6516
  else {
5591
6517
  cursorReceived = 'endId';
6518
+ cursorSent = 'idLessThan';
5592
6519
  }
5593
- return await this.fetchPaginatedCallCursor('fetchOpenOrders', symbol, since, limit, params, cursorReceived, 'idLessThan');
6520
+ return await this.fetchPaginatedCallCursor('fetchOpenOrders', symbol, since, limit, params, cursorReceived, cursorSent);
5594
6521
  }
5595
6522
  let response = undefined;
5596
6523
  const trailing = this.safeBool(params, 'trailing');
5597
6524
  const trigger = this.safeBool2(params, 'stop', 'trigger');
5598
6525
  const planTypeDefined = this.safeString(params, 'planType') !== undefined;
5599
6526
  const isTrigger = (trigger || planTypeDefined);
5600
- params = this.omit(params, ['stop', 'trigger', 'trailing']);
5601
6527
  [request, params] = this.handleUntilOption('endTime', request, params);
5602
6528
  if (since !== undefined) {
5603
6529
  request['startTime'] = since;
@@ -5605,53 +6531,66 @@ class bitget extends bitget$1 {
5605
6531
  if (limit !== undefined) {
5606
6532
  request['limit'] = limit;
5607
6533
  }
5608
- if ((type === 'swap') || (type === 'future') || (marginMode !== undefined)) {
6534
+ if (!uta && ((type === 'swap') || (type === 'future') || (marginMode !== undefined))) {
5609
6535
  const clientOrderId = this.safeString2(params, 'clientOid', 'clientOrderId');
5610
6536
  params = this.omit(params, 'clientOrderId');
5611
6537
  if (clientOrderId !== undefined) {
5612
6538
  request['clientOid'] = clientOrderId;
5613
6539
  }
5614
6540
  }
5615
- let query = undefined;
5616
- query = this.omit(params, ['type']);
5617
- if (type === 'spot') {
5618
- if (marginMode !== undefined) {
6541
+ let productType = undefined;
6542
+ [productType, params] = this.handleProductTypeAndParams(market, params);
6543
+ params = this.omit(params, ['type', 'stop', 'trigger', 'trailing']);
6544
+ if (uta) {
6545
+ if (type === 'spot') {
6546
+ if (marginMode !== undefined) {
6547
+ productType = 'MARGIN';
6548
+ }
6549
+ }
6550
+ request['category'] = productType;
6551
+ if (trigger) {
6552
+ response = await this.privateUtaGetV3TradeUnfilledStrategyOrders(this.extend(request, params));
6553
+ }
6554
+ else {
6555
+ response = await this.privateUtaGetV3TradeUnfilledOrders(this.extend(request, params));
6556
+ }
6557
+ }
6558
+ else if (type === 'spot') {
6559
+ if (marginMode !== undefined) {
5619
6560
  if (since === undefined) {
5620
6561
  since = this.milliseconds() - 7776000000;
5621
6562
  request['startTime'] = since;
5622
6563
  }
5623
6564
  if (marginMode === 'isolated') {
5624
- response = await this.privateMarginGetV2MarginIsolatedOpenOrders(this.extend(request, query));
6565
+ response = await this.privateMarginGetV2MarginIsolatedOpenOrders(this.extend(request, params));
5625
6566
  }
5626
6567
  else if (marginMode === 'cross') {
5627
- response = await this.privateMarginGetV2MarginCrossedOpenOrders(this.extend(request, query));
6568
+ response = await this.privateMarginGetV2MarginCrossedOpenOrders(this.extend(request, params));
5628
6569
  }
5629
6570
  }
5630
6571
  else {
5631
6572
  if (trigger) {
5632
- response = await this.privateSpotGetV2SpotTradeCurrentPlanOrder(this.extend(request, query));
6573
+ response = await this.privateSpotGetV2SpotTradeCurrentPlanOrder(this.extend(request, params));
5633
6574
  }
5634
6575
  else {
5635
- response = await this.privateSpotGetV2SpotTradeUnfilledOrders(this.extend(request, query));
6576
+ response = await this.privateSpotGetV2SpotTradeUnfilledOrders(this.extend(request, params));
5636
6577
  }
5637
6578
  }
5638
6579
  }
5639
6580
  else {
5640
- let productType = undefined;
5641
- [productType, query] = this.handleProductTypeAndParams(market, query);
5642
6581
  request['productType'] = productType;
5643
6582
  if (trailing) {
5644
6583
  const planType = this.safeString(params, 'planType', 'track_plan');
5645
6584
  request['planType'] = planType;
5646
- response = await this.privateMixGetV2MixOrderOrdersPlanPending(this.extend(request, query));
6585
+ response = await this.privateMixGetV2MixOrderOrdersPlanPending(this.extend(request, params));
5647
6586
  }
5648
6587
  else if (isTrigger) {
5649
- const planType = this.safeString(query, 'planType', 'normal_plan');
6588
+ const planType = this.safeString(params, 'planType', 'normal_plan');
5650
6589
  request['planType'] = planType;
5651
- response = await this.privateMixGetV2MixOrderOrdersPlanPending(this.extend(request, query));
6590
+ response = await this.privateMixGetV2MixOrderOrdersPlanPending(this.extend(request, params));
5652
6591
  }
5653
6592
  else {
5654
- response = await this.privateMixGetV2MixOrderOrdersPending(this.extend(request, query));
6593
+ response = await this.privateMixGetV2MixOrderOrdersPending(this.extend(request, params));
5655
6594
  }
5656
6595
  }
5657
6596
  //
@@ -5829,8 +6768,95 @@ class bitget extends bitget$1 {
5829
6768
  // }
5830
6769
  // }
5831
6770
  //
6771
+ // uta
6772
+ //
6773
+ // {
6774
+ // "code": "00000",
6775
+ // "msg": "success",
6776
+ // "requestTime": 1750753395850,
6777
+ // "data": {
6778
+ // "list": [
6779
+ // {
6780
+ // "orderId": "1321320757371228160",
6781
+ // "clientOid": "1321320757371228161",
6782
+ // "category": "USDT-FUTURES",
6783
+ // "symbol": "BTCUSDT",
6784
+ // "orderType": "limit",
6785
+ // "side": "buy",
6786
+ // "price": "50000",
6787
+ // "qty": "0.001",
6788
+ // "amount": "0",
6789
+ // "cumExecQty": "0",
6790
+ // "cumExecValue": "0",
6791
+ // "avgPrice": "0",
6792
+ // "timeInForce": "gtc",
6793
+ // "orderStatus": "live",
6794
+ // "posSide": "long",
6795
+ // "holdMode": "hedge_mode",
6796
+ // "reduceOnly": "NO",
6797
+ // "feeDetail": [
6798
+ // {
6799
+ // "feeCoin": "",
6800
+ // "fee": ""
6801
+ // }
6802
+ // ],
6803
+ // "createdTime": "1750753338186",
6804
+ // "updatedTime": "1750753338203",
6805
+ // "stpMode": "none",
6806
+ // "tpTriggerBy": null,
6807
+ // "slTriggerBy": null,
6808
+ // "takeProfit": null,
6809
+ // "stopLoss": null,
6810
+ // "tpOrderType": null,
6811
+ // "slOrderType": null,
6812
+ // "tpLimitPrice": null,
6813
+ // "slLimitPrice": null
6814
+ // }
6815
+ // ],
6816
+ // "cursor": "1321320757371228160"
6817
+ // }
6818
+ // }
6819
+ //
6820
+ // uta trigger
6821
+ //
6822
+ // {
6823
+ // "code": "00000",
6824
+ // "msg": "success",
6825
+ // "requestTime": 1753057527060,
6826
+ // "data": [
6827
+ // {
6828
+ // "orderId": "1330984742276198400",
6829
+ // "clientOid": "1330984742276198400",
6830
+ // "symbol": "BTCUSDT",
6831
+ // "category": "USDT-FUTURES",
6832
+ // "qty": "0.001",
6833
+ // "posSide": "long",
6834
+ // "tpTriggerBy": "market",
6835
+ // "slTriggerBy": "mark",
6836
+ // "takeProfit": "",
6837
+ // "stopLoss":"114000",
6838
+ // "tpOrderType": "market",
6839
+ // "slOrderType": "limit",
6840
+ // "tpLimitPrice": "",
6841
+ // "slLimitPrice": "113000",
6842
+ // "createdTime": "1753057411736",
6843
+ // "updatedTime": "1753057411747"
6844
+ // }
6845
+ // ]
6846
+ // }
6847
+ //
5832
6848
  const data = this.safeValue(response, 'data');
5833
- if (type === 'spot') {
6849
+ if (uta) {
6850
+ let result = undefined;
6851
+ if (trigger) {
6852
+ result = this.safeList(response, 'data', []);
6853
+ }
6854
+ else {
6855
+ result = this.safeList(data, 'list', []);
6856
+ }
6857
+ return this.parseOrders(result, market, since, limit);
6858
+ }
6859
+ else if (type === 'spot') {
5834
6860
  if ((marginMode !== undefined) || trigger) {
5835
6861
  const resultList = this.safeList(data, 'orderList', []);
5836
6862
  return this.parseOrders(resultList, market, since, limit);
@@ -5852,6 +6878,7 @@ class bitget extends bitget$1 {
5852
6878
  * @see https://www.bitget.com/api-doc/contract/plan/orders-plan-history
5853
6879
  * @see https://www.bitget.com/api-doc/margin/cross/trade/Get-Cross-Order-History
5854
6880
  * @see https://www.bitget.com/api-doc/margin/isolated/trade/Get-Isolated-Order-History
6881
+ * @see https://www.bitget.com/api-doc/uta/trade/Get-Order-History
5855
6882
  * @param {string} symbol unified market symbol of the closed orders
5856
6883
  * @param {int} [since] timestamp in ms of the earliest order
5857
6884
  * @param {int} [limit] the max number of closed orders to return
@@ -5879,6 +6906,7 @@ class bitget extends bitget$1 {
5879
6906
  * @see https://www.bitget.com/api-doc/contract/plan/orders-plan-history
5880
6907
  * @see https://www.bitget.com/api-doc/margin/cross/trade/Get-Cross-Order-History
5881
6908
  * @see https://www.bitget.com/api-doc/margin/isolated/trade/Get-Isolated-Order-History
6909
+ * @see https://www.bitget.com/api-doc/uta/trade/Get-Order-History
5882
6910
  * @param {string} symbol unified market symbol of the canceled orders
5883
6911
  * @param {int} [since] timestamp in ms of the earliest order
5884
6912
  * @param {int} [limit] the max number of canceled orders to return
@@ -5905,6 +6933,8 @@ class bitget extends bitget$1 {
5905
6933
  * @see https://www.bitget.com/api-doc/contract/plan/orders-plan-history
5906
6934
  * @see https://www.bitget.com/api-doc/margin/cross/trade/Get-Cross-Order-History
5907
6935
  * @see https://www.bitget.com/api-doc/margin/isolated/trade/Get-Isolated-Order-History
6936
+ * @see https://www.bitget.com/api-doc/uta/trade/Get-Order-History
6937
+ * @see https://www.bitget.com/api-doc/uta/strategy/Get-History-Strategy-Orders
5908
6938
  * @description fetches information on multiple canceled and closed orders made by the user
5909
6939
  * @param {string} symbol unified market symbol of the market orders were made in
5910
6940
  * @param {int} [since] the earliest time in ms to fetch orders for
@@ -5916,9 +6946,15 @@ class bitget extends bitget$1 {
5916
6946
  * @param {boolean} [params.paginate] default false, when true will automatically paginate by calling this endpoint multiple times. See in the docs all the [available parameters](https://github.com/ccxt/ccxt/wiki/Manual#pagination-params)
5917
6947
  * @param {string} [params.isPlan] *swap only* 'plan' for stop orders and 'profit_loss' for tp/sl orders, default is 'plan'
5918
6948
  * @param {boolean} [params.trailing] set to true if you want to fetch trailing orders
6949
+ * @param {boolean} [params.uta] set to true for the unified trading account (uta), defaults to false
5919
6950
  * @returns {Order[]} a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
5920
6951
  */
5921
6952
  async fetchCanceledAndClosedOrders(symbol = undefined, since = undefined, limit = undefined, params = {}) {
6953
+ let uta = undefined;
6954
+ [uta, params] = this.handleOptionAndParams(params, 'fetchCanceledAndClosedOrders', 'uta', false);
6955
+ if (uta) {
6956
+ return await this.fetchUtaCanceledAndClosedOrders(symbol, since, limit, params);
6957
+ }
5922
6958
  await this.loadMarkets();
5923
6959
  let market = undefined;
5924
6960
  let request = {};
@@ -6207,6 +7243,132 @@ class bitget extends bitget$1 {
6207
7243
  const orders = this.safeList(response, 'data', []);
6208
7244
  return this.parseOrders(orders, market, since, limit);
6209
7245
  }
7246
+ async fetchUtaCanceledAndClosedOrders(symbol = undefined, since = undefined, limit = undefined, params = {}) {
7247
+ await this.loadMarkets();
7248
+ let market = undefined;
7249
+ if (symbol !== undefined) {
7250
+ market = this.market(symbol);
7251
+ }
7252
+ let productType = undefined;
7253
+ [productType, params] = this.handleProductTypeAndParams(market, params);
7254
+ if (productType === 'SPOT') {
7255
+ let marginMode = undefined;
7256
+ [marginMode, params] = this.handleMarginModeAndParams('fetchCanceledAndClosedOrders', params);
7257
+ if (marginMode !== undefined) {
7258
+ productType = 'MARGIN';
7259
+ }
7260
+ }
7261
+ let request = {
7262
+ 'category': productType,
7263
+ };
7264
+ let paginate = false;
7265
+ [paginate, params] = this.handleOptionAndParams(params, 'fetchCanceledAndClosedOrders', 'paginate');
7266
+ if (paginate) {
7267
+ return await this.fetchPaginatedCallCursor('fetchCanceledAndClosedOrders', symbol, since, limit, params, 'cursor', 'cursor');
7268
+ }
7269
+ [request, params] = this.handleUntilOption('endTime', request, params);
7270
+ if (since !== undefined) {
7271
+ request['startTime'] = since;
7272
+ }
7273
+ if (limit !== undefined) {
7274
+ request['limit'] = limit;
7275
+ }
7276
+ let response = undefined;
7277
+ const trigger = this.safeBool2(params, 'stop', 'trigger');
7278
+ params = this.omit(params, ['stop', 'trigger']);
7279
+ if (trigger) {
7280
+ response = await this.privateUtaGetV3TradeHistoryStrategyOrders(this.extend(request, params));
7281
+ }
7282
+ else {
7283
+ response = await this.privateUtaGetV3TradeHistoryOrders(this.extend(request, params));
7284
+ }
7285
+ //
7286
+ // uta
7287
+ //
7288
+ // {
7289
+ // "code": "00000",
7290
+ // "msg": "success",
7291
+ // "requestTime": 1752531592855,
7292
+ // "data": {
7293
+ // "list": [
7294
+ // {
7295
+ // "orderId": "1322441400976261120",
7296
+ // "clientOid": "1322441400976261121",
7297
+ // "category": "USDT-FUTURES",
7298
+ // "symbol": "BTCUSDT",
7299
+ // "orderType": "market",
7300
+ // "side": "sell",
7301
+ // "price": "0",
7302
+ // "qty": "0.0001",
7303
+ // "amount": "0",
7304
+ // "cumExecQty": "0.0001",
7305
+ // "cumExecValue": "10.7005",
7306
+ // "avgPrice": "107005.4",
7307
+ // "timeInForce": "gtc",
7308
+ // "orderStatus": "filled",
7309
+ // "posSide": "long",
7310
+ // "holdMode": "hedge_mode",
7311
+ // "reduceOnly": "NO",
7312
+ // "feeDetail": [
7313
+ // {
7314
+ // "feeCoin": "USDT",
7315
+ // "fee": "0.00642032"
7316
+ // }
7317
+ // ],
7318
+ // "createdTime": "1751020520442",
7319
+ // "updatedTime": "1751020520457",
7320
+ // "cancelReason": "",
7321
+ // "execType": "normal",
7322
+ // "stpMode": "none",
7323
+ // "tpTriggerBy": null,
7324
+ // "slTriggerBy": null,
7325
+ // "takeProfit": null,
7326
+ // "stopLoss": null,
7327
+ // "tpOrderType": null,
7328
+ // "slOrderType": null,
7329
+ // "tpLimitPrice": null,
7330
+ // "slLimitPrice": null
7331
+ // },
7332
+ // ],
7333
+ // "cursor": "1322441328637100035"
7334
+ // }
7335
+ // }
7336
+ //
7337
+ // uta trigger
7338
+ //
7339
+ // {
7340
+ // "code": "00000",
7341
+ // "msg": "success",
7342
+ // "requestTime": 1753058447920,
7343
+ // "data": {
7344
+ // "list": [
7345
+ // {
7346
+ // "orderId": "1330984742276198400",
7347
+ // "clientOid": "1330984742276198400",
7348
+ // "symbol": "BTCUSDT",
7349
+ // "category": "USDT-FUTURES",
7350
+ // "qty": "0.001",
7351
+ // "posSide": "long",
7352
+ // "tpTriggerBy": "market",
7353
+ // "slTriggerBy": "mark",
7354
+ // "takeProfit": "",
7355
+ // "stopLoss": "112000",
7356
+ // "tpOrderType": "market",
7357
+ // "slOrderType": "limit",
7358
+ // "tpLimitPrice": "",
7359
+ // "slLimitPrice": "111000",
7360
+ // "createdTime": "1753057411736",
7361
+ // "updatedTime": "1753058267412"
7362
+ // },
7363
+ // ],
7364
+ // "cursor": 1330960754317619202
7365
+ // }
7366
+ // }
7367
+ //
7368
+ const data = this.safeDict(response, 'data', {});
7369
+ const orders = this.safeList(data, 'list', []);
7370
+ return this.parseOrders(orders, market, since, limit);
7371
+ }
6210
7372
  /**
6211
7373
  * @method
6212
7374
  * @name bitget#fetchLedger
@@ -6433,69 +7595,84 @@ class bitget extends bitget$1 {
6433
7595
  * @see https://www.bitget.com/api-doc/contract/trade/Get-Order-Fills
6434
7596
  * @see https://www.bitget.com/api-doc/margin/cross/trade/Get-Cross-Order-Fills
6435
7597
  * @see https://www.bitget.com/api-doc/margin/isolated/trade/Get-Isolated-Transaction-Details
7598
+ * @see https://www.bitget.com/api-doc/uta/trade/Get-Order-Fills
6436
7599
  * @param {string} symbol unified market symbol
6437
7600
  * @param {int} [since] the earliest time in ms to fetch trades for
6438
7601
  * @param {int} [limit] the maximum number of trades structures to retrieve
6439
7602
  * @param {object} [params] extra parameters specific to the exchange API endpoint
6440
7603
  * @param {int} [params.until] the latest time in ms to fetch trades for
7604
+ * @param {boolean} [params.uta] set to true for the unified trading account (uta), defaults to false
6441
7605
  * @param {boolean} [params.paginate] default false, when true will automatically paginate by calling this endpoint multiple times. See in the docs all the [available parameters](https://github.com/ccxt/ccxt/wiki/Manual#pagination-params)
6442
7606
  * @returns {Trade[]} a list of [trade structures]{@link https://docs.ccxt.com/#/?id=trade-structure}
6443
7607
  */
6444
7608
  async fetchMyTrades(symbol = undefined, since = undefined, limit = undefined, params = {}) {
6445
- if (symbol === undefined) {
7609
+ let uta = undefined;
7610
+ [uta, params] = this.handleOptionAndParams(params, 'fetchMyTrades', 'uta', false);
7611
+ if (!uta && (symbol === undefined)) {
6446
7612
  throw new errors.ArgumentsRequired(this.id + ' fetchMyTrades() requires a symbol argument');
6447
7613
  }
6448
7614
  await this.loadMarkets();
6449
7615
  const market = this.market(symbol);
6450
- let marginMode = undefined;
6451
- [marginMode, params] = this.handleMarginModeAndParams('fetchMyTrades', params);
7616
+ let request = {};
7617
+ [request, params] = this.handleUntilOption('endTime', request, params);
7618
+ if (since !== undefined) {
7619
+ request['startTime'] = since;
7620
+ }
7621
+ if (limit !== undefined) {
7622
+ request['limit'] = limit;
7623
+ }
6452
7624
  let paginate = false;
7625
+ let marginMode = undefined;
6453
7626
  [paginate, params] = this.handleOptionAndParams(params, 'fetchMyTrades', 'paginate');
7627
+ [marginMode, params] = this.handleMarginModeAndParams('fetchMyTrades', params);
6454
7628
  if (paginate) {
6455
7629
  let cursorReceived = undefined;
6456
- if (market['spot']) {
7630
+ let cursorSent = undefined;
7631
+ if (uta) {
7632
+ cursorReceived = 'cursor';
7633
+ cursorSent = 'cursor';
7634
+ }
7635
+ else if (market['spot']) {
6457
7636
  if (marginMode !== undefined) {
6458
7637
  cursorReceived = 'minId';
7638
+ cursorSent = 'idLessThan';
6459
7639
  }
6460
7640
  }
6461
7641
  else {
6462
7642
  cursorReceived = 'endId';
7643
+ cursorSent = 'idLessThan';
6463
7644
  }
6464
- return await this.fetchPaginatedCallCursor('fetchMyTrades', symbol, since, limit, params, cursorReceived, 'idLessThan');
7645
+ return await this.fetchPaginatedCallCursor('fetchMyTrades', symbol, since, limit, params, cursorReceived, cursorSent);
6465
7646
  }
6466
7647
  let response = undefined;
6467
- let request = {
6468
- 'symbol': market['id'],
6469
- };
6470
- [request, params] = this.handleUntilOption('endTime', request, params);
6471
- if (since !== undefined) {
6472
- request['startTime'] = since;
6473
- }
6474
- if (limit !== undefined) {
6475
- request['limit'] = limit;
7648
+ if (uta) {
7649
+ response = await this.privateUtaGetV3TradeFills(this.extend(request, params));
6476
7650
  }
6477
- if (market['spot']) {
6478
- if (marginMode !== undefined) {
6479
- if (since === undefined) {
6480
- request['startTime'] = this.milliseconds() - 7776000000;
6481
- }
6482
- if (marginMode === 'isolated') {
6483
- response = await this.privateMarginGetV2MarginIsolatedFills(this.extend(request, params));
7651
+ else {
7652
+ request['symbol'] = market['id'];
7653
+ if (market['spot']) {
7654
+ if (marginMode !== undefined) {
7655
+ if (since === undefined) {
7656
+ request['startTime'] = this.milliseconds() - 7776000000;
7657
+ }
7658
+ if (marginMode === 'isolated') {
7659
+ response = await this.privateMarginGetV2MarginIsolatedFills(this.extend(request, params));
7660
+ }
7661
+ else if (marginMode === 'cross') {
7662
+ response = await this.privateMarginGetV2MarginCrossedFills(this.extend(request, params));
7663
+ }
6484
7664
  }
6485
- else if (marginMode === 'cross') {
6486
- response = await this.privateMarginGetV2MarginCrossedFills(this.extend(request, params));
7665
+ else {
7666
+ response = await this.privateSpotGetV2SpotTradeFills(this.extend(request, params));
6487
7667
  }
6488
7668
  }
6489
7669
  else {
6490
- response = await this.privateSpotGetV2SpotTradeFills(this.extend(request, params));
7670
+ let productType = undefined;
7671
+ [productType, params] = this.handleProductTypeAndParams(market, params);
7672
+ request['productType'] = productType;
7673
+ response = await this.privateMixGetV2MixOrderFills(this.extend(request, params));
6491
7674
  }
6492
7675
  }
6493
- else {
6494
- let productType = undefined;
6495
- [productType, params] = this.handleProductTypeAndParams(market, params);
6496
- request['productType'] = productType;
6497
- response = await this.privateMixGetV2MixOrderFills(this.extend(request, params));
6498
- }
6499
7676
  //
6500
7677
  // spot
6501
7678
  //
@@ -6595,10 +7772,46 @@ class bitget extends bitget$1 {
6595
7772
  // }
6596
7773
  // }
6597
7774
  //
7775
+ // uta
7776
+ //
7777
+ // {
7778
+ // "code": "00000",
7779
+ // "msg": "success",
7780
+ // "requestTime": 1751099666579,
7781
+ // "data": {
7782
+ // "list": [
7783
+ // {
7784
+ // "execId": "1322441401010528257",
7785
+ // "orderId": "1322441400976261120",
7786
+ // "category": "USDT-FUTURES",
7787
+ // "symbol": "BTCUSDT",
7788
+ // "orderType": "market",
7789
+ // "side": "sell",
7790
+ // "execPrice": "107005.4",
7791
+ // "execQty": "0.0001",
7792
+ // "execValue": "10.7005",
7793
+ // "tradeScope": "taker",
7794
+ // "feeDetail": [{
7795
+ // "feeCoin": "USDT",
7796
+ // "fee":"0.00642032"
7797
+ // }],
7798
+ // "createdTime": "1751020520451",
7799
+ // "updatedTime": "1751020520458",
7800
+ // "execPnl": "0.00017"
7801
+ // },
7802
+ // ],
7803
+ // "cursor": "1322061241878880257"
7804
+ // }
7805
+ // }
7806
+ //
6598
7807
  const data = this.safeValue(response, 'data');
6599
- if ((market['swap']) || (market['future'])) {
6600
- const fillList = this.safeList(data, 'fillList', []);
6601
- return this.parseTrades(fillList, market, since, limit);
7808
+ if (uta) {
7809
+ const fills = this.safeList(data, 'list', []);
7810
+ return this.parseTrades(fills, market, since, limit);
7811
+ }
7812
+ else if ((market['swap'] || (market['future']))) {
7813
+ const fills = this.safeList(data, 'fillList', []);
7814
+ return this.parseTrades(fills, market, since, limit);
6602
7815
  }
6603
7816
  else if (marginMode !== undefined) {
6604
7817
  const fills = this.safeList(data, 'fills', []);
@@ -6611,8 +7824,10 @@ class bitget extends bitget$1 {
6611
7824
  * @name bitget#fetchPosition
6612
7825
  * @description fetch data on a single open contract trade position
6613
7826
  * @see https://www.bitget.com/api-doc/contract/position/get-single-position
7827
+ * @see https://www.bitget.com/api-doc/uta/trade/Get-Position
6614
7828
  * @param {string} symbol unified market symbol of the market the position is held in
6615
7829
  * @param {object} [params] extra parameters specific to the exchange API endpoint
7830
+ * @param {boolean} [params.uta] set to true for the unified trading account (uta), defaults to false
6616
7831
  * @returns {object} a [position structure]{@link https://docs.ccxt.com/#/?id=position-structure}
6617
7832
  */
6618
7833
  async fetchPosition(symbol, params = {}) {
@@ -6622,42 +7837,92 @@ class bitget extends bitget$1 {
6622
7837
  [productType, params] = this.handleProductTypeAndParams(market, params);
6623
7838
  const request = {
6624
7839
  'symbol': market['id'],
6625
- 'marginCoin': market['settleId'],
6626
- 'productType': productType,
6627
7840
  };
6628
- const response = await this.privateMixGetV2MixPositionSinglePosition(this.extend(request, params));
6629
- //
6630
- // {
6631
- // "code": "00000",
6632
- // "msg": "success",
6633
- // "requestTime": 1700807531673,
6634
- // "data": [
6635
- // {
6636
- // "marginCoin": "USDT",
6637
- // "symbol": "BTCUSDT",
6638
- // "holdSide": "long",
6639
- // "openDelegateSize": "0",
6640
- // "marginSize": "3.73555",
6641
- // "available": "0.002",
6642
- // "locked": "0",
6643
- // "total": "0.002",
6644
- // "leverage": "20",
6645
- // "achievedProfits": "0",
6646
- // "openPriceAvg": "37355.5",
6647
- // "marginMode": "crossed",
6648
- // "posMode": "hedge_mode",
6649
- // "unrealizedPL": "0.007",
6650
- // "liquidationPrice": "31724.970702417",
6651
- // "keepMarginRate": "0.004",
6652
- // "markPrice": "37359",
6653
- // "marginRatio": "0.029599540355",
6654
- // "cTime": "1700807507275"
6655
- // }
6656
- // ]
6657
- // }
6658
- //
6659
- const data = this.safeList(response, 'data', []);
6660
- const first = this.safeDict(data, 0, {});
7841
+ let response = undefined;
7842
+ let uta = undefined;
7843
+ let result = undefined;
7844
+ [uta, params] = this.handleOptionAndParams(params, 'fetchPosition', 'uta', false);
7845
+ if (uta) {
7846
+ request['category'] = productType;
7847
+ response = await this.privateUtaGetV3PositionCurrentPosition(this.extend(request, params));
7848
+ //
7849
+ // {
7850
+ // "code": "00000",
7851
+ // "msg": "success",
7852
+ // "requestTime": 1750929905423,
7853
+ // "data": {
7854
+ // "list": [
7855
+ // {
7856
+ // "category": "USDT-FUTURES",
7857
+ // "symbol": "BTCUSDT",
7858
+ // "marginCoin": "USDT",
7859
+ // "holdMode": "hedge_mode",
7860
+ // "posSide": "long",
7861
+ // "marginMode": "crossed",
7862
+ // "positionBalance": "5.435199",
7863
+ // "available": "0.001",
7864
+ // "frozen": "0",
7865
+ // "total": "0.001",
7866
+ // "leverage": "20",
7867
+ // "curRealisedPnl": "0",
7868
+ // "avgPrice": "107410.3",
7869
+ // "positionStatus": "normal",
7870
+ // "unrealisedPnl": "0.0047",
7871
+ // "liquidationPrice": "0",
7872
+ // "mmr": "0.004",
7873
+ // "profitRate": "0.0008647337475591",
7874
+ // "markPrice": "107415.3",
7875
+ // "breakEvenPrice": "107539.2",
7876
+ // "totalFunding": "0",
7877
+ // "openFeeTotal": "-0.06444618",
7878
+ // "closeFeeTotal": "0",
7879
+ // "createdTime": "1750495670699",
7880
+ // "updatedTime": "1750929883465"
7881
+ // }
7882
+ // ]
7883
+ // }
7884
+ // }
7885
+ //
7886
+ const data = this.safeDict(response, 'data', {});
7887
+ result = this.safeList(data, 'list', []);
7888
+ }
7889
+ else {
7890
+ request['marginCoin'] = market['settleId'];
7891
+ request['productType'] = productType;
7892
+ response = await this.privateMixGetV2MixPositionSinglePosition(this.extend(request, params));
7893
+ //
7894
+ // {
7895
+ // "code": "00000",
7896
+ // "msg": "success",
7897
+ // "requestTime": 1700807531673,
7898
+ // "data": [
7899
+ // {
7900
+ // "marginCoin": "USDT",
7901
+ // "symbol": "BTCUSDT",
7902
+ // "holdSide": "long",
7903
+ // "openDelegateSize": "0",
7904
+ // "marginSize": "3.73555",
7905
+ // "available": "0.002",
7906
+ // "locked": "0",
7907
+ // "total": "0.002",
7908
+ // "leverage": "20",
7909
+ // "achievedProfits": "0",
7910
+ // "openPriceAvg": "37355.5",
7911
+ // "marginMode": "crossed",
7912
+ // "posMode": "hedge_mode",
7913
+ // "unrealizedPL": "0.007",
7914
+ // "liquidationPrice": "31724.970702417",
7915
+ // "keepMarginRate": "0.004",
7916
+ // "markPrice": "37359",
7917
+ // "marginRatio": "0.029599540355",
7918
+ // "cTime": "1700807507275"
7919
+ // }
7920
+ // ]
7921
+ // }
7922
+ //
7923
+ result = this.safeList(response, 'data', []);
7924
+ }
7925
+ const first = this.safeDict(result, 0, {});
6661
7926
  return this.parsePosition(first, market);
6662
7927
  }
6663
7928
  /**
@@ -6837,6 +8102,36 @@ class bitget extends bitget$1 {
6837
8102
  // "cTime": "1700807507275"
6838
8103
  // }
6839
8104
  //
8105
+ // uta: fetchPosition
8106
+ //
8107
+ // {
8108
+ // "category": "USDT-FUTURES",
8109
+ // "symbol": "BTCUSDT",
8110
+ // "marginCoin": "USDT",
8111
+ // "holdMode": "hedge_mode",
8112
+ // "posSide": "long",
8113
+ // "marginMode": "crossed",
8114
+ // "positionBalance": "5.435199",
8115
+ // "available": "0.001",
8116
+ // "frozen": "0",
8117
+ // "total": "0.001",
8118
+ // "leverage": "20",
8119
+ // "curRealisedPnl": "0",
8120
+ // "avgPrice": "107410.3",
8121
+ // "positionStatus": "normal",
8122
+ // "unrealisedPnl": "0.0047",
8123
+ // "liquidationPrice": "0",
8124
+ // "mmr": "0.004",
8125
+ // "profitRate": "0.0008647337475591",
8126
+ // "markPrice": "107415.3",
8127
+ // "breakEvenPrice": "107539.2",
8128
+ // "totalFunding": "0",
8129
+ // "openFeeTotal": "-0.06444618",
8130
+ // "closeFeeTotal": "0",
8131
+ // "createdTime": "1750495670699",
8132
+ // "updatedTime": "1750929883465"
8133
+ // }
8134
+ //
6840
8135
  // fetchPositions: privateMixGetV2MixPositionAllPosition
6841
8136
  //
6842
8137
  // {
@@ -6888,15 +8183,38 @@ class bitget extends bitget$1 {
6888
8183
  // "clientOid": "1120923953904893956"
6889
8184
  // }
6890
8185
  //
8186
+ // uta: fetchPositionsHistory
8187
+ //
8188
+ // {
8189
+ // "positionId": "1322441328637100049",
8190
+ // "category": "USDT-FUTURES",
8191
+ // "symbol": "BTCUSDT",
8192
+ // "marginCoin": "USDT",
8193
+ // "holdMode": "hedge_mode",
8194
+ // "posSide": "long",
8195
+ // "marginMode": "crossed",
8196
+ // "openPriceAvg": "107003.7",
8197
+ // "closePriceAvg": "107005.4",
8198
+ // "openTotalPos": "0.0001",
8199
+ // "closeTotalPos": "0.0001",
8200
+ // "cumRealisedPnl": "0.00017",
8201
+ // "netProfit": "-0.01267055",
8202
+ // "totalFunding": "0",
8203
+ // "openFeeTotal": "-0.00642022",
8204
+ // "closeFeeTotal": "-0.00642032",
8205
+ // "createdTime": "1751020503195",
8206
+ // "updatedTime": "1751020520458"
8207
+ // }
8208
+ //
6891
8209
  const marketId = this.safeString(position, 'symbol');
6892
8210
  market = this.safeMarket(marketId, market, undefined, 'contract');
6893
8211
  const symbol = market['symbol'];
6894
- const timestamp = this.safeInteger2(position, 'cTime', 'ctime');
8212
+ const timestamp = this.safeIntegerN(position, ['cTime', 'ctime', 'createdTime']);
6895
8213
  let marginMode = this.safeString(position, 'marginMode');
6896
8214
  let collateral = undefined;
6897
8215
  let initialMargin = undefined;
6898
- const unrealizedPnl = this.safeString(position, 'unrealizedPL');
6899
- const rawCollateral = this.safeString(position, 'marginSize');
8216
+ const unrealizedPnl = this.safeString2(position, 'unrealizedPL', 'unrealisedPnl');
8217
+ const rawCollateral = this.safeString2(position, 'marginSize', 'positionBalance');
6900
8218
  if (marginMode === 'isolated') {
6901
8219
  collateral = Precise["default"].stringAdd(rawCollateral, unrealizedPnl);
6902
8220
  }
@@ -6904,7 +8222,7 @@ class bitget extends bitget$1 {
6904
8222
  marginMode = 'cross';
6905
8223
  initialMargin = rawCollateral;
6906
8224
  }
6907
- const holdMode = this.safeString(position, 'posMode');
8225
+ const holdMode = this.safeString2(position, 'posMode', 'holdMode');
6908
8226
  let hedged = undefined;
6909
8227
  if (holdMode === 'hedge_mode') {
6910
8228
  hedged = true;
@@ -6912,12 +8230,12 @@ class bitget extends bitget$1 {
6912
8230
  else if (holdMode === 'one_way_mode') {
6913
8231
  hedged = false;
6914
8232
  }
6915
- const side = this.safeString(position, 'holdSide');
8233
+ const side = this.safeString2(position, 'holdSide', 'posSide');
6916
8234
  const leverage = this.safeString(position, 'leverage');
6917
8235
  const contractSizeNumber = this.safeValue(market, 'contractSize');
6918
8236
  const contractSize = this.numberToString(contractSizeNumber);
6919
- const baseAmount = this.safeString(position, 'total');
6920
- const entryPrice = this.safeString2(position, 'openPriceAvg', 'openAvgPrice');
8237
+ const baseAmount = this.safeString2(position, 'total', 'openTotalPos');
8238
+ const entryPrice = this.safeStringN(position, ['openPriceAvg', 'openAvgPrice', 'avgPrice']);
6921
8239
  const maintenanceMarginPercentage = this.safeString(position, 'keepMarginRate');
6922
8240
  const openNotional = Precise["default"].stringMul(entryPrice, baseAmount);
6923
8241
  if (initialMargin === undefined) {
@@ -6955,31 +8273,31 @@ class bitget extends bitget$1 {
6955
8273
  const percentage = Precise["default"].stringMul(Precise["default"].stringDiv(unrealizedPnl, initialMargin, 4), '100');
6956
8274
  return this.safePosition({
6957
8275
  'info': position,
6958
- 'id': this.safeString(position, 'orderId'),
8276
+ 'id': this.safeString2(position, 'orderId', 'positionId'),
6959
8277
  'symbol': symbol,
6960
8278
  'notional': this.parseNumber(notional),
6961
8279
  'marginMode': marginMode,
6962
8280
  'liquidationPrice': liquidationPrice,
6963
8281
  'entryPrice': this.parseNumber(entryPrice),
6964
8282
  'unrealizedPnl': this.parseNumber(unrealizedPnl),
6965
- 'realizedPnl': this.safeNumber(position, 'pnl'),
8283
+ 'realizedPnl': this.safeNumberN(position, ['pnl', 'curRealisedPnl', 'cumRealisedPnl']),
6966
8284
  'percentage': this.parseNumber(percentage),
6967
8285
  'contracts': contracts,
6968
8286
  'contractSize': contractSizeNumber,
6969
8287
  'markPrice': this.parseNumber(markPrice),
6970
- 'lastPrice': this.safeNumber(position, 'closeAvgPrice'),
8288
+ 'lastPrice': this.safeNumber2(position, 'closeAvgPrice', 'closePriceAvg'),
6971
8289
  'side': side,
6972
8290
  'hedged': hedged,
6973
8291
  'timestamp': timestamp,
6974
8292
  'datetime': this.iso8601(timestamp),
6975
- 'lastUpdateTimestamp': this.safeInteger(position, 'utime'),
8293
+ 'lastUpdateTimestamp': this.safeInteger2(position, 'utime', 'updatedTime'),
6976
8294
  'maintenanceMargin': this.parseNumber(maintenanceMargin),
6977
8295
  'maintenanceMarginPercentage': this.parseNumber(maintenanceMarginPercentage),
6978
8296
  'collateral': this.parseNumber(collateral),
6979
8297
  'initialMargin': this.parseNumber(initialMargin),
6980
8298
  'initialMarginPercentage': this.parseNumber(initialMarginPercentage),
6981
8299
  'leverage': this.parseNumber(leverage),
6982
- 'marginRatio': this.safeNumber(position, 'marginRatio'),
8300
+ 'marginRatio': this.safeNumber2(position, 'marginRatio', 'mmr'),
6983
8301
  'stopLossPrice': undefined,
6984
8302
  'takeProfitPrice': undefined,
6985
8303
  });
@@ -6989,10 +8307,12 @@ class bitget extends bitget$1 {
6989
8307
  * @name bitget#fetchFundingRateHistory
6990
8308
  * @description fetches historical funding rate prices
6991
8309
  * @see https://www.bitget.com/api-doc/contract/market/Get-History-Funding-Rate
8310
+ * @see https://www.bitget.com/api-doc/uta/public/Get-History-Funding-Rate
6992
8311
  * @param {string} symbol unified symbol of the market to fetch the funding rate history for
6993
8312
  * @param {int} [since] timestamp in ms of the earliest funding rate to fetch
6994
8313
  * @param {int} [limit] the maximum amount of funding rate structures to fetch
6995
8314
  * @param {object} [params] extra parameters specific to the exchange API endpoint
8315
+ * @param {boolean} [params.uta] set to true for the unified trading account (uta), defaults to false
6996
8316
  * @param {boolean} [params.paginate] default false, when true will automatically paginate by calling this endpoint multiple times. See in the docs all the [availble parameters](https://github.com/ccxt/ccxt/wiki/Manual#pagination-params)
6997
8317
  * @returns {object[]} a list of [funding rate structures]{@link https://docs.ccxt.com/#/?id=funding-rate-history-structure}
6998
8318
  */
@@ -7001,45 +8321,74 @@ class bitget extends bitget$1 {
7001
8321
  throw new errors.ArgumentsRequired(this.id + ' fetchFundingRateHistory() requires a symbol argument');
7002
8322
  }
7003
8323
  await this.loadMarkets();
7004
- let paginate = false;
7005
- [paginate, params] = this.handleOptionAndParams(params, 'fetchFundingRateHistory', 'paginate');
7006
- if (paginate) {
7007
- return await this.fetchPaginatedCallIncremental('fetchFundingRateHistory', symbol, since, limit, params, 'pageNo', 100);
7008
- }
7009
8324
  const market = this.market(symbol);
7010
- let productType = undefined;
7011
- [productType, params] = this.handleProductTypeAndParams(market, params);
7012
8325
  const request = {
7013
8326
  'symbol': market['id'],
7014
- 'productType': productType,
7015
- // 'pageSize': limit, // default 20
7016
- // 'pageNo': 1,
7017
8327
  };
7018
- if (limit !== undefined) {
7019
- request['pageSize'] = limit;
8328
+ let productType = undefined;
8329
+ let uta = undefined;
8330
+ let response = undefined;
8331
+ let result = undefined;
8332
+ [productType, params] = this.handleProductTypeAndParams(market, params);
8333
+ [uta, params] = this.handleOptionAndParams(params, 'fetchFundingRateHistory', 'uta', false);
8334
+ if (uta) {
8335
+ if (limit !== undefined) {
8336
+ request['limit'] = limit;
8337
+ }
8338
+ request['category'] = productType;
8339
+ response = await this.publicUtaGetV3MarketHistoryFundRate(this.extend(request, params));
8340
+ //
8341
+ // {
8342
+ // "code": "00000",
8343
+ // "msg": "success",
8344
+ // "requestTime": 1750435113658,
8345
+ // "data": {
8346
+ // "resultList": [
8347
+ // {
8348
+ // "symbol": "BTCUSDT",
8349
+ // "fundingRate": "-0.000017",
8350
+ // "fundingRateTimestamp": "1750431600000"
8351
+ // },
8352
+ // ]
8353
+ // }
8354
+ // }
8355
+ //
8356
+ const data = this.safeDict(response, 'data', {});
8357
+ result = this.safeList(data, 'resultList', []);
8358
+ }
8359
+ else {
8360
+ let paginate = false;
8361
+ [paginate, params] = this.handleOptionAndParams(params, 'fetchFundingRateHistory', 'paginate');
8362
+ if (paginate) {
8363
+ return await this.fetchPaginatedCallIncremental('fetchFundingRateHistory', symbol, since, limit, params, 'pageNo', 100);
8364
+ }
8365
+ if (limit !== undefined) {
8366
+ request['pageSize'] = limit;
8367
+ }
8368
+ request['productType'] = productType;
8369
+ response = await this.publicMixGetV2MixMarketHistoryFundRate(this.extend(request, params));
8370
+ //
8371
+ // {
8372
+ // "code": "00000",
8373
+ // "msg": "success",
8374
+ // "requestTime": 1652406728393,
8375
+ // "data": [
8376
+ // {
8377
+ // "symbol": "BTCUSDT",
8378
+ // "fundingRate": "-0.0003",
8379
+ // "fundingTime": "1652396400000"
8380
+ // },
8381
+ // ]
8382
+ // }
8383
+ //
8384
+ result = this.safeList(response, 'data', []);
7020
8385
  }
7021
- const response = await this.publicMixGetV2MixMarketHistoryFundRate(this.extend(request, params));
7022
- //
7023
- // {
7024
- // "code": "00000",
7025
- // "msg": "success",
7026
- // "requestTime": 1652406728393,
7027
- // "data": [
7028
- // {
7029
- // "symbol": "BTCUSDT",
7030
- // "fundingRate": "-0.0003",
7031
- // "fundingTime": "1652396400000"
7032
- // },
7033
- // ]
7034
- // }
7035
- //
7036
- const data = this.safeValue(response, 'data', []);
7037
8386
  const rates = [];
7038
- for (let i = 0; i < data.length; i++) {
7039
- const entry = data[i];
8387
+ for (let i = 0; i < result.length; i++) {
8388
+ const entry = result[i];
7040
8389
  const marketId = this.safeString(entry, 'symbol');
7041
8390
  const symbolInner = this.safeSymbol(marketId, market);
7042
- const timestamp = this.safeInteger(entry, 'fundingTime');
8391
+ const timestamp = this.safeInteger2(entry, 'fundingTime', 'fundingRateTimestamp');
7043
8392
  rates.push({
7044
8393
  'info': entry,
7045
8394
  'symbol': symbolInner,
@@ -7057,8 +8406,10 @@ class bitget extends bitget$1 {
7057
8406
  * @description fetch the current funding rate
7058
8407
  * @see https://www.bitget.com/api-doc/contract/market/Get-Current-Funding-Rate
7059
8408
  * @see https://www.bitget.com/api-doc/contract/market/Get-Symbol-Next-Funding-Time
8409
+ * @see https://www.bitget.com/api-doc/uta/public/Get-Current-Funding-Rate
7060
8410
  * @param {string} symbol unified market symbol
7061
8411
  * @param {object} [params] extra parameters specific to the exchange API endpoint
8412
+ * @param {boolean} [params.uta] set to true for the unified trading account (uta), defaults to false
7062
8413
  * @param {string} [params.method] either (default) 'publicMixGetV2MixMarketCurrentFundRate' or 'publicMixGetV2MixMarketFundingTime'
7063
8414
  * @returns {object} a [funding rate structure]{@link https://docs.ccxt.com/#/?id=funding-rate-structure}
7064
8415
  */
@@ -7072,24 +8423,23 @@ class bitget extends bitget$1 {
7072
8423
  [productType, params] = this.handleProductTypeAndParams(market, params);
7073
8424
  const request = {
7074
8425
  'symbol': market['id'],
7075
- 'productType': productType,
7076
8426
  };
7077
- let method = undefined;
7078
- [method, params] = this.handleOptionAndParams(params, 'fetchFundingRate', 'method', 'publicMixGetV2MixMarketCurrentFundRate');
8427
+ let uta = undefined;
7079
8428
  let response = undefined;
7080
- if (method === 'publicMixGetV2MixMarketCurrentFundRate') {
7081
- response = await this.publicMixGetV2MixMarketCurrentFundRate(this.extend(request, params));
8429
+ [uta, params] = this.handleOptionAndParams(params, 'fetchFundingRate', 'uta', false);
8430
+ if (uta) {
8431
+ response = await this.publicUtaGetV3MarketCurrentFundRate(this.extend(request, params));
7082
8432
  //
7083
8433
  // {
7084
8434
  // "code": "00000",
7085
8435
  // "msg": "success",
7086
- // "requestTime": 1745500709429,
8436
+ // "requestTime": 1750897372153,
7087
8437
  // "data": [
7088
8438
  // {
7089
8439
  // "symbol": "BTCUSDT",
7090
- // "fundingRate": "-0.000013",
8440
+ // "fundingRate": "0.00001",
7091
8441
  // "fundingRateInterval": "8",
7092
- // "nextUpdate": "1745510400000",
8442
+ // "nextUpdate": "1750924800000",
7093
8443
  // "minFundingRate": "-0.003",
7094
8444
  // "maxFundingRate": "0.003"
7095
8445
  // }
@@ -7097,22 +8447,47 @@ class bitget extends bitget$1 {
7097
8447
  // }
7098
8448
  //
7099
8449
  }
7100
- else if (method === 'publicMixGetV2MixMarketFundingTime') {
7101
- response = await this.publicMixGetV2MixMarketFundingTime(this.extend(request, params));
7102
- //
7103
- // {
7104
- // "code": "00000",
7105
- // "msg": "success",
7106
- // "requestTime": 1745402092428,
7107
- // "data": [
7108
- // {
7109
- // "symbol": "BTCUSDT",
7110
- // "nextFundingTime": "1745424000000",
7111
- // "ratePeriod": "8"
7112
- // }
7113
- // ]
7114
- // }
7115
- //
8450
+ else {
8451
+ request['productType'] = productType;
8452
+ let method = undefined;
8453
+ [method, params] = this.handleOptionAndParams(params, 'fetchFundingRate', 'method', 'publicMixGetV2MixMarketCurrentFundRate');
8454
+ if (method === 'publicMixGetV2MixMarketCurrentFundRate') {
8455
+ response = await this.publicMixGetV2MixMarketCurrentFundRate(this.extend(request, params));
8456
+ //
8457
+ // {
8458
+ // "code": "00000",
8459
+ // "msg": "success",
8460
+ // "requestTime": 1745500709429,
8461
+ // "data": [
8462
+ // {
8463
+ // "symbol": "BTCUSDT",
8464
+ // "fundingRate": "-0.000013",
8465
+ // "fundingRateInterval": "8",
8466
+ // "nextUpdate": "1745510400000",
8467
+ // "minFundingRate": "-0.003",
8468
+ // "maxFundingRate": "0.003"
8469
+ // }
8470
+ // ]
8471
+ // }
8472
+ //
8473
+ }
8474
+ else if (method === 'publicMixGetV2MixMarketFundingTime') {
8475
+ response = await this.publicMixGetV2MixMarketFundingTime(this.extend(request, params));
8476
+ //
8477
+ // {
8478
+ // "code": "00000",
8479
+ // "msg": "success",
8480
+ // "requestTime": 1745402092428,
8481
+ // "data": [
8482
+ // {
8483
+ // "symbol": "BTCUSDT",
8484
+ // "nextFundingTime": "1745424000000",
8485
+ // "ratePeriod": "8"
8486
+ // }
8487
+ // ]
8488
+ // }
8489
+ //
8490
+ }
7116
8491
  }
7117
8492
  const data = this.safeList(response, 'data', []);
7118
8493
  return this.parseFundingRate(data[0], market);
@@ -7178,7 +8553,7 @@ class bitget extends bitget$1 {
7178
8553
  }
7179
8554
  parseFundingRate(contract, market = undefined) {
7180
8555
  //
7181
- // fetchFundingRate: publicMixGetV2MixMarketCurrentFundRate
8556
+ // fetchFundingRate: publicMixGetV2MixMarketCurrentFundRate, publicUtaGetV3MarketCurrentFundRate
7182
8557
  //
7183
8558
  // {
7184
8559
  // "symbol": "BTCUSDT",
@@ -7536,10 +8911,13 @@ class bitget extends bitget$1 {
7536
8911
  * @name bitget#setLeverage
7537
8912
  * @description set the level of leverage for a market
7538
8913
  * @see https://www.bitget.com/api-doc/contract/account/Change-Leverage
8914
+ * @see https://www.bitget.com/api-doc/uta/account/Change-Leverage
7539
8915
  * @param {int} leverage the rate of leverage
7540
8916
  * @param {string} symbol unified market symbol
7541
8917
  * @param {object} [params] extra parameters specific to the exchange API endpoint
7542
8918
  * @param {string} [params.holdSide] *isolated only* position direction, 'long' or 'short'
8919
+ * @param {boolean} [params.uta] set to true for the unified trading account (uta), defaults to false
8920
+ * @param {boolean} [params.posSide] required for uta isolated margin, long or short
7543
8921
  * @returns {object} response from the exchange
7544
8922
  */
7545
8923
  async setLeverage(leverage, symbol = undefined, params = {}) {
@@ -7552,27 +8930,51 @@ class bitget extends bitget$1 {
7552
8930
  [productType, params] = this.handleProductTypeAndParams(market, params);
7553
8931
  const request = {
7554
8932
  'symbol': market['id'],
7555
- 'marginCoin': market['settleId'],
7556
8933
  'leverage': this.numberToString(leverage),
7557
- 'productType': productType,
7558
- // 'holdSide': 'long',
7559
8934
  };
7560
- const response = await this.privateMixPostV2MixAccountSetLeverage(this.extend(request, params));
7561
- //
7562
- // {
7563
- // "code": "00000",
7564
- // "msg": "success",
7565
- // "requestTime": 1700864711517,
7566
- // "data": {
7567
- // "symbol": "BTCUSDT",
7568
- // "marginCoin": "USDT",
7569
- // "longLeverage": "25",
7570
- // "shortLeverage": "25",
7571
- // "crossMarginLeverage": "25",
7572
- // "marginMode": "crossed"
7573
- // }
7574
- // }
7575
- //
8935
+ let uta = undefined;
8936
+ let response = undefined;
8937
+ [uta, params] = this.handleOptionAndParams(params, 'setLeverage', 'uta', false);
8938
+ if (uta) {
8939
+ if (productType === 'SPOT') {
8940
+ let marginMode = undefined;
8941
+ [marginMode, params] = this.handleMarginModeAndParams('fetchTrades', params);
8942
+ if (marginMode !== undefined) {
8943
+ productType = 'MARGIN';
8944
+ }
8945
+ }
8946
+ request['coin'] = market['settleId'];
8947
+ request['category'] = productType;
8948
+ response = await this.privateUtaPostV3AccountSetLeverage(this.extend(request, params));
8949
+ //
8950
+ // {
8951
+ // "code": "00000",
8952
+ // "msg": "success",
8953
+ // "requestTime": 1752815940833,
8954
+ // "data": "success"
8955
+ // }
8956
+ //
8957
+ }
8958
+ else {
8959
+ request['marginCoin'] = market['settleId'];
8960
+ request['productType'] = productType;
8961
+ response = await this.privateMixPostV2MixAccountSetLeverage(this.extend(request, params));
8962
+ //
8963
+ // {
8964
+ // "code": "00000",
8965
+ // "msg": "success",
8966
+ // "requestTime": 1700864711517,
8967
+ // "data": {
8968
+ // "symbol": "BTCUSDT",
8969
+ // "marginCoin": "USDT",
8970
+ // "longLeverage": "25",
8971
+ // "shortLeverage": "25",
8972
+ // "crossMarginLeverage": "25",
8973
+ // "marginMode": "crossed"
8974
+ // }
8975
+ // }
8976
+ //
8977
+ }
7576
8978
  return response;
7577
8979
  }
7578
8980
  /**
@@ -7628,36 +9030,54 @@ class bitget extends bitget$1 {
7628
9030
  * @name bitget#setPositionMode
7629
9031
  * @description set hedged to true or false for a market
7630
9032
  * @see https://www.bitget.com/api-doc/contract/account/Change-Hold-Mode
9033
+ * @see https://www.bitget.com/api-doc/uta/account/Change-Position-Mode
7631
9034
  * @param {bool} hedged set to true to use dualSidePosition
7632
9035
  * @param {string} symbol not used by bitget setPositionMode ()
7633
9036
  * @param {object} [params] extra parameters specific to the exchange API endpoint
7634
- * @param {string} [params.productType] required if symbol is undefined: 'USDT-FUTURES', 'USDC-FUTURES', 'COIN-FUTURES', 'SUSDT-FUTURES', 'SUSDC-FUTURES' or 'SCOIN-FUTURES'
9037
+ * @param {string} [params.productType] required if not uta and symbol is undefined: 'USDT-FUTURES', 'USDC-FUTURES', 'COIN-FUTURES', 'SUSDT-FUTURES', 'SUSDC-FUTURES' or 'SCOIN-FUTURES'
9038
+ * @param {boolean} [params.uta] set to true for the unified trading account (uta), defaults to false
7635
9039
  * @returns {object} response from the exchange
7636
9040
  */
7637
9041
  async setPositionMode(hedged, symbol = undefined, params = {}) {
7638
9042
  await this.loadMarkets();
7639
9043
  const posMode = hedged ? 'hedge_mode' : 'one_way_mode';
9044
+ const request = {};
7640
9045
  let market = undefined;
7641
9046
  if (symbol !== undefined) {
7642
9047
  market = this.market(symbol);
7643
9048
  }
7644
9049
  let productType = undefined;
9050
+ let uta = undefined;
9051
+ let response = undefined;
7645
9052
  [productType, params] = this.handleProductTypeAndParams(market, params);
7646
- const request = {
7647
- 'posMode': posMode,
7648
- 'productType': productType,
7649
- };
7650
- const response = await this.privateMixPostV2MixAccountSetPositionMode(this.extend(request, params));
7651
- //
7652
- // {
7653
- // "code": "00000",
7654
- // "msg": "success",
7655
- // "requestTime": 1700865608009,
7656
- // "data": {
7657
- // "posMode": "hedge_mode"
7658
- // }
7659
- // }
7660
- //
9053
+ [uta, params] = this.handleOptionAndParams(params, 'setPositionMode', 'uta', false);
9054
+ if (uta) {
9055
+ request['holdMode'] = posMode;
9056
+ response = await this.privateUtaPostV3AccountSetHoldMode(this.extend(request, params));
9057
+ //
9058
+ // {
9059
+ // "code": "00000",
9060
+ // "msg": "success",
9061
+ // "requestTime": 1752816734592,
9062
+ // "data": "success"
9063
+ // }
9064
+ //
9065
+ }
9066
+ else {
9067
+ request['posMode'] = posMode;
9068
+ request['productType'] = productType;
9069
+ response = await this.privateMixPostV2MixAccountSetPositionMode(this.extend(request, params));
9070
+ //
9071
+ // {
9072
+ // "code": "00000",
9073
+ // "msg": "success",
9074
+ // "requestTime": 1700865608009,
9075
+ // "data": {
9076
+ // "posMode": "hedge_mode"
9077
+ // }
9078
+ // }
9079
+ //
9080
+ }
7661
9081
  return response;
7662
9082
  }
7663
9083
  /**
@@ -7665,8 +9085,10 @@ class bitget extends bitget$1 {
7665
9085
  * @name bitget#fetchOpenInterest
7666
9086
  * @description retrieves the open interest of a contract trading pair
7667
9087
  * @see https://www.bitget.com/api-doc/contract/market/Get-Open-Interest
9088
+ * @see https://www.bitget.com/api-doc/uta/public/Get-Open-Interest
7668
9089
  * @param {string} symbol unified CCXT market symbol
7669
9090
  * @param {object} [params] exchange specific parameters
9091
+ * @param {boolean} [params.uta] set to true for the unified trading account (uta), defaults to false
7670
9092
  * @returns {object} an open interest structure{@link https://docs.ccxt.com/#/?id=open-interest-structure}
7671
9093
  */
7672
9094
  async fetchOpenInterest(symbol, params = {}) {
@@ -7675,33 +9097,60 @@ class bitget extends bitget$1 {
7675
9097
  if (!market['contract']) {
7676
9098
  throw new errors.BadRequest(this.id + ' fetchOpenInterest() supports contract markets only');
7677
9099
  }
7678
- let productType = undefined;
7679
- [productType, params] = this.handleProductTypeAndParams(market, params);
7680
- const request = {
7681
- 'symbol': market['id'],
7682
- 'productType': productType,
7683
- };
7684
- const response = await this.publicMixGetV2MixMarketOpenInterest(this.extend(request, params));
7685
- //
7686
- // {
7687
- // "code": "00000",
7688
- // "msg": "success",
7689
- // "requestTime": 1700866041022,
7690
- // "data": {
7691
- // "openInterestList": [
7692
- // {
7693
- // "symbol": "BTCUSDT",
7694
- // "size": "52234.134"
7695
- // }
7696
- // ],
7697
- // "ts": "1700866041023"
7698
- // }
7699
- // }
7700
- //
9100
+ let productType = undefined;
9101
+ [productType, params] = this.handleProductTypeAndParams(market, params);
9102
+ const request = {
9103
+ 'symbol': market['id'],
9104
+ };
9105
+ let uta = undefined;
9106
+ let response = undefined;
9107
+ [uta, params] = this.handleOptionAndParams(params, 'fetchOpenInterest', 'uta', false);
9108
+ if (uta) {
9109
+ request['category'] = productType;
9110
+ response = await this.publicUtaGetV3MarketOpenInterest(this.extend(request, params));
9111
+ //
9112
+ // {
9113
+ // "code": "00000",
9114
+ // "msg": "success",
9115
+ // "requestTime": 1751101221545,
9116
+ // "data": {
9117
+ // "list": [
9118
+ // {
9119
+ // "symbol": "BTCUSDT",
9120
+ // "openInterest": "18166.3583"
9121
+ // }
9122
+ // ],
9123
+ // "ts": "1751101220993"
9124
+ // }
9125
+ // }
9126
+ //
9127
+ }
9128
+ else {
9129
+ request['productType'] = productType;
9130
+ response = await this.publicMixGetV2MixMarketOpenInterest(this.extend(request, params));
9131
+ //
9132
+ // {
9133
+ // "code": "00000",
9134
+ // "msg": "success",
9135
+ // "requestTime": 1700866041022,
9136
+ // "data": {
9137
+ // "openInterestList": [
9138
+ // {
9139
+ // "symbol": "BTCUSDT",
9140
+ // "size": "52234.134"
9141
+ // }
9142
+ // ],
9143
+ // "ts": "1700866041023"
9144
+ // }
9145
+ // }
9146
+ //
9147
+ }
7701
9148
  const data = this.safeDict(response, 'data', {});
7702
9149
  return this.parseOpenInterest(data, market);
7703
9150
  }
7704
9151
  parseOpenInterest(interest, market = undefined) {
9152
+ //
9153
+ // default
7705
9154
  //
7706
9155
  // {
7707
9156
  // "openInterestList": [
@@ -7713,12 +9162,24 @@ class bitget extends bitget$1 {
7713
9162
  // "ts": "1700866041023"
7714
9163
  // }
7715
9164
  //
7716
- const data = this.safeValue(interest, 'openInterestList', []);
9165
+ // uta
9166
+ //
9167
+ // {
9168
+ // "list": [
9169
+ // {
9170
+ // "symbol": "BTCUSDT",
9171
+ // "openInterest": "18166.3583"
9172
+ // }
9173
+ // ],
9174
+ // "ts": "1751101220993"
9175
+ // }
9176
+ //
9177
+ const data = this.safeList2(interest, 'openInterestList', 'list', []);
7717
9178
  const timestamp = this.safeInteger(interest, 'ts');
7718
9179
  const marketId = this.safeString(data[0], 'symbol');
7719
9180
  return this.safeOpenInterest({
7720
9181
  'symbol': this.safeSymbol(marketId, market, undefined, 'contract'),
7721
- 'openInterestAmount': this.safeNumber(data[0], 'size'),
9182
+ 'openInterestAmount': this.safeNumber2(data[0], 'size', 'openInterest'),
7722
9183
  'openInterestValue': undefined,
7723
9184
  'timestamp': timestamp,
7724
9185
  'datetime': this.iso8601(timestamp),
@@ -8457,9 +9918,10 @@ class bitget extends bitget$1 {
8457
9918
  * @name bitget#fetchCrossBorrowRate
8458
9919
  * @description fetch the rate of interest to borrow a currency for margin trading
8459
9920
  * @see https://www.bitget.com/api-doc/margin/cross/account/Get-Cross-Margin-Interest-Rate-And-Borrowable
9921
+ * @see https://www.bitget.com/api-doc/uta/public/Get-Margin-Loans
8460
9922
  * @param {string} code unified currency code
8461
9923
  * @param {object} [params] extra parameters specific to the exchange API endpoint
8462
- * @param {string} [params.symbol] required for isolated margin
9924
+ * @param {boolean} [params.uta] set to true for the unified trading account (uta), defaults to false
8463
9925
  * @returns {object} a [borrow rate structure]{@link https://github.com/ccxt/ccxt/wiki/Manual#borrow-rate-structure}
8464
9926
  */
8465
9927
  async fetchCrossBorrowRate(code, params = {}) {
@@ -8468,40 +9930,64 @@ class bitget extends bitget$1 {
8468
9930
  const request = {
8469
9931
  'coin': currency['id'],
8470
9932
  };
8471
- const response = await this.privateMarginGetV2MarginCrossedInterestRateAndLimit(this.extend(request, params));
8472
- //
8473
- // {
8474
- // "code": "00000",
8475
- // "msg": "success",
8476
- // "requestTime": 1700879047861,
8477
- // "data": [
8478
- // {
8479
- // "coin": "BTC",
8480
- // "leverage": "3",
8481
- // "transferable": true,
8482
- // "borrowable": true,
8483
- // "dailyInterestRate": "0.00007",
8484
- // "annualInterestRate": "0.02555",
8485
- // "maxBorrowableAmount": "26",
8486
- // "vipList": [
8487
- // {"level":"0","limit":"26","dailyInterestRate":"0.00007","annualInterestRate":"0.02555","discountRate":"1"},
8488
- // {"level":"1","limit":"26.78","dailyInterestRate":"0.0000679","annualInterestRate":"0.0247835","discountRate":"0.97"},
8489
- // {"level":"2","limit":"28.08","dailyInterestRate":"0.0000644","annualInterestRate":"0.023506","discountRate":"0.92"},
8490
- // {"level":"3","limit":"30.16","dailyInterestRate":"0.0000602","annualInterestRate":"0.021973","discountRate":"0.86"},
8491
- // {"level":"4","limit":"34.58","dailyInterestRate":"0.0000525","annualInterestRate":"0.0191625","discountRate":"0.75"},
8492
- // {"level":"5","limit":"43.16","dailyInterestRate":"0.000042","annualInterestRate":"0.01533","discountRate":"0.6"}
8493
- // ]
8494
- // }
8495
- // ]
8496
- // }
8497
- //
9933
+ let uta = undefined;
9934
+ let response = undefined;
9935
+ let result = undefined;
9936
+ [uta, params] = this.handleOptionAndParams(params, 'fetchCrossBorrowRate', 'uta', false);
9937
+ if (uta) {
9938
+ response = await this.publicUtaGetV3MarketMarginLoans(this.extend(request, params));
9939
+ //
9940
+ // {
9941
+ // "code": "00000",
9942
+ // "msg": "success",
9943
+ // "requestTime": 1752817798893,
9944
+ // "data": {
9945
+ // "dailyInterest": "0.00100008",
9946
+ // "annualInterest": "0.3650292",
9947
+ // "limit": "100"
9948
+ // }
9949
+ // }
9950
+ //
9951
+ result = this.safeDict(response, 'data', {});
9952
+ }
9953
+ else {
9954
+ response = await this.privateMarginGetV2MarginCrossedInterestRateAndLimit(this.extend(request, params));
9955
+ //
9956
+ // {
9957
+ // "code": "00000",
9958
+ // "msg": "success",
9959
+ // "requestTime": 1700879047861,
9960
+ // "data": [
9961
+ // {
9962
+ // "coin": "BTC",
9963
+ // "leverage": "3",
9964
+ // "transferable": true,
9965
+ // "borrowable": true,
9966
+ // "dailyInterestRate": "0.00007",
9967
+ // "annualInterestRate": "0.02555",
9968
+ // "maxBorrowableAmount": "26",
9969
+ // "vipList": [
9970
+ // {"level":"0","limit":"26","dailyInterestRate":"0.00007","annualInterestRate":"0.02555","discountRate":"1"},
9971
+ // {"level":"1","limit":"26.78","dailyInterestRate":"0.0000679","annualInterestRate":"0.0247835","discountRate":"0.97"},
9972
+ // {"level":"2","limit":"28.08","dailyInterestRate":"0.0000644","annualInterestRate":"0.023506","discountRate":"0.92"},
9973
+ // {"level":"3","limit":"30.16","dailyInterestRate":"0.0000602","annualInterestRate":"0.021973","discountRate":"0.86"},
9974
+ // {"level":"4","limit":"34.58","dailyInterestRate":"0.0000525","annualInterestRate":"0.0191625","discountRate":"0.75"},
9975
+ // {"level":"5","limit":"43.16","dailyInterestRate":"0.000042","annualInterestRate":"0.01533","discountRate":"0.6"}
9976
+ // ]
9977
+ // }
9978
+ // ]
9979
+ // }
9980
+ //
9981
+ const data = this.safeValue(response, 'data', []);
9982
+ result = this.safeValue(data, 0, {});
9983
+ }
8498
9984
  const timestamp = this.safeInteger(response, 'requestTime');
8499
- const data = this.safeValue(response, 'data', []);
8500
- const first = this.safeValue(data, 0, {});
8501
- first['timestamp'] = timestamp;
8502
- return this.parseBorrowRate(first, currency);
9985
+ result['timestamp'] = timestamp;
9986
+ return this.parseBorrowRate(result, currency);
8503
9987
  }
8504
9988
  parseBorrowRate(info, currency = undefined) {
9989
+ //
9990
+ // default
8505
9991
  //
8506
9992
  // {
8507
9993
  // "coin": "BTC",
@@ -8521,11 +10007,19 @@ class bitget extends bitget$1 {
8521
10007
  // ]
8522
10008
  // }
8523
10009
  //
10010
+ // uta
10011
+ //
10012
+ // {
10013
+ // "dailyInterest": "0.00100008",
10014
+ // "annualInterest": "0.3650292",
10015
+ // "limit": "100"
10016
+ // }
10017
+ //
8524
10018
  const currencyId = this.safeString(info, 'coin');
8525
10019
  const timestamp = this.safeInteger(info, 'timestamp');
8526
10020
  return {
8527
10021
  'currency': this.safeCurrencyCode(currencyId, currency),
8528
- 'rate': this.safeNumber(info, 'dailyInterestRate'),
10022
+ 'rate': this.safeNumber2(info, 'dailyInterestRate', 'dailyInterest'),
8529
10023
  'period': 86400000,
8530
10024
  'timestamp': timestamp,
8531
10025
  'datetime': this.iso8601(timestamp),
@@ -8690,43 +10184,72 @@ class bitget extends bitget$1 {
8690
10184
  * @name bitget#closePosition
8691
10185
  * @description closes an open position for a market
8692
10186
  * @see https://www.bitget.com/api-doc/contract/trade/Flash-Close-Position
10187
+ * @see https://www.bitget.com/api-doc/uta/trade/Close-All-Positions
8693
10188
  * @param {string} symbol unified CCXT market symbol
8694
10189
  * @param {string} [side] one-way mode: 'buy' or 'sell', hedge-mode: 'long' or 'short'
8695
10190
  * @param {object} [params] extra parameters specific to the exchange API endpoint
10191
+ * @param {boolean} [params.uta] set to true for the unified trading account (uta), defaults to false
8696
10192
  * @returns {object} An [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
8697
10193
  */
8698
10194
  async closePosition(symbol, side = undefined, params = {}) {
8699
10195
  await this.loadMarkets();
8700
10196
  const market = this.market(symbol);
8701
- let productType = undefined;
8702
- [productType, params] = this.handleProductTypeAndParams(market, params);
8703
10197
  const request = {
8704
10198
  'symbol': market['id'],
8705
- 'productType': productType,
8706
10199
  };
8707
- if (side !== undefined) {
8708
- request['holdSide'] = side;
10200
+ let productType = undefined;
10201
+ let uta = undefined;
10202
+ let response = undefined;
10203
+ [productType, params] = this.handleProductTypeAndParams(market, params);
10204
+ [uta, params] = this.handleOptionAndParams(params, 'closePosition', 'uta', false);
10205
+ if (uta) {
10206
+ if (side !== undefined) {
10207
+ request['posSide'] = side;
10208
+ }
10209
+ request['category'] = productType;
10210
+ response = await this.privateUtaPostV3TradeClosePositions(this.extend(request, params));
10211
+ //
10212
+ // {
10213
+ // "code": "00000",
10214
+ // "msg": "success",
10215
+ // "requestTime": 1751020218384,
10216
+ // "data": {
10217
+ // "list": [
10218
+ // {
10219
+ // "orderId": "1322440134099320832",
10220
+ // "clientOid": "1322440134099320833"
10221
+ // }
10222
+ // ]
10223
+ // }
10224
+ // }
10225
+ //
10226
+ }
10227
+ else {
10228
+ if (side !== undefined) {
10229
+ request['holdSide'] = side;
10230
+ }
10231
+ request['productType'] = productType;
10232
+ response = await this.privateMixPostV2MixOrderClosePositions(this.extend(request, params));
10233
+ //
10234
+ // {
10235
+ // "code": "00000",
10236
+ // "msg": "success",
10237
+ // "requestTime": 1702975017017,
10238
+ // "data": {
10239
+ // "successList": [
10240
+ // {
10241
+ // "orderId": "1120923953904893955",
10242
+ // "clientOid": "1120923953904893956"
10243
+ // }
10244
+ // ],
10245
+ // "failureList": [],
10246
+ // "result": false
10247
+ // }
10248
+ // }
10249
+ //
8709
10250
  }
8710
- const response = await this.privateMixPostV2MixOrderClosePositions(this.extend(request, params));
8711
- //
8712
- // {
8713
- // "code": "00000",
8714
- // "msg": "success",
8715
- // "requestTime": 1702975017017,
8716
- // "data": {
8717
- // "successList": [
8718
- // {
8719
- // "orderId": "1120923953904893955",
8720
- // "clientOid": "1120923953904893956"
8721
- // }
8722
- // ],
8723
- // "failureList": [],
8724
- // "result": false
8725
- // }
8726
- // }
8727
- //
8728
10251
  const data = this.safeValue(response, 'data', {});
8729
- const order = this.safeList(data, 'successList', []);
10252
+ const order = this.safeList2(data, 'successList', 'list', []);
8730
10253
  return this.parseOrder(order[0], market);
8731
10254
  }
8732
10255
  /**
@@ -8734,37 +10257,62 @@ class bitget extends bitget$1 {
8734
10257
  * @name bitget#closeAllPositions
8735
10258
  * @description closes all open positions for a market type
8736
10259
  * @see https://www.bitget.com/api-doc/contract/trade/Flash-Close-Position
10260
+ * @see https://www.bitget.com/api-doc/uta/trade/Close-All-Positions
8737
10261
  * @param {object} [params] extra parameters specific to the exchange API endpoint
8738
10262
  * @param {string} [params.productType] 'USDT-FUTURES', 'USDC-FUTURES', 'COIN-FUTURES', 'SUSDT-FUTURES', 'SUSDC-FUTURES' or 'SCOIN-FUTURES'
10263
+ * @param {boolean} [params.uta] set to true for the unified trading account (uta), defaults to false
8739
10264
  * @returns {object[]} A list of [position structures]{@link https://docs.ccxt.com/#/?id=position-structure}
8740
10265
  */
8741
10266
  async closeAllPositions(params = {}) {
8742
10267
  await this.loadMarkets();
10268
+ const request = {};
8743
10269
  let productType = undefined;
10270
+ let uta = undefined;
10271
+ let response = undefined;
8744
10272
  [productType, params] = this.handleProductTypeAndParams(undefined, params);
8745
- const request = {
8746
- 'productType': productType,
8747
- };
8748
- const response = await this.privateMixPostV2MixOrderClosePositions(this.extend(request, params));
8749
- //
8750
- // {
8751
- // "code": "00000",
8752
- // "msg": "success",
8753
- // "requestTime": 1702975017017,
8754
- // "data": {
8755
- // "successList": [
8756
- // {
8757
- // "orderId": "1120923953904893955",
8758
- // "clientOid": "1120923953904893956"
8759
- // }
8760
- // ],
8761
- // "failureList": [],
8762
- // "result": false
8763
- // }
8764
- // }
8765
- //
10273
+ [uta, params] = this.handleOptionAndParams(params, 'closeAllPositions', 'uta', false);
10274
+ if (uta) {
10275
+ request['category'] = productType;
10276
+ response = await this.privateUtaPostV3TradeClosePositions(this.extend(request, params));
10277
+ //
10278
+ // {
10279
+ // "code": "00000",
10280
+ // "msg": "success",
10281
+ // "requestTime": 1751020218384,
10282
+ // "data": {
10283
+ // "list": [
10284
+ // {
10285
+ // "orderId": "1322440134099320832",
10286
+ // "clientOid": "1322440134099320833"
10287
+ // }
10288
+ // ]
10289
+ // }
10290
+ // }
10291
+ //
10292
+ }
10293
+ else {
10294
+ request['productType'] = productType;
10295
+ response = await this.privateMixPostV2MixOrderClosePositions(this.extend(request, params));
10296
+ //
10297
+ // {
10298
+ // "code": "00000",
10299
+ // "msg": "success",
10300
+ // "requestTime": 1702975017017,
10301
+ // "data": {
10302
+ // "successList": [
10303
+ // {
10304
+ // "orderId": "1120923953904893955",
10305
+ // "clientOid": "1120923953904893956"
10306
+ // }
10307
+ // ],
10308
+ // "failureList": [],
10309
+ // "result": false
10310
+ // }
10311
+ // }
10312
+ //
10313
+ }
8766
10314
  const data = this.safeValue(response, 'data', {});
8767
- const orderInfo = this.safeList(data, 'successList', []);
10315
+ const orderInfo = this.safeList2(data, 'successList', 'list', []);
8768
10316
  return this.parsePositions(orderInfo, undefined, params);
8769
10317
  }
8770
10318
  /**
@@ -8832,25 +10380,27 @@ class bitget extends bitget$1 {
8832
10380
  * @name bitget#fetchPositionsHistory
8833
10381
  * @description fetches historical positions
8834
10382
  * @see https://www.bitget.com/api-doc/contract/position/Get-History-Position
10383
+ * @see https://www.bitget.com/api-doc/uta/trade/Get-Position-History
8835
10384
  * @param {string[]} [symbols] unified contract symbols
8836
10385
  * @param {int} [since] timestamp in ms of the earliest position to fetch, default=3 months ago, max range for params["until"] - since is 3 months
8837
10386
  * @param {int} [limit] the maximum amount of records to fetch, default=20, max=100
8838
10387
  * @param {object} params extra parameters specific to the exchange api endpoint
8839
10388
  * @param {int} [params.until] timestamp in ms of the latest position to fetch, max range for params["until"] - since is 3 months
8840
- *
8841
- * EXCHANGE SPECIFIC PARAMETERS
8842
10389
  * @param {string} [params.productType] USDT-FUTURES (default), COIN-FUTURES, USDC-FUTURES, SUSDT-FUTURES, SCOIN-FUTURES, or SUSDC-FUTURES
10390
+ * @param {boolean} [params.uta] set to true for the unified trading account (uta), defaults to false
8843
10391
  * @returns {object[]} a list of [position structures]{@link https://docs.ccxt.com/#/?id=position-structure}
8844
10392
  */
8845
10393
  async fetchPositionsHistory(symbols = undefined, since = undefined, limit = undefined, params = {}) {
8846
10394
  await this.loadMarkets();
8847
- const until = this.safeInteger(params, 'until');
8848
- params = this.omit(params, 'until');
8849
- const request = {};
10395
+ let request = {};
10396
+ let market = undefined;
10397
+ let productType = undefined;
10398
+ let uta = undefined;
10399
+ let response = undefined;
8850
10400
  if (symbols !== undefined) {
8851
10401
  const symbolsLength = symbols.length;
8852
10402
  if (symbolsLength > 0) {
8853
- const market = this.market(symbols[0]);
10403
+ market = this.market(symbols[0]);
8854
10404
  request['symbol'] = market['id'];
8855
10405
  }
8856
10406
  }
@@ -8860,41 +10410,79 @@ class bitget extends bitget$1 {
8860
10410
  if (limit !== undefined) {
8861
10411
  request['limit'] = limit;
8862
10412
  }
8863
- if (until !== undefined) {
8864
- request['endTime'] = until;
10413
+ [request, params] = this.handleUntilOption('endTime', request, params);
10414
+ [productType, params] = this.handleProductTypeAndParams(market, params);
10415
+ [uta, params] = this.handleOptionAndParams(params, 'fetchPositionsHistory', 'uta', false);
10416
+ if (uta) {
10417
+ request['category'] = productType;
10418
+ response = await this.privateUtaGetV3PositionHistoryPosition(this.extend(request, params));
10419
+ //
10420
+ // {
10421
+ // "code": "00000",
10422
+ // "msg": "success",
10423
+ // "requestTime": 1751020950427,
10424
+ // "data": {
10425
+ // "list": [
10426
+ // {
10427
+ // "positionId": "1322441328637100049",
10428
+ // "category": "USDT-FUTURES",
10429
+ // "symbol": "BTCUSDT",
10430
+ // "marginCoin": "USDT",
10431
+ // "holdMode": "hedge_mode",
10432
+ // "posSide": "long",
10433
+ // "marginMode": "crossed",
10434
+ // "openPriceAvg": "107003.7",
10435
+ // "closePriceAvg": "107005.4",
10436
+ // "openTotalPos": "0.0001",
10437
+ // "closeTotalPos": "0.0001",
10438
+ // "cumRealisedPnl": "0.00017",
10439
+ // "netProfit": "-0.01267055",
10440
+ // "totalFunding": "0",
10441
+ // "openFeeTotal": "-0.00642022",
10442
+ // "closeFeeTotal": "-0.00642032",
10443
+ // "createdTime": "1751020503195",
10444
+ // "updatedTime": "1751020520458"
10445
+ // },
10446
+ // ],
10447
+ // "cursor": "1322440134158041089"
10448
+ // }
10449
+ // }
10450
+ //
10451
+ }
10452
+ else {
10453
+ response = await this.privateMixGetV2MixPositionHistoryPosition(this.extend(request, params));
10454
+ //
10455
+ // {
10456
+ // code: '00000',
10457
+ // msg: 'success',
10458
+ // requestTime: '1712794148791',
10459
+ // data: {
10460
+ // list: [
10461
+ // {
10462
+ // symbol: 'XRPUSDT',
10463
+ // marginCoin: 'USDT',
10464
+ // holdSide: 'long',
10465
+ // openAvgPrice: '0.64967',
10466
+ // closeAvgPrice: '0.58799',
10467
+ // marginMode: 'isolated',
10468
+ // openTotalPos: '10',
10469
+ // closeTotalPos: '10',
10470
+ // pnl: '-0.62976205',
10471
+ // netProfit: '-0.65356802',
10472
+ // totalFunding: '-0.01638',
10473
+ // openFee: '-0.00389802',
10474
+ // closeFee: '-0.00352794',
10475
+ // ctime: '1709590322199',
10476
+ // utime: '1709667583395'
10477
+ // },
10478
+ // ...
10479
+ // ]
10480
+ // }
10481
+ // }
10482
+ //
8865
10483
  }
8866
- const response = await this.privateMixGetV2MixPositionHistoryPosition(this.extend(request, params));
8867
- //
8868
- // {
8869
- // code: '00000',
8870
- // msg: 'success',
8871
- // requestTime: '1712794148791',
8872
- // data: {
8873
- // list: [
8874
- // {
8875
- // symbol: 'XRPUSDT',
8876
- // marginCoin: 'USDT',
8877
- // holdSide: 'long',
8878
- // openAvgPrice: '0.64967',
8879
- // closeAvgPrice: '0.58799',
8880
- // marginMode: 'isolated',
8881
- // openTotalPos: '10',
8882
- // closeTotalPos: '10',
8883
- // pnl: '-0.62976205',
8884
- // netProfit: '-0.65356802',
8885
- // totalFunding: '-0.01638',
8886
- // openFee: '-0.00389802',
8887
- // closeFee: '-0.00352794',
8888
- // ctime: '1709590322199',
8889
- // utime: '1709667583395'
8890
- // },
8891
- // ...
8892
- // ]
8893
- // }
8894
- // }
8895
- //
8896
- const data = this.safeDict(response, 'data');
8897
- const responseList = this.safeList(data, 'list');
10484
+ const data = this.safeDict(response, 'data', {});
10485
+ const responseList = this.safeList(data, 'list', []);
8898
10486
  const positions = this.parsePositions(responseList, symbols, params);
8899
10487
  return this.filterBySinceLimit(positions, since, limit);
8900
10488
  }
@@ -9174,8 +10762,10 @@ class bitget extends bitget$1 {
9174
10762
  * @name bitget#fetchFundingInterval
9175
10763
  * @description fetch the current funding rate interval
9176
10764
  * @see https://www.bitget.com/api-doc/contract/market/Get-Symbol-Next-Funding-Time
10765
+ * @see https://www.bitget.com/api-doc/uta/public/Get-Current-Funding-Rate
9177
10766
  * @param {string} symbol unified market symbol
9178
10767
  * @param {object} [params] extra parameters specific to the exchange API endpoint
10768
+ * @param {boolean} [params.uta] set to true for the unified trading account (uta), defaults to false
9179
10769
  * @returns {object} a [funding rate structure]{@link https://docs.ccxt.com/#/?id=funding-rate-structure}
9180
10770
  */
9181
10771
  async fetchFundingInterval(symbol, params = {}) {
@@ -9185,23 +10775,48 @@ class bitget extends bitget$1 {
9185
10775
  [productType, params] = this.handleProductTypeAndParams(market, params);
9186
10776
  const request = {
9187
10777
  'symbol': market['id'],
9188
- 'productType': productType,
9189
10778
  };
9190
- const response = await this.publicMixGetV2MixMarketFundingTime(this.extend(request, params));
9191
- //
9192
- // {
9193
- // "code": "00000",
9194
- // "msg": "success",
9195
- // "requestTime": 1727930153888,
9196
- // "data": [
9197
- // {
9198
- // "symbol": "BTCUSDT",
9199
- // "nextFundingTime": "1727942400000",
9200
- // "ratePeriod": "8"
9201
- // }
9202
- // ]
9203
- // }
9204
- //
10779
+ let response = undefined;
10780
+ let uta = undefined;
10781
+ [uta, params] = this.handleOptionAndParams(params, 'fetchFundingInterval', 'uta', false);
10782
+ if (uta) {
10783
+ response = await this.publicUtaGetV3MarketCurrentFundRate(this.extend(request, params));
10784
+ //
10785
+ // {
10786
+ // "code": "00000",
10787
+ // "msg": "success",
10788
+ // "requestTime": 1752880157959,
10789
+ // "data": [
10790
+ // {
10791
+ // "symbol": "BTCUSDT",
10792
+ // "fundingRate": "0.0001",
10793
+ // "fundingRateInterval": "8",
10794
+ // "nextUpdate": "1752883200000",
10795
+ // "minFundingRate": "-0.003",
10796
+ // "maxFundingRate": "0.003"
10797
+ // }
10798
+ // ]
10799
+ // }
10800
+ //
10801
+ }
10802
+ else {
10803
+ request['productType'] = productType;
10804
+ response = await this.publicMixGetV2MixMarketFundingTime(this.extend(request, params));
10805
+ //
10806
+ // {
10807
+ // "code": "00000",
10808
+ // "msg": "success",
10809
+ // "requestTime": 1727930153888,
10810
+ // "data": [
10811
+ // {
10812
+ // "symbol": "BTCUSDT",
10813
+ // "nextFundingTime": "1727942400000",
10814
+ // "ratePeriod": "8"
10815
+ // }
10816
+ // ]
10817
+ // }
10818
+ //
10819
+ }
9205
10820
  const data = this.safeList(response, 'data', []);
9206
10821
  const first = this.safeDict(data, 0, {});
9207
10822
  return this.parseFundingRate(first, market);
@@ -9376,7 +10991,7 @@ class bitget extends bitget$1 {
9376
10991
  }
9377
10992
  }
9378
10993
  const sandboxMode = this.safeBool2(this.options, 'sandboxMode', 'sandbox', false);
9379
- if (sandboxMode && (path !== 'v2/public/time')) {
10994
+ if (sandboxMode && (path !== 'v2/public/time') && (path !== 'v3/market/current-fund-rate')) {
9380
10995
  // https://github.com/ccxt/ccxt/issues/25252#issuecomment-2662742336
9381
10996
  if (headers === undefined) {
9382
10997
  headers = {};